Compare commits
43 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d8ff32f888 | ||
|
|
d0315891b7 | ||
|
|
a796dc2376 | ||
|
|
eb4cc629a3 | ||
|
|
280320ef9a | ||
|
|
328ddeb46d | ||
|
|
13df2cb182 | ||
|
|
bf73a03125 | ||
|
|
8c98e13984 | ||
|
|
c159e9326e | ||
|
|
662bd1188d | ||
|
|
b3e57075de | ||
|
|
c6a08896f0 | ||
|
|
8cfe6b557c | ||
|
|
8ce1da9485 | ||
|
|
c44b1689b3 | ||
|
|
dcf2571437 | ||
|
|
c9aca08d4e | ||
|
|
fe8486d456 | ||
|
|
b31dc5fb16 | ||
|
|
160ee475fd | ||
|
|
dca9e6a88a | ||
|
|
4172f7d157 | ||
|
|
7a2275b3fb | ||
|
|
76ac21a92d | ||
|
|
f21012202f | ||
|
|
c0eb4172a2 | ||
|
|
2ed832c729 | ||
|
|
bfbf84ca24 | ||
|
|
5747825c14 | ||
|
|
67cbc08b60 | ||
|
|
be0c8088ce | ||
|
|
c36b7d842d | ||
|
|
74534641aa | ||
|
|
f7e1ce7b50 | ||
|
|
dab73a3eb2 | ||
|
|
24fe2bb81e | ||
|
|
1cd1529e28 | ||
|
|
72386c94a9 | ||
|
|
262efb40bb | ||
|
|
85dfe6f5fa | ||
|
|
53cee56a9d | ||
|
|
76224c40fe |
@@ -1,8 +0,0 @@
|
||||
# CodeMirror 2
|
||||
|
||||
CodeMirror is a JavaScript component that provides a code editor in
|
||||
the browser. When a mode is available for the language you are coding
|
||||
in, it will color your code, and optionally help with indentation.
|
||||
|
||||
The project page is http://codemirror.net
|
||||
The manual is at http://codemirror.net/doc/manual.html
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2011 by MarkLogic Corporation
|
||||
Author: Mike Brevoort <mike@brevoort.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
.cm-s-xq-dark { background: #0a001f; color: #f8f8f8; }
|
||||
.cm-s-xq-dark span.CodeMirror-selected { background: #a8f !important; }
|
||||
.cm-s-xq-dark .CodeMirror-gutter { background: #0a001f; border-right: 1px solid #aaa; }
|
||||
.cm-s-xq-dark .CodeMirror-gutter-text { color: #f8f8f8; }
|
||||
.cm-s-xq-dark .CodeMirror-cursor { border-left: 1px solid white !important; }
|
||||
|
||||
.cm-s-xq-dark span.cm-keyword {color: #FFBD40;}
|
||||
.cm-s-xq-dark span.cm-atom {color: #6C8CD5;}
|
||||
.cm-s-xq-dark span.cm-number {color: #164;}
|
||||
.cm-s-xq-dark span.cm-def {color: #FFF; text-decoration:underline;}
|
||||
.cm-s-xq-dark span.cm-variable {color: #FFF;}
|
||||
.cm-s-xq-dark span.cm-variable-2 {color: #EEE;}
|
||||
.cm-s-xq-dark span.cm-variable-3 {color: #DDD;}
|
||||
.cm-s-xq-dark span.cm-property {}
|
||||
.cm-s-xq-dark span.cm-operator {}
|
||||
.cm-s-xq-dark span.cm-comment {color: gray;}
|
||||
.cm-s-xq-dark span.cm-string {color: #9FEE00;}
|
||||
.cm-s-xq-dark span.cm-meta {color: yellow;}
|
||||
.cm-s-xq-dark span.cm-error {color: #f00;}
|
||||
.cm-s-xq-dark span.cm-qualifier {color: #FFF700;}
|
||||
.cm-s-xq-dark span.cm-builtin {color: #30a;}
|
||||
.cm-s-xq-dark span.cm-bracket {color: #cc7;}
|
||||
.cm-s-xq-dark span.cm-tag {color: #FFBD40;}
|
||||
.cm-s-xq-dark span.cm-attribute {color: #FFF700;}
|
||||
1
CodeMirror-2.33/lib/codemirror-compressed.js
Normal file
@@ -9,8 +9,7 @@
|
||||
}
|
||||
|
||||
.CodeMirror-scroll {
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
overflow: auto;
|
||||
height: 300px;
|
||||
/* This is needed to prevent an IE[67] bug where the scrolled content
|
||||
is visible outside of the scrolling box. */
|
||||
@@ -20,13 +19,11 @@
|
||||
|
||||
/* Vertical scrollbar */
|
||||
.CodeMirror-scrollbar {
|
||||
float: right;
|
||||
position: absolute;
|
||||
right: 0; top: 0;
|
||||
overflow-x: hidden;
|
||||
overflow-y: scroll;
|
||||
|
||||
/* This corrects for the 1px gap introduced to the left of the scrollbar
|
||||
by the rule for .CodeMirror-scrollbar-inner. */
|
||||
margin-left: -1px;
|
||||
z-index: 5;
|
||||
}
|
||||
.CodeMirror-scrollbar-inner {
|
||||
/* This needs to have a nonzero width in order for the scrollbar to appear
|
||||
@@ -69,10 +66,6 @@
|
||||
white-space: pre;
|
||||
cursor: text;
|
||||
}
|
||||
.CodeMirror-lines * {
|
||||
/* Necessary for throw-scrolling to decelerate properly on Safari. */
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.CodeMirror pre {
|
||||
-moz-border-radius: 0;
|
||||
@@ -165,5 +158,16 @@ span.cm-em {font-style: italic;}
|
||||
span.cm-emstrong {font-style: italic; font-weight: bold;}
|
||||
span.cm-link {text-decoration: underline;}
|
||||
|
||||
span.cm-invalidchar {color: #f00;}
|
||||
|
||||
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
|
||||
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
|
||||
|
||||
@media print {
|
||||
|
||||
/* Hide the cursor when printing */
|
||||
.CodeMirror pre.CodeMirror-cursor {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
Backups are stored in this folder every 10 mins by default
|
||||
1
backups/readme.txt
Normal file
@@ -0,0 +1 @@
|
||||
Zip It! backups are stored in this folder
|
||||
17
editor.php
@@ -4,6 +4,7 @@
|
||||
<html style="margin: 0" onMouseDown="top.ICEcoder.mouseDown=true" onMouseUp="top.ICEcoder.mouseDown=false" onMouseMove="if(top.ICEcoder) {top.ICEcoder.getMouseXY(event,'editor');top.ICEcoder.canResizeFilesW()}">
|
||||
<head>
|
||||
<title>ICEcoder editor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<link rel="stylesheet" href="<?php echo $ICEcoder["codeMirrorDir"]; ?>/lib/codemirror.css">
|
||||
<!--
|
||||
codemirror-compressed.js
|
||||
@@ -16,7 +17,7 @@ foldcode, searchcursor, match-highlighter
|
||||
//-->
|
||||
<script src="<?php echo $ICEcoder["codeMirrorDir"]; ?>/lib/codemirror-compressed.js"></script>
|
||||
<link rel="stylesheet" href="<?php
|
||||
if ($ICEcoder["theme"]=="default") {echo 'lib/editor.css';} else {echo $ICEcoder["codeMirrorDir"].'/theme/'.$ICEcoder["theme"].'.css';};
|
||||
$ICEcoder["theme"]=="default" ? echo 'lib/editor.css' : echo $ICEcoder["codeMirrorDir"].'/theme/'.$ICEcoder["theme"].'.css';
|
||||
$activeLineBG = $ICEcoder["theme"]=="eclipse" || $ICEcoder["theme"]=="elegant" || $ICEcoder["theme"]=="neat" ? "#ccc" : "#000";
|
||||
?>">
|
||||
<style type="text/css">
|
||||
@@ -145,12 +146,13 @@ function createNewCMInstance(num) {
|
||||
canDoEndTag=false;
|
||||
}
|
||||
}
|
||||
if(top.ICEcoder.tagString.slice(0,1)=="/"||top.ICEcoder.tagString.slice(0,1)=="?") {
|
||||
canDoEndTag=false;
|
||||
}
|
||||
if (!top.ICEcoder.codeAssist||fileName && (fileName.indexOf(".js")>0||fileName.indexOf(".css")>0||fileName.indexOf(".less")>0)) {
|
||||
canDoEndTag=false;
|
||||
}
|
||||
if (
|
||||
top.ICEcoder.tagString.slice(0,1)=="/"||
|
||||
top.ICEcoder.tagString.slice(0,1)=="?"||
|
||||
!top.ICEcoder.codeAssist||
|
||||
fileName && (fileName.indexOf(".js")>0||fileName.indexOf(".css")>0||fileName.indexOf(".less")>0)
|
||||
) {canDoEndTag=false}
|
||||
|
||||
contentType = top.ICEcoder.caretLocType;
|
||||
if (canDoEndTag && (contentType!="JavaScript"||(contentType=="JavaScript"&&top.ICEcoder.tagString=="script"))) {
|
||||
numTabs = top.ICEcoder.htmlTagArray.length;
|
||||
@@ -159,7 +161,6 @@ function createNewCMInstance(num) {
|
||||
for (i=0;i<numTabs-1;i++) {
|
||||
tabs += "\t";
|
||||
}
|
||||
//endTag = "</" + top.ICEcoder.htmlTagArray[top.ICEcoder.htmlTagArray.length-1] + ">";
|
||||
endTag = "</" + top.ICEcoder.tagString + ">";
|
||||
if (top.ICEcoder.tagString=="script") {endTag="</"+"script>"};
|
||||
if(top.ICEcoder.tagString=="title"||top.ICEcoder.tagString=="a"||top.ICEcoder.tagString=="li"||top.ICEcoder.tagString=="span"||(top.ICEcoder.tagString.slice(0,1)=="h"&&parseInt(top.ICEcoder.tagString.slice(1,2),10)>=1&&parseInt(top.ICEcoder.tagString.slice(1,2),10)<=7)) {
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
<?php
|
||||
$ICEcoder["restrictedFiles"] = $_SESSION['restrictedFiles'];
|
||||
$ICEcoder["bannedFiles"] = $_SESSION['bannedFiles'];
|
||||
$serverType = strrpos($docRoot,":") ? "Windows" : "Linux";
|
||||
|
||||
// Function to sort given values alphabetically
|
||||
function alphasort($a, $b) {
|
||||
@@ -125,8 +124,7 @@ for ($i=0;$i<count($finalArray);$i++) {
|
||||
if ($_SESSION['userLevel'] == 10 || ($_SESSION['userLevel'] < 10 && !$restrictedFile)) {
|
||||
echo "<li class=\"".$class."\"><a nohref title=\"$fileFolderName\" onMouseOver=\"top.ICEcoder.overFileFolder('$type','".str_replace($docRoot,"",str_replace("/","|",$fileFolderName))."')\" onMouseOut=\"top.ICEcoder.overFileFolder('$type','')\" style=\"position: relative; left:-22px\"> <span id=\"".str_replace($docRoot,"",str_replace("/","|",$fileFolderName))."\">".basename($fileFolderName)."</span> ".$fileAtts."</a>\n";
|
||||
} else {
|
||||
if ($type == "file") {$fileAtts = "<img src=\"images/padlock.png\" style=\"cursor: pointer\" onClick=\"top.ICEcoder.message('Sorry, you need higher admin level rights to view.')\">";}
|
||||
echo "<li class=\"".$class."\" style=\"cursor: default\"><span style=\"position: relative; left:-22px; color: #888\"> [HIDDEN] ".$fileAtts."</span>";
|
||||
echo "<li class=\"".$class."\" style=\"cursor: default\"><span style=\"position: relative; left:-22px; color: #888\" onClick=\"top.ICEcoder.message('Sorry, you need higher admin level rights to view.')\"> [HIDDEN]</span>";
|
||||
}
|
||||
if ($i<count($finalArray)) {echo "</li>\n";}
|
||||
$lastPath = $fileFolderName;
|
||||
|
||||
BIN
images/blank.gif
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 55 B |
|
Before Width: | Height: | Size: 842 B |
BIN
images/files-arrow.png
Normal file
|
After Width: | Height: | Size: 158 B |
|
Before Width: | Height: | Size: 1.1 KiB |
BIN
images/nav-bg.jpg
Normal file
|
After Width: | Height: | Size: 435 B |
|
Before Width: | Height: | Size: 752 B |
89
index.php
@@ -1,26 +1,22 @@
|
||||
<?php
|
||||
include("lib/settings.php");
|
||||
$allowedIP = false;
|
||||
for($i=0;$i<count($_SESSION['allowedIPs']);$i++) {
|
||||
if ($_SESSION['allowedIPs'][$i]==$_SERVER["REMOTE_ADDR"]||$_SESSION['allowedIPs'][$i]=="*") {
|
||||
$allowedIP = true;
|
||||
}
|
||||
}
|
||||
if (!$allowedIP) {
|
||||
|
||||
// Check IP permissions
|
||||
if (!in_array($_SERVER["REMOTE_ADDR"], $_SESSION['allowedIPs']) && !in_array("*", $_SESSION['allowedIPs'])) {
|
||||
header('Location: /');
|
||||
};
|
||||
|
||||
// Check for updates of ICEcoder & CodeMirror
|
||||
// Check for updates
|
||||
if ($ICEcoder["checkUpdates"]) {
|
||||
$ICEcoderLatestVer = json_encode(file_get_contents("http://icecoder.net/latest-version.txt"));
|
||||
$ICEcoderLatestVer = rtrim(ltrim($ICEcoderLatestVer,"\""),"\"\\n");
|
||||
if (ltrim($ICEcoder["versionNo"],"v ")<ltrim($ICEcoderLatestVer,"v ")) {
|
||||
echo '<script>top.ICEcoder.message(\'ICEcoder '.$ICEcoderLatestVer.' now released\n\nPlease upgrade\');</script>';
|
||||
$icv = json_encode(file_get_contents("http://icecoder.net/latest-version.txt"));
|
||||
$icv = rtrim(ltrim($icv,'"'),'"\\n');
|
||||
if ($ICEcoder["versionNo"]<$icv) {
|
||||
$updateMsg = ';top.ICEcoder.message(\'ICEcoder '.$icv.' now released\n\nPlease upgrade\')';
|
||||
} else {
|
||||
$cMLatestVer = json_encode(file_get_contents("http://codemirror.net/latest-version.txt"));
|
||||
$cMLatestVer = rtrim(ltrim($cMLatestVer,"\""),"\"\\n");
|
||||
if ($ICEcoder["cMThisVer"]<$cMLatestVer) {
|
||||
echo '<script>top.ICEcoder.message(\'CodeMirror '.$cMLatestVer.' now released\n\nPlease upgrade\');</script>';
|
||||
$cmv = json_encode(file_get_contents("http://codemirror.net/latest-version.txt"));
|
||||
$cmv = rtrim(ltrim($cmv,'"'),'"\\n');
|
||||
if ($ICEcoder["cMThisVer"]<$cmv) {
|
||||
$updateMsg = ';top.ICEcoder.message(\'CodeMirror '.$cmv.' now released\n\nPlease upgrade\')';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,7 +25,8 @@ if ($ICEcoder["checkUpdates"]) {
|
||||
|
||||
<html onMouseDown="top.ICEcoder.mouseDown=true" onMouseUp="top.ICEcoder.mouseDown=false" onMouseMove="if(top.ICEcoder) {top.ICEcoder.getMouseXY(event,'top');top.ICEcoder.canResizeFilesW()}">
|
||||
<head>
|
||||
<title>ICEcoder <?php echo $ICEcoder["versionNo"];?></title>
|
||||
<title>ICEcoder v <?php echo $ICEcoder["versionNo"];?></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta name="robots" content="noindex, nofollow">
|
||||
<link rel="stylesheet" type="text/css" href="lib/coder.css">
|
||||
<script>
|
||||
@@ -37,31 +34,31 @@ theme = "<?php echo $ICEcoder["theme"]=="default" ? 'icecoder' : $ICEcoder["them
|
||||
tabsIndent = <?php echo $ICEcoder["tabsIndent"] ? 'true' : 'false';?>;
|
||||
openLastFiles = <?php echo $ICEcoder["openLastFiles"] ? 'true' : 'false';?>;
|
||||
tabWidth = <?php echo $ICEcoder["tabWidth"]; ?>;
|
||||
<?php
|
||||
echo 'iceRoot = "'.$ICEcoder["root"].'";'.PHP_EOL;
|
||||
?>
|
||||
iceRoot = "<?php echo $ICEcoder["root"]; ?>";
|
||||
|
||||
window.onbeforeunload = function() {
|
||||
for (var i=0; i<=top.ICEcoder.changedContent.length; i++) {
|
||||
if (top.ICEcoder.changedContent[i]==1) {
|
||||
return "You have some unsaved changes.";
|
||||
}
|
||||
if (top.ICEcoder.changedContent.indexOf(1)>-1) {
|
||||
return "You have some unsaved changes.";
|
||||
}
|
||||
}
|
||||
|
||||
previousFiles = [<?php
|
||||
if ($ICEcoder["previousFiles"]!="" && $_SESSION['userLevel'] == 10) {
|
||||
$openFilesArray = explode(",",$ICEcoder["previousFiles"]);
|
||||
for ($i=0;$i<count($openFilesArray);$i++) {
|
||||
echo "'".$openFilesArray[$i]."'";
|
||||
if ($i<count($openFilesArray)-1) {echo ",";};
|
||||
}
|
||||
echo "'".implode("','",$openFilesArray)."'";
|
||||
}
|
||||
?>];
|
||||
showFileMenu = function() {
|
||||
document.getElementById('fileMenu').style.display='inline-block';
|
||||
}
|
||||
</script>
|
||||
<script language="JavaScript" src="lib/coder.js"></script>
|
||||
</head>
|
||||
|
||||
<body onLoad="ICEcoder.init(<?php if ($_SESSION['userLevel'] == 10) {echo "'login'";} ?>)<?php echo $onLoadExtras;?>" onResize="ICEcoder.setLayout()" onKeyDown="return ICEcoder.interceptKeys('coder', event);" onKeyUp="parent.ICEcoder.resetKeys(event);">
|
||||
<body onLoad="ICEcoder.init(<?php
|
||||
if ($_SESSION['userLevel'] == 10) {echo "'login'";};
|
||||
echo ")".$updateMsg.$onLoadExtras;
|
||||
?>" onResize="ICEcoder.setLayout()" onKeyDown="return ICEcoder.interceptKeys('coder',event);" onKeyUp="parent.ICEcoder.resetKeys(event);">
|
||||
|
||||
<div id="blackMask" class="blackMask" onClick="ICEcoder.showHide('hide',this)">
|
||||
<div class="popupVCenter">
|
||||
@@ -82,23 +79,23 @@ previousFiles = [<?php
|
||||
|
||||
<div id="fileMenu" class="fileMenu" onMouseOver="ICEcoder.changeFilesW('expand')" onMouseOut="ICEcoder.changeFilesW('contract');this.style.display='none'">
|
||||
<span id="folderMenuItems">
|
||||
<a href="javascript:top.ICEcoder.newFile()" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">New File</a>
|
||||
<a href="javascript:top.ICEcoder.newFolder()" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">New Folder</a>
|
||||
<a href="javascript:top.ICEcoder.newFile()" onMouseOver="showFileMenu()">New File</a>
|
||||
<a href="javascript:top.ICEcoder.newFolder()" onMouseOver="showFileMenu()">New Folder</a>
|
||||
</span>
|
||||
<a href="javascript:top.ICEcoder.deleteFile(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">Delete</a>
|
||||
<a href="javascript:top.ICEcoder.deleteFile(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">Delete</a>
|
||||
<span id="singleFileMenuItems">
|
||||
<a href="javascript:top.ICEcoder.renameFile(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">Rename</a>
|
||||
<a href="javascript:window.open(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">View Webpage</a>
|
||||
<a href="javascript:top.ICEcoder.renameFile(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">Rename</a>
|
||||
<a href="javascript:window.open(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">View Webpage</a>
|
||||
</span>
|
||||
<a href="javascript:top.ICEcoder.zipIt(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">Zip It!</a>
|
||||
<a href="javascript:top.ICEcoder.propertiesScreen(top.ICEcoder.rightClickedFile)" onMouseOver="document.getElementById('fileMenu').style.display='inline-block'">Properties</a>
|
||||
<a href="javascript:top.ICEcoder.zipIt(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">Zip It!</a>
|
||||
<a href="javascript:top.ICEcoder.propertiesScreen(top.ICEcoder.rightClickedFile)" onMouseOver="showFileMenu()">Properties</a>
|
||||
</div>
|
||||
|
||||
<div id="header" class="header" onContextMenu="return false">
|
||||
<div class="plugins" id="pluginsContainer">
|
||||
<?php echo $pluginsDisplay; ?>
|
||||
</div>
|
||||
<div class="version"><?php echo $ICEcoder["versionNo"];?></div><img src="images/full-screen.gif" id="screenMode" class="screenModeIcon" onClick="top.ICEcoder.fullScreenSwitcher()">
|
||||
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div><img src="images/full-screen.gif" id="screenMode" class="screenModeIcon" onClick="top.ICEcoder.fullScreenSwitcher()">
|
||||
<img src="images/ice-coder.png" class="logo" onClick="ICEcoder.helpScreen()" onContextMenu="ICEcoder.settingsScreen()">
|
||||
</div>
|
||||
|
||||
@@ -113,15 +110,15 @@ previousFiles = [<?php
|
||||
</div>
|
||||
</div>
|
||||
<div class="accountOptions">
|
||||
<div title="Save" onClick="ICEcoder.fMIcon('save')" id="fMSave" style="width: 30px; height: 32px; opacity: 0.3"></div>
|
||||
<div title="Open" onClick="ICEcoder.fMIcon('open')" id="fMOpen" style="width: 25px; height: 32px; background-position: -32px -3px; margin: 3px 0 0 7px; opacity: 0.3"></div>
|
||||
<div title="New File" onClick="ICEcoder.fMIcon('newFile')" id="fMNewFile" style="width: 15px; height: 16px; background-position: -64px 0; margin: 8px 0 0 10px; opacity: 0.3"></div>
|
||||
<div title="New Folder" onClick="ICEcoder.fMIcon('newFolder')" id="fMNewFolder" style="width: 20px; height: 16px; background-position: -80px 0; margin: 8px 0 0 5px; opacity: 0.3"></div>
|
||||
<div title="Delete" onClick="ICEcoder.fMIcon('delete')" id="fMDelete" style="width: 16px; height: 16px; background-position: -100px 0; margin: 8px 0 0 5px; opacity: 0.3"></div>
|
||||
<div title="Rename" onClick="ICEcoder.fMIcon('rename')" id="fMRename" style="width: 16px; height: 16px; background-position: -116px 0; margin: 8px 0 0 5px; opacity: 0.3"></div>
|
||||
<div title="View" onClick="ICEcoder.fMIcon('view')" id="fMView" style="width: 16px; height: 16px; background-position: -132px 0; margin: 8px 0 0 5px; opacity: 0.3"></div>
|
||||
<div title="Save" onClick="ICEcoder.fMIcon('save')" id="fMSave" class="save"></div>
|
||||
<div title="Open" onClick="ICEcoder.fMIcon('open')" id="fMOpen" class="open"></div>
|
||||
<div title="New File" onClick="ICEcoder.fMIcon('newFile')" id="fMNewFile" class="newFile"></div>
|
||||
<div title="New Folder" onClick="ICEcoder.fMIcon('newFolder')" id="fMNewFolder" class="newFolder"></div>
|
||||
<div title="Delete" onClick="ICEcoder.fMIcon('delete')" id="fMDelete" class="delete"></div>
|
||||
<div title="Rename" onClick="ICEcoder.fMIcon('rename')" id="fMRename" class="rename"></div>
|
||||
<div title="View" onClick="ICEcoder.fMIcon('view')" id="fMView" class="view"></div>
|
||||
|
||||
<div title="Lock" onClick="ICEcoder.lockUnlockNav()" id="fmLock" style="position: relative; margin-left: 208px; margin-top: -27px; width: 12px; height: 16px; background-position: -64px -16px; z-index: 1"></div>
|
||||
<div title="Lock" onClick="ICEcoder.lockUnlockNav()" id="fmLock" class="lock"></div>
|
||||
</div>
|
||||
</div>
|
||||
<iframe id="filesFrame" class="frame" name="ff" src="files.php" style="opacity: 0" onLoad="this.style.opacity='1'"></iframe>
|
||||
@@ -132,7 +129,7 @@ previousFiles = [<?php
|
||||
<div id="tabsBar" class="tabsBar" onContextMenu="return false">
|
||||
<?php
|
||||
for ($i=1;$i<=10;$i++) {
|
||||
echo '<div id="tab'.$i.'" class="tab" draggable="true" onClick="if(ICEcoder.canSwitchTabs) {ICEcoder.switchTab('.$i.')} else {ICEcoder.canSwitchTabs=true}"></div>';
|
||||
echo '<div id="tab'.$i.'" class="tab" draggable="true" onClick="ICEcoder.canSwitchTabs ? ICEcoder.switchTab('.$i.') : ICEcoder.canSwitchTabs=true"></div>';
|
||||
}
|
||||
?><div class="newTab" onClick="ICEcoder.newTab()"><img src="images/nav-new.png"></div>
|
||||
</div>
|
||||
|
||||
@@ -72,7 +72,7 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
.header .version {position: relative; display: inline-block; margin-top: 25px; font-size: 10px; color: #bbb}
|
||||
.header .logo {position: relative; margin: 5px 10px 0 5px; cursor: pointer}
|
||||
|
||||
.files {position: absolute; display: inline-block; top: 0; left: 0; height: 100%; width: 250px; background-color: #444; background-image: url('../images/files-arrow.gif'); background-repeat: no-repeat; background-position: 100% 50%; overflow: hidden; z-index: 1;
|
||||
.files {position: absolute; display: inline-block; top: 0; left: 0; height: 100%; width: 250px; background-color: #444; background-image: url('../images/files-arrow.png'); background-repeat: no-repeat; background-position: 100% 50%; overflow: hidden; z-index: 1;
|
||||
box-shadow: 0 0 10px 4px rgba(0,0,0,0.4);
|
||||
}
|
||||
.files .account {display: inline-block; height: 50px; width: 250px; margin-top: 40px; background-color: #888}
|
||||
@@ -85,6 +85,14 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
.files .accountOptions {position: relative; height: 32px; width: 100%; margin-left: 15px; margin-top: 8px}
|
||||
.files .accountOptions div {display: inline-block; background: url('../images/file-manager-icons.png') 0 0 no-repeat; cursor: pointer}
|
||||
.files .accountPassword {position: relative; border: 0; background-color: #333; color: #fff; height: 18px; width: 140px; margin-left: 14px; margin-top: 16px}
|
||||
.files .accountOptions .save {width: 30px; height: 32px; opacity: 0.3}
|
||||
.files .accountOptions .open {width: 25px; height: 32px; background-position: -32px -3px; margin: 3px 0 0 7px; opacity: 0.3}
|
||||
.files .accountOptions .newFile {width: 15px; height: 16px; background-position: -64px 0; margin: 8px 0 0 10px; opacity: 0.3}
|
||||
.files .accountOptions .newFolder {width: 20px; height: 16px; background-position: -80px 0; margin: 8px 0 0 5px; opacity: 0.3}
|
||||
.files .accountOptions .delete {width: 16px; height: 16px; background-position: -100px 0; margin: 8px 0 0 5px; opacity: 0.3}
|
||||
.files .accountOptions .rename {width: 16px; height: 16px; background-position: -116px 0; margin: 8px 0 0 5px; opacity: 0.3}
|
||||
.files .accountOptions .view {width: 16px; height: 16px; background-position: -132px 0; margin: 8px 0 0 5px; opacity: 0.3}
|
||||
.files .accountOptions .lock {position: relative; margin-left: 208px; margin-top: -27px; width: 12px; height: 16px; background-position: -64px -16px; z-index: 1}
|
||||
.files input:focus, .findReplace input:focus, .findReplace select:focus, .accountPassword:focus {outline: none; box-shadow: 0 0 10px 1px rgba(0,198,255,0.7)}
|
||||
.files .button {position: absolute; border: 0; background: #444; color: #eee; height:20px; margin-top: 16px; margin-left: 5px; font-size: 11px; cursor: pointer}
|
||||
.files .button:hover {background-color: #222; color: #eee}
|
||||
@@ -98,13 +106,13 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
|
||||
.editor {position: absolute; display: inline-block; top: 0; left: 15px; width: 2400px}
|
||||
.editor .tabsBar {display: inline-block; height: 22px; width: 2400px; margin-top: 40px; padding-left: 41px; background-color: #888;}
|
||||
.tabsBar .tab {display: inline-block; display: none; background-image: url('../images/nav-bg.gif'); background-repeat: repeat-x; background-position: 0 0; padding: 5px 8px 2px 8px; font-size: 10px; border-left: solid 1px #fff; border-right: solid 1px #777; color: #fff; cursor: pointer;
|
||||
.tabsBar .tab {display: inline-block; display: none; background-image: url('../images/nav-bg.jpg'); background-repeat: repeat-x; background-position: 0 0; padding: 5px 8px 2px 8px; font-size: 10px; border-left: solid 1px #fff; border-right: solid 1px #777; color: #fff; cursor: pointer;
|
||||
-webkit-transition: all 0.15s;
|
||||
-moz-transition: all 0.15s;
|
||||
transition: all 0.15s;
|
||||
}
|
||||
.tabsBar .tab .closeTab {margin: 1px 0 0 5px; border-radius: 6px}
|
||||
.tabsBar .newTab {display: inline-block; background-image: url('../images/nav-bg.gif'); background-repeat: repeat-x; background-position: 0 0; padding: 6px 5px 1px 5px; border-left: solid 1px #fff; border-right: solid 1px #777; cursor: pointer;}
|
||||
.tabsBar .newTab {display: inline-block; background-image: url('../images/nav-bg.jpg'); background-repeat: repeat-x; background-position: 0 0; padding: 6px 5px 1px 5px; border-left: solid 1px #fff; border-right: solid 1px #777; cursor: pointer;}
|
||||
.editor .findBar {display: inline-block; height: 28px; width: 2400px; color: #fff; background-color: #141414}
|
||||
.findBar .findReplace {position: absolute; z-index: 1}
|
||||
.findReplace select {position: relative; font-size: 10px; margin: 8px 2px 0 2px; top: -2px;}
|
||||
|
||||
28
lib/coder.js
@@ -1002,6 +1002,7 @@ var ICEcoder = {
|
||||
lineCount=1;
|
||||
numChars=0;
|
||||
|
||||
// Count the no of chars & lines previous to our cursor's line
|
||||
for (var i=0;i<content.length;i++) {
|
||||
if (content.indexOf('\n',i)==i && lineCount<=cM.getCursor().line) {
|
||||
lineCount++;
|
||||
@@ -1009,7 +1010,7 @@ var ICEcoder = {
|
||||
}
|
||||
}
|
||||
|
||||
charsToCursor = numChars+cM.getCursor().ch;
|
||||
charsToCursor = numChars+cM.getCursor().ch+1;
|
||||
ICEcoder.findResult = 0;
|
||||
for (var i=0;i<ICEcoder.results.length;i++) {
|
||||
if (ICEcoder.results[i]<charsToCursor) {
|
||||
@@ -1019,15 +1020,16 @@ var ICEcoder = {
|
||||
|
||||
if (ICEcoder.findResult>ICEcoder.results.length-1) {ICEcoder.findResult=0};
|
||||
parent.parent.document.getElementById('results').innerHTML = "Highlighted result "+(ICEcoder.findResult+1)+" of "+ICEcoder.results.length+" results";
|
||||
lineCount=0;
|
||||
|
||||
lineCount=0;
|
||||
for (var i=0;i<ICEcoder.results[ICEcoder.findResult];i++) {
|
||||
if (content.indexOf('\n',i)==i) {
|
||||
lineCount++;
|
||||
numChars=i;
|
||||
}
|
||||
}
|
||||
|
||||
charCount = ICEcoder.results[ICEcoder.findResult];
|
||||
charCount = ICEcoder.results[ICEcoder.findResult] - numChars - 1;
|
||||
startPos = new Object();
|
||||
startPos.line = lineCount;
|
||||
startPos.ch = charCount;
|
||||
@@ -1036,7 +1038,6 @@ var ICEcoder = {
|
||||
document.findAndReplace.connector.value=="and" && document.findAndReplace.replaceAction.value=="replace all" && buttonClick
|
||||
? endPos.ch = charCount+replaceLen
|
||||
: endPos.ch = charCount+findLen;
|
||||
|
||||
// Finally, highlight our selection
|
||||
cM = ICEcoder.getcMInstance();
|
||||
cM.setSelection(startPos, endPos);
|
||||
@@ -1536,10 +1537,15 @@ var ICEcoder = {
|
||||
|
||||
// Opens the last files we had open
|
||||
autoOpenFiles: function() {
|
||||
var loadFileURL;
|
||||
|
||||
for (var i=0;i<=top.previousFiles.length-1;i++) {
|
||||
top.ICEcoder.rightClickedFile=top.ICEcoder.thisFileFolderLink=top.previousFiles[i].replace('|','/');
|
||||
top.ICEcoder.thisFileFolderType='file';
|
||||
top.ICEcoder.openFile();
|
||||
loadFileURL = top.previousFiles[i].replace(/\|/g, "/").replace(top.docRoot+top.iceRoot,"");
|
||||
if (top.ICEcoder.openFiles.indexOf(loadFileURL)==-1) {
|
||||
top.ICEcoder.rightClickedFile=top.ICEcoder.thisFileFolderLink=top.previousFiles[i].replace('|','/');
|
||||
top.ICEcoder.thisFileFolderType='file';
|
||||
top.ICEcoder.openFile();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1675,7 +1681,7 @@ var ICEcoder = {
|
||||
document.mozFullScreen ? document.mozCancelFullScreen() : document.body.mozRequestFullScreen();
|
||||
// Chrome specific
|
||||
} else if ("undefined" != typeof document.webkitCancelFullScreen) {
|
||||
document.webkitIsFullScreen ? document.webkitCancelFullScreen() : document.body.webkitRequestFullScreen();
|
||||
document.webkitIsFullScreen ? document.webkitCancelFullScreen() : document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
|
||||
}
|
||||
|
||||
screenIcon.src = screenIcon.src.indexOf("images/full-screen.gif") > -1 ? "images/restored-screen.gif" : "images/full-screen.gif";
|
||||
@@ -1753,5 +1759,11 @@ var ICEcoder = {
|
||||
// Get the users input
|
||||
getInput: function(question,defaultValue) {
|
||||
return prompt(question,defaultValue);
|
||||
},
|
||||
|
||||
// Replace text in a file
|
||||
replaceInFile: function(fileRef,find,replace) {
|
||||
top.ICEcoder.serverQueue("add","lib/file-control.php?action=replaceText&fileRef="+fileRef.replace(/\//g,"|")+"&find="+find+"&replace="+replace);
|
||||
top.ICEcoder.serverMessage('<b>Replacing text in</b><br>'+fileRef);
|
||||
}
|
||||
};
|
||||
@@ -2,20 +2,21 @@
|
||||
$ICEcoder = array(
|
||||
"root" => "",
|
||||
"tabsIndent" => true,
|
||||
"checkUpdates" => false,
|
||||
"checkUpdates" => true,
|
||||
"openLastFiles" => true,
|
||||
"findFilesExclude" => array("_coder",".doc",".gif",".jpg",".jpeg",".pdf",".png",".swf",".xml",".zip"),
|
||||
"codeAssist" => true,
|
||||
"visibleTabs" => false,
|
||||
"lockedNav" => true,
|
||||
"accountPassword" => "",
|
||||
"restrictedFiles" => array("wp-",".php",".rb",".sql"),
|
||||
"restrictedFiles" => array("wp-",".php",".rb",".sql",".zip"),
|
||||
"bannedFiles" => array("_coder","wp-",".exe"),
|
||||
"allowedIPs" => array("*"),
|
||||
"plugins" => array(
|
||||
array("Adminer","plugins/adminer/icon.png","margin-top: 3px","plugins/adminer/adminer-3.4.0-mysql-en.php","_blank",""),
|
||||
array("Zip It!","plugins/zip-it/icon.png","margin-top: 3px; margin-left: 3px","plugins/zip-it/?zip=|&exclude=*.doc*.gif*.jpg*.jpeg*.pdf*.png*.swf*.xml*.zip","fileControl:<b>Zipping Files</b>","30"),
|
||||
array("ICErepo","plugins/ice-repo/icon.png","margin-top: 3px","plugins/ice-repo","_blank","")
|
||||
array("ICErepo","plugins/ice-repo/icon.png","margin-top: 3px","plugins/ice-repo","_blank",""),
|
||||
array("Dochub","plugins/dochub/icon.png","margin-top: 3px","http://dochub.io","_blank","")
|
||||
),
|
||||
"theme" => "default",
|
||||
"tabWidth" => 4,
|
||||
|
||||
@@ -87,6 +87,27 @@ if ($_GET['action']=="rename") {
|
||||
echo '<script>top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);</script>';
|
||||
}
|
||||
|
||||
// If we're due to replace text in a file...
|
||||
if ($_GET['action']=="replaceText") {
|
||||
if ($_SESSION['userLevel'] > 0 && is_writable(str_replace("|","/",strClean($_GET['fileRef'])))) {
|
||||
$file = str_replace("|","/",strClean($_GET['fileRef']));
|
||||
$loadedFile = file_get_contents($file);
|
||||
$newContent = str_replace(strClean($_GET['find']),strClean($_GET['replace']),$loadedFile);
|
||||
$fh = fopen($file, 'w') or die("Sorry, cannot save");
|
||||
fwrite($fh, $newContent);
|
||||
fclose($fh);
|
||||
echo '<script>action="replaceText";</script>';
|
||||
} else {
|
||||
if (!is_writable(str_replace("|","/",strClean($_GET['fileRef'])))) {
|
||||
echo "<script>top.ICEcoder.message('Sorry, cannot replace text in\\n".strClean($_GET['fileRef'])."');</script>";
|
||||
} else {
|
||||
echo '<script>top.ICEcoder.message(\'Sorry, you need to be logged in to rename\');</script>';
|
||||
}
|
||||
echo '<script>action="nothing";</script>';
|
||||
}
|
||||
echo '<script>top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);</script>';
|
||||
}
|
||||
|
||||
// If we're due to change permissions on a file/folder...
|
||||
if ($_GET['action']=="perms") {
|
||||
if ($_SESSION['userLevel'] > 0 && is_writable($file)) {
|
||||
|
||||
@@ -15,7 +15,15 @@
|
||||
<div id="results"></div>
|
||||
</div>
|
||||
<?php if (isset($_GET['replace'])) { ?>
|
||||
<div class="replaceAll" id="replaceAll" onClick="<?php echo isset($_GET['target']) ? 'renameAll()' : 'replaceAll()';?>" style="opacity: 0.1"><?php echo isset($_GET['target']) ? 'rename all' : 'replace all';?></div>
|
||||
<div class="replaceAll" id="replaceAll" onClick="<?php
|
||||
if (strpos($_GET['target'],"filenames")) {
|
||||
echo 'renameAll()';
|
||||
} else if (strpos($_GET['target'],"files")) {
|
||||
echo 'replaceInFilesAll()';
|
||||
} else {
|
||||
echo 'replaceAll()';
|
||||
}
|
||||
?>" style="opacity: 0.1"><?php echo strpos($_GET['target'],"filenames") ? 'rename all' : 'replace all';?></div>
|
||||
<?php ;}; ?>
|
||||
|
||||
<script>
|
||||
@@ -49,31 +57,76 @@ if (startTab!=top.ICEcoder.selectedTab) {
|
||||
<?php
|
||||
// Find in files or filenames
|
||||
} else {
|
||||
$targetName = "file/folder";
|
||||
if (strpos($_GET['target'],"filenames")>0) {
|
||||
$targetName = "file/folder";
|
||||
?>
|
||||
var spansArray = top.ICEcoder.filesFrame.contentWindow.document.getElementsByTagName('span');
|
||||
for (var i=0;i<spansArray.length;i++) {
|
||||
targetURL = spansArray[i].id.replace(/\|/g,"/");
|
||||
if (targetURL.indexOf('<?php echo strClean($_GET['find']); ?>')>-1 && targetURL.indexOf('_perms')>-1) {
|
||||
if (userTarget.indexOf("selected")>-1) {
|
||||
for (var j=0;j<top.ICEcoder.selectedFiles.length;j++) {
|
||||
if (top.ICEcoder.selectedFiles[j].indexOf(targetURL.replace(/\//g,"|").replace(/_perms/g,""))>-1) {
|
||||
foundInSelected = true;
|
||||
var spansArray = top.ICEcoder.filesFrame.contentWindow.document.getElementsByTagName('span');
|
||||
for (var i=0;i<spansArray.length;i++) {
|
||||
targetURL = spansArray[i].id.replace(/\|/g,"/");
|
||||
if (targetURL.indexOf('<?php echo strClean($_GET['find']); ?>')>-1 && targetURL.indexOf('_perms')>-1) {
|
||||
if (userTarget.indexOf("selected")>-1) {
|
||||
for (var j=0;j<top.ICEcoder.selectedFiles.length;j++) {
|
||||
if (top.ICEcoder.selectedFiles[j].indexOf(targetURL.replace(/\//g,"|").replace(/_perms/g,""))>-1) {
|
||||
foundInSelected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (userTarget.indexOf("all")>-1 || (userTarget.indexOf("selected")>-1 && foundInSelected)) {
|
||||
resultsDisplay += '<a href="javascript:top.ICEcoder.openFile(\'<?php echo $docRoot;?>'+targetURL.replace(/\|/g,"/").replace(/_perms/g,"")+'\');top.ICEcoder.showHide(\'hide\',top.document.getElementById(\'blackMask\'))">'+ targetURL.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<b><?php echo strClean($_GET['find']); ?></b>")+ '</a><br><div id="foundCount'+i+'">'+spansArray[i].innerHTML+', rename to '+targetURL.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<b><?php echo strClean($_GET['replace']);?></b>")+'</div>';
|
||||
<?php if (isset($_GET['replace'])) { ?>
|
||||
resultsDisplay += '<div class="replace" id="replace" onClick="renameSingle('+i+');this.style.display=\'none\'">rename</div>';
|
||||
<?php ;}; ?>
|
||||
resultsDisplay += '<hr>';
|
||||
foundArray.push(i);
|
||||
if (userTarget.indexOf("all")>-1 || (userTarget.indexOf("selected")>-1 && foundInSelected)) {
|
||||
resultsDisplay += '<a href="javascript:top.ICEcoder.openFile(\'<?php echo $docRoot;?>'+targetURL.replace(/\|/g,"/").replace(/_perms/g,"")+'\');top.ICEcoder.showHide(\'hide\',top.document.getElementById(\'blackMask\'))">'+ targetURL.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<b><?php echo strClean($_GET['find']); ?></b>")+ '</a><br><div id="foundCount'+i+'">'+spansArray[i].innerHTML+', rename to '+targetURL.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<b><?php echo strClean($_GET['replace']);?></b>")+'</div>';
|
||||
<?php if (isset($_GET['replace'])) { ?>
|
||||
resultsDisplay += '<div class="replace" id="replace" onClick="renameSingle('+i+');this.style.display=\'none\'">rename</div>';
|
||||
<?php ;}; ?>
|
||||
resultsDisplay += '<hr>';
|
||||
foundArray.push(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
<?php
|
||||
;}
|
||||
} else {
|
||||
$targetName = "file";
|
||||
$r = 0;
|
||||
function phpGrep($q, $path, $base) {
|
||||
$fp = opendir($path);
|
||||
$slash = $serverType == "Windows" ? "\\" : "/";
|
||||
global $r;
|
||||
global $ICEcoder;
|
||||
while($f = readdir($fp)) {
|
||||
if(preg_match("#^\.+$#", $f)) continue;
|
||||
$fullPath = $path.$slash.$f;
|
||||
if(is_dir($fullPath)) {
|
||||
$ret .= phpGrep($q, $fullPath, $base);
|
||||
} else if(stristr(file_get_contents($fullPath), $q)) {
|
||||
$rFile = false;
|
||||
$bFile = false;
|
||||
if ($_SESSION['userLevel']==0) {
|
||||
for ($i=0;$i<count($ICEcoder["restrictedFiles"]);$i++) {
|
||||
if (strpos($f,$ICEcoder['restrictedFiles'][$i])>0) {$rFile = true;};
|
||||
}
|
||||
}
|
||||
for ($i=0;$i<count($ICEcoder['bannedFiles']);$i++) {
|
||||
if (strpos($f,$ICEcoder['bannedFiles'][$i])>0) {$bFile = true;};
|
||||
}
|
||||
if (!$rFile && !$bFile) {
|
||||
$ret .= "<a href=\\\"javascript:top.ICEcoder.openFile('".$fullPath."');top.ICEcoder.showHide('hide',top.document.getElementById('blackMask'))\\\">";
|
||||
$ret .= str_replace($base,"",$fullPath)."</a><div id=\\\"foundCount".$r."\\\">Found ".substr_count(strtolower(file_get_contents($fullPath)),$q)." times</div>";
|
||||
if (isset($_GET['replace'])) {
|
||||
$ret .= "<div class=\\\"replace\\\" id=\\\"replace\\\" onClick=\\\"replaceInFileSingle('".$fullPath."');this.style.display=\'none\'\\\">replace</div>";
|
||||
};
|
||||
$ret .= '<hr>';
|
||||
echo 'foundArray.push("'.$fullPath.'");';
|
||||
$r++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
$results = phpGrep(strClean($_GET['find']), $docRoot.$ICEroot, $docRoot.$ICEroot);
|
||||
echo 'resultsDisplay += "'.$results.'";';
|
||||
?>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
foundArray.length==0 ? showHide = "hide" : showHide = "show";
|
||||
top.ICEcoder.showHide(showHide,top.document.getElementById('blackMask'));
|
||||
@@ -107,6 +160,17 @@ var replaceAll = function() {
|
||||
top.ICEcoder.showHide('hide',top.document.getElementById('blackMask'));
|
||||
}
|
||||
|
||||
var replaceInFileSingle = function(fileRef) {
|
||||
top.ICEcoder.replaceInFile(fileRef,'<?php echo strClean($_GET['find']); ?>','<?php echo strClean($_GET['replace']); ?>');
|
||||
}
|
||||
|
||||
var replaceInFilesAll = function() {
|
||||
for (var i=0;i<=foundArray.length-1;i++) {
|
||||
replaceInFileSingle(foundArray[i]);
|
||||
}
|
||||
top.ICEcoder.showHide('hide',top.document.getElementById('blackMask'));
|
||||
}
|
||||
|
||||
var renameSingle = function(arrayRef) {
|
||||
fileRef = spansArray[arrayRef].id.replace(/\|/g,"/").replace(/_perms/g,"");
|
||||
newName = spansArray[arrayRef].id.replace(/\|/g,"/").replace(/_perms/g,"").replace(/<?php echo str_replace("/","\/",strClean($_GET['find'])); ?>/g,"<?php echo strClean($_GET['replace']); ?>");
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php include("settings.php");?>
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
@@ -19,8 +18,15 @@
|
||||
|
||||
<link rel="stylesheet" href="editor.css">
|
||||
<?php
|
||||
$themeArray = array("blackboard","cobalt","eclipse","elegant","erlang-dark","lesser-dark","monokai","neat","night","rubyblue","vibrant-ink","xq-dark");
|
||||
for ($i=0;$i<count($themeArray)-1;$i++) {
|
||||
$themeArray = array();
|
||||
$handle = opendir('../'.$ICEcoder["codeMirrorDir"].'/theme/');
|
||||
while (false !== ($file = readdir($handle))) {
|
||||
if ($file !== "." && $file != "..") {
|
||||
array_push($themeArray,basename($file,".css"));
|
||||
}
|
||||
}
|
||||
sort($themeArray);
|
||||
for ($i=0;$i<count($themeArray);$i++) {
|
||||
echo '<link rel="stylesheet" href="../'.$ICEcoder["codeMirrorDir"].'/theme/'.$themeArray[$i].'.css">'.PHP_EOL;
|
||||
}
|
||||
?>
|
||||
@@ -30,7 +36,7 @@ for ($i=0;$i<count($themeArray)-1;$i++) {
|
||||
|
||||
<div class="infoPane">
|
||||
<img src="../images/ice-coder.png" class="logo">
|
||||
<div class="version"><?php echo $ICEcoder["versionNo"];?></div>
|
||||
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div>
|
||||
|
||||
<p>
|
||||
git:<br>
|
||||
@@ -128,7 +134,7 @@ theme<br>
|
||||
<select onchange="selectTheme();showButton()" id="select" name="theme">
|
||||
<option<?php if ($ICEcoder["theme"]=="default") {echo ' selected';}; ?>>default</option>
|
||||
<?php
|
||||
for ($i=0;$i<count($themeArray)-1;$i++) {
|
||||
for ($i=0;$i<count($themeArray);$i++) {
|
||||
$optionSelected = $ICEcoder["theme"]==$themeArray[$i] ? ' selected' : '';
|
||||
echo '<option'.$optionSelected.'>'.$themeArray[$i].'</option>'.PHP_EOL;
|
||||
}
|
||||
|
||||
@@ -29,9 +29,9 @@ include($settingsFile);
|
||||
|
||||
// Add ICEcoder settings to beginning of $ICEcoder array
|
||||
$ICEcoder = array(
|
||||
"versionNo" => "v 0.8.1",
|
||||
"codeMirrorDir" => "CodeMirror-2.32",
|
||||
"cMThisVer" => 2.32
|
||||
"versionNo" => "0.8.4",
|
||||
"codeMirrorDir" => "CodeMirror-2.33",
|
||||
"cMThisVer" => 2.33
|
||||
)+$ICEcoder;
|
||||
|
||||
// Update this config file?
|
||||
@@ -46,14 +46,14 @@ if (isset($_POST["theme"]) && $_POST["theme"] && $_SESSION['userLevel'] == 10) {
|
||||
$ICEcoder["tabsIndent"] = $_POST['tabsIndent'] ? "true" : "false";
|
||||
$ICEcoder["checkUpdates"] = $_POST['checkUpdates'] ? "true" : "false";
|
||||
$ICEcoder["openLastFiles"] = $_POST['openLastFiles'] ? "true" : "false";
|
||||
$ICEcoder["findFilesExclude"] = 'array("'.str_replace(', ','","',strClean($_POST['findFilesExclude'])).'")';
|
||||
$ICEcoder["findFilesExclude"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['findFilesExclude']))).'")';
|
||||
$ICEcoder["codeAssist"] = $_POST['codeAssist'] ? "true" : "false";
|
||||
$ICEcoder["visibleTabs"] = $_POST['visibleTabs'] ? "true" : "false";
|
||||
$ICEcoder["lockedNav"] = $_POST['lockedNav'] ? "true" : "false";
|
||||
if ($_POST['accountPassword']!="") {$ICEcoder["accountPassword"] = generateHash(strClean($_POST['accountPassword']));};
|
||||
$ICEcoder["restrictedFiles"] = 'array("'.str_replace(', ','","',strClean($_POST['restrictedFiles'])).'")';
|
||||
$ICEcoder["bannedFiles"] = 'array("'.str_replace(', ','","',strClean($_POST['bannedFiles'])).'")';
|
||||
$ICEcoder["allowedIPs"] = 'array("'.str_replace(', ','","',strClean($_POST['allowedIPs'])).'")';
|
||||
$ICEcoder["restrictedFiles"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['restrictedFiles']))).'")';
|
||||
$ICEcoder["bannedFiles"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedFiles']))).'")';
|
||||
$ICEcoder["allowedIPs"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['allowedIPs']))).'")';
|
||||
$ICEcoder["plugins"] = 'array('.PHP_EOL.' array('.PHP_EOL.' '.str_replace('====================','),'.PHP_EOL.' array(',$_POST['plugins']).'))';
|
||||
$ICEcoder["theme"] = strClean($_POST['theme']);
|
||||
$ICEcoder["tabWidth"] = numClean($_POST['tabWidth']);
|
||||
@@ -76,7 +76,7 @@ if (isset($_POST["theme"]) && $_POST["theme"] && $_SESSION['userLevel'] == 10) {
|
||||
// OK, now the config file has been updated, update our current session with new arrays
|
||||
$settingsArray = array("findFilesExclude","restrictedFiles","bannedFiles","allowedIPs");
|
||||
for ($i=0;$i<count($settingsArray);$i++) {
|
||||
$_SESSION[$settingsArray[$i]] = $ICEcoder[$settingsArray[$i]] = explode(", ",strClean($_POST[$settingsArray[$i]]));
|
||||
$_SESSION[$settingsArray[$i]] = $ICEcoder[$settingsArray[$i]] = explode(",",str_replace(" ","",strClean($_POST[$settingsArray[$i]])));
|
||||
}
|
||||
// Work out the theme to use now
|
||||
$ICEcoder["theme"]=="default" ? $themeURL = 'lib/editor.css' : $themeURL = $ICEcoder["codeMirrorDir"].'/theme/'.$ICEcoder["theme"].'.css';
|
||||
@@ -89,6 +89,10 @@ if (isset($_POST["theme"]) && $_POST["theme"] && $_SESSION['userLevel'] == 10) {
|
||||
// Define the docRoot & iceRoot
|
||||
$docRoot = rtrim(str_replace("\\","/",$_SERVER['DOCUMENT_ROOT']));
|
||||
$iceRoot = rtrim(str_replace("\\","/",$ICEcoder["root"]));
|
||||
if ($_SESSION['userLevel'] == 10) {
|
||||
echo "<script>top.docRoot='".$docRoot."';top.iceRoot='".$iceRoot."'</script>";
|
||||
}
|
||||
$serverType = stristr($_SERVER[SERVER_SOFTWARE], "win") ? "Windows" : "Linux";
|
||||
|
||||
// Establish our user level
|
||||
if (!isset($_SESSION['userLevel'])) {$_SESSION['userLevel'] = 0;};
|
||||
@@ -223,7 +227,7 @@ if ($ICEcoder["accountPassword"] == "" && isset($_GET['settings'])) {
|
||||
<div class="screenVCenter">
|
||||
<div class="screenCenter">
|
||||
<img src="../images/ice-coder.png">
|
||||
<div class="version"><?php echo $ICEcoder["versionNo"];?></div>
|
||||
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div>
|
||||
<form name="settingsUpdate" action="../" method="POST">
|
||||
<input type="password" name="accountPassword" class="accountPassword">
|
||||
<input type="submit" name="submit" value="Set Password" class="button">
|
||||
|
||||
BIN
plugins/dochub/icon.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
24
plugins/ice-repo/LICENSE.md
Normal file
@@ -0,0 +1,24 @@
|
||||
Copyright (C) 2012 Matt Pass
|
||||
Website: mattpass.com
|
||||
Email: matt@mattpass.com
|
||||
Twitter: @mattpass
|
||||
|
||||
#ICErepo License
|
||||
##Standard Open Source Initiative MIT License
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
61
plugins/ice-repo/README.md
Normal file
@@ -0,0 +1,61 @@
|
||||
ICErepo
|
||||
=======
|
||||
|
||||
Show diffs, push, pull & sync your site and Github repo's.
|
||||
|
||||
While Github has a fantastic website, mobile app, desktop app and of course bash system, there's no web based UI I can find to sync your website code with Github repo's or vice versa. That's what ICErepo provides.
|
||||
|
||||
Originally intended to be a plugin for ICEcoder (https://github.com/mattpass/ICEcoder), I have decided to make it a standalone lib so it can run by itself or easily be integrated into any existing system.
|
||||
|
||||
The aim is a simple UI to view diffs between your server dir's and related Github repo's. This list will consist of new files (those only on server), deleted files (those only on Github) and changed files (files that exist in both places but are different). Files that exist in both locations and the same are not shown to keep things minimalist.
|
||||
|
||||
Users can then to pick & choose the files & folder they'd like to commit, provide a title and message, then commit to Github. As each file is synced by the user to match the server it dissapears from the UI list. Alternatively you can pull files & folders from Github to sync your server dir's with the repo itself.
|
||||
|
||||
Cool huh?
|
||||
|
||||
**Current screnshot:**
|
||||
|
||||
<img src="http://www.icecoder.net/github/screenshot.jpg" alt="ICErepo screenshot">
|
||||
|
||||
This lib uses customised & minified versions of these brilliant and time tested repos:
|
||||
|
||||
Github API lib: https://github.com/michael/github
|
||||
|
||||
JS Diff lib: https://github.com/cemerick/jsdifflib
|
||||
|
||||
###Installation
|
||||
|
||||
####Step 1: Clone the repo
|
||||
|
||||
```
|
||||
$ git clone git@github:mattpass/ICErepo
|
||||
```
|
||||
|
||||
####Step 2: Enter your auth settings
|
||||
```
|
||||
Open index.php and enter either your Github oauth token or username & password
|
||||
oauth is recommended here, view http://developer.github.com/v3/oauth/ for info
|
||||
(If using oauth ensure you have repo scope & your app is granted the URL you'll run under)
|
||||
```
|
||||
|
||||
####Step 3: Enter your repo & server dir settings
|
||||
```
|
||||
Also in index.php, enter the repo & corresponding server paths
|
||||
Enter 'selected' as a 3rd param next to your default repo/server option to autoload that
|
||||
Finally, set $_SESSION['userLevel'] to be > 0 with your own login system, or simply uncomment line 3
|
||||
Upload ICErepo, visit in a web browser & enjoy
|
||||
```
|
||||
|
||||
**Dev schedule:**
|
||||
|
||||
**v0.8**
|
||||
Bug testing, refactoring & optimisation
|
||||
|
||||
**v0.9**
|
||||
Alpha testing
|
||||
|
||||
**v0.95**
|
||||
Beta testing
|
||||
|
||||
**v1.0**
|
||||
Version 1 released
|
||||
127
plugins/ice-repo/contents.php
Normal file
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
session_start();
|
||||
if ($_SESSION['userLevel'] == 0) {
|
||||
die("Sorry, you need to be logged in to use ICErepo");
|
||||
}
|
||||
|
||||
function strClean($var) {
|
||||
// returns converted entities where there are HTML entity equivalents
|
||||
return htmlentities($var, ENT_QUOTES, "UTF-8");
|
||||
}
|
||||
|
||||
function numClean($var) {
|
||||
// returns a number, whole or decimal or null
|
||||
return is_numeric($var) ? floatval($var) : false;
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ICErepo v<?php echo $version;?></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script src="lib/base64.js"></script>
|
||||
<script src="lib/github.js"></script>
|
||||
<script src="lib/difflib.js"></script>
|
||||
<script src="ice-repo.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="ice-repo.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<?php
|
||||
// Function to sort given values alphabetically
|
||||
function alphasort($a, $b) {
|
||||
return strcmp($a->getPathname(), $b->getPathname());
|
||||
}
|
||||
|
||||
// Class to put forward the values for sorting
|
||||
class SortingIterator implements IteratorAggregate {
|
||||
private $iterator = null;
|
||||
public function __construct(Traversable $iterator, $callback) {
|
||||
$array = iterator_to_array($iterator);
|
||||
usort($array, $callback);
|
||||
$this->iterator = new ArrayIterator($array);
|
||||
}
|
||||
public function getIterator() {
|
||||
return $this->iterator;
|
||||
}
|
||||
}
|
||||
|
||||
// Get a full list of dirs & files and begin sorting using above class & function
|
||||
$repoPath = explode("@",strClean($_POST['repo']));
|
||||
$repo = $repoPath[0];
|
||||
$path = $repoPath[1];
|
||||
$objectList = new SortingIterator(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST), 'alphasort');
|
||||
|
||||
// Finally, we have our ordered list, so display
|
||||
$i=0;
|
||||
$dirListArray = array();
|
||||
$dirSHAArray = array();
|
||||
$dirTypeArray = array();
|
||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||
foreach ($objectList as $objectRef) {
|
||||
$fileFolderName = rtrim(substr($objectRef->getPathname(), strlen($path)),"..");
|
||||
if ($objectRef->getFilename()!="." && $fileFolderName[strlen($fileFolderName)-1]!="/") {
|
||||
$contents = file_get_contents($path.$fileFolderName);
|
||||
if (strpos(finfo_file($finfo, $path.$fileFolderName),"text")===0) {
|
||||
$contents = str_replace("\r","",$contents);
|
||||
};
|
||||
$store = "blob ".strlen($contents)."\000".$contents;
|
||||
$i++;
|
||||
array_push($dirListArray,ltrim($fileFolderName,"/"));
|
||||
array_push($dirSHAArray,sha1($store));
|
||||
$type = is_dir($path.$fileFolderName) ? "dir" : "file";
|
||||
array_push($dirTypeArray,$type);
|
||||
}
|
||||
}
|
||||
finfo_close($finfo);
|
||||
?>
|
||||
|
||||
<script>
|
||||
top.repo = '<?php echo $repo;?>';
|
||||
top.path = '<?php echo $path;?>';
|
||||
dirListArray = [<?php echo "'".implode("','", $dirListArray)."'";?>];
|
||||
dirSHAArray = [<?php echo "'".implode("','", $dirSHAArray)."'";?>];
|
||||
dirTypeArray = [<?php echo "'".implode("','", $dirTypeArray)."'";?>];
|
||||
</script>
|
||||
|
||||
<div id="compareList" class="mainContainer"></div>
|
||||
|
||||
<div id="commitPane" class="commitPane">
|
||||
<b style='font-size: 18px'>COMMIT CHANGES:</b><br><br>
|
||||
<form name="fcForm" action="file-control.php" target="fileControl" method="POST">
|
||||
<input type="text" name="title" value="Title..." style="width: 260px; border: 0; background: #f8f8f8; margin-bottom: 10px" onFocus="titleDefault='Title...'; if(this.value==titleDefault) {this.value=''}" onBlur="if(this.value=='') {this.value=titleDefault}"><br>
|
||||
<textarea name="message" style="width: 260px; height: 180px; border: 0; background: #f8f8f8; margin-bottom: 5px" onFocus="messageDefault='Message...'; if(this.value==messageDefault) {this.value=''}" onBlur="if(this.value=='') {this.value=messageDefault}">Message...</textarea>
|
||||
<input type="hidden" name="token" value="<?php echo strClean($_POST['token']);?>">
|
||||
<input type="hidden" name="username" value="<?php echo strClean($_POST['username']);?>">
|
||||
<input type="hidden" name="password" value="<?php echo strClean($_POST['password']);?>">
|
||||
<input type="hidden" name="path" value="<?php echo $path; ?>">
|
||||
<input type="hidden" name="rowID" value="">
|
||||
<input type="hidden" name="gitRepo" value="<?php echo $repo; ?>">
|
||||
<input type="hidden" name="repo" value="">
|
||||
<input type="hidden" name="dir" value="">
|
||||
<input type="hidden" name="action" value="">
|
||||
<input type="submit" name="commit" value="Commit changes" onClick="return commitChanges()" style="border: 0; background: #555; color: #fff; cursor: pointer">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="infoPane" class="infoPane"></div>
|
||||
|
||||
<script>
|
||||
top.fcFormAlias = document.fcForm;
|
||||
var github = new Github(<?php
|
||||
if ($_POST['token']!="") {
|
||||
echo '{token: "'.strClean($_POST['token']).'", auth: "oauth"}';
|
||||
} else{
|
||||
echo '{username: "'.strClean($_POST['username']).'", password: "'.strClean($_POST['password']).'", auth: "basic"}';
|
||||
}?>);
|
||||
repoListArray = [];
|
||||
repoSHAArray = [];
|
||||
window.onLoad=gitCommand('repo.show','<?php echo strClean($_POST['repo']);?>');
|
||||
</script>
|
||||
|
||||
<iframe name="fileControl" style="display: none"></iframe>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
144
plugins/ice-repo/file-control.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
session_start();
|
||||
if ($_SESSION['userLevel'] == 0) {
|
||||
die("Sorry, you need to be logged in to use ICErepo");
|
||||
}
|
||||
// returns converted entities where there are HTML entity equivalents
|
||||
function strClean($var) {
|
||||
return htmlentities($var, ENT_QUOTES, "UTF-8");
|
||||
}
|
||||
|
||||
// returns a number, whole or decimal or null
|
||||
function numClean($var) {
|
||||
return is_numeric($var) ? floatval($var) : false;
|
||||
}
|
||||
|
||||
$repoPath = strClean($_POST['repoPath']);
|
||||
$gitRepo = strClean($_POST['gitRepo']);
|
||||
$path = strClean($_POST['path']);
|
||||
$rowID = strClean($_POST['rowID']);
|
||||
$repo = strClean($_POST['repo']);
|
||||
$dir = strClean($_POST['dir']);
|
||||
$action = str_replace("PULL:","",str_replace("SAVEPULLS:","",strClean($_POST['action'])));
|
||||
$rowIDArray = explode(",",$rowID);
|
||||
$repoArray = explode(",",$repo);
|
||||
$dirArray = explode(",",$dir);
|
||||
$actionArray = explode(",",$action);
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ICErepo v<?php echo $version;?></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script src="lib/underscore-min.js"></script>
|
||||
<script src="lib/base64.js"></script>
|
||||
<script src="lib/github.js"></script>
|
||||
<script src="lib/difflib.js"></script>
|
||||
<script src="ice-repo.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="ice-repo.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<script>
|
||||
fullRepoPath='<?php echo $repo;?>';
|
||||
gitRepo='<?php echo $gitRepo;?>';
|
||||
var github = new Github(<?php
|
||||
if ($_POST['token']!="") {
|
||||
echo '{token: "'.strClean($_POST['token']).'", auth: "oauth"}';
|
||||
} else{
|
||||
echo '{username: "'.strClean($_POST['username']).'", password: "'.strClean($_POST['password']).'", auth: "basic"}';
|
||||
}?>);
|
||||
repoUser = gitRepo.split('/')[0];
|
||||
repoName = gitRepo.split('/')[1];
|
||||
filePath = fullRepoPath.replace(repoUser+"/"+repoName+"/","");
|
||||
var repo = github.getRepo(repoUser,repoName);
|
||||
</script>
|
||||
|
||||
<?php if ($_POST['action']=="view") {?>
|
||||
<form name="fcForm">
|
||||
<textarea name="fileContents"><?php echo htmlentities(file_get_contents($dir)); ?></textarea>
|
||||
</form>
|
||||
<script>
|
||||
rowID = <?php echo $rowID; ?>;
|
||||
|
||||
baseTextName = "Server: <?php echo str_replace($_SERVER['DOCUMENT_ROOT']."/","",$dir);?> ";
|
||||
newTextName = "Github: <?php echo $repo;?>";
|
||||
window.onLoad = sendData(baseTextName,newTextName);
|
||||
</script>
|
||||
<?php } else if (substr($_POST['action'],0,5)=="PULL:") { ?>
|
||||
<form name="fcForm" action="file-control.php" method="POST">
|
||||
<?php
|
||||
echo '<input type="hidden" name="rowID" value="'.$rowID.'">';
|
||||
echo '<input type="hidden" name="repo" value="'.$repo.'">';
|
||||
echo '<input type="hidden" name="dir" value="'.$dir.'">';
|
||||
echo '<input type="hidden" name="action" value="SAVEPULLS:'.$action.'">';
|
||||
echo '<input type="hidden" name="path" value="'.$path.'">';
|
||||
for ($i=0;$i<count($rowIDArray);$i++) {
|
||||
if ($repoArray[$i]!="") {
|
||||
echo '<textarea name="repoContents'.$rowIDArray[$i].'"></textarea>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</form>
|
||||
<script>
|
||||
rowIDArray = [<?php echo implode(",", $rowIDArray);?>];
|
||||
repoArray = [<?php echo "'".implode("','", $repoArray)."'";?>];
|
||||
dirArray = [<?php echo "'".implode("','", $dirArray)."'";?>];
|
||||
actionArray = [<?php echo "'".implode("','", $actionArray)."'";?>];
|
||||
window.onLoad = getData();
|
||||
</script>
|
||||
<?php } else if (substr($_POST['action'],0,10)=="SAVEPULLS:") {?>
|
||||
<script>
|
||||
<?php
|
||||
for ($i=0;$i<count($rowIDArray);$i++) {
|
||||
if ($actionArray[$i]!="new") {
|
||||
$dirs = explode("/",$repoArray[$i]);
|
||||
$relDir = "";
|
||||
for ($j=0;$j<count($dirs)-1;$j++) {
|
||||
$relDir .= "/".$dirs[$j];
|
||||
if (!is_dir($path.$relDir)) {
|
||||
mkdir($path.$relDir, 0755);
|
||||
}
|
||||
}
|
||||
$fh = fopen($path."/".$repoArray[$i], 'w') or die("alert('Sorry, there was a problem pulling ".$repoArray[$i].". Either the file is unavailable on Github or server permissions aren\'t allowing it to be created/updated.');get('blackMask','top').style.display='none';");
|
||||
fwrite($fh, $_POST['repoContents'.$rowIDArray[$i]]);
|
||||
fclose($fh);
|
||||
echo "hideRow(".$rowIDArray[$i].");top.newCount--;";
|
||||
} else {
|
||||
is_dir($dir) ? $success = rmdir($dir) : $success = unlink($dir);
|
||||
if (!$success) {
|
||||
echo "alert('Sorry, couldn\'t delete ".$dir."\\n\\n";
|
||||
echo "Maybe you need to give file permissions for it to be deleted?');";
|
||||
} else {
|
||||
echo "hideRow(".$rowIDArray[$i].");top.deletedCount--;";
|
||||
}
|
||||
}
|
||||
}
|
||||
echo "get('blackMask','top').style.display = 'none';";
|
||||
?>
|
||||
</script>
|
||||
<?php } else { ?>
|
||||
<form name="fcForm">
|
||||
<?php
|
||||
for ($i=0;$i<count($rowIDArray);$i++) {
|
||||
if ($dirArray[$i]!="") {
|
||||
echo '<textarea name="fileContents'.$rowIDArray[$i].'">';
|
||||
echo htmlentities(file_get_contents($dirArray[$i]));
|
||||
echo '</textarea>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</form>
|
||||
<script>
|
||||
rowIDArray = [<?php echo implode(",", $rowIDArray);?>];
|
||||
repoArray = [<?php echo "'".implode("','", $repoArray)."'";?>];
|
||||
dirArray = [<?php echo "'".implode("','", $dirArray)."'";?>];
|
||||
actionArray = [<?php echo "'".implode("','", $actionArray)."'";?>];
|
||||
window.onLoad = startProcess();
|
||||
</script>
|
||||
<?php } ?>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
79
plugins/ice-repo/ice-repo.css
Normal file
@@ -0,0 +1,79 @@
|
||||
/* First, reset everything to a standard */
|
||||
html, body, div, span, applet, object, iframe,
|
||||
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||
a, abbr, acronym, address, big, cite, code,
|
||||
del, dfn, em, font, img, ins, kbd, q, s, samp,
|
||||
small, strike, strong, sub, sup, tt, var,
|
||||
b, u, i, center,
|
||||
dl, dt, dd, ol, ul, li,
|
||||
fieldset, form, label, legend,
|
||||
table, caption, tbody, tfoot, thead, tr, th, td {
|
||||
font-family: arial, verdana, helvetica, sans-serif;
|
||||
border: 0px;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
outline: 0px;
|
||||
font-size: 12px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
html, body {background-color: #fff; width: 100%}
|
||||
p {color: #444}
|
||||
textarea, input {font-family: arial, verdana, helvetica, sans-serif; padding: 4px}
|
||||
|
||||
.header {position: absolute; width: 100%; height: 60px; background: #444; z-index: 1}
|
||||
|
||||
.mainContainer {position: relative; display: block; width: 900px; padding: 20px}
|
||||
|
||||
.blackMask {position: absolute; width: 100%; height: 100%; background: rgba(0,0,0,0.9); z-index: 200}
|
||||
.loadingMsgCenter {position: absolute; display: inline-block; left: 50%; top: 50%; width: 1px; height: 1px}
|
||||
.loadingMsgContainer {position: absolute; display: inline-block; left: -30px; top: -7px; width: 60px; height: 14px; background-color: #bbb; color: #222; font-weight: bold; text-align: center; padding: 15px; z-index: 201;
|
||||
-webkit-box-shadow: 8px 8px 8px 8px rgba(0,0,0,0.4);
|
||||
-moz-box-shadow: 8px 8px 8px 8px rgba(0,0,0,0.4);
|
||||
box-shadow: 4px 4px 8px 4px rgba(0,0,0,0.4)}
|
||||
|
||||
.repoFrame {position: absolute; width: 100%; height: 90%; left: 0px; margin-top: 60px}
|
||||
|
||||
.row {position: relative; display: inline-block; background: #ccc; color: #000; width: 880px; padding: 10px 7px; margin-bottom: 2px; cursor: pointer; padding-left: 35px}
|
||||
.row:hover {background: #888; color: #fff}
|
||||
.row .icon {display: inline-block; width: 16px; height: 16px; margin-right: 7px; background-image:url('../../images/file-folder-icons.png'); background-repeat: no-repeat}
|
||||
.row .checkbox {position: absolute; display: inline-block; height: 38px; width: 30px; top: -4px; left: 0px}
|
||||
.rowContent {position: relative; display: none; background: #eee; width: 100%; height: 300px; padding: 7px; margin-bottom: 10px; overflow: auto}
|
||||
.pullGithub {position: absolute; display: inline-block; top: 7px; left: 822px; padding: 5px; background: #bbb; color: #444; font-size: 10px; cursor: pointer}
|
||||
.pullGithubSel {position: absolute; display: inline-block; top: 7px; left: 822px; margin-top: 12px; margin-left: -22px; padding: 5px; background: #bbb; color: #444; font-size: 10px; cursor: pointer}
|
||||
.version {position: absolute; display: inline-block; width: 100px; left: 1000px; top: 33px; font-size: 10px; color: #bbb; text-align: right}
|
||||
.logo {position: absolute; left: 1107px; top: 12px}
|
||||
|
||||
.commitPane {position: fixed; background: #ccc; width: 270px; height: 300px; left: 960px; top: 0px; padding: 20px 10px 10px 10px; z-index: 100}
|
||||
.infoPane {position: fixed; width: 270px; height: 100px; left: 960px; top: 340px; padding: 20px 10px 10px 10px; z-index: 100}
|
||||
|
||||
/* Folder */
|
||||
.ext-folder {background-position: 0 0}
|
||||
|
||||
/* Additional file types */
|
||||
.ext-coffee {background-position: -48px 0}
|
||||
.ext-css {background-position: -64px 0}
|
||||
.ext-gif {background-position: -80px 0}
|
||||
.ext-htm {background-position: -96px 0}
|
||||
.ext-html {background-position: -96px 0}
|
||||
.ext-jpg {background-position: -112px 0}
|
||||
.ext-jpeg {background-position: -112px 0}
|
||||
.ext-js {background-position: -128px 0}
|
||||
.ext-less {background-position: -144px 0}
|
||||
.ext-php {background-position: -160px 0}
|
||||
.ext-png {background-position: -176px 0}
|
||||
.ext-rb {background-position: -192px 0}
|
||||
.ext-rbx {background-position: -192px 0}
|
||||
.ext-rhtml {background-position: -192px 0}
|
||||
.ext-ruby {background-position: -192px 0}
|
||||
.ext-txt {background-position: -208px 0}
|
||||
.ext-zip {background-position: -224px 0}
|
||||
.ext-file {background-position: -32px 0}
|
||||
|
||||
table.diff {color: #888; border: 0; white-space: pre-wrap}
|
||||
table.diff tbody th {color:#888; font-size: 11px; font-weight: normal; padding: 2px; vertical-align:top}
|
||||
table.diff thead th.texttitle {background: #444; color: #fff; text-align:left; padding: 2px}
|
||||
table.diff tbody td {width: 100%; font-family: Courier, monospace; vertical-align: top}
|
||||
table.diff .delete {background: #0b0; color: #fff}
|
||||
table.diff .insert {background: #b00; color: #fff}
|
||||
table.diff th.author {display: none}
|
||||
336
plugins/ice-repo/ice-repo.js
Normal file
@@ -0,0 +1,336 @@
|
||||
top.selRowArray = [];
|
||||
top.selRepoDirArray = [];
|
||||
top.selActionArray = [];
|
||||
top.filetypesArray = ['coffee','css','gif','htm','html','jpg','jpeg','js','less','php','png','rb','rbx','rhtml','ruby','txt','zip'];
|
||||
|
||||
doRepo = function(repo) {
|
||||
document.showRepo.repo.value = repo;
|
||||
document.showRepo.submit();
|
||||
}
|
||||
|
||||
updateSelection = function(elem,row,repoDir,action) {
|
||||
if (elem.checked) {
|
||||
top.selRowArray.push(row);
|
||||
top.selRepoDirArray.push(repoDir);
|
||||
top.selActionArray.push(action);
|
||||
} else {
|
||||
arrayIndex = top.selRowArray.indexOf(row);
|
||||
top.selRowArray.splice(arrayIndex,1);
|
||||
top.selRepoDirArray.splice(arrayIndex,1);
|
||||
top.selActionArray.splice(arrayIndex,1);
|
||||
};
|
||||
}
|
||||
|
||||
getContent = function(thisRow,path) {
|
||||
if("undefined" == typeof overOption || !overOption) {
|
||||
if ("undefined" == typeof lastRow || lastRow!=thisRow || get('row'+thisRow+'Content').innerHTML=="") {
|
||||
for (i=1;i<=rowID;i++) {
|
||||
get('row'+i+'Content').innerHTML = "";
|
||||
get('row'+i+'Content').style.display = "none";
|
||||
}
|
||||
repo = top.repo + "/" + path;
|
||||
dir = top.path + "/" + path;
|
||||
document.fcForm.rowID.value = thisRow;
|
||||
document.fcForm.repo.value = repo;
|
||||
document.fcForm.dir.value = dir;
|
||||
document.fcForm.action.value = "view";
|
||||
document.fcForm.submit();
|
||||
} else {
|
||||
get('row'+thisRow+'Content').innerHTML = "";
|
||||
get('row'+thisRow+'Content').style.display = "none";
|
||||
}
|
||||
lastRow = thisRow;
|
||||
}
|
||||
}
|
||||
|
||||
commitChanges = function() {
|
||||
if(top.selRowArray.length>0) {
|
||||
if (document.fcForm.title.value!="Title..." && document.fcForm.message.value!="Message...") {
|
||||
get('blackMask','top').style.display = "block";
|
||||
top.selRowValue = "";
|
||||
top.selDirValue = "";
|
||||
top.selRepoValue = "";
|
||||
top.selActionValue = "";
|
||||
for (i=0;i<top.selRowArray.length;i++) {
|
||||
top.selRowValue += top.selRowArray[i];
|
||||
if (top.selActionArray[i]=="changed") {
|
||||
top.selDirValue += top.selRepoDirArray[i].split('@')[0];
|
||||
top.selRepoValue += top.selRepoDirArray[i].split('@')[1];
|
||||
}
|
||||
if (top.selActionArray[i]=="new") {
|
||||
top.selDirValue += top.selRepoDirArray[i];
|
||||
top.selRepoValue += "";
|
||||
}
|
||||
if (top.selActionArray[i]=="deleted") {
|
||||
top.selDirValue += "";
|
||||
top.selRepoValue += top.selRepoDirArray[i];
|
||||
}
|
||||
top.selActionValue += top.selActionArray[i];
|
||||
if (i<top.selRowArray.length-1) {
|
||||
top.selRowValue += ",";
|
||||
top.selDirValue += ",";
|
||||
top.selRepoValue += ",";
|
||||
top.selActionValue += ",";
|
||||
}
|
||||
}
|
||||
document.fcForm.rowID.value = top.selRowValue;
|
||||
document.fcForm.dir.value = top.selDirValue;
|
||||
document.fcForm.repo.value = top.selRepoValue;
|
||||
document.fcForm.action.value = top.selActionValue;
|
||||
document.fcForm.submit();
|
||||
} else {
|
||||
alert('Please enter a title & message for the commit');
|
||||
}
|
||||
} else {
|
||||
alert('Please select some files/folders to commit');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
pullContent = function(thisRow,thisPath,thisRepo,thisAction) {
|
||||
get('blackMask','top').style.display = "block";
|
||||
if (thisRow=="selected") {
|
||||
top.selRowValue = "";
|
||||
top.selDirValue = "";
|
||||
top.selRepoValue = "";
|
||||
top.selActionValue = "";
|
||||
for (i=0;i<top.selRowArray.length;i++) {
|
||||
top.selRowValue += top.selRowArray[i];
|
||||
if (top.selActionArray[i]=="changed") {
|
||||
repoUser = top.selRepoDirArray[i].split('@')[1].split('/')[0];
|
||||
repoName = top.selRepoDirArray[i].split('@')[1].split('/')[1];
|
||||
top.selDirValue += top.selRepoDirArray[i].split('@')[0];
|
||||
top.selRepoValue += top.selRepoDirArray[i].split('@')[1].replace(repoUser+"/"+repoName+"/","");
|
||||
}
|
||||
if (top.selActionArray[i]=="new") {
|
||||
top.selDirValue += top.selRepoDirArray[i];
|
||||
top.selRepoValue += "";
|
||||
}
|
||||
if (top.selActionArray[i]=="deleted") {
|
||||
repoUser = top.selRepoDirArray[i].split('/')[0];
|
||||
repoName = top.selRepoDirArray[i].split('/')[1];
|
||||
top.selDirValue += "";
|
||||
top.selRepoValue += top.selRepoDirArray[i].replace(repoUser+"/"+repoName+"/","");
|
||||
}
|
||||
top.selActionValue += top.selActionArray[i];
|
||||
if (i<top.selRowArray.length-1) {
|
||||
top.selRowValue += ",";
|
||||
top.selDirValue += ",";
|
||||
top.selRepoValue += ",";
|
||||
top.selActionValue += ",";
|
||||
}
|
||||
}
|
||||
} else {
|
||||
top.selRowValue = thisRow;
|
||||
top.selDirValue = thisPath;
|
||||
top.selRepoValue = thisRepo;
|
||||
top.selActionValue = thisAction;
|
||||
}
|
||||
top.fcFormAlias.rowID.value = top.selRowValue;
|
||||
top.fcFormAlias.dir.value = top.selDirValue;
|
||||
top.fcFormAlias.repo.value = top.selRepoValue;
|
||||
top.fcFormAlias.action.value = "PULL:"+top.selActionValue;
|
||||
top.fcFormAlias.submit();
|
||||
}
|
||||
|
||||
getData = function() {
|
||||
if (actionArray[0]!="new") {
|
||||
repo.read('master', repoArray[0], function(err, data) {
|
||||
document.fcForm['repoContents'+rowIDArray[0]].innerHTML=data;
|
||||
if(!err) {
|
||||
removeFirstArrayItems();
|
||||
rowIDArray.length>0 ? getData() : document.fcForm.submit();
|
||||
} else {
|
||||
alert('Sorry, there was an error reading '+repoArray[0]);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
removeFirstArrayItems();
|
||||
rowIDArray.length>0 ? getData() : document.fcForm.submit();
|
||||
}
|
||||
}
|
||||
|
||||
sendData = function(baseTextName,newTextName) {
|
||||
repo.read('master', filePath, function(err, data) {
|
||||
dirContent = document.fcForm.fileContents.value;
|
||||
repoContent = data;
|
||||
diffUsingJS(dirContent,repoContent,baseTextName,newTextName);
|
||||
get("row"+rowID+"Content","parent").style.display = "inline-block";
|
||||
});
|
||||
}
|
||||
|
||||
removeFirstArrayItems = function() {
|
||||
rowIDArray.splice(0,1);
|
||||
repoArray.splice(0,1);
|
||||
dirArray.splice(0,1);
|
||||
actionArray.splice(0,1);
|
||||
}
|
||||
|
||||
hideRow = function(row) {
|
||||
top.rowCount--;
|
||||
updateInfo('parent');
|
||||
get('checkbox'+row,'parent').checked=false;
|
||||
parent.updateSelection(get('checkbox'+row,'parent'));
|
||||
get('row'+row,'parent').style.display = get('row'+row+'Content','parent').style.display = "none";
|
||||
}
|
||||
|
||||
function diffUsingJS (dirContent,repoContent,baseTextName,newTextName) {
|
||||
var base = difflib.stringAsLines(dirContent);
|
||||
var newtxt = difflib.stringAsLines(repoContent);
|
||||
var sm = new difflib.SequenceMatcher(base, newtxt);
|
||||
var opcodes = sm.get_opcodes();
|
||||
var diffoutputdiv = get("row"+rowID+"Content","parent");
|
||||
while (diffoutputdiv.firstChild) diffoutputdiv.removeChild(diffoutputdiv.firstChild);
|
||||
var contextSize = ""; // optional
|
||||
contextSize = contextSize ? contextSize : null;
|
||||
diffoutputdiv.appendChild(
|
||||
diffview.buildView(
|
||||
{
|
||||
baseTextLines:base,
|
||||
newTextLines:newtxt,
|
||||
opcodes:opcodes,
|
||||
baseTextName:baseTextName,
|
||||
newTextName:newTextName,
|
||||
contextSize:contextSize,
|
||||
viewType: 1 // 0 = side by side, 1 = inline
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// Add or Update files...
|
||||
ffAddOrUpdate = function(row,gitRepo,action) {
|
||||
repo.write('master', gitRepo, document.fcForm['fileContents'+row].value,parent.document.fcForm.title.value+ '\n\n'+parent.document.fcForm.message.value, function(err) {
|
||||
if(!err) {
|
||||
removeFirstArrayItems();
|
||||
hideRow(row);
|
||||
top.newCount--;
|
||||
rowIDArray.length>0 ? startProcess() : get('blackMask','top').style.display = "none";
|
||||
} else {
|
||||
alert('Sorry, there was an error adding '+gitRepo);
|
||||
}
|
||||
});
|
||||
}
|
||||
// Delete files...
|
||||
ffDelete = function(row,gitRepo,action) {
|
||||
repo.remove('master', gitRepo, function(err) {
|
||||
if(!err) {
|
||||
removeFirstArrayItems();
|
||||
hideRow(row);
|
||||
top.deletedCount--;
|
||||
rowIDArray.length>0 ? startProcess() : get('blackMask','top').style.display = "none";
|
||||
} else {
|
||||
alert('Sorry, there was an error deleting '+gitRepo);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
startProcess = function() {
|
||||
if(actionArray[0]=="changed"||actionArray[0]=="new") {
|
||||
if(actionArray[0]=="changed") {repoLoc = repoArray[0].replace(repoUser+"/"+repoName+"/","")}
|
||||
if(actionArray[0]=="new") {repoLoc = dirArray[0].replace(top.path,'')}
|
||||
ffAddOrUpdate(rowIDArray[0],repoLoc,actionArray[0]);
|
||||
}
|
||||
if(actionArray[0]=="deleted") {
|
||||
repoLoc = repoArray[0].replace(repoUser+"/"+repoName+"/","");
|
||||
ffDelete(rowIDArray[0],repoLoc,actionArray[0]);
|
||||
}
|
||||
}
|
||||
|
||||
get = function(elem,context) {
|
||||
return context ? window[context].document.getElementById(elem) : document.getElementById(elem);
|
||||
}
|
||||
|
||||
updateInfo = function(context) {
|
||||
get('infoPane',context).innerHTML = "<b style='font-size: 18px'>INFO:</b><br><br><b>"+top.rowCount+" files</b><br><br>"+top.changedCount+" changed<br>"+top.newCount+" new<br>"+top.deletedCount+" deleted";
|
||||
}
|
||||
|
||||
gitCommand = function(comm,value) {
|
||||
if (comm=="repo.show") {
|
||||
userRepo = value.split("@")[0].split("/");
|
||||
dir = value.split("@")[1];
|
||||
var repo = github.getRepo(userRepo[0],userRepo[1]);
|
||||
rowID = 0;
|
||||
repo.getTree('master?recursive=true', function(err, tree) {
|
||||
for (i=0;i<tree.length;i++) {
|
||||
repoListArray.push(tree[i].path);
|
||||
repoSHAArray.push(tree[i].sha);
|
||||
}
|
||||
var c = "", n = "", d = "";
|
||||
top.rowCount=0, top.changedCount=0, top.newCount=0, top.deletedCount=0;
|
||||
for (i=0;i<dirListArray.length;i++) {
|
||||
repoArrayPos = repoListArray.indexOf(dirListArray[i]);
|
||||
ext = dirTypeArray[i]=="dir"
|
||||
? "folder"
|
||||
: dirListArray[i].substr(dirListArray[i].lastIndexOf('.')+1);
|
||||
if (repoArrayPos == "-1") {
|
||||
rowID++;
|
||||
sE = ext == 'folder' ? ' style="cursor: default"' : '';
|
||||
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+dirListArray[i]+'\')"' : '';
|
||||
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+dirListArray[i]+'\',\''+dirListArray[i]+'\',\'new\')"';
|
||||
|
||||
n += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
|
||||
n += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.path+"/"+dirListArray[i]+"\",\"new\")'>";
|
||||
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
|
||||
n += "<div class='icon ext-"+ext+"'></div>"+dirListArray[i];
|
||||
n += "<div class='pullGithub' style='left: 815px' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Delete from server</div><br>";
|
||||
n += "</div>";
|
||||
|
||||
n += "<span class='rowContent' id='row"+rowID+"Content'></span>";
|
||||
top.rowCount++;
|
||||
top.newCount++;
|
||||
|
||||
} else if (dirTypeArray[i] == "file" && dirSHAArray[i] != repoSHAArray[repoArrayPos]) {
|
||||
rowID++;
|
||||
sE = ext == 'folder' ? ' style="cursor: default"' : '';
|
||||
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+dirListArray[i]+'\')"' : '';
|
||||
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+dirListArray[i]+'\',\''+dirListArray[i]+'\',\'changed\')"';
|
||||
|
||||
c += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
|
||||
c += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.path+"/"+dirListArray[i]+"@"+top.repo+"/"+dirListArray[i]+"\",\"changed\")'>";
|
||||
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
|
||||
c += "<div class='icon ext-"+ext+"'></div>"+dirListArray[i];
|
||||
c += "<div class='pullGithub' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Pull from Github</div><br>";
|
||||
c += "</div>";
|
||||
|
||||
c += "<span class='rowContent' id='row"+rowID+"Content'></span>";
|
||||
top.rowCount++;
|
||||
top.changedCount++;
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0;i<repoListArray.length;i++) {
|
||||
dirArrayPos = dirListArray.indexOf(repoListArray[i]);
|
||||
ext = repoListArray[i].lastIndexOf('/') > repoListArray[i].lastIndexOf('.')
|
||||
? "folder"
|
||||
: repoListArray[i].substr(repoListArray[i].lastIndexOf('.')+1);
|
||||
if (dirArrayPos == "-1") {
|
||||
rowID++;
|
||||
sE = ext == 'folder' ? ' style="cursor: default"' : '';
|
||||
cE = ext != 'folder' ? ' onClick="getContent('+rowID+',\''+repoListArray[i]+'\')"' : '';
|
||||
gE = 'onClick="pullContent('+rowID+',\''+top.path+'/'+repoListArray[i]+'\',\''+repoListArray[i]+'\',\'deleted\')"';
|
||||
|
||||
d += "<div class='row' id='row"+rowID+"'"+cE+sE+">";
|
||||
d += "<input type='checkbox' class='checkbox' id='checkbox"+rowID+"' onMouseOver='overOption=true' onMouseOut='overOption=false' onClick='updateSelection(this,"+rowID+",\""+top.repo+"/"+repoListArray[i]+"\",\"deleted\")'>";
|
||||
if (ext != 'folder' && top.filetypesArray.indexOf(ext)==-1) {ext = 'file'};
|
||||
d += "<div class='icon ext-"+ext+"'></div>"+repoListArray[i];
|
||||
d += "<div class='pullGithub' onMouseOver='overOption=true' onMouseOut='overOption=false' "+gE+">Pull from Github</div><br>";
|
||||
d += "</div>";
|
||||
|
||||
d += "<span class='rowContent' id='row"+rowID+"Content'></span>";
|
||||
top.rowCount++;
|
||||
top.deletedCount++;
|
||||
}
|
||||
}
|
||||
|
||||
c = "<b style='font-size: 18px'>CHANGED FILES:</b><br><br>"+c;
|
||||
n = "<b style='font-size: 18px'>NEW FILES:</b><br><br>"+n;
|
||||
d = "<b style='font-size: 18px'>DELETED FILES:</b><br><br>"+d
|
||||
|
||||
get('compareList').innerHTML = c+"<br><br>"+n+"<br><br>"+d;
|
||||
updateInfo();
|
||||
get('blackMask','top').style.display='none';
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
BIN
plugins/ice-repo/images/ice-repo.gif
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
@@ -1,21 +1,75 @@
|
||||
<?php
|
||||
session_start();
|
||||
// $_SESSION['userLevel'] = 10;
|
||||
if ($_SESSION['userLevel'] == 0) {
|
||||
die("Sorry, you need to be logged in to use ICErepo");
|
||||
}
|
||||
|
||||
$docRoot = $_SERVER['DOCUMENT_ROOT'];
|
||||
$version = "0.7.2";
|
||||
|
||||
// AUTHENTICATION
|
||||
// Can either be done by oauth, or username & password.
|
||||
// oauth
|
||||
$token = "";
|
||||
// Basic
|
||||
$username = "username";
|
||||
$password = "password";
|
||||
|
||||
// REPOS & SERVER DIRS
|
||||
// Here you identify the repo location and related path on your server
|
||||
// (the last param is to identify which dropdown option to select by default).
|
||||
$repos = array(
|
||||
"mattpass/dirTree",$docRoot."/dirTree","",
|
||||
"mattpass/CodeMirror2",$docRoot."/CodeMirror2","selected"
|
||||
);
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Github plugin coming soon!</title>
|
||||
<title>ICErepo v<?php echo $version;?></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script src="lib/base64.js"></script>
|
||||
<script src="lib/github.js"></script>
|
||||
<script src="ice-repo.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="ice-repo.css">
|
||||
</head>
|
||||
|
||||
<body style="font-family: arial, helvetica, swiss, verdana">
|
||||
<body style="margin: 0; overflow: hidden" onLoad="doRepo(get('repos').value)">
|
||||
|
||||
<div class="blackMask" id="blackMask" style="display: block">
|
||||
<div id="loadingMsgCenter" class="loadingMsgCenter">
|
||||
<div id="loadingMsgContainer" class="loadingMsgContainer">
|
||||
WORKING...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<b>ICErepo - Plugin coming soon!</b>
|
||||
<br><br>
|
||||
<div class="header">
|
||||
<select name="repos" id="repos" onChange="doRepo(this.value)" style="margin: 20px 0 0 20px">
|
||||
<?php
|
||||
for ($i=0;$i<count($repos);$i+=3) {
|
||||
echo '<option id="repo'.($i/3).'" value="'.$repos[$i].'@'.$repos[$i+1].'"';
|
||||
echo $repos[$i+2]=="selected" ? ' selected' : '';
|
||||
echo '>'.$repos[$i]."</option>\n";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
|
||||
<div class="pullGithubSel" onClick="pullContent('selected')">Pull selected from Github</div>
|
||||
<div class="version"><?php echo $version;?></div>
|
||||
<img src="images/ice-repo.gif" alt="ICErepo" class="logo">
|
||||
</div>
|
||||
|
||||
I'm creating a Github plugin right now which will allow you to sync website code with Github repos.
|
||||
<br><br>
|
||||
Full details and dev at:<br>
|
||||
<a href="http://github.com/mattpass/ICErepo">http://github.com/mattpass/ICErepo</a>
|
||||
<br><br>
|
||||
<b>Expected launch date:</b><br>
|
||||
Wed 22nd Aug
|
||||
<form name="showRepo" action="contents.php" target="repo" method="POST">
|
||||
<input type="hidden" name="token" value="<?php echo $token;?>">
|
||||
<input type="hidden" name="username" value="<?php echo $username;?>">
|
||||
<input type="hidden" name="password" value="<?php echo $password;?>">
|
||||
<input type="hidden" name="repo" value="">
|
||||
</form>
|
||||
|
||||
<iframe id="repo" class="repoFrame" frameborder="0"></iframe>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
5
plugins/ice-repo/lib/base64.js
Normal file
@@ -0,0 +1,5 @@
|
||||
// This code was written by Tyler Akins and has been placed in the
|
||||
// public domain. It would be nice if you left this header intact.
|
||||
// Base64 code from Tyler Akins -- http://rumkin.com
|
||||
|
||||
var Base64=function(){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",t={encode:function(t){var n="",r,i,s,o,u,a,f,l=0;do r=t.charCodeAt(l++),i=t.charCodeAt(l++),s=t.charCodeAt(l++),o=r>>2,u=(r&3)<<4|i>>4,a=(i&15)<<2|s>>6,f=s&63,isNaN(i)?a=f=64:isNaN(s)&&(f=64),n=n+e.charAt(o)+e.charAt(u)+e.charAt(a)+e.charAt(f);while(l<t.length);return n},decode:function(t){var n="",r,i,s,o,u,a,f,l=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(l++)),u=e.indexOf(t.charAt(l++)),a=e.indexOf(t.charAt(l++)),f=e.indexOf(t.charAt(l++)),r=o<<2|u>>4,i=(u&15)<<4|a>>2,s=(a&3)<<6|f,n+=String.fromCharCode(r),a!=64&&(n+=String.fromCharCode(i)),f!=64&&(n+=String.fromCharCode(s));while(l<t.length);return n}};return t}();window.Base64=Base64
|
||||
31
plugins/ice-repo/lib/difflib.js
Normal file
11
plugins/ice-repo/lib/github.js
Normal file
@@ -0,0 +1,11 @@
|
||||
// This file contains the HTTP Req Abs, Repo API and getRepo
|
||||
// portions of Top Level API from github.com/michael/github.js
|
||||
|
||||
// ORIGINAL LIB:
|
||||
// Github.js 0.7.0
|
||||
// (c) 2012 Michael Aufreiter, Development Seed
|
||||
// Github.js is freely distributable under the MIT license.
|
||||
// For all details and documentation:
|
||||
// http://substance.io/michael/github
|
||||
|
||||
(function(){var e,t="https://api.github.com";e=window.Github=function(n){function r(e,r,i,s,o){function u(){var e=t+r;return e+(/\?/.test(e)?"&":"?")+(new Date).getTime()}var a=new XMLHttpRequest;o||(a.dataType="json"),a.open(e,u()),a.onreadystatechange=function(){this.readyState==4&&(this.status>=200&&this.status<300||this.status===304?s(null,o?this.responseText:this.responseText?JSON.parse(this.responseText):!0):s({request:this,error:this.status}))},a.setRequestHeader("Accept","application/vnd.github.raw"),a.setRequestHeader("Content-Type","application/json;charset=UTF-8"),(n.auth=="oauth"&&n.token||n.auth=="basic"&&n.username&&n.password)&&a.setRequestHeader("Authorization",n.auth=="oauth"?"token "+n.token:"Basic "+Base64.encode(n.username+":"+n.password)),i?a.send(JSON.stringify(i)):a.send()}e.Repository=function(e){function u(e,t){if(e===o.branch&&o.sha)return t(null,o.sha);i.getRef("heads/"+e,function(n,r){o.branch=e,o.sha=r,t(n,r)})}var t=e.name,n=e.user,i=this,s="/repos/"+n+"/"+t,o={branch:null,sha:null};this.getRef=function(e,t){r("GET",s+"/git/refs/"+e,null,function(e,n){if(e)return t(e);t(null,n.object.sha)})},this.createRef=function(e,t){r("POST",s+"/git/refs",e,t)},this.deleteRef=function(t,n){r("DELETE",s+"/git/refs/"+t,e,n)},this.listBranches=function(e){r("GET",s+"/git/refs/heads",null,function(t,n){if(t)return e(t);e(null,_.map(n,function(e){return _.last(e.ref.split("/"))}))})},this.getBlob=function(e,t){r("GET",s+"/git/blobs/"+e,null,t,"raw")},this.getSha=function(e,t,n){if(t==="")return i.getRef("heads/"+e,n);i.getTree(e+"?recursive=true",function(e,r){var i=_.select(r,function(e){return e.path===t})[0];n(null,i?i.sha:null)})},this.getTree=function(e,t){r("GET",s+"/git/trees/"+e,null,function(e,n){if(e)return t(e);t(null,n.tree)})},this.postBlob=function(e,t){typeof e=="string"&&(e={content:e,encoding:"utf-8"}),r("POST",s+"/git/blobs",e,function(e,n){if(e)return t(e);t(null,n.sha)})},this.updateTree=function(e,t,n,i){var o={base_tree:e,tree:[{path:t,mode:"100644",type:"blob",sha:n}]};r("POST",s+"/git/trees",o,function(e,t){if(e)return i(e);i(null,t.sha)})},this.postTree=function(e,t){r("POST",s+"/git/trees",{tree:e},function(e,n){if(e)return t(e);t(null,n.sha)})},this.commit=function(t,n,i,u){var a={message:i,author:{name:e.username},parents:[t],tree:n};r("POST",s+"/git/commits",a,function(e,t){o.sha=t.sha;if(e)return u(e);u(null,t.sha)})},this.updateHead=function(e,t,n){r("PATCH",s+"/git/refs/heads/"+e,{sha:t},function(e,t){n(e)})},this.show=function(e){r("GET",s,null,e)},this.contents=function(e,t){r("GET",s+"/contents",{path:e},t)},this.fork=function(e){r("POST",s+"/forks",null,e)},this.createPullRequest=function(e,t){r("POST",s+"/pulls",e,t)},this.read=function(e,t,n){i.getSha(e,t,function(e,t){if(!t)return n("not found",null);i.getBlob(t,function(e,r){n(e,r,t)})})},this.remove=function(e,t,n){u(e,function(r,s){i.getTree(s+"?recursive=true",function(r,o){var u=_.reject(o,function(e){return e.path===t});_.each(u,function(e){e.type==="tree"&&delete e.sha}),i.postTree(u,function(r,o){i.commit(s,o,"Deleted "+t,function(t,r){i.updateHead(e,r,function(e){n(e)})})})})})},this.move=function(e,t,n,r){u(e,function(s,o){i.getTree(o+"?recursive=true",function(s,u){_.each(u,function(e){e.path===t&&(e.path=n),e.type==="tree"&&delete e.sha}),i.postTree(u,function(n,s){i.commit(o,s,"Deleted "+t,function(t,n){i.updateHead(e,n,function(e){r(e)})})})})})},this.write=function(e,t,n,r,s){u(e,function(o,u){if(o)return s(o);i.postBlob(n,function(n,o){if(n)return s(n);i.updateTree(u,t,o,function(t,n){if(t)return s(t);i.commit(u,n,r,function(t,n){if(t)return s(t);i.updateHead(e,n,s)})})})})}},e.Gist=function(e){var t=e.id,n=this,i="/gists/"+t;this.read=function(e){r("GET",i,null,function(t,n){e(t,n)})},this.delete=function(e){r("DELETE",i,null,function(t,n){e(t,n)})},this.fork=function(e){r("POST",i+"/fork",null,function(t,n){e(t,n)})},this.update=function(e,t){r("PATCH",i,e,function(e,n){t(e,n)})}},this.getRepo=function(t,n){return new e.Repository({user:t,name:n})}}}).call(this)
|
||||
12
plugins/ice-repo/lib/underscore-min.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
// This file contains the select, reject, forEach and has functions
|
||||
// from underscore.js, then minified to make it extra tiny
|
||||
|
||||
// Underscore.js 1.3.3
|
||||
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
|
||||
// Underscore may be freely distributed under the MIT license.
|
||||
// Portions of Underscore are inspired or borrowed from Prototype,
|
||||
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
||||
// For all details and documentation:
|
||||
// http://documentcloud.github.com/underscore
|
||||
|
||||
(function(){var e=this,t=Array.prototype,n=Object.prototype,r=t.forEach,i=t.filter,s=n.hasOwnProperty,o={};_=function(obj) {return new wrapper(obj);};_.filter=_.select=function(e,t,n){var r=[];return e==null?r:i&&e.filter===i?e.filter(t,n):(u(e,function(e,i,s){t.call(n,e,i,s)&&(r[r.length]=e)}),r)},_.reject=function(e,t,n){var r=[];return e==null?r:(u(e,function(e,i,s){t.call(n,e,i,s)||(r[r.length]=e)}),r)};var u=_.each=_.forEach=function(e,t,n){if(e==null)return;if(r&&e.forEach===r)e.forEach(t,n);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(i in e&&t.call(n,e[i],i,e)===o)return}else for(var u in e)if(_.has(e,u)&&t.call(n,e[u],u,e)===o)return};_.has=function(e,t){return s.call(e,t)}}).call(this)
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
// -----------------------------------------------
|
||||
// Zip-It! for ICEcoder v0.9.4 by Matt Pass
|
||||
// Zip-It! for ICEcoder v0.9.5 by Matt Pass
|
||||
// Will backup requested files/folders in ICEcoder
|
||||
// and remove old backups older than $keepLastDays
|
||||
// -----------------------------------------------
|
||||
@@ -13,12 +13,12 @@ include("../../lib/settings.php");
|
||||
</head>
|
||||
<body>
|
||||
<?
|
||||
$zipItSaveLocation = '../../backups/';
|
||||
if ($_GET['zip']=="|") {$zipItFileName = "root";} else {$zipItFileName = str_replace("|","_",strClean($_GET['zip']));};
|
||||
$zipItFileName .= '-'.time().'.zip';
|
||||
$saveLocation = '../../backups/';
|
||||
$_GET['zip']=="|" ? $fileName = "root" : $fileName = str_replace("|","_",strClean($_GET['zip']));
|
||||
$fileName .= '-'.time().'.zip';
|
||||
$keepLastDays = 7;
|
||||
|
||||
if (!is_dir($zipItSaveLocation)) {mkdir($zipItSaveLocation, 0777);}
|
||||
if (!is_dir($saveLocation)) {mkdir($saveLocation, 0777);}
|
||||
Class zipIt {
|
||||
public function zipFilesUp($zipDir,$zipFile,$keepLastDays,$docRoot) {
|
||||
$zipName = $zipDir.$zipFile;
|
||||
@@ -77,14 +77,14 @@ Class zipIt {
|
||||
}
|
||||
}
|
||||
if($_SESSION['userLevel']==10) {
|
||||
$zipItDoZip = new zipIt();
|
||||
$doZip = new zipIt();
|
||||
echo '<script>top.ICEcoder.serverMessage("<b>Zipping Files</b>");</script>';
|
||||
$zipItAddToZip = $zipItDoZip->zipFilesUp($zipItSaveLocation,$zipItFileName,$keepLastDays,$docRoot);
|
||||
if (!$zipItAddToZip) {
|
||||
echo '<script>top.ICEcoder.message("Could not zip files up!");</script>';
|
||||
} else {
|
||||
echo '<script>setTimeout(function(){top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);},500);</script>';
|
||||
}
|
||||
$addToZip = $doZip->zipFilesUp($saveLocation,$fileName,$keepLastDays,$docRoot);
|
||||
echo '<script>';
|
||||
echo !$addToZip
|
||||
? 'top.ICEcoder.message("Could not zip files up!");'
|
||||
: 'setTimeout(function(){top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);},500);';
|
||||
echo '</script>';
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
|
||||