Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae864faa84 | ||
|
|
bfea966a14 | ||
|
|
58e7c5ec42 | ||
|
|
080aaea4f7 | ||
|
|
eb634555df | ||
|
|
d42ea6f54b | ||
|
|
3c4a0eba6d | ||
|
|
a7f3205edb | ||
|
|
71875e8f5b | ||
|
|
bccc613de0 | ||
|
|
accf9b0936 | ||
|
|
aa5ee237c9 | ||
|
|
1024c3ff50 | ||
|
|
1c915d81da | ||
|
|
31aceb7226 | ||
|
|
8f06223c07 | ||
|
|
73047549a6 | ||
|
|
ade86eda6b | ||
|
|
03c0842ba2 | ||
|
|
5dcfe80e71 | ||
|
|
3e0f41b585 | ||
|
|
887c7c1873 | ||
|
|
67ab6c8f9c | ||
|
|
af0e81e690 | ||
|
|
e54d735614 | ||
|
|
d298de35cf | ||
|
|
c55c154856 | ||
|
|
4a36e1ec64 | ||
|
|
53d712b0ba | ||
|
|
801597f91f | ||
|
|
af0de2020e | ||
|
|
1a5540de98 | ||
|
|
bac9dd697c |
@@ -1,4 +1,4 @@
|
||||
Copyright: © 2013 Matt Pass
|
||||
Copyright: © 2014 Matt Pass
|
||||
Website: mattpass.com
|
||||
Email: matt@mattpass.com
|
||||
Twitter: @mattpass
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
ICEcoder is a web IDE / browser based code editor, which allows you to develop websites directly within the web browser. It uses the brilliant CodeMirror for code highlighting & editing, with a slick IDE wrapped around it to make the whole thing work.
|
||||
|
||||
<img src="http://icecoder.net/images/icecoder-v3-4-browser-code-editor.png" alt="ICEcoder web IDE">
|
||||
<img src="http://icecoder.net/images/icecoder-v3-5-browser-code-editor.png" alt="ICEcoder web IDE">
|
||||
|
||||
###Requirements
|
||||
You can run ICEcoder either online or locally, on Linux, Windows or Mac based platforms. The only requirement is to have PHP 5 available (5.3 recommended). You can have this either as a vanilla installation or via a program such as WAMP or XAMPP (for Windows) or MAMP (for Mac).
|
||||
@@ -19,7 +19,7 @@ $ git clone git://github.com/mattpass/ICEcoder.git
|
||||
####Step 2: Place in your document root (online or local)
|
||||
```
|
||||
Put in a new sub-dir URL such as yourdomain.com/_coder or localhost/_coder
|
||||
Set write permissions (757 or 775 depending on your system) on the 'backups', 'lib', 'test' and 'tmp' folders
|
||||
Set write permissions (757 or 775 depending on your system) on the 'backups', 'lib', 'plugins', 'test' and 'tmp' folders
|
||||
(Note: A small number of hosts give internal server error here, if you get this, try 755 instead)
|
||||
```
|
||||
|
||||
|
||||
13
index.php
@@ -78,7 +78,7 @@ window.onbeforeunload = function() {
|
||||
echo "'".$ICEcoder["tagWrapperCommand"]."'";
|
||||
echo ';top.ICEcoder.autoComplete = ';
|
||||
echo "'".$ICEcoder["autoComplete"]."'";
|
||||
?>;ICEcoder.init()<?php echo $updateMsg.$onLoadExtras;?>;top.ICEcoder.filesFrame.contentWindow.frames['processControl'].location.href = 'processes/on-load.php';" onResize="ICEcoder.setLayout()" onKeyDown="return ICEcoder.interceptKeys('coder',event);" onKeyUp="parent.ICEcoder.resetKeys(event);">
|
||||
?>;ICEcoder.init()<?php echo $updateMsg.$onLoadExtras;?>;top.ICEcoder.content.style.visibility='visible';top.ICEcoder.filesFrame.contentWindow.frames['processControl'].location.href = 'processes/on-load.php';" onResize="ICEcoder.setLayout()" onKeyDown="return ICEcoder.interceptKeys('coder',event);" onKeyUp="parent.ICEcoder.resetKeys(event);">
|
||||
|
||||
<div id="blackMask" class="blackMask" onClick="if (!ICEcoder.overPopup) {ICEcoder.showHide('hide',this)}" onContextMenu="return false">
|
||||
<div class="popupVCenter">
|
||||
@@ -95,12 +95,13 @@ window.onbeforeunload = function() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="plugins" class="plugins" onMouseOver="top.ICEcoder.showHidePlugins('show')" onMouseOut="top.ICEcoder.showHidePlugins('hide')" onClick="top.ICEcoder.showHidePlugins('hide')">
|
||||
<div id="plugins" class="plugins" style="<?php echo $ICEcoder["pluginPanelAligned"];?>: 0" onMouseOver="top.ICEcoder.showHidePlugins('show')" onMouseOut="top.ICEcoder.showHidePlugins('hide')" onClick="top.ICEcoder.showHidePlugins('hide')">
|
||||
<div style="padding: 15px">
|
||||
<a nohref onClick="top.ICEcoder.showColorPicker(top.document.getElementById('color') ? top.document.getElementById('color').value : '#123456')" title="Farbtastic
|
||||
Color picker"><img src="images/color-picker.png" style="cursor: pointer" alt="Color Picker"></a><br><br>
|
||||
<a nohref onClick="top.ICEcoder.openTerminal()" title="Terminal"><img src="images/terminal.png" style="cursor: pointer" alt="Terminal"></a><br><br>
|
||||
<?php echo $pluginsDisplay; ?>
|
||||
<div id="pluginsOptional"><?php echo $pluginsDisplay; ?></div>
|
||||
<a nohref onclick="top.ICEcoder.pluginsManager()" title="Plugins Manager" style="color: #fff; cursor: pointer">+ / -</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -130,7 +131,11 @@ Color picker"><img src="images/color-picker.png" style="cursor: pointer" alt="Co
|
||||
<a nohref onClick="window.open(iceRoot + top.ICEcoder.rightClickedFile.replace(/\|/g,'/'))" onMouseOver="ICEcoder.showFileMenu()" style="cursor: pointer">View Webpage</a>
|
||||
</span>
|
||||
<div onMouseOver="ICEcoder.showFileMenu()" style="padding: 2px 0"><hr></div>
|
||||
<a href="javascript:top.ICEcoder.zipIt(top.ICEcoder.rightClickedFile)" onMouseOver="ICEcoder.showFileMenu()">Zip It!</a>
|
||||
<?php
|
||||
if (file_exists(dirname(__FILE__)."/plugins/zip-it/index.php")) {
|
||||
echo '<a href="javascript:top.ICEcoder.zipIt(top.ICEcoder.rightClickedFile)" onMouseOver="ICEcoder.showFileMenu()">Zip It!</a>'.PHP_EOL;
|
||||
};
|
||||
?>
|
||||
<a href="javascript:top.ICEcoder.downloadFile(top.ICEcoder.rightClickedFile)" onMouseOver="ICEcoder.showFileMenu()">Download</a>
|
||||
<div onMouseOver="ICEcoder.showFileMenu()" style="padding: 2px 0"><hr></div>
|
||||
<a href="javascript:top.ICEcoder.propertiesScreen(top.ICEcoder.rightClickedFile)" onMouseOver="ICEcoder.showFileMenu()">Properties</a>
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
<?php
|
||||
// ICEcoder system settings
|
||||
$ICEcoderSettings = array(
|
||||
"versionNo" => "3.4",
|
||||
"versionNo" => "3.5",
|
||||
"codeMirrorDir" => "CodeMirror-3.20",
|
||||
"docRoot" => $_SERVER['DOCUMENT_ROOT'],
|
||||
"demoMode" => false,
|
||||
"devMode" => false,
|
||||
"loginRequired" => true,
|
||||
"multiUser" => false,
|
||||
"lineEnding" => "\n"
|
||||
);
|
||||
|
||||
@@ -1,31 +1,26 @@
|
||||
<?php
|
||||
$ICEcoderUserSettings = array(
|
||||
"versionNo" => "3.4",
|
||||
"versionNo" => "3.5",
|
||||
"root" => "",
|
||||
"checkUpdates" => true,
|
||||
"openLastFiles" => true,
|
||||
"findFilesExclude" => array("_coder","ICEcoder",".doc",".gif",".jpg",".jpeg",".pdf",".png",".swf",".xml",".zip"),
|
||||
"findFilesExclude" => array(".doc",".gif",".jpg",".jpeg",".pdf",".png",".swf",".xml",".zip"),
|
||||
"codeAssist" => true,
|
||||
"visibleTabs" => false,
|
||||
"lockedNav" => true,
|
||||
"tagWrapperCommand" => "ctrl+alt",
|
||||
"autoComplete" => "ctrl+space",
|
||||
"password" => "",
|
||||
"bannedFiles" => array("_coder","ICEcoder"),
|
||||
"bannedFiles" => array(),
|
||||
"bannedPaths" => array("/var/www/.git","/var/www/sites/all/modules","/var/www/sites/default/files"),
|
||||
"allowedIPs" => array("*"),
|
||||
"plugins" => array(
|
||||
array("Adminer MySQL database manager","plugins/adminer/icon.png","margin-left: 2px","plugins/adminer/adminer-3.7.1-mysql-en.php","_blank",""),
|
||||
array("Emmet Snippet type booster","plugins/emmet/icon.png","","http://docs.emmet.io","_blank",""),
|
||||
array("CSS Beautify Tidy up your CSS","plugins/cssbeautify/icon.png","","plugins/cssbeautify","fileControl:<b>Tidying your CSS</b>",""),
|
||||
array("ICErepo Github repo manager","plugins/ice-repo/icon.png","","plugins/ice-repo","_blank",""),
|
||||
array("Zip It! File/folder zip utility","plugins/zip-it/icon.png","margin-left: 3px","plugins/zip-it/?zip=|&exclude=*.doc*.gif*.jpg*.jpeg*.pdf*.png*.swf*.xml*.zip","fileControl:<b>Zipping Files</b>","30")
|
||||
),
|
||||
"theme" => "default",
|
||||
"fontSize" => "13px",
|
||||
"lineWrapping" => true,
|
||||
"indentWithTabs" => true,
|
||||
"indentSize" => 4,
|
||||
"pluginPanelAligned" => "left",
|
||||
"plugins" => array(),
|
||||
"previousFiles" => "",
|
||||
"last10Files" => ""
|
||||
);
|
||||
|
||||
@@ -23,6 +23,9 @@ foreach($finalArray as $entry) {
|
||||
for ($i=0;$i<count($_SESSION['bannedFiles']);$i++) {
|
||||
if(strpos($entry,$_SESSION['bannedFiles'][$i])!==false) {$canAdd = false;}
|
||||
}
|
||||
if ("/".$entry == $ICEcoderDir) {
|
||||
$canAdd = false;
|
||||
}
|
||||
if ($entry != "." && $entry != ".." && $canAdd) {
|
||||
is_dir($docRoot.$iceRoot.$location."/".$entry)
|
||||
? array_push($dirArray,$location."/".$entry)
|
||||
|
||||
@@ -50,7 +50,7 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
100% {transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg)}
|
||||
}
|
||||
|
||||
.plugins {position: absolute; display: inline-block; width: 3px; height: 100%; top: 0; left: 0; background: transparent; overflow: hidden; z-index: 3;
|
||||
.plugins {position: absolute; display: inline-block; width: 3px; height: 100%; top: 0; background: transparent; overflow: hidden; z-index: 3;
|
||||
transition: all 0.07s ease-out;
|
||||
}
|
||||
|
||||
|
||||
@@ -1769,8 +1769,11 @@ var ICEcoder = {
|
||||
},
|
||||
|
||||
// Show the ICEcoder manual, loaded remotely
|
||||
showManual: function(version) {
|
||||
top.get('mediaContainer').innerHTML = '<iframe src="http://icecoder.net/manual?version='+version+'" class="whiteGlow" style="width: 500px; height: 500px"></iframe>';
|
||||
showManual: function(version,section) {
|
||||
var sectionExtra;
|
||||
|
||||
sectionExtra = section ? "#"+section : "";
|
||||
top.get('mediaContainer').innerHTML = '<iframe src="http://icecoder.net/manual?version='+version+sectionExtra+'" class="whiteGlow" style="width: 500px; height: 500px"></iframe>';
|
||||
top.ICEcoder.showHide('show',top.get('blackMask'));
|
||||
},
|
||||
|
||||
@@ -1780,8 +1783,14 @@ var ICEcoder = {
|
||||
top.ICEcoder.showHide('show',top.get('blackMask'));
|
||||
},
|
||||
|
||||
// Show the plugins manager
|
||||
pluginsManager: function() {
|
||||
top.get('mediaContainer').innerHTML = '<iframe src="lib/plugins-manager.php" class="whiteGlow" style="width: 800px; height: 450px"></iframe>';
|
||||
top.ICEcoder.showHide('show',top.get('blackMask'));
|
||||
},
|
||||
|
||||
// Update the settings used when we make a change to them
|
||||
useNewSettings: function(themeURL,codeAssist,lockedNav,tagWrapperCommand,autoComplete,visibleTabs,fontSize,lineWrapping,indentWithTabs,indentSize,refreshFM) {
|
||||
useNewSettings: function(themeURL,codeAssist,lockedNav,tagWrapperCommand,autoComplete,visibleTabs,fontSize,lineWrapping,indentWithTabs,indentSize,pluginPanelAligned,refreshFM) {
|
||||
var styleNode, strCSS, cMCSS, activeLineBG;
|
||||
|
||||
// Add new stylesheet for selected theme
|
||||
@@ -1833,6 +1842,9 @@ var ICEcoder = {
|
||||
top.ICEcoder.autoComplete = autoComplete;
|
||||
}
|
||||
|
||||
top.get('plugins').style.left = pluginPanelAligned == "left" ? "0" : "auto";
|
||||
top.get('plugins').style.right = pluginPanelAligned == "right" ? "0" : "auto";
|
||||
|
||||
// Finally, refresh the file manager if we need to
|
||||
if (refreshFM) {top.ICEcoder.refreshFileManager()};
|
||||
},
|
||||
|
||||
35
lib/ice-coder.min.js
vendored
@@ -39,11 +39,11 @@ b+"?")&&(top.ICEcoder.serverQueue("add","lib/file-control.php?action=delete&file
|
||||
a[0].lastIndexOf("|"));top.ICEcoder.pasteFiles(a);"undefined"!=typeof b&&(top.ICEcoder.copiedFiles=b)},uploadFilesSelect:function(a){top.get("uploadDir").value=a;top.get("fileInput").click()},uploadFilesSubmit:function(a){""!=top.get("fileInput").value&&(top.ICEcoder.showHide("show",top.get("loadingMask")),top.get("uploadFilesForm").submit(),event.preventDefault())},showMenu:function(a){var b,c;0!=top.ICEcoder.selectedFiles.length&&-1!=top.ICEcoder.selectedFiles.indexOf(top.ICEcoder.rightClickedFile.replace(/\//g,
|
||||
"|"))||top.ICEcoder.selectFileFolder(a);a=129;c=window.innerHeight;"undefined"!=typeof top.ICEcoder.thisFileFolderLink&&""!=top.ICEcoder.thisFileFolderLink&&(b=-1<top.ICEcoder.selectedFiles[0].indexOf(".")?"file":"folder",top.get("folderMenuItems").style.display="folder"==b&&1==top.ICEcoder.selectedFiles.length?"block":"none","folder"==b&&1==top.ICEcoder.selectedFiles.length&&(a+=67,"block"==top.get("fmMenuPasteOption").style.display&&(a+=19)),top.get("singleFileMenuItems").style.display=1<top.ICEcoder.selectedFiles.length?
|
||||
"none":"block",1==top.ICEcoder.selectedFiles.length&&(a+=43),top.get("fileMenu").style.display="inline-block",setTimeout(function(){top.get("fileMenu").style.opacity="1"},4),top.get("fileMenu").style.left=top.ICEcoder.mouseX+20+"px",b=top.ICEcoder.mouseY-top.ICEcoder.filesFrame.contentWindow.document.body.scrollTop-10,b+a>c&&(b-=b+a-c),top.get("fileMenu").style.top=b+"px");return!1},showFileMenu:function(){top.get("fileMenu").style.display="inline-block";setTimeout(function(){top.get("fileMenu").style.opacity=
|
||||
"1"},4)},hideFileMenu:function(){top.get("fileMenu").style.display="none";top.get("fileMenu").style.opacity="0"},updateFileManagerList:function(a,b,c,d,e,f){var g,m,h,k,p,n,l,q;if("add"==a&&!top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c)){g=-1<c.indexOf(".")?"file":"folder";m="file"==g?"pft-file ext-"+c.substr(c.indexOf(".")+1):"pft-directory";d="file"==g?664:705;b||(b="/");b=b.replace(top.iceRoot,"");h=top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\//g,
|
||||
"|"));k=h.parentNode.parentNode.nextSibling;p=document.createTextNode("\n");n='<a nohref title="'+b.replace(/\/$/,"")+"/"+c+'" onMouseOver="top.ICEcoder.overFileFolder(\''+g+"','"+b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c+"')\" onMouseOut=\"top.ICEcoder.overFileFolder('"+g+'\',\'\')" style="position: relative; left:-22px"> <span id="'+b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c+'">'+c+'</span> <span style="color: #888; font-size: 8px" id="'+b.replace(/\/$/,
|
||||
"").replace(/\//g,"|")+"|"+c+'_perms">'+d+"</span></a>";if(3>k.childNodes.length)l=document.createElement("ul"),k=h.parentNode.parentNode,k.parentNode.insertBefore(l,k.nextSibling),l=document.createElement("li"),l.className=m,l.draggable=!0,l.ondrag=function(a){top.ICEcoder.draggingWithKeyTest(a);top.ICEcoder.getcMInstance()&&top.ICEcoder.getcMInstance().focus()},l.ondragend=function(){top.ICEcoder.dropFile(this)},l.innerHTML=n,k.nextSibling.appendChild(l),k.nextSibling.appendChild(p);else for(h=
|
||||
0;h<k.childNodes.length;h++)if(k.childNodes[h].className&&(l=0<k.childNodes[h].className.indexOf("directory")?"folder":"file",q=k.childNodes[h].getElementsByTagName("span")[0].innerHTML,l==g&&q>c||"folder"==g&&"file"==l||h==k.childNodes.length-1)){l=document.createElement("li");l.className=m;l.draggable=!0;l.ondrag=function(a){top.ICEcoder.draggingWithKeyTest(a);top.ICEcoder.getcMInstance()&&top.ICEcoder.getcMInstance().focus()};l.ondragend=function(){top.ICEcoder.dropFile(this)};l.innerHTML=n;h==
|
||||
k.childNodes.length-1?(k.appendChild(l),k.appendChild(p)):(k.insertBefore(l,k.childNodes[h]),k.insertBefore(p,k.childNodes[h+1]));break}"file"!=g||f||(top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1]=b+c)}"rename"==a&&(f=e.replace(/\//g,"|"),h=top.get("filesFrame").contentWindow.document.getElementById(f),h.innerHTML=c,h.id=b.replace(/\//g,"|")+"|"+c,h.parentNode.title=h.id.replace(/\|/g,"/"),targetElemPerms=top.get("filesFrame").contentWindow.document.getElementById(f+"_perms"),targetElemPerms.id=
|
||||
"1"},4)},hideFileMenu:function(){top.get("fileMenu").style.display="none";top.get("fileMenu").style.opacity="0"},updateFileManagerList:function(a,b,c,d,e,f){var g,m,h,l,n,p,k,q;if("add"==a&&!top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c)){g=-1<c.indexOf(".")?"file":"folder";m="file"==g?"pft-file ext-"+c.substr(c.indexOf(".")+1):"pft-directory";d="file"==g?664:705;b||(b="/");b=b.replace(top.iceRoot,"");h=top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\//g,
|
||||
"|"));l=h.parentNode.parentNode.nextSibling;n=document.createTextNode("\n");p='<a nohref title="'+b.replace(/\/$/,"")+"/"+c+'" onMouseOver="top.ICEcoder.overFileFolder(\''+g+"','"+b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c+"')\" onMouseOut=\"top.ICEcoder.overFileFolder('"+g+'\',\'\')" style="position: relative; left:-22px"> <span id="'+b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c+'">'+c+'</span> <span style="color: #888; font-size: 8px" id="'+b.replace(/\/$/,
|
||||
"").replace(/\//g,"|")+"|"+c+'_perms">'+d+"</span></a>";if(3>l.childNodes.length)k=document.createElement("ul"),l=h.parentNode.parentNode,l.parentNode.insertBefore(k,l.nextSibling),k=document.createElement("li"),k.className=m,k.draggable=!0,k.ondrag=function(a){top.ICEcoder.draggingWithKeyTest(a);top.ICEcoder.getcMInstance()&&top.ICEcoder.getcMInstance().focus()},k.ondragend=function(){top.ICEcoder.dropFile(this)},k.innerHTML=p,l.nextSibling.appendChild(k),l.nextSibling.appendChild(n);else for(h=
|
||||
0;h<l.childNodes.length;h++)if(l.childNodes[h].className&&(k=0<l.childNodes[h].className.indexOf("directory")?"folder":"file",q=l.childNodes[h].getElementsByTagName("span")[0].innerHTML,k==g&&q>c||"folder"==g&&"file"==k||h==l.childNodes.length-1)){k=document.createElement("li");k.className=m;k.draggable=!0;k.ondrag=function(a){top.ICEcoder.draggingWithKeyTest(a);top.ICEcoder.getcMInstance()&&top.ICEcoder.getcMInstance().focus()};k.ondragend=function(){top.ICEcoder.dropFile(this)};k.innerHTML=p;h==
|
||||
l.childNodes.length-1?(l.appendChild(k),l.appendChild(n)):(l.insertBefore(k,l.childNodes[h]),l.insertBefore(n,l.childNodes[h+1]));break}"file"!=g||f||(top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1]=b+c)}"rename"==a&&(f=e.replace(/\//g,"|"),h=top.get("filesFrame").contentWindow.document.getElementById(f),h.innerHTML=c,h.id=b.replace(/\//g,"|")+"|"+c,h.parentNode.title=h.id.replace(/\|/g,"/"),targetElemPerms=top.get("filesFrame").contentWindow.document.getElementById(f+"_perms"),targetElemPerms.id=
|
||||
b.replace(/\//g,"|")+"|"+c+"_perms");"move"==a&&(top.ICEcoder.updateFileManagerList("add",b,c),top.ICEcoder.updateFileManagerList("delete",e.substr(0,e.lastIndexOf("/")),c));"chmod"==a&&(f=top.ICEcoder.rightClickedFile.replace(/\|/g,"/"),h=top.get("filesFrame").contentWindow.document.getElementById(f.replace(/\//g,"|")+"_perms"),h.innerHTML=d);"delete"==a&&(h=top.get("filesFrame").contentWindow.document.getElementById(b.replace(/\/$/,"").replace(/\//g,"|")+"|"+c).parentNode.parentNode,top.ICEcoder.openCloseDir(h.childNodes[0],
|
||||
!1),h.parentNode.removeChild(h))},fMIcon:function(a){"save"==a&&0<ICEcoder.openFiles.length&&top.ICEcoder.saveFile();1==ICEcoder.selectedFiles.length&&(top.ICEcoder.rightClickedFile=top.ICEcoder.thisFileFolderLink=top.ICEcoder.selectedFiles[0].replace("|","/"),"open"==a&&-1<ICEcoder.selectedFiles[0].indexOf(".")?(top.ICEcoder.thisFileFolderType="file",top.ICEcoder.openFile()):"newFile"==a?top.ICEcoder.newFile():"newFolder"==a?top.ICEcoder.newFolder():"rename"==a&&top.ICEcoder.renameFile(top.ICEcoder.rightClickedFile));
|
||||
"delete"==a&&0<ICEcoder.selectedFiles.length&&top.ICEcoder.deleteFiles()},refreshFileManager:function(){top.ICEcoder.showHide("show",top.get("loadingMask"));top.ICEcoder.filesFrame.src="files.php";top.ICEcoder.filesFrame.style.opacity="0";top.ICEcoder.filesFrame.onload=function(){top.ICEcoder.filesFrame.style.opacity="1";top.ICEcoder.showHide("hide",top.get("loadingMask"))}},draggingWithKeyTest:function(a){var b;b=a.keyCode?a.keyCode:a.which?a.which:a.charCode;if(224==b||91==b||93==b)top.ICEcoder.cmdKey=
|
||||
@@ -69,9 +69,9 @@ top.ICEcoder.tabDragMove());if(top.ICEcoder.ready&&(top.ICEcoder.mouseDown||(top
|
||||
a}},serverMessage:function(a){var b;b=top.get("serverMessage");a?(b.innerHTML=a,b.style.left="0"):setTimeout(function(){b.style.left="2000px"},200);b.style.opacity=a?1:0},cssColorPreview:function(){var a,b,c,d;if(a=ICEcoder.getcMInstance()){b=a.getLine(a.getCursor().line);for(c=/(#[\da-f]{3}(?:[\da-f]{3})?\b|\b(?:rgb|hsl)a?\([\s\d%,.-]+\)|\b[a-z]+\b)/gi;(d=c.exec(b))&&a.getCursor().ch>d.index+d[0].length;);(b=top.get("content").contentWindow.document.getElementById("cssColor"))&&b.parentNode.removeChild(b);
|
||||
top.ICEcoder.codeAssist&&"CSS"==top.ICEcoder.caretLocType&&(b=top.document.createElement("div"),b.id="cssColor",b.style.position="absolute",b.style.display="block",b.style.width=b.style.height="20px",b.style.zIndex="1000",b.style.background=d?d[0]:"",b.style.cursor="pointer",b.onclick=function(){top.ICEcoder.showColorPicker(d[0])},""==b.style.backgroundColor&&(b.style.display="none"),top.get("header").appendChild(b),a.addWidget(a.getCursor(),top.get("cssColor"),!0))}},showColorPicker:function(a){top.get("blackMask").style.visibility=
|
||||
"visible";top.get("mediaContainer").innerHTML='<div id="picker" class="picker"></div><br><br><input type="text" id="color" name="color" value="#000" class="colorValue"><input type="button" onClick="top.ICEcoder.insertColorValue(top.get(\'color\').value)" value="insert >" class="insertColorValue"><br><input type="text" id="colorRGB" name="colorRGB" value="rgb(0,0,0)" class="colorValue"><input type="button" onClick="top.ICEcoder.insertColorValue(top.get(\'colorRGB\').value)" value="insert >" class="insertColorValue">';
|
||||
farbtastic("picker","color");a&&top.get("picker").farbtastic.setColor(a)},drawCanvasImage:function(a){var b,c,d,e,f,g,m,h,k,p,n;b=top.get("canvasPicker").getContext("2d");c=new Image;c.src=a.src;c.onload=function(){top.get("canvasPicker").width=a.width;top.get("canvasPicker").height=a.height;b.drawImage(c,0,0,a.width,a.height)};top.get("canvasPicker").onmousemove=function(a){d=a.pageX-this.offsetLeft;e=a.pageY-this.offsetTop;f=b.getImageData(d,e,1,1).data;g=f[0];m=f[1];h=f[2];k=g+","+m+","+h;p=top.ICEcoder.rgbToHex(g,
|
||||
m,h);top.get("rgbMouseXY").value=k;top.get("hexMouseXY").value="#"+p;top.get("hexMouseXY").style.backgroundColor=top.get("rgbMouseXY").style.backgroundColor="#"+p;n=128>g||128>m||128>h&&200>g&&200>m&&50<h?"#fff":"#000";top.get("hexMouseXY").style.color=top.get("rgbMouseXY").style.color=n};top.get("canvasPicker").onclick=function(){top.get("rgb").value=top.get("rgbMouseXY").value;top.get("hex").value=top.get("hexMouseXY").value;top.get("hex").style.backgroundColor=top.get("rgb").style.backgroundColor=
|
||||
top.get("hex").value;top.get("hex").style.color=top.get("rgb").style.color=n}},rgbToHex:function(a,b,c){return top.ICEcoder.toHex(a)+top.ICEcoder.toHex(b)+top.ICEcoder.toHex(c)},toHex:function(a){a=parseInt(a,10);if(isNaN(a))return"00";a=Math.max(0,Math.min(a,255));return"0123456789abcdef".charAt((a-a%16)/16)+"0123456789abcdef".charAt(a%16)},insertColorValue:function(a){var b,c;b=ICEcoder.getcMInstance();c=b.getTokenAt(b.getCursor());b.replaceRange(a,{line:b.getCursor().line,ch:c.start},{line:b.getCursor().line,
|
||||
farbtastic("picker","color");a&&top.get("picker").farbtastic.setColor(a)},drawCanvasImage:function(a){var b,c,d,e,f,g,m,h,l,n,p;b=top.get("canvasPicker").getContext("2d");c=new Image;c.src=a.src;c.onload=function(){top.get("canvasPicker").width=a.width;top.get("canvasPicker").height=a.height;b.drawImage(c,0,0,a.width,a.height)};top.get("canvasPicker").onmousemove=function(a){d=a.pageX-this.offsetLeft;e=a.pageY-this.offsetTop;f=b.getImageData(d,e,1,1).data;g=f[0];m=f[1];h=f[2];l=g+","+m+","+h;n=top.ICEcoder.rgbToHex(g,
|
||||
m,h);top.get("rgbMouseXY").value=l;top.get("hexMouseXY").value="#"+n;top.get("hexMouseXY").style.backgroundColor=top.get("rgbMouseXY").style.backgroundColor="#"+n;p=128>g||128>m||128>h&&200>g&&200>m&&50<h?"#fff":"#000";top.get("hexMouseXY").style.color=top.get("rgbMouseXY").style.color=p};top.get("canvasPicker").onclick=function(){top.get("rgb").value=top.get("rgbMouseXY").value;top.get("hex").value=top.get("hexMouseXY").value;top.get("hex").style.backgroundColor=top.get("rgb").style.backgroundColor=
|
||||
top.get("hex").value;top.get("hex").style.color=top.get("rgb").style.color=p}},rgbToHex:function(a,b,c){return top.ICEcoder.toHex(a)+top.ICEcoder.toHex(b)+top.ICEcoder.toHex(c)},toHex:function(a){a=parseInt(a,10);if(isNaN(a))return"00";a=Math.max(0,Math.min(a,255));return"0123456789abcdef".charAt((a-a%16)/16)+"0123456789abcdef".charAt(a%16)},insertColorValue:function(a){var b,c;b=ICEcoder.getcMInstance();c=b.getTokenAt(b.getCursor());b.replaceRange(a,{line:b.getCursor().line,ch:c.start},{line:b.getCursor().line,
|
||||
ch:c.end})},fMIconVis:function(a,b){var c;if(c=top.get(a))c.style.opacity=b},isOpen:function(a){a=a.replace(/\|/g,"/").replace(top.docRoot+top.iceRoot,"");a=top.ICEcoder.openFiles.indexOf(a);return-1!=a?a:!1},startPluginIntervals:function(a,b,c,d){top.ICEcoder["plugTimer"+a]=-1<["_parent","_top","_self",""].indexOf(c)?top.ICEcoder["plugTimer"+a]=setInterval("window.location='"+b+"'",6E4*d):0==c.indexOf("fileControl")?top.ICEcoder["plugTimer"+a]=setInterval(function(){top.ICEcoder.serverQueue("add",
|
||||
b);top.ICEcoder.serverMessage(c.split(":")[1])},6E4*d):top.ICEcoder["plugTimer"+a]=setInterval("window.open('"+b+"','"+c+"')",6E4*d);top.ICEcoder.pluginIntervalRefs.push(a)},codeAssistToggle:function(){var a;ICEcoder.getcMInstance();top.ICEcoder.codeAssist=!top.ICEcoder.codeAssist;top.get("codeAssistDisplay").style.backgroundPosition=top.ICEcoder.codeAssist?"0 0":"-16px 0";top.ICEcoder.cssColorPreview();top.ICEcoder.focus();for(i=0;i<top.ICEcoder.cMInstances.length;i++)-1<top.ICEcoder.openFiles[i].indexOf(".js")&&
|
||||
(a=top.ICEcoder.content.contentWindow["cM"+top.ICEcoder.cMInstances[i]],top.ICEcoder.codeAssist?a.setOption("lintWith",top.ICEcoder.content.contentWindow.CodeMirror.javascriptValidator):(a.clearGutter("CodeMirror-lint-markers"),a.setOption("lintWith",!1)))},serverQueue:function(a,b){var c,d,e;c=ICEcoder.getcMInstance();for(e=d=0;e<ICEcoder.serverQueueItems.length;e++)0<ICEcoder.serverQueueItems[e].indexOf("action=save")&&d++;d++;if("add"==a)ICEcoder.serverQueueItems.push(b),0<b.indexOf("action=save")&&
|
||||
@@ -79,15 +79,16 @@ b);top.ICEcoder.serverMessage(c.split(":")[1])},6E4*d):top.ICEcoder["plugTimer"+
|
||||
setTimeout(function(){top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href=ICEcoder.serverQueueItems[0]},1)},cancelAllActions:function(){window.stop();0<ICEcoder.serverQueueItems.length&&ICEcoder.serverQueueItems.splice(1,ICEcoder.serverQueueItems.length);top.ICEcoder.showHide("hide",top.get("loadingMask"));top.ICEcoder.serverMessage('<b style="color: #d00">Cancelled tasks</b>');setTimeout(function(){top.ICEcoder.serverMessage()},2E3)},setPreviousFiles:function(){var a;a=top.ICEcoder.openFiles.join(",").replace(/\//g,
|
||||
"|").replace(/(\|\[NEW\])|(,\|\[NEW\])/g,"").replace(/(^,)|(,$)/g,"");""==a&&(a="CLEAR");top.ICEcoder.serverQueue("add","lib/settings.php?saveFiles="+a)},autoOpenFiles:function(){if(0<top.ICEcoder.previousFiles.length&&top.ICEcoder.ask("Open previous files?\n\n"+top.ICEcoder.previousFiles.length+" files:\n"+top.ICEcoder.previousFiles.join("\n").replace(/\|/g,"/").replace(RegExp(top.docRoot+top.iceRoot,"gi"),"")))for(var a=0;a<top.ICEcoder.previousFiles.length;a++)top.ICEcoder.rightClickedFile=top.ICEcoder.thisFileFolderLink=
|
||||
top.ICEcoder.previousFiles[a].replace("|","/"),top.ICEcoder.thisFileFolderType="file",top.ICEcoder.openFile()},settingsScreen:function(a){a||(top.get("mediaContainer").innerHTML='<iframe src="lib/settings-screen.php" class="whiteGlow" style="width: 970px; height: 610px"></iframe>');top.ICEcoder.showHide(a?"hide":"show",top.get("blackMask"))},helpScreen:function(){top.get("mediaContainer").innerHTML='<iframe src="lib/help.php" class="whiteGlow" style="width: 800px; height: 450px"></iframe>';top.ICEcoder.showHide("show",
|
||||
top.get("blackMask"))},showManual:function(a){top.get("mediaContainer").innerHTML='<iframe src="http://icecoder.net/manual?version='+a+'" class="whiteGlow" style="width: 500px; height: 500px"></iframe>';top.ICEcoder.showHide("show",top.get("blackMask"))},propertiesScreen:function(a){top.get("mediaContainer").innerHTML='<iframe src="lib/properties.php?fileName='+a.replace(/\//g,"|")+'" class="whiteGlow" style="width: 660px; height: 330px"></iframe>';top.ICEcoder.showHide("show",top.get("blackMask"))},
|
||||
useNewSettings:function(a,b,c,d,e,f,g,m,h,k,p){var n;top.ICEcoder.theme=a.slice(a.lastIndexOf("/")+1,a.lastIndexOf("."));"editor"==top.ICEcoder.theme&&(top.ICEcoder.theme="icecoder");n=document.createElement("link");n.setAttribute("rel","stylesheet");n.setAttribute("type","text/css");n.setAttribute("href",a);top.ICEcoder.content.contentWindow.document.getElementsByTagName("head")[0].appendChild(n);a=-1<"3024-day base16-light eclipse elegant neat paraiso-light solarized xq-light".split(" ").indexOf(top.ICEcoder.theme)?
|
||||
"#ccc":"#000";top.ICEcoder.switchTab(top.ICEcoder.selectedTab);b!=top.ICEcoder.codeAssist&&(top.get("codeAssist").checked=b,top.ICEcoder.codeAssistToggle());c!=top.ICEcoder.lockedNav&&top.ICEcoder.lockUnlockNav();c||(ICEcoder.changeFilesW("contract"),top.ICEcoder.hideFileMenu());c=ICEcoder.content.contentWindow.document.styleSheets[4];b=c.rules?"rules":"cssRules";c[b][0].style.fontSize=g;c[b][4].style["border-left-width"]=f?"1px":"0";c[b][4].style["margin-left"]=f?"-1px":"0";c[b][2].style.cssText=
|
||||
"background-color: "+a+" !important";top.ICEcoder.lineWrapping=m;top.ICEcoder.indentWithTabs=h;top.ICEcoder.indentSize=k;for(f=0;f<ICEcoder.cMInstances.length;f++)ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("lineWrapping",top.ICEcoder.lineWrapping),ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("indentWithTabs",top.ICEcoder.indentWithTabs),ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("indentUnit",top.ICEcoder.indentSize),
|
||||
ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("tabSize",top.ICEcoder.indentSize);d!=top.ICEcoder.tagWrapperCommand&&(top.ICEcoder.tagWrapperCommand=d);e!=top.ICEcoder.autoComplete&&(top.ICEcoder.autoComplete=e);p&&top.ICEcoder.refreshFileManager()},updateResultsDisplay:function(a){ICEcoder.findReplace(top.get("find").value,!0,!1);top.get("results").style.display="show"==a?"inline-block":"none"},fullScreenSwitcher:function(){"undefined"!=typeof document.cancelFullScreen?document.fullScreen?
|
||||
document.cancelFullScreen():document.body.requestFullScreen():"undefined"!=typeof document.mozCancelFullScreen?document.mozFullScreen?document.mozCancelFullScreen():document.body.mozRequestFullScreen():"undefined"!=typeof document.webkitCancelFullScreen&&(document.webkitIsFullScreen?document.webkitCancelFullScreen():document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT))},zipIt:function(a){a=a.replace(/\//g,"|");top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href="plugins/zip-it/index.php?zip="+
|
||||
a},downloadFile:function(a){a=a.replace(/\//g,"|");top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href="lib/download.php?file="+a},chmod:function(a,b){a=a.replace(top.iceRoot,"");top.ICEcoder.showHide("hide",top.get("blackMask"));top.ICEcoder.serverQueue("add","lib/file-control.php?action=perms&file="+a+"&perms="+b);top.ICEcoder.serverMessage("<b>chMod "+b+" on </b><br>"+a)},openPreviewWindow:function(){if(0<top.ICEcoder.openFiles.length){var a,b,c;b=top.ICEcoder.openFiles[top.ICEcoder.selectedTab-
|
||||
1];c=b.substr(b.lastIndexOf("/")+1);c=c.substr(c.lastIndexOf(".")+1);a=ICEcoder.getcMInstance();top.ICEcoder.previewWindow=window.open(b,"previewWindow");-1<["md"].indexOf(c)&&(top.ICEcoder.previewWindow.onload=function(){top.ICEcoder.previewWindow.document.documentElement.innerHTML=mmd(a.getValue())})}},openTerminal:function(){top.ICEcoder.demoMode?top.ICEcoder.message("Sorry, you need to be logged in to use the terminal"):window.open("terminal")},logout:function(){window.location+="?logout"},message:function(a){alert(a)},
|
||||
ask:function(a){return confirm(a)},getInput:function(a,b){return prompt(a,b)},dataMessage:function(a){var b;b=top.ICEcoder.content.contentWindow.document.getElementById("dataMessage");b.style.display="block";b.innerHTML=a},update:function(){confirm("Updating is currently an experimental feature. While it should work fine, please note there may be issues here, plus the following isn't yet part of this:\n\n- Settings not ported to new version\n- Plugins not ported to new version\n- Any mods you've made not ported to new version\n\nIf you have write access on the whole of ICEcoder (ie, running locally) it should work fine. If tho you need to recover ICEcoder for any reason, you'll find this current version in its tmp dir.\n\nClick OK to proceed with an auto-update or cancel to visit the ICEcoder site so you can grab the zip and update manually")?
|
||||
top.get("blackMask"))},showManual:function(a,b){var c;c=b?"#"+b:"";top.get("mediaContainer").innerHTML='<iframe src="http://icecoder.net/manual?version='+a+c+'" class="whiteGlow" style="width: 500px; height: 500px"></iframe>';top.ICEcoder.showHide("show",top.get("blackMask"))},propertiesScreen:function(a){top.get("mediaContainer").innerHTML='<iframe src="lib/properties.php?fileName='+a.replace(/\//g,"|")+'" class="whiteGlow" style="width: 660px; height: 330px"></iframe>';top.ICEcoder.showHide("show",
|
||||
top.get("blackMask"))},pluginsManager:function(){top.get("mediaContainer").innerHTML='<iframe src="lib/plugins-manager.php" class="whiteGlow" style="width: 800px; height: 450px"></iframe>';top.ICEcoder.showHide("show",top.get("blackMask"))},useNewSettings:function(a,b,c,d,e,f,g,m,h,l,n,p){var k;top.ICEcoder.theme=a.slice(a.lastIndexOf("/")+1,a.lastIndexOf("."));"editor"==top.ICEcoder.theme&&(top.ICEcoder.theme="icecoder");k=document.createElement("link");k.setAttribute("rel","stylesheet");k.setAttribute("type",
|
||||
"text/css");k.setAttribute("href",a);top.ICEcoder.content.contentWindow.document.getElementsByTagName("head")[0].appendChild(k);a=-1<"3024-day base16-light eclipse elegant neat paraiso-light solarized xq-light".split(" ").indexOf(top.ICEcoder.theme)?"#ccc":"#000";top.ICEcoder.switchTab(top.ICEcoder.selectedTab);b!=top.ICEcoder.codeAssist&&(top.get("codeAssist").checked=b,top.ICEcoder.codeAssistToggle());c!=top.ICEcoder.lockedNav&&top.ICEcoder.lockUnlockNav();c||(ICEcoder.changeFilesW("contract"),
|
||||
top.ICEcoder.hideFileMenu());c=ICEcoder.content.contentWindow.document.styleSheets[4];b=c.rules?"rules":"cssRules";c[b][0].style.fontSize=g;c[b][4].style["border-left-width"]=f?"1px":"0";c[b][4].style["margin-left"]=f?"-1px":"0";c[b][2].style.cssText="background-color: "+a+" !important";top.ICEcoder.lineWrapping=m;top.ICEcoder.indentWithTabs=h;top.ICEcoder.indentSize=l;for(f=0;f<ICEcoder.cMInstances.length;f++)ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("lineWrapping",top.ICEcoder.lineWrapping),
|
||||
ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("indentWithTabs",top.ICEcoder.indentWithTabs),ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("indentUnit",top.ICEcoder.indentSize),ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[f]].setOption("tabSize",top.ICEcoder.indentSize);d!=top.ICEcoder.tagWrapperCommand&&(top.ICEcoder.tagWrapperCommand=d);e!=top.ICEcoder.autoComplete&&(top.ICEcoder.autoComplete=e);top.get("plugins").style.left="left"==n?
|
||||
"0":"auto";top.get("plugins").style.right="right"==n?"0":"auto";p&&top.ICEcoder.refreshFileManager()},updateResultsDisplay:function(a){ICEcoder.findReplace(top.get("find").value,!0,!1);top.get("results").style.display="show"==a?"inline-block":"none"},fullScreenSwitcher:function(){"undefined"!=typeof document.cancelFullScreen?document.fullScreen?document.cancelFullScreen():document.body.requestFullScreen():"undefined"!=typeof document.mozCancelFullScreen?document.mozFullScreen?document.mozCancelFullScreen():
|
||||
document.body.mozRequestFullScreen():"undefined"!=typeof document.webkitCancelFullScreen&&(document.webkitIsFullScreen?document.webkitCancelFullScreen():document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT))},zipIt:function(a){a=a.replace(/\//g,"|");top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href="plugins/zip-it/index.php?zip="+a},downloadFile:function(a){a=a.replace(/\//g,"|");top.ICEcoder.filesFrame.contentWindow.frames.fileControl.location.href="lib/download.php?file="+
|
||||
a},chmod:function(a,b){a=a.replace(top.iceRoot,"");top.ICEcoder.showHide("hide",top.get("blackMask"));top.ICEcoder.serverQueue("add","lib/file-control.php?action=perms&file="+a+"&perms="+b);top.ICEcoder.serverMessage("<b>chMod "+b+" on </b><br>"+a)},openPreviewWindow:function(){if(0<top.ICEcoder.openFiles.length){var a,b,c;b=top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1];c=b.substr(b.lastIndexOf("/")+1);c=c.substr(c.lastIndexOf(".")+1);a=ICEcoder.getcMInstance();top.ICEcoder.previewWindow=window.open(b,
|
||||
"previewWindow");-1<["md"].indexOf(c)&&(top.ICEcoder.previewWindow.onload=function(){top.ICEcoder.previewWindow.document.documentElement.innerHTML=mmd(a.getValue())})}},openTerminal:function(){top.ICEcoder.demoMode?top.ICEcoder.message("Sorry, you need to be logged in to use the terminal"):window.open("terminal")},logout:function(){window.location+="?logout"},message:function(a){alert(a)},ask:function(a){return confirm(a)},getInput:function(a,b){return prompt(a,b)},dataMessage:function(a){var b;b=
|
||||
top.ICEcoder.content.contentWindow.document.getElementById("dataMessage");b.style.display="block";b.innerHTML=a},update:function(){confirm("Updating is currently an experimental feature. While it should work fine, please note there may be issues here, plus the following isn't yet part of this:\n\n- Settings not ported to new version\n- Plugins not ported to new version\n- Any mods you've made not ported to new version\n\nIf you have write access on the whole of ICEcoder (ie, running locally) it should work fine. If tho you need to recover ICEcoder for any reason, you'll find this current version in its tmp dir.\n\nClick OK to proceed with an auto-update or cancel to visit the ICEcoder site so you can grab the zip and update manually")?
|
||||
(top.ICEcoder.showHide("show",top.get("loadingMask")),window.location="lib/updater.php"):window.open("http://icecoder.net")},switchTab:function(a,b){var c;ICEcoder.selectedTab=a;if(c=ICEcoder.getcMInstance()){ICEcoder.switchMode();for(var d=0;d<ICEcoder.cMInstances.length;d++)ICEcoder.content.contentWindow["cM"+ICEcoder.cMInstances[d]].getWrapperElement().style.display="none";c.setOption("theme",top.ICEcoder.theme);c.getWrapperElement().style.display="block";b||setTimeout(function(){top.ICEcoder.focus()},
|
||||
4);c.refresh();ICEcoder.redoTabHighlight(ICEcoder.selectedTab);top.ICEcoder.findMode=!1;ICEcoder.findReplace(top.get("find").value,!0,!1);top.ICEcoder.getCaretPosition();top.ICEcoder.updateCharDisplay();top.ICEcoder.updateByteDisplay()}},newTab:function(){var a;ICEcoder.cMInstances.push(ICEcoder.nextcMInstance);ICEcoder.selectedTab=ICEcoder.cMInstances.length;ICEcoder.showHide("show",ICEcoder.content);ICEcoder.content.contentWindow.createNewCMInstance(ICEcoder.nextcMInstance);ICEcoder.setLayout();
|
||||
ICEcoder.thisFileFolderType="file";ICEcoder.thisFileFolderLink="/[NEW]";ICEcoder.openFile();a=ICEcoder.getcMInstance("new");ICEcoder.switchTab(ICEcoder.openFiles.length);a.removeLineClass(ICEcoder["cMActiveLine"+ICEcoder.cMInstances[top.ICEcoder.selectedTab-1]],"background");ICEcoder["cMActiveLine"+ICEcoder.selectedTab]=a.addLineClass(0,"background","cm-s-activeLine");ICEcoder.nextcMInstance++},createNewTab:function(){var a;top.ICEcoder.openFiles.push(top.ICEcoder.shortURL);top.get("tab"+top.ICEcoder.openFiles.length).style.display=
|
||||
|
||||
42
lib/login.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
include("settings.php");
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>ICEcoder <?php
|
||||
echo $ICEcoder["versionNo"]." : ";
|
||||
echo $ICEcoder["password"] == "" && !$ICEcoder["multiUser"] ? "Setup" : "Login";
|
||||
?></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="ice-coder.css">
|
||||
<link rel="icon" type="image/png" href="../favicon.png">
|
||||
</head>
|
||||
|
||||
<body onLoad="document.settingsUpdate.<?php echo $ICEcoder["multiUser"] ? "username" : "password";?>.focus()">
|
||||
|
||||
<div class="screenContainer" style="background-color: #141414">
|
||||
<div class="screenVCenter">
|
||||
<div class="screenCenter">
|
||||
<img src="../images/ice-coder.png" style="margin-right: 22px" alt="ICEcoder">
|
||||
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div>
|
||||
<form name="settingsUpdate" action="login.php" method="POST">
|
||||
<?php if ($ICEcoder["multiUser"]) {echo ' <input type="text" name="username" class="password"><br><br>'.PHP_EOL;};?>
|
||||
<input type="password" name="password" class="password"><br><br>
|
||||
<input type="submit" name="submit" value="<?php if ($ICEcoder["multiUser"]) {echo "set password / login";} else {echo $ICEcoder["password"] == "" ? "set password" : "login";}; ?>" class="button">
|
||||
<?php
|
||||
if ($ICEcoder["password"] == "" || $ICEcoder["multiUser"]) {
|
||||
echo '<div class="text"><input type="checkbox" name="checkUpdates" value="true" checked> auto-check for updates</div>';
|
||||
}
|
||||
if (!$ICEcoder["multiUser"]) { echo '<div class="text"><a href="javascript:alert(\'To put into multi-user mode, open lib/config___settings.php and change multiUser to true then reload this page\')">multi-user?</a></div>';};
|
||||
?>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -113,7 +113,7 @@ if (startTab!=top.ICEcoder.selectedTab) {
|
||||
$r = 0;
|
||||
function phpGrep($q, $path, $base) {
|
||||
$fp = opendir($path);
|
||||
global $r, $ICEcoder, $serverType, $selectedFiles, $context;
|
||||
global $r, $ICEcoder, $serverType, $selectedFiles, $docRoot, $ICEcoderDir, $context;
|
||||
if (!isset($ret)) {$ret="";};
|
||||
$slash = $serverType == strpos($path,"\\")>-1 ? "\\" : "/";
|
||||
while($f = readdir($fp)) {
|
||||
@@ -124,9 +124,16 @@ if (startTab!=top.ICEcoder.selectedTab) {
|
||||
} else if(stristr(toUTF8noBOM(file_get_contents($fullPath,false,$context),false), $q)) {
|
||||
$bFile = false;
|
||||
$foundInSelFile = false;
|
||||
// Exclude banned files
|
||||
for ($i=0;$i<count($ICEcoder['bannedFiles']);$i++) {
|
||||
if (strpos($f,$ICEcoder['bannedFiles'][$i])!==false) {$bFile = true;};
|
||||
}
|
||||
// Exclude the folder ICEcoder is running from
|
||||
$rootPrefix = '/'.str_replace("/","\/",preg_quote(str_replace("\\","/",$docRoot))).'/';
|
||||
$localPath = preg_replace($rootPrefix, '', $fullPath, 1);
|
||||
if (strpos($localPath, $ICEcoderDir)===0) {
|
||||
$bFile = true;
|
||||
}
|
||||
$findPath = str_replace($base,"",$fullPath);
|
||||
for ($i=0;$i<count($selectedFiles);$i++) {
|
||||
$stringExtra = $selectedFiles[$i] != "|" ? "/" : "";
|
||||
|
||||
40
lib/plugins-display.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
$onLoadExtras = "";
|
||||
$pluginsDisplay = "";
|
||||
|
||||
// Show plugins
|
||||
if ($_SESSION['loggedIn']) {
|
||||
// Work out the plugins to display to the user
|
||||
$pluginsDisplay = "";
|
||||
for ($i=0;$i<count($ICEcoder["plugins"]);$i++) {
|
||||
$target = explode(":",$ICEcoder["plugins"][$i][4]);
|
||||
$pluginsDisplay .= '<a href="'.$ICEcoder["plugins"][$i][3].'" title="'.$ICEcoder["plugins"][$i][0].'" target="'.$target[0].'"><img src="'.$ICEcoder["plugins"][$i][1].'" style="'.$ICEcoder["plugins"][$i][2].'" alt="'.$ICEcoder["plugins"][$i][0].'"></a><br><br>';
|
||||
};
|
||||
|
||||
// If we're updating plugins, update those shown
|
||||
if (isset($_GET['updatedPlugins'])) {
|
||||
echo "<script>top.document.getElementById('pluginsOptional').innerHTML = '".$pluginsDisplay."';</script>";
|
||||
}
|
||||
|
||||
// Work out what plugins we'll need to set on a setInterval
|
||||
$onLoadExtras = "";
|
||||
for ($i=0;$i<count($ICEcoder["plugins"]);$i++) {
|
||||
if ($ICEcoder["plugins"][$i][5]!="") {
|
||||
$onLoadExtras .= ";top.ICEcoder.startPluginIntervals(".$i.",'".$ICEcoder["plugins"][$i][3]."','".$ICEcoder["plugins"][$i][4]."','".$ICEcoder["plugins"][$i][5]."')";
|
||||
};
|
||||
};
|
||||
|
||||
// If we're updating our plugins, clear existing setIntervals & the array refs, then start new ones
|
||||
if (isset($_GET['updatedPlugins'])) {
|
||||
?>
|
||||
<script>
|
||||
for (i=0;i<=top.ICEcoder.pluginIntervalRefs.length-1;i++) {
|
||||
clearInterval(top.ICEcoder['plugTimer'+top.ICEcoder.pluginIntervalRefs[i]]);
|
||||
}
|
||||
top.ICEcoder.pluginIntervalRefs = [];
|
||||
<?php echo $onLoadExtras.PHP_EOL; ?>
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
}
|
||||
?>
|
||||
36
lib/plugins-manager.css
Normal file
@@ -0,0 +1,36 @@
|
||||
/* 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 {
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
outline: 0;
|
||||
font-size: 12px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
body {overflow: hidden;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
h1 {font-size: 36px; font-weight: normal; color: #888; margin-bottom: 20px}
|
||||
a {color: #fff; text-decoration: none}
|
||||
input {padding: 4px; border: 1px solid #555; background-color: #444; color: #fff}
|
||||
input:focus {
|
||||
outline: none;
|
||||
-webkit-box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
|
||||
-moz-box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
|
||||
box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
|
||||
}
|
||||
|
||||
.pluginsManager {font-family: arial, verdana, helvetica, sans-serif; background-color: #1c1c19; color: #fff; padding: 20px}
|
||||
243
lib/plugins-manager.php
Normal file
@@ -0,0 +1,243 @@
|
||||
<?php
|
||||
include("settings.php");
|
||||
|
||||
// Set the plugin data source
|
||||
$pluginsDataSrc = "http://icecoder.net/plugin-data?format=JSON";
|
||||
|
||||
// Now get our plugin data and put into a PHP array
|
||||
$pluginsDataJS = file_get_contents($pluginsDataSrc, false, $context);
|
||||
$pluginsData = json_decode($pluginsDataJS, true);
|
||||
|
||||
// If we have an action to perform
|
||||
if (isset($_GET['action'])) {
|
||||
|
||||
// Get our old plugin & user settings
|
||||
$oldPlugins = $ICEcoder["plugins"];
|
||||
$settingsContents = file_get_contents($settingsFile,false,$context);
|
||||
|
||||
// ==========
|
||||
// INSTALLING
|
||||
// ==========
|
||||
|
||||
if ($_GET['action']=="install") {
|
||||
|
||||
// Store the plugin zip to the tmp dir
|
||||
$target = '../plugins/';
|
||||
$zipFile = "../tmp/".basename($pluginsData[$_GET['plugin']]['zipURL']);
|
||||
$client = curl_init($pluginsData[$_GET['plugin']]['zipURL']);
|
||||
curl_setopt($client, CURLOPT_RETURNTRANSFER, 1); //fixed this line
|
||||
$fileData = curl_exec($client);
|
||||
file_put_contents($zipFile, $fileData);
|
||||
|
||||
// Now unpack the zip
|
||||
$zip = new ZipArchive;
|
||||
$zip->open($zipFile);
|
||||
|
||||
// Create all files & dirs, in 1kb chunks
|
||||
for($i=0; $i<$zip->numFiles; $i++) {
|
||||
$name = $zip->getNameIndex($i);
|
||||
|
||||
// Determine output filename
|
||||
$file = $target.$name;
|
||||
|
||||
// Create the directories if necessary
|
||||
$dir = dirname($file);
|
||||
if (!is_dir($dir)) mkdir($dir, 0777, true);
|
||||
|
||||
// Read from zip and write to disk
|
||||
$fpr = $zip->getStream($name);
|
||||
if (!is_dir($file)) {
|
||||
$fpw = fopen($file, 'w');
|
||||
while ($data = fread($fpr, 1024)) {
|
||||
fwrite($fpw, $data);
|
||||
}
|
||||
fclose($fpw);
|
||||
}
|
||||
fclose($fpr);
|
||||
}
|
||||
$zip->close();
|
||||
|
||||
// Remove the tmp zip file
|
||||
unlink($zipFile);
|
||||
|
||||
// Start creating a new chunk for the plugins settings
|
||||
$settingsNew = '"plugins" => array('.PHP_EOL;
|
||||
|
||||
// Set all the old plugins
|
||||
for ($i=0; $i<count($oldPlugins); $i++) {
|
||||
$settingsNew .= ' array("'.$oldPlugins[$i][0].'","'.$oldPlugins[$i][1].'","'.$oldPlugins[$i][2].'","'.$oldPlugins[$i][3].'","'.$oldPlugins[$i][4].'","'.$oldPlugins[$i][5].'"),'.PHP_EOL;
|
||||
}
|
||||
// Then add the new one
|
||||
$settingsNew .= ' array("'.$pluginsData[$_GET['plugin']]['name'].'","'.$pluginsData[$_GET['plugin']]['icon'].'","'.$pluginsData[$_GET['plugin']]['style'].'","'.$pluginsData[$_GET['plugin']]['URL'].'","'.$pluginsData[$_GET['plugin']]['target'].'","'.$pluginsData[$_GET['plugin']]['timer'].'")'.PHP_EOL;
|
||||
$settingsNew .= ' ),'.PHP_EOL;
|
||||
}
|
||||
|
||||
// ============
|
||||
// UNINSTALLING
|
||||
// ============
|
||||
|
||||
if ($_GET['action']=="uninstall") {
|
||||
|
||||
// Start creating a new chunk for the plugins settings
|
||||
$settingsNew = '"plugins" => array('.PHP_EOL;
|
||||
|
||||
// Set all the old plugins
|
||||
for ($i=0; $i<count($oldPlugins); $i++) {
|
||||
// As long as it's not the one we want to remove
|
||||
if ($oldPlugins[$i][0] != $pluginsData[$_GET['plugin']]['name']) {
|
||||
$settingsNew .= ' array("'.$oldPlugins[$i][0].'","'.$oldPlugins[$i][1].'","'.$oldPlugins[$i][2].'","'.$oldPlugins[$i][3].'","'.$oldPlugins[$i][4].'","'.$oldPlugins[$i][5].'"),'.PHP_EOL;
|
||||
}
|
||||
}
|
||||
// Rtrim off the last comma
|
||||
$settingsNew = rtrim($settingsNew,','.PHP_EOL).PHP_EOL;
|
||||
$settingsNew .= ' ),'.PHP_EOL;
|
||||
|
||||
// Finally, delete the plugin itself
|
||||
$target = '../plugins/';
|
||||
$dirName = basename($pluginsData[$_GET['plugin']]['zipURL'],".zip");
|
||||
deletePlugin($target.$dirName."/");
|
||||
}
|
||||
|
||||
// ========
|
||||
// UPDATING
|
||||
// ========
|
||||
|
||||
if ($_GET['action']=="update") {
|
||||
|
||||
// Start creating a new chunk for the plugins settings
|
||||
$settingsNew = '"plugins" => array('.PHP_EOL;
|
||||
|
||||
// Redo the arrays using the form data
|
||||
for ($i=0; $i<count($oldPlugins); $i++) {
|
||||
$settingsNew .= ' array("'.$_POST['name'.$i].'","'.$_POST['icon'.$i].'","'.$_POST['style'.$i].'","'.$_POST['URL'.$i].'","'.$_POST['target'.$i].'","'.$_POST['timer'.$i].'"),'.PHP_EOL;
|
||||
}
|
||||
$settingsNew .= ' ),'.PHP_EOL;
|
||||
}
|
||||
|
||||
// Now we have a new settingsNew string to use and files installed/uninstalled
|
||||
// we can update the plugin arrays in the settings file
|
||||
|
||||
// Identify the bit to replace
|
||||
$repPosStart = strpos($settingsContents,'"plugins"');
|
||||
$repPosEnd = strpos($settingsContents,'"previousFiles"');
|
||||
|
||||
// Compile our new settings
|
||||
$settingsContents = substr($settingsContents,0,$repPosStart).$settingsNew.substr($settingsContents,$repPosEnd,strlen($settingsContents));
|
||||
|
||||
// Now update the config file
|
||||
if (is_writeable($settingsFile)) {
|
||||
$fh = fopen($settingsFile, 'w');
|
||||
fwrite($fh, $settingsContents);
|
||||
fclose($fh);
|
||||
// Finally, reload the iFrame screen for the user
|
||||
header("Location: plugins-manager.php?updatedPlugins");
|
||||
die('saving plugins...');
|
||||
} else {
|
||||
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
|
||||
}
|
||||
}
|
||||
|
||||
// Function to delete the plugin dir & files/dirs inside
|
||||
function deletePlugin($dir) {
|
||||
$mydir = opendir($dir);
|
||||
while(false !== ($file = readdir($mydir))) {
|
||||
if($file != "." && $file != "..") {
|
||||
chmod($dir.$file, 0777);
|
||||
if(is_dir($dir.$file)) {
|
||||
chdir('.');
|
||||
deletePlugin($dir.$file.'/');
|
||||
rmdir($dir.$file) or DIE("couldn't delete $dir$file<br />");
|
||||
}
|
||||
else
|
||||
unlink($dir.$file) or DIE("couldn't delete $dir$file<br />");
|
||||
}
|
||||
}
|
||||
closedir($mydir);
|
||||
rmdir($dir);
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>ICEcoder <?php echo $ICEcoder["versionNo"];?> plugins manager</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="plugins-manager.css">
|
||||
</head>
|
||||
|
||||
<body class="pluginsManager">
|
||||
|
||||
<h1>plugins</h1>
|
||||
|
||||
<a href="javascript:top.ICEcoder.showManual('<?php echo $ICEcoder["versionNo"];?>','writingPlugins')" style="position: absolute; top: 26px; right: 20px"><div style="padding: 10px; background: #333; color: #fff; font-size: 18px">Guide to writing plugins</div></a>
|
||||
<div style="display: inline-block; width: 760px; height: 340px; overflow-y: auto">
|
||||
<?php
|
||||
$plugins = $ICEcoder[plugins];
|
||||
if (count($plugins) > 0) {
|
||||
?>
|
||||
<div style="display: inline-block; width: 740px; margin-bottom: 30px">
|
||||
<h2>Manage Installed</h2><br>
|
||||
|
||||
<form id="pluginUpdateForm" action="plugins-manager.php?action=update" method="POST">
|
||||
<table>
|
||||
<tr>
|
||||
<td colspan="2"></td>
|
||||
<td style="padding-left: 5px">URL</td>
|
||||
<td style="padding-left: 5px">Target</td>
|
||||
<td style="padding-left: 5px">Timer</td>
|
||||
</tr>
|
||||
<?php
|
||||
for ($i=0; $i<count($plugins); $i++) {
|
||||
echo '<tr>';
|
||||
echo '<td style="padding: 0 10px 8px 0; width: 28px; text-align: center"><img src="../'.$plugins[$i][1].'" alt="'.$plugins[$i][0].'"><input type="hidden" name="name'.$i.'" value="'.$plugins[$i][0].'"><input type="hidden" name="icon'.$i.'" value="'.$plugins[$i][1].'"><input type="hidden" name="style'.$i.'" value="'.$plugins[$i][2].'"></td>';
|
||||
echo '<td style="padding: 8px 10px 8px 0; width: 250px; white-space: nowrap">'.$plugins[$i][0].'</td>';
|
||||
echo '<td style="padding: 0 10px 8px 0"><input type="text" name="URL'.$i.'" value="'.$plugins[$i][3].'" style="width: 280px"></td>';
|
||||
echo '<td style="padding: 0 10px 8px 0"><input type="text" name="target'.$i.'" value="'.$plugins[$i][4].'" style="width: 70px"></td>';
|
||||
echo '<td style="padding: 0 0 8px 0"><input type="text" name="timer'.$i.'" value="'.$plugins[$i][5].'" style="width: 50px"></td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
echo '<td colspan="4"></td>';
|
||||
echo '<td style="padding: 3px 0 8px 0"><div style="padding: 5px; background: #2187e7; color: #fff; font-size: 12px; cursor: pointer" onclick="document.getElementById(\'pluginUpdateForm\').submit()">Update</div></td>';
|
||||
?>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
;};
|
||||
?>
|
||||
|
||||
<div style="display: inline-block; width: 740px">
|
||||
<h2>Install / Uninstall</h2><br>
|
||||
|
||||
<table>
|
||||
<?php
|
||||
for ($i=0; $i<count($pluginsData); $i++) {
|
||||
if ($i % 2 == 0) {
|
||||
echo '<tr>'.PHP_EOL;
|
||||
}
|
||||
|
||||
$installUninstallButton = '<div style="display: inline-block; padding: 5px; background: #2187e7; color: #fff; font-size: 12px; cursor: pointer" onclick="window.location=\'plugins-manager.php?action=install&plugin='.$i.'\'">Install</div>';
|
||||
for ($j=0; $j<count($plugins); $j++) {
|
||||
if ($pluginsData[$i]['name'] == $plugins[$j][0]) {
|
||||
$installUninstallButton = '<div style="display: inline-block; padding: 5px; background: #333; color: #fff; font-size: 12px; cursor: pointer" onclick="window.location=\'plugins-manager.php?action=uninstall&plugin='.$i.'\'">Uninstall</div>';
|
||||
}
|
||||
}
|
||||
|
||||
echo '<td style="padding: 0 10px 8px 0; width: 28px; text-align: center"><img src="http://icecoder.net/'.$pluginsData[$i]['icon'].'" alt="'.$pluginsData[$i]['name'].'"></td>';
|
||||
echo '<td style="padding: 8px 10px 8px 0; width: 250px; white-space: nowrap">'.$pluginsData[$i]['name'].'</td>';
|
||||
$styleExtra = ($i % 2 == 1 || $i == count($pluginsData)-1) ? "0" : "30px";
|
||||
echo '<td style="padding: 3px '.$styleExtra.' 8px 0">'.$installUninstallButton.'</td>';
|
||||
|
||||
if ($i % 2 == 1 || $i == count($pluginsData)-1) {
|
||||
echo PHP_EOL.'</tr>'.PHP_EOL;
|
||||
}
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
88
lib/settings-common.php
Normal file
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
// Don't display, but log all errors
|
||||
ini_set('display_errors', 0);
|
||||
ini_set('log_errors', 1);
|
||||
ini_set('error_log', dirname(__FILE__).'/../error-log.txt');
|
||||
error_reporting(-1);
|
||||
|
||||
// Set our default timezone and supress warning with @
|
||||
@date_default_timezone_set(date_default_timezone_get());
|
||||
|
||||
// Set a stream context timeout for file reading
|
||||
$context = stream_context_create(array('http'=>
|
||||
array(
|
||||
'timeout' => 60 // secs
|
||||
)
|
||||
));
|
||||
|
||||
// Set our security related headers, none activated
|
||||
// header("frame-options: SAMEORIGIN");
|
||||
// header("XSS-Protection: 1; mode=block");
|
||||
|
||||
// Start a session if we haven't already
|
||||
if(!isset($_SESSION)) {@session_start();}
|
||||
|
||||
// Logout if that's the action we're taking
|
||||
if (isset($_GET['logout'])) {
|
||||
include(dirname(__FILE__)."/../processes/on-user-logout.php");
|
||||
$_SESSION['loggedIn']=false;
|
||||
$_SESSION['username']=false;
|
||||
session_destroy();
|
||||
header("Location: dirname(__FILE__)./?loggedOut");
|
||||
}
|
||||
|
||||
// If magic quotes are still on (attempted to switch off in php.ini)
|
||||
if (get_magic_quotes_gpc ()) {
|
||||
function stripslashes_deep($value) {
|
||||
$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
|
||||
return $value;
|
||||
}
|
||||
$_POST = (isset($_POST) && !empty($_POST)) ? array_map('stripslashes_deep', $_POST) : array();
|
||||
$_GET = (isset($_GET) && !empty($_GET)) ? array_map('stripslashes_deep', $_GET) : array();
|
||||
$_COOKIE = (isset($_COOKIE) && !empty($_COOKIE)) ? array_map('stripslashes_deep', $_COOKIE) : array();
|
||||
$_REQUEST = (isset($_REQUEST) && !empty($_REQUEST)) ? array_map('stripslashes_deep', $_REQUEST) : array();
|
||||
}
|
||||
|
||||
// Function to handle salted hashing
|
||||
define('SALT_LENGTH',12);
|
||||
function generateHash($plainText,$salt=null) {
|
||||
if ($salt === null) {
|
||||
$salt = substr(md5(uniqid(rand(), true)),0,SALT_LENGTH);
|
||||
} else {
|
||||
$salt = substr($salt,0,SALT_LENGTH);
|
||||
}
|
||||
return $salt.sha1($salt.$plainText);
|
||||
}
|
||||
|
||||
// returns converted entities which have 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;
|
||||
}
|
||||
|
||||
// returns a UTF8 based string with any UFT8 BOM removed
|
||||
function toUTF8noBOM($string,$message) {
|
||||
// Attempt to detect encoding
|
||||
if (function_exists('mb_detect_encoding')) {
|
||||
$encType = mb_detect_encoding($string);
|
||||
// Get rid of any UTF-8 BOM
|
||||
$string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);
|
||||
// Test for any bad characters
|
||||
$teststring = $string;
|
||||
$teststringBroken = utf8_decode($teststring);
|
||||
$teststringConverted = iconv("UTF-8", "UTF-8//IGNORE", $teststringBroken);
|
||||
// If we have a matching length, UTF8 encode it
|
||||
if ($encType != "ASCII" && $encType != "UTF-8" && strlen($teststringConverted) == strlen($teststringBroken)) {
|
||||
$string = utf8_encode($string);
|
||||
if ($message) {
|
||||
echo "top.ICEcoder.message('Your document doesn\'t appear to be in UTF-8 encoding so has been converted.');";
|
||||
}
|
||||
}
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
?>
|
||||
56
lib/settings-save-current-files.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
// Save the currently opened files for next time
|
||||
if ($_SESSION['loggedIn'] && isset($_GET["saveFiles"]) && $_GET['saveFiles']) {
|
||||
$settingsContents = file_get_contents($settingsFile,false,$context);
|
||||
|
||||
// Replace our previousFiles var with the the current
|
||||
$repPosStart = strpos($settingsContents,'previousFiles" => "')+20;
|
||||
$repPosEnd = strpos($settingsContents,'",',$repPosStart)-$repPosStart;
|
||||
if (!$demoMode) {
|
||||
if ($_GET['saveFiles']!="CLEAR") {
|
||||
$saveFiles=strClean($_GET['saveFiles']);
|
||||
$saveFilesArray = explode(",",$saveFiles);
|
||||
$saveFiles="";
|
||||
for ($i=0;$i<count($saveFilesArray);$i++) {
|
||||
$saveFilesArray[$i] = str_replace("/","|",$docRoot).$saveFilesArray[$i];
|
||||
$saveFiles .= $saveFilesArray[$i].",";
|
||||
}
|
||||
$saveFiles = rtrim($saveFiles,",");
|
||||
} else {
|
||||
$saveFilesArray = array();
|
||||
$saveFiles = "";
|
||||
}
|
||||
$settingsContents = substr($settingsContents,0,$repPosStart).$saveFiles.substr($settingsContents,($repPosStart+$repPosEnd),strlen($settingsContents));
|
||||
// Now update the config file
|
||||
if (is_writeable($settingsFile)) {
|
||||
$fh = fopen($settingsFile, 'w');
|
||||
fwrite($fh, $settingsContents);
|
||||
fclose($fh);
|
||||
} else {
|
||||
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
|
||||
}
|
||||
|
||||
// Update our last10Files var?
|
||||
$last10FilesArray = explode(",",$ICEcoder["last10Files"]);
|
||||
for ($i=0;$i<count($saveFilesArray);$i++) {
|
||||
$inLast10Files = in_array($saveFilesArray[$i],$last10FilesArray);
|
||||
if (!$inLast10Files && $saveFilesArray[$i] !="") {
|
||||
$repPosStart = strpos($settingsContents,'last10Files" => "')+18;
|
||||
$repPosEnd = strpos($settingsContents,'"',$repPosStart)-$repPosStart;
|
||||
$commaExtra = $ICEcoder["last10Files"]!="" ? "," : "";
|
||||
if (count($last10FilesArray)>=10) {$ICEcoder["last10Files"]=substr($ICEcoder["last10Files"],0,strrpos($ICEcoder["last10Files"],','));};
|
||||
$settingsContents = substr($settingsContents,0,$repPosStart).$saveFilesArray[$i].$commaExtra.$ICEcoder["last10Files"].substr($settingsContents,($repPosStart+$repPosEnd),strlen($settingsContents));
|
||||
// Now update the config file
|
||||
if (is_writeable($settingsFile)) {
|
||||
$fh = fopen($settingsFile, 'w');
|
||||
fwrite($fh, $settingsContents);
|
||||
fclose($fh);
|
||||
} else {
|
||||
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
echo '<script>top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);</script>';
|
||||
}
|
||||
?>
|
||||
@@ -42,5 +42,4 @@ h2 {font-size: 18px; font-weight: normal; color: #fff}
|
||||
-moz-box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
|
||||
box-shadow: 0 0 10px 1px rgba(0,198,255,0.7);
|
||||
}
|
||||
.settings .plugins {font-family: arial, verdana, helvetica, sans-serif; width: 410px; height: 95px; overflow: auto}
|
||||
.settings .update {position: absolute; bottom: 0; right: 20px; padding: 5px 10px; font-size: 18px; background-color: rgba(0,198,255,0.7); opacity: 0.1; cursor: pointer}
|
||||
@@ -73,7 +73,7 @@ for ($i=0;$i<count($themeArray);$i++) {
|
||||
|
||||
Thanks go to the following people who have inspired me to create this or provided feedback, code or testing:<br>
|
||||
<?php
|
||||
$peopleArray = array("marijnjh", "maettig", "a_harris88", "emmetio", "prinzhorn", "wimtibackx", "jakubvrana", "davidwalshblog", "vicen_herrera", "abstractba", "themximum");
|
||||
$peopleArray = array("marijnjh", "maettig", "a_harris88", "emmetio", "prinzhorn", "wimtibackx", "jakubvrana", "davidwalshblog", "vicen_herrera", "abstractba", "themximum", "anagnam");
|
||||
function makeURL(&$value) {
|
||||
$value = '<a href="http://www.twitter.com/'.$value.'" style="font-size: 10px" target="_blank">@'.$value.'</a>';
|
||||
};
|
||||
@@ -129,18 +129,6 @@ ip addresses<br>
|
||||
</div>
|
||||
|
||||
<div class="settingsColumn2">
|
||||
<h2>plugins</h2>
|
||||
plugins array <span style="font-size: 10px; color: #888">name, img src, style, url, target, setInterval (mins)</span><br>
|
||||
<textarea name="plugins" class="plugins" onkeydown="showButton()"><?php
|
||||
for($i=0;$i<count($ICEcoder["plugins"]);$i++) {
|
||||
echo '"'.implode('",'.PHP_EOL.'"', $ICEcoder["plugins"][$i]).'"';
|
||||
if ($i<count($ICEcoder["plugins"])-1) {
|
||||
echo PHP_EOL."====================".PHP_EOL;
|
||||
}
|
||||
}
|
||||
?></textarea>
|
||||
<br><br>
|
||||
|
||||
<h2>style</h2>
|
||||
theme<br>
|
||||
<select onchange="selectTheme();showButton()" id="select" name="theme" style="width: 95px">
|
||||
@@ -195,7 +183,15 @@ function findSequence(goal) {
|
||||
}</textarea>
|
||||
<br>
|
||||
|
||||
<span style="position: absolute; top: 510px">
|
||||
<span style="position: absolute; top: 360px">
|
||||
<h2>layout</h2>
|
||||
plugin panel aligned<br>
|
||||
<select onchange="showButton()" name="pluginPanelAligned">
|
||||
<option value="left"<?php if($ICEcoder["pluginPanelAligned"] == "left") {echo " selected";};?>>left</option>
|
||||
<option value="right"<?php if($ICEcoder["pluginPanelAligned"] == "right") {echo " selected";};?>>right</option>
|
||||
</select>
|
||||
<br><br>
|
||||
|
||||
<h2>file manager</h2>
|
||||
root <span style="font-size: 10px; color: #888">slash prefixed</span><br>
|
||||
<input type="text" name="root" style="width: 200px" onkeydown="document.settings.changedFileSettings.value='true';showButton()" value="<?php echo $ICEcoder["root"];?>">
|
||||
|
||||
66
lib/settings-update.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
// Update this config file?
|
||||
if (!$demoMode && isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] && isset($_POST["theme"]) && $_POST["theme"]) {
|
||||
$settingsContents = file_get_contents($settingsFile,false,$context);
|
||||
// Replace our settings vars
|
||||
$repPosStart = strpos($settingsContents,'"root"');
|
||||
$repPosEnd = strpos($settingsContents,'"plugins"');
|
||||
|
||||
// Prepare all our vars
|
||||
$ICEcoder["root"] = strClean($_POST['root']);
|
||||
$ICEcoder["checkUpdates"] = isset($_POST['checkUpdates']) && $_POST['checkUpdates'] ? "true" : "false";
|
||||
$ICEcoder["openLastFiles"] = isset($_POST['openLastFiles']) && $_POST['openLastFiles'] ? "true" : "false";
|
||||
$ICEcoder["findFilesExclude"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['findFilesExclude']))).'")';
|
||||
$ICEcoder["codeAssist"] = isset($_POST['codeAssist']) && $_POST['codeAssist'] ? "true" : "false";
|
||||
$ICEcoder["visibleTabs"] = isset($_POST['visibleTabs']) && $_POST['visibleTabs'] ? "true" : "false";
|
||||
$ICEcoder["lockedNav"] = isset($_POST['lockedNav']) && $_POST['lockedNav'] ? "true" : "false";
|
||||
$ICEcoder["tagWrapperCommand"] = strClean($_POST['tagWrapperCommand']);
|
||||
$ICEcoder["autoComplete"] = strClean($_POST['autoComplete']);
|
||||
if ($_POST['password']!="") {$ICEcoder["password"] = generateHash(strClean($_POST['password']));};
|
||||
$ICEcoder["bannedFiles"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedFiles']))).'")';
|
||||
$ICEcoder["bannedPaths"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedPaths']))).'")';
|
||||
$ICEcoder["allowedIPs"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['allowedIPs']))).'")';
|
||||
$ICEcoder["theme"] = strClean($_POST['theme']);
|
||||
$ICEcoder["fontSize"] = strClean($_POST['fontSize']);
|
||||
$ICEcoder["lineWrapping"] = strClean($_POST['lineWrapping']);
|
||||
$ICEcoder["indentWithTabs"] = strClean($_POST['indentWithTabs']);
|
||||
$ICEcoder["indentSize"] = numClean($_POST['indentSize']);
|
||||
$ICEcoder["pluginPanelAligned"] = strClean($_POST['pluginPanelAligned']);
|
||||
|
||||
$settingsArray = array("root","checkUpdates","openLastFiles","findFilesExclude","codeAssist","visibleTabs","lockedNav","tagWrapperCommand","autoComplete","password","bannedFiles","bannedPaths","allowedIPs","theme","fontSize","lineWrapping","indentWithTabs","indentSize","pluginPanelAligned");
|
||||
$settingsNew = "";
|
||||
for ($i=0;$i<count($settingsArray);$i++) {
|
||||
$settingsNew .= '"'.$settingsArray[$i].'"'.PHP_EOL.' => ';
|
||||
// Wrap certain values in double quotes
|
||||
$settingWrap = $settingsArray[$i]=="root"||$settingsArray[$i]=="password"||$settingsArray[$i]=="theme"||$settingsArray[$i]=="fontSize"||$settingsArray[$i]=="tagWrapperCommand"||$settingsArray[$i]=="autoComplete"||$settingsArray[$i]=="pluginPanelAligned" ? '"' : '';
|
||||
$settingsNew .= $settingWrap.$ICEcoder[$settingsArray[$i]].$settingWrap.','.PHP_EOL.PHP_EOL;
|
||||
}
|
||||
|
||||
// Compile our new settings
|
||||
$settingsContents = substr($settingsContents,0,$repPosStart).$settingsNew.substr($settingsContents,($repPosEnd),strlen($settingsContents));
|
||||
|
||||
// Now update the config file
|
||||
if (is_writeable($settingsFile)) {
|
||||
$fh = fopen($settingsFile, 'w');
|
||||
fwrite($fh, $settingsContents);
|
||||
fclose($fh);
|
||||
} else {
|
||||
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
|
||||
}
|
||||
|
||||
// OK, now the config file has been updated, update our current session with new arrays
|
||||
$settingsArray = array("findFilesExclude","bannedFiles","allowedIPs");
|
||||
for ($i=0;$i<count($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';
|
||||
|
||||
// Do we need a file manager refresh?
|
||||
$refreshFM = $_POST['changedFileSettings']=="true" ? "true" : "false";
|
||||
|
||||
// With all that worked out, we can now hide the settings screen and apply the new settings
|
||||
echo "<script>top.ICEcoder.settingsScreen('hide');top.ICEcoder.useNewSettings('".$themeURL."',".$ICEcoder["codeAssist"].",".$ICEcoder["lockedNav"].",'".$ICEcoder["tagWrapperCommand"]."','".$ICEcoder["autoComplete"]."',".$ICEcoder["visibleTabs"].",'".$ICEcoder["fontSize"]."',".$ICEcoder["lineWrapping"].",".$ICEcoder["indentWithTabs"].",".$ICEcoder["indentSize"].",'".$ICEcoder["pluginPanelAligned"]."',".$refreshFM.");</script>";
|
||||
}
|
||||
?>
|
||||
357
lib/settings.php
@@ -1,189 +1,58 @@
|
||||
<?php
|
||||
// Don't display, but log all errors
|
||||
ini_set('display_errors', 0);
|
||||
ini_set('log_errors', 1);
|
||||
ini_set('error_log', dirname(__FILE__).'/../error-log.txt');
|
||||
error_reporting(-1);
|
||||
|
||||
// Set our default timezone and supress warning with @
|
||||
@date_default_timezone_set(date_default_timezone_get());
|
||||
|
||||
// Set a stream context timeout for file reading
|
||||
$context = stream_context_create(array('http'=>
|
||||
array(
|
||||
'timeout' => 60 // secs
|
||||
)
|
||||
));
|
||||
|
||||
// Set our security related headers, none activated
|
||||
// header("frame-options: SAMEORIGIN");
|
||||
// header("XSS-Protection: 1; mode=block");
|
||||
|
||||
// Start a session if we haven't already
|
||||
if(!isset($_SESSION)) {@session_start();}
|
||||
|
||||
// Logout if that's the action we're taking
|
||||
if (isset($_GET['logout'])) {
|
||||
include(dirname(__FILE__)."/../processes/on-user-logout.php");
|
||||
$_SESSION['loggedIn']=false;
|
||||
$_SESSION['username']=false;
|
||||
session_destroy();
|
||||
header("Location: dirname(__FILE__)./?loggedOut");
|
||||
}
|
||||
|
||||
// If magic quotes are still on (attempted to switch off in php.ini)
|
||||
if (get_magic_quotes_gpc ()) {
|
||||
function stripslashes_deep($value) {
|
||||
$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
|
||||
return $value;
|
||||
}
|
||||
$_POST = (isset($_POST) && !empty($_POST)) ? array_map('stripslashes_deep', $_POST) : array();
|
||||
$_GET = (isset($_GET) && !empty($_GET)) ? array_map('stripslashes_deep', $_GET) : array();
|
||||
$_COOKIE = (isset($_COOKIE) && !empty($_COOKIE)) ? array_map('stripslashes_deep', $_COOKIE) : array();
|
||||
$_REQUEST = (isset($_REQUEST) && !empty($_REQUEST)) ? array_map('stripslashes_deep', $_REQUEST) : array();
|
||||
}
|
||||
|
||||
// Function to handle salted hashing
|
||||
define('SALT_LENGTH',12);
|
||||
function generateHash($plainText,$salt=null) {
|
||||
if ($salt === null) {
|
||||
$salt = substr(md5(uniqid(rand(), true)),0,SALT_LENGTH);
|
||||
} else {
|
||||
$salt = substr($salt,0,SALT_LENGTH);
|
||||
}
|
||||
return $salt.sha1($salt.$plainText);
|
||||
}
|
||||
|
||||
// returns converted entities which have 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;
|
||||
}
|
||||
|
||||
// returns a UTF8 based string with any UFT8 BOM removed
|
||||
function toUTF8noBOM($string,$message) {
|
||||
// Attempt to detect encoding
|
||||
if (function_exists('mb_detect_encoding')) {
|
||||
$encType = mb_detect_encoding($string);
|
||||
// Get rid of any UTF-8 BOM
|
||||
$string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);
|
||||
// Test for any bad characters
|
||||
$teststring = $string;
|
||||
$teststringBroken = utf8_decode($teststring);
|
||||
$teststringConverted = iconv("UTF-8", "UTF-8//IGNORE", $teststringBroken);
|
||||
// If we have a matching length, UTF8 encode it
|
||||
if ($encType != "ASCII" && $encType != "UTF-8" && strlen($teststringConverted) == strlen($teststringBroken)) {
|
||||
$string = utf8_encode($string);
|
||||
if ($message) {
|
||||
echo "top.ICEcoder.message('Your document doesn\'t appear to be in UTF-8 encoding so has been converted.');";
|
||||
}
|
||||
}
|
||||
}
|
||||
return $string;
|
||||
}
|
||||
|
||||
// Load system settings
|
||||
// Establish settings and users template filenames
|
||||
$configSettings = 'config___settings.php';
|
||||
$configUsersTemplate = 'config___users-template.php';
|
||||
|
||||
// Load config settings
|
||||
include(dirname(__FILE__)."/".$configSettings);
|
||||
|
||||
// Settings are stored in this file
|
||||
$configUsersTemplate = 'config___users-template.php';
|
||||
// Load common functions
|
||||
include(dirname(__FILE__)."/settings-common.php");
|
||||
|
||||
// Establish user settings file
|
||||
$username = "";
|
||||
if (isset($_POST['username']) && $_POST['username'] != "") {$username = strClean($_POST['username']."-");};
|
||||
if (isset($_SESSION['username']) && $_SESSION['username'] != "") {$username = strClean($_SESSION['username']."-");};
|
||||
$settingsFile = 'config-'.$username.str_replace(".","_",str_replace("www.","",$_SERVER['SERVER_NAME'])).'.php';
|
||||
|
||||
// Login is default
|
||||
$setPWorLogin = "login";
|
||||
|
||||
// Create user settings file if it doesn't exist
|
||||
if (!file_exists(dirname(__FILE__)."/".$settingsFile)) {
|
||||
if (!copy(dirname(__FILE__)."/".$configUsersTemplate, dirname(__FILE__)."/".$settingsFile)) {
|
||||
die("Couldn't create $settingsFile. Maybe you need write permissions on the lib folder?");
|
||||
}
|
||||
$setPWorLogin = "set password";
|
||||
}
|
||||
|
||||
// Load user settings
|
||||
include(dirname(__FILE__)."/".$settingsFile);
|
||||
|
||||
// On mismatch of settings file to system, rename to .old and reload
|
||||
If ($ICEcoderUserSettings["versionNo"] != $ICEcoderSettings["versionNo"]) {
|
||||
rename(dirname(__FILE__)."/".$settingsFile,dirname(__FILE__)."/".str_replace(".php",".old",$settingsFile));
|
||||
header("Location: settings.php");
|
||||
die('Found old settings file, reloading...');
|
||||
}
|
||||
|
||||
// Join ICEcoder settings and user settings together to make our final ICEcoder array
|
||||
$ICEcoder = $ICEcoderSettings + $ICEcoderUserSettings;
|
||||
|
||||
$onLoadExtras = "";
|
||||
$pluginsDisplay = "";
|
||||
|
||||
if ($ICEcoder['demoMode'] && $ICEcoder['password']!="") {$_SESSION['loggedIn']=true;};
|
||||
// Login not required or we're in demo mode and have password set in our settings, log us straight in
|
||||
if ((!$ICEcoder['loginRequired'] || $ICEcoder['demoMode']) && $ICEcoder['password']!="") {$_SESSION['loggedIn']=true;};
|
||||
$demoMode = $ICEcoder['demoMode'];
|
||||
|
||||
// Update this config file?
|
||||
if (!$demoMode && isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] && isset($_POST["theme"]) && $_POST["theme"]) {
|
||||
$settingsContents = file_get_contents($settingsFile,false,$context);
|
||||
// Replace our settings vars
|
||||
$repPosStart = strpos($settingsContents,'"root"');
|
||||
$repPosEnd = strpos($settingsContents,'"previousFiles"');
|
||||
include(dirname(__FILE__)."/settings-update.php");
|
||||
|
||||
// Prepare all our vars
|
||||
$ICEcoder["root"] = strClean($_POST['root']);
|
||||
$ICEcoder["checkUpdates"] = isset($_POST['checkUpdates']) && $_POST['checkUpdates'] ? "true" : "false";
|
||||
$ICEcoder["openLastFiles"] = isset($_POST['openLastFiles']) && $_POST['openLastFiles'] ? "true" : "false";
|
||||
$ICEcoder["findFilesExclude"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['findFilesExclude']))).'")';
|
||||
$ICEcoder["codeAssist"] = isset($_POST['codeAssist']) && $_POST['codeAssist'] ? "true" : "false";
|
||||
$ICEcoder["visibleTabs"] = isset($_POST['visibleTabs']) && $_POST['visibleTabs'] ? "true" : "false";
|
||||
$ICEcoder["lockedNav"] = isset($_POST['lockedNav']) && $_POST['lockedNav'] ? "true" : "false";
|
||||
$ICEcoder["tagWrapperCommand"] = strClean($_POST['tagWrapperCommand']);
|
||||
$ICEcoder["autoComplete"] = strClean($_POST['autoComplete']);
|
||||
if ($_POST['password']!="") {$ICEcoder["password"] = generateHash(strClean($_POST['password']));};
|
||||
$ICEcoder["bannedFiles"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedFiles']))).'")';
|
||||
$ICEcoder["bannedPaths"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['bannedPaths']))).'")';
|
||||
$ICEcoder["allowedIPs"] = 'array("'.str_replace(',','","',str_replace(" ","",strClean($_POST['allowedIPs']))).'")';
|
||||
$ICEcoder["plugins"] = 'array('.PHP_EOL.' array('.PHP_EOL.' '.str_replace('====================','),'.PHP_EOL.' array(',str_replace("\\","\\\\",$_POST['plugins'])).'))';
|
||||
$ICEcoder["theme"] = strClean($_POST['theme']);
|
||||
$ICEcoder["fontSize"] = strClean($_POST['fontSize']);
|
||||
$ICEcoder["lineWrapping"] = strClean($_POST['lineWrapping']);
|
||||
$ICEcoder["indentWithTabs"] = strClean($_POST['indentWithTabs']);
|
||||
$ICEcoder["indentSize"] = numClean($_POST['indentSize']);
|
||||
|
||||
$settingsArray = array("root","checkUpdates","openLastFiles","findFilesExclude","codeAssist","visibleTabs","lockedNav","tagWrapperCommand","autoComplete","password","bannedFiles","bannedPaths","allowedIPs","plugins","theme","fontSize","lineWrapping","indentWithTabs","indentSize");
|
||||
$settingsNew = "";
|
||||
for ($i=0;$i<count($settingsArray);$i++) {
|
||||
$settingsNew .= '"'.$settingsArray[$i].'"'.PHP_EOL.' => ';
|
||||
$settingWrap = $settingsArray[$i]=="root"||$settingsArray[$i]=="password"||$settingsArray[$i]=="theme"||$settingsArray[$i]=="fontSize"||$settingsArray[$i]=="tagWrapperCommand"||$settingsArray[$i]=="autoComplete" ? '"' : '';
|
||||
$settingsNew .= $settingWrap.$ICEcoder[$settingsArray[$i]].$settingWrap.','.PHP_EOL.PHP_EOL;
|
||||
}
|
||||
|
||||
// Compile our new settings
|
||||
$settingsContents = substr($settingsContents,0,$repPosStart).$settingsNew.substr($settingsContents,($repPosEnd),strlen($settingsContents));
|
||||
// Now update the config file
|
||||
if (is_writeable($settingsFile)) {
|
||||
$fh = fopen($settingsFile, 'w');
|
||||
fwrite($fh, $settingsContents);
|
||||
fclose($fh);
|
||||
} else {
|
||||
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
|
||||
}
|
||||
|
||||
// OK, now the config file has been updated, update our current session with new arrays
|
||||
$settingsArray = array("findFilesExclude","bannedFiles","allowedIPs");
|
||||
for ($i=0;$i<count($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';
|
||||
// Do we need a file manager refresh?
|
||||
$refreshFM = $_POST['changedFileSettings']=="true" ? "true" : "false";
|
||||
// With all that worked out, we can now hide the settings screen and apply the new settings
|
||||
echo "<script>top.ICEcoder.settingsScreen('hide');top.ICEcoder.useNewSettings('".$themeURL."',".$ICEcoder["codeAssist"].",".$ICEcoder["lockedNav"].",'".$ICEcoder["tagWrapperCommand"]."','".$ICEcoder["autoComplete"]."',".$ICEcoder["visibleTabs"].",'".$ICEcoder["fontSize"]."',".$ICEcoder["lineWrapping"].",".$ICEcoder["indentWithTabs"].",".$ICEcoder["indentSize"].",".$refreshFM.");</script>";
|
||||
}
|
||||
|
||||
// Establish our user level
|
||||
// Set loggedIn and username to false if not set as yet
|
||||
if (!isset($_SESSION['loggedIn'])) {$_SESSION['loggedIn'] = false;};
|
||||
if (!isset($_SESSION['username'])) {$_SESSION['username'] = false;};
|
||||
|
||||
// Attempt a login with password
|
||||
if(isset($_POST['submit']) && $setPWorLogin=="login") {
|
||||
// On success, set username if multiUser, loggedIn to true and redirect
|
||||
if (generateHash(strClean($_POST['password']),$ICEcoder["password"])==$ICEcoder["password"]) {
|
||||
if ($ICEcoder["multiUser"]) {
|
||||
$_SESSION['username'] = $_POST['username'];
|
||||
@@ -191,10 +60,13 @@ if(isset($_POST['submit']) && $setPWorLogin=="login") {
|
||||
$_SESSION['loggedIn'] = true;
|
||||
include(dirname(__FILE__)."/../processes/on-user-login.php");
|
||||
header('Location: ../');
|
||||
die('Logging you in...');
|
||||
} else {
|
||||
include(dirname(__FILE__)."/../processes/on-user-login-fail.php");
|
||||
}
|
||||
};
|
||||
|
||||
// Re-establish our loggedIn state and username
|
||||
$_SESSION['loggedIn'] = $_SESSION['loggedIn'];
|
||||
$_SESSION['username'] = $_SESSION['username'];
|
||||
|
||||
@@ -206,6 +78,11 @@ if ($_SESSION['loggedIn']) {
|
||||
echo "<script>top.docRoot='".$docRoot."';top.iceRoot='".$iceRoot."'</script>";
|
||||
}
|
||||
|
||||
// Establish the dir ICEcoders running from
|
||||
$ICEcoderDirFullPath = rtrim(str_replace("\\","/",dirname($_SERVER['SCRIPT_FILENAME'])),"/lib");
|
||||
$rootPrefix = '/'.str_replace("/","\/",preg_quote(str_replace("\\","/",$docRoot))).'/';
|
||||
$ICEcoderDir = preg_replace($rootPrefix, '', $ICEcoderDirFullPath, 1);
|
||||
|
||||
// Setup our file security vars
|
||||
$settingsArray = array("findFilesExclude","bannedFiles","allowedIPs");
|
||||
for ($i=0;$i<count($settingsArray);$i++) {
|
||||
@@ -219,126 +96,30 @@ for($i=0;$i<count($_SESSION['allowedIPs']);$i++) {
|
||||
$allowedIP = true;
|
||||
}
|
||||
}
|
||||
// If user not allowed to view, boot to site root
|
||||
// If user not allowed to view, display message
|
||||
if (!$allowedIP) {
|
||||
echo '<script>top.window.location="/";</script>';
|
||||
die('Sorry, access not permitted');
|
||||
};
|
||||
|
||||
// Save the currently opened files for next time
|
||||
if ($_SESSION['loggedIn'] && isset($_GET["saveFiles"]) && $_GET['saveFiles']) {
|
||||
$settingsContents = file_get_contents($settingsFile,false,$context);
|
||||
// Save currently opened files in previousFiles and last10Files arrays
|
||||
include(dirname(__FILE__)."/settings-save-current-files.php");
|
||||
|
||||
// Replace our previousFiles var with the the current
|
||||
$repPosStart = strpos($settingsContents,'previousFiles" => "')+20;
|
||||
$repPosEnd = strpos($settingsContents,'",',$repPosStart)-$repPosStart;
|
||||
if (!$demoMode) {
|
||||
if ($_GET['saveFiles']!="CLEAR") {
|
||||
$saveFiles=strClean($_GET['saveFiles']);
|
||||
$saveFilesArray = explode(",",$saveFiles);
|
||||
$saveFiles="";
|
||||
for ($i=0;$i<count($saveFilesArray);$i++) {
|
||||
$saveFilesArray[$i] = str_replace("/","|",$docRoot).$saveFilesArray[$i];
|
||||
$saveFiles .= $saveFilesArray[$i].",";
|
||||
}
|
||||
$saveFiles = rtrim($saveFiles,",");
|
||||
} else {
|
||||
$saveFilesArray = array();
|
||||
$saveFiles = "";
|
||||
}
|
||||
$settingsContents = substr($settingsContents,0,$repPosStart).$saveFiles.substr($settingsContents,($repPosStart+$repPosEnd),strlen($settingsContents));
|
||||
// Now update the config file
|
||||
if (is_writeable($settingsFile)) {
|
||||
$fh = fopen($settingsFile, 'w');
|
||||
fwrite($fh, $settingsContents);
|
||||
fclose($fh);
|
||||
} else {
|
||||
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
|
||||
}
|
||||
// Display the plugins
|
||||
include(dirname(__FILE__)."/plugins-display.php");
|
||||
|
||||
// Update our last10Files var?
|
||||
$last10FilesArray = explode(",",$ICEcoder["last10Files"]);
|
||||
for ($i=0;$i<count($saveFilesArray);$i++) {
|
||||
$inLast10Files = in_array($saveFilesArray[$i],$last10FilesArray);
|
||||
if (!$inLast10Files && $saveFilesArray[$i] !="") {
|
||||
$repPosStart = strpos($settingsContents,'last10Files" => "')+18;
|
||||
$repPosEnd = strpos($settingsContents,'"',$repPosStart)-$repPosStart;
|
||||
$commaExtra = $ICEcoder["last10Files"]!="" ? "," : "";
|
||||
if (count($last10FilesArray)>=10) {$ICEcoder["last10Files"]=substr($ICEcoder["last10Files"],0,strrpos($ICEcoder["last10Files"],','));};
|
||||
$settingsContents = substr($settingsContents,0,$repPosStart).$saveFilesArray[$i].$commaExtra.$ICEcoder["last10Files"].substr($settingsContents,($repPosStart+$repPosEnd),strlen($settingsContents));
|
||||
// Now update the config file
|
||||
if (is_writeable($settingsFile)) {
|
||||
$fh = fopen($settingsFile, 'w');
|
||||
fwrite($fh, $settingsContents);
|
||||
fclose($fh);
|
||||
} else {
|
||||
echo "<script>top.ICEcoder.message('Cannot update config file. Please set public write permissions on lib/".$settingsFile." and try again');</script>";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
echo '<script>top.ICEcoder.serverMessage();top.ICEcoder.serverQueue("del",0);</script>';
|
||||
}
|
||||
|
||||
// If we're updating, do/redo plugins
|
||||
if ($_SESSION['loggedIn']) {
|
||||
// If we're updating, we need to recreate the plugins array
|
||||
if (isset($_POST["theme"]) && $_POST["theme"]) {
|
||||
$ICEcoder["plugins"] = array();
|
||||
$pluginsArray = explode("====================",str_replace("\"","",str_replace("\r","",str_replace("\n","",$_POST['plugins']))));
|
||||
for ($i=0;$i<count($pluginsArray);$i++) {
|
||||
array_push($ICEcoder["plugins"], explode(",",$pluginsArray[$i]));
|
||||
}
|
||||
}
|
||||
|
||||
// Work out the plugins to display to the user
|
||||
$pluginsDisplay = "";
|
||||
for ($i=0;$i<count($ICEcoder["plugins"]);$i++) {
|
||||
$target = explode(":",$ICEcoder["plugins"][$i][4]);
|
||||
$pluginsDisplay .= '<a href="'.$ICEcoder["plugins"][$i][3].'" title="'.$ICEcoder["plugins"][$i][0].'" target="'.$target[0].'"><img src="'.$ICEcoder["plugins"][$i][1].'" style="'.$ICEcoder["plugins"][$i][2].'" alt="'.$ICEcoder["plugins"][$i][0].'"></a><br><br>';
|
||||
};
|
||||
|
||||
// If we're updating, replace the plugin display with our newly established one
|
||||
echo "<script>if(top.document.getElementById('pluginsContainer')) {top.document.getElementById('pluginsContainer').innerHTML = '".$pluginsDisplay."'};</script>";
|
||||
|
||||
// Work out what plugins we'll need to set on a setInterval
|
||||
$onLoadExtras = "";
|
||||
for ($i=0;$i<count($ICEcoder["plugins"]);$i++) {
|
||||
if ($ICEcoder["plugins"][$i][5]!="") {
|
||||
$onLoadExtras .= ";top.ICEcoder.startPluginIntervals(".$i.",'".$ICEcoder["plugins"][$i][3]."','".$ICEcoder["plugins"][$i][4]."','".$ICEcoder["plugins"][$i][5]."')";
|
||||
};
|
||||
};
|
||||
|
||||
// If we're updating our settings, clear existing setIntervals & the array refs, then start new ones
|
||||
if (isset($_POST["theme"]) && $_POST["theme"]) {
|
||||
?>
|
||||
<script>
|
||||
for (i=0;i<=top.ICEcoder.pluginIntervalRefs.length-1;i++) {
|
||||
clearInterval(top.ICEcoder['plugTimer'+top.ICEcoder.pluginIntervalRefs[i]]);
|
||||
}
|
||||
top.ICEcoder.pluginIntervalRefs = [];
|
||||
<?php echo $onLoadExtras.PHP_EOL; ?>
|
||||
</script>
|
||||
<?php
|
||||
}
|
||||
|
||||
// Finally, show server data
|
||||
$onLoadExtras .= ";top.ICEcoder.content.style.visibility='visible'";
|
||||
}
|
||||
|
||||
if ((!$_SESSION['loggedIn'] || $ICEcoder["password"] == "") && !strpos($_SERVER['SCRIPT_NAME'],"lib/settings.php")) {
|
||||
if (file_exists('lib/settings.php')) {
|
||||
header('Location: lib/settings.php');
|
||||
die();
|
||||
// If loggedIn is false or we don't have a password set yet and we're not on login screen, boot user to that
|
||||
if ((!$_SESSION['loggedIn'] || $ICEcoder["password"] == "") && !strpos($_SERVER['SCRIPT_NAME'],"lib/login.php")) {
|
||||
if (file_exists('lib/login.php')) {
|
||||
header('Location: lib/login.php');
|
||||
} else {
|
||||
header('Location: settings.php');
|
||||
die();
|
||||
header('Location: login.php');
|
||||
}
|
||||
// If we're due to show the settings screen
|
||||
die('Redirecting to login...');
|
||||
// If we are on the login screen and not logged in
|
||||
} elseif (!$_SESSION['loggedIn']) {
|
||||
// If the password hasn't been set and we're setting it
|
||||
if ($ICEcoder["password"] == "" && isset($_POST['submit']) && (strpos($_POST['submit'],"set password")>-1)) {
|
||||
$password = generateHash(strClean($_POST['password']));
|
||||
$settingsFile = $settingsFile;
|
||||
$settingsContents = file_get_contents($settingsFile,false,$context);
|
||||
// Replace our empty password with the one submitted by user
|
||||
$settingsContents = str_replace('"password" => "",','"password" => "'.$password.'",',$settingsContents);
|
||||
@@ -359,49 +140,17 @@ if ((!$_SESSION['loggedIn'] || $ICEcoder["password"] == "") && !strpos($_SERVER[
|
||||
include(dirname(__FILE__)."/../processes/on-user-new.php");
|
||||
// Finally, load again as now this file has changed and auto login
|
||||
header('Location: ../');
|
||||
die('Logging you in...');
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>ICEcoder <?php
|
||||
echo $ICEcoder["versionNo"]." : ";
|
||||
echo $ICEcoder["password"] == "" && !$ICEcoder["multiUser"] ? "Setup" : "Login";
|
||||
?></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="ice-coder.css">
|
||||
<link rel="icon" type="image/png" href="../favicon.png">
|
||||
</head>
|
||||
|
||||
<body onLoad="document.settingsUpdate.<?php echo $ICEcoder["multiUser"] ? "username" : "password";?>.focus()">
|
||||
|
||||
<div class="screenContainer" style="background-color: #141414">
|
||||
<div class="screenVCenter">
|
||||
<div class="screenCenter">
|
||||
<img src="../images/ice-coder.png" style="margin-right: 22px">
|
||||
<div class="version">v <?php echo $ICEcoder["versionNo"];?></div>
|
||||
<form name="settingsUpdate" action="settings.php" method="POST">
|
||||
<?php if ($ICEcoder["multiUser"]) {echo '<input type="text" name="username" class="password"><br><br>';};?>
|
||||
<input type="password" name="password" class="password"><br><br>
|
||||
<input type="submit" name="submit" value="<?php if ($ICEcoder["multiUser"]) {echo "set password / login";} else {echo $ICEcoder["password"] == "" ? "set password" : "login";}; ?>" class="button">
|
||||
<?php
|
||||
if ($ICEcoder["password"] == "" || $ICEcoder["multiUser"]) {
|
||||
echo '<div class="text"><input type="checkbox" name="checkUpdates" value="true" checked> auto-check for updates</div>';
|
||||
}
|
||||
if (!$ICEcoder["multiUser"]) { echo '<div class="text"><a href="javascript:alert(\'To put into multi-user mode, open lib/config___settings.php and change multiUser to true then reload this page\')">multi-user?</a></div>';};
|
||||
?>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
<?php
|
||||
} elseif ($_SESSION['loggedIn'] && $ICEcoder["password"]=="") {
|
||||
// ===================================================
|
||||
// We're likely showing the login screen at this point
|
||||
// ===================================================
|
||||
} elseif ($ICEcoder['loginRequired'] && $_SESSION['loggedIn'] && $ICEcoder["password"]=="") {
|
||||
header("Location: ../?logout");
|
||||
die('Logging you out...');
|
||||
} else {
|
||||
// ==================================
|
||||
// Continue with whatever we're doing
|
||||
// ==================================
|
||||
}
|
||||
?>
|
||||
0
plugins/.gitkeep
Normal file
@@ -1,62 +0,0 @@
|
||||
/* CSS by Brade - www.bradezone.com */
|
||||
*{margin:0;padding:0}
|
||||
body{font:13px/18px Helvetica,Arial,sans-serif;background:#fff;color:#333}
|
||||
/* generic */
|
||||
a,a:visited{color:#06c;text-decoration:none;border-bottom:1px dotted}
|
||||
a:hover{border-bottom:1px solid #06c;background:#06c;color:#fff}
|
||||
p{padding-bottom:4px;margin-bottom:4px}
|
||||
h1{font-size:18px;font-weight:bold;padding-bottom:0px;height:40px;padding:0 0 8px 0;color:#666;border:0}
|
||||
h2{font:32px Georgia,serif;padding:10px 0 8px;margin:0;background:transparent;border:0;color:#333}
|
||||
h3{font-size:18px;font-weight:bold;padding:4px 0;margin:0}
|
||||
form#form{overflow:hidden}
|
||||
fieldset{float:left;min-height:48px;padding:0 4px 4px 4px;border:1px solid #ccc;margin-bottom:8px;margin-right:4px}
|
||||
fieldset div{margin-top:4px}
|
||||
input,select,textarea{font:13px Helvetica,Arial,sans-serif;color:#555;border:1px solid #999;padding:3px}
|
||||
input[type=submit]{background:#ccc;padding:2px;cursor:pointer;color:#333}
|
||||
input[type=submit]:hover{background:#bbb}
|
||||
input[type=image],input[type=checkbox]{border:0;padding:0}
|
||||
label input[type=checkbox],td input[type=radio],td span select{margin-right:4px}
|
||||
select{border:1px solid #999;padding:2px}
|
||||
fieldset select{margin-right:4px}
|
||||
option{padding:0 5px}
|
||||
optgroup{font-size:11px}
|
||||
code{background:#eee;padding:2px 4px;font:16px/20px Courier,monospace}
|
||||
code a:hover{background:transparent}
|
||||
table{margin:4px 0 8px;border:1px solid #ccc;font-size:inherit}
|
||||
tbody tr:hover td,tbody tr:hover th{background:#eee}
|
||||
thead tr:hover td,thead tr:hover th{background:#ddd}
|
||||
th,td{text-align:left;padding:2px 4px;vertical-align:top;font-weight:normal;border:1px dotted #ccc;border-width:0 0 0 1px;
|
||||
margin:0;background:inherit}
|
||||
thead th,thead td{white-space:nowrap;font-weight:bold;background:#ddd;border-color:#ddd}
|
||||
th:first-child,td:first-child{border-color:transparent;white-space:nowrap}
|
||||
td[align=right]{text-align:right}
|
||||
table code{font-size:13px;line-height:18px}
|
||||
.hidden{display:none}
|
||||
.error,.message{padding:0;background:transparent;font-weight:bold}
|
||||
.error{color:#c00}
|
||||
.message{color:#090}
|
||||
/* specific */
|
||||
#content{margin:0 0 0 320px;padding:50px 20px 40px 0;height:100%}
|
||||
#content:after{content:'.';clear:both;height:0;overflow:hidden;display:block}
|
||||
#lang{background:#333;color:#fff;position:fixed;top:0;left:0;width:100%;padding:0 20px 0 40px;line-height:40px;height:40px}
|
||||
#lang select{border-color:#333}
|
||||
#menu{background:#eee;position:fixed;top:60px;bottom:20px;overflow:auto;left:20px;width:240px;padding:10px 15px;
|
||||
border:5px solid #ccc;margin:0}
|
||||
#menu a{color:#333;margin-right:4px}
|
||||
#menu a:hover{background:#333;color:#fff;border-color:#333}
|
||||
#menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0;
|
||||
outline:0;background:url(http://www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px}
|
||||
#menu p{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0}
|
||||
#breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;width:100%;line-height:40px;padding:0;z-index:1;margin:0}
|
||||
#breadcrumb a{color:#ff9}
|
||||
#breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9}
|
||||
#schema .table{padding:4px 8px;background:#f3f3f3}
|
||||
/* IE hacks */
|
||||
*+html th:first-child,*+html td:first-child{border-color:inherit;white-space:inherit}
|
||||
* html #lang,* html #menu,* html #breadcrumb{position:absolute}
|
||||
* html #lang{padding-top:10px;height:30px}
|
||||
* html form#form{height:100%}
|
||||
#logins a,#tables a{background: none}
|
||||
#logout{color:#333;text-decoration:none;border-bottom:1px dotted}
|
||||
#logout:hover{border-color:#333;background:#333;color:#fff}
|
||||
.js .column{background:#ddd}
|
||||
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -1,45 +0,0 @@
|
||||
<script>
|
||||
/*
|
||||
Copyright (C) 2013 Sencha Inc.
|
||||
Copyright (C) 2012 Sencha Inc.
|
||||
Copyright (C) 2011 Sencha Inc.
|
||||
|
||||
Author: Ariya Hidayat.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
/*jslint continue: true, indent: 4 */
|
||||
/*global exports:true, module:true, window:true */
|
||||
|
||||
(function(){function p(m,p){function q(a){return" "===a||"\n"===a||"\t"===a||"\r"===a||"\f"===a}function t(a){return"a"<=b&&"z">=b||"A"<=b&&"Z">=b||"0"<=b&&"9">=b||0<="-_*.:#".indexOf(a)}function r(){var b;for(b=g;0<b;b-=1)a+=h.indent}function u(){a=f(a);v?a+=" {":(a+="\n",r(),a+="{");"\n"!==d&&(a+="\n");g+=1}function n(){var b;g-=1;a=f(a);w&&(b=a.charAt(a.length-1),";"!==b&&"{"!==b&&(a+=";"));a+="\n";r();a+="}";k.push(a);a=""}var h,e=0,x=m.length,k,a="",b,d,c,g,l,s,v=!0,w=!1,f;h=1<arguments.length?
|
||||
p:{};"undefined"===typeof h.indent&&(h.indent=" ");"string"===typeof h.openbrace&&(v="end-of-line"===h.openbrace);"boolean"===typeof h.autosemicolon&&(w=h.autosemicolon);f=String.prototype.trimRight?function(a){return a.trimRight()}:function(a){return a.replace(/\s+$/,"")};c=g=0;s=!1;k=[];for(m=m.replace(/\r\n/g,"\n");e<x;)if(b=m.charAt(e),d=m.charAt(e+1),e+=1,"'"===l||'"'===l)a+=b,b===l&&(l=null),"\\"===b&&d===l&&(a+=d,e+=1);else if("'"===b||'"'===b)a+=b,l=b;else if(s)a+=b,"*"===b&&"/"===d&&(s=
|
||||
!1,a+=d,e+=1);else if("/"===b&&"*"===d)s=!0,a+=b,a+=d,e+=1;else{if(0===c){if(0===k.length&&q(b)&&0===a.length)continue;if(" ">=b||128<=b.charCodeAt(0)){c=0;a+=b;continue}if(t(b)||"["===b||"@"===b){c=f(a);if(0===c.length)0<k.length&&(a="\n\n");else if("}"===c.charAt(c.length-1)||";"===c.charAt(c.length-1))a=c+"\n\n";else for(;;){d=a.charAt(a.length-1);if(" "!==d&&9!==d.charCodeAt(0))break;a=a.substr(0,a.length-1)}a+=b;c="@"===b?1:3;continue}}if(1===c)";"===b?(a+=b,c=0):"{"===b?(c=f(a),u(),c="@font-face"===
|
||||
c?4:2):a+=b;else if(2===c)if(t(b)){c=f(a);if(0===c.length)0<k.length&&(a="\n\n");else if("}"===c.charAt(c.length-1))a=c+"\n\n";else for(;;){d=a.charAt(a.length-1);if(" "!==d&&9!==d.charCodeAt(0))break;a=a.substr(0,a.length-1)}r();a+=b;c=3}else"}"===b?(n(),c=0):a+=b;else if(3===c)"{"===b?(u(),c=4):"}"===b?(n(),c=0):a+=b;else if(4===c)"}"===b?(n(),c=0,0<g&&(c=2)):"\n"===b?(a=f(a),a+="\n"):q(b)?a+=b:(a=f(a),a+="\n",r(),a+=b,c=5);else if(5===c)":"===b?(a=f(a),a+=": ",c=7,q(d)&&(c=6)):"}"===b?(n(),c=0,
|
||||
0<g&&(c=2)):a+=b;else if(6===c)if(!q(b))a+=b,c=7;else{if("'"===d||'"'===d)c=7}else 7===c?"}"===b?(n(),c=0,0<g&&(c=2)):";"===b?(a=f(a),a+=";\n",c=4):(a+=b,"("===b&&"l"===a.charAt(a.length-2)&&"r"===a.charAt(a.length-3)&&"u"===a.charAt(a.length-4)&&(c=8)):8===c&&")"===b&&a.charAt("\\"!==a.length-1)?(a+=b,c=7):a+=b}return a=k.join("")+a}"undefined"!==typeof exports?module.exports=exports=p:"object"===typeof window&&(window.cssbeautify=p)})();
|
||||
|
||||
cM = top.ICEcoder.getcMInstance();
|
||||
if (cM && top.ICEcoder.openFiles[top.ICEcoder.selectedTab-1].indexOf('.css') > -1) {
|
||||
cM.setValue(cssbeautify(cM.getValue(), {
|
||||
indent: ' ',
|
||||
openbrace: 'end-of-line',
|
||||
autosemicolon: false
|
||||
}));
|
||||
}
|
||||
</script>
|
||||
313
plugins/emmet/emmet.min.js
vendored
@@ -1,313 +0,0 @@
|
||||
var _=function(){function f(a,b,c){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a._chain)a=a._wrapped;if(b._chain)b=b._wrapped;if(a.isEqual&&k.isFunction(a.isEqual))return a.isEqual(b);if(b.isEqual&&k.isFunction(b.isEqual))return b.isEqual(a);var g=e.call(a);if(g!=e.call(b))return!1;switch(g){case "[object String]":return a==String(b);case "[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case "[object Date]":case "[object Boolean]":return+a==+b;case "[object RegExp]":return a.source==
|
||||
b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return!1;for(var d=c.length;d--;)if(c[d]==a)return!0;c.push(a);var d=0,j=!0;if(g=="[object Array]"){if(d=a.length,j=d==b.length)for(;d--;)if(!(j=d in a==d in b&&f(a[d],b[d],c)))break}else{if("constructor"in a!="constructor"in b||a.constructor!=b.constructor)return!1;for(var h in a)if(k.has(a,h)&&(d++,!(j=k.has(b,h)&&f(a[h],b[h],c))))break;if(j){for(h in b)if(k.has(b,h)&&!d--)break;
|
||||
j=!d}}c.pop();return j}var d=this,h=d._,i={},b=Array.prototype,c=Object.prototype,a=b.slice,g=b.unshift,e=c.toString,j=c.hasOwnProperty,n=b.forEach,o=b.map,l=b.reduce,m=b.reduceRight,p=b.filter,r=b.every,q=b.some,u=b.indexOf,s=b.lastIndexOf,c=Array.isArray,v=Object.keys,w=Function.prototype.bind,k=function(a){return new x(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=k;exports._=k}else d._=k;k.VERSION="1.3.3";var t=k.each=k.forEach=function(a,
|
||||
b,e){if(a!=null)if(n&&a.forEach===n)a.forEach(b,e);else if(a.length===+a.length)for(var c=0,g=a.length;c<g;c++){if(c in a&&b.call(e,a[c],c,a)===i)break}else for(c in a)if(k.has(a,c)&&b.call(e,a[c],c,a)===i)break};k.map=k.collect=function(a,b,e){var c=[];if(a==null)return c;if(o&&a.map===o)return a.map(b,e);t(a,function(a,g,k){c[c.length]=b.call(e,a,g,k)});if(a.length===+a.length)c.length=a.length;return c};k.reduce=k.foldl=k.inject=function(a,b,c,e){var g=arguments.length>2;a==null&&(a=[]);if(l&&
|
||||
a.reduce===l)return e&&(b=k.bind(b,e)),g?a.reduce(b,c):a.reduce(b);t(a,function(a,k,d){g?c=b.call(e,c,a,k,d):(c=a,g=!0)});if(!g)throw new TypeError("Reduce of empty array with no initial value");return c};k.reduceRight=k.foldr=function(a,b,c,e){var g=arguments.length>2;a==null&&(a=[]);if(m&&a.reduceRight===m)return e&&(b=k.bind(b,e)),g?a.reduceRight(b,c):a.reduceRight(b);var d=k.toArray(a).reverse();e&&!g&&(b=k.bind(b,e));return g?k.reduce(d,b,c,e):k.reduce(d,b)};k.find=k.detect=function(a,b,c){var e;
|
||||
D(a,function(a,g,k){if(b.call(c,a,g,k))return e=a,!0});return e};k.filter=k.select=function(a,b,e){var c=[];if(a==null)return c;if(p&&a.filter===p)return a.filter(b,e);t(a,function(a,g,k){b.call(e,a,g,k)&&(c[c.length]=a)});return c};k.reject=function(a,b,c){var e=[];if(a==null)return e;t(a,function(a,g,k){b.call(c,a,g,k)||(e[e.length]=a)});return e};k.every=k.all=function(a,b,e){var c=!0;if(a==null)return c;if(r&&a.every===r)return a.every(b,e);t(a,function(a,g,k){if(!(c=c&&b.call(e,a,g,k)))return i});
|
||||
return!!c};var D=k.some=k.any=function(a,b,c){b||(b=k.identity);var e=!1;if(a==null)return e;if(q&&a.some===q)return a.some(b,c);t(a,function(a,g,k){if(e||(e=b.call(c,a,g,k)))return i});return!!e};k.include=k.contains=function(a,b){var e=!1;return a==null?e:u&&a.indexOf===u?a.indexOf(b)!=-1:e=D(a,function(a){return a===b})};k.invoke=function(b,e){var c=a.call(arguments,2);return k.map(b,function(a){return(k.isFunction(e)?e||a:a[e]).apply(a,c)})};k.pluck=function(a,b){return k.map(a,function(a){return a[b]})};
|
||||
k.max=function(a,b,e){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!b&&k.isEmpty(a))return-Infinity;var c={computed:-Infinity};t(a,function(a,g,k){g=b?b.call(e,a,g,k):a;g>=c.computed&&(c={value:a,computed:g})});return c.value};k.min=function(a,b,e){if(!b&&k.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!b&&k.isEmpty(a))return Infinity;var c={computed:Infinity};t(a,function(a,g,k){g=b?b.call(e,a,g,k):a;g<c.computed&&(c={value:a,computed:g})});return c.value};k.shuffle=
|
||||
function(a){var b=[],e;t(a,function(a,c){e=Math.floor(Math.random()*(c+1));b[c]=b[e];b[e]=a});return b};k.sortBy=function(a,b,e){var c=k.isFunction(b)?b:function(a){return a[b]};return k.pluck(k.map(a,function(a,b,g){return{value:a,criteria:c.call(e,a,b,g)}}).sort(function(a,b){var e=a.criteria,c=b.criteria;return e===void 0?1:c===void 0?-1:e<c?-1:e>c?1:0}),"value")};k.groupBy=function(a,b){var e={},c=k.isFunction(b)?b:function(a){return a[b]};t(a,function(a,b){var g=c(a,b);(e[g]||(e[g]=[])).push(a)});
|
||||
return e};k.sortedIndex=function(a,b,e){e||(e=k.identity);for(var c=0,g=a.length;c<g;){var d=c+g>>1;e(a[d])<e(b)?c=d+1:g=d}return c};k.toArray=function(b){return!b?[]:k.isArray(b)?a.call(b):k.isArguments(b)?a.call(b):b.toArray&&k.isFunction(b.toArray)?b.toArray():k.values(b)};k.size=function(a){return k.isArray(a)?a.length:k.keys(a).length};k.first=k.head=k.take=function(b,e,c){return e!=null&&!c?a.call(b,0,e):b[0]};k.initial=function(b,e,c){return a.call(b,0,b.length-(e==null||c?1:e))};k.last=function(b,
|
||||
e,c){return e!=null&&!c?a.call(b,Math.max(b.length-e,0)):b[b.length-1]};k.rest=k.tail=function(b,e,c){return a.call(b,e==null||c?1:e)};k.compact=function(a){return k.filter(a,function(a){return!!a})};k.flatten=function(a,b){return k.reduce(a,function(a,e){if(k.isArray(e))return a.concat(b?e:k.flatten(e));a[a.length]=e;return a},[])};k.without=function(b){return k.difference(b,a.call(arguments,1))};k.uniq=k.unique=function(a,b,e){var e=e?k.map(a,e):a,c=[];a.length<3&&(b=!0);k.reduce(e,function(e,g,
|
||||
d){if(b?k.last(e)!==g||!e.length:!k.include(e,g))e.push(g),c.push(a[d]);return e},[]);return c};k.union=function(){return k.uniq(k.flatten(arguments,!0))};k.intersection=k.intersect=function(b){var e=a.call(arguments,1);return k.filter(k.uniq(b),function(a){return k.every(e,function(b){return k.indexOf(b,a)>=0})})};k.difference=function(b){var e=k.flatten(a.call(arguments,1),!0);return k.filter(b,function(a){return!k.include(e,a)})};k.zip=function(){for(var b=a.call(arguments),e=k.max(k.pluck(b,"length")),
|
||||
c=Array(e),g=0;g<e;g++)c[g]=k.pluck(b,""+g);return c};k.indexOf=function(a,b,e){if(a==null)return-1;var c;if(e)return e=k.sortedIndex(a,b),a[e]===b?e:-1;if(u&&a.indexOf===u)return a.indexOf(b);e=0;for(c=a.length;e<c;e++)if(e in a&&a[e]===b)return e;return-1};k.lastIndexOf=function(a,b){if(a==null)return-1;if(s&&a.lastIndexOf===s)return a.lastIndexOf(b);for(var e=a.length;e--;)if(e in a&&a[e]===b)return e;return-1};k.range=function(a,b,e){arguments.length<=1&&(b=a||0,a=0);for(var e=arguments[2]||1,
|
||||
c=Math.max(Math.ceil((b-a)/e),0),g=0,k=Array(c);g<c;)k[g++]=a,a+=e;return k};var E=function(){};k.bind=function(b,e){var c,g;if(b.bind===w&&w)return w.apply(b,a.call(arguments,1));if(!k.isFunction(b))throw new TypeError;g=a.call(arguments,2);return c=function(){if(!(this instanceof c))return b.apply(e,g.concat(a.call(arguments)));E.prototype=b.prototype;var k=new E,d=b.apply(k,g.concat(a.call(arguments)));return Object(d)===d?d:k}};k.bindAll=function(b){var e=a.call(arguments,1);e.length==0&&(e=k.functions(b));
|
||||
t(e,function(a){b[a]=k.bind(b[a],b)});return b};k.memoize=function(a,b){var e={};b||(b=k.identity);return function(){var c=b.apply(this,arguments);return k.has(e,c)?e[c]:e[c]=a.apply(this,arguments)}};k.delay=function(b,e){var c=a.call(arguments,2);return setTimeout(function(){return b.apply(null,c)},e)};k.defer=function(b){return k.delay.apply(k,[b,1].concat(a.call(arguments,1)))};k.throttle=function(a,b){var e,c,g,d,j,f,h=k.debounce(function(){j=d=!1},b);return function(){e=this;c=arguments;var k;
|
||||
g||(g=setTimeout(function(){g=null;j&&a.apply(e,c);h()},b));d?j=!0:f=a.apply(e,c);h();d=!0;return f}};k.debounce=function(a,b,e){var c;return function(){var g=this,k=arguments;e&&!c&&a.apply(g,k);clearTimeout(c);c=setTimeout(function(){c=null;e||a.apply(g,k)},b)}};k.once=function(a){var b=!1,e;return function(){if(b)return e;b=!0;return e=a.apply(this,arguments)}};k.wrap=function(b,e){return function(){var c=[b].concat(a.call(arguments,0));return e.apply(this,c)}};k.compose=function(){var a=arguments;
|
||||
return function(){for(var b=arguments,e=a.length-1;e>=0;e--)b=[a[e].apply(this,b)];return b[0]}};k.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};k.keys=v||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],e;for(e in a)k.has(a,e)&&(b[b.length]=e);return b};k.values=function(a){return k.map(a,k.identity)};k.functions=k.methods=function(a){var b=[],e;for(e in a)k.isFunction(a[e])&&b.push(e);return b.sort()};k.extend=function(b){t(a.call(arguments,
|
||||
1),function(a){for(var e in a)b[e]=a[e]});return b};k.pick=function(b){var e={};t(k.flatten(a.call(arguments,1)),function(a){a in b&&(e[a]=b[a])});return e};k.defaults=function(b){t(a.call(arguments,1),function(a){for(var e in a)b[e]==null&&(b[e]=a[e])});return b};k.clone=function(a){return!k.isObject(a)?a:k.isArray(a)?a.slice():k.extend({},a)};k.tap=function(a,b){b(a);return a};k.isEqual=function(a,b){return f(a,b,[])};k.isEmpty=function(a){if(a==null)return!0;if(k.isArray(a)||k.isString(a))return a.length===
|
||||
0;for(var b in a)if(k.has(a,b))return!1;return!0};k.isElement=function(a){return!!(a&&a.nodeType==1)};k.isArray=c||function(a){return e.call(a)=="[object Array]"};k.isObject=function(a){return a===Object(a)};k.isArguments=function(a){return e.call(a)=="[object Arguments]"};if(!k.isArguments(arguments))k.isArguments=function(a){return!(!a||!k.has(a,"callee"))};k.isFunction=function(a){return e.call(a)=="[object Function]"};k.isString=function(a){return e.call(a)=="[object String]"};k.isNumber=function(a){return e.call(a)==
|
||||
"[object Number]"};k.isFinite=function(a){return k.isNumber(a)&&isFinite(a)};k.isNaN=function(a){return a!==a};k.isBoolean=function(a){return a===!0||a===!1||e.call(a)=="[object Boolean]"};k.isDate=function(a){return e.call(a)=="[object Date]"};k.isRegExp=function(a){return e.call(a)=="[object RegExp]"};k.isNull=function(a){return a===null};k.isUndefined=function(a){return a===void 0};k.has=function(a,b){return j.call(a,b)};k.noConflict=function(){d._=h;return this};k.identity=function(a){return a};
|
||||
k.times=function(a,b,e){for(var c=0;c<a;c++)b.call(e,c)};k.escape=function(a){return(""+a).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};k.result=function(a,b){if(a==null)return null;var e=a[b];return k.isFunction(e)?e.call(a):e};k.mixin=function(a){t(k.functions(a),function(b){F(b,k[b]=a[b])})};var G=0;k.uniqueId=function(a){var b=G++;return a?a+b:b};k.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,
|
||||
escape:/<%-([\s\S]+?)%>/g};var z=/.^/,y={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},A;for(A in y)y[y[A]]=A;var H=/\\|'|\r|\n|\t|\u2028|\u2029/g,I=/\\(\\|'|r|n|t|u2028|u2029)/g,B=function(a){return a.replace(I,function(a,b){return y[b]})};k.template=function(a,b,e){e=k.defaults(e||{},k.templateSettings);a="__p+='"+a.replace(H,function(a){return"\\"+y[a]}).replace(e.escape||z,function(a,b){return"'+\n_.escape("+B(b)+")+\n'"}).replace(e.interpolate||z,function(a,b){return"'+\n("+
|
||||
B(b)+")+\n'"}).replace(e.evaluate||z,function(a,b){return"';\n"+B(b)+"\n;__p+='"})+"';\n";e.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",c=new Function(e.variable||"obj","_",a);if(b)return c(b,k);b=function(a){return c.call(this,a,k)};b.source="function("+(e.variable||"obj")+"){\n"+a+"}";return b};k.chain=function(a){return k(a).chain()};var x=function(a){this._wrapped=a};k.prototype=x.prototype;
|
||||
var C=function(a,b){return b?k(a).chain():a},F=function(b,e){x.prototype[b]=function(){var b=a.call(arguments);g.call(b,this._wrapped);return C(e.apply(k,b),this._chain)}};k.mixin(k);t(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var e=b[a];x.prototype[a]=function(){var b=this._wrapped;e.apply(b,arguments);var c=b.length;(a=="shift"||a=="splice")&&c===0&&delete b[0];return C(b,this._chain)}});t(["concat","join","slice"],function(a){var e=b[a];x.prototype[a]=function(){return C(e.apply(this._wrapped,
|
||||
arguments),this._chain)}});x.prototype.chain=function(){this._chain=!0;return this};x.prototype.value=function(){return this._wrapped};return k}.call({}),emmet=function(f){function d(a,b,d){var f;f=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};_.extend(f,a);c.prototype=a.prototype;f.prototype=new c;b&&_.extend(f.prototype,b);d&&_.extend(f,d);f.prototype.constructor=f;f.__super__=a.prototype;return f}function h(c){!(c in b)&&a&&a(c);return b[c]}if(typeof _=="undefined")try{_=
|
||||
f.require("underscore")}catch(i){}if(typeof _=="undefined")throw"Cannot access to Underscore.js lib";var b={_:_},c=function(){},a=null;return{define:function(a,e){a in b||(b[a]=_.isFunction(e)?this.exec(e):e)},require:h,exec:function(a,b){return a.call(b||f,_.bind(h,this),_,this)},extend:function(a,b){var c=d(this,a,b);c.extend=this.extend;if(a.hasOwnProperty("toString"))c.prototype.toString=a.toString;return c},expandAbbreviation:function(a,b,c,d){if(!a)return"";var b=b||"html",f=h("filters"),i=
|
||||
h("abbreviationParser"),c=h("profile").get(c,b);h("tabStops").resetTabstopIndex();a=f.extractFromAbbreviation(a);d=i.parse(a[0],{syntax:b,contextNode:d});b=f.composeList(b,c,a[1]);f.apply(d,b,c);return d.toString()},defaultSyntax:function(){return"html"},defaultProfile:function(){return"plain"},log:function(){f.console&&f.console.log&&f.console.log.apply(f.console,arguments)},setModuleLoader:function(b){a=b}}}(this);
|
||||
if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=emmet;exports.emmet=emmet}typeof define!=="undefined"&&define(emmet);
|
||||
emmet.define("abbreviationParser",function(f,d){function h(){this.parent=null;this.children=[];this._attributes=[];this.abbreviation="";this.counter=1;this._name=null;this._text="";this.repeatCount=1;this.hasImplicitRepeat=!1;this._data={};this.padding=this.content=this.end=this.start=""}function i(a){return a.substring(1,a.length-1)}function b(a){for(var a=f("utils").trim(a),e=new h,c=e.addChild(),g,j=f("stringStream").create(a),a=1E3,n;!j.eol()&&--a>0;)switch(g=j.peek(),g){case "(":j.start=j.pos;
|
||||
if(j.skipToPair("(",")"))g=b(i(j.current())),(n=j.match(/^\*(\d+)?/,!0))&&c._setRepeat(n[1]),d.each(g.children,function(a){c.addChild(a)});else throw'Invalid abbreviation: mo matching ")" found for character at '+j.pos;break;case ">":c=c.addChild();j.next();break;case "+":c=c.parent.addChild();j.next();break;case "^":g=c.parent||c;c=(g.parent||g).addChild();j.next();break;default:j.start=j.pos,j.eatWhile(function(a){if(a=="["||a=="{"){if(j.skipToPair(a,p[a]))return j.backUp(1),!0;throw'Invalid abbreviation: mo matching "'+
|
||||
p[a]+'" found for character at '+j.pos;}return a=="+"?(j.next(),a=j.eol()||~"+>^*".indexOf(j.peek()),j.backUp(1),a):a!="("&&o(a)}),c.setAbbreviation(j.current()),j.start=j.pos}if(a<1)throw"Endless loop detected";return e}function c(a){var a=f("utils").trim(a),b=[],a=f("stringStream").create(a);for(a.eatSpace();!a.eol();)if(a.start=a.pos,a.eatWhile(m)){var e=a.current(),c="";if(a.peek()=="="){a.next();a.start=a.pos;var g=a.peek();if(g=='"'||g=="'"){a.next();a:{for(var c=a,d=void 0;d=c.next();)if(d===
|
||||
g){c=!0;break a}c=!1}if(c)c=a.current(),c=c.substring(1,c.length-1);else throw"Invalid attribute value";}else if(a.eatWhile(/[^\s\]]/))c=a.current();else throw"Invalid attribute value";}b.push({name:e,value:c});a.eatSpace()}else break;return b}function a(a){for(var b=[],e={"#":"id",".":"class"},d=null,j=f("stringStream").create(a);!j.eol();)switch(j.peek()){case "#":case ".":if(d===null)d=j.pos;var h=e[j.peek()];j.next();j.start=j.pos;j.eatWhile(m);b.push({name:h,value:j.current()});break;case "[":if(d===
|
||||
null)d=j.pos;j.start=j.pos;if(!j.skipToPair("[","]"))throw"Invalid attribute set definition";b=b.concat(c(i(j.current())));break;default:j.next()}return!b.length?null:{element:a.substring(0,d),attributes:g(b)}}function g(a){var a=d.map(a,function(a){return d.clone(a)}),b={};return d.filter(a,function(a){if(!(a.name in b))return b[a.name]=a;var e=b[a.name];a.name.toLowerCase()=="class"?e.value+=(e.value.length?" ":"")+a.value:e.value=a.value;return!1})}function e(a){if(!~a.indexOf("{"))return null;
|
||||
for(var b=f("stringStream").create(a);!b.eol();)switch(b.peek()){case "[":case "(":b.skipToPair(b.peek(),p[b.peek()]);break;case "{":return b.start=b.pos,b.skipToPair("{","}"),{element:a.substring(0,b.start),text:i(b.current())};default:b.next()}}function j(a){for(var b=a.children.length-1,e,c,g;b>=0;b--)if(c=a.children[b],c.isRepeating()){g=e=c.repeatCount;c.repeatCount=1;c.updateProperty("counter",1);for(c.updateProperty("maxCount",g);--e>0;)c.parent.addChild(c.clone(),b+1).updateProperty("counter",
|
||||
e+1).updateProperty("maxCount",g)}d.each(a.children,j);return a}function n(a){for(var b=a.children.length-1;b>=0;b--){var e=a.children[b];e.isGroup()?e.replace(n(e).children):e.isEmpty()&&e.remove()}d.each(a.children,n);return a}function o(a){var b=a.charCodeAt(0);return b>64&&b<91||b>96&&b<123||b>47&&b<58||"#.*:$-_!@|%".indexOf(a)!=-1}var l=/^[\w\-\$\:@\!%]+\+?$/i,m=/[\w\-:\$@]/,p={"[":"]","(":")","{":"}"},r=Array.prototype.splice,q=[],u=[],s=[];h.prototype={addChild:function(a,b){a=a||new h;a.parent=
|
||||
this;d.isUndefined(b)?this.children.push(a):this.children.splice(b,0,a);return a},clone:function(){var a=new h;d.each(["abbreviation","counter","_name","_text","repeatCount","hasImplicitRepeat","start","end","content","padding"],function(b){a[b]=this[b]},this);a._attributes=d.map(this._attributes,function(a){return d.clone(a)});a._data=d.clone(this._data);a.children=d.map(this.children,function(b){b=b.clone();b.parent=a;return b});return a},remove:function(){if(this.parent)this.parent.children=d.without(this.parent.children,
|
||||
this);return this},replace:function(){var a=this.parent,b=d.indexOf(a.children,this),e=d.flatten(arguments);r.apply(a.children,[b,1].concat(e));d.each(e,function(b){b.parent=a})},updateProperty:function(a,b){this[a]=b;d.each(this.children,function(e){e.updateProperty(a,b)});return this},find:function(a){return this.findAll(a)[0]},findAll:function(a){if(!d.isFunction(a))var b=a.toLowerCase(),a=function(a){return a.name().toLowerCase()==b};var e=[];d.each(this.children,function(b){a(b)&&e.push(b);e=
|
||||
e.concat(b.findAll(a))});return d.compact(e)},data:function(a,b){if(arguments.length==2&&(this._data[a]=b,a=="resource"&&f("elements").is(b,"snippet")&&(this.content=b.data,this._text)))this.content=f("abbreviationUtils").insertChildContent(b.data,this._text);return this._data[a]},name:function(){var a=this.matchedResource();return f("elements").is(a,"element")?a.name:this._name},attributeList:function(){var a=[],b=this.matchedResource();f("elements").is(b,"element")&&d.isArray(b.attributes)&&(a=
|
||||
a.concat(b.attributes));return g(a.concat(this._attributes))},attribute:function(a,b){if(arguments.length==2){var e=d.indexOf(d.pluck(this._attributes,"name"),a.toLowerCase());~e?this._attributes[e].value=b:this._attributes.push({name:a,value:b})}return(d.find(this.attributeList(),function(b){return b.name==a})||{}).value},matchedResource:function(){return this.data("resource")},index:function(){return this.parent?d.indexOf(this.parent.children,this):-1},_setRepeat:function(a){a?this.repeatCount=
|
||||
parseInt(a,10)||1:this.hasImplicitRepeat=!0},setAbbreviation:function(b){var c=this;this.abbreviation=b=(b||"").replace(/\*(\d+)?$/,function(a,b){c._setRepeat(b);return""});var g=e(b);if(g)b=g.element,this.content=this._text=g.text;if(g=a(b))b=g.element,this._attributes=g.attributes;if((this._name=b)&&!l.test(this._name))throw"Invalid abbreviation";},toString:function(){var a=f("utils"),b=this.start,e=this.end,c=this.content,g=this;d.each(s,function(a){b=a(b,g,"start");c=a(c,g,"content");e=a(e,g,
|
||||
"end")});var j=d.map(this.children,function(a){return a.toString()}).join(""),c=f("abbreviationUtils").insertChildContent(c,j,{keepVariable:!1});return b+a.padString(c,this.padding)+e},hasEmptyChildren:function(){return!!d.find(this.children,function(a){return a.isEmpty()})},hasImplicitName:function(){return!this._name&&!this.isTextNode()},isGroup:function(){return!this.abbreviation},isEmpty:function(){return!this.abbreviation&&!this.children.length},isRepeating:function(){return this.repeatCount>
|
||||
1||this.hasImplicitRepeat},isTextNode:function(){return!this.name()&&!this.attributeList().length},isElement:function(){return!this.isEmpty()&&!this.isTextNode()},deepestChild:function(){if(!this.children.length)return null;for(var a=this;a.children.length;)a=d.last(a.children);return a}};s.push(function(a,b){return f("utils").replaceCounter(a,b.counter,b.maxCount)});return{parse:function(a,e){var e=e||{},c=b(a);if(e.contextNode){c._name=e.contextNode.name;var g={};d.each(c._attributes,function(a){g[a.name]=
|
||||
a});d.each(e.contextNode.attributes,function(a){a.name in g?g[a.name].value=a.value:(a=d.clone(a),c._attributes.push(a),g[a.name]=a)})}d.each(q,function(a){a(c,e)});c=n(j(c));d.each(u,function(a){a(c,e)});return c},AbbreviationNode:h,addPreprocessor:function(a){d.include(q,a)||q.push(a)},removeFilter:function(a){preprocessor=d.without(q,a)},addPostprocessor:function(a){d.include(u,a)||u.push(a)},removePostprocessor:function(a){u=d.without(u,a)},addOutputProcessor:function(a){d.include(s,a)||s.push(a)},
|
||||
removeOutputProcessor:function(a){s=d.without(s,a)},isAllowedChar:function(a){a=String(a);return o(a)||~">+^[](){}".indexOf(a)}}});
|
||||
emmet.exec(function(f,d){function h(i,b){var c=f("resources"),a=f("elements"),g=f("abbreviationParser");d.each(d.clone(i.children),function(e){var j=c.getMatchedResource(e,b);if(d.isString(j))e.data("resource",a.create("snippet",j));else if(a.is(j,"reference")){j=g.parse(j.data,{syntax:b});if(e.repeatCount>1){var f=j.findAll(function(a){return a.hasImplicitRepeat});d.each(f,function(a){a.repeatCount=e.repeatCount;a.hasImplicitRepeat=!1})}var i=j.deepestChild();i&&d.each(e.children,function(a){i.addChild(a)});
|
||||
d.each(j.children,function(a){d.each(e.attributeList(),function(b){a.attribute(b.name,b.value)})});e.replace(j.children)}else e.data("resource",j);h(e,b)})}f("abbreviationParser").addPreprocessor(function(d,b){var c=b.syntax||emmet.defaultSyntax();h(d,c)})});
|
||||
emmet.exec(function(f,d){function h(a){for(var b=f("range"),c=[],a=f("stringStream").create(a);!a.eol();){if(a.peek()=="\\")a.next();else if(a.start=a.pos,a.match(g,!0)){c.push(b.create(a.start,g));continue}a.next()}return c}function i(a,b){var c=f("utils"),g=h(a);g.reverse();d.each(g,function(g){a=c.replaceSubstring(a,b,g)});return a}function b(a){return h(a.content).length?!0:!!d.find(a.attributeList(),function(a){return!!h(a.value).length})}function c(a,c,g){var h=a.findAll(function(a){return b(a)});
|
||||
b(a)&&h.unshift(a);h.length?d.each(h,function(a){a.content=i(a.content,c);d.each(a._attributes,function(a){a.value=i(a.value,c)})}):(a=a.deepestChild()||a,a.content=g?c:f("abbreviationUtils").insertChildContent(a.content,c))}var a=f("abbreviationParser"),g="$#";a.addPreprocessor(function(a,b){if(b.pastedContent){var c=f("utils"),g=d.map(c.splitByLines(b.pastedContent,!0),c.trim);a.findAll(function(a){if(a.hasImplicitRepeat)return a.data("paste",g),a.repeatCount=g.length})}});a.addPostprocessor(function(a,
|
||||
b){!a.findAll(function(a){var b=a.data("paste"),e="";d.isArray(b)?e=b[a.counter-1]:d.isFunction(b)?e=b(a.counter-1,a.content):b&&(e=b);e&&c(a,e,!!a.data("pasteOverwrites"));a.data("paste",null);return!!b}).length&&b.pastedContent&&c(a,b.pastedContent)})});emmet.exec(function(f,d){function h(i){var b=f("tagName");d.each(i.children,function(c){if(c.hasImplicitName()||c.data("forceNameResolving"))c._name=b.resolve(c.parent.name());h(c)});return i}f("abbreviationParser").addPostprocessor(h)});
|
||||
emmet.define("cssParser",function(f,d){function h(a){return typeof a!=="undefined"}function i(){return{"char":e.chnum,line:e.linenum}}function b(a,b,c){var g=e,c=c||{};j.push({charstart:h(c["char"])?c["char"]:g.chnum,charend:h(c.charend)?c.charend:g.chnum,linestart:h(c.line)?c.line:g.linenum,lineend:h(c.lineend)?c.lineend:g.linenum,value:a,type:b||a})}function c(a,b){var c=e,g=b||{},d=h(g["char"])?g["char"]:c.chnum,g=h(g.line)?g.line:c.linenum;return{name:"ParseError",message:a+" at line "+(g+1)+
|
||||
" char "+(d+1),walker:c,tokens:j}}function a(a){var c=e,g=c.ch,d=i(),j=a?a+g:g,g=c.nextChar();for(a&&(d["char"]-=a.length);o(g)||l(g);)j+=g,g=c.nextChar();b(j,"identifier",d)}function g(){var g=e.ch;if(g===" "||g==="\t"){for(var d=e.ch,j="",f=i();d===" "||d==="\t";)j+=d,d=e.nextChar();b(j,"white",f)}else{if(g==="/"){var d=e,g=f=d.ch,h,s=i();h=d.nextChar();if(h!=="*")s.charend=s["char"],s.lineend=s.line,j=b(g,g,s);else{for(;!(f==="*"&&h==="/");)g+=h,f=h,h=d.nextChar();g+=h;d.nextChar();b(g,"comment",
|
||||
s)}return j}if(g==='"'||g==="'"){d=e;g=f=j=d.ch;s=i();for(j=d.nextChar();j!==f;){if(j==="\n")if(h=d.nextChar(),h==="\\")g+=j+h;else throw c("Unterminated string",s);else g+=j==="\\"?j+d.nextChar():j;j=d.nextChar()}g+=j;d.nextChar();b(g,"string",s)}else if(g==="("){d=e;j=d.ch;f=0;g=j;h=i();for(j=d.nextChar();j!==")"&&!f;){if(j==="(")f++;else if(j===")")f--;else if(j===!1)throw c("Unterminated brace",h);g+=j;j=d.nextChar()}g+=j;d.nextChar();b(g,"brace",h)}else{if(g==="-"||g==="."||l(g)){j=e;f=j.ch;
|
||||
g=i();h=f;var s=h===".",v,f=j.nextChar();v=!l(f);if(s&&v)g.charend=g["char"],g.lineend=g.line,d=b(h,".",g);else if(h==="-"&&v)d=a("-");else{for(;f!==!1&&(l(f)||!s&&f===".");)f==="."&&(s=!0),h+=f,f=j.nextChar();b(h,"number",g)}return d}if(o(g))return a();if(n(g))return d=e,g=d.ch,j=i(),h=d.nextChar(),h==="="&&n(g,!0)?(g+=h,b(g,"match",j),d.nextChar(),f=void 0):(j.charend=j["char"]+1,j.lineend=j.line,b(g,g,j)),f;if(g==="\n")b("line"),e.nextChar();else throw c("Unrecognized character");}}}var e,j=[],
|
||||
n,o,l;e={lines:null,total_lines:0,linenum:-1,line:"",ch:"",chnum:-1,init:function(a){var b=e;b.lines=a.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n");b.total_lines=b.lines.length;b.chnum=-1;b.linenum=-1;b.ch="";b.line="";b.nextLine();b.nextChar()},nextLine:function(){this.linenum+=1;this.line=this.total_lines<=this.linenum?!1:this.lines[this.linenum];if(this.chnum!==-1)this.chnum=0;return this.line},nextChar:function(){for(this.chnum+=1;this.line.charAt(this.chnum)==="";){if(this.nextLine()===
|
||||
!1)return this.ch=!1;this.chnum=-1;return this.ch="\n"}return this.ch=this.line.charAt(this.chnum)},peek:function(){return this.line.charAt(this.chnum+1)}};o=function(a){return a=="&"||a==="_"||a==="-"||a>="a"&&a<="z"||a>="A"&&a<="Z"};l=function(a){return a!==!1&&a>="0"&&a<="9"};n=function(){for(var a="{}[]()+*=.,;:>~|\\%$#@^!".split(""),b="*^|$~".split(""),c={},e={},g=0;g<a.length;g+=1)c[a[g]]=!0;for(g=0;g<b.length;g+=1)e[b[g]]=!0;return function(a,b){return b?!!e[a]:!!c[a]}}();return{lex:function(a){e.init(a);
|
||||
for(j=[];e.ch!==!1;)g();return j},parse:function(a){var b=0;return d.map(this.lex(a),function(c){if(c.type=="line")c.value=a.charAt(b)=="\r"&&a.charAt(b+1)=="\n"?"\r\n":a.charAt(b);return{type:c.type,start:b,end:b+=c.value.length}})},toSource:function(a){for(var b=0,c=a.length,e,g="";b<c;b+=1)e=a[b],g+=e.type==="line"?"\n":e.value;return g}}});
|
||||
emmet.define("xmlParser",function(f){function d(a,e){function g(b){e.tokenize=b;return b(a,e)}var d=a.next();if(d=="<")if(a.eat("!"))return a.eat("[")?a.match("CDATA[")?g(b("atom","]]\>")):null:a.match("--")?g(b("comment","--\>")):a.match("DOCTYPE",!0,!0)?(a.eatWhile(/[\w\._\-]/),g(c(1))):null;else if(a.eat("?"))return a.eatWhile(/[\w\._\-]/),e.tokenize=b("meta","?>"),"meta";else{w=a.eat("/")?"closeTag":"openTag";a.eatSpace();for(v="";d=a.eat(/[^\s\u00a0=<>\"\'\/?]/);)v+=d;e.tokenize=h;return"tag"}else return d==
|
||||
"&"?(a.eat("#")?a.eat("x")?a.eatWhile(/[a-fA-F\d]/)&&a.eat(";"):a.eatWhile(/[\d]/)&&a.eat(";"):a.eatWhile(/[\w\.\-:]/)&&a.eat(";"))?"atom":"error":(a.eatWhile(/[^&<]/),"text")}function h(a,b){var c=a.next();return c==">"||c=="/"&&a.eat(">")?(b.tokenize=d,w=c==">"?"endTag":"selfcloseTag","tag"):c=="="?(w="equals",null):/[\'\"]/.test(c)?(b.tokenize=i(c),b.tokenize(a,b)):(a.eatWhile(/[^\s\u00a0=<>\"\'\/?]/),"word")}function i(a){return function(b,c){for(;!b.eol();)if(b.next()==a){c.tokenize=h;break}return"string"}}
|
||||
function b(a,b){return function(c,e){for(;!c.eol();){if(c.match(b)){e.tokenize=d;break}c.next()}return a}}function c(a){return function(b,e){for(var g;(g=b.next())!=null;)if(g=="<")return e.tokenize=c(a+1),e.tokenize(b,e);else if(g==">")if(a==1){e.tokenize=d;break}else return e.tokenize=c(a-1),e.tokenize(b,e);return"meta"}}function a(){for(var a=arguments.length-1;a>=0;a--)k.cc.push(arguments[a])}function g(){a.apply(null,arguments);return!0}function e(){if(k.context)k.context=k.context.prev}function j(a){if(a==
|
||||
"openTag")return k.tagName=v,g(m,n(k.startOfLine));else if(a=="closeTag")return a=!1,k.context?k.context.tagName!=v&&(s.implicitlyClosed.hasOwnProperty(k.context.tagName.toLowerCase())&&e(),a=!k.context||k.context.tagName!=v):a=!0,a&&(t="error"),g(o(a));return g()}function n(a){return function(b){if(b=="selfcloseTag"||b=="endTag"&&s.autoSelfClosers.hasOwnProperty(k.tagName.toLowerCase()))return l(k.tagName.toLowerCase()),g();if(b=="endTag"){l(k.tagName.toLowerCase());var b=k.tagName,c=s.doNotIndent.hasOwnProperty(b)||
|
||||
k.context&&k.context.noIndent;k.context={prev:k.context,tagName:b,indent:k.indented,startOfLine:a,noIndent:c}}return g()}}function o(a){return function(b){a&&(t="error");if(b=="endTag")return e(),g();t="error";return g(arguments.callee)}}function l(a){for(var b;;){if(!k.context)break;b=k.context.tagName.toLowerCase();if(!s.contextGrabbers.hasOwnProperty(b)||!s.contextGrabbers[b].hasOwnProperty(a))break;e()}}function m(b){if(b=="word")return t="attribute",g(p,m);if(b=="endTag"||b=="selfcloseTag")return a();
|
||||
t="error";return g(m)}function p(b){if(b=="equals")return g(r,m);s.allowMissing||(t="error");return b=="endTag"||b=="selfcloseTag"?a():g()}function r(b){if(b=="string")return g(q);if(b=="word"&&s.allowUnquoted)return t="string",g();t="error";return b=="endTag"||b=="selfCloseTag"?a():g()}function q(b){return b=="string"?g(q):a()}function u(a,b){if(a.sol())b.startOfLine=!0,b.indented=0;if(a.eatSpace())return null;t=w=v=null;var c=b.tokenize(a,b);b.type=w;if((c||w)&&c!="comment")for(k=b;;)if((b.cc.pop()||
|
||||
j)(w||c))break;b.startOfLine=!1;return t||c}var s={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!0,allowMissing:!0},v=null,w=null,k=null,t;return{parse:function(a,b){for(var b=b||0,c={tokenize:d,cc:[],indented:0,startOfLine:!0,tagName:null,context:null},e=f("stringStream").create(a),g=[];!e.eol();)g.push({type:u(e,c),start:e.start+b,end:e.pos+b}),e.start=e.pos;return g}}});
|
||||
emmet.define("string-score",function(){return{score:function(f,d,h){if(f==d)return 1;if(d=="")return 0;for(var i=0,b=d.length,c=f.length,a,g=1,e=0,j,n,o,l;e<b;++e){o=d.charAt(e);j=f.indexOf(o.toLowerCase());n=f.indexOf(o.toUpperCase());l=Math.min(j,n);n=l>-1?l:Math.max(j,n);if(n===-1)if(h){g+=1-h;continue}else return 0;else j=0.1;f[n]===o&&(j+=0.1);n===0?(j+=0.6,e===0&&(a=1)):f.charAt(n-1)===" "&&(j+=0.8);f=f.substring(n+1,c);i+=j}f=i/b;b=(f*(b/c)+f)/2;b/=g;a&&b+0.15<1&&(b+=0.15);return b}}});
|
||||
emmet.define("utils",function(f,d){function h(b){this._data=[];this.length=0;b&&this.append(b)}var i="${0}";h.prototype={append:function(b){this._data.push(b);this.length+=b.length},toString:function(){return this._data.join("")},valueOf:function(){return this.toString()}};return{reTag:/<\/?[\w:\-]+(?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*\s*(\/?)>$/,endsWithTag:function(b){return this.reTag.test(b)},isNumeric:function(b){typeof b=="string"&&(b=b.charCodeAt(0));return b&&b>47&&
|
||||
b<58},trim:function(b){return(b||"").replace(/^\s+|\s+$/g,"")},getNewline:function(){var b=f("resources");if(!b)return"\n";b=b.getVariable("newline");return d.isString(b)?b:"\n"},setNewline:function(b){var c=f("resources");c.setVariable("newline",b);c.setVariable("nl",b)},splitByLines:function(b,c){var a=this.getNewline(),a=(b||"").replace(/\r\n/g,"\n").replace(/\n\r/g,"\n").replace(/\r/g,"\n").replace(/\n/g,a).split(a);c&&(a=d.filter(a,function(a){return a.length&&!!this.trim(a)},this));return a},
|
||||
normalizeNewline:function(b){return this.splitByLines(b).join(this.getNewline())},repeatString:function(b,c){for(var a=[],g=0;g<c;g++)a.push(b);return a.join("")},getStringsPads:function(b){var b=d.map(b,function(a){return d.isString(a)?a.length:+a}),c=d.max(b);return d.map(b,function(a){return(a=c-a)?this.repeatString(" ",a):""},this)},padString:function(b,c){var a=d.isNumber(c)?this.repeatString(f("resources").getVariable("indentation")||"\t",c):c,g=[],e=this.splitByLines(b),j=this.getNewline();
|
||||
g.push(e[0]);for(var h=1;h<e.length;h++)g.push(j+a+e[h]);return g.join("")},zeroPadString:function(b,c){for(var a="",g=b.length;c>g++;)a+="0";return a+b},unindentString:function(b,c){for(var a=this.splitByLines(b),g=0;g<a.length;g++)a[g].search(c)==0&&(a[g]=a[g].substr(c.length));return a.join(this.getNewline())},replaceUnescapedSymbol:function(b,c,a){for(var g=0,e=b.length,j=c.length,f=0;g<e;)if(b.charAt(g)=="\\")g+=j+1;else if(b.substr(g,j)==c){var h=j;f++;var i=a;if(d.isFunction(a))(i=a(b,c,g,
|
||||
f))?(h=i[0].length,i=i[1]):i=!1;i===!1?g++:(b=b.substring(0,g)+i+b.substring(g+h),e=b.length,g+=i.length)}else g++;return b},replaceVariables:function(b,c){var c=c||{},a=d.isFunction(c)?c:function(a,b){return b in c?c[b]:null},g=f("resources");return f("tabStops").processText(b,{variable:function(b){var c=a(b.token,b.name,b);c===null&&(c=g.getVariable(b.name));if(c===null||d.isUndefined(c))c=b.token;return c}})},replaceCounter:function(b,c,a){b=String(b);c=String(c);/^\-?\d+$/.test(c)&&(c=+c);var g=
|
||||
this;return this.replaceUnescapedSymbol(b,"$",function(b,j,f){if(b.charAt(f+1)=="{"||g.isNumeric(b.charAt(f+1)))return!1;for(j=f+1;b.charAt(j)=="$"&&b.charAt(j+1)!="{";)j++;var h=j-f,i=0,m=!1,p;if(p=b.substr(j).match(/^@(\-?)(\d*)/))j+=p[0].length,p[1]&&(m=!0),i=parseInt(p[2]||1)-1;m&&a&&d.isNumber(c)&&(c=a-c+1);c+=i;return[b.substring(f,j),g.zeroPadString(c+"",h)]})},matchesTag:function(b){return this.reTag.test(b||"")},escapeText:function(b){return b.replace(/([\$\\])/g,"\\$1")},unescapeText:function(b){return b.replace(/\\(.)/g,
|
||||
"$1")},getCaretPlaceholder:function(){return d.isFunction(i)?i.apply(this,arguments):i},setCaretPlaceholder:function(b){i=b},getLinePadding:function(b){return(b.match(/^(\s+)/)||[""])[0]},getLinePaddingFromPosition:function(b,c){return this.getLinePadding(this.findNewlineBounds(b,c).substring(b))},escapeForRegexp:function(b){return b.replace(RegExp("[.*+?|()\\[\\]{}\\\\]","g"),"\\$&")},prettifyNumber:function(b,c){return b.toFixed(typeof c=="undefined"?2:c).replace(/\.?0+$/,"")},stringBuilder:function(b){return new h(b)},
|
||||
replaceSubstring:function(b,c,a,g){if(d.isObject(a)&&"end"in a)g=a.end,a=a.start;d.isString(g)&&(g=a+g.length);d.isUndefined(g)&&(g=a);return a<0||a>b.length?b:b.substring(0,a)+c+b.substring(g)},narrowToNonSpace:function(b,c,a){c=f("range").create(c,a);for(a=/[\s\n\r\u00a0]/;c.start<c.end;){if(!a.test(b.charAt(c.start)))break;c.start++}for(;c.end>c.start;)if(c.end--,!a.test(b.charAt(c.end))){c.end++;break}return c},findNewlineBounds:function(b,c){for(var a=b.length,g=0,e=a-1,d=c-1;d>0;d--){var h=
|
||||
b.charAt(d);if(h=="\n"||h=="\r"){g=d+1;break}}for(d=c;d<a;d++)if(h=b.charAt(d),h=="\n"||h=="\r"){e=d;break}return f("range").create(g,e-g)},deepMerge:function(){var b,c,a,g,e,j=arguments[0]||{},f=1,h=arguments.length;for(!d.isObject(j)&&!d.isFunction(j)&&(j={});f<h;f++)if((b=arguments[f])!=null)for(c in b)a=j[c],g=b[c],j!==g&&(g&&(d.isObject(g)||(e=d.isArray(g)))?(e?(e=!1,a=a&&d.isArray(a)?a:[]):a=a&&d.isObject(a)?a:{},j[c]=this.deepMerge(a,g)):g!==void 0&&(j[c]=g));return j}}});
|
||||
emmet.define("range",function(f,d){function h(b,c,a){switch(a){case "eq":case "==":return b===c;case "lt":case "<":return b<c;case "lte":case "<=":return b<=c;case "gt":case ">":return b>c;case "gte":case ">=":return b>=c}}function i(b,c){d.isObject(b)&&"start"in b?(this.start=Math.min(b.start,b.end),this.end=Math.max(b.start,b.end)):d.isArray(b)?(this.start=b[0],this.end=b[1]):(c=d.isString(c)?c.length:+c,this.start=b,this.end=b+c)}i.prototype={length:function(){return Math.abs(this.end-this.start)},
|
||||
equal:function(b){return this.cmp(b,"eq","eq")},shift:function(b){this.start+=b;this.end+=b;return this},overlap:function(b){return b.start<=this.end&&b.end>=this.start},intersection:function(b){if(this.overlap(b)){var c=Math.max(b.start,this.start);return new i(c,Math.min(b.end,this.end)-c)}return null},union:function(b){if(this.overlap(b)){var c=Math.min(b.start,this.start);return new i(c,Math.max(b.end,this.end)-c)}return null},inside:function(b){return this.cmp(b,"lte","gt")},contains:function(b){return this.cmp(b,
|
||||
"lt","gt")},include:function(){return this.cmp(loc,"lte","gte")},cmp:function(b,c,a){var g;b instanceof i?(g=b.start,b=b.end):g=b;return h(this.start,g,c||"<=")&&h(this.end,b,a||">")},substring:function(b){return this.length()>0?b.substring(this.start,this.end):""},clone:function(){return new i(this.start,this.length())},toArray:function(){return[this.start,this.end]},toString:function(){return"{"+this.start+", "+this.length()+"}"}};return{create:function(b,c){if(d.isUndefined(b)||b===null)return null;
|
||||
if(b instanceof i)return b;if(d.isObject(b)&&"start"in b&&"end"in b)c=b.end-b.start,b=b.start;return new i(b,c)},create2:function(b,c){d.isNumber(b)&&d.isNumber(c)&&(c-=b);return this.create(b,c)}}});
|
||||
emmet.define("handlerList",function(f,d){function h(){this._list=[]}h.prototype={add:function(f,b){this._list.push(d.extend({order:0},b||{},{fn:f}))},remove:function(f){this._list=d.without(this._list,d.find(this._list,function(b){return b.fn===f}))},list:function(){return d.sortBy(this._list,"order").reverse()},listFn:function(){return d.pluck(this.list(),"fn")},exec:function(f,b){var b=b||[],c=null;d.find(this.list(),function(a){c=a.fn.apply(a,b);if(c!==f)return!0});return c}};return{create:function(){return new h}}});
|
||||
emmet.define("tokenIterator",function(f,d){function h(d){this.tokens=d;this._position=0;this.reset()}h.prototype={next:function(){if(this.hasNext()){var d=this.tokens[++this._i];this._position=d.start;return d}return null},current:function(){return this.tokens[this._i]},position:function(){return this._position},hasNext:function(){return this._i<this._il-1},reset:function(){this._i=-1;this._il=this.tokens.length},item:function(){return this.tokens[this._i]},itemNext:function(){return this.tokens[this._i+
|
||||
1]},itemPrev:function(){return this.tokens[this._i-1]},nextUntil:function(f,b){for(var c,a=d.isString(f)?function(a){return a.type==f}:f;c=this.next();)if(b&&b.call(this,c),a.call(this,c))break}};return{create:function(d){return new h(d)}}});
|
||||
emmet.define("stringStream",function(){function f(d){this.pos=this.start=0;this.string=d}f.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==0},peek:function(){return this.string.charAt(this.pos)},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(d){var f=this.string.charAt(this.pos);if(typeof d=="string"?f==d:f&&(d.test?d.test(f):d(f)))return++this.pos,f},eatWhile:function(d){for(var f=this.pos;this.eat(d););
|
||||
return this.pos>f},eatSpace:function(){for(var d=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>d},skipToEnd:function(){this.pos=this.string.length},skipTo:function(d){d=this.string.indexOf(d,this.pos);if(d>-1)return this.pos=d,!0},skipToPair:function(d,f){for(var i=0,b,c=this.pos,a=this.string.length;c<a;)if(b=this.string.charAt(c++),b==d)i++;else if(b==f&&(i--,i<1))return this.pos=c,!0;return!1},backUp:function(d){this.pos-=d},match:function(d,f,i){if(typeof d==
|
||||
"string"){if(i=i?function(b){return b.toLowerCase()}:function(b){return b},i(this.string).indexOf(i(d),this.pos)==this.pos)return f!==!1&&(this.pos+=d.length),!0}else return(d=this.string.slice(this.pos).match(d))&&f!==!1&&(this.pos+=d[0].length),d},current:function(){return this.string.slice(this.start,this.pos)}};return{create:function(d){return new f(d)}}});
|
||||
emmet.define("resources",function(f,d){function h(a,c,g){var d=f("utils"),c=d.replaceUnescapedSymbol(c,"|",d.getCaretPlaceholder());if(g=="snippets")return f("elements").create("snippet",c);if(g=="abbreviations"){g=c;f("utils").trim(a);var a=f("elements"),h;return(h=b.exec(g))?a.create("element",h[1],h[2],h[4]=="/"):a.create("reference",g)}}var i={},b=/^<(\w+\:?[\w\-]*)((?:\s+[\w\:\-]+\s*=\s*(['"]).*?\3)*)\s*(\/?)>/,c={},a={},g=f("handlerList").create();return{setVocabulary:function(b,g){i={};g==
|
||||
"system"?c=b:a=b},getVocabulary:function(b){return b=="system"?c:a},getMatchedResource:function(a,b){return g.exec(null,d.toArray(arguments))||this.findSnippet(b,a.name())},getVariable:function(a){return(this.getSection("variables")||{})[a]},setVariable:function(a,b){var c=this.getVocabulary("user")||{};if(!("variables"in c))c.variables={};c.variables[a]=b;this.setVocabulary(c,"user")},hasSyntax:function(a){return a in this.getVocabulary("user")||a in this.getVocabulary("system")},addResolver:function(a,
|
||||
b){g.add(a,b)},removeResolver:function(a){g.remove(a)},getSection:function(b){if(!b)return null;b in i||(i[b]=f("utils").deepMerge({},c[b],a[b]));for(var g=i[b],h=d.rest(arguments),o;g&&(o=h.shift());)if(o in g)g=g[o];else return null;return g},findItem:function(a,b){for(var c=this.getSection(a);c;){if(b in c)return c[b];c=this.getSection(c["extends"])}},findSnippet:function(a,b,c){if(!a||!b)return null;var c=c||[],g=[b];~b.indexOf("-")&&g.push(b.replace(/\-/g,":"));var f=this.getSection(a),i=null;
|
||||
d.find(["snippets","abbreviations"],function(b){var c=this.getSection(a,b);if(c)return d.find(g,function(a){if(c[a])return i=h(a,c[a],b)})},this);c.push(a);return!i&&f["extends"]&&!d.include(c,f["extends"])?this.findSnippet(f["extends"],b,c):i},fuzzyFindSnippet:function(a,b,c){var c=c||0.3,a=this.getAllSnippets(a),g=f("string-score"),b=b.replace(/:$/,"").replace(/:/g,"-"),h=d.map(a,function(a,c){return{key:c,score:g.score(a.nk,b,0.1)}});if((h=d.last(d.sortBy(h,"score")))&&h.score>=c)return a[h.key].parsedValue},
|
||||
getAllSnippets:function(a){var b="all-"+a;if(!i[b]){var c=[],g=[];do{var f=this.getSection(a);if(!f)break;d.each(["snippets","abbreviations"],function(a){var b={};d.each(f[a]||null,function(c,g){b[g]={nk:g.replace(/:$/,"").replace(/:/g,"-"),value:c,parsedValue:h(g,c,a),type:a}});c.push(b)});g.push(a);a=f["extends"]}while(a&&!d.include(g,a));i[b]=d.extend.apply(d,c.reverse())}return i[b]}}});
|
||||
emmet.define("actions",function(f,d){function h(b){return f("utils").trim(b.charAt(0).toUpperCase()+b.substring(1).replace(/_[a-z]/g,function(b){return" "+b.charAt(1).toUpperCase()}))}var i={};return{add:function(b,c,a){b=b.toLowerCase();a=a||{};if(!a.label)a.label=h(b);i[b]={name:b,fn:c,options:a}},get:function(b){return i[b.toLowerCase()]},run:function(b,c){d.isArray(c)||(c=d.rest(arguments));var a=this.get(b);return a?a.fn.apply(emmet,c):(emmet.log('Action "%s" is not defined',b),!1)},getAll:function(){return i},
|
||||
getList:function(){return d.values(this.getAll())},getMenu:function(b){var c=[],b=b||[];d.each(this.getList(),function(a){if(!a.options.hidden&&!d.include(b,a.name)){var g=h(a.name),e=c;if(a.options.label)for(var j=a.options.label.split("/"),g=j.pop(),f,i;f=j.shift();)i=d.find(e,function(a){return a.type=="submenu"&&a.name==f}),i||(i={name:f,type:"submenu",items:[]},e.push(i)),e=i.items;e.push({type:"action",name:a.name,label:g})}});return c},getActionNameForMenuTitle:function(b,c){var a=null;d.find(c||
|
||||
this.getMenu(),function(c){if(c.type=="action"){if(c.label==b||c.name==b)return a=c.name}else return a=this.getActionNameForMenuTitle(b,c.items)},this);return a||null}}});
|
||||
emmet.define("profile",function(f,d){function h(a){d.extend(this,g,a)}function i(a,b){switch(String(b||"").toLowerCase()){case "lower":return a.toLowerCase();case "upper":return a.toUpperCase()}return a}function b(b,c){return a[b.toLowerCase()]=new h(c)}function c(){b("xhtml");b("html",{self_closing_tag:!1});b("xml",{self_closing_tag:!0,tag_nl:!0});b("plain",{tag_nl:!1,indent:!1,place_cursor:!1});b("line",{tag_nl:!1,indent:!1,extraFilters:"s"})}var a={},g={tag_case:"asis",attr_case:"asis",attr_quotes:"double",
|
||||
tag_nl:"decide",tag_nl_leaf:!1,place_cursor:!0,indent:!0,inline_break:3,self_closing_tag:"xhtml",filters:"",extraFilters:""};h.prototype={tagName:function(a){return i(a,this.tag_case)},attributeName:function(a){return i(a,this.attr_case)},attributeQuote:function(){return this.attr_quotes=="single"?"'":'"'},selfClosing:function(){return this.self_closing_tag=="xhtml"?" /":this.self_closing_tag===!0?"/":""},cursor:function(){return this.place_cursor?f("utils").getCaretPlaceholder():""}};c();return{create:function(a,
|
||||
c){return arguments.length==2?b(a,c):new h(d.defaults(a||{},g))},get:function(b,c){if(!b&&c){var g=f("resources").findItem(c,"profile");g&&(b=g)}return!b?a.plain:b instanceof h?b:d.isString(b)&&b.toLowerCase()in a?a[b.toLowerCase()]:this.create(b)},remove:function(b){b=(b||"").toLowerCase();b in a&&delete a[b]},reset:function(){a={};c()},stringCase:i}});
|
||||
emmet.define("editorUtils",function(f){return{isInsideTag:function(d,f){for(var i=/^<\/?\w[\w\:\-]*.*?>/,b=f;b>-1;){if(d.charAt(b)=="<")break;b--}return b!=-1&&(i=i.exec(d.substring(b)))&&f>b&&f<b+i[0].length?!0:!1},outputInfo:function(d,f,i){i=i||d.getProfileName();return{syntax:String(f||d.getSyntax()),profile:i?String(i):null,content:String(d.getContent())}},unindent:function(d,h){return f("utils").unindentString(h,this.getCurrentLinePadding(d))},getCurrentLinePadding:function(d){return f("utils").getLinePadding(d.getCurrentLine())}}});
|
||||
emmet.define("actionUtils",function(f){return{mimeTypes:{gif:"image/gif",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",svg:"image/svg+xml",html:"text/html",htm:"text/html"},extractAbbreviation:function(d){for(var h=d.length,i=-1,b=0,c=0,a=0,g=f("utils"),e=f("abbreviationParser");;){h--;if(h<0){i=0;break}var j=d.charAt(h);if(j=="]")c++;else if(j=="["){if(!c){i=h+1;break}c--}else if(j=="}")a++;else if(j=="{"){if(!a){i=h+1;break}a--}else if(j==")")b++;else if(j=="("){if(!b){i=h+1;break}b--}else if(!c&&
|
||||
!a&&(!e.isAllowedChar(j)||j==">"&&g.endsWithTag(d.substring(0,h+1)))){i=h+1;break}}return i!=-1&&!a&&!c&&!b?d.substring(i).replace(/^[\*\+\>\^]+/,""):""},getImageSize:function(d){var f=function(){return d.charCodeAt(i++)};if(d.substr(0,8)==="\u0089PNG\r\n\u001a\n"){var i=d.indexOf("IHDR")+4;return{width:f()<<24|f()<<16|f()<<8|f(),height:f()<<24|f()<<16|f()<<8|f()}}else if(d.substr(0,4)==="GIF8")return i=6,{width:f()|f()<<8,height:f()|f()<<8};else if(d.substr(0,2)==="\u00ff\u00d8")for(var i=2,b=d.length;i<
|
||||
b;){if(f()!=255)break;var c=f();if(c==218)break;var a=f()<<8|f();if(c>=192&&c<=207&&!(c&4)&&!(c&8))return i+=1,{height:f()<<8|f(),width:f()<<8|f()};else i+=a-2}},captureContext:function(d){if(String(d.getSyntax())in{html:1,xml:1,xsl:1}){var h=String(d.getContent()),i=f("htmlMatcher").find(h,d.getCaretPos());if(i&&i.type=="tag"){for(var d=/([\w\-:]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,i=i.open,h=i.range.substring(h).replace(/^<[\w\-\:]+/,""),i={name:i.name,attributes:[]},
|
||||
b;b=d.exec(h);)i.attributes.push({name:b[1],value:b[2]});return i}}return null},findExpressionBounds:function(d,h){for(var i=String(d.getContent()),b=i.length,c=d.getCaretPos()-1,a=c+1;c>=0&&h(i.charAt(c),c,i);)c--;for(;a<b&&h(i.charAt(a),a,i);)a++;if(a>c)return f("range").create([++c,a])},compoundUpdate:function(d,f){if(f){var i=d.getSelectionRange();d.replaceContent(f.data,f.start,f.end,!0);d.createSelection(f.caret,f.caret+i.end-i.start);return!0}return!1},detectSyntax:function(d,h){var i=h||"html";
|
||||
f("resources").hasSyntax(i)||(i="html");if(i=="html"&&(this.isStyle(d)||this.isInlineCSS(d)))i="css";return i},detectProfile:function(d){var h=d.getSyntax(),i=f("resources").findItem(h,"profile");if(i)return i;switch(h){case "xml":case "xsl":return"xml";case "css":if(this.isInlineCSS(d))return"line";break;case "html":return(i=f("resources").getVariable("profile"))||(i=this.isXHTML(d)?"xhtml":"html"),i}return"xhtml"},isXHTML:function(d){return d.getContent().search(/<!DOCTYPE[^>]+XHTML/i)!=-1},isStyle:function(d){var h=
|
||||
String(d.getContent()),d=d.getCaretPos();return(h=f("htmlMatcher").tag(h,d))&&h.open.name.toLowerCase()=="style"&&h.innerRange.cmp(d,"lte","gte")},isInlineCSS:function(d){var h=String(d.getContent()),d=d.getCaretPos();return(h=f("xmlEditTree").parseFromPosition(h,d,!0))?(h=h.itemFromPosition(d,!0))&&h.name().toLowerCase()=="style"&&h.valueRange(!0).cmp(d,"lte","gte"):!1}}});
|
||||
emmet.define("abbreviationUtils",function(f,d){return{isSnippet:function(d){return f("elements").is(d.matchedResource(),"snippet")},isUnary:function(d){var i=d.matchedResource();return d.children.length||this.isSnippet(d)?!1:i&&i.is_empty||f("tagName").isEmptyElement(d.name())},isInline:function(d){return d.isTextNode()||!d.name()||f("tagName").isInlineLevel(d.name())},isBlock:function(d){return this.isSnippet(d)||!this.isInline(d)},isSnippet:function(d){return f("elements").is(d.matchedResource(),
|
||||
"snippet")},hasTagsInContent:function(d){return f("utils").matchesTag(d.content)},hasBlockChildren:function(f){return this.hasTagsInContent(f)&&this.isBlock(f)||d.any(f.children,function(d){return this.isBlock(d)},this)},insertChildContent:function(h,i,b){var b=d.extend({keepVariable:!0,appendIfNoChild:!0},b||{}),c=!1,a=f("utils"),h=a.replaceVariables(h,function(g,e,d){var f=g;e=="child"&&(f=a.padString(i,a.getLinePaddingFromPosition(h,d.start)),c=!0,b.keepVariable&&(f+=g));return f});!c&&b.appendIfNoChild&&
|
||||
(h+=i);return h}}});
|
||||
emmet.define("base64",function(){return{encode:function(f){for(var d=[],h,i,b,c,a,g,e=0,j=f.length;e<j;)c=f.charCodeAt(e++),a=f.charCodeAt(e++),g=f.charCodeAt(e++),h=c&255,i=a&255,b=g&255,c=h>>2,h=(h&3)<<4|i>>4,i=(i&15)<<2|b>>6,b&=63,isNaN(a)?i=b=64:isNaN(g)&&(b=64),d.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(h)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(i)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(b));
|
||||
return d.join("")},decode:function(f){var d,h,i,b,c,a=0,g=0,e=[],j=f.length;if(!f)return f;f+="";do d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(f.charAt(a++)),h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(f.charAt(a++)),b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(f.charAt(a++)),c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(f.charAt(a++)),i=d<<18|h<<12|b<<6|c,d=i>>16&
|
||||
255,h=i>>8&255,i&=255,b==64?e[g++]=String.fromCharCode(d):c==64?e[g++]=String.fromCharCode(d,h):e[g++]=String.fromCharCode(d,h,i);while(a<j);return e.join("")}}});
|
||||
emmet.define("htmlMatcher",function(f,d){function h(b){var e={},d;return{open:function(a){return(a=this.matches(a))&&a.type=="open"?a:null},close:function(a){return(a=this.matches(a))&&a.type=="close"?a:null},matches:function(h){var i="p"+h;if(!(i in e)&&b.charAt(h)=="<"){var l=b.slice(h);e[i]=(d=l.match(c))?{name:d[1],selfClose:!!d[3],range:f("range").create(h,d[0]),type:"open"}:(d=l.match(a))?{name:d[1],range:f("range").create(h,d[0]),type:"close"}:!1}return e[i]},text:function(){return b}}}function i(a,
|
||||
b,c){return a.substring(b,b+c.length)==c}function b(a,b){for(var c=[],f=null,h=b.text(),l=a.range.end,m=h.length;l<m;l++){if(i(h,l,"<\!--"))for(f=l;f<m;f++)if(i(h,f,"--\>")){l=f+3;break}if(f=b.matches(l))if(f.type=="open"&&!f.selfClose)c.push(f.name);else if(f.type=="close"){if(!c.length)return f.name==a.name?f:null;if(d.last(c)==f.name)c.pop();else{for(var p=!1;c.length&&!p;)c.pop()==f.name&&(p=!0);if(!c.length&&!p)return f.name==a.name?f:null}}}}var c=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
|
||||
a=/^<\/([\w\:\-]+)[^>]*>/;return{find:function(a,c){for(var j=f("range"),n=h(a),o=null,l=null,m=c;m>=0;m--)if(o=n.open(m))if(o.selfClose){if(o.range.cmp(c,"lt","gt"))break}else{if(l=b(o,n)){if(j.create2(o.range.start,l.range.end).contains(c))break}else if(o.range.contains(c))break;o=null}else if(i(a,m,"--\>"))for(var p=m-1;p>=0;p--)if(i(a,p,"--\>"))break;else{if(i(a,p,"<\!--")){m=p;break}}else if(i(a,m,"<\!--")){p=m+4;for(o=a.length;p<o;p++)if(i(a,p,"--\>")){p+=3;break}o={range:f("range").create(m,
|
||||
d.isNumber(p)?p-m:p[0]),type:"comment"};break}if(o)return p=m=null,l?(m=j.create2(o.range.start,l.range.end),p=j.create2(o.range.end,l.range.start)):m=p=j.create2(o.range.start,o.range.end),o.type=="comment"&&(j=m.substring(a),p.start+=j.length-j.replace(/^<\!--\s*/,"").length,p.end-=j.length-j.replace(/\s*--\>$/,"").length),{open:o,close:l,type:o.type=="comment"?"comment":"tag",innerRange:p,innerContent:function(){return this.innerRange.substring(a)},outerRange:m,outerContent:function(){return this.outerRange.substring(a)},
|
||||
range:!p.length()||!p.cmp(c,"lte","gte")?m:p,content:function(){return this.range.substring(a)},source:a}},tag:function(a,b){var c=this.find(a,b);if(c&&c.type=="tag")return c}}});
|
||||
emmet.define("tabStops",function(f,d){var h=100,i=0,b={replaceCarets:!1,escape:function(b){return"\\"+b},tabstop:function(b){return b.token},variable:function(b){return b.token}};f("abbreviationParser").addOutputProcessor(function(b,a){var g=0,e=f("tabStops"),d=f("utils"),h={tabstop:function(a){var b=parseInt(a.group);if(b==0)return"${0}";b>g&&(g=b);return a.placeholder?(b+=i,a=e.processText(a.placeholder,h),"${"+b+":"+a+"}"):"${"+(b+i)+"}"}},b=e.processText(b,h),b=d.replaceVariables(b,e.variablesResolver(a));
|
||||
i+=g+1;return b});return{extract:function(c,a){var g=f("utils"),e={carets:""},j=[],a=d.extend({},b,a,{tabstop:function(a){var b=a.token,c="";if(a.placeholder=="cursor")j.push({start:a.start,end:a.start+b.length,group:"carets",value:""});else{if("placeholder"in a)e[a.group]=a.placeholder;a.group in e&&(c=e[a.group]);j.push({start:a.start,end:a.start+b.length,group:a.group,value:c})}return b}});a.replaceCarets&&(c=c.replace(RegExp(g.escapeForRegexp(g.getCaretPlaceholder()),"g"),"${0:cursor}"));var c=
|
||||
this.processText(c,a),h=g.stringBuilder(),i=0,g=d.map(j,function(a){h.append(c.substring(i,a.start));var b=h.length,g=e[a.group]||"";h.append(g);i=a.end;return{group:a.group,start:b,end:b+g.length}});h.append(c.substring(i));return{text:h.toString(),tabstops:d.sortBy(g,"start")}},processText:function(c,a){for(var a=d.extend({},b,a),g=f("utils").stringBuilder(),e=f("stringStream").create(c),j,h;j=e.next();)if(j=="\\"&&!e.eol())g.append(a.escape(e.next()));else{h=j;if(j=="$")if(e.start=e.pos-1,e.match(/^[0-9]+/))h=
|
||||
a.tabstop({start:g.length,group:e.current().substr(1),token:e.current()});else if(j=e.match(/^\{([a-z_\-][\w\-]*)\}/))h=a.variable({start:g.length,name:j[1],token:e.current()});else if(j=e.match(/^\{([0-9]+)(:.+?)?\}/,!1)){e.skipToPair("{","}");h={start:g.length,group:j[1],token:e.current()};if(j=h.token.substring(h.group.length+2,h.token.length-1))h.placeholder=j.substr(1);h=a.tabstop(h)}g.append(h)}return g.toString()},upgrade:function(b,a){var g=0,e={tabstop:function(b){var c=parseInt(b.group);
|
||||
c>g&&(g=c);return b.placeholder?"${"+(c+a)+":"+b.placeholder+"}":"${"+(c+a)+"}"}};d.each(["start","end","content"],function(a){b[a]=this.processText(b[a],e)},this);return g},variablesResolver:function(b){var a={},g=f("resources");return function(e,j){if(j=="child")return e;if(j=="cursor")return f("utils").getCaretPlaceholder();var i=b.attribute(j);if(!d.isUndefined(i)&&i!==e)return i;if(i=g.getVariable(j))return i;a[j]||(a[j]=h++);return"${"+a[j]+":"+j+"}"}},resetTabstopIndex:function(){i=0;h=100}}});
|
||||
emmet.define("preferences",function(f,d){var h={},i={},b=null,c=null;return{define:function(a,b,c){var f=a;d.isString(a)&&(f={},f[a]={value:b,description:c});d.each(f,function(a,b){i[b]=d.isObject(a)&&"value"in a&&d.keys(a).length<3?a:{value:a}})},set:function(a,b){var c=a;d.isString(a)&&(c={},c[a]=b);d.each(c,function(a,b){if(!(b in i))throw'Property "'+b+'" is not defined. You should define it first with `define` method of current module';if(a!==i[b].value){switch(typeof i[b].value){case "boolean":var c=
|
||||
a;d.isString(c)?(c=c.toLowerCase(),a=c=="yes"||c=="true"||c=="1"):a=!!c;break;case "number":a=parseInt(a+"",10)||0;break;default:a+=""}h[b]=a}else b in h&&delete h[b]})},get:function(a){if(a in h)return h[a];if(a in i)return i[a].value},getArray:function(a){a=this.get(a);d.isUndefined(a)||(a=d.map(a.split(","),f("utils").trim),a.length||(a=null));return a},getDict:function(a){var b={};d.each(this.getArray(a),function(a){a=a.split(":");b[a[0]]=a[1]});return b},description:function(a){return a in i?
|
||||
i[a].description:void 0},remove:function(a){d.isArray(a)||(a=[a]);d.each(a,function(a){a in h&&delete h[a];a in i&&delete i[a]})},list:function(){return d.map(d.keys(i).sort(),function(a){return{name:a,value:this.get(a),type:typeof i[a].value,description:i[a].description}},this)},load:function(a){d.each(a,function(a,b){this.set(b,a)},this)},exportModified:function(){return d.clone(h)},reset:function(){h={}},_startTest:function(){b=i;c=h;i={};h={}},_stopTest:function(){i=b;h=c}}});
|
||||
emmet.define("filters",function(f,d){function h(b){return!b?[]:d.isString(b)?b.split(/[\|,]/g):b}var i={};return{add:function(b,c){i[b]=c},apply:function(b,c,a){var g=f("utils"),a=f("profile").get(a);d.each(h(c),function(c){(c=g.trim(c.toLowerCase()))&&c in i&&(b=i[c](b,a))});return b},composeList:function(b,c,a){c=f("profile").get(c);b=h(c.filters||f("resources").findItem(b,"filters")||"html");c.extraFilters&&(b=b.concat(h(c.extraFilters)));a&&(b=b.concat(h(a)));if(!b||!b.length)b=h("html");return b},
|
||||
extractFromAbbreviation:function(b){var c="",b=b.replace(/\|([\w\|\-]+)$/,function(a,b){c=b;return""});return[b,h(c)]}}});
|
||||
emmet.define("elements",function(f,d){function h(a){return{data:a}}var i={},b=/([\w\-]+)\s*=\s*(['"])(.*?)\2/g,c={add:function(a,b){var c=this;i[a]=function(){var d=b.apply(c,arguments);if(d)d.type=a;return d}},get:function(a){return i[a]},create:function(a){var b=[].slice.call(arguments,1),c=this.get(a);return c?c.apply(this,b):null},is:function(a,b){return a&&a.type===b}};c.add("element",function(a,c,e){var f={name:a,is_empty:!!e};if(c)if(f.attributes=[],d.isArray(c))f.attributes=c;else if(d.isString(c))for(;a=
|
||||
b.exec(c);)f.attributes.push({name:a[1],value:a[3]});else d.each(c,function(a,b){f.attributes.push({name:b,value:a})});return f});c.add("snippet",h);c.add("reference",h);c.add("empty",function(){return{}});return c});
|
||||
emmet.define("editTree",function(f,d,h){function i(a,b){this.options=d.extend({offset:0},b);this.source=a;this._children=[];this._positions={name:0};this.initialize.apply(this,arguments)}function b(a,b,c){this.parent=a;this._name=b.value;this._value=c?c.value:"";this._positions={name:b.start,value:c?c.start:-1};this.initialize.apply(this,arguments)}var c=f("range").create;i.extend=h.extend;i.prototype={initialize:function(){},_updateSource:function(a,b,e){var j=c(b,d.isUndefined(e)?0:e-b),h=a.length-
|
||||
j.length(),i=function(a){d.each(a,function(b,c){b>=j.end&&(a[c]+=h)})};i(this._positions);d.each(this.list(),function(a){i(a._positions)});this.source=f("utils").replaceSubstring(this.source,a,j)},add:function(a,c){var d=new b(a,c);this._children.push(d);return d},get:function(a){return d.isNumber(a)?this.list()[a]:d.isString(a)?d.find(this.list(),function(b){return b.name()===a}):a},getAll:function(a){d.isArray(a)||(a=[a]);var b=[],c=[];d.each(a,function(a){d.isString(a)?b.push(a):d.isNumber(a)&&
|
||||
c.push(a)});return d.filter(this.list(),function(a,f){return d.include(c,f)||d.include(b,a.name())})},value:function(a,b,c){var f=this.get(a);if(f)return f.value(b);if(!d.isUndefined(b))return this.add(a,b,c)},values:function(a){return d.map(this.getAll(a),function(a){return a.value()})},remove:function(a){if(a=this.get(a))this._updateSource("",a.fullRange()),this._children=d.without(this._children,a)},list:function(){return this._children},indexOf:function(a){return d.indexOf(this.list(),this.get(a))},
|
||||
name:function(a){if(!d.isUndefined(a)&&this._name!==(a=String(a)))this._updateSource(a,this._positions.name,this._positions.name+this._name.length),this._name=a;return this._name},nameRange:function(a){return c(this._positions.name+(a?this.options.offset:0),this.name())},range:function(a){return c(a?this.options.offset:0,this.toString())},itemFromPosition:function(a,b){return d.find(this.list(),function(c){return c.range(b).inside(a)})},toString:function(){return this.source}};b.extend=h.extend;b.prototype=
|
||||
{initialize:function(){},_pos:function(a,b){return a+(b?this.parent.options.offset:0)},value:function(a){if(!d.isUndefined(a)&&this._value!==(a=String(a)))this.parent._updateSource(a,this.valueRange()),this._value=a;return this._value},name:function(a){if(!d.isUndefined(a)&&this._name!==(a=String(a)))this.parent._updateSource(a,this.nameRange()),this._name=a;return this._name},namePosition:function(a){return this._pos(this._positions.name,a)},valuePosition:function(a){return this._pos(this._positions.value,
|
||||
a)},range:function(a){return c(this.namePosition(a),this.toString())},fullRange:function(a){return this.range(a)},nameRange:function(a){return c(this.namePosition(a),this.name())},valueRange:function(a){return c(this.valuePosition(a),this.value())},toString:function(){return this.name()+this.value()},valueOf:function(){return this.toString()}};return{EditContainer:i,EditElement:b,createToken:function(a,b,c){a={start:a||0,value:b||"",type:c};a.end=a.start+a.value.length;return a}}});
|
||||
emmet.define("cssEditTree",function(f,d){function h(a,b){return f("range").create(a,b)}function i(a,b){var b=b||g|e,c=["white","line"];if((b&e)==e)for(;a.length&&d.include(c,d.last(a).type);)a.pop();if((b&g)==g)for(;a.length&&d.include(c,a[0].type);)a.shift();return a}function b(a){var b=["white","line",":"],c=[],f,j;a.nextUntil(function(){return!d.include(b,this.itemNext().type)});for(j=a.current().end;f=a.next();){if(f.type=="}"||f.type==";")return i(c,g|(f.type=="}"?e:0)),c.length?(j=c[0].start,
|
||||
a=d.last(c).end):a=j,h(j,a-j);c.push(f)}if(c.length)return h(c[0].start,d.last(c).end-c[0].start)}function c(a){var b=f("stringStream").create(a),c=[],g=/[\s\u00a0,]/,e=function(){b.next();c.push(h(b.start,b.current()));b.start=b.pos};b.eatSpace();for(b.start=b.pos;a=b.next();)if(a=='"'||a=="'"){b.next();if(!b.skipTo(a))break;e()}else if(a=="("){b.backUp(1);if(!b.skipToPair("(",")"))break;b.backUp(1);e()}else if(g.test(a))c.push(h(b.start,b.current().length-1)),b.eatWhile(g),b.start=b.pos;e();return d.chain(c).filter(function(a){return!!a.length()}).uniq(!1,
|
||||
function(a){return a.toString()}).value()}var a={styleBefore:"\n\t",styleSeparator:": ",offset:0},g=1,e=2,j=f("editTree").EditContainer.extend({initialize:function(c){d.defaults(this.options,a);var g=f("editTree"),e=f("tokenIterator").create(f("cssParser").parse(c)),j,r=[],q;for(j=e.position();q=e.next();){if(q.type=="{")break;r.push(q)}i(r);r.length?(j=r[0].start,r=d.last(r).end):r=j;j=h(j,r-j);this._positions.name=j.start;this._name=j.substring(c);if(!e.current()||e.current().type!="{")throw"Invalid CSS rule";
|
||||
for(this._positions.contentStart=e.position()+1;j=e.next();){if(r=j.type=="identifier")a:{r=e.tokens;q=e._i+1;for(var u=r.length;q<u;q++){if(r[q].type==":"){r=!0;break a}if(r[q].type=="identifier"||r[q].type=="line"){r=!1;break a}}r=!1}r&&(j=h(j),r=b(e),q=e.current()&&e.current().type==";"?h(e.current()):h(r.end,0),this._children.push(new n(this,g.createToken(j.start,j.substring(c)),g.createToken(r.start,r.substring(c)),g.createToken(q.start,q.substring(c)))))}this._saveStyle()},_saveStyle:function(){var a=
|
||||
this._positions.contentStart,b=this.source,c=f("utils");d.each(this.list(),function(g){g.styleBefore=b.substring(a,g.namePosition());var e=c.splitByLines(g.styleBefore);if(e.length>1)g.styleBefore="\n"+d.last(e);g.styleSeparator=b.substring(g.nameRange().end,g.valuePosition());g.styleBefore=d.last(g.styleBefore.split("*/"));g.styleSeparator=g.styleSeparator.replace(/\/\*.*?\*\//g,"");a=g.range().end})},add:function(a,b,c){var g=this.list(),e=this._positions.contentStart,j=d.pick(this.options,"styleBefore",
|
||||
"styleSeparator"),h=f("editTree");if(d.isUndefined(c))c=g.length;var i=g[c];if(i)e=i.fullRange().start;else if(i=g[c-1])i.end(";"),e=i.range().end;i&&(j=d.pick(i,"styleBefore","styleSeparator"));a=h.createToken(e+j.styleBefore.length,a);b=h.createToken(a.end+j.styleSeparator.length,b);h=new n(this,a,b,h.createToken(b.end,";"));d.extend(h,j);this._updateSource(h.styleBefore+h.toString(),e);this._children.splice(c,0,h);return h}}),n=f("editTree").EditElement.extend({initialize:function(a,b,c,g){this.styleBefore=
|
||||
a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;this._end=g.value;this._positions.end=g.start},valueParts:function(a){var b=c(this.value());if(a){var g=this.valuePosition(!0);d.each(b,function(a){a.shift(g)})}return b},end:function(a){if(!d.isUndefined(a)&&this._end!==a)this.parent._updateSource(a,this._positions.end,this._positions.end+this._end.length),this._end=a;return this._end},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+
|
||||
this.styleSeparator+this.value()+this.end()}});return{parse:function(a,b){return new j(a,b)},parseFromPosition:function(a,b,c){c=this.extractRule(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractRule:function(a,b,c){for(var g="",d=a.length,e=-1,j;b>=0;){j=a.charAt(b);if(j=="{"){e=b;break}else if(j=="}"&&!c){b++;break}b--}for(;b<d;){j=a.charAt(b);if(j=="{")e=b;else if(j=="}"){e!=-1&&(g=a.substring(e,b+1));break}b++}if(g){b=e-1;for(c="";b>=0;){j=a.charAt(b);if("{}/\\<>\n\r".indexOf(j)!=
|
||||
-1)break;b--}c=a.substring(b+1,e).replace(/^[\s\n\r]+/m,"");return f("range").create(e-c.length,g.length+c.length)}return null},baseName:function(a){return a.replace(/^\s*\-\w+\-/,"")},findParts:c}});
|
||||
emmet.define("xmlEditTree",function(f,d){var h={styleBefore:" ",styleSeparator:"=",styleQuote:'"',offset:0},i=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/m,b=f("editTree").EditContainer.extend({initialize:function(a){d.defaults(this.options,h);this._positions.name=1;var b=null,e=f("xmlParser").parse(a),j=f("range");d.each(e,function(e){e.value=j.create(e).substring(a);switch(e.type){case "tag":if(/^<[^\/]+/.test(e.value))this._name=e.value.substring(1);
|
||||
break;case "attribute":b&&this._children.push(new c(this,b));b=e;break;case "string":this._children.push(new c(this,b,e)),b=null}},this);b&&this._children.push(new c(this,b));this._saveStyle()},_saveStyle:function(){var a=this.nameRange().end,b=this.source;d.each(this.list(),function(c){c.styleBefore=b.substring(a,c.namePosition());if(c.valuePosition()!==-1)c.styleSeparator=b.substring(c.namePosition()+c.name().length,c.valuePosition()-c.styleQuote.length);a=c.range().end})},add:function(a,b,e){var j=
|
||||
this.list(),h=this.nameRange().end,i=f("editTree"),l=d.pick(this.options,"styleBefore","styleSeparator","styleQuote");if(d.isUndefined(e))e=j.length;var m=j[e];if(m)h=m.fullRange().start;else if(m=j[e-1])h=m.range().end;m&&(l=d.pick(m,"styleBefore","styleSeparator","styleQuote"));b=l.styleQuote+b+l.styleQuote;a=new c(this,i.createToken(h+l.styleBefore.length,a),i.createToken(h+l.styleBefore.length+a.length+l.styleSeparator.length,b));d.extend(a,l);this._updateSource(a.styleBefore+a.toString(),h);
|
||||
this._children.splice(e,0,a);return a}}),c=f("editTree").EditElement.extend({initialize:function(a,b,c){this.styleBefore=a.options.styleBefore;this.styleSeparator=a.options.styleSeparator;b="";a=a.options.styleQuote;if(c)b=c.value,a=b.charAt(0),a=='"'||a=="'"?b=b.substring(1):a="",a&&b.charAt(b.length-1)==a&&(b=b.substring(0,b.length-1));this.styleQuote=a;this._value=b;this._positions.value=c?c.start+a.length:-1},fullRange:function(a){a=this.range(a);a.start-=this.styleBefore.length;return a},toString:function(){return this.name()+
|
||||
this.styleSeparator+this.styleQuote+this.value()+this.styleQuote}});return{parse:function(a,c){return new b(a,c)},parseFromPosition:function(a,b,c){c=this.extractTag(a,b,c);return!c||!c.inside(b)?null:this.parse(c.substring(a),{offset:c.start})},extractTag:function(a,b,c){var d=a.length,h,o=f("range"),l=Math.min(2E3,d),m=null,p=function(b){var c;if(a.charAt(b)=="<"&&(c=a.substr(b,l).match(i)))return o.create(b,c[0])};for(h=b;h>=0;h--)if(m=p(h))break;if(m&&(m.inside(b)||c))return m;if(!m&&c)return null;
|
||||
for(h=b;h<d;h++)if(m=p(h))return m}}});
|
||||
emmet.define("expandAbbreviation",function(f,d){var h=f("handlerList").create(),i=null,b=f("actions");b.add("expand_abbreviation",function(b,a,g){var e=d.toArray(arguments),j=f("editorUtils").outputInfo(b,a,g);e[1]=j.syntax;e[2]=j.profile;return h.exec(!1,e)});b.add("expand_abbreviation_with_tab",function(c,a,d){var e=c.getSelection(),j=f("resources").getVariable("indentation");if(e)return d=f("utils"),a=f("range").create(c.getSelectionRange()),e=d.padString(e,j),c.replaceContent(j+"${0}",c.getCaretPos()),
|
||||
j=f("range").create(c.getCaretPos(),a.length()),c.replaceContent(e,j.start,j.end,!0),c.createSelection(j.start,j.start+e.length),!0;b.run("expand_abbreviation",c,a,d)||c.replaceContent(j,c.getCaretPos());return!0},{hidden:!0});h.add(function(b,a,d){var e=b.getSelectionRange().end,j=i.findAbbreviation(b);return j&&(a=emmet.expandAbbreviation(j,a,d,f("actionUtils").captureContext(b)))?(b.replaceContent(a,e-j.length,e),!0):!1},{order:-1});return i={addHandler:function(b,a){h.add(b,a)},removeHandler:function(b){h.remove(b,
|
||||
options)},findAbbreviation:function(b){var a=f("range").create(b.getSelectionRange()),d=String(b.getContent());if(a.length())return a.substring(d);b=b.getCurrentLineRange();return f("actionUtils").extractAbbreviation(d.substring(b.start,a.start))}}});
|
||||
emmet.define("wrapWithAbbreviation",function(f){var d=null;f("actions").add("wrap_with_abbreviation",function(h,i,b,c){var b=f("editorUtils").outputInfo(h,b,c),a=f("utils"),c=f("editorUtils"),i=i||h.prompt("Enter abbreviation");if(!i)return null;var i=String(i),g=f("range").create(h.getSelectionRange());if(!g.length()){g=f("htmlMatcher").tag(b.content,g.start);if(!g)return!1;g=a.narrowToNonSpace(b.content,g.range)}a=a.escapeText(g.substring(b.content));return(i=d.wrap(i,c.unindent(h,a),b.syntax,b.profile,
|
||||
f("actionUtils").captureContext(h)))?(h.replaceContent(i,g.start,g.end),!0):!1});return d={wrap:function(d,i,b,c,a){var g=f("filters"),e=f("utils"),b=b||emmet.defaultSyntax(),c=f("profile").get(c,b);f("tabStops").resetTabstopIndex();d=g.extractFromAbbreviation(d);return(i=f("abbreviationParser").parse(d[0],{syntax:b,pastedContent:i,contextNode:a}))?(b=g.composeList(b,c,d[1]),g.apply(i,b,c),e.replaceVariables(i.toString())):null}}});
|
||||
emmet.exec(function(f,d){function h(b,a){var g=a-(b.options.offset||0),e=/^[\s\n\r]/;return d.find(b.list(),function(a){return a.range().end===g?e.test(b.source.charAt(g)):a.range().inside(g)})}function i(b,a,d,e){for(var j=-1,h=-1;a--;)if(b.substr(a,d.length)==d){j=a;break}if(j!=-1){a=j;for(d=b.length;d>=a++;)if(b.substr(a,e.length)==e){h=a+e.length;break}}return j!=-1&&h!=-1?f("range").create(j,h-j):null}function b(b,a,d,e){function j(b){return b.replace(RegExp("^"+p.escapeForRegexp(a)+"\\s*"),
|
||||
function(a){l-=a.length;return""}).replace(RegExp("\\s*"+p.escapeForRegexp(d)+"$"),"")}var h=f("editorUtils"),o=h.outputInfo(b).content,l=b.getCaretPos(),m=null,p=f("utils");(m=i(o,l,a,d))&&m.overlap(e)?(e=m,m=j(e.substring(o))):(m=a+" "+e.substring(o).replace(RegExp(p.escapeForRegexp(a)+"\\s*|\\s*"+p.escapeForRegexp(d),"g"),"")+" "+d,l+=a.length+1);return m!==null?(m=p.escapeText(m),b.setCaretPos(e.start),b.replaceContent(h.unindent(b,m),e.start,e.end),b.setCaretPos(l),!0):!1}f("actions").add("toggle_comment",
|
||||
function(c){var a=f("editorUtils").outputInfo(c);if(a.syntax=="css"){var d=c.getCaretPos(),e=f("htmlMatcher").tag(a.content,d);if(e&&e.open.range.inside(d))a.syntax="html"}if(a.syntax=="css"){e=f("range").create(c.getSelectionRange());a=f("editorUtils").outputInfo(c);if(!e.length()&&(d=f("cssEditTree").parseFromPosition(a.content,c.getCaretPos())))e=(e=h(d,c.getCaretPos()))?e.range(!0):f("range").create(d.nameRange(!0).start,d.source);e.length()||(e=f("range").create(c.getCurrentLineRange()),f("utils").narrowToNonSpace(a.content,
|
||||
e));c=b(c,"/*","*/",e)}else{a=f("range").create(c.getSelectionRange());d=f("editorUtils").outputInfo(c);if(!a.length()&&(d=f("htmlMatcher").tag(d.content,c.getCaretPos())))a=d.outerRange;c=b(c,"<\!--","--\>",a)}return c})});
|
||||
emmet.exec(function(f){function d(d,f,b){function c(b){for(var c=b;c>=0;){var d=a.charAt(c);if(d=="\n"||d=="\r")break;c--}return a.substring(c,b)}for(var f=f||1,b=d.getCaretPos()+(b||0),a=String(d.getContent()),d=a.length,g=-1,e=/^\s+$/;b<=d&&b>=0;){b+=f;var j=a.charAt(b),n=a.charAt(b+1),o=a.charAt(b-1);switch(j){case '"':case "'":n==j&&o=="="&&(g=b+1);break;case ">":n=="<"&&(g=b+1);break;case "\n":case "\r":e.test(c(b-1))&&(g=b)}if(g!=-1)break}return g}f=f("actions");f.add("prev_edit_point",function(f){var i=
|
||||
f.getCaretPos(),b=d(f,-1);b==i&&(b=d(f,-1,-2));return b!=-1?(f.setCaretPos(b),!0):!1},{label:"Previous Edit Point"});f.add("next_edit_point",function(f){var i=d(f,1);return i!=-1?(f.setCaretPos(i),!0):!1})});
|
||||
emmet.exec(function(f,d){function h(a,b,c,d){var e=f("range"),g=f("editorUtils").outputInfo(a).content,j=g.length,h,i=e.create(-1,0),m=e.create(a.getSelectionRange());h=m.start;for(var n=1E5;h>=0&&h<j&&--n>0;){if(e=c(g,h,b)){if(i.equal(e))break;i=e.clone();if(h=d(e.substring(g),e.start,m.clone()))return a.createSelection(h.start,h.end),!0;else h=b?e.start:e.end-1}h+=b?-1:1}return!1}function i(a){var b=!0;return h(a,!1,function(a,c){if(b){b=!1;var d;a:{d=c;for(var g;d>=0;){if(g=e(a,d)){d=g;break a}d--}d=
|
||||
null}return d}else return e(a,c)},function(a,b,c){return g(a,b,c,!1)})}function b(a){return h(a,!0,e,function(a,b,c){return g(a,b,c,!0)})}function c(b,c,e){var e=e||0,g=f("range"),h=[],k=-1,i="",m="",n,l;d.each(c,function(c){switch(c.type){case "tag":l=b.substring(c.start,c.end);/^<[\w\:\-]/.test(l)&&h.push(g.create({start:c.start+1,end:c.end}));break;case "attribute":k=c.start;i=b.substring(c.start,c.end);break;case "string":h.push(g.create(k,c.end-k)),n=g.create(c),m=n.substring(b),j(m.charAt(0))&&
|
||||
n.start++,j(m.charAt(m.length-1))&&n.end--,h.push(n),i=="class"&&(h=h.concat(a(n.substring(b),n.start)))}});d.each(h,function(a){a.shift(e)});return d.chain(h).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}function a(a,b){var b=b||0,c=[],d=f("stringStream").create(a),e=f("range");d.eatSpace();d.start=d.pos;for(var g;g=d.next();)if(/[\s\u00a0]/.test(g))c.push(e.create(d.start+b,d.pos-d.start-1)),d.eatSpace(),d.start=d.pos;c.push(e.create(d.start+b,d.pos-
|
||||
d.start));return c}function g(a,b,e,g){a=c(a,f("xmlParser").parse(a),b);g&&a.reverse();return(b=d.find(a,function(a){return a.equal(e)}))?(g=d.indexOf(a,b),g<a.length-1?a[g+1]:null):g?d.find(a,function(a){return a.start<e.start}):!b&&(g=d.filter(a,function(a){return a.inside(e.end)}),g.length>1)?g[1]:d.find(a,function(a){return a.end>e.end})}function e(a,b){var c;if(a.charAt(b)=="<"&&(c=a.substring(b,a.length).match(p)))return f("range").create(b,c[0])}function j(a){return a=='"'||a=="'"}function n(a){var b=
|
||||
a.valueRange(!0),c=[a.range(!0),b],e=f("stringStream"),g=f("cssEditTree"),k=f("range"),j=a.value();d.each(a.valueParts(),function(a){var f=a.clone();c.push(f.shift(b.start));var h=e.create(a.substring(j));if(h.match(/^[\w\-]+\(/,!0)){h.start=h.pos;h.skipToPair("(",")");var i=h.current();c.push(k.create(f.start+h.start,i));d.each(g.findParts(i),function(a){c.push(k.create(f.start+h.start+a.start,a.substring(i)))})}});return d.chain(c).filter(function(a){return!!a.length()}).uniq(!1,function(a){return a.toString()}).value()}
|
||||
function o(a,b,c){var e=null,g=null,f=a.list(),j,h;c?(f.reverse(),j=function(a){return a.range(!0).start<=b.start},h=function(a){return a.start<b.start}):(j=function(a){return a.range(!0).end>=b.end},h=function(a){return a.end>b.start});for(;e=d.find(f,j);){a=n(e);c&&a.reverse();if(g=d.find(a,function(a){return a.equal(b)})){if(g=d.indexOf(a,g),g!=a.length-1){g=a[g+1];break}}else{g=d.filter(a,function(a){return a.inside(b.end)});if(g.length>1){g=g[1];break}if(g=d.find(a,h))break}g=null;b.start=b.end=
|
||||
c?e.range(!0).start-1:e.range(!0).end+1}return g}function l(a,b,c){a=f("cssEditTree").parse(a,{offset:b});b=a.nameRange(!0);return c.end<b.end?b:o(a,c,!1)}function m(a,b,c){b=f("cssEditTree").parse(a,{offset:b});a=o(b,c,!0);return!a&&(b=b.nameRange(!0),c.start>b.start)?b:a}var p=/^<([\w\:\-]+)((?:\s+[\w\-:]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,r=f("actions");r.add("select_next_item",function(a){return a.getSyntax()=="css"?h(a,!1,f("cssEditTree").extractRule,l):i(a)});r.add("select_previous_item",
|
||||
function(a){return a.getSyntax()=="css"?h(a,!0,f("cssEditTree").extractRule,m):b(a)})});
|
||||
emmet.exec(function(f){function d(c,a){var a=String((a||"out").toLowerCase()),d=f("editorUtils").outputInfo(c),e=f("range").create(c.getSelectionRange()),d=d.content;b&&!b.range.equal(e)&&(b=null);if(b&&e.length())if(a=="in")if(b.type=="tag"&&!b.close)return!1;else if(b.range.equal(b.outerRange))b.range=b.innerRange;else{var j=f("utils").narrowToNonSpace(d,b.innerRange);if((b=i.find(d,j.start+1))&&b.range.equal(e)&&b.outerRange.equal(e))b.range=b.innerRange}else if(!b.innerRange.equal(b.outerRange)&&
|
||||
b.range.equal(b.innerRange)&&e.equal(b.range))b.range=b.outerRange;else{if((b=i.find(d,e.start))&&b.range.equal(e)&&b.innerRange.equal(e))b.range=b.outerRange}else b=i.find(d,e.start);if(b&&!b.range.equal(e))return c.createSelection(b.range.start,b.range.end),!0;b=null;return!1}var h=f("actions"),i=f("htmlMatcher"),b=null;h.add("match_pair",d,{hidden:!0});h.add("match_pair_inward",function(b){return d(b,"in")},{label:"HTML/Match Pair Tag (inward)"});h.add("match_pair_outward",function(b){return d(b,
|
||||
"out")},{label:"HTML/Match Pair Tag (outward)"});h.add("matching_pair",function(b){var a=String(b.getContent()),d=b.getCaretPos();a.charAt(d)=="<"&&d++;return(a=i.tag(a,d))&&a.close?(a.open.range.inside(d)?b.setCaretPos(a.close.range.start):b.setCaretPos(a.open.range.start),!0):!1},{label:"HTML/Go To Matching Tag Pair"})});
|
||||
emmet.exec(function(f){f("actions").add("remove_tag",function(d){var h=f("utils"),i=f("editorUtils").outputInfo(d),b=f("htmlMatcher").tag(i.content,d.getCaretPos());if(b){if(b.close){var c=h.narrowToNonSpace(i.content,b.innerRange),a=h.findNewlineBounds(i.content,c.start),a=h.getLinePadding(a.substring(i.content)),i=c.substring(i.content),i=h.unindentString(i,a);d.replaceContent(h.getCaretPlaceholder()+h.escapeText(i),b.outerRange.start,b.outerRange.end)}else d.replaceContent(h.getCaretPlaceholder(),
|
||||
b.range.start,b.range.end);return!0}return!1},{label:"HTML/Remove Tag"})});
|
||||
emmet.exec(function(f){f("actions").add("split_join_tag",function(d,h){var i=f("htmlMatcher"),b=f("editorUtils").outputInfo(d,null,h),c=f("profile").get(b.profile);if(i=i.tag(b.content,d.getCaretPos())){if(i.close){var b=f("utils"),c=c.selfClosing()||" /",c=i.open.range.substring(i.source).replace(/\s*>$/,c+">"),a=d.getCaretPos();c.length+i.outerRange.start<a&&(a=c.length+i.outerRange.start);c=b.escapeText(c);d.replaceContent(c,i.outerRange.start,i.outerRange.end)}else{var b=f("utils"),g=b.getNewline(),
|
||||
e=f("resources").getVariable("indentation"),a=d.getCaretPos(),c=c.tag_nl===!0?g+e+g:"",g=i.outerContent().replace(/\s*\/>$/,">"),a=i.outerRange.start+g.length;g+=c+"</"+i.open.name+">";g=b.escapeText(g);d.replaceContent(g,i.outerRange.start,i.outerRange.end)}d.setCaretPos(a);i=!0}else i=!1;return i},{label:"HTML/Split\\Join Tag Declaration"})});
|
||||
emmet.define("reflectCSSValue",function(f,d){function h(c){var a=f("cssEditTree"),d=f("editorUtils").outputInfo(c),c=c.getCaretPos();if(a=a.parseFromPosition(d.content,c))if(d=a.itemFromPosition(c,!0)){var e=a.source,j=a.options.offset,c=c-j-d.range().start;b.exec(!1,[d]);if(e!==a.source)return{data:a.source,start:j,end:j+e.length,caret:j+d.range().start+c}}}function i(b){var b=f("cssEditTree").baseName(b),a;if(b=="opacity"||b=="filter")return/^(?:\-\w+\-)?(?:opacity|filter)$/;else if(a=b.match(/^border-radius-(top|bottom)(left|right)/))return RegExp("^(?:\\-\\w+\\-)?(?:"+
|
||||
b+"|border-"+a[1]+"-"+a[2]+"-radius)$");else if(a=b.match(/^border-(top|bottom)-(left|right)-radius/))return RegExp("^(?:\\-\\w+\\-)?(?:"+b+"|border-radius-"+a[1]+a[2]+")$");return RegExp("^(?:\\-\\w+\\-)?"+b+"$")}var b=f("handlerList").create();f("actions").add("reflect_css_value",function(b){return b.getSyntax()!="css"?!1:f("actionUtils").compoundUpdate(b,h(b))},{label:"CSS/Reflect Value"});b.add(function(b){var a=i(b.name());d.each(b.parent.list(),function(d){if(a.test(d.name())){var e;var j=b.name(),
|
||||
h=b.value(),i=d.name();e=d.value();var l=f("cssEditTree"),m=f("utils"),j=l.baseName(j),i=l.baseName(i);e=j=="opacity"&&i=="filter"?e.replace(/opacity=[^)]*/i,"opacity="+Math.floor(parseFloat(h)*100)):j=="filter"&&i=="opacity"?(j=h.match(/opacity=([^)]*)/i))?m.prettifyNumber(parseInt(j[1])/100):e:h;d.value(e)}})},{order:-1});return{addHandler:function(c,a){b.add(c,a)},removeHandler:function(c){b.remove(c,options)}}});
|
||||
emmet.exec(function(f){f("actions").add("evaluate_math_expression",function(d){var h=f("actionUtils"),i=f("utils"),b=String(d.getContent()),c=f("range").create(d.getSelectionRange());c.length()||(c=h.findExpressionBounds(d,function(a){return i.isNumeric(a)||".+-*/\\".indexOf(a)!=-1}));if(c&&c.length()){h=c.substring(b);h=h.replace(/([\d\.\-]+)\\([\d\.\-]+)/g,"Math.round($1/$2)");try{var a=i.prettifyNumber((new Function("return "+h))());d.replaceContent(a,c.start,c.end);d.setCaretPos(c.start+a.length);
|
||||
return!0}catch(g){}}return!1},{label:"Numbers/Evaluate Math Expression"})});
|
||||
emmet.exec(function(f,d){function h(b,a){var g=f("utils"),e=!1,j=!1,h=f("actionUtils").findExpressionBounds(b,function(a,b,c){return g.isNumeric(a)?!0:a=="."?!g.isNumeric(c.charAt(b+1))?!1:j?!1:j=!0:a=="-"?e?!1:e=!0:!1});if(h&&h.length()){var o=h.substring(String(b.getContent())),l=parseFloat(o);if(!d.isNaN(l)){l=g.prettifyNumber(l+a);if(/^(\-?)0+[1-9]/.test(o)){var m="";RegExp.$1&&(m="-",l=l.substring(1));l=l.split(".");l[0]=g.zeroPadString(l[0],i(o));l=m+l.join(".")}b.replaceContent(l,h.start,h.end);
|
||||
b.createSelection(h.start,h.start+l.length);return!0}}return!1}function i(b){b=b.replace(/^\-/,"");return~b.indexOf(".")?b.split(".")[0].length:b.length}var b=f("actions");d.each([1,-1,10,-10,0.1,-0.1],function(c){var a=c>0?"increment":"decrement";b.add(a+"_number_by_"+String(Math.abs(c)).replace(".","").substring(0,2),function(a){return h(a,c)},{label:"Numbers/"+a.charAt(0).toUpperCase()+a.substring(1)+" number by "+Math.abs(c)})})});
|
||||
emmet.exec(function(f,d){var h=f("actions"),i=f("preferences");i.define("css.closeBraceIndentation","\n","Indentation before closing brace of CSS rule. Some users prefere indented closing brace of CSS rule for better readability. This preference\u2019s value will be automatically inserted before closing brace when user adds newline in newly created CSS rule (e.g. when \u201cInsert formatted linebreak\u201d action will be performed in CSS file). If you\u2019re such user, you may want to write put a value like <code>\\n\\t</code> in this preference.");
|
||||
h.add("insert_formatted_line_break_only",function(b){var c=f("utils"),a=f("resources"),g=f("editorUtils").outputInfo(b),e=b.getCaretPos(),j=c.getNewline();if(d.include(["html","xml","xsl"],g.syntax)){if(a=a.getVariable("indentation"),(g=f("htmlMatcher").tag(g.content,e))&&!g.innerRange.length())return b.replaceContent(j+a+c.getCaretPlaceholder()+j,e),!0}else if(g.syntax=="css"&&(g=g.content,e&&g.charAt(e-1)=="{")){var h=i.get("css.closeBraceIndentation"),a=a.getVariable("indentation"),o=g.charAt(e)==
|
||||
"}";if(!o)for(var l=e,m=g.length,p;l<m;l++){p=g.charAt(l);if(p=="{")break;if(p=="}"){h="";o=!0;break}}o||(h+="}");c=j+a+c.getCaretPlaceholder()+h;b.replaceContent(c,e);return!0}return!1},{hidden:!0});h.add("insert_formatted_line_break",function(b){if(!h.run("insert_formatted_line_break_only",b)){for(var c=f("utils"),a=f("editorUtils").getCurrentLinePadding(b),d=String(b.getContent()),e=b.getCaretPos(),j=d.length,c=c.getNewline(),i="",o=b.getCurrentLineRange().end+1,l;o<j;o++)if(l=d.charAt(o),l==" "||
|
||||
l=="\t")i+=l;else break;i.length>a.length?b.replaceContent(c+i,e,e,!0):b.replaceContent(c,e)}return!0},{hidden:!0})});
|
||||
emmet.exec(function(f){f("actions").add("merge_lines",function(d){var h=f("htmlMatcher"),i=f("utils"),b=f("editorUtils").outputInfo(d),c=f("range").create(d.getSelectionRange());if(!c.length()&&(h=h.find(b.content,d.getCaretPos())))c=h.outerRange;if(c.length()){b=c.substring(b.content);b=i.splitByLines(b);for(h=1;h<b.length;h++)b[h]=b[h].replace(/^\s+/,"");b=b.join("").replace(/\s{2,}/," ");h=b.length;b=i.escapeText(b);d.replaceContent(b,c.start,c.end);d.createSelection(c.start,c.start+h);return!0}return!1})});
|
||||
emmet.exec(function(f){function d(d,b,c){c=c||0;return b.charAt(c)==d.charAt(0)&&b.substr(c,d.length)==d}function h(d,b,c){var a=f("file"),g=f("actionUtils"),e=d.getFilePath();if(e===null)throw"You should save your file before using this action";var h=a.locateFile(e,b);if(h===null)throw"Can't find "+b+" file";a.read(h,function(e,o){if(e)throw"Unable to read "+h+": "+e;var l=f("base64").encode(String(o));if(!l)throw"Can't encode file content to base64";l="data:"+(g.mimeTypes[String(a.getExt(h))]||
|
||||
"application/octet-stream")+";base64,"+l;d.replaceContent("$0"+l,c,c+b.length)});return!0}f("actions").add("encode_decode_data_url",function(i){var b=String(i.getSelection()),c=i.getCaretPos();if(!b)for(var a=String(i.getContent());c-- >=0;)if(d("src=",a,c)){if(a=a.substr(c).match(/^(src=(["'])?)([^'"<>\s]+)\1?/))b=a[3],c+=a[1].length;break}else if(d("url(",a,c)){if(a=a.substr(c).match(/^(url\((['"])?)([^'"\)\s]+)\1?/))b=a[3],c+=a[1].length;break}if(b)if(d("data:",b))if(a=String(i.prompt("Enter path to file (absolute or relative)"))){var g=
|
||||
f("file"),e=g.createPath(i.getFilePath(),a);if(!e)throw"Can't save file";g.save(e,f("base64").decode(b.replace(/^data\:.+?;.+?,/,"")));i.replaceContent("$0"+a,c,c+b.length);i=!0}else i=!1;else i=h(i,b,c);else i=!1;return i},{label:"Encode\\Decode data:URL image"})});
|
||||
emmet.exec(function(f,d){function h(c){var a=c.getCaretPos(),g=f("editorUtils").outputInfo(c),e=f("xmlEditTree").parseFromPosition(g.content,a,!0);e&&(e.name()||"").toLowerCase()=="img"&&b(c,e.value("src"),function(b){if(b){var g=e.range(!0);e.value("width",b.width);e.value("height",b.height,e.indexOf("width")+1);f("actionUtils").compoundUpdate(c,d.extend(g,{data:e.toString(),caret:a}))}})}function i(c){var a=c.getCaretPos(),g=f("editorUtils").outputInfo(c),e=f("cssEditTree").parseFromPosition(g.content,
|
||||
a,!0);if(e){var g=e.itemFromPosition(a,!0),h;g&&(h=/url\((["']?)(.+?)\1\)/i.exec(g.value()||""))&&b(c,h[2],function(b){if(b){var g=e.range(!0);e.value("width",b.width+"px");e.value("height",b.height+"px",e.indexOf("width")+1);f("actionUtils").compoundUpdate(c,d.extend(g,{data:e.toString(),caret:a}))}})}}function b(b,a,d){var e=f("actionUtils");if(a){if(/^data:/.test(a))return b=f("base64").decode(a.replace(/^data\:.+?;.+?,/,"")),d(e.getImageSize(b));var h=f("file"),i=h.locateFile(b.getFilePath(),
|
||||
a);if(i===null)throw"Can't find "+a+" file";h.read(i,function(a,b){if(a)throw"Unable to read "+i+": "+a;d(e.getImageSize(String(b)))})}}f("actions").add("update_image_size",function(b){d.include(["css","less","scss"],String(b.getSyntax()))?i(b):h(b);return!0})});
|
||||
emmet.define("cssResolver",function(f,d){function h(a){var b=a&&a.charCodeAt(0);return a&&a=="."||b>47&&b<58}function i(a){a=f("utils").trim(a);if(~a.indexOf("/*")||/[\n\r]/.test(a))return!1;if(!/^[a-z0-9\-]+\s*\:/i.test(a))return!1;a=f("tabStops").processText(a,{replaceCarets:!0,tabstop:function(){return"value"}});return a.split(":").length==2}function b(a){a.charAt(0)=="-"&&!/^\-[\.\d]/.test(a)&&(a=a.replace(/^\-+/,""));if(a.charAt(0)=="#"){var b=a.replace(/^#+/,"")||"0";if(b.toLowerCase()=="t")a=
|
||||
"transparent";else{var d=f("utils").repeatString,a=null;switch(b.length){case 1:a=d(b,6);break;case 2:a=d(b,3);break;case 3:a=b.charAt(0)+b.charAt(0)+b.charAt(1)+b.charAt(1)+b.charAt(2)+b.charAt(2);break;case 4:a=b+b.substr(0,2);break;case 5:a=b+b.charAt(0);break;default:a=b.substr(0,6)}q.get("css.color.short")&&(b=a.split(""),b[0]==b[1]&&b[2]==b[3]&&b[4]==b[5]&&(a=b[0]+b[2]+b[4]));switch(q.get("css.color.case")){case "upper":a=a.toUpperCase();break;case "lower":a=a.toLowerCase()}a="#"+a}}else a=
|
||||
c(a);return a}function c(a){var b=q.getDict("css.keywordAliases");return a in b?b[a]:a}function a(a){return d.include(q.getArray("css.keywords"),c(a))}function g(a,b){var c=r[b];c||(c=d.find(r,function(a){return a.prefix==b}));return c&&c.supports(a)}function e(a,b){var c=[];d.each(r,function(b,d){g(a,d)&&c.push(d)});!c.length&&!b&&d.each(r,function(a,b){a.obsolete||c.push(b)});return c}function j(a,b){d.isString(b)&&(b={prefix:b});r[a]=d.extend({},p,b)}function n(a,b){if(b){var c=q.get(b+"."+a);
|
||||
if(!d.isUndefined(c))return c}return q.get("css."+a)}function o(a,b,c){if(!d.isString(a))a=a.data;if(!i(a))return a;b&&(~a.indexOf(";")?a=a.split(";").join(" !important;"):a+=" !important");b=a.indexOf(":");a=a.substring(0,b).replace(/\s+$/,"")+n("valueSeparator",c)+f("utils").trim(a.substring(b+1));return a.replace(/\s*;\s*$/,n("propertyEnd",c))}function l(a){var b=q.getArray(a);d.each(q.getArray(a+"Addon"),function(a){a.charAt(0)=="-"?b=d.without(b,a.substr(1)):(a.charAt(0)=="+"&&(a=a.substr(1)),
|
||||
b.push(a))});return b}var m=null,p={prefix:"emmet",obsolete:!1,transformName:function(a){return"-"+this.prefix+"-"+a},properties:function(){return l("css."+this.prefix+"Properties")||[]},supports:function(a){return d.include(this.properties(),a)}},r={},q=f("preferences");q.define("css.valueSeparator",": ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations.");q.define("css.propertyEnd",";","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations.");
|
||||
q.define("stylus.valueSeparator"," ","Defines a symbol that should be placed between CSS property and value when expanding CSS abbreviations in Stylus dialect.");q.define("stylus.propertyEnd","","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations in Stylus dialect.");q.define("sass.propertyEnd","","Defines a symbol that should be placed at the end of CSS property when expanding CSS abbreviations in SASS dialect.");q.define("css.autoInsertVendorPrefixes",
|
||||
!0,"Automatically generate vendor-prefixed copies of expanded CSS property. By default, Emmet will generate vendor-prefixed properties only when you put dash before abbreviation (e.g. <code>-bxsh</code>). With this option enabled, you don\u2019t need dashes before abbreviations: Emmet will produce vendor-prefixed properties for you.");var u=d.template("A comma-separated list of CSS properties that may have <code><%= vendor %></code> vendor prefix. This list is used to generate a list of prefixed properties when expanding <code>-property</code> abbreviations. Empty list means that all possible CSS values may have <code><%= vendor %></code> prefix."),
|
||||
s=d.template("A comma-separated list of <em>additional</em> CSS properties for <code>css.<%= vendor %>Preperties</code> preference. You should use this list if you want to add or remove a few CSS properties to original set. To add a new property, simply write its name, to remove it, precede property with hyphen.<br>For example, to add <em>foo</em> property and remove <em>border-radius</em> one, the preference value will look like this: <code>foo, -border-radius</code>.");d.each({webkit:"animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-clip, background-composite, background-origin, background-size, border-fit, border-horizontal-spacing, border-image, border-vertical-spacing, box-align, box-direction, box-flex, box-flex-group, box-lines, box-ordinal-group, box-orient, box-pack, box-reflect, box-shadow, color-correction, column-break-after, column-break-before, column-break-inside, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-span, column-width, dashboard-region, font-smoothing, highlight, hyphenate-character, hyphenate-limit-after, hyphenate-limit-before, hyphens, line-box-contain, line-break, line-clamp, locale, margin-before-collapse, margin-after-collapse, marquee-direction, marquee-increment, marquee-repetition, marquee-style, mask-attachment, mask-box-image, mask-box-image-outset, mask-box-image-repeat, mask-box-image-slice, mask-box-image-source, mask-box-image-width, mask-clip, mask-composite, mask-image, mask-origin, mask-position, mask-repeat, mask-size, nbsp-mode, perspective, perspective-origin, rtl-ordering, text-combine, text-decorations-in-effect, text-emphasis-color, text-emphasis-position, text-emphasis-style, text-fill-color, text-orientation, text-security, text-stroke-color, text-stroke-width, transform, transition, transform-origin, transform-style, transition-delay, transition-duration, transition-property, transition-timing-function, user-drag, user-modify, user-select, writing-mode, svg-shadow, box-sizing, border-radius",
|
||||
moz:"animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, appearance, backface-visibility, background-inline-policy, binding, border-bottom-colors, border-image, border-left-colors, border-right-colors, border-top-colors, box-align, box-direction, box-flex, box-ordinal-group, box-orient, box-pack, box-shadow, box-sizing, column-count, column-gap, column-rule-color, column-rule-style, column-rule-width, column-width, float-edge, font-feature-settings, font-language-override, force-broken-image-icon, hyphens, image-region, orient, outline-radius-bottomleft, outline-radius-bottomright, outline-radius-topleft, outline-radius-topright, perspective, perspective-origin, stack-sizing, tab-size, text-blink, text-decoration-color, text-decoration-line, text-decoration-style, text-size-adjust, transform, transform-origin, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-focus, user-input, user-modify, user-select, window-shadow, background-clip, border-radius",
|
||||
ms:"accelerator, backface-visibility, background-position-x, background-position-y, behavior, block-progression, box-align, box-direction, box-flex, box-line-progression, box-lines, box-ordinal-group, box-orient, box-pack, content-zoom-boundary, content-zoom-boundary-max, content-zoom-boundary-min, content-zoom-chaining, content-zoom-snap, content-zoom-snap-points, content-zoom-snap-type, content-zooming, filter, flow-from, flow-into, font-feature-settings, grid-column, grid-column-align, grid-column-span, grid-columns, grid-layer, grid-row, grid-row-align, grid-row-span, grid-rows, high-contrast-adjust, hyphenate-limit-chars, hyphenate-limit-lines, hyphenate-limit-zone, hyphens, ime-mode, interpolation-mode, layout-flow, layout-grid, layout-grid-char, layout-grid-line, layout-grid-mode, layout-grid-type, line-break, overflow-style, perspective, perspective-origin, perspective-origin-x, perspective-origin-y, scroll-boundary, scroll-boundary-bottom, scroll-boundary-left, scroll-boundary-right, scroll-boundary-top, scroll-chaining, scroll-rails, scroll-snap-points-x, scroll-snap-points-y, scroll-snap-type, scroll-snap-x, scroll-snap-y, scrollbar-arrow-color, scrollbar-base-color, scrollbar-darkshadow-color, scrollbar-face-color, scrollbar-highlight-color, scrollbar-shadow-color, scrollbar-track-color, text-align-last, text-autospace, text-justify, text-kashida-space, text-overflow, text-size-adjust, text-underline-position, touch-action, transform, transform-origin, transform-origin-x, transform-origin-y, transform-origin-z, transform-style, transition, transition-delay, transition-duration, transition-property, transition-timing-function, user-select, word-break, word-wrap, wrap-flow, wrap-margin, wrap-through, writing-mode",
|
||||
o:"dashboard-region, animation, animation-delay, animation-direction, animation-duration, animation-fill-mode, animation-iteration-count, animation-name, animation-play-state, animation-timing-function, border-image, link, link-source, object-fit, object-position, tab-size, table-baseline, transform, transform-origin, transition, transition-delay, transition-duration, transition-property, transition-timing-function, accesskey, input-format, input-required, marquee-dir, marquee-loop, marquee-speed, marquee-style"},
|
||||
function(a,b){q.define("css."+b+"Properties",a,u({vendor:b}));q.define("css."+b+"PropertiesAddon","",s({vendor:b}))});q.define("css.unitlessProperties","z-index, line-height, opacity, font-weight, zoom","The list of properties whose values \u200b\u200bmust not contain units.");q.define("css.intUnit","px","Default unit for integer values");q.define("css.floatUnit","em","Default unit for float values");q.define("css.keywords","auto, inherit","A comma-separated list of valid keywords that can be used in CSS abbreviations.");
|
||||
q.define("css.keywordAliases","a:auto, i:inherit, s:solid, da:dashed, do:dotted, t:transparent","A comma-separated list of keyword aliases, used in CSS abbreviation. Each alias should be defined as <code>alias:keyword_name</code>.");q.define("css.unitAliases","e:em, p:%, x:ex, r:rem","A comma-separated list of unit aliases, used in CSS abbreviation. Each alias should be defined as <code>alias:unit_value</code>.");q.define("css.color.short",!0,"Should color values like <code>#ffffff</code> be shortened to <code>#fff</code> after abbreviation with color was expanded.");
|
||||
q.define("css.color.case","keep","Letter case of color values generated by abbreviations with color (like <code>c#0</code>). Possible values are <code>upper</code>, <code>lower</code> and <code>keep</code>.");q.define("css.fuzzySearch",!0,"Enable fuzzy search among CSS snippet names. When enabled, every <em>unknown</em> snippet will be scored against available snippet names (not values or CSS properties!). The match with best score will be used to resolve snippet value. For example, with this preference enabled, the following abbreviations are equal: <code>ov:h</code> == <code>ov-h</code> == <code>o-h</code> == <code>oh</code>");
|
||||
q.define("css.fuzzySearchMinScore",0.3,"The minium score (from 0 to 1) that fuzzy-matched abbreviation should achive. Lower values may produce many false-positive matches, higher values may reduce possible matches.");q.define("css.alignVendor",!1,"If set to <code>true</code>, all generated vendor-prefixed properties will be aligned by real property name.");j("w",{prefix:"webkit"});j("m",{prefix:"moz"});j("s",{prefix:"ms"});j("o",{prefix:"o"});var v=["css","less","sass","scss","stylus"];f("resources").addResolver(function(a,
|
||||
b){return d.include(v,b)&&a.isElement()?m.expandToSnippet(a.abbreviation,b):null});var w=f("expandAbbreviation");w.addHandler(function(a,b,c){if(!d.include(v,b))return!1;var e=a.getSelectionRange().end,g=w.findAbbreviation(a);return g&&(b=emmet.expandAbbreviation(g,b,c))?(g=e-g.length,c=e,a.getContent().charAt(e)==";"&&b.charAt(b.length-1)==";"&&c++,a.replaceContent(b,g,c),!0):!1});return m={addPrefix:j,supportsPrefix:g,prefixed:function(a,b){return g(a,b)?"-"+b+"-"+a:a},listPrefixes:function(){return d.map(r,
|
||||
function(a){return a.prefix})},getPrefix:function(a){return r[a]},removePrefix:function(a){a in r&&delete r[a]},extractPrefixes:function(a){if(a.charAt(0)!="-")return{property:a,prefixes:null};for(var b=1,c=a.length,d,e=[];b<c;){d=a.charAt(b);if(d=="-"){b++;break}if(d in r)e.push(d);else{e.length=0;b=1;break}b++}if(b==c-1)b=1,e.length=1;return{property:a.substring(b),prefixes:e.length?e:"all"}},findValuesInAbbreviation:function(b,c){for(var c=c||"css",d=0,e=b.length,g="",j;d<e;){j=b.charAt(d);if(h(j)||
|
||||
j=="#"||j=="-"&&h(b.charAt(d+1))){g=b.substring(d);break}d++}j=b.substring(0,b.length-g.length);d=f("resources");for(e=[];~j.indexOf("-")&&!d.findSnippet(c,j);){j=j.split("-");var i=j.pop();if(!a(i))break;e.unshift(i);j=j.join("-")}return e.join("-")+g},parseValues:function(c){for(var e=f("stringStream").create(c),g=[],j=null;j=e.next();){if(j=="#")e.match(/^t|[0-9a-f]+/i,!0);else if(j=="-"){if(a(d.last(g))||e.start&&h(c.charAt(e.start-1)))e.start=e.pos;e.match(/^\-?[0-9]*(\.[0-9]+)?[a-z%\.]*/,!0)}else e.match(/^[0-9]*(\.[0-9]*)?[a-z%]*/,
|
||||
!0);g.push(e.current());e.start=e.pos}return d.map(d.compact(g),b)},extractValues:function(a){var b=this.findValuesInAbbreviation(a);return!b?{property:a,values:null}:{property:a.substring(0,a.length-b.length).replace(/-$/,""),values:this.parseValues(b)}},normalizeValue:function(a,b){var b=(b||"").toLowerCase(),c=q.getArray("css.unitlessProperties");return a.replace(/^(\-?[0-9\.]+)([a-z]*)$/,function(a,e,g){if(!g&&(e=="0"||d.include(c,b)))return e;g?(a=q.getDict("css.unitAliases"),e+=g in a?a[g]:
|
||||
g):e=e.replace(/\.$/,"")+q.get(~e.indexOf(".")?"css.floatUnit":"css.intUnit");return e})},expand:function(a,b,c){var c=c||"css",g=f("resources"),h=q.get("css.autoInsertVendorPrefixes"),j;if(j=/^(.+)\!$/.test(a))a=RegExp.$1;var m=g.findSnippet(c,a);if(m&&!h)return o(m,j,c);var a=this.extractPrefixes(a),l=this.extractValues(a.property),a=d.extend(a,l);m?a.values=null:m=g.findSnippet(c,a.property);!m&&q.get("css.fuzzySearch")&&(m=g.fuzzyFindSnippet(c,a.property,parseFloat(q.get("css.fuzzySearchMinScore"))));
|
||||
if(m){if(!d.isString(m))m=m.data}else m=a.property+":${1};";if(!i(m))return m;var n=this.splitSnippet(m),v=[];!b&&a.values&&(b=d.map(a.values,function(a){return this.normalizeValue(a,n.name)},this).join(" ")+";");n.value=b||n.value;var b=a.prefixes=="all"||!a.prefixes&&h?e(n.name,h&&a.prefixes!="all"):a.prefixes,p=[],w;d.each(b,function(a){a in r&&(w=r[a].transformName(n.name),p.push(w),v.push(o(w+":"+n.value,j,c)))});v.push(o(n.name+":"+n.value,j,c));p.push(n.name);if(q.get("css.alignVendor"))var s=
|
||||
f("utils").getStringsPads(p),v=d.map(v,function(a,b){return s[b]+a});return v},expandToSnippet:function(a,b){var c=this.expand(a,null,b);return d.isArray(c)?c.join("\n"):!d.isString(c)?c.data:String(c)},splitSnippet:function(a){var b=f("utils"),a=b.trim(a);if(a.indexOf(":")==-1)return{name:a,value:"${1};"};a=a.split(":");return{name:b.trim(a.shift()),value:b.trim(a.join(":")).replace(/^(\$\{0\}|\$0)(\s*;?)$/,"${1}$2")}},getSyntaxPreference:n,transformSnippet:o}});
|
||||
emmet.define("cssGradient",function(f,d){function h(a){return f("utils").trim(a).replace(/\s+/g," ")}function i(a){var a=h(a),b=null,a=a.replace(/^(\w+\(.+?\))\s*/,function(a,c){b=c;return""});b||(a=a.split(" "),b=a[0],a=a[1]||"");var c={color:b};a&&a.replace(/^(\-?[\d\.]+)([a-z%]+)?$/,function(a,b,d){c.position=b;~b.indexOf(".")?d="":d||(d="%");if(d)c.unit=d});return c}function b(a){var b=0;d.each(a,function(c,e){if(!e)return c.position=c.position||0;if(e==a.length-1&&!("position"in c))c.position=
|
||||
1;if("position"in c){var g=a[b].position||0,f=(c.position-g)/(e-b);d.each(a.slice(b,e),function(a,b){a.position=g+f*b});b=e}})}function c(a){var b=parseFloat(a);if(!d.isNaN(b))switch(b%360){case 0:return"left";case 90:return"bottom";case 180:return"right";case 240:return"top"}return a}function a(a){a=c(a);if(q.test(a))throw"The direction is an angle that can\u2019t be converted.";var b=function(b){return~a.indexOf(b)?"100%":"0"};return b("right")+" "+b("bottom")+", "+b("left")+" "+b("top")}function g(a){var b=
|
||||
s.getArray("css.gradient.prefixes"),b=d.map(b,function(b){return"-"+b+"-"+a});b.push(a);return b}function e(a,b){var c=[],e=f("cssResolver");s.get("css.gradient.fallback")&&~b.toLowerCase().indexOf("background")&&c.push({name:"background-color",value:"${1:"+a.colorStops[0].color+"}"});d.each(s.getArray("css.gradient.prefixes"),function(d){var g=e.prefixed(b,d);if(d=="webkit"&&s.get("css.gradient.oldWebkit"))try{c.push({name:g,value:p.oldWebkitLinearGradient(a)})}catch(f){}c.push({name:g,value:p.toString(a,
|
||||
d)})});return c.sort(function(a,b){return b.name.length-a.name.length})}function j(a,b,c){var h=a.parent,j=f("utils"),i=f("preferences").get("css.alignVendor"),m=a.styleSeparator,l=a.styleBefore;d.each(h.getAll(g(a.name())),function(b){if(b!=a&&/gradient/i.test(b.value())){if(b.styleSeparator.length<m.length)m=b.styleSeparator;if(b.styleBefore.length<l.length)l=b.styleBefore;h.remove(b)}});if(i){if(l!=a.styleBefore){var n=a.fullRange();h._updateSource(l,n.start,n.start+a.styleBefore.length);a.styleBefore=
|
||||
l}if(m!=a.styleSeparator)h._updateSource(m,a.nameRange().end,a.valueRange().start),a.styleSeparator=m}var o=a.value();c||(c=f("range").create(0,a.value()));a.value(function(a){return j.replaceSubstring(o,a,c)}(p.toString(b))+"${2}");b=e(b,a.name());if(i){i=d.pluck(b,"value");n=d.pluck(b,"name");i.push(a.value());n.push(a.name());var r=j.getStringsPads(d.map(i,function(a){return a.substring(0,a.indexOf("("))})),q=j.getStringsPads(n);a.name(d.last(q)+a.name());d.each(b,function(a,b){a.name=q[b]+a.name;
|
||||
a.value=r[b]+a.value});a.value(d.last(r)+a.value())}d.each(b,function(b){h.add(b.name,b.value,h.indexOf(a))})}function n(a){var b=a.value(),c=null;return(a=d.find(a.valueParts(),function(a){return c=p.parse(a.substring(b))}))&&c?{gradient:c,valueRange:a}:null}function o(a,b){var c=s.get("css.gradient.defaultProperty");if(!c)return!1;var g=String(a.getContent()),h=f("range").create(a.getCurrentLineRange()),j=h.substring(g).replace(/^\s+/,function(a){h.start+=a.length;return""}).replace(/\s+$/,function(a){h.end-=
|
||||
a.length;return""}),g=f("cssResolver");if(j=p.parse(j)){var i=e(j,c);i.push({name:c,value:p.toString(j)+"${2}"});var m=g.getSyntaxPreference("valueSeparator",b),l=g.getSyntaxPreference("propertyEnd",b);if(f("preferences").get("css.alignVendor")){var n=f("utils").getStringsPads(d.map(i,function(a){return a.value.substring(0,a.value.indexOf("("))}));d.each(i,function(a,b){a.value=n[b]+a.value})}i=d.map(i,function(a){return a.name+m+a.value+l});a.replaceContent(i.join("\n"),h.start,h.end);return!0}return!1}
|
||||
function l(a,b){var c=null,e=f("cssEditTree").parseFromPosition(a,b,!0);e&&((c=e.itemFromPosition(b,!0))||(c=d.find(e.list(),function(a){return a.range(!0).end==b})));return{rule:e,property:c}}var m=["top","to bottom","0deg"],p=null,r=["css","less","sass","scss","stylus","styl"],q=/\d+deg/i,u=/top|bottom|left|right/i,s=f("preferences");s.define("css.gradient.prefixes","webkit, moz, o","A comma-separated list of vendor-prefixes for which values should be generated.");s.define("css.gradient.oldWebkit",
|
||||
!0,"Generate gradient definition for old Webkit implementations");s.define("css.gradient.omitDefaultDirection",!0,"Do not output default direction definition in generated gradients.");s.define("css.gradient.defaultProperty","background-image","When gradient expanded outside CSS value context, it will produce properties with this name.");s.define("css.gradient.fallback",!1,"With this option enabled, CSS gradient generator will produce <code>background-color</code> property with gradient first color as fallback for old browsers.");
|
||||
f("expandAbbreviation").addHandler(function(a,b,c){c=f("editorUtils").outputInfo(a,b,c);if(!d.include(r,c.syntax))return!1;var e=a.getCaretPos(),g=c.content,c=l(g,e);if(c.property){var h=n(c.property);if(h){var i=c.rule.options.offset||0,m=i+c.rule.toString().length;if(/[\n\r]/.test(c.property.value())){var p=c.property.valueRange(!0).start+h.valueRange.end,g=f("utils").replaceSubstring(g,";",p),e=l(g,e);e.property&&(h=n(e.property),c=e)}c.property.end(";");var e=c.property.name(),g=f("resources"),
|
||||
p=f("preferences"),q=g.findSnippet(b,e);!q&&p.get("css.fuzzySearch")&&(q=g.fuzzyFindSnippet(b,e,parseFloat(p.get("css.fuzzySearchMinScore"))));if(q){if(!d.isString(q))q=q.data;b=f("cssResolver").splitSnippet(q).name}else b=void 0;b&&c.property.name(b);j(c.property,h.gradient,h.valueRange);a.replaceContent(c.rule.toString(),i,m,!0);return!0}}return o(a,b)});f("reflectCSSValue").addHandler(function(a){var b=f("utils"),c=n(a);if(!c)return!1;var e=a.value(),h=function(a){return b.replaceSubstring(e,a,
|
||||
c.valueRange)};d.each(a.parent.getAll(g(a.name())),function(b){if(b!==a){var d=b.value().match(/^\s*(\-([a-z]+)\-)?linear\-gradient/);d?b.value(h(p.toString(c.gradient,d[2]||""))):b.value().match(/\s*\-webkit\-gradient/)&&b.value(h(p.oldWebkitLinearGradient(c.gradient)))}});return!0});return p={parse:function(a){var b=null;f("utils").trim(a).replace(/^([\w\-]+)\((.+?)\)$/,function(a,c,e){c=c.toLowerCase().replace(/^\-[a-z]+\-/,"");if(c=="linear-gradient"||c=="lg"){for(var a=m[0],e=f("stringStream").create(f("utils").trim(e)),
|
||||
c=[],g;g=e.next();)e.peek()==","?(c.push(e.current()),e.next(),e.eatSpace(),e.start=e.pos):g=="("&&e.skipTo(")");c.push(e.current());c=d.compact(d.map(c,h));if(c.length){if(q.test(c[0])||u.test(c[0]))a=c.shift();b={type:"linear",direction:a,colorStops:d.map(c,i)}}else b=null;return""}return a});return b},oldWebkitLinearGradient:function(c){d.isString(c)&&(c=this.parse(c));if(!c)return null;var e=d.map(c.colorStops,d.clone);d.each(e,function(a){if("position"in a)if(~a.position.indexOf(".")||a.unit==
|
||||
"%")a.position=parseFloat(a.position)/(a.unit=="%"?100:1);else throw"Can't convert color stop '"+(a.position+(a.unit||""))+"'";});b(e);e=d.map(e,function(a,b){return!a.position&&!b?"from("+a.color+")":a.position==1&&b==e.length-1?"to("+a.color+")":"color-stop("+a.position.toFixed(2).replace(/\.?0+$/,"")+", "+a.color+")"});return"-webkit-gradient(linear, "+a(c.direction)+", "+e.join(", ")+")"},toString:function(a,b){if(a.type=="linear"){var c=(b?"-"+b+"-":"")+"linear-gradient",e=d.map(a.colorStops,
|
||||
function(a){return a.color+("position"in a?" "+a.position+(a.unit||""):"")});a.direction&&(!s.get("css.gradient.omitDefaultDirection")||!d.include(m,a.direction))&&e.unshift(a.direction);return c+"("+e.join(", ")+")"}}}});emmet.exec(function(f,d){var h=f("handlerList").create(),i=f("resources");d.extend(i,{addGenerator:function(b,c,a){d.isString(b)&&(b=RegExp(b));h.add(function(a,d){var f;return(f=b.exec(a.name()))?c(f,a,d):null},a)}});i.addResolver(function(b,c){return h.exec(null,d.toArray(arguments))})});
|
||||
emmet.define("tagName",function(f,d){var h={empty:"area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,keygen,command".split(","),blockLevel:"address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,link,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul,h1,h2,h3,h4,h5,h6".split(","),inlineLevel:"a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var".split(",")},
|
||||
i={p:"span",ul:"li",ol:"li",table:"tr",tr:"td",tbody:"tr",thead:"tr",tfoot:"tr",colgroup:"col",select:"option",optgroup:"option",audio:"source",video:"source",object:"param",map:"area"};return{resolve:function(b){b=(b||"").toLowerCase();return b in i?this.getMapping(b):this.isInlineLevel(b)?"span":"div"},getMapping:function(b){return i[b.toLowerCase()]},isInlineLevel:function(b){return this.isTypeOf(b,"inlineLevel")},isBlockLevel:function(b){return this.isTypeOf(b,"blockLevel")},isEmptyElement:function(b){return this.isTypeOf(b,
|
||||
"empty")},isTypeOf:function(b,c){return d.include(h[c],b)},addMapping:function(b,c){i[b]=c},removeMapping:function(b){b in i&&delete i[b]},addElementToCollection:function(b,c){h[c]||(h[c]=[]);var a=this.getCollection(c);d.include(a,b)||a.push(b)},removeElementFromCollection:function(b,c){c in h&&(h[c]=d.without(this.getCollection(c),b))},getCollection:function(b){return h[b]}}});
|
||||
emmet.exec(function(f,d){function h(){return{element:g.get("bem.elementSeparator"),modifier:g.get("bem.modifierSeparator")}}function i(a){if(f("abbreviationUtils").isSnippet(a))return a;a.__bem={block:"",element:"",modifier:""};var e=b(a.attribute("class")).split(" "),g=/^[a-z]\-/i;a.__bem.block=d.find(e,function(a){return g.test(a)});if(!a.__bem.block)g=/^[a-z]/i,a.__bem.block=d.find(e,function(a){return g.test(a)})||"";(e=d.chain(e).map(function(b){var d;d=c(b,a,"element");d=c(d,a,"modifier");var e=
|
||||
"",g="",f="",b=h();~d.indexOf(b.element)?(e=d.split(b.element),f=e[1].split(b.modifier),e=e[0],g=f.shift(),f=f.join(b.modifier)):~d.indexOf(b.modifier)&&(f=d.split(b.modifier),e=f.shift(),f=f.join(b.modifier));if(e||g||f){if(!e)e=a.__bem.block;d=e;var i=[];g&&(d+=b.element+g);i.push(d);f&&i.push(d+b.modifier+f);a.__bem.block=e;a.__bem.element=g;a.__bem.modifier=f;b=i}else b=d;return b}).flatten().uniq().value().join(" "))&&a.attribute("class",e);return a}function b(a){var b=f("utils"),a=(" "+(a||
|
||||
"")+" ").replace(/\s+/g," "),c=g.get("bem.shortElementPrefix");c&&(c=RegExp("\\s("+b.escapeForRegexp(c)+"+)","g"),a=a.replace(c,function(a,c){return" "+b.repeatString(h().element,c.length)}));return b.trim(a)}function c(a,b,c){var d=h(),e=RegExp("^("+d[c]+")+","g");if(e.test(a)){for(var g=0,e=a.replace(e,function(a){g=a.length/d[c].length;return""}),f=b;f.parent&&g--;)f=f.parent;if(!f||!f.__bem)f=b;if(f&&f.__bem)return a=f.__bem.block,c=="modifier"&&f.__bem.element&&(a+=d.element+f.__bem.element),
|
||||
a+d[c]+e}return a}function a(b,c){b.name&&i(b,c);var g=f("abbreviationUtils");d.each(b.children,function(b){a(b,c);!g.isSnippet(b)&&b.start&&(e=!0)});return b}var g=f("preferences");g.define("bem.elementSeparator","__","Class name\u2019s element separator.");g.define("bem.modifierSeparator","_","Class name\u2019s modifier separator.");g.define("bem.shortElementPrefix","-","Symbol for describing short \u201cblock-element\u201d notation. Class names prefixed with this symbol will be treated as element name for parent\u2018s block name. Each symbol instance traverses one level up in parsed tree for block name lookup. Empty value will disable short notation.");
|
||||
var e=!1;f("filters").add("bem",function(b,c){e=!1;b=a(b,c);e&&(b=f("filters").apply(b,"html",c));return b})});
|
||||
emmet.exec(function(f,d){function h(c,a,g){var e=f("utils"),h=b.get("filter.commentTrigger");if(h=="*"||d.find(h.split(","),function(a){return!!c.attribute(e.trim(a))}))h={node:c,name:c.name(),padding:c.parent?c.parent.padding:"",attr:function(a,b,d){return(a=c.attribute(a))?(b||"")+a+(d||""):""}},a=e.normalizeNewline(a?a(h):""),g=e.normalizeNewline(g?g(h):""),c.start=c.start.replace(/</,a+"<"),c.end=c.end.replace(/>/,">"+g)}function i(b,a,g){var e=f("abbreviationUtils");d.each(b.children,function(b){e.isBlock(b)&&
|
||||
h(b,a,g);i(b,a,g)});return b}var b=f("preferences");b.define("filter.commentAfter",'\n<\!-- /<%= attr("id", "#") %><%= attr("class", ".") %> --\>',"A definition of comment that should be placed <i>after</i> matched element when <code>comment</code> filter is applied. This definition is an ERB-style template passed to <code>_.template()</code> function (see Underscore.js docs for details). In template context, the following properties and functions are availabe:\n<ul><li><code>attr(name, before, after)</code> \u2013 a function that outputsspecified attribute value concatenated with <code>before</code> and <code>after</code> strings. If attribute doesn't exists, the empty string will be returned.</li><li><code>node</code> \u2013 current node (instance of <code>AbbreviationNode</code>)</li><li><code>name</code> \u2013 name of current tag</li><li><code>padding</code> \u2013 current string padding, can be used for formatting</li></ul>");
|
||||
b.define("filter.commentBefore","","A definition of comment that should be placed <i>before</i> matched element when <code>comment</code> filter is applied. For more info, read description of <code>filter.commentAfter</code> property");b.define("filter.commentTrigger","id, class","A comma-separated list of attribute names that should exist in abbreviatoin where comment should be added. If you wish to add comment for every element, set this option to <code>*</code>");f("filters").add("c",function(c){var a=
|
||||
d.template(b.get("filter.commentBefore")),g=d.template(b.get("filter.commentAfter"));return i(c,a,g)})});emmet.exec(function(f,d){function h(b){return b.replace(/([<>&])/g,function(b,a){return i[a]})}var i={"<":"<",">":">","&":"&"};f("filters").add("e",function c(a){d.each(a.children,function(a){a.start=h(a.start);a.end=h(a.end);a.content=h(a.content);c(a)});return a})});
|
||||
emmet.exec(function(f,d){function h(a){return a.parent&&!a.parent.parent&&!a.index()}function i(a,c){var d=f("abbreviationUtils");return c.tag_nl===!0||d.isBlock(a)?!0:!a.parent||!c.inline_break?!1:b(a.parent,c)}function b(a,b){var c=0,h=f("abbreviationUtils");return!!d.find(a.children,function(a){a.isTextNode()||!h.isInline(a)?c=0:h.isInline(a)&&c++;if(c>=b.inline_break)return!0})}function c(a,c){var h=f("abbreviationUtils");return!d.any(a.children,function(a){return h.isSnippet(a)?!1:!h.isInline(a)})?
|
||||
b(a,c):!0}var a=f("preferences");a.define("format.noIndentTags","html","A comma-separated list of tag names that should not get inner indentation.");a.define("format.forceIndentationForTags","body","A comma-separated list of tag names that should <em>always</em> get inner indentation.");f("filters").add("_format",function e(b,n,o){var o=o||0,l=f("abbreviationUtils");d.each(b.children,function(b){if(l.isSnippet(b)){if(b.start=b.end="",!h(b)&&n.tag_nl!==!1&&i(b,n)&&(!b.parent.parent||!f("abbreviationUtils").isInline(b.parent)))b.start=
|
||||
f("utils").getNewline()+b.start}else{b.start=b.end="%s";var j=f("utils"),r=f("abbreviationUtils"),q=r.isUnary(b),j=j.getNewline(),u=d.include(a.getArray("format.noIndentTags")||[],b.name())?"":f("resources").getVariable("indentation");if(n.tag_nl!==!1){var s=n.tag_nl===!0&&(n.tag_nl_leaf||b.children.length);s||(s=d.include(a.getArray("format.forceIndentationForTags")||[],b.name()));if(!b.isTextNode()){if(i(b,n)){if(!h(b)&&(!r.isSnippet(b.parent)||b.index()))b.start=j+b.start;if(r.hasBlockChildren(b)||
|
||||
b.children.length&&i(b.children[0],n)||s&&!q)b.end=j+b.end;if(r.hasTagsInContent(b)||s&&!b.children.length&&!q)b.start+=j+u}else if(r.isInline(b)&&b.parent&&f("abbreviationUtils").hasBlockChildren(b.parent)&&!h(b))b.start=j+b.start;else if(r.isInline(b)&&c(b,n))b.end=j+b.end;b.padding=u}}}e(b,n,o+1)});return b})});
|
||||
emmet.exec(function(f,d){function h(h,b){var c="",a=[],g=b.attributeQuote(),e=b.cursor();d.each(h.attributeList(),function(d){var h=b.attributeName(d.name);switch(h.toLowerCase()){case "id":c+="#"+(d.value||e);break;case "class":c+="."+f("utils").trim(d.value||e).replace(/\s+/g,".");break;default:a.push(":"+h+" => "+g+(d.value||e)+g)}});a.length&&(c+="{"+a.join(", ")+"}");return c}f("filters").add("haml",function b(c,a,g){var g=g||0,e=f("abbreviationUtils");g||(c=f("filters").apply(c,"_format",a));
|
||||
d.each(c.children,function(c){if(!e.isSnippet(c)&&c.parent){var d=f("abbreviationUtils"),o=f("utils"),l=h(c,a),m=a.cursor(),d=d.isUnary(c),p=a.self_closing_tag&&d?"/":"",r="",r="%"+a.tagName(c.name());r.toLowerCase()=="%div"&&l&&l.indexOf("{")==-1&&(r="");c.end="";c.start=o.replaceSubstring(c.start,r+l+p+" ",c.start.indexOf("%s"),"%s");!c.children.length&&!d&&(c.start+=m)}b(c,a,g+1)});return c})});
|
||||
emmet.exec(function(f,d){function h(f,b){var c=b.attributeQuote(),a=b.cursor();return d.map(f.attributeList(),function(d){return" "+b.attributeName(d.name)+"="+c+(d.value||a)+c}).join("")}f("filters").add("html",function b(c,a,g){var g=g||0,e=f("abbreviationUtils");g||(c=f("filters").apply(c,"_format",a));d.each(c.children,function(c){if(!e.isSnippet(c)&&c.parent){var d=f("abbreviationUtils"),o=f("utils"),l=h(c,a),m=a.cursor(),d=d.isUnary(c),p="",r="";if(!c.isTextNode()){var q=a.tagName(c.name());
|
||||
d?(p="<"+q+l+a.selfClosing()+">",c.end=""):(p="<"+q+l+">",r="</"+q+">")}c.start=o.replaceSubstring(c.start,p,c.start.indexOf("%s"),"%s");c.end=o.replaceSubstring(c.end,r,c.end.indexOf("%s"),"%s");!c.children.length&&!d&&!~c.content.indexOf(m)&&!f("tabStops").extract(c.content).tabstops.length&&(c.start+=m)}b(c,a,g+1)});return c})});
|
||||
emmet.exec(function(f,d){var h=/^\s+/,i=/[\n\r]/g;f("filters").add("s",function c(a){var g=f("abbreviationUtils");d.each(a.children,function(a){if(!g.isSnippet(a))a.start=a.start.replace(h,""),a.end=a.end.replace(h,"");a.start=a.start.replace(i,"");a.end=a.end.replace(i,"");a.content=a.content.replace(i,"");c(a)});return a})});
|
||||
emmet.exec(function(f,d){function h(f,b){d.each(f.children,function(c){if(c.content)c.content=c.content.replace(b,"");h(c,b)});return f}f("preferences").define("filter.trimRegexp","[\\s|\\u00a0]*[\\d|#|\\-|*|\\u2022]+\\.?\\s*","Regular expression used to remove list markers (numbers, dashes, bullets, etc.) in <code>t</code> (trim) filter. The trim filter is useful for wrapping with abbreviation lists, pased from other documents (for example, Word documents).");f("filters").add("t",function(d){var b=
|
||||
RegExp(f("preferences").get("filter.trimRegexp"));return h(d,b)})});emmet.exec(function(f,d){var h={"xsl:variable":1,"xsl:with-param":1};f("filters").add("xsl",function b(c){var a=f("abbreviationUtils");d.each(c.children,function(c){if(!a.isSnippet(c)&&(c.name()||"").toLowerCase()in h&&c.children.length)c.start=c.start.replace(/\s+select\s*=\s*(['"]).*?\1/,"");b(c)});return c})});
|
||||
emmet.exec(function(f,d){function h(a,b){return Math.round(Math.random()*(b-a)+a)}function i(a,b){for(var c=a.length,g=Math.min(c,b),f=[];f.length<g;){var i=h(0,c-1);d.include(f,i)||f.push(i)}return d.map(f,function(b){return a[b]})}function b(a,b){a.length&&(a[0]=a[0].charAt(0).toUpperCase()+a[0].substring(1));return a.join(" ")+(b||(d.isString("?!...")?"?!...".charAt(h(0,4)):"?!..."[h(0,4)]))}function c(a){var b=a.length,c=0,c=b>3&&b<=6?h(0,1):b>6&&b<=12?h(0,2):h(1,4);d.each(i(d.range(c)),function(b){a[b]+=
|
||||
","})}f("abbreviationParser").addPreprocessor(function(d){var f=/^(?:lorem|lipsum)(\d*)$/i,n;d.findAll(function(d){if(d._name&&(n=d._name.match(f))){var e=n[1]||30;d._name="";d.data("forceNameResolving",d.isRepeating()||d.attributeList().length);d.data("pasteOverwrites",!0);d.data("paste",function(d){var f=e,j=!d,d=[],n=0,f=parseInt(f,10);j&&(j=a.slice(0,f),j.length>5&&(j[4]+=","),n+=j.length,d.push(b(j,".")));for(;n<f;)j=i(g,Math.min(h(3,12)*h(1,5),f-n)),n+=j.length,c(j),d.push(b(j));return d.join(" ")})}})});
|
||||
var a="lorem ipsum dolor sit amet consectetur adipisicing elit".split(" "),g=["exercitationem","perferendis","perspiciatis","laborum","eveniet","sunt","iure","nam","nobis","eum","cum","officiis","excepturi","odio","consectetur","quasi","aut","quisquam","vel","eligendi","itaque","non","odit","tempore","quaerat","dignissimos","facilis","neque","nihil","expedita","vitae","vero","ipsum","nisi","animi","cumque","pariatur","velit","modi","natus","iusto","eaque","sequi","illo","sed","ex","et","voluptatibus",
|
||||
"tempora","veritatis","ratione","assumenda","incidunt","nostrum","placeat","aliquid","fuga","provident","praesentium","rem","necessitatibus","suscipit","adipisci","quidem","possimus","voluptas","debitis","sint","accusantium","unde","sapiente","voluptate","qui","aspernatur","laudantium","soluta","amet","quo","aliquam","saepe","culpa","libero","ipsa","dicta","reiciendis","nesciunt","doloribus","autem","impedit","minima","maiores","repudiandae","ipsam","obcaecati","ullam","enim","totam","delectus","ducimus",
|
||||
"quis","voluptates","dolores","molestiae","harum","dolorem","quia","voluptatem","molestias","magni","distinctio","omnis","illum","dolorum","voluptatum","ea","quas","quam","corporis","quae","blanditiis","atque","deserunt","laboriosam","earum","consequuntur","hic","cupiditate","quibusdam","accusamus","ut","rerum","error","minus","eius","ab","ad","nemo","fugit","officia","at","in","id","quos","reprehenderit","numquam","iste","fugiat","sit","inventore","beatae","repellendus","magnam","recusandae","quod",
|
||||
"explicabo","doloremque","aperiam","consequatur","asperiores","commodi","optio","dolor","labore","temporibus","repellat","veniam","architecto","est","esse","mollitia","nulla","a","similique","eos","alias","dolore","tenetur","deleniti","porro","facere","maxime","corrupti"]});emmet.exec(function(f){f("actions").add("select_line",function(d){var f=d.getCurrentLineRange();d.createSelection(f.start,f.end);return!0})});
|
||||
emmet.exec(function(f){f("resources").setVocabulary({variables:{lang:"en",locale:"en-US",charset:"UTF-8",indentation:"\t",newline:"\n"},css:{filters:"html",snippets:{"@i":"@import url(|);","@import":"@import url(|);","@m":"@media ${1:screen} {\n\t|\n}","@media":"@media ${1:screen} {\n\t|\n}","@f":"@font-face {\n\tfont-family:|;\n\tsrc:url(|);\n}","@f+":"@font-face {\n\tfont-family: '${1:FontName}';\n\tsrc: url('${2:FileName}.eot');\n\tsrc: url('${2:FileName}.eot?#iefix') format('embedded-opentype'),\n\t\t url('${2:FileName}.woff') format('woff'),\n\t\t url('${2:FileName}.ttf') format('truetype'),\n\t\t url('${2:FileName}.svg#${1:FontName}') format('svg');\n\tfont-style: ${3:normal};\n\tfont-weight: ${4:normal};\n}",
|
||||
"@kf":"@-webkit-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@-o-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@-moz-keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}\n@keyframes ${1:identifier} {\n\t${2:from} { ${3} }${6}\n\t${4:to} { ${5} }\n}",anim:"animation:|;","anim-":"animation:${1:name} ${2:duration} ${3:timing-function} ${4:delay} ${5:iteration-count} ${6:direction} ${7:fill-mode};",animdel:"animation-delay:${1:time};",
|
||||
animdir:"animation-direction:${1:normal};","animdir:n":"animation-direction:normal;","animdir:r":"animation-direction:reverse;","animdir:a":"animation-direction:alternate;","animdir:ar":"animation-direction:alternate-reverse;",animdur:"animation-duration:${1:0}s;",animfm:"animation-fill-mode:${1:both};","animfm:f":"animation-fill-mode:forwards;","animfm:b":"animation-fill-mode:backwards;","animfm:bt":"animation-fill-mode:both;","animfm:bh":"animation-fill-mode:both;",animic:"animation-iteration-count:${1:1};",
|
||||
"animic:i":"animation-iteration-count:infinite;",animn:"animation-name:${1:none};",animps:"animation-play-state:${1:running};","animps:p":"animation-play-state:paused;","animps:r":"animation-play-state:running;",animtf:"animation-timing-function:${1:linear};","animtf:e":"animation-timing-function:ease;","animtf:ei":"animation-timing-function:ease-in;","animtf:eo":"animation-timing-function:ease-out;","animtf:eio":"animation-timing-function:ease-in-out;","animtf:l":"animation-timing-function:linear;",
|
||||
"animtf:cb":"animation-timing-function:cubic-bezier(${1:0.1}, ${2:0.7}, ${3:1.0}, ${3:0.1});",ap:"appearance:${none}","!":"!important",pos:"position:${1:relative};","pos:s":"position:static;","pos:a":"position:absolute;","pos:r":"position:relative;","pos:f":"position:fixed;",t:"top:|;","t:a":"top:auto;",r:"right:|;","r:a":"right:auto;",b:"bottom:|;","b:a":"bottom:auto;",l:"left:|;","l:a":"left:auto;",z:"z-index:|;","z:a":"z-index:auto;",fl:"float:${1:left};","fl:n":"float:none;","fl:l":"float:left;",
|
||||
"fl:r":"float:right;",cl:"clear:${1:both};","cl:n":"clear:none;","cl:l":"clear:left;","cl:r":"clear:right;","cl:b":"clear:both;",colm:"columns:|;",colmc:"column-count:|;",colmf:"column-fill:|;",colmg:"column-gap:|;",colmr:"column-rule:|;",colmrc:"column-rule-color:|;",colmrs:"column-rule-style:|;",colmrw:"column-rule-width:|;",colms:"column-span:|;",colmw:"column-width:|;",d:"display:${1:block};","d:n":"display:none;","d:b":"display:block;","d:i":"display:inline;","d:ib":"display:inline-block;","d:li":"display:list-item;",
|
||||
"d:ri":"display:run-in;","d:cp":"display:compact;","d:tb":"display:table;","d:itb":"display:inline-table;","d:tbcp":"display:table-caption;","d:tbcl":"display:table-column;","d:tbclg":"display:table-column-group;","d:tbhg":"display:table-header-group;","d:tbfg":"display:table-footer-group;","d:tbr":"display:table-row;","d:tbrg":"display:table-row-group;","d:tbc":"display:table-cell;","d:rb":"display:ruby;","d:rbb":"display:ruby-base;","d:rbbg":"display:ruby-base-group;","d:rbt":"display:ruby-text;",
|
||||
"d:rbtg":"display:ruby-text-group;",v:"visibility:${1:hidden};","v:v":"visibility:visible;","v:h":"visibility:hidden;","v:c":"visibility:collapse;",ov:"overflow:${1:hidden};","ov:v":"overflow:visible;","ov:h":"overflow:hidden;","ov:s":"overflow:scroll;","ov:a":"overflow:auto;",ovx:"overflow-x:${1:hidden};","ovx:v":"overflow-x:visible;","ovx:h":"overflow-x:hidden;","ovx:s":"overflow-x:scroll;","ovx:a":"overflow-x:auto;",ovy:"overflow-y:${1:hidden};","ovy:v":"overflow-y:visible;","ovy:h":"overflow-y:hidden;",
|
||||
"ovy:s":"overflow-y:scroll;","ovy:a":"overflow-y:auto;",ovs:"overflow-style:${1:scrollbar};","ovs:a":"overflow-style:auto;","ovs:s":"overflow-style:scrollbar;","ovs:p":"overflow-style:panner;","ovs:m":"overflow-style:move;","ovs:mq":"overflow-style:marquee;",zoo:"zoom:1;",zm:"zoom:1;",cp:"clip:|;","cp:a":"clip:auto;","cp:r":"clip:rect(${1:top} ${2:right} ${3:bottom} ${4:left});",bxz:"box-sizing:${1:border-box};","bxz:cb":"box-sizing:content-box;","bxz:bb":"box-sizing:border-box;",bxsh:"box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:color};",
|
||||
"bxsh:r":"box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:spread }rgb(${6:0}, ${7:0}, ${8:0});","bxsh:ra":"box-shadow:${1:inset }${2:h} ${3:v} ${4:blur} ${5:spread }rgba(${6:0}, ${7:0}, ${8:0}, .${9:5});","bxsh:n":"box-shadow:none;",m:"margin:|;","m:a":"margin:auto;",mt:"margin-top:|;","mt:a":"margin-top:auto;",mr:"margin-right:|;","mr:a":"margin-right:auto;",mb:"margin-bottom:|;","mb:a":"margin-bottom:auto;",ml:"margin-left:|;","ml:a":"margin-left:auto;",p:"padding:|;",pt:"padding-top:|;",
|
||||
pr:"padding-right:|;",pb:"padding-bottom:|;",pl:"padding-left:|;",w:"width:|;","w:a":"width:auto;",h:"height:|;","h:a":"height:auto;",maw:"max-width:|;","maw:n":"max-width:none;",mah:"max-height:|;","mah:n":"max-height:none;",miw:"min-width:|;",mih:"min-height:|;",mar:"max-resolution:${1:res};",mir:"min-resolution:${1:res};",ori:"orientation:|;","ori:l":"orientation:landscape;","ori:p":"orientation:portrait;",ol:"outline:|;","ol:n":"outline:none;",olo:"outline-offset:|;",olw:"outline-width:|;",ols:"outline-style:|;",
|
||||
olc:"outline-color:#${1:000};","olc:i":"outline-color:invert;",bd:"border:|;","bd+":"border:${1:1px} ${2:solid} ${3:#000};","bd:n":"border:none;",bdbk:"border-break:${1:close};","bdbk:c":"border-break:close;",bdcl:"border-collapse:|;","bdcl:c":"border-collapse:collapse;","bdcl:s":"border-collapse:separate;",bdc:"border-color:#${1:000};","bdc:t":"border-color:transparent;",bdi:"border-image:url(|);","bdi:n":"border-image:none;",bdti:"border-top-image:url(|);","bdti:n":"border-top-image:none;",bdri:"border-right-image:url(|);",
|
||||
"bdri:n":"border-right-image:none;",bdbi:"border-bottom-image:url(|);","bdbi:n":"border-bottom-image:none;",bdli:"border-left-image:url(|);","bdli:n":"border-left-image:none;",bdci:"border-corner-image:url(|);","bdci:n":"border-corner-image:none;","bdci:c":"border-corner-image:continue;",bdtli:"border-top-left-image:url(|);","bdtli:n":"border-top-left-image:none;","bdtli:c":"border-top-left-image:continue;",bdtri:"border-top-right-image:url(|);","bdtri:n":"border-top-right-image:none;","bdtri:c":"border-top-right-image:continue;",
|
||||
bdbri:"border-bottom-right-image:url(|);","bdbri:n":"border-bottom-right-image:none;","bdbri:c":"border-bottom-right-image:continue;",bdbli:"border-bottom-left-image:url(|);","bdbli:n":"border-bottom-left-image:none;","bdbli:c":"border-bottom-left-image:continue;",bdf:"border-fit:${1:repeat};","bdf:c":"border-fit:clip;","bdf:r":"border-fit:repeat;","bdf:sc":"border-fit:scale;","bdf:st":"border-fit:stretch;","bdf:ow":"border-fit:overwrite;","bdf:of":"border-fit:overflow;","bdf:sp":"border-fit:space;",
|
||||
bdlen:"border-length:|;","bdlen:a":"border-length:auto;",bdsp:"border-spacing:|;",bds:"border-style:|;","bds:n":"border-style:none;","bds:h":"border-style:hidden;","bds:dt":"border-style:dotted;","bds:ds":"border-style:dashed;","bds:s":"border-style:solid;","bds:db":"border-style:double;","bds:dtds":"border-style:dot-dash;","bds:dtdtds":"border-style:dot-dot-dash;","bds:w":"border-style:wave;","bds:g":"border-style:groove;","bds:r":"border-style:ridge;","bds:i":"border-style:inset;","bds:o":"border-style:outset;",
|
||||
bdw:"border-width:|;",bdtw:"border-top-width:|;",bdrw:"border-right-width:|;",bdbw:"border-bottom-width:|;",bdlw:"border-left-width:|;",bdt:"border-top:|;",bt:"border-top:|;","bdt+":"border-top:${1:1px} ${2:solid} ${3:#000};","bdt:n":"border-top:none;",bdts:"border-top-style:|;","bdts:n":"border-top-style:none;",bdtc:"border-top-color:#${1:000};","bdtc:t":"border-top-color:transparent;",bdr:"border-right:|;",br:"border-right:|;","bdr+":"border-right:${1:1px} ${2:solid} ${3:#000};","bdr:n":"border-right:none;",
|
||||
bdrst:"border-right-style:|;","bdrst:n":"border-right-style:none;",bdrc:"border-right-color:#${1:000};","bdrc:t":"border-right-color:transparent;",bdb:"border-bottom:|;",bb:"border-bottom:|;","bdb+":"border-bottom:${1:1px} ${2:solid} ${3:#000};","bdb:n":"border-bottom:none;",bdbs:"border-bottom-style:|;","bdbs:n":"border-bottom-style:none;",bdbc:"border-bottom-color:#${1:000};","bdbc:t":"border-bottom-color:transparent;",bdl:"border-left:|;",bl:"border-left:|;","bdl+":"border-left:${1:1px} ${2:solid} ${3:#000};",
|
||||
"bdl:n":"border-left:none;",bdls:"border-left-style:|;","bdls:n":"border-left-style:none;",bdlc:"border-left-color:#${1:000};","bdlc:t":"border-left-color:transparent;",bdrs:"border-radius:|;",bdtrrs:"border-top-right-radius:|;",bdtlrs:"border-top-left-radius:|;",bdbrrs:"border-bottom-right-radius:|;",bdblrs:"border-bottom-left-radius:|;",bg:"background:|;","bg+":"background:${1:#fff} url(${2}) ${3:0} ${4:0} ${5:no-repeat};","bg:n":"background:none;","bg:ie":"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1:x}.png',sizingMethod='${2:crop}');",
|
||||
bgc:"background-color:#${1:fff};","bgc:t":"background-color:transparent;",bgi:"background-image:url(|);","bgi:n":"background-image:none;",bgr:"background-repeat:|;","bgr:n":"background-repeat:no-repeat;","bgr:x":"background-repeat:repeat-x;","bgr:y":"background-repeat:repeat-y;","bgr:sp":"background-repeat:space;","bgr:rd":"background-repeat:round;",bga:"background-attachment:|;","bga:f":"background-attachment:fixed;","bga:s":"background-attachment:scroll;",bgp:"background-position:${1:0} ${2:0};",
|
||||
bgpx:"background-position-x:|;",bgpy:"background-position-y:|;",bgbk:"background-break:|;","bgbk:bb":"background-break:bounding-box;","bgbk:eb":"background-break:each-box;","bgbk:c":"background-break:continuous;",bgcp:"background-clip:${1:padding-box};","bgcp:bb":"background-clip:border-box;","bgcp:pb":"background-clip:padding-box;","bgcp:cb":"background-clip:content-box;","bgcp:nc":"background-clip:no-clip;",bgo:"background-origin:|;","bgo:pb":"background-origin:padding-box;","bgo:bb":"background-origin:border-box;",
|
||||
"bgo:cb":"background-origin:content-box;",bgsz:"background-size:|;","bgsz:a":"background-size:auto;","bgsz:ct":"background-size:contain;","bgsz:cv":"background-size:cover;",c:"color:#${1:000};","c:r":"color:rgb(${1:0}, ${2:0}, ${3:0});","c:ra":"color:rgba(${1:0}, ${2:0}, ${3:0}, .${4:5});",cm:"/* |${child} */",cnt:"content:'|';","cnt:n":"content:normal;","cnt:oq":"content:open-quote;","cnt:noq":"content:no-open-quote;","cnt:cq":"content:close-quote;","cnt:ncq":"content:no-close-quote;","cnt:a":"content:attr(|);",
|
||||
"cnt:c":"content:counter(|);","cnt:cs":"content:counters(|);",tbl:"table-layout:|;","tbl:a":"table-layout:auto;","tbl:f":"table-layout:fixed;",cps:"caption-side:|;","cps:t":"caption-side:top;","cps:b":"caption-side:bottom;",ec:"empty-cells:|;","ec:s":"empty-cells:show;","ec:h":"empty-cells:hide;",lis:"list-style:|;","lis:n":"list-style:none;",lisp:"list-style-position:|;","lisp:i":"list-style-position:inside;","lisp:o":"list-style-position:outside;",list:"list-style-type:|;","list:n":"list-style-type:none;",
|
||||
"list:d":"list-style-type:disc;","list:c":"list-style-type:circle;","list:s":"list-style-type:square;","list:dc":"list-style-type:decimal;","list:dclz":"list-style-type:decimal-leading-zero;","list:lr":"list-style-type:lower-roman;","list:ur":"list-style-type:upper-roman;",lisi:"list-style-image:|;","lisi:n":"list-style-image:none;",q:"quotes:|;","q:n":"quotes:none;","q:ru":"quotes:'\\00AB' '\\00BB' '\\201E' '\\201C';","q:en":"quotes:'\\201C' '\\201D' '\\2018' '\\2019';",ct:"content:|;","ct:n":"content:normal;",
|
||||
"ct:oq":"content:open-quote;","ct:noq":"content:no-open-quote;","ct:cq":"content:close-quote;","ct:ncq":"content:no-close-quote;","ct:a":"content:attr(|);","ct:c":"content:counter(|);","ct:cs":"content:counters(|);",coi:"counter-increment:|;",cor:"counter-reset:|;",va:"vertical-align:${1:top};","va:sup":"vertical-align:super;","va:t":"vertical-align:top;","va:tt":"vertical-align:text-top;","va:m":"vertical-align:middle;","va:bl":"vertical-align:baseline;","va:b":"vertical-align:bottom;","va:tb":"vertical-align:text-bottom;",
|
||||
"va:sub":"vertical-align:sub;",ta:"text-align:${1:left};","ta:l":"text-align:left;","ta:c":"text-align:center;","ta:r":"text-align:right;","ta:j":"text-align:justify;","ta-lst":"text-align-last:|;","tal:a":"text-align-last:auto;","tal:l":"text-align-last:left;","tal:c":"text-align-last:center;","tal:r":"text-align-last:right;",td:"text-decoration:${1:none};","td:n":"text-decoration:none;","td:u":"text-decoration:underline;","td:o":"text-decoration:overline;","td:l":"text-decoration:line-through;",
|
||||
te:"text-emphasis:|;","te:n":"text-emphasis:none;","te:ac":"text-emphasis:accent;","te:dt":"text-emphasis:dot;","te:c":"text-emphasis:circle;","te:ds":"text-emphasis:disc;","te:b":"text-emphasis:before;","te:a":"text-emphasis:after;",th:"text-height:|;","th:a":"text-height:auto;","th:f":"text-height:font-size;","th:t":"text-height:text-size;","th:m":"text-height:max-size;",ti:"text-indent:|;","ti:-":"text-indent:-9999px;",tj:"text-justify:|;","tj:a":"text-justify:auto;","tj:iw":"text-justify:inter-word;",
|
||||
"tj:ii":"text-justify:inter-ideograph;","tj:ic":"text-justify:inter-cluster;","tj:d":"text-justify:distribute;","tj:k":"text-justify:kashida;","tj:t":"text-justify:tibetan;",tov:"text-overflow:${ellipsis};","tov:e":"text-overflow:ellipsis;","tov:c":"text-overflow:clip;",to:"text-outline:|;","to+":"text-outline:${1:0} ${2:0} ${3:#000};","to:n":"text-outline:none;",tr:"text-replace:|;","tr:n":"text-replace:none;",tt:"text-transform:${1:uppercase};","tt:n":"text-transform:none;","tt:c":"text-transform:capitalize;",
|
||||
"tt:u":"text-transform:uppercase;","tt:l":"text-transform:lowercase;",tw:"text-wrap:|;","tw:n":"text-wrap:normal;","tw:no":"text-wrap:none;","tw:u":"text-wrap:unrestricted;","tw:s":"text-wrap:suppress;",tsh:"text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000};","tsh:r":"text-shadow:${1:h} ${2:v} ${3:blur} rgb(${4:0}, ${5:0}, ${6:0});","tsh:ra":"text-shadow:${1:h} ${2:v} ${3:blur} rgba(${4:0}, ${5:0}, ${6:0}, .${7:5});","tsh+":"text-shadow:${1:0} ${2:0} ${3:0} ${4:#000};","tsh:n":"text-shadow:none;",
|
||||
trf:"transform:|;","trf:skx":"transform: skewX(${1:angle});","trf:sky":"transform: skewY(${1:angle});","trf:sc":"transform: scale(${1:x}, ${2:y});","trf:scx":"transform: scaleX(${1:x});","trf:scy":"transform: scaleY(${1:y});","trf:r":"transform: rotate(${1:angle});","trf:t":"transform: translate(${1:x}, ${2:y});","trf:tx":"transform: translateX(${1:x});","trf:ty":"transform: translateY(${1:y});",trfo:"transform-origin:|;",trfs:"transform-style:${1:preserve-3d};",trs:"transition:${1:prop} ${2:time};",
|
||||
trsde:"transition-delay:${1:time};",trsdu:"transition-duration:${1:time};",trsp:"transition-property:${1:prop};",trstf:"transition-timing-function:${1:tfunc};",lh:"line-height:|;",whs:"white-space:|;","whs:n":"white-space:normal;","whs:p":"white-space:pre;","whs:nw":"white-space:nowrap;","whs:pw":"white-space:pre-wrap;","whs:pl":"white-space:pre-line;",whsc:"white-space-collapse:|;","whsc:n":"white-space-collapse:normal;","whsc:k":"white-space-collapse:keep-all;","whsc:l":"white-space-collapse:loose;",
|
||||
"whsc:bs":"white-space-collapse:break-strict;","whsc:ba":"white-space-collapse:break-all;",wob:"word-break:|;","wob:n":"word-break:normal;","wob:k":"word-break:keep-all;","wob:l":"word-break:loose;","wob:bs":"word-break:break-strict;","wob:ba":"word-break:break-all;",wos:"word-spacing:|;",wow:"word-wrap:|;","wow:nm":"word-wrap:normal;","wow:n":"word-wrap:none;","wow:u":"word-wrap:unrestricted;","wow:s":"word-wrap:suppress;",lts:"letter-spacing:|;",f:"font:|;","f+":"font:${1:1em} ${2:Arial,sans-serif};",
|
||||
fw:"font-weight:|;","fw:n":"font-weight:normal;","fw:b":"font-weight:bold;","fw:br":"font-weight:bolder;","fw:lr":"font-weight:lighter;",fs:"font-style:${italic};","fs:n":"font-style:normal;","fs:i":"font-style:italic;","fs:o":"font-style:oblique;",fv:"font-variant:|;","fv:n":"font-variant:normal;","fv:sc":"font-variant:small-caps;",fz:"font-size:|;",fza:"font-size-adjust:|;","fza:n":"font-size-adjust:none;",ff:"font-family:|;","ff:s":"font-family:serif;","ff:ss":"font-family:sans-serif;","ff:c":"font-family:cursive;",
|
||||
"ff:f":"font-family:fantasy;","ff:m":"font-family:monospace;",fef:"font-effect:|;","fef:n":"font-effect:none;","fef:eg":"font-effect:engrave;","fef:eb":"font-effect:emboss;","fef:o":"font-effect:outline;",fem:"font-emphasize:|;",femp:"font-emphasize-position:|;","femp:b":"font-emphasize-position:before;","femp:a":"font-emphasize-position:after;",fems:"font-emphasize-style:|;","fems:n":"font-emphasize-style:none;","fems:ac":"font-emphasize-style:accent;","fems:dt":"font-emphasize-style:dot;","fems:c":"font-emphasize-style:circle;",
|
||||
"fems:ds":"font-emphasize-style:disc;",fsm:"font-smooth:|;","fsm:a":"font-smooth:auto;","fsm:n":"font-smooth:never;","fsm:aw":"font-smooth:always;",fst:"font-stretch:|;","fst:n":"font-stretch:normal;","fst:uc":"font-stretch:ultra-condensed;","fst:ec":"font-stretch:extra-condensed;","fst:c":"font-stretch:condensed;","fst:sc":"font-stretch:semi-condensed;","fst:se":"font-stretch:semi-expanded;","fst:e":"font-stretch:expanded;","fst:ee":"font-stretch:extra-expanded;","fst:ue":"font-stretch:ultra-expanded;",
|
||||
op:"opacity:|;","op:ie":"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);","op:ms":"-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';",rsz:"resize:|;","rsz:n":"resize:none;","rsz:b":"resize:both;","rsz:h":"resize:horizontal;","rsz:v":"resize:vertical;",cur:"cursor:${pointer};","cur:a":"cursor:auto;","cur:d":"cursor:default;","cur:c":"cursor:crosshair;","cur:ha":"cursor:hand;","cur:he":"cursor:help;","cur:m":"cursor:move;","cur:p":"cursor:pointer;","cur:t":"cursor:text;",
|
||||
pgbb:"page-break-before:|;","pgbb:au":"page-break-before:auto;","pgbb:al":"page-break-before:always;","pgbb:l":"page-break-before:left;","pgbb:r":"page-break-before:right;",pgbi:"page-break-inside:|;","pgbi:au":"page-break-inside:auto;","pgbi:av":"page-break-inside:avoid;",pgba:"page-break-after:|;","pgba:au":"page-break-after:auto;","pgba:al":"page-break-after:always;","pgba:l":"page-break-after:left;","pgba:r":"page-break-after:right;",orp:"orphans:|;",us:"user-select:${none};",wid:"widows:|;",
|
||||
wfsm:"-webkit-font-smoothing:${antialiased};","wfsm:a":"-webkit-font-smoothing:antialiased;","wfsm:s":"-webkit-font-smoothing:subpixel-antialiased;","wfsm:sa":"-webkit-font-smoothing:subpixel-antialiased;","wfsm:n":"-webkit-font-smoothing:none;"}},html:{filters:"html",profile:"html",snippets:{"!!!":"<!doctype html>","!!!4t":'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',"!!!4s":'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
|
||||
"!!!xt":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',"!!!xs":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',"!!!xxs":'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',c:"<\!-- |${child} --\>","cc:ie6":"<\!--[if lte IE 6]>\n\t${child}|\n<![endif]--\>","cc:ie":"<\!--[if IE]>\n\t${child}|\n<![endif]--\>","cc:noie":"<\!--[if !IE]><\!--\>\n\t${child}|\n<\!--<![endif]--\>"},
|
||||
abbreviations:{"!":"html:5",a:'<a href="">',"a:link":'<a href="http://|">',"a:mail":'<a href="mailto:|">',abbr:'<abbr title="">',acronym:'<acronym title="">',base:'<base href="" />',bdo:'<bdo dir="">',"bdo:r":'<bdo dir="rtl">',"bdo:l":'<bdo dir="ltr">',link:'<link rel="stylesheet" href="" />',"link:css":'<link rel="stylesheet" href="${1:style}.css" media="all" />',"link:print":'<link rel="stylesheet" href="${1:print}.css" media="print" />',"link:favicon":'<link rel="shortcut icon" type="image/x-icon" href="${1:favicon.ico}" />',
|
||||
"link:touch":'<link rel="apple-touch-icon" href="${1:favicon.png}" />',"link:rss":'<link rel="alternate" type="application/rss+xml" title="RSS" href="${1:rss.xml}" />',"link:atom":'<link rel="alternate" type="application/atom+xml" title="Atom" href="${1:atom.xml}" />',"meta:utf":'<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />',"meta:win":'<meta http-equiv="Content-Type" content="text/html;charset=windows-1251" />',"meta:vp":'<meta name="viewport" content="width=${1:device-width}, user-scalable=${2:no}, initial-scale=${3:1.0}, maximum-scale=${4:1.0}, minimum-scale=${5:1.0}" />',
|
||||
"meta:compat":'<meta http-equiv="X-UA-Compatible" content="${1:IE=7}" />',style:"<style>",script:"<script>","script:src":'<script src="">',img:'<img src="" alt="" />',iframe:'<iframe src="" frameborder="0">',embed:'<embed src="" type="" />',object:'<object data="" type="">',param:'<param name="" value="" />',map:'<map name="">',area:'<area shape="" coords="" href="" alt="" />',"area:d":'<area shape="default" href="" alt="" />',"area:c":'<area shape="circle" coords="" href="" alt="" />',"area:r":'<area shape="rect" coords="" href="" alt="" />',
|
||||
"area:p":'<area shape="poly" coords="" href="" alt="" />',form:'<form action="">',"form:get":'<form action="" method="get">',"form:post":'<form action="" method="post">',label:'<label for="">',input:'<input type="${1:text}" />',inp:'<input type="${1:text}" name="" id="" />',"input:hidden":"input[type=hidden name]","input:h":"input:hidden","input:text":"inp","input:t":"inp","input:search":"inp[type=search]","input:email":"inp[type=email]","input:url":"inp[type=url]","input:password":"inp[type=password]",
|
||||
"input:p":"input:password","input:datetime":"inp[type=datetime]","input:date":"inp[type=date]","input:datetime-local":"inp[type=datetime-local]","input:month":"inp[type=month]","input:week":"inp[type=week]","input:time":"inp[type=time]","input:number":"inp[type=number]","input:color":"inp[type=color]","input:checkbox":"inp[type=checkbox]","input:c":"input:checkbox","input:radio":"inp[type=radio]","input:r":"input:radio","input:range":"inp[type=range]","input:file":"inp[type=file]","input:f":"input:file",
|
||||
"input:submit":'<input type="submit" value="" />',"input:s":"input:submit","input:image":'<input type="image" src="" alt="" />',"input:i":"input:image","input:button":'<input type="button" value="" />',"input:b":"input:button","input:reset":"input:button[type=reset]",select:'<select name="" id="">',option:'<option value="">',textarea:'<textarea name="" id="" cols="${1:30}" rows="${2:10}">',"menu:context":"menu[type=context]>","menu:c":"menu:context","menu:toolbar":"menu[type=toolbar]>","menu:t":"menu:toolbar",
|
||||
video:'<video src="">',audio:'<audio src="">',"html:xml":'<html xmlns="http://www.w3.org/1999/xhtml">',bq:"blockquote",acr:"acronym",fig:"figure",figc:"figcaption",ifr:"iframe",emb:"embed",obj:"object",src:"source",cap:"caption",colg:"colgroup",fst:"fieldset",btn:"button",optg:"optgroup",opt:"option",tarea:"textarea",leg:"legend",sect:"section",art:"article",hdr:"header",ftr:"footer",adr:"address",dlg:"dialog",str:"strong",prog:"progress",fset:"fieldset",datag:"datagrid",datal:"datalist",kg:"keygen",
|
||||
out:"output",det:"details",cmd:"command",doc:"html>(head>meta[charset=UTF-8]+title{${1:Document}})+body",doc4:'html>(head>meta[http-equiv="Content-Type" content="text/html;charset=${charset}"]+title{${1:Document}})',"html:4t":"!!!4t+doc4[lang=${lang}]","html:4s":"!!!4s+doc4[lang=${lang}]","html:xt":"!!!xt+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]","html:xs":"!!!xs+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]","html:xxs":"!!!xxs+doc4[xmlns=http://www.w3.org/1999/xhtml xml:lang=${lang}]",
|
||||
"html:5":"!!!+doc[lang=${lang}]","ol+":"ol>li","ul+":"ul>li","dl+":"dl>dt+dd","map+":"map>area","table+":"table>tr>td","colgroup+":"colgroup>col","colg+":"colgroup>col","tr+":"tr>td","select+":"select>option","optgroup+":"optgroup>option","optg+":"optgroup>option"}},xml:{"extends":"html",profile:"xml",filters:"html"},xsl:{"extends":"html",profile:"xml",filters:"html, xsl",abbreviations:{tm:'<xsl:template match="" mode="">',tmatch:"tm",tn:'<xsl:template name="">',tname:"tn",call:'<xsl:call-template name=""/>',
|
||||
ap:'<xsl:apply-templates select="" mode=""/>',api:"<xsl:apply-imports/>",imp:'<xsl:import href=""/>',inc:'<xsl:include href=""/>',ch:"<xsl:choose>","xsl:when":'<xsl:when test="">',wh:"xsl:when",ot:"<xsl:otherwise>","if":'<xsl:if test="">',par:'<xsl:param name="">',pare:'<xsl:param name="" select=""/>',"var":'<xsl:variable name="">',vare:'<xsl:variable name="" select=""/>',wp:'<xsl:with-param name="" select=""/>',key:'<xsl:key name="" match="" use=""/>',elem:'<xsl:element name="">',attr:'<xsl:attribute name="">',
|
||||
attrs:'<xsl:attribute-set name="">',cp:'<xsl:copy select=""/>',co:'<xsl:copy-of select=""/>',val:'<xsl:value-of select=""/>',each:'<xsl:for-each select="">',"for":"each",tex:"<xsl:text></xsl:text>",com:"<xsl:comment>",msg:'<xsl:message terminate="no">',fall:"<xsl:fallback>",num:'<xsl:number value=""/>',nam:'<namespace-alias stylesheet-prefix="" result-prefix=""/>',pres:'<xsl:preserve-space elements=""/>',strip:'<xsl:strip-space elements=""/>',proc:'<xsl:processing-instruction name="">',sort:'<xsl:sort select="" order=""/>',
|
||||
"choose+":"xsl:choose>xsl:when+xsl:otherwise",xsl:"!!!+xsl:stylesheet[version=1.0 xmlns:xsl=http://www.w3.org/1999/XSL/Transform]>{\n|}"},snippets:{"!!!":'<?xml version="1.0" encoding="UTF-8"?>'}},haml:{filters:"haml","extends":"html",profile:"xml"},scss:{"extends":"css"},sass:{"extends":"css"},less:{"extends":"css"},stylus:{"extends":"css"}},"system")});
|
||||
emmet.define("cm-editor-proxy",function(f,d){function h(){if(CodeMirror.version>="3.1")return CodeMirror.Pass;throw CodeMirror.Pass;}var i=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent)||/Mac/.test(navigator.platform),b={"Cmd-E":"expand_abbreviation",Tab:"expand_abbreviation_with_tab","Cmd-D":"match_pair_outward","Shift-Cmd-D":"match_pair_inward","Cmd-T":"matching_pair","Shift-Cmd-A":"wrap_with_abbreviation","Ctrl-Alt-Right":"next_edit_point","Ctrl-Alt-Left":"prev_edit_point",
|
||||
"Cmd-L":"select_line","Cmd-Shift-M":"merge_lines","Cmd-/":"toggle_comment","Cmd-J":"split_join_tag","Cmd-K":"remove_tag","Shift-Cmd-Y":"evaluate_math_expression","Ctrl-Up":"increment_number_by_1","Ctrl-Down":"decrement_number_by_1","Alt-Up":"increment_number_by_01","Alt-Down":"decrement_number_by_01","Ctrl-Alt-Up":"increment_number_by_10","Ctrl-Alt-Down":"decrement_number_by_10","Shift-Cmd-.":"select_next_item","Shift-Cmd-,":"select_previous_item","Cmd-B":"reflect_css_value",Enter:"insert_formatted_line_break_only"},
|
||||
c={"text/html":"html","application/xml":"xml","text/xsl":"xsl","text/css":"css","text/x-less":"less"};CodeMirror.defineOption?CodeMirror.defineOption("profile","html"):CodeMirror.defaults.profile="html";var a={context:null,getSelectionRange:function(){var a=this.getCaretPos();return{start:a,end:a+this.getSelection().length}},createSelection:function(a,b){a==b?this.context.setCursor(this.context.posFromIndex(a)):this.context.setSelection(this.context.posFromIndex(a),this.context.posFromIndex(b))},
|
||||
getCurrentLineRange:function(){var a=this.context.getCursor(!0);return{start:this.context.indexFromPos({line:a.line,ch:0}),end:this.context.indexFromPos({line:a.line,ch:this.context.getLine(a.line).length})}},getCaretPos:function(){return this.context.indexFromPos(this.context.getCursor(!0))},setCaretPos:function(a){this.createSelection(a,a)},getCurrentLine:function(){return this.context.getLine(this.context.getCursor(!0).line)||""},replaceContent:function(a,b,c,h){d.isUndefined(c)&&(c=d.isUndefined(b)?
|
||||
content.length:b);d.isUndefined(b)&&(b=0);var i=f("utils");h||(a=i.padString(a,i.getLinePaddingFromPosition(this.getContent(),b)));var h=f("tabStops").extract(a,{escape:function(a){return a}}),a=h.text,l=h.tabstops[0];l?(l.start+=b,l.end+=b):l={start:a.length+b,end:a.length+b};var m=this;(this.context.operation||this.context.compoundChange).call(this.context,function(){m.context.replaceRange(a,m.context.posFromIndex(b),m.context.posFromIndex(c));m.createSelection(l.start,l.end)})},getContent:function(){return this.context.getValue()},
|
||||
getSyntax:function(){var a=this.context.getOption("mode");a in c&&(a=c[a]);return f("actionUtils").detectSyntax(this,a)},getProfileName:function(){return this.context.getOption("profile")?this.context.getOption("profile"):f("actionUtils").detectProfile(this)},prompt:function(a){return prompt(a)},getSelection:function(){return this.context.getSelection()||""},getFilePath:function(){return location.href},setupContext:function(a){this.context=a;var b="\t";a.getOption("indentWithTabs")||(b=f("utils").repeatString(" ",
|
||||
a.getOption("indentUnit")));f("resources").setVariable("indentation",b)},addAction:function(b,c,d){var n="emmet."+b;CodeMirror.commands[n]||(CodeMirror.commands[n]=function(c){var d;a.setupContext(c);var e;if(e=b=="expand_abbreviation_with_tab")if(!(e=a.getSelection()))e=a.getSyntax(),e=!f("resources").hasSyntax(e);if(e)d=h();else{e=!0;try{var i=f("actions").run(b,a);(b=="next_edit_point"||b=="prev_edit_point")&&c.replaceSelection("");!i&&b=="insert_formatted_line_break_only"&&(e=!1)}catch(j){}e||
|
||||
(d=h())}return d});if(c){if(!d)if(CodeMirror.keyMap&&CodeMirror.keyMap["default"])d=CodeMirror.keyMap["default"];else{if(!CodeMirror.defaults.extraKeys)CodeMirror.defaults.extraKeys={};d=CodeMirror.defaults.extraKeys}i||(c=c.replace("Cmd","Ctrl"));d&&(d[c]=n)}}};typeof emmetKeymap!="undefined"&&(b=emmetKeymap);d.each(b,function(b,c){a.addAction(b,c)});return a});
|
||||
|
Before Width: | Height: | Size: 2.0 KiB |
1
plugins/ice-repo/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
error-log.txt
|
||||
@@ -1,24 +0,0 @@
|
||||
Copyright (C) 2013 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.
|
||||
@@ -1,47 +0,0 @@
|
||||
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/images/icerepo.png" 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 settings.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 settings.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
|
||||
Upload ICErepo, visit in a web browser & enjoy
|
||||
```
|
||||
@@ -1,99 +0,0 @@
|
||||
<?php include("settings.php"); ?>
|
||||
<!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
|
||||
// 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 = $dirSHAArray = $dirTypeArray = array();
|
||||
foreach ($objectList as $objectRef) {
|
||||
$fileFolderName = @rtrim(substr(str_replace("\\","/",$objectRef->getPathname()), strlen($path)),"..");
|
||||
if (!is_dir($path.$fileFolderName)) {
|
||||
$contents = file_get_contents($path.$fileFolderName);
|
||||
$finfo = "";
|
||||
// Determine what to do based on mime type
|
||||
if (function_exists('finfo_open')) {
|
||||
$finfoMIME = finfo_open(FILEINFO_MIME_TYPE);
|
||||
$finfo = finfo_file($finfoMIME, $path.$fileFolderName);
|
||||
finfo_close($finfoMIME);
|
||||
} else {
|
||||
$fileExt = explode(" ",pathinfo($path.$fileFolderName, PATHINFO_EXTENSION));
|
||||
$fileExt = $fileExt[0];
|
||||
if (array_search($fileExt,array("coffee","css","htm","html","js","less","md","php","py","rb","ruby","txt","xml"))!==false) {$finfo = "text";};
|
||||
if (array_search($fileExt,array("gif","jpg","jpeg","png"))!==false) {$finfo = "image";};
|
||||
}
|
||||
if (strpos($finfo,"text")===0 || strpos($finfo,"empty")!==false) {
|
||||
$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);
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<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?username=<?php echo $username;?>&password=<?php echo $password;?>" 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="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 ($token!="") {
|
||||
echo '{token: "'.$token.'", auth: "oauth"}';
|
||||
} else{
|
||||
echo '{username: "'.$username.'", password: "'.$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>
|
||||
@@ -1,131 +0,0 @@
|
||||
<?php include("settings.php"); ?>
|
||||
<?php
|
||||
//$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 ($token!="") {
|
||||
echo '{token: "'.$token.'", auth: "oauth"}';
|
||||
} else{
|
||||
echo '{username: "'.$username.'", password: "'.$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 file_exists($dir) ? 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?username=<?php echo $username;?>&password=<?php echo $password;?>" 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('loadingMask','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('loadingMask','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>
|
||||
@@ -1,100 +0,0 @@
|
||||
/* 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: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
outline: 0;
|
||||
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: fixed; display: table; width: 100%; height: 100%; top: 0; left: 0; visibility: hidden; background-color: rgba(0,0,0,0.8); text-align: center; z-index: 100}
|
||||
.blackMask .popupVCenter {#position: absolute; display: table-cell; #top: 50%; vertical-align: middle; text-align: center}
|
||||
.popupVCenter .popup {#position: relative; #top: -50%; text-align: center; color: #fff; font-size: 10px}
|
||||
.whiteGlow {box-shadow: 0 0 8px 2px rgba(255,255,255,0.6)}
|
||||
|
||||
.circleOutside {background-color: rgba(0,0,0,0); border:5px solid rgba(0,183,229,0.9); opacity:.9; border-top:5px solid rgba(0,0,0,0); border-left:5px solid rgba(0,0,0,0); border-radius:50px; box-shadow: 0 0 35px #2187e7;
|
||||
width:50px; height:50px; margin:0 auto; -moz-animation:spin .5s infinite linear; -webkit-animation:spin .5s infinite linear;
|
||||
}
|
||||
.circleInside {background-color: rgba(0,0,0,0); border:5px solid rgba(0,183,229,0.9); opacity:.9; border-top:5px solid rgba(0,0,0,0); border-left:5px solid rgba(0,0,0,0); border-radius:50px; box-shadow: 0 0 15px #2187e7;
|
||||
width:30px; height:30px; margin:0 auto; position:relative; top:-50px; -moz-animation:spinoff .5s infinite linear; -webkit-animation:spinoff .5s infinite linear;
|
||||
}
|
||||
@-moz-keyframes spin {
|
||||
0% {-moz-transform:rotate(0deg)}
|
||||
100% {-moz-transform:rotate(360deg)}
|
||||
}
|
||||
@-moz-keyframes spinoff {
|
||||
0% {-moz-transform:rotate(0deg)}
|
||||
100% {-moz-transform:rotate(-360deg)}
|
||||
}
|
||||
@-webkit-keyframes spin {
|
||||
0% {-webkit-transform:rotate(0deg)}
|
||||
100% {-webkit-transform:rotate(360deg)}
|
||||
}
|
||||
@-webkit-keyframes spinoff {
|
||||
0% {-webkit-transform:rotate(0deg)}
|
||||
100% {-webkit-transform:rotate(-360deg)}
|
||||
}
|
||||
|
||||
.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}
|
||||
@@ -1,337 +0,0 @@
|
||||
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('loadingMask','top').style.display = "table";
|
||||
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('loadingMask','top').style.display = "table";
|
||||
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 ? dirContent : '');
|
||||
var newtxt = difflib.stringAsLines(repoContent ? 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('loadingMask','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('loadingMask','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('loadingMask','top').style.display='none';
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,71 +0,0 @@
|
||||
<?php include("settings.php"); ?>
|
||||
<!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="ice-repo.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="ice-repo.css">
|
||||
</head>
|
||||
|
||||
<?php
|
||||
if (isset($_GET['sessionLogin'])) {
|
||||
?>
|
||||
|
||||
<form name="sessionLogin" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="POST">
|
||||
<b>Token:</b><br>
|
||||
<input type="text" name="token">
|
||||
<br><br>
|
||||
or:<br><br>
|
||||
<b>Username:</b><br>
|
||||
<input type="text" name="username"><br>
|
||||
<b>Password:</b><br>
|
||||
<input type="password" name="password"><br>
|
||||
<input type="submit">
|
||||
</form>
|
||||
|
||||
<?php
|
||||
} else {
|
||||
?>
|
||||
<body style="margin: 0; overflow: hidden" onLoad="doRepo(get('repos').value)">
|
||||
|
||||
<div id="loadingMask" class="blackMask" style="visibility: visible" onContextMenu="return false">
|
||||
<div class="popupVCenter">
|
||||
<div class="popup">
|
||||
<div class="circleOutside"></div>
|
||||
<div class="circleInside"></div>
|
||||
working...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
|
||||
<form name="showRepo" action="contents.php?username=<?php echo $username;?>&password=<?php echo $password;?>" target="repo" method="POST">
|
||||
<input type="hidden" name="repo" value="">
|
||||
</form>
|
||||
|
||||
<iframe id="repo" class="repoFrame" frameborder="0"></iframe>
|
||||
<?php
|
||||
;};
|
||||
?>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,5 +0,0 @@
|
||||
// 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
|
||||
@@ -1,576 +0,0 @@
|
||||
/***
|
||||
This is part of jsdifflib v1.0. <http://snowtide.com/jsdifflib>
|
||||
|
||||
Copyright (c) 2007, Snowtide Informatics Systems, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of the Snowtide Informatics Systems nor the names of its
|
||||
contributors may be used to endorse or promote products derived from this
|
||||
software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
||||
***/
|
||||
/* Author: Chas Emerick <cemerick@snowtide.com> */
|
||||
__whitespace = {" ":true, "\t":true, "\n":true, "\f":true, "\r":true};
|
||||
|
||||
difflib = {
|
||||
defaultJunkFunction: function (c) {
|
||||
return __whitespace.hasOwnProperty(c);
|
||||
},
|
||||
|
||||
stripLinebreaks: function (str) { return str.replace(/^[\n\r]*|[\n\r]*$/g, ""); },
|
||||
|
||||
stringAsLines: function (str) {
|
||||
var lfpos = str.indexOf("\n");
|
||||
var crpos = str.indexOf("\r");
|
||||
var linebreak = ((lfpos > -1 && crpos > -1) || crpos < 0) ? "\n" : "\r";
|
||||
|
||||
var lines = str.split(linebreak);
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
lines[i] = difflib.stripLinebreaks(lines[i]);
|
||||
}
|
||||
|
||||
return lines;
|
||||
},
|
||||
|
||||
// iteration-based reduce implementation
|
||||
__reduce: function (func, list, initial) {
|
||||
if (initial != null) {
|
||||
var value = initial;
|
||||
var idx = 0;
|
||||
} else if (list) {
|
||||
var value = list[0];
|
||||
var idx = 1;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (; idx < list.length; idx++) {
|
||||
value = func(value, list[idx]);
|
||||
}
|
||||
|
||||
return value;
|
||||
},
|
||||
|
||||
// comparison function for sorting lists of numeric tuples
|
||||
__ntuplecomp: function (a, b) {
|
||||
var mlen = Math.max(a.length, b.length);
|
||||
for (var i = 0; i < mlen; i++) {
|
||||
if (a[i] < b[i]) return -1;
|
||||
if (a[i] > b[i]) return 1;
|
||||
}
|
||||
|
||||
return a.length == b.length ? 0 : (a.length < b.length ? -1 : 1);
|
||||
},
|
||||
|
||||
__calculate_ratio: function (matches, length) {
|
||||
return length ? 2.0 * matches / length : 1.0;
|
||||
},
|
||||
|
||||
// returns a function that returns true if a key passed to the returned function
|
||||
// is in the dict (js object) provided to this function; replaces being able to
|
||||
// carry around dict.has_key in python...
|
||||
__isindict: function (dict) {
|
||||
return function (key) { return dict.hasOwnProperty(key); };
|
||||
},
|
||||
|
||||
// replacement for python's dict.get function -- need easy default values
|
||||
__dictget: function (dict, key, defaultValue) {
|
||||
return dict.hasOwnProperty(key) ? dict[key] : defaultValue;
|
||||
},
|
||||
|
||||
SequenceMatcher: function (a, b, isjunk) {
|
||||
this.set_seqs = function (a, b) {
|
||||
this.set_seq1(a);
|
||||
this.set_seq2(b);
|
||||
}
|
||||
|
||||
this.set_seq1 = function (a) {
|
||||
if (a == this.a) return;
|
||||
this.a = a;
|
||||
this.matching_blocks = this.opcodes = null;
|
||||
}
|
||||
|
||||
this.set_seq2 = function (b) {
|
||||
if (b == this.b) return;
|
||||
this.b = b;
|
||||
this.matching_blocks = this.opcodes = this.fullbcount = null;
|
||||
this.__chain_b();
|
||||
}
|
||||
|
||||
this.__chain_b = function () {
|
||||
var b = this.b;
|
||||
var n = b.length;
|
||||
var b2j = this.b2j = {};
|
||||
var populardict = {};
|
||||
for (var i = 0; i < b.length; i++) {
|
||||
var elt = b[i];
|
||||
if (b2j.hasOwnProperty(elt)) {
|
||||
var indices = b2j[elt];
|
||||
if (n >= 200 && indices.length * 100 > n) {
|
||||
populardict[elt] = 1;
|
||||
delete b2j[elt];
|
||||
} else {
|
||||
indices.push(i);
|
||||
}
|
||||
} else {
|
||||
b2j[elt] = [i];
|
||||
}
|
||||
}
|
||||
|
||||
for (var elt in populardict) {
|
||||
if (populardict.hasOwnProperty(elt)) {
|
||||
delete b2j[elt];
|
||||
}
|
||||
}
|
||||
|
||||
var isjunk = this.isjunk;
|
||||
var junkdict = {};
|
||||
if (isjunk) {
|
||||
for (var elt in populardict) {
|
||||
if (populardict.hasOwnProperty(elt) && isjunk(elt)) {
|
||||
junkdict[elt] = 1;
|
||||
delete populardict[elt];
|
||||
}
|
||||
}
|
||||
for (var elt in b2j) {
|
||||
if (b2j.hasOwnProperty(elt) && isjunk(elt)) {
|
||||
junkdict[elt] = 1;
|
||||
delete b2j[elt];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.isbjunk = difflib.__isindict(junkdict);
|
||||
this.isbpopular = difflib.__isindict(populardict);
|
||||
}
|
||||
|
||||
this.find_longest_match = function (alo, ahi, blo, bhi) {
|
||||
var a = this.a;
|
||||
var b = this.b;
|
||||
var b2j = this.b2j;
|
||||
var isbjunk = this.isbjunk;
|
||||
var besti = alo;
|
||||
var bestj = blo;
|
||||
var bestsize = 0;
|
||||
var j = null;
|
||||
|
||||
var j2len = {};
|
||||
var nothing = [];
|
||||
for (var i = alo; i < ahi; i++) {
|
||||
var newj2len = {};
|
||||
var jdict = difflib.__dictget(b2j, a[i], nothing);
|
||||
for (var jkey in jdict) {
|
||||
if (jdict.hasOwnProperty(jkey)) {
|
||||
j = jdict[jkey];
|
||||
if (j < blo) continue;
|
||||
if (j >= bhi) break;
|
||||
newj2len[j] = k = difflib.__dictget(j2len, j - 1, 0) + 1;
|
||||
if (k > bestsize) {
|
||||
besti = i - k + 1;
|
||||
bestj = j - k + 1;
|
||||
bestsize = k;
|
||||
}
|
||||
}
|
||||
}
|
||||
j2len = newj2len;
|
||||
}
|
||||
|
||||
while (besti > alo && bestj > blo && !isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) {
|
||||
besti--;
|
||||
bestj--;
|
||||
bestsize++;
|
||||
}
|
||||
|
||||
while (besti + bestsize < ahi && bestj + bestsize < bhi &&
|
||||
!isbjunk(b[bestj + bestsize]) &&
|
||||
a[besti + bestsize] == b[bestj + bestsize]) {
|
||||
bestsize++;
|
||||
}
|
||||
|
||||
while (besti > alo && bestj > blo && isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) {
|
||||
besti--;
|
||||
bestj--;
|
||||
bestsize++;
|
||||
}
|
||||
|
||||
while (besti + bestsize < ahi && bestj + bestsize < bhi && isbjunk(b[bestj + bestsize]) &&
|
||||
a[besti + bestsize] == b[bestj + bestsize]) {
|
||||
bestsize++;
|
||||
}
|
||||
|
||||
return [besti, bestj, bestsize];
|
||||
}
|
||||
|
||||
this.get_matching_blocks = function () {
|
||||
if (this.matching_blocks != null) return this.matching_blocks;
|
||||
var la = this.a.length;
|
||||
var lb = this.b.length;
|
||||
|
||||
var queue = [[0, la, 0, lb]];
|
||||
var matching_blocks = [];
|
||||
var alo, ahi, blo, bhi, qi, i, j, k, x;
|
||||
while (queue.length) {
|
||||
qi = queue.pop();
|
||||
alo = qi[0];
|
||||
ahi = qi[1];
|
||||
blo = qi[2];
|
||||
bhi = qi[3];
|
||||
x = this.find_longest_match(alo, ahi, blo, bhi);
|
||||
i = x[0];
|
||||
j = x[1];
|
||||
k = x[2];
|
||||
|
||||
if (k) {
|
||||
matching_blocks.push(x);
|
||||
if (alo < i && blo < j)
|
||||
queue.push([alo, i, blo, j]);
|
||||
if (i+k < ahi && j+k < bhi)
|
||||
queue.push([i + k, ahi, j + k, bhi]);
|
||||
}
|
||||
}
|
||||
|
||||
matching_blocks.sort(difflib.__ntuplecomp);
|
||||
|
||||
var i1 = j1 = k1 = block = 0;
|
||||
var non_adjacent = [];
|
||||
for (var idx in matching_blocks) {
|
||||
if (matching_blocks.hasOwnProperty(idx)) {
|
||||
block = matching_blocks[idx];
|
||||
i2 = block[0];
|
||||
j2 = block[1];
|
||||
k2 = block[2];
|
||||
if (i1 + k1 == i2 && j1 + k1 == j2) {
|
||||
k1 += k2;
|
||||
} else {
|
||||
if (k1) non_adjacent.push([i1, j1, k1]);
|
||||
i1 = i2;
|
||||
j1 = j2;
|
||||
k1 = k2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (k1) non_adjacent.push([i1, j1, k1]);
|
||||
|
||||
non_adjacent.push([la, lb, 0]);
|
||||
this.matching_blocks = non_adjacent;
|
||||
return this.matching_blocks;
|
||||
}
|
||||
|
||||
this.get_opcodes = function () {
|
||||
if (this.opcodes != null) return this.opcodes;
|
||||
var i = 0;
|
||||
var j = 0;
|
||||
var answer = [];
|
||||
this.opcodes = answer;
|
||||
var block, ai, bj, size, tag;
|
||||
var blocks = this.get_matching_blocks();
|
||||
for (var idx in blocks) {
|
||||
if (blocks.hasOwnProperty(idx)) {
|
||||
block = blocks[idx];
|
||||
ai = block[0];
|
||||
bj = block[1];
|
||||
size = block[2];
|
||||
tag = '';
|
||||
if (i < ai && j < bj) {
|
||||
tag = 'replace';
|
||||
} else if (i < ai) {
|
||||
tag = 'delete';
|
||||
} else if (j < bj) {
|
||||
tag = 'insert';
|
||||
}
|
||||
if (tag) answer.push([tag, i, ai, j, bj]);
|
||||
i = ai + size;
|
||||
j = bj + size;
|
||||
|
||||
if (size) answer.push(['equal', ai, i, bj, j]);
|
||||
}
|
||||
}
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
// this is a generator function in the python lib, which of course is not supported in javascript
|
||||
// the reimplementation builds up the grouped opcodes into a list in their entirety and returns that.
|
||||
this.get_grouped_opcodes = function (n) {
|
||||
if (!n) n = 3;
|
||||
var codes = this.get_opcodes();
|
||||
if (!codes) codes = [["equal", 0, 1, 0, 1]];
|
||||
var code, tag, i1, i2, j1, j2;
|
||||
if (codes[0][0] == 'equal') {
|
||||
code = codes[0];
|
||||
tag = code[0];
|
||||
i1 = code[1];
|
||||
i2 = code[2];
|
||||
j1 = code[3];
|
||||
j2 = code[4];
|
||||
codes[0] = [tag, Math.max(i1, i2 - n), i2, Math.max(j1, j2 - n), j2];
|
||||
}
|
||||
if (codes[codes.length - 1][0] == 'equal') {
|
||||
code = codes[codes.length - 1];
|
||||
tag = code[0];
|
||||
i1 = code[1];
|
||||
i2 = code[2];
|
||||
j1 = code[3];
|
||||
j2 = code[4];
|
||||
codes[codes.length - 1] = [tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)];
|
||||
}
|
||||
|
||||
var nn = n + n;
|
||||
var groups = [];
|
||||
for (var idx in codes) {
|
||||
if (codes.hasOwnProperty(idx)) {
|
||||
code = codes[idx];
|
||||
tag = code[0];
|
||||
i1 = code[1];
|
||||
i2 = code[2];
|
||||
j1 = code[3];
|
||||
j2 = code[4];
|
||||
if (tag == 'equal' && i2 - i1 > nn) {
|
||||
groups.push([tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]);
|
||||
i1 = Math.max(i1, i2-n);
|
||||
j1 = Math.max(j1, j2-n);
|
||||
}
|
||||
|
||||
groups.push([tag, i1, i2, j1, j2]);
|
||||
}
|
||||
}
|
||||
|
||||
if (groups && groups[groups.length - 1][0] == 'equal') groups.pop();
|
||||
|
||||
return groups;
|
||||
}
|
||||
|
||||
this.ratio = function () {
|
||||
matches = difflib.__reduce(
|
||||
function (sum, triple) { return sum + triple[triple.length - 1]; },
|
||||
this.get_matching_blocks(), 0);
|
||||
return difflib.__calculate_ratio(matches, this.a.length + this.b.length);
|
||||
}
|
||||
|
||||
this.quick_ratio = function () {
|
||||
var fullbcount, elt;
|
||||
if (this.fullbcount == null) {
|
||||
this.fullbcount = fullbcount = {};
|
||||
for (var i = 0; i < this.b.length; i++) {
|
||||
elt = this.b[i];
|
||||
fullbcount[elt] = difflib.__dictget(fullbcount, elt, 0) + 1;
|
||||
}
|
||||
}
|
||||
fullbcount = this.fullbcount;
|
||||
|
||||
var avail = {};
|
||||
var availhas = difflib.__isindict(avail);
|
||||
var matches = numb = 0;
|
||||
for (var i = 0; i < this.a.length; i++) {
|
||||
elt = this.a[i];
|
||||
if (availhas(elt)) {
|
||||
numb = avail[elt];
|
||||
} else {
|
||||
numb = difflib.__dictget(fullbcount, elt, 0);
|
||||
}
|
||||
avail[elt] = numb - 1;
|
||||
if (numb > 0) matches++;
|
||||
}
|
||||
|
||||
return difflib.__calculate_ratio(matches, this.a.length + this.b.length);
|
||||
}
|
||||
|
||||
this.real_quick_ratio = function () {
|
||||
var la = this.a.length;
|
||||
var lb = this.b.length;
|
||||
return _calculate_ratio(Math.min(la, lb), la + lb);
|
||||
}
|
||||
|
||||
this.isjunk = isjunk ? isjunk : difflib.defaultJunkFunction;
|
||||
this.a = this.b = null;
|
||||
this.set_seqs(a, b);
|
||||
}
|
||||
}
|
||||
|
||||
diffview = {
|
||||
/**
|
||||
* Builds and returns a visual diff view. The single parameter, `params', should contain
|
||||
* the following values:
|
||||
*
|
||||
* - baseTextLines: the array of strings that was used as the base text input to SequenceMatcher
|
||||
* - newTextLines: the array of strings that was used as the new text input to SequenceMatcher
|
||||
* - opcodes: the array of arrays returned by SequenceMatcher.get_opcodes()
|
||||
* - baseTextName: the title to be displayed above the base text listing in the diff view; defaults
|
||||
* to "Base Text"
|
||||
* - newTextName: the title to be displayed above the new text listing in the diff view; defaults
|
||||
* to "New Text"
|
||||
* - contextSize: the number of lines of context to show around differences; by default, all lines
|
||||
* are shown
|
||||
* - viewType: if 0, a side-by-side diff view is generated (default); if 1, an inline diff view is
|
||||
* generated
|
||||
*/
|
||||
buildView: function (params) {
|
||||
var baseTextLines = params.baseTextLines;
|
||||
var newTextLines = params.newTextLines;
|
||||
var opcodes = params.opcodes;
|
||||
var baseTextName = params.baseTextName ? params.baseTextName : "Base Text";
|
||||
var newTextName = params.newTextName ? params.newTextName : "New Text";
|
||||
var contextSize = params.contextSize;
|
||||
var inline = (params.viewType == 0 || params.viewType == 1) ? params.viewType : 0;
|
||||
|
||||
if (baseTextLines == null)
|
||||
throw "Cannot build diff view; baseTextLines is not defined.";
|
||||
if (newTextLines == null)
|
||||
throw "Cannot build diff view; newTextLines is not defined.";
|
||||
if (!opcodes)
|
||||
throw "Canno build diff view; opcodes is not defined.";
|
||||
|
||||
function celt (name, clazz) {
|
||||
var e = document.createElement(name);
|
||||
e.className = clazz;
|
||||
return e;
|
||||
}
|
||||
|
||||
function telt (name, text) {
|
||||
var e = document.createElement(name);
|
||||
e.appendChild(document.createTextNode(text));
|
||||
return e;
|
||||
}
|
||||
|
||||
function ctelt (name, clazz, text) {
|
||||
var e = document.createElement(name);
|
||||
e.className = clazz;
|
||||
e.appendChild(document.createTextNode(text));
|
||||
return e;
|
||||
}
|
||||
|
||||
var tdata = document.createElement("thead");
|
||||
var node = document.createElement("tr");
|
||||
tdata.appendChild(node);
|
||||
if (inline) {
|
||||
node.appendChild(document.createElement("th"));
|
||||
node.appendChild(document.createElement("th"));
|
||||
node.appendChild(ctelt("th", "texttitle", baseTextName + " vs. " + newTextName));
|
||||
} else {
|
||||
node.appendChild(document.createElement("th"));
|
||||
node.appendChild(ctelt("th", "texttitle", baseTextName));
|
||||
node.appendChild(document.createElement("th"));
|
||||
node.appendChild(ctelt("th", "texttitle", newTextName));
|
||||
}
|
||||
tdata = [tdata];
|
||||
|
||||
var rows = [];
|
||||
var node2;
|
||||
|
||||
/**
|
||||
* Adds two cells to the given row; if the given row corresponds to a real
|
||||
* line number (based on the line index tidx and the endpoint of the
|
||||
* range in question tend), then the cells will contain the line number
|
||||
* and the line of text from textLines at position tidx (with the class of
|
||||
* the second cell set to the name of the change represented), and tidx + 1 will
|
||||
* be returned. Otherwise, tidx is returned, and two empty cells are added
|
||||
* to the given row.
|
||||
*/
|
||||
function addCells (row, tidx, tend, textLines, change) {
|
||||
if (tidx < tend) {
|
||||
row.appendChild(telt("th", (tidx + 1).toString()));
|
||||
row.appendChild(ctelt("td", change, textLines[tidx].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0")));
|
||||
return tidx + 1;
|
||||
} else {
|
||||
row.appendChild(document.createElement("th"));
|
||||
row.appendChild(celt("td", "empty"));
|
||||
return tidx;
|
||||
}
|
||||
}
|
||||
|
||||
function addCellsInline (row, tidx, tidx2, textLines, change) {
|
||||
row.appendChild(telt("th", tidx == null ? "" : (tidx + 1).toString()));
|
||||
row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString()));
|
||||
row.appendChild(ctelt("td", change, textLines[tidx != null ? tidx : tidx2].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0")));
|
||||
}
|
||||
|
||||
for (var idx = 0; idx < opcodes.length; idx++) {
|
||||
code = opcodes[idx];
|
||||
change = code[0];
|
||||
var b = code[1];
|
||||
var be = code[2];
|
||||
var n = code[3];
|
||||
var ne = code[4];
|
||||
var rowcnt = Math.max(be - b, ne - n);
|
||||
var toprows = [];
|
||||
var botrows = [];
|
||||
for (var i = 0; i < rowcnt; i++) {
|
||||
// jump ahead if we've alredy provided leading context or if this is the first range
|
||||
if (contextSize && opcodes.length > 1 && ((idx > 0 && i == contextSize) || (idx == 0 && i == 0)) && change=="equal") {
|
||||
var jump = rowcnt - ((idx == 0 ? 1 : 2) * contextSize);
|
||||
if (jump > 1) {
|
||||
toprows.push(node = document.createElement("tr"));
|
||||
|
||||
b += jump;
|
||||
n += jump;
|
||||
i += jump - 1;
|
||||
node.appendChild(telt("th", "..."));
|
||||
if (!inline) node.appendChild(ctelt("td", "skip", ""));
|
||||
node.appendChild(telt("th", "..."));
|
||||
node.appendChild(ctelt("td", "skip", ""));
|
||||
|
||||
// skip last lines if they're all equal
|
||||
if (idx + 1 == opcodes.length) {
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
toprows.push(node = document.createElement("tr"));
|
||||
if (inline) {
|
||||
if (change == "insert") {
|
||||
addCellsInline(node, null, n++, newTextLines, change);
|
||||
} else if (change == "replace") {
|
||||
botrows.push(node2 = document.createElement("tr"));
|
||||
if (b < be) addCellsInline(node, b++, null, baseTextLines, "delete");
|
||||
if (n < ne) addCellsInline(node2, null, n++, newTextLines, "insert");
|
||||
} else if (change == "delete") {
|
||||
addCellsInline(node, b++, null, baseTextLines, change);
|
||||
} else {
|
||||
// equal
|
||||
addCellsInline(node, b++, n++, baseTextLines, change);
|
||||
}
|
||||
} else {
|
||||
b = addCells(node, b, be, baseTextLines, change);
|
||||
n = addCells(node, n, ne, newTextLines, change);
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < toprows.length; i++) rows.push(toprows[i]);
|
||||
for (var i = 0; i < botrows.length; i++) rows.push(botrows[i]);
|
||||
}
|
||||
|
||||
rows.push(node = ctelt("th", "author", "diff view generated by "));
|
||||
node.setAttribute("colspan", inline ? 3 : 4);
|
||||
node.appendChild(node2 = telt("a", "jsdifflib"));
|
||||
node2.setAttribute("href", "http://github.com/cemerick/jsdifflib");
|
||||
|
||||
tdata.push(node = document.createElement("tbody"));
|
||||
for (var idx in rows) node.appendChild(rows[idx]);
|
||||
|
||||
node = celt("table", "diff" + (inline ? " inlinediff" : ""));
|
||||
for (var idx in tdata) node.appendChild(tdata[idx]);
|
||||
return node;
|
||||
}
|
||||
}
|
||||
@@ -1,396 +0,0 @@
|
||||
// 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 Github;
|
||||
var API_URL = 'https://api.github.com';
|
||||
|
||||
Github = window.Github = function(options) {
|
||||
|
||||
// HTTP Request Abstraction
|
||||
// =======
|
||||
//
|
||||
// I'm not proud of this and neither should you be if you were responsible for the XMLHttpRequest spec.
|
||||
|
||||
function _request(method, path, data, cb, raw) {
|
||||
function getURL() {
|
||||
var url = API_URL + path;
|
||||
return url + ((/\?/).test(url) ? "&" : "?") + (new Date()).getTime();
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
if (!raw) {xhr.dataType = "json"}
|
||||
|
||||
xhr.open(method, getURL());
|
||||
xhr.onreadystatechange = function () {
|
||||
if (this.readyState == 4) {
|
||||
if (this.status >= 200 && this.status < 300 || this.status === 304) {
|
||||
cb(null, raw ? this.responseText : this.responseText ? JSON.parse(this.responseText) : true);
|
||||
} else {
|
||||
cb({request: this, error: this.status});
|
||||
}
|
||||
}
|
||||
}
|
||||
xhr.setRequestHeader('Accept','application/vnd.github.raw');
|
||||
xhr.setRequestHeader('Content-Type','application/json;charset=UTF-8');
|
||||
if (
|
||||
(options.auth == 'oauth' && options.token) ||
|
||||
(options.auth == 'basic' && options.username && options.password)
|
||||
) {
|
||||
xhr.setRequestHeader('Authorization',options.auth == 'oauth'
|
||||
? 'token '+ options.token
|
||||
: 'Basic ' + Base64.encode(options.username + ':' + options.password)
|
||||
);
|
||||
}
|
||||
data ? xhr.send(JSON.stringify(data)) : xhr.send();
|
||||
}
|
||||
|
||||
// Repository API
|
||||
// =======
|
||||
|
||||
Github.Repository = function(options) {
|
||||
var repo = options.name;
|
||||
var user = options.user;
|
||||
|
||||
var that = this;
|
||||
var repoPath = "/repos/" + user + "/" + repo;
|
||||
|
||||
var currentTree = {
|
||||
"branch": null,
|
||||
"sha": null
|
||||
};
|
||||
|
||||
// Uses the cache if branch has not been changed
|
||||
// -------
|
||||
|
||||
function updateTree(branch, cb) {
|
||||
if (branch === currentTree.branch && currentTree.sha) return cb(null, currentTree.sha);
|
||||
that.getRef("heads/"+branch, function(err, sha) {
|
||||
currentTree.branch = branch;
|
||||
currentTree.sha = sha;
|
||||
cb(err, sha);
|
||||
});
|
||||
}
|
||||
|
||||
// Get a particular reference
|
||||
// -------
|
||||
|
||||
this.getRef = function(ref, cb) {
|
||||
_request("GET", repoPath + "/git/refs/" + ref, null, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.object.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Create a new reference
|
||||
// --------
|
||||
//
|
||||
// {
|
||||
// "ref": "refs/heads/my-new-branch-name",
|
||||
// "sha": "827efc6d56897b048c772eb4087f854f46256132"
|
||||
// }
|
||||
|
||||
this.createRef = function(options, cb) {
|
||||
_request("POST", repoPath + "/git/refs", options, cb);
|
||||
};
|
||||
|
||||
// Delete a reference
|
||||
// --------
|
||||
//
|
||||
// repo.deleteRef('heads/gh-pages')
|
||||
// repo.deleteRef('tags/v1.0')
|
||||
|
||||
this.deleteRef = function(ref, cb) {
|
||||
_request("DELETE", repoPath + "/git/refs/"+ref, options, cb);
|
||||
};
|
||||
|
||||
// List all branches of a repository
|
||||
// -------
|
||||
|
||||
this.listBranches = function(cb) {
|
||||
_request("GET", repoPath + "/git/refs/heads", null, function(err, heads) {
|
||||
if (err) return cb(err);
|
||||
cb(null, _.map(heads, function(head) { return _.last(head.ref.split('/')); }));
|
||||
});
|
||||
};
|
||||
|
||||
// Retrieve the contents of a blob
|
||||
// -------
|
||||
|
||||
this.getBlob = function(sha, cb) {
|
||||
_request("GET", repoPath + "/git/blobs/" + sha, null, cb, 'raw');
|
||||
};
|
||||
|
||||
// For a given file path, get the corresponding sha (blob for files, tree for dirs)
|
||||
// -------
|
||||
|
||||
this.getSha = function(branch, path, cb) {
|
||||
// Just use head if path is empty
|
||||
if (path === "") return that.getRef("heads/"+branch, cb);
|
||||
that.getTree(branch+"?recursive=true", function(err, tree) {
|
||||
var file = _.select(tree, function(file) {
|
||||
return file.path === path;
|
||||
})[0];
|
||||
cb(null, file ? file.sha : null);
|
||||
});
|
||||
};
|
||||
|
||||
// Retrieve the tree a commit points to
|
||||
// -------
|
||||
|
||||
this.getTree = function(tree, cb) {
|
||||
_request("GET", repoPath + "/git/trees/"+tree, null, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.tree);
|
||||
});
|
||||
};
|
||||
|
||||
// Post a new blob object, getting a blob SHA back
|
||||
// -------
|
||||
|
||||
this.postBlob = function(content, cb) {
|
||||
if (typeof(content) === "string") {
|
||||
content = {
|
||||
"content": content,
|
||||
"encoding": "utf-8"
|
||||
};
|
||||
}
|
||||
|
||||
_request("POST", repoPath + "/git/blobs", content, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Update an existing tree adding a new blob object getting a tree SHA back
|
||||
// -------
|
||||
|
||||
this.updateTree = function(baseTree, path, blob, cb) {
|
||||
var data = {
|
||||
"base_tree": baseTree,
|
||||
"tree": [
|
||||
{
|
||||
"path": path,
|
||||
"mode": "100644",
|
||||
"type": "blob",
|
||||
"sha": blob
|
||||
}
|
||||
]
|
||||
};
|
||||
_request("POST", repoPath + "/git/trees", data, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Post a new tree object having a file path pointer replaced
|
||||
// with a new blob SHA getting a tree SHA back
|
||||
// -------
|
||||
|
||||
this.postTree = function(tree, cb) {
|
||||
_request("POST", repoPath + "/git/trees", { "tree": tree }, function(err, res) {
|
||||
if (err) return cb(err);
|
||||
cb(null, res.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Create a new commit object with the current commit SHA as the parent
|
||||
// and the new tree SHA, getting a commit SHA back
|
||||
// -------
|
||||
|
||||
this.commit = function(parent, tree, message, cb) {
|
||||
var data = {
|
||||
"message": message,
|
||||
"author": {
|
||||
"name": options.username
|
||||
},
|
||||
"parents": [
|
||||
parent
|
||||
],
|
||||
"tree": tree
|
||||
};
|
||||
|
||||
_request("POST", repoPath + "/git/commits", data, function(err, res) {
|
||||
currentTree.sha = res.sha; // update latest commit
|
||||
if (err) return cb(err);
|
||||
cb(null, res.sha);
|
||||
});
|
||||
};
|
||||
|
||||
// Update the reference of your head to point to the new commit SHA
|
||||
// -------
|
||||
|
||||
this.updateHead = function(head, commit, cb) {
|
||||
_request("PATCH", repoPath + "/git/refs/heads/" + head, { "sha": commit }, function(err, res) {
|
||||
cb(err);
|
||||
});
|
||||
};
|
||||
|
||||
// Show repository information
|
||||
// -------
|
||||
|
||||
this.show = function(cb) {
|
||||
_request("GET", repoPath, null, cb);
|
||||
};
|
||||
|
||||
// Get contents
|
||||
// --------
|
||||
|
||||
this.contents = function(path, cb) {
|
||||
_request("GET", repoPath + "/contents", { path: path }, cb);
|
||||
};
|
||||
|
||||
// Fork repository
|
||||
// -------
|
||||
|
||||
this.fork = function(cb) {
|
||||
_request("POST", repoPath + "/forks", null, cb);
|
||||
};
|
||||
|
||||
// Create pull request
|
||||
// --------
|
||||
|
||||
this.createPullRequest = function(options, cb) {
|
||||
_request("POST", repoPath + "/pulls", options, cb);
|
||||
};
|
||||
|
||||
// Read file at given path
|
||||
// -------
|
||||
|
||||
this.read = function(branch, path, cb) {
|
||||
that.getSha(branch, path, function(err, sha) {
|
||||
if (!sha) return cb("not found", null);
|
||||
that.getBlob(sha, function(err, content) {
|
||||
cb(err, content, sha);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Remove a file from the tree
|
||||
// -------
|
||||
|
||||
this.remove = function(branch, path, cb) {
|
||||
updateTree(branch, function(err, latestCommit) {
|
||||
that.getTree(latestCommit+"?recursive=true", function(err, tree) {
|
||||
// Update Tree
|
||||
var newTree = _.reject(tree, function(ref) { return ref.path === path });
|
||||
_.each(newTree, function(ref) {
|
||||
if (ref.type === "tree") delete ref.sha;
|
||||
});
|
||||
|
||||
that.postTree(newTree, function(err, rootTree) {
|
||||
that.commit(latestCommit, rootTree, 'Deleted '+path , function(err, commit) {
|
||||
that.updateHead(branch, commit, function(err) {
|
||||
cb(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Move a file to a new location
|
||||
// -------
|
||||
|
||||
this.move = function(branch, path, newPath, cb) {
|
||||
updateTree(branch, function(err, latestCommit) {
|
||||
that.getTree(latestCommit+"?recursive=true", function(err, tree) {
|
||||
// Update Tree
|
||||
_.each(tree, function(ref) {
|
||||
if (ref.path === path) ref.path = newPath;
|
||||
if (ref.type === "tree") delete ref.sha;
|
||||
});
|
||||
|
||||
that.postTree(tree, function(err, rootTree) {
|
||||
that.commit(latestCommit, rootTree, 'Deleted '+path , function(err, commit) {
|
||||
that.updateHead(branch, commit, function(err) {
|
||||
cb(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Write file contents to a given branch and path
|
||||
// -------
|
||||
|
||||
this.write = function(branch, path, content, message, cb) {
|
||||
updateTree(branch, function(err, latestCommit) {
|
||||
if (err) return cb(err);
|
||||
that.postBlob(content, function(err, blob) {
|
||||
if (err) return cb(err);
|
||||
that.updateTree(latestCommit, path, blob, function(err, tree) {
|
||||
if (err) return cb(err);
|
||||
that.commit(latestCommit, tree, message, function(err, commit) {
|
||||
if (err) return cb(err);
|
||||
that.updateHead(branch, commit, cb);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
// Gists API
|
||||
// =======
|
||||
|
||||
Github.Gist = function(options) {
|
||||
var id = options.id;
|
||||
var that = this;
|
||||
var gistPath = "/gists/"+id;
|
||||
|
||||
// Read the gist
|
||||
// --------
|
||||
|
||||
this.read = function(cb) {
|
||||
_request("GET", gistPath, null, function(err, gist) {
|
||||
cb(err, gist);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// Delete the gist
|
||||
// --------
|
||||
|
||||
this.delete = function(cb) {
|
||||
_request("DELETE", gistPath, null, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// Fork a gist
|
||||
// --------
|
||||
|
||||
this.fork = function(cb) {
|
||||
_request("POST", gistPath+"/fork", null, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
|
||||
// Update a gist with the new stuff
|
||||
// --------
|
||||
|
||||
this.update = function(options, cb) {
|
||||
_request("PATCH", gistPath, options, function(err,res) {
|
||||
cb(err,res);
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
// Top Level API
|
||||
// -------
|
||||
|
||||
this.getRepo = function(user, repo) {
|
||||
return new Github.Repository({user: user, name: repo});
|
||||
};
|
||||
|
||||
};
|
||||
}).call(this);
|
||||
12
plugins/ice-repo/lib/underscore-min.js
vendored
@@ -1,12 +0,0 @@
|
||||
// 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 +0,0 @@
|
||||
magic_quotes_gpc = Off
|
||||
@@ -1,121 +0,0 @@
|
||||
<?php
|
||||
// -----------------
|
||||
// START USER CONFIG
|
||||
// -----------------
|
||||
|
||||
// SYSTEM SETTINGS
|
||||
// Document root and ICErepo version no:
|
||||
|
||||
$docRoot = $_SERVER['DOCUMENT_ROOT'];
|
||||
$version = "0.8.0";
|
||||
|
||||
// AUTHENTICATION
|
||||
// Can either be done by oauth (recommended), or username & password (less secure)
|
||||
|
||||
// oauth
|
||||
$token = "";
|
||||
// Basic
|
||||
$username = "";
|
||||
$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."/TEST2","",
|
||||
"mattpass/TEST",$docRoot."/TEST","selected"
|
||||
);
|
||||
|
||||
// User level setting. Set at 1 or above to use
|
||||
$_SESSION['userLevel'] = 10;
|
||||
|
||||
// ---------------
|
||||
// END USER CONFIG
|
||||
// ---------------
|
||||
|
||||
// Don't display, but log all errors
|
||||
ini_set('display_errors', 0);
|
||||
ini_set('log_errors', 1);
|
||||
ini_set('error_log', dirname(__FILE__).'/error-log.txt');
|
||||
error_reporting(-1);
|
||||
|
||||
// Set our default timezone and supress warning with @
|
||||
@date_default_timezone_set(date_default_timezone_get());
|
||||
|
||||
// Set a stream context timeout for file reading
|
||||
$context = stream_context_create(array('http'=>
|
||||
array(
|
||||
'timeout' => 60 // secs
|
||||
)
|
||||
));
|
||||
|
||||
// Start a session if we haven't already
|
||||
if(!isset($_SESSION)) {@session_start();}
|
||||
|
||||
if (!isset($_SESSION['userLevel']) || $_SESSION['userLevel'] < 1) {
|
||||
die("Sorry, you need to be logged in to use ICErepo");
|
||||
}
|
||||
|
||||
// Set session vars if we're logging in via a session
|
||||
if (isset($_REQUEST['token']) && $_REQUEST['token']!="") {
|
||||
$_SESSION['token'] = $_REQUEST['token'];
|
||||
}
|
||||
if (isset($_REQUEST['username']) && $_REQUEST['username']!="") {
|
||||
$_SESSION['username'] = $_REQUEST['username'];
|
||||
$_SESSION['password'] = $_REQUEST['password'];
|
||||
}
|
||||
|
||||
// Reestablish those session vars in an ongoing way
|
||||
if (isset($_SESSION['token'])) {
|
||||
$token = $_SESSION['token'] = $_SESSION['token'];
|
||||
}
|
||||
if (isset($_SESSION['username'])) {
|
||||
$username = $_SESSION['username'] = $_SESSION['username'];
|
||||
$password = $_SESSION['password'] = $_SESSION['password'];
|
||||
}
|
||||
|
||||
if ($token=="" && $username=="" && !isset($_GET['sessionLogin'])) {
|
||||
header("Location: ?sessionLogin=true");
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
// If magic quotes are still on (attempted to switch off in php.ini)
|
||||
if (get_magic_quotes_gpc ()) {
|
||||
function stripslashes_deep($value) {
|
||||
$value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
|
||||
return $value;
|
||||
}
|
||||
$_POST = (isset($_POST) && !empty($_POST)) ? array_map('stripslashes_deep', $_POST) : array();
|
||||
$_GET = (isset($_GET) && !empty($_GET)) ? array_map('stripslashes_deep', $_GET) : array();
|
||||
$_COOKIE = (isset($_COOKIE) && !empty($_COOKIE)) ? array_map('stripslashes_deep', $_COOKIE) : array();
|
||||
$_REQUEST = (isset($_REQUEST) && !empty($_REQUEST)) ? array_map('stripslashes_deep', $_REQUEST) : array();
|
||||
}
|
||||
?>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,91 +0,0 @@
|
||||
<?php
|
||||
// -----------------------------------------------
|
||||
// Zip-It! for ICEcoder v1.0 by Matt Pass
|
||||
// Will backup requested files/folders in ICEcoder
|
||||
// and remove old backups older than $keepLastDays
|
||||
// -----------------------------------------------
|
||||
include("../../lib/settings.php");
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Zip It! for ICEcoder</title>
|
||||
</head>
|
||||
<body>
|
||||
<?php
|
||||
$saveLocation = '../../backups/';
|
||||
$_GET['zip']=="|" ? $fileName = "root" : $fileName = str_replace("|","_",strClean($_GET['zip']));
|
||||
$fileName .= '-'.time().'.zip';
|
||||
$keepLastDays = 7;
|
||||
|
||||
if (!is_dir($saveLocation)) {mkdir($saveLocation, 0777);}
|
||||
Class zipIt {
|
||||
public function zipFilesUp($zipDir,$zipFile,$keepLastDays,$docRoot) {
|
||||
$zipName = $zipDir.$zipFile;
|
||||
$zipFiles = array();
|
||||
$_GET['zip']=="|" ? $zipTgt = "" : $zipTgt = str_replace("|","/",strClean($_GET['zip']));
|
||||
if (strpos($_GET['zip'],"/")!==0) {$zipTgt = "/".trim($zipTgt,"/");};
|
||||
$addItem = $docRoot.$zipTgt;
|
||||
|
||||
if (is_dir($addItem)) {
|
||||
$dirStack = array($addItem);
|
||||
while (!empty($dirStack)) {
|
||||
$currentDir = array_pop($dirStack);
|
||||
$dir = dir($currentDir);
|
||||
while (false !== ($node = $dir->read())) {
|
||||
if ($node == '.' || $node == '..') {continue;}
|
||||
if (is_dir($currentDir.$node) && !strpos($currentDir.$node,"_coder") && !strpos($currentDir.$node,"ICEcoder")) {
|
||||
array_push($dirStack,$currentDir.$node.'/');
|
||||
}
|
||||
if (is_file($currentDir.$node)) {$zipFiles[] = $currentDir.$node;}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(file_exists($addItem)) {$zipFiles[] = $addItem;}
|
||||
}
|
||||
if ($backupsDir = opendir($zipDir)) {
|
||||
$keepTime = $keepLastDays*60*60*24;
|
||||
while (false !== ($backup = readdir($backupsDir))) {
|
||||
if ($backup != "." && $backup != "..") {
|
||||
if ((time()-filemtime($zipDir.$backup)) > $keepTime) {
|
||||
chmod($zipDir.$backup, 0777);
|
||||
unlink($zipDir.$backup) or DIE("couldn't delete $zipDir$backup<br>");
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($backupsDir);
|
||||
}
|
||||
if(count($zipFiles)) {
|
||||
$zip = new ZipArchive();
|
||||
if($zip->open($zipName,ZIPARCHIVE::CREATE)!== true) {return false;}
|
||||
$excludeFilesFolders = isset($_GET['exclude']) ? explode("*",strClean($_GET['exclude'])) : array();
|
||||
foreach($zipFiles as $file) {
|
||||
$canAdd=true;
|
||||
for ($i=0;$i<count($excludeFilesFolders);$i++) {
|
||||
if($excludeFilesFolders[$i] && strpos($file,$excludeFilesFolders[$i])!==false) {$canAdd=false;};
|
||||
}
|
||||
if ($canAdd==true) {
|
||||
$zip->addFile($file,str_replace($docRoot."/","",$file));
|
||||
}
|
||||
}
|
||||
$zip->close();
|
||||
chmod($zipName, 0777);
|
||||
return file_exists($zipName);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if($_SESSION['loggedIn']) {
|
||||
$doZip = new zipIt();
|
||||
echo '<script>top.ICEcoder.serverMessage("<b>Zipping Files</b>");</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>
|
||||
</html>
|
||||