diff --git a/.c9revisions/.gitignore.c9save b/.c9revisions/.gitignore.c9save new file mode 100644 index 00000000..f8052113 --- /dev/null +++ b/.c9revisions/.gitignore.c9save @@ -0,0 +1 @@ +{"ts":1342251522716,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"#files, the will be ignored by git\n\n#minified scripts\n*.min.js\n*.min.css\n*.min.html\n\n#node modules folder\nnode_modules\n\n#cloudfoundry info files\ncloudcmd.manifest.yml\ncloudcmddemo.manifest.yml\ndemo-cloudcmd.manifest.yml\ncdn-cloudcmd.manifest.yml\n\n#hide travis yml for nodejitsu working out\n#.travis.yml\n\n#temporary files folder\ntmp\n\n#file used by c9\napache-status\n\n#file used by nodester\n.nodester.appconfig\n\n#log file\nlog.txt\n\n#minify module\n!node_modules/\nnode_modules/*\n!node_modules/minify\n"]],"start1":0,"start2":0,"length1":0,"length2":494}]],"length":494} diff --git a/.c9revisions/README.md.c9save b/.c9revisions/README.md.c9save new file mode 100644 index 00000000..6676eff5 --- /dev/null +++ b/.c9revisions/README.md.c9save @@ -0,0 +1 @@ +{"ts":1341587798249,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"Cloud Commander [![Build Status](https://secure.travis-ci.org/coderaiser/cloudcmd.png?branch=master)](http://travis-ci.org/coderaiser/cloudcmd)\n=============== \n**Cloud Commander** - two-panels file manager, totally writed on js.\nView [demo](http://demo-cloudcmd.cloudfoundry.com/ \"demo\"), [mirror](http://cloudcmd.nodester.com/ \"mirror\").\n\nGoogle PageSpeed Score : [100](https://developers.google.com/speed/pagespeed/insights#url=http_3A_2F_2Fdemo-cloudcmd.cloudfoundry.com_2F&mobile=false \"score\") (out of 100).\n\nBenefits\n---------------\n- full browser compatibility *(ie6+,chrome,safari,opera,firefox)*;\n- responsible design\n- one full page loading, *and then just one-time json-dir-listings loading\n(with refresh opportunity).*\n- caching readed directories *to localStorage (for now)\n(so if network will disconnected or something heppen with a signal, we\ndefinitely will can work cached copy of directory listings)*;\n- key binding\n- disabled js support *(working in limited mode)*.\n- automated minification *client js-files and onstart-reading Cloud manager files on server starting.*\n\n**Cloud Commander** uses all benefits of js, so if js is disabled,\nwe moves to *limited mode*.\n\nLimited-mode features:\n---------------\n- only 1 panel available\n- no keybinding\n- no local caching\n- full loading of all web page(with styles, js-scripts, html-page etc).\n\nHot keys:\n---------------\nIn all modern web browsers (but not in IE, becouse he special) hot keys works.\nThere is a short list:\n- Ctrl + r - reload dir content\n- Ctrl + d - clear local cache (wich contains dir contents)\n- Alt + q - disable key bindings\n- Alt + s - get all key bindings back\n- up, down, enter - filesystem navigation\n\nAdditional modules:\n---------------\n**Cloud Commander** not using additional modules for main functionality.\nBut for minification and optimization tricks optional can be\nassingned (and installed) modules:\n- [UglifyJS] (https://github.com/mishoo/UglifyJS)\n- [clean-css] (https://github.com/GoalSmashers/clean-css)\n- [html-minifier] (https://github.com/kangax/html-minifier)\n- [css-b64-images] (https://github.com/Filirom1/css-base64-images)\n\nInstall addtitional modules:\n\n npm i uglify-js clean-css html-minifier css-b64-images"]],"start1":0,"start2":0,"length1":0,"length2":2261}]],"length":2261} diff --git a/.c9revisions/app.coffee.c9save b/.c9revisions/app.coffee.c9save new file mode 100644 index 00000000..67213cd1 --- /dev/null +++ b/.c9revisions/app.coffee.c9save @@ -0,0 +1 @@ +{"ts":1341058601368,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"express = require(\"express\")\r\nroutes = require(\"./routes\")\r\napp = module.exports = express.createServer()\r\ndropbox = new DropboxClient(\"nt2me4gy6ez8sgh\", \"go0pfirtw2vum6w\")\r\napp.configure ->\r\n app.set \"views\", __dirname + \"/views\"\r\n app.set \"view engine\", \"jade\"\r\n app.use express.bodyParser()\r\n app.use express.methodOverride()\r\n app.use require(\"stylus\").middleware(src: __dirname + \"/public\")\r\n app.use app.router\r\n app.use express.static(__dirname + \"/public\")\r\n\r\napp.configure \"development\", ->\r\n app.use express.errorHandler(\r\n dumpExceptions: true\r\n showStack: true\r\n )\r\n\r\napp.configure \"production\", ->\r\n app.use express.errorHandler()\r\n\r\napp.helpers title: \"Node-Neo4j Template\"\r\napp.get \"/\", routes.site.index\r\napp.get \"/users\", routes.users.list\r\napp.post \"/users\", routes.users.create\r\napp.get \"/users/:id\", routes.users.show\r\napp.post \"/users/:id\", routes.users.edit\r\napp.del \"/users/:id\", routes.users.del\r\napp.post \"/users/:id/follow\", routes.users.follow\r\napp.post \"/users/:id/unfollow\", routes.users.unfollow\r\napp.listen process.env.PORT or 3000\r\nconsole.log \"Express server listening on port %d in %s mode\", app.address().port, app.settings.env"]],"start1":0,"start2":0,"length1":0,"length2":1178}]],"length":1178} diff --git a/.c9revisions/client.js.c9save b/.c9revisions/client.js.c9save new file mode 100644 index 00000000..7589cee7 --- /dev/null +++ b/.c9revisions/client.js.c9save @@ -0,0 +1,2 @@ +{"ts":1341071661173,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"/* Функция которая возвратит обьект CloudCommander\r\n * @window - обьект window\r\n * @document - обьект document\r\n * @CloudFunc - обьект содержащий общий функционал\r\n * клиентский и серверный\r\n */\r\n//var CloudCommander=(function(window,document){\r\n\r\n//var document,window;\r\n\r\nvar CloudCommander=(function(){\r\n\"use strict\";\r\n\r\n/* если функции console.log нет - создаём заглушку */\r\n\r\n/*\r\nvar console;\r\nif(!window)window={console:{log:function(pParam){return pParam;}}};\r\nelse if(window && !window.console){\r\n console={\r\n 'log':function(param){\r\n return param;\r\n }\r\n };\r\n}else console=window.console;\r\n*/\r\n/*\r\n window.jQuery || document.write('\r\n \r\n"]],"start1":0,"start2":0,"length1":0,"length2":2130}]],"length":2130} +{"ts":1342188871395,"patch":[[{"diffs":[[0,"vent ) {"],[1," "],[0,"\n "]],"start1":323,"start2":323,"length1":16,"length2":28},{"diffs":[[0," "],[-1,"alert( event.detail );"],[1,"if ( event instanceof MouseEvent ) {\n alert( event.detail );\n } else {\n alert( 'ops!' );\n }\n "],[0,"\n "]],"start1":352,"start2":352,"length1":30,"length2":168}]],"length":567,"saved":false} +{"ts":1342189050064,"patch":[[{"diffs":[[0,"eof "],[-1,"Mouse"],[0,"Even"]],"start1":374,"start2":374,"length1":13,"length2":8}]],"length":562,"saved":false} diff --git a/.c9revisions/index.html.c9save.h4z69hzx.tmp b/.c9revisions/index.html.c9save.h4z69hzx.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/lib/client/keyBinding.js.c9save b/.c9revisions/lib/client/keyBinding.js.c9save new file mode 100644 index 00000000..f38f2e8f --- /dev/null +++ b/.c9revisions/lib/client/keyBinding.js.c9save @@ -0,0 +1 @@ +{"ts":1340792614062,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"var CloudCommander;\r\nvar CloudFunc;\r\nCloudCommander.keyBinding=(function(){ \r\n \"use strict\";\r\n var key_event=function(event){ \r\n /* \r\n * Делаем допущение что перезагружать Cloud Commander\r\n * посетителям не придёться, в любом случае, параметр\r\n * должен быть опциональным и должна быть возможность\r\n * его отключить. В любом случае, кроме хакеров и \r\n * разработчиков (при чём сомнительно, что хакерам\r\n * это пригодиться), функция перезагрузки никому не\r\n * нужна, поскольку загружать весь дополнительный\r\n * контент снова (js,css) в готовой версии нет\r\n * необходимости.\r\n *\r\n */ \r\n //console.log(event.keyCode);\r\n var lCurrentFile;\r\n var lName;\r\n /* если клавиши можно обрабатывать*/\r\n if(CloudCommander.keyBinded){\r\n /* если нажали таб:\r\n * переносим курсор на\r\n * правую панель, если\r\n * мы были на левой и\r\n * наоборот\r\n */\r\n if(event.keyCode===9){\r\n console.log('Tab pressed');\r\n try{\r\n lCurrentFile=document.getElementsByClassName(CloudCommander.CURRENT_FILE)[0];\r\n }catch(error){console.log(error);}\r\n } \r\n /* навигация по таблице файлов*/\r\n /* если нажали клавишу вверх*/\r\n else if(event.keyCode===38){\r\n /* получаем выдленный файл*/\r\n lCurrentFile=document.getElementsByClassName(CloudCommander.CURRENT_FILE);\r\n /* если ненайдены выделенные файлы - выходим*/\r\n if(lCurrentFile.length===0)return;\r\n lCurrentFile=lCurrentFile[0];\r\n /* если это строка существет и\r\n * если она не заголовок\r\n * файловой таблицы\r\n */\r\n if(lCurrentFile.previousSibling && \r\n lCurrentFile.previousSibling.className!=='fm_header' ){\r\n /* убираем выделение с текущего элемента */\r\n lCurrentFile.className='';\r\n /* и выделяем предыдущую строку*/\r\n lCurrentFile.previousSibling.className=CloudCommander.CURRENT_FILE;\r\n event.preventDefault();\r\n }\r\n }\r\n /* если нажали клавишу в низ*/\r\n else if(event.keyCode===40){\r\n /* получаем выдленный файл*/\r\n lCurrentFile=document.getElementsByClassName(CloudCommander.CURRENT_FILE); \r\n /* если ненайдены выделенные файлы - выходим*/\r\n if(lCurrentFile.length===0)return;\r\n lCurrentFile=lCurrentFile[0];\r\n /* если это не последняя строка */\r\n if(lCurrentFile.nextSibling){\r\n /* убираем с него выделение */\r\n lCurrentFile.className='';\r\n /* выделяем следующую строку*/\r\n lCurrentFile.nextSibling.className=CloudCommander.CURRENT_FILE;\r\n event.preventDefault();\r\n }\r\n }\r\n /* если нажали клавишу page up или Home\r\n * переходим к самому верхнему\r\n * элементу\r\n */\r\n else if(/*event.keyCode===33 ||*/ event.keyCode===36){\r\n lCurrentFile=document.getElementsByClassName(CloudCommander.CURRENT_FILE)[0];\r\n /* убираем выделение с текущего файла*/\r\n lCurrentFile.className='';\r\n /* получаем первый элемент*/\r\n lCurrentFile.parentElement.firstElementChild\r\n /* пропускаем путь и заголовки столбиков*/\r\n .nextElementSibling.nextElementSibling\r\n /* выделяем верхий файл */\r\n .className=CloudCommander.CURRENT_FILE;\r\n }\r\n /* если нажали клавишу page down или End\r\n * выделяем последний элемент\r\n */\r\n else if(/*event.keyCode===34 ||*/ event.keyCode===35){\r\n lCurrentFile=document.getElementsByClassName(CloudCommander.CURRENT_FILE)[0];\r\n /* снимаем выделение с текущего файла*/\r\n lCurrentFile.className='';\r\n /* выделяем самый нижний файл */\r\n lCurrentFile.parentElement.lastElementChild.className=CloudCommander.CURRENT_FILE;\r\n }\r\n /* если нажали Enter - открываем папку*/\r\n else if(event.keyCode===13){\r\n lCurrentFile=document.getElementsByClassName(CloudCommander.CURRENT_FILE);\r\n /* если ненайдены выделенные файлы - выходим*/\r\n if(!lCurrentFile.length)return;\r\n lCurrentFile=lCurrentFile[0];\r\n /* из него достаём спан с именем файла*/\r\n lName=lCurrentFile.getElementsByClassName('name');\r\n /* если нету (что вряд ли) - выходим*/\r\n if(!lName)return false;\r\n /* достаём все ссылки*/\r\n var lATag=lName[0].getElementsByTagName('a');\r\n /* если нету - выходим */\r\n if(!lATag)return false;\r\n /* получаем ссылку на каталог,\r\n * что на уровень выше\r\n */\r\n /* получаем имя каталога в котором находимся*/\r\n var lHref;\r\n try{\r\n lHref=lCurrentFile.parentElement.getElementsByClassName('path')[0].innerText;\r\n }catch(error){console.log('error');}\r\n lHref=CloudFunc.removeLastSlash(lHref);\r\n var lSubstr=lHref.substr(lHref,lHref.lastIndexOf('/'));\r\n lHref=lHref.replace(lSubstr+'/','');\r\n \r\n /* вызываем ajaxload привязанный через changelinks\r\n * пробулем нажать на ссылку, если не получиться\r\n * (opera, ie), вызываем событие onclick,\r\n * которое пока не прописано у файлов\r\n */\r\n \r\n if(lCurrentFile.onclick)lCurrentFile.onclick(true);\r\n else try{\r\n lATag[0].click(); \r\n }\r\n catch(error){\r\n console.log(error);\r\n }\r\n }\r\n /* если нажали +r */\r\n else if(event.keyCode===82 &&\r\n event.ctrlKey){\r\n console.log('+r pressed');\r\n console.log('reloading page...');\r\n console.log('press +q to remove all key-handlers');\r\n \r\n /* обновляем страницу, */ \r\n /* Загружаем содержимое каталога\r\n * при этом данные берём всегда из\r\n * сервера, а не из кэша\r\n * (обновляем кэш)\r\n */\r\n /* Программно нажимаем на кнопку перезагрузки \r\n * содержимого каталога\r\n */\r\n var lRefreshIcon=document.getElementsByClassName(CloudFunc.REFRESHICON);\r\n if(lRefreshIcon)lRefreshIcon=lRefreshIcon[0];\r\n if(lRefreshIcon){\r\n /* находим файл который сейчас выделен */\r\n lCurrentFile=document.getElementsByClassName(CloudCommander.CURRENT_FILE);\r\n if(lCurrentFile.length>0)lCurrentFile=lCurrentFile[0];\r\n /* получаем название файла*/\r\n var lSelectedName=lCurrentFile.getElementsByTagName('a')[0].innerText;\r\n /* если нашли элемент нажимаем него\r\n * а если не можем - нажимаем на \r\n * ссылку, на которую повешен eventHandler\r\n * onclick\r\n */\r\n if(lRefreshIcon.click)lRefreshIcon.parentElement.click();\r\n else lRefreshIcon.parentElement.onclick();\r\n \r\n /* перебираем файлы левой панели\r\n * в поисках подсвеченого файла\r\n */\r\n var lLeft=document.getElementById('left');\r\n if(lLeft){\r\n /* перебираем все файлы в панели */\r\n var lLi=lLeft.getElementsByTagName('li');\r\n lCurrentFile.className='';\r\n /* начинаем с 2-ух, по скольку\r\n * 0 - это путь\r\n * 1 - это заголовок файловой таблицы\r\n */\r\n for(var i=2;i+d чистим кэш */\r\n else if(event.keyCode===68 &&\r\n event.ctrlKey){\r\n console.log('+d pressed');\r\n console.log('clearing cache...');\r\n console.log('press +q to remove all key-handlers');\r\n \r\n var lClearCache=document.getElementById('clear-cache');\r\n if(lClearCache && lClearCache.onclick)lClearCache.onclick();\r\n \r\n event.preventDefault();//запрет на дальнейшее действие\r\n }\r\n /* если нажали +q \r\n * убираем все обработчики\r\n * нажатий клавиш\r\n */ \r\n else if(event.keyCode===81 &&\r\n event.altKey){\r\n //document.removeEventListener('keydown', key_event,false);\r\n console.log('+q pressed');\r\n console.log('+r reload key-handerl - removed');\r\n console.log('+s clear cache key-handler - removed');\r\n console.log('press +s to to set them');\r\n \r\n /* обработчик нажатий клавиш снят*/\r\n CloudCommander.keyBinded=false;\r\n }\r\n }\r\n /* если нажали +s \r\n * устанавливаем все обработчики\r\n * нажатий клавиш\r\n */ \r\n else if(event.keyCode===83 &&\r\n event.altKey){\r\n /*\r\n document.addEventListener('keydown', key_event,false);\r\n */\r\n /* обрабатываем нажатия на клавиши*/\r\n CloudCommander.keyBinded=true;\r\n \r\n console.log('+s pressed');\r\n console.log('+r reload key-handerl - set');\r\n console.log('+s clear cache key-handler - set');\r\n console.log('press +q to remove them');\r\n } \r\n \r\n return false;\r\n };\r\n /* добавляем обработчик клавишь */\r\n if(document.addEventListener)\r\n document.addEventListener('keydown', key_event,false);\r\n else document.onkeypress=key_event;\r\n /* клавиши назначены*/\r\n CloudCommander.keyBinded=true;\r\n});"]],"start1":0,"start2":0,"length1":0,"length2":12682}]],"length":12682} diff --git a/.c9revisions/lib/cloudfunc.js.c9save b/.c9revisions/lib/cloudfunc.js.c9save new file mode 100644 index 00000000..32b2aa38 --- /dev/null +++ b/.c9revisions/lib/cloudfunc.js.c9save @@ -0,0 +1 @@ +{"ts":1340792516246,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"\"use strict\";\r\n/* Модуль, содержащий функции, которые будут работать \r\n * и на клиенте и на сервере \r\n * \r\n * Правила названий:\r\n * varName - имя функции\r\n * lVarName - имя локальной переменной\r\n * pVarName - имя параметра\r\n * fVarName - имя функции созданной внутри функции\r\n * VARNAME - имя константы\r\n *\r\n * Типы переменных:\r\n * varNameS - строка\r\n * varNameN - число\r\n * varNameO - обьект\r\n * varNameM - массив\r\n */\r\n\r\nvar CloudFunc={\r\n /* Путь с которым мы сейчас работаем */\r\n Path :'',\r\n /* КОНСТАНТЫ (общие для клиента и сервера)*/\r\n /* название программы */\r\n NAME :'Cloud Commander',\r\n /* если в ссылке будет эта строка - \r\n * в браузере js отключен\r\n */\r\n NOJS : '/no-js',\r\n FS : '/c/f/s',\r\n /* название css-класа кнопки обновления файловой структуры*/\r\n REFRESHICON : 'refresh-icon',\r\n /* id панелей с файлами */\r\n LEFTPANEL : 'left',\r\n RIGHTPANEL : 'right'\r\n /* name of direcotory with libs */\r\n};\r\n\r\n/*\r\n * Функция убирает последний слеш,\r\n * если он - последний символ строки\r\n */\r\nCloudFunc.removeLastSlash = function(pPath){\r\n if(typeof pPath==='string')\r\n return (pPath.lastIndexOf('/')===pPath.length-1)?\r\n pPath.substr(pPath, pPath.length-1):pPath;\r\n else return pPath;\r\n}; \r\n/*\r\n * Функция меняет код символа пробела на пробел\r\n * в переданной строке\r\n * @pPath - строка\r\n */\r\nCloudFunc.replaceSpaces = function(pPath){\r\n if(pPath.indexOf('%20')>0){\r\n do{\r\n pPath=pPath.replace('%20',' ');\r\n }while(pPath.indexOf('%20')>0);\r\n }\r\n return pPath;\r\n};\r\n\r\n/* Функция возвращает заголовок веб страницы */\r\nCloudFunc.setTitle = function(){\r\n \r\n return CloudFunc.Path===''?CloudFunc.NAME:\r\n CloudFunc.Path +\r\n ' - ' + \r\n CloudFunc.NAME;\r\n};\r\n/* Функция переводит права из цыфрового вида в символьный \r\n * @pPerm_s - строка с правами доступа\r\n * к файлу в 8-миричной системе\r\n */\r\nCloudFunc.convertPermissionsToSymbolic= function(pPerm_s){\r\n /*\r\n S_IRUSR 0000400 protection: readable by owner\r\n S_IWUSR 0000200 writable by owner\r\n S_IXUSR 0000100 executable by owner\r\n S_IRGRP 0000040 readable by group\r\n S_IWGRP 0000020 writable by group\r\n S_IXGRP 0000010 executable by group\r\n S_IROTH 0000004 readable by all\r\n S_IWOTH 0000002 writable by all\r\n S_IXOTH 0000001 executable by all\r\n */\r\n if(pPerm_s===undefined) return;\r\n \r\n /* тип файла */\r\n var lType=pPerm_s.charAt(0);\r\n \r\n switch (lType-0) {\r\n case 1: /* обычный файл */\r\n lType='-';\r\n break;\r\n case 2: /* байт-ориентированное (символьное) устройство*/\r\n lType='c';\r\n break;\r\n case 4: /* каталог */\r\n lType='d';\r\n break; \r\n default:\r\n lType='-';\r\n }\r\n \r\n /* оставляем последние 3 символа*/\r\n pPerm_s=pPerm_s.length>5?pPerm_s.substr(3):pPerm_s.substr(2); \r\n \r\n /* Рекомендации гугла советуют вместо string[3]\r\n * использовать string.charAt(3)\r\n */\r\n/* \r\n http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Standards_features#Standards_features\r\n \r\n Always preferred over non-standards featuresFor\r\n maximum portability and compatibility, always \r\n prefer standards features over non-standards \r\n features (e.g., string.charAt(3) over string[3]\r\n and element access with DOM functions instead\r\n of using an application-specific shorthand).\r\n*/\r\n /* Переводим в двоичную систему */\r\n var lOwner=(pPerm_s[0]-0).toString(2);\r\n var lGroup=(pPerm_s[1]-0).toString(2);\r\n var lAll =(pPerm_s[2]-0).toString(2);\r\n /*\r\n console.log(lOwner+' '+lGroup+' '+lAll);\r\n */\r\n /* переводим в символьную систему*/\r\n var lPermissions=//lType+' '+\r\n (lOwner[0]-0>0?'r':'-')+\r\n (lOwner[1]-0>0?'w':'-')+\r\n (lOwner[2]-0>0?'x':'-')+\r\n ' ' +\r\n (lGroup[0]-0>0?'r':'-')+\r\n (lGroup[1]-0>0?'w':'-')+\r\n (lGroup[2]-0>0?'x':'-')+\r\n ' ' +\r\n (lAll[0]-0>0?'r':'-')+\r\n (lAll[1]-0>0?'w':'-')+\r\n (lAll[2]-0>0?'x':'-');\r\n /*\r\n console.log(lPermissions);\r\n */\r\n return lPermissions;\r\n};\r\n\r\n/* Функция конвертирует права доступа к файлам из символьного вида\r\n * в цыфровой\r\n */\r\nCloudFunc.convertPermissionsToNumberic= function(pPerm_s){\r\n /* если передана правильная строка, конвертированная\r\n * функциец convertPermissionsToSymbolic\r\n */ \r\n if(!pPerm_s || pPerm_s.length!==11)return pPerm_s;\r\n \r\n var lOwner= (pPerm_s[0]==='r'?4:0) +\r\n (pPerm_s[1]==='w'?2:0) +\r\n (pPerm_s[2]==='x'?1:0);\r\n var lGroup= (pPerm_s[4]==='r'?4:0) +\r\n (pPerm_s[5]==='w'?2:0) +\r\n (pPerm_s[6]==='x'?1:0);\r\n var lAll = (pPerm_s[8]==='r'?4:0) +\r\n (pPerm_s[9]==='w'?2:0) +\r\n (pPerm_s[10]==='x'?1:0);\r\n /* добавляем 2 цыфры до 5 */\r\n return '00'+lOwner+lGroup+lAll;\r\n};\r\n/* Функция получает короткие размеры\r\n * конвертируя байт в килобайты, мегабойты,\r\n * гигайбайты и терабайты\r\n * @pSize - размер в байтах\r\n */\r\nCloudFunc.getShortedSize=function(pSize){\r\n /* Константі размеров, что используются\r\n * внутри функции\r\n */\r\n var l1BMAX=1024;\r\n var l1KBMAX=1048576;\r\n var l1MBMAX=1073741824;\r\n var l1GBMAX=1099511627776;\r\n var l1TBMAX=1125899906842624;\r\n \r\n var lShorted;\r\n \r\n if(pSize2){\r\n if(folders[0].lastIndexOf('/')===folders[0].length)\r\n LPrevDir=folders[1];\r\n else LPrevDir=folders[2];\r\n }else LPrevDir='/';\r\n */\r\n /* ################################### */\r\n \r\n /* Формируем ссылки на каждый каталог в пути */\r\n var lHref='';\r\n var lHrefEnd='';\r\n \r\n var lHtmlPath;\r\n /* путь в ссылке, который говорит\r\n * что js отключен\r\n */\r\n var lNoJS_s=CloudFunc.NOJS;\r\n var lFS_s=CloudFunc.FS;\r\n /* корневой каталог */\r\n lHtmlPath=lHref+lFS_s+lNoJS_s+lTitle+'\"/\"'+_l+'/'+lHrefEnd;\r\n for(i=folders.length-1;i>0;i--)\r\n {\r\n var lUrl=folders[i];\r\n var lShortName=lUrl.replace(lUrl.substr(lUrl,lUrl.lastIndexOf('/')+1),''); \r\n if(i!==1)\r\n {\r\n lHtmlPath+=lHref+lFS_s+lNoJS_s+lUrl+lTitle+lUrl+_l+lShortName+lHrefEnd+'/'; \r\n }\r\n else\r\n lHtmlPath+=lShortName+'/';\r\n }\r\n /* *** */\r\n return lHtmlPath; \r\n};\r\n\r\n/*\r\n * Функция ищет в имени файла расширение\r\n * и если находит возвращает true\r\n * @pName - получает имя файла\r\n * @pExt - расширение\r\n */\r\nCloudFunc.checkExtension=function(pName,pExt)\r\n{\r\n /* если длина имени больше\r\n * длинны расширения - \r\n * имеет смысл продолжать\r\n */\r\n if(pName.length>pExt.length){\r\n var lLength=pName.length; /* длина имени*/\r\n var lExtNum=pName.lastIndexOf(pExt);/* последнее вхождение расширения*/\r\n var lExtSub=lLength-lExtNum; /* длина расширения*/\r\n /* если pExt - расширение pName */\r\n if(lExtSub===pExt.length)\r\n return true;\r\n else\r\n return false;\r\n }\r\n else return false;\r\n};\r\n\r\n/*\r\n * Функция формирует заголовки столбиков\r\n * @pFileTableTitles - массив названий столбиков\r\n */\r\nCloudFunc._getFileTableHeader=function(pFileTableTitles)\r\n{\r\n var lHeader='
  • ';\r\n lHeader+='';\r\n for(var i=0;i'+\r\n lStr+\r\n '';\r\n }\r\n lHeader+='
  • ';\r\n \r\n return lHeader;\r\n};\r\n\r\n/*\r\n * Функция строит таблицу файлв из JSON-информации о файлах\r\n * @pJSON - информация о файлах \r\n * @pKeyBinded - если клавиши назначены, выделяем верхний файл\r\n * [{path:'путь',size:'dir'},\r\n * {name:'имя',size:'размер',mode:'права доступа'}]\r\n */\r\nCloudFunc.buildFromJSON=function(pJSON,pKeyBinded)\r\n{\r\n var files;\r\n /*\r\n * если пропарсить стандартными\r\n * функциями нельзя - \r\n * пробуем eval,\r\n */\r\n /* \r\n * Если мы на клиенте и нет JSON -\r\n * через eval парсим.\r\n * Если-же мы на сервере,\r\n * или на клиенте всё есть\r\n * парсим стандарным методом\r\n */\r\n \r\n /* По скольку мы прописали заголовок application/json\r\n * нет необходимости его конвертировать,\r\n * но она есть, если мы вытягиваем данные из\r\n * localStorage\r\n */\r\n /*\r\n if(typeof pJSON==='string'){\r\n if(window && !window.JSON){\r\n try{\r\n files=eval('('+pJSON+')');\r\n }catch(err){\r\n console.log(err);\r\n }\r\n }\r\n else files=JSON.parse(pJSON);\r\n }else \r\n */\r\n files=pJSON;\r\n /* сохраняем путь каталога в котором мы сейчас находимся*/\r\n var lPath=files[0].path;\r\n \r\n /* сохраняем путь */\r\n CloudFunc.Path=lPath;\r\n \r\n /* \r\n * Строим путь каталога в котором мы находимся\r\n * со всеми подкаталогами\r\n */ \r\n var lHtmlPath=CloudFunc._getDirPath(lPath);\r\n \r\n /* Убираем последний слэш\r\n * с пути для кнопки обновить страницу\r\n * если он есть\r\n */\r\n var lRefreshPath=CloudFunc.removeLastSlash(lPath);\r\n \r\n /* путь в ссылке, который говорит\r\n * что js отключен\r\n */\r\n var lNoJS_s=CloudFunc.NOJS;\r\n var lFS_s=CloudFunc.FS;\r\n \r\n var lFileTable='
  • '+\r\n ''+\r\n ''+\r\n '' +\r\n ''+\r\n ''+\r\n ''+lHtmlPath+''+\r\n '
  • ';\r\n \r\n var fileTableTitles=['name','size','owner','mode'];\r\n lFileTable+=CloudFunc._getFileTableHeader(fileTableTitles);\r\n /* Если мы не в корне */\r\n if(lPath!=='/'){ \r\n /* ссылка на верхний каталог*/ \r\n var lDotDot; \r\n /* убираем последний слеш и каталог в котором мы сейчас находимся*/\r\n lDotDot=lPath.substr(lPath,lPath.lastIndexOf('/'));\r\n lDotDot=lDotDot.substr(lDotDot,lDotDot.lastIndexOf('/'));\r\n /* Если предыдущий каталог корневой */\r\n if(lDotDot==='')lDotDot='/';\r\n \r\n /* Сохраняем путь к каталогу верхнего уровня*/\r\n lFileTable += '
  • '+\r\n '' +\r\n '' +\r\n '' +\r\n ''+\"..\" +\r\n '' + \r\n '<dir>'+\r\n '.' +\r\n '' +\r\n '
  • '; \r\n }\r\n var lLength=files.length;\r\n \r\n for(var i=1;i';\r\n lFileTable +='';\r\n lFileTable +='' +\r\n '16?\r\n ' title=\"'+files[i].name+'\">' +\r\n files[i].name.substr(\r\n files[i].name,16)+\r\n '..':'>'+files[i].name) +\r\n \"\" +\r\n '';\r\n /* если папка - не выводим размер */\r\n lFileTable +='' +\r\n (files[i].size==='dir'?\r\n '<dir>':\r\n /* если это файл - получаем\r\n * короткий размер\r\n */\r\n CloudFunc.getShortedSize(\r\n files[i].size));\r\n lFileTable +='' +\r\n '' +\r\n (!files[i].uid?'root':files[i].uid) +\r\n '' +\r\n '' +\r\n /* конвертируем названия разрешений\r\n * из числового формата в буквенный\r\n * при этом корневой каталог не трогаем\r\n * по скольку в нём и так всё уже\r\n * установлено еще на сервере\r\n */\r\n (//lPath==='/'?files[i].mode:\r\n CloudFunc.convertPermissionsToSymbolic(files[i].mode)) +\r\n '';\r\n lFileTable +=''; \r\n }\r\n \r\n /* если клавиши назначены и\r\n * мы в корневом каталоге и\r\n * верхний файл еще не выделен -\r\n * выделяем верхний файл\r\n */\r\n if(pKeyBinded && lPath==='/'&&\r\n lFileTable.indexOf('
  • ')<0){\r\n lFileTable=lFileTable.replace('
  • ','
  • ');\r\n }\r\n\r\n \r\n \r\n return lFileTable;\r\n};\r\n\r\n/*\r\n * Если мы на стороне сервера -\r\n * прописываем экспортируемые функции\r\n */\r\ntry{\r\n if(exports){\r\n /* экспортируемые функции */ \r\n exports.checkExtension = CloudFunc.checkExtension;\r\n exports.buildFromJSON = CloudFunc.buildFromJSON;\r\n exports.replaceSpaces = CloudFunc.replaceSpaces; \r\n exports.setTitle = CloudFunc.setTitle;\r\n exports.convertPermissions = CloudFunc.convertPermissions;\r\n exports.getUserUIDsAndNames = CloudFunc.getUserUIDsAndNames;\r\n \r\n /* константы*/\r\n exports.Name = CloudFunc.NAME;\r\n exports.NOJS = CloudFunc.NOJS;\r\n exports.FS =CloudFunc.FS;\r\n \r\n console.log('cloudfunc.js loaded...');\r\n }\r\n}catch(err){\r\n /* если мы на клиенте */\r\n}"]],"start1":0,"start2":0,"length1":0,"length2":17708}]],"length":17708} diff --git a/.c9revisions/lib/server/minify.js.c9save b/.c9revisions/lib/server/minify.js.c9save new file mode 100644 index 00000000..e9aea616 --- /dev/null +++ b/.c9revisions/lib/server/minify.js.c9save @@ -0,0 +1,5 @@ +{"ts":1341484847358,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"/* Модуль сжатия js-скриптов и css*/\r\n\r\n/* функция сжимает js-скрипты \r\n * и сохраняет их с именем .min.js\r\n */\r\n \r\nvar fs = require('fs');\r\nvar path=require('path');\r\n\r\n/* CONSTANTS */\r\n/* dir contains css-files */\r\nvar CSSDIR = 'css/'; \r\n\r\n/* ---------------------------------- */\r\nconsole.log('minify.js loaded...');\r\nconsole.log('current dir: ' + process.cwd());\r\n/* ---------------------------------- */\r\n\r\nexports.jsScripts=function jsScripts(){\r\n 'use strict'; \r\n \r\n /* подключаем модуль uglify-js\r\n * если его нет - дальнейшая \r\n * работа функции не имеет смысла\r\n */\r\n try{\r\n var jsp = require(\"uglify-js\").parser;\r\n var pro = require(\"uglify-js\").uglify;\r\n }catch(error){\r\n console.log('can\\'n load uglify-js\\n' +\r\n 'to use js-minification you need to install uglify-js\\n' +\r\n 'npm install uglify-js\\n' +\r\n 'https://github.com/mishoo/UglifyJS');\r\n return false;\r\n }\r\n /* Константы */\r\n \r\n var CLIENT_JS='client.js';\r\n var CLOUDFUNC_JS='/lib/cloudfunc.js';\r\n var CLIENT_KEYBINDING_JS='lib/client/keyBinding.js';\r\n \r\n var dataReaded_f=function(pFileName, pData){\r\n console.log('file ' + pFileName + ' readed');\r\n \r\n /*********************************/\r\n /* сжимаем код через uglify-js */\r\n var uglify_js=function(pDdata){\r\n var orig_code = pDdata.toString();\r\n var ast = jsp.parse(orig_code); // parse code and get the initial AST\r\n ast = pro.ast_mangle(ast); // get a new AST with mangled names\r\n ast = pro.ast_squeeze(ast); // get an AST with compression optimizations\r\n var result_code = pro.gen_code(ast); // compressed code here\r\n return result_code;\r\n };\r\n /*********************************/\r\n var final_code=uglify_js(pData);\r\n \r\n var minFileName=pFileName.replace('.js','.min.js');\r\n /* если мы сжимаем client.js -\r\n * меняем строку cloudfunc.js на\r\n * cloudfunc.min.js и выводим сообщение\r\n *\r\n * меняем строку keyBinding.js на\r\n * keyBinding.min.js\r\n * если другой файл - ничего не деалем\r\n */\r\n if(pFileName===CLIENT_JS)\r\n console.log('file name of ' +\r\n CLOUDFUNC_JS +\r\n ' in ' +\r\n CLIENT_JS +\r\n ' changed. size:',\r\n (final_code=final_code\r\n .replace('cloudfunc.js','cloudfunc.min.js')\r\n .replace('keyBinding.js','keyBinding.min.js')).length);\r\n \r\n /* записываем сжатый js-скрипт*/\r\n fs.writeFile(path.basename(minFileName), final_code, fileWrited(minFileName));\r\n };\r\n console.log('reading file ' + CLIENT_JS+'...');\r\n fs.readFile(CLIENT_JS,fileReaded(CLIENT_JS,dataReaded_f));\r\n \r\n console.log('reading file ' + CLOUDFUNC_JS+'...');\r\n fs.readFile(CLOUDFUNC_JS,fileReaded(CLOUDFUNC_JS,dataReaded_f)); \r\n \r\n console.log('reading file ' + CLIENT_KEYBINDING_JS+'...');\r\n fs.readFile(CLIENT_KEYBINDING_JS, fileReaded(CLIENT_KEYBINDING_JS,dataReaded_f));\r\n \r\n \r\n return true;\r\n};\r\n\r\n/* функция сжимает css-стили \r\n * и сохраняет их с именем .min.css\r\n * @pImgConvertToBase64_b - булевый признак,\r\n * который отвечает за то, что быконвертировать\r\n * картинки в base64 и поместить в выходной css файл\r\n */\r\nexports.cssStyles=function cssStyles(pImgConvertToBase64_b){\r\n 'use strict';\r\n \r\n /* connecting cleanCSS,\r\n * if we can't find it -\r\n * return false\r\n */\r\n var cleanCSS;\r\n try{\r\n cleanCSS = require('clean-css');\r\n }catch(error){\r\n console.log('can\\'n load clean-css \\n' +\r\n 'to use css-minification you need to install clean-css \\n' +\r\n 'npm install clean-css\\n' +\r\n 'https://github.com/GoalSmashers/clean-css');\r\n return false;\r\n }\r\n \r\n /* Константы */\r\n var STYLE_CSS = CSSDIR+'style.css';\r\n var RESET_CSS = CSSDIR+'reset.css';\r\n \r\n var lAllStyle='';\r\n var lResetCssDone=false;\r\n var lStyleCssDone=false;\r\n var dataReaded_f=function(pFileName, pData){\r\n console.log('file ' + pFileName + ' readed'); \r\n /*********************************/\r\n /* сжимаем код через clean-css */\r\n var clean_css=function(pData){\r\n /* Сохраняем весь стиль в одну переменную*/ \r\n return cleanCSS.process(pData);\r\n };\r\n /*********************************/\r\n var final_code=clean_css(pData);\r\n \r\n lAllStyle+=final_code;\r\n \r\n var minFileName=pFileName.replace('.css','.min.css'); \r\n \r\n if(pFileName===STYLE_CSS)lStyleCssDone=true;\r\n if(pFileName===RESET_CSS)lResetCssDone=true;\r\n /* if all files writed we\r\n * save all minimized css \r\n * to one file all.min.css\r\n */ \r\n if(lStyleCssDone && lResetCssDone){\r\n /* если включена конвертация картинок в base64\r\n * вызываем её\r\n */\r\n if(pImgConvertToBase64_b)\r\n base64_images(lAllStyle);\r\n else\r\n fs.writeFile('all.min.css', lAllStyle, fileWrited('all.min.css')); \r\n }\r\n /* в другом случае - записываем сжатый css файл*/\r\n else fs.writeFile(path.basename(minFileName), final_code, fileWrited(minFileName));\r\n };\r\n \r\n console.log('reading file ' + STYLE_CSS+'...');\r\n fs.readFile(STYLE_CSS,fileReaded(STYLE_CSS,dataReaded_f));\r\n \r\n console.log('reading file ' + RESET_CSS+'...');\r\n fs.readFile(RESET_CSS,fileReaded(RESET_CSS,dataReaded_f)); \r\n \r\n return true;\r\n};\r\n\r\n/* функция сжимает css-стили \r\n * и сохраняет их с именем .min.css\r\n */\r\nexports.html=function(){\r\n 'use strict';\r\n \r\n /* connecting cleanCSS,\r\n * if we can't find it -\r\n * return false\r\n */\r\n var htmlMinifier;\r\n try{\r\n htmlMinifier = require('html-minifier');\r\n }catch(error){\r\n console.log('can\\'n load html-minifier \\n' +\r\n 'to use html-minification you need to install html-minifier\\n' +\r\n 'npm install html-minifier\\n' +\r\n 'https://github.com/kangax/html-minifier');\r\n return false;\r\n }\r\n \r\n /* Константы */\r\n var INDEX_HTML='index.html';\r\n \r\n var dataReaded_f=function(pFileName, pData){\r\n console.log('file ' + pFileName + ' readed'); \r\n /*********************************/\r\n /* сжимаем код через clean-css */\r\n var html_minify=function(pData){\r\n /* Сохраняем весь стиль в одну переменную*/ \r\n \r\n var lOptions={\r\n removeComments: true,\r\n removeCommentsFromCDATA: true,\r\n removeCDATASectionsFromCDATA: true,\r\n collapseWhitespace: true,\r\n collapseBooleanAttributes: true,\r\n removeAttributeQuotes: true,\r\n removeRedundantAttributes: true,\r\n useShortDoctype: true,\r\n removeEmptyAttributes: true,\r\n /* оставляем, поскольку у нас\r\n * в элемент fm генерируеться\r\n * таблица файлов\r\n */\r\n removeEmptyElements: false,\r\n removeOptionalTags: true,\r\n removeScriptTypeAttributes: true,\r\n removeStyleLinkTypeAttributes: true\r\n };\r\n \r\n \r\n return htmlMinifier.minify(pData,lOptions);\r\n };\r\n /*********************************/\r\n var final_code=html_minify(pData);\r\n \r\n var minFileName=pFileName.replace('.html','.min.html');\r\n \r\n /* записываем сжатый html файл*/\r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n };\r\n \r\n console.log('reading file ' + INDEX_HTML+'...');\r\n fs.readFile(INDEX_HTML,fileReaded(INDEX_HTML,dataReaded_f));\r\n \r\n return true;\r\n};\r\n\r\n/* функция переводит картинки в base64 и записывает в css-файл*/\r\nfunction base64_images(pFileContent_s){\r\n 'use strict'; \r\n var b64img;\r\n try{\r\n b64img = require('css-b64-images');\r\n }catch(error){\r\n console.log('can\\'n load clean-css \\n' +\r\n 'to use images to base64 convertation you need to install css-base64-images \\n' +\r\n 'npm install -g css-b64-images\\n' +\r\n 'https://github.com/Filirom1/css-base64-images');\r\n return false;\r\n }\r\n b64img.fromString(pFileContent_s, '.','', function(err, css){\r\n console.log('images converted to base64 and saved in css file');\r\n fs.writeFile('all.min.css', css, fileWrited('all.min.css'));\r\n });\r\n}\r\n\r\n/* Функция создаёт асинхроную версию \r\n * для чтения файла\r\n * @pFileName - имя считываемого файла\r\n */\r\nfunction fileReaded(pFileName,pCompressFunc){\r\n \"use strict\";\r\n return function(pError,pData){\r\n /* функция в которую мы попадаем,\r\n * если данные считались\r\n *\r\n * если ошибка - показываем её\r\n * иначе если переданная функция -\r\n * функция запускаем её\r\n */ \r\n if(!pError)\r\n if (pCompressFunc && typeof pCompressFunc===\"function\")\r\n pCompressFunc(pFileName,pData.toString());\r\n else console.log(pError);\r\n };\r\n}\r\n\r\n/*\r\n * Функция вызываеться после записи файла\r\n * и выводит ошибку или сообщает,\r\n * что файл успешно записан\r\n */\r\nfunction fileWrited(pFileName){\r\n \"use strict\";\r\n return function(error){\r\n console.log(error?error:('file '+pFileName+' writed...'));\r\n };\r\n}"]],"start1":0,"start2":0,"length1":0,"length2":10350}]],"length":10350} +{"contributors":[],"silentsave":false,"ts":1341485022037,"patch":[[{"diffs":[[0,"UNC_JS='"],[-1,"/"],[0,"lib/clou"]],"start1":1114,"start2":1114,"length1":17,"length2":16}]],"length":10349,"saved":false} +{"ts":1341485120046,"patch":[[{"diffs":[[0,"Константы */"],[-1,"\r\n"],[0," \r\n "]],"start1":1044,"start2":1044,"length1":26,"length2":24}]],"length":10347,"saved":false} +{"ts":1341485506013,"patch":[[{"diffs":[[0," */\r\n"],[1," \r\n /* \r\n * temporary changed dir path,\r\n * becouse directory lib is write\r\n * protected by others by default\r\n * so if node process is started\r\n * from other user (root for example\r\n * in nodester) we can not write\r\n * minified versions\r\n */\r\n"],[0," if(p"]],"start1":2377,"start2":2377,"length1":32,"length2":422},{"diffs":[[0,"min.js')"],[1,"\r\n .replace("],[0,").length"]],"start1":3228,"start2":3228,"length1":16,"length2":59}]],"length":10780,"saved":false} +{"contributors":[],"silentsave":false,"ts":1341492596839,"patch":[[{"diffs":[[0,");\r\n"],[-1,"console.log('current dir: ' + process.cwd());\r\n"],[0,"/* -"]],"start1":325,"start2":325,"length1":55,"length2":8},{"diffs":[[0,"\n */"],[-1,"\r\n"],[0," \r\n "]],"start1":2328,"start2":2328,"length1":34,"length2":32},{"diffs":[[0,"replace("],[1,"'/lib','')\r\n .replace('/lib/client','')"],[0,").length"]],"start1":3222,"start2":3222,"length1":16,"length2":90}]],"length":10805,"saved":false} diff --git a/.c9revisions/lib/server/object.js.c9save b/.c9revisions/lib/server/object.js.c9save new file mode 100644 index 00000000..07db5c75 --- /dev/null +++ b/.c9revisions/lib/server/object.js.c9save @@ -0,0 +1,3 @@ +{"ts":1342076681908,"silentsave":true,"restoring":false,"patch":[[]],"length":0} +{"contributors":[],"silentsave":false,"ts":1342252151794,"patch":[[{"diffs":[[1,"/* Module contains Cloud Commander SS(Server Side) objects.\r\n *\r\n * List of objects:\r\n * - Cache\r\n * - Minify\r\n */\r\n\r\n\r\n/* \r\n * Обьект для работы с кэшем\r\n * аналог клиентского обьекта\r\n * с тем отличием, что в нём\r\n * будут храниться серверные\r\n * данные, такие как файлы\r\n * отдаваемые клиенту\r\n * (файлы проэкта по большому\r\n * счёту, для ускорения\r\n * первичной загрузки)\r\n */\r\nexports.Cache={\r\n /* приватный переключатель возможности работы с кэшем */\r\n _allowed :true,\r\n /* данные в которых храняться файлы \r\n * в формате <поле> : <значение>\r\n * _data[name]=pData;\r\n * одному имени соответствуют \r\n * одни данные\r\n */\r\n _data :{},\r\n \r\n /* функция говорит можно ли работать с кэшем */\r\n isAllowed :(function(){\r\n return this._allowed;\r\n }),\r\n /* функция устанавливает возможность работать с кэшем */\r\n setAllowed :(function(pAllowed){\r\n this._allowed=pAllowed;\r\n }),\r\n /* Если доступен кэш\r\n * сохраняем в него данные\r\n */\r\n set :(function(pName, pData){\r\n if(this._allowed && pName && pData){\r\n this._data[pName]=pData;\r\n }\r\n }),\r\n /* Если доступен Cache принимаем из него данные*/\r\n get :(function(pName){\r\n if(this._allowed && pName){\r\n return this._data[pName];\r\n }\r\n else return null;\r\n }),\r\n \r\n /* Функция очищает кэш*/\r\n clear :(function(){\r\n if(this._allowed){\r\n this._data={};\r\n }\r\n })\r\n};\r\n\r\n/* Обьект для сжатия скриптов и стилей\r\n * по умолчанию - сжимаються\r\n */\r\nexports.Minify={\r\n /* pathes to directories */\r\n CSSDIR :'./css',\r\n INDEX :'index.html', \r\n /* приватный переключатель минимизации */\r\n _allowed :{css:true,js:true,html:true, img: true},\r\n \r\n /* функция разрешает или \r\n * запрещает минимизировать\r\n * css/js/html\r\n * @pAllowed: - структура, в которой\r\n * передаються параметры\r\n * минификации, вида\r\n * {js:true,css:true,html:false; img:true}\r\n * img отвечает за перевод картинок в base64\r\n * и сохранение их в css-файл\r\n */\r\n setAllowed :(function(pAllowed){\r\n if(pAllowed){\r\n this._allowed.css=pAllowed.css; \r\n this._allowed.js=pAllowed.js; \r\n this._allowed.html=pAllowed.html; \r\n this._allowed.img=pAllowed.img; \r\n }\r\n }),\r\n \r\n /*\r\n * Функция минимизирует css/js/html\r\n * если установлены параметры минимизации\r\n */\r\n doit :(function(){\r\n if(this._allowed.css ||\r\n this._allowed.js ||\r\n this._allowed.html){\r\n var lMinify;\r\n try{\r\n lMinify = require('minify');\r\n }catch(pError){\r\n return console.log('Could not minify' +\r\n 'withou minify module\\n' +\r\n 'for fixing type:\\n' +\r\n 'git submodule init\\n' +\r\n 'git submodule update\\n' +\r\n 'or\\n' +\r\n 'npm i minify');\r\n }\r\n /*\r\n * temporary changed dir path,\r\n * becouse directory lib is write\r\n * protected by others by default\r\n * so if node process is started\r\n * from other user (root for example\r\n * in nodester) we can not write\r\n * minified versions\r\n */\r\n this.MinFolder = '/' + lMinify.MinFolder;\r\n var lMinFolder=this.MinFolder;\r\n \r\n /* post processing function for file\r\n * client.js\r\n */\r\n \r\n /* если мы сжимаем client.js -\r\n * меняем строку cloudfunc.js на\r\n * cloudfunc.min.js и выводим сообщение\r\n *\r\n * меняем строку keyBinding.js на\r\n * keyBinding.min.js\r\n * если другой файл - ничего не деалем\r\n */ \r\n var lPostProcessing_f = function(pFinalCode){\r\n console.log('file name of ' +\r\n 'cloudfunc.js' +\r\n ' in ' +\r\n 'client.js' +\r\n ' changed. size:',\r\n (pFinalCode = pFinalCode\r\n .replace('cloudfunc.js','cloudfunc.min.js')\r\n .replace('keyBinding.js','keyBinding.min.js')\r\n .replace('/lib/', lMinFolder)\r\n .replace('/lib/client/',\r\n lMinFolder)).length);\r\n return pFinalCode;\r\n };\r\n \r\n this.done.js=this._allowed.js?\r\n lMinify.jsScripts([{\r\n 'client.js': lPostProcessing_f},\r\n 'lib/cloudfunc.js',\r\n 'lib/client/keyBinding.js'],\r\n true)\r\n :false;\r\n \r\n this.done.html=this._allowed.html?\r\n lMinify.html(this.INDEX):false;\r\n \r\n this.done.css=this._allowed.css?\r\n lMinify.cssStyles([this.CSSDIR + '/style.css',\r\n this.CSSDIR + '/reset.css'],\r\n this._allowed.img):false;\r\n \r\n this.Cache = lMinify.Cache;\r\n }\r\n }),\r\n /* свойство показывающее случилась ли ошибка*/\r\n done:{js: false,css: false, html:false},\r\n \r\n /* minification folder name */\r\n MinFolder :'',\r\n Cache :{}\r\n};"]],"start1":0,"start2":0,"length1":0,"length2":6123}]],"length":6123,"saved":false} +{"ts":1342252524044,"patch":[[{"diffs":[[0,"ify."],[-1,"jsScripts"],[1,"optimize"],[0,"([{\r"]],"start1":5204,"start2":5204,"length1":17,"length2":16}]],"length":6122,"saved":false} diff --git a/.c9revisions/log.txt.c9save b/.c9revisions/log.txt.c9save new file mode 100644 index 00000000..84df3c11 --- /dev/null +++ b/.c9revisions/log.txt.c9save @@ -0,0 +1 @@ +{"ts":1341644211079,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"minify.js loaded...\nreading file client.js...\nreading file lib/cloudfunc.js...\nreading file lib/client/keyBinding.js...\nreading file index.html...\nreading file css/style.css...\nreading file css/reset.css...\nCloud Commander testing mode\nfolder exist: min/\nfile client.js readed\nfile name of lib/cloudfunc.js in client.js changed. size: 9328\nfile lib/cloudfunc.js readed\nfile index.html readed\nfile css/style.css readed\nfile lib/client/keyBinding.js readed\nfile css/reset.css readed\nfile min/cloudfunc.min.js writed...\nfile min/client.min.js writed...\nfile min/index.min.html writed...\nfile min/style.min.css writed...\nfile min/keyBinding.min.js writed...\nimages converted to base64 and saved in css file\nfile min/all.min.css writed...\n"]],"start1":0,"start2":0,"length1":0,"length2":734}]],"length":734} diff --git a/.c9revisions/node_modules/dropbox/README.md.c9save b/.c9revisions/node_modules/dropbox/README.md.c9save new file mode 100644 index 00000000..36d375e9 --- /dev/null +++ b/.c9revisions/node_modules/dropbox/README.md.c9save @@ -0,0 +1 @@ +{"ts":1341058602383,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"# dropbox-node\n\nAn OAuth-enabled Node.js client for working with the Dropbox API.\n\n## Installation\n\ndropbox-node depends on [node-oauth](http://github.com/ciaranj/node-oauth).\n\nTo install via npm\n\n npm install dropbox\n\nTo install by hand, download the module and create a symlink in `~/.node_libraries`\n\n $ ln -s /path/to/dropbox-node/ ~/.node_libraries/dropbox-node\n\n## Usage\n\nTo start, grab a consumer key and secret from [dropbox.com/developers](https://dropbox.com/developers).\n\n### Object construction and access key pair retrieval\nFirst construct a DropboxClient object, passing in the consumer key and secret.\n\n var dropbox = new DropboxClient(consumer_key, consumer_secret)\n\nBefore calling any Dropbox API methods, an access token pair must be obtained. This can be done one of two ways:\n\n 1. If the access token and secret are known a priori, they can be passed directly into the DropboxClient constructor.\n\n var dropbox = new DropboxClient(consumer_key, consumer_secret,\n access_token, access_token_secret)\n\n 2. Otherwise, `getAccessToken` must be called in order to initialize the OAuth credentials.\n\n dropbox.getAccessToken(dropbox_email, dropbox_password, callback)\n\nThe callback given to `getAccessToken` takes an error object, an access token, and an access token secret (see example below). **Please note that users' passwords should never be stored.** It is best to acquire a token once and then use it for all subsequent requests.\n\n### Calling API methods\n\ndropbox-node provides methods covering [each of the Dropbox API methods](https://www.dropbox.com/developers/docs). For example, to fetch and print the display name and email address associated with your account:\n\n dropbox.getAccountInfo(function (err, data) {\n if (err) console.log('Error: ' + err)\n else console.log(data.display_name + ', ' + data.email)\n })\n\nNote that (at least at the start of a user's session) a valid access token pair must be obtained prior to interacting with the rest of the Dropbox API. This means that the API methods must be invoked within the callback passed to `getAccessToken` unless it is guaranteed that `getAccessToken` was called previously. As an example of this latter case, if building a web app, one could call API methods directly in a route that can only be accessed after going through a sign-in phase in which a call to `getAccessToken` is made.\n\nHere we upload a file and remotely move it around before deleting it.\n\n dropbox.getAccessToken(email, pwd, function (err, token, secret) {\n // Upload foo.txt to the Dropbox root directory.\n dropbox.putFile('foo.txt', 'foo.txt', function (err, data) {\n if (err) return console.error(err)\n\n // Move it into the Public directory.\n dropbox.move('foo.txt', 'Public/foo.txt', function (err, data) {\n if (err) return console.error(err)\n\n // Delete the file.\n dropbox.deleteItem('Public/foo.txt', function (err, data) {\n if (err) console.error(err.stack)\n })\n })\n })\n })\n\nFor a more practical example, check out this [walkthrough of building a simple Dropbox file browser](http://evanmeagher.net/2010/10/dropbox-file-browser).\n\n### Stream-based file-downloading\n\nAs of v0.3.1, dropbox-node exposes a method `getFileStream` that allows stream-based file-downloading. This is useful when downloading large files that wouldn't easily fit in memory and thus don't play nicely with `getFile`.\n\n`getFileStream` returns an EventEmitter representing the request. The target file will be downloaded in chunks and dealt with according to the callbacks you register. Here we fetch a large file and write it to disk:\n\n var request = dropbox.getFileStream(\"path/to/huge/file\")\n , write_stream = require('fs').createWriteStream(\"out\")\n\n request.on('response', function (response) {\n response.on('data', function (chunk) { write_stream.write(chunk) })\n response.on('end', function () { write_stream.end() })\n })\n request.end()\n\n### Optional arguments\n\nOptional arguments (as specified in the [Dropbox API documentation](https://www.dropbox.com/developers/docs)) can be given to API methods via an argument object.\n\nFor example, here we call `getAccountInfo` and direct the API to include the HTTP status code in the response.\n\n dropbox.getAccountInfo({ status_in_response: true }, callback)\n\nEach method (except `getAccessToken`) can optionally take an access token and an access token secret as strings. This is the one way to get around having to call `getAccessToken` in cases where a valid key pair is known.\n\nFor example, here we fetch the metadata about the Dropbox root directory, passing in an explicit key pair stored in variables.\n\n dropbox.getMetadata('', { token: token, secret: secret }, callback)\n\n## API\n\n### new DropboxClient()\n\n### DropboxClient#getAccessToken(email, password, callback(err, access_token, access_token_secret))\n\nFetches an access token and secret based on the email and password given. Stores the token and secret in the DropboxClient instance and calls the callback them.\n\n### DropboxClient#getAccountInfo([optargs], callback(err, accountInfo))\nhttps://www.dropbox.com/developers/reference/api#account-info\n\nGets account information from the client.\n\n### DropboxClient#createAccount(email, first_name, last_name, password, [optargs], callback(err, accountInfo))\n\nCreates a new Dropbox account.\n\n### DropboxClient#getFile(path, [optargs], [callback(err, body)])\nhttps://www.dropbox.com/developers/reference/api#files-GET\n\nRetrieves a file specified by the path. `callback` will be called with a possible error and the buffer of the contents of the file. This method also returns a readable stream that can be used to pipe the contents.\n\n```js\ndropboxClient('mybigfile.mpeg').pipe(fs.createWriteStream('localbigfile.mpeg');\n```\n\n`optargs` can also have a `rev` field to specify the revision of the file to download, and `range` for [HTTP Range Retrieval Requests](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2).\n\n```js\n// download the first 1024 byte\ndropboxClient('file.zip', { range: 'bytes=0-1024'}, function(err, data) {\n console.log(data.length); // 1024. that is if the file is at least 1024 bytes\n});\n```\n\n### DropboxClient#putFile(filepath, remotepath, [optargs], callback(err, metadata))\nhttps://www.dropbox.com/developers/reference/api#files_put\n\nUploads a file specified by `filepath` to `remotepath` on Dropbox. Dropbox currently does not support streaming uploads, and the max upload is 150 MB. `optargs` can also take additional fields `overwrite` and `parent_rev`.\n\n### DropboxClient#put(contents, remotepath, [optargs], callback(err, metadata))\no\nSimilar to `putFile()` but places `contents` into a created file at `remotepath`. `contents` can be a buffer or string.\n\n### DropboxClient#getMetadata(path, [optargs], callback(err, metadata))\nhttps://www.dropbox.com/developers/reference/api#metadata\n\nGets metadata of file/folder specified by `path`. `optargs` can have fields `hash`, `list`, `include_deleted` and `rev`.\n\n### DropboxClient#delta([cursor], [optargs], callback(err, changes))\nhttps://www.dropbox.com/developers/reference/api#delta\n\nKeeps up with changes from a client's Dropbox. `changes` is an array of arrays with first element as the path and second as metadata.\n\n### DropboxClient#changesStream([startingCursor], [optargs])\nConvenient method that provides a more friendly API to `delta()`. Returns an event emitter that emits `data` events with `path` and `metadata` parameters on changes to the client's Dropbox. Also can emit `reset` and `error` events. The returned event emitter also has a `pause()` and `resume()` methods.\n\n### DropboxClient#search(folderpath, query, [optargs], callback(err, results))\nhttps://www.dropbox.com/developers/reference/api#search\n\nSearches `folderpath` for files matching `query`. `results` is an array of metadata. `optargs` can take `file_limit` and `include_deleted`.\n\n### DropboxClient#getThumbnail(filepath, [optargs], [callback(err, body, metadata)])\nhttps://www.dropbox.com/developers/reference/api#thumbnails\n\nDownloads a thumbnail image located at `filepath`. Like `getFile()`, the `callback` can get buffered data or the returned readable stream can be piped. `optargs` can take `format` and `size` fields.\n\n### DropboxClient#copy(from_path, to_path, [optargs], callback)\nhttps://www.dropbox.com/developers/reference/api#fileops-copy\n\nCopies a file. `from_copy_ref` field can be given in `optargs` to use it instead of `from_path`.\n\n### DropboxClient#createFolder(path, [optargs], callback(err, metadata))\nhttps://www.dropbox.com/developers/reference/api#fileops-create-folder\n\nCreates a folder at the given path.\n\n### DropboxClient#deleteItem(path, [optargs], callback(err, metadata))\nhttps://www.dropbox.com/developers/reference/api#fileops-delete\n\nDeletes file or folder from path.\n\n### DropboxClient#move(from_path, to_path, [optargs], callback(err, metadata))\nhttps://www.dropbox.com/developers/reference/api#fileops-move\n\nMoves a file to another path.\n\n\n## Testing\n\ndropbox-node depends on [jasmine-node](http://github.com/mhevery/jasmine-node) for testing. Note that the currently-implemented tests are trivial, due to a lack of a way to effectively mock the Dropbox API.\n\nRun specs with `node specs.js` from the root `dropbox-node` directory.\n\n## TODO\n* Improve test coverage.\n* Improve documentation.\n* Add ability to interact with application sandboxes.\n"]],"start1":0,"start2":0,"length1":0,"length2":9547}]],"length":9547} diff --git a/.c9revisions/node_modules/dropbox/README.md.c9save.h467788a.tmp b/.c9revisions/node_modules/dropbox/README.md.c9save.h467788a.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/node_modules/dropbox/README.md.c9save.h510uqwf.tmp b/.c9revisions/node_modules/dropbox/README.md.c9save.h510uqwf.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save b/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save new file mode 100644 index 00000000..9e79cd30 --- /dev/null +++ b/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save @@ -0,0 +1 @@ +{"ts":1341058602500,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"// Read dropbox key and secret from the command line.\nvar consumer_key = process.argv[2]\n , consumer_secret = process.argv[3];\n\nif (consumer_key == undefined || consumer_secret == undefined) {\n console.log(\"Usage: node app.js \");\n process.exit(1);\n}\n\nvar sys = require('sys')\n , DropboxClient = require('../../lib/dropbox-node').DropboxClient\n , express = require('express')\n , app = express.createServer();\n\n// Create and configure an Express server.\nvar app = express.createServer();\napp.configure(function () {\n app.use(express.static(__dirname + '/public'))\n , app.use(express.logger())\n , app.use(express.bodyParser())\n , app.use(express.cookieParser())\n , app.use(express.session({ secret: '1ts-s3cr3t!'} ));\n});\n\n// Login page.\napp.get('/', function (req, res) {\n res.render('login.jade', {\n locals: {\n title: 'Dropbox File Browser'\n }\n });\n});\n\n// Dropbox credential processing.\napp.post('/process_creds', function (req, res) {\n // Create a DropboxClient and initialize it with an access token pair.\n var dropbox = new DropboxClient(consumer_key, consumer_secret);\n \n dropbox.getAccessToken(req.body.email,\n req.body.password,\n function (err, token, secret) {\n req.session.access_token = token;\n req.session.access_token_secret = secret;\n console.log(req.body.email)\n res.redirect('/file_browser');\n });\n});\n\n// File browser page.\napp.get('/file_browser(/*)?', function (req, res) {\n // Fetch target metadata and render the page.\n if (req.session.access_token && req.session.access_token_secret) {\n var dropbox = new DropboxClient(consumer_key,\n consumer_secret,\n req.session.access_token,\n req.session.access_token_secret);\n dropbox.getMetadata(req.params[1] || '', function (err, metadata) {\n if (err) return console.log('Error: ' + sys.inspect(err));\n res.render('file_browser.jade', {\n\tlocals: {\n\t title: 'Dropbox File Browser'\n\t , current_dir: (metadata.path.length > 0) ? metadata.path : 'root'\n\t , items: metadata.contents\n\t}\n });\n });\n } else res.redirect('home');\n});\n\napp.listen(process.env.PORT || 3000);\nconsole.log(\"Express server listening on port %d in %s mode\", app.address().port, app.settings.env);\nconsole.log('Dropbox browser running on port ' + app.address().port);\n"]],"start1":0,"start2":0,"length1":0,"length2":2451}]],"length":2451} diff --git a/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save.h4uqwj6t.tmp b/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save.h4uqwj6t.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save.h5bpdl02.tmp b/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save.h5bpdl02.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save.h5n8xm3t.tmp b/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save.h5n8xm3t.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save.h5w384gb.tmp b/.c9revisions/node_modules/dropbox/examples/db-browser/app.js.c9save.h5w384gb.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/node_modules/dropbox/examples/db-browser/views/login.jade.c9save b/.c9revisions/node_modules/dropbox/examples/db-browser/views/login.jade.c9save new file mode 100644 index 00000000..4c9f188e --- /dev/null +++ b/.c9revisions/node_modules/dropbox/examples/db-browser/views/login.jade.c9save @@ -0,0 +1 @@ +{"ts":1341058602500,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"h1 Enter your Dropbox credentials\nform(method='post', action='/process_creds')\n div\n label(for='email') Email:\n input(type='text', name='email', id='email')\n div\n label(for='password') Password:\n input(type='password', name='password', id='password')\n div#editArticleSubmit\n input(type='submit', value='Login', class='submit')\n"]],"start1":0,"start2":0,"length1":0,"length2":345}]],"length":345} diff --git a/.c9revisions/node_modules/dropbox/examples/db-browser/views/login.jade.c9save.h44ymad8.tmp b/.c9revisions/node_modules/dropbox/examples/db-browser/views/login.jade.c9save.h44ymad8.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/node_modules/minify/minify.js.c9save b/.c9revisions/node_modules/minify/minify.js.c9save new file mode 100644 index 00000000..9ec68793 --- /dev/null +++ b/.c9revisions/node_modules/minify/minify.js.c9save @@ -0,0 +1,38 @@ +{"ts":1342200026439,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"/* Модуль сжатия js-скриптов, css-стилей, html-файлов и\r\n * конвертации картинок в css-стилях \r\n * в base64 и помещения их в файл стилей\r\n */\r\n\r\nconsole.log('minify.js loaded...');\r\n\r\n/* функция сжимает js-скрипты \r\n * и сохраняет их с именем .min.js\r\n */\r\n \r\nvar fs = require('fs');\r\nvar path=require('path');\r\nvar crypto = require('crypto');\r\n\r\nvar Hashes;\r\n\r\nvar MinFolder='min/';\r\n/* function clear MinFolder\r\n * if we could not create\r\n * directory and it is\r\n * not exist\r\n */\r\nvar folderExist = function(pError, pStat){\r\n \"use strict\";\r\n /*file found and it's directory */\r\n if(!pError && pStat.isDirectory())\r\n console.log('folder exist: ' + MinFolder);\r\n else MinFolder='/';\r\n};\r\n\r\n/*\r\n * function says thet folder created\r\n * if everything is OK, or\r\n * moves to folderExist function\r\n */\r\nvar makeFolder = function(pError){\r\n \"use strict\";\r\n /*folder created successfully*/\r\n if(!pError)\r\n console.log('folder created: min');\r\n else fs.stat(MinFolder,folderExist); \r\n};\r\n\r\n/* Trying to create folder min\r\n * where woud be minifyed versions\r\n * of files 511(10)=777(8)\r\n * rwxrwxrwx\r\n */\r\nfs.mkdir(MinFolder,511,makeFolder);\r\n\r\nexports.MinFolder = MinFolder;\r\nexports.Cache = {};\r\n\r\n/* function which minificate js-files\r\n * @pJSFiles_a - varible, wich contain array\r\n * of js file names or string, if name\r\n * single, or object if postProcessing neaded\r\n * { Name:'1.js', Func: function(pFinalCode){} }\r\n * @pCache_b - if true files do not writes on disk, just saves\r\n * in Minify Cache\r\n */\r\nexports.jsScripts=function jsScripts(pJSFiles_a, pCache_b){\r\n 'use strict';\r\n /* подключаем модуль uglify-js\r\n * если его нет - дальнейшая \r\n * работа функции не имеет смысла\r\n */\r\n try{\r\n var jsp = require(\"uglify-js\").parser;\r\n var pro = require(\"uglify-js\").uglify;\r\n }catch(error){\r\n console.log('can\\'n load uglify-js\\n' +\r\n 'to use js-minification you need to install uglify-js\\n' +\r\n 'npm install uglify-js\\n' +\r\n 'https://github.com/mishoo/UglifyJS');\r\n return false;\r\n }\r\n var lLastFileName;\r\n \r\n /* if passed string, or object \r\n * putting it to array\r\n */\r\n if (typeof pJSFiles_a === 'string' ||\r\n !pJSFiles_a[0])\r\n pJSFiles_a=[pJSFiles_a]; \r\n \r\n var dataReaded_f=function(pFileName, pData){ \r\n /*\r\n * if postProcessing function exist\r\n * getting it from pFileName object\r\n */\r\n var lMoreProcessing_f;\r\n if(typeof pFileName === 'object'){\r\n var lName;\r\n for(lName in pFileName){\r\n break;\r\n }\r\n lMoreProcessing_f = pFileName[lName]; \r\n pFileName = lName;\r\n }\r\n console.log('file ' + pFileName + ' readed');\r\n \r\n if (!isFileChanged(pFileName, pData)) {\r\n console.log('file: ' + pFileName + ' do not changed...');\r\n return;\r\n }\r\n \r\n /*********************************/\r\n /* сжимаем код через uglify-js */\r\n var uglify_js=function(pDdata){\r\n var orig_code = pDdata.toString();\r\n var ast = jsp.parse(orig_code); // parse code and get the initial AST\r\n ast = pro.ast_mangle(ast); // get a new AST with mangled names\r\n ast = pro.ast_squeeze(ast); // get an AST with compression optimizations\r\n var result_code = pro.gen_code(ast); // compressed code here\r\n return result_code;\r\n };\r\n /*********************************/\r\n var final_code=uglify_js(pData);\r\n \r\n var minFileName=pFileName.replace('.js','.min.js');\r\n \r\n /* если мы сжимаем client.js -\r\n * меняем строку cloudfunc.js на\r\n * cloudfunc.min.js и выводим сообщение\r\n *\r\n * меняем строку keyBinding.js на\r\n * keyBinding.min.js\r\n * если другой файл - ничего не деалем\r\n */ \r\n \r\n /* if lMoreProcessing_f seeted up \r\n * and function associated with\r\n * current file name exists -\r\n * run it\r\n */\r\n if(lMoreProcessing_f && \r\n typeof lMoreProcessing_f === \"function\"){\r\n final_code = lMoreProcessing_f(final_code);\r\n } \r\n \r\n minFileName = path.basename(minFileName);\r\n \r\n /* записываем сжатый js-скрипт\r\n * в кэш если установлен pCache_b\r\n * или на диск, если не установлен\r\n */\r\n if(pCache_b){\r\n exports.Cache[minFileName] = final_code;\r\n console.log('file ' + minFileName + ' saved to cache...');\r\n }\r\n else{\r\n /* minimized file will be in min file\r\n * if it's possible if not -\r\n * in root\r\n */\r\n minFileName = MinFolder + minFileName;\r\n \r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n }\r\n };\r\n \r\n var lName;\r\n /* moving thru all elements of js files array */\r\n for(var i=0; pJSFiles_a[i]; i++){\r\n /* if postProcessing function exist\r\n * getting file name and passet next\r\n */\r\n var lMoreProcessing_o = pJSFiles_a[i]; \r\n if(typeof lMoreProcessing_o === 'object'){\r\n for(lName in lMoreProcessing_o){\r\n }\r\n }else lName = pJSFiles_a[i];\r\n console.log('reading file ' + lName + '...'); \r\n \r\n fs.readFile(lName, fileReaded(pJSFiles_a[i], dataReaded_f));\r\n }\r\n /* saving the name of last readed file for hash saving function */\r\n lLastFileName = lName;\r\n \r\n return true;\r\n};\r\n\r\n/* функция сжимает css-стили \r\n * и сохраняет их с именем .min.css\r\n * @pCSSFiles_a - масив имен css файлов или строка,\r\n * если имя одно\r\n * @pImgConvertToBase64_b - булевый признак,\r\n * который отвечает за то, что быконвертировать\r\n * картинки в base64 и поместить в выходной css файл\r\n */\r\nexports.cssStyles=function cssStyles(pCSSFiles_a, pImgConvertToBase64_b){\r\n 'use strict';\r\n \r\n /* connecting cleanCSS,\r\n * if we can't find it -\r\n * return false\r\n */\r\n var cleanCSS;\r\n try{\r\n cleanCSS = require('clean-css');\r\n }catch(error){\r\n console.log('can\\'n load clean-css \\n' +\r\n 'to use css-minification you need to install clean-css \\n' +\r\n 'npm install clean-css\\n' +\r\n 'https://github.com/GoalSmashers/clean-css');\r\n return false;\r\n }\r\n \r\n if(typeof pCSSFiles_a === \"string\")\r\n pCSSFiles_a=[pCSSFiles_a];\r\n /* Varible contains information\r\n * about readed css file\r\n */\r\n var lCSSFiles_doneCount=0;\r\n \r\n var lAllStyle='';\r\n \r\n var dataReaded_f=function(pFileName, pData){\r\n console.log('file ' + pFileName + ' readed'); \r\n /*********************************/\r\n /* сжимаем код через clean-css */\r\n var clean_css=function(pData){\r\n /* Сохраняем весь стиль в одну переменную*/ \r\n return cleanCSS.process(pData);\r\n };\r\n /*********************************/\r\n var final_code=clean_css(pData);\r\n \r\n lAllStyle+=final_code;\r\n \r\n var minFileName=pFileName.replace('.css','.min.css'); \r\n \r\n ++lCSSFiles_doneCount;\r\n \r\n /* if all files writed we\r\n * save all minimized css \r\n * to one file all.min.css\r\n */ \r\n if(pCSSFiles_a.length === lCSSFiles_doneCount){\r\n /* если включена конвертация картинок в base64\r\n * вызываем её\r\n */\r\n if(pImgConvertToBase64_b)\r\n base64_images(lAllStyle);\r\n else\r\n fs.writeFile(MinFolder + 'all.min.css', lAllStyle, fileWrited(MinFolder + 'all.min.css'));\r\n }\r\n /* в другом случае - записываем сжатый css файл*/\r\n else{\r\n minFileName = MinFolder + path.basename(minFileName); \r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n }\r\n };\r\n \r\n /* moving thru all elements of css files array */\r\n for(var i=0;pCSSFiles_a[i];i++){\r\n console.log('reading file ' + pCSSFiles_a[i]+'...');\r\n fs.readFile(pCSSFiles_a[i],fileReaded(pCSSFiles_a[i],dataReaded_f));\r\n }\r\n \r\n return true;\r\n};\r\n\r\n/* функция сжимает html файлы\r\n * и сохраняет их с именем .min.html\r\n * @pHTMLFiles_a - массим имен html\r\n * файлов, или строка если имя одно\r\n */\r\nexports.html=function(pHTMLFiles_a){\r\n 'use strict';\r\n \r\n /* connecting cleanCSS,\r\n * if we can't find it -\r\n * return false\r\n */\r\n var htmlMinifier;\r\n try{\r\n htmlMinifier = require('html-minifier');\r\n }catch(error){\r\n console.log('can\\'n load html-minifier \\n' +\r\n 'to use html-minification you need to install html-minifier\\n' +\r\n 'npm install html-minifier\\n' +\r\n 'https://github.com/kangax/html-minifier');\r\n return false;\r\n }\r\n \r\n /* if html file names is not array\r\n * making it array\r\n */\r\n if (typeof pHTMLFiles_a === 'string' || \r\n !pHTMLFiles_a[0])\r\n pHTMLFiles_a=[pHTMLFiles_a];\r\n var dataReaded_f=function(pFileName, pData){\r\n console.log('file ' + pFileName + ' readed'); \r\n /*********************************/\r\n /* сжимаем код через clean-css */\r\n var html_minify=function(pData){\r\n /* Сохраняем весь стиль в одну переменную*/ \r\n \r\n var lOptions={\r\n removeComments: true,\r\n removeCommentsFromCDATA: true,\r\n removeCDATASectionsFromCDATA: true,\r\n collapseWhitespace: true,\r\n collapseBooleanAttributes: true,\r\n removeAttributeQuotes: true,\r\n removeRedundantAttributes: true,\r\n useShortDoctype: true,\r\n removeEmptyAttributes: true,\r\n /* оставляем, поскольку у нас\r\n * в элемент fm генерируеться\r\n * таблица файлов\r\n */\r\n removeEmptyElements: false,\r\n removeOptionalTags: true,\r\n removeScriptTypeAttributes: true,\r\n removeStyleLinkTypeAttributes: true\r\n };\r\n \r\n \r\n return htmlMinifier.minify(pData,lOptions);\r\n };\r\n /*********************************/\r\n var final_code=html_minify(pData);\r\n \r\n var minFileName=pFileName.replace('.html','.min.html');\r\n \r\n /* adding Min folder to file path */\r\n minFileName = MinFolder + minFileName;\r\n /* записываем сжатый html файл*/\r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n };\r\n \r\n /* moving thru all elements of html files array */\r\n for(var i=0;pHTMLFiles_a[i];i++){\r\n console.log('reading file ' + pHTMLFiles_a[i]+'...');\r\n fs.readFile(pHTMLFiles_a[i],fileReaded(pHTMLFiles_a[i],dataReaded_f));\r\n }\r\n \r\n return true;\r\n};\r\n\r\n/* функция переводит картинки в base64 и записывает в css-файл*/\r\nfunction base64_images(pFileContent_s){\r\n 'use strict'; \r\n var b64img;\r\n try{\r\n b64img = require('css-b64-images');\r\n }catch(error){\r\n console.log('can\\'n load clean-css \\n' +\r\n 'to use images to base64 convertation you need to install css-base64-images \\n' +\r\n 'npm install -g css-b64-images\\n' +\r\n 'https://github.com/Filirom1/css-base64-images');\r\n return false;\r\n }\r\n b64img.fromString(pFileContent_s, '.','', function(err, css){\r\n console.log('images converted to base64 and saved in css file');\r\n fs.writeFile(MinFolder + 'all.min.css', css, fileWrited(MinFolder + 'all.min.css'));\r\n });\r\n}\r\n\r\n/* Функция создаёт асинхроную версию \r\n * для чтения файла\r\n * @pFileName - имя считываемого файла\r\n */\r\nfunction fileReaded(pFileName,pCompressFunc){\r\n \"use strict\";\r\n return function(pError,pData){\r\n /* функция в которую мы попадаем,\r\n * если данные считались\r\n *\r\n * если ошибка - показываем её\r\n * иначе если переданная функция -\r\n * функция запускаем её\r\n */ \r\n if(!pError)\r\n if (pCompressFunc && typeof pCompressFunc===\"function\")\r\n pCompressFunc(pFileName,pData.toString());\r\n else console.log(pError);\r\n };\r\n}\r\n\r\n/*\r\n * Функция вызываеться после записи файла\r\n * и выводит ошибку или сообщает,\r\n * что файл успешно записан\r\n */\r\nfunction fileWrited(pFileName){\r\n \"use strict\";\r\n return function(error){\r\n console.log(error?error:('file '+pFileName+' writed...'));\r\n };\r\n}\r\n\r\n/*\r\n * Function reads hash table of files\r\n * checks is file changed or not\r\n * and return result.\r\n * @pFileName - name of file\r\n * @pFileData - data of file\r\n * result: boolean\r\n */\r\nfunction isFileChanged(pFileName, pFileData){\r\n var lReadedHash;\r\n \r\n if(!Hashes)\r\n try {\r\n /* try to read file with hashes */\r\n Hashes = require('hashes.json'); \r\n for(var lFileName in Hashes)\r\n /* if founded row with file name\r\n * saving hash\r\n */\r\n if (lFileName === pFileName) {\r\n lReadedHash = Hashes[pFileName];\r\n break;\r\n }\r\n }catch(pError) {\r\n Hashes={};\r\n }\r\n /* create md5 hash of file data */ \r\n var lFileHash = crypto.createHash('sha1');\r\n lFileHash.update(pFileData);\r\n lFileHash = lFileHash.digest('hex');\r\n \r\n console.log(pFileName + ': ' + lFileHash);\r\n \r\n if(lReadedHash && \r\n lReadedHash === lFileHash){\r\n /* file did not change */\r\n return false;\r\n }else{\r\n Hashes[pFileName] = lFileHash;\r\n console.log(Hashes);\r\n \r\n return true;\r\n } \r\n}"]],"start1":0,"start2":0,"length1":0,"length2":14953}]],"length":14953} +{"contributors":[],"silentsave":false,"ts":1342251649823,"patch":[[{"diffs":[[0," {};\r\n\r\n"],[1,"\r\n/* function minificate js,css and html files\r\n * @pFiles_a - array of js, css and html file names or string, if name\r\n * single, or object if postProcessing neaded\r\n * {'client.js': function(pFinalCode){} }\r\n * or convertion images to base64 neaded\r\n * {'style.css': true}\r\n * or {'style.css':{minimize: true, func: function(){}}\r\n * @pCache_b - if true files do not writes on disk, just saves\r\n * in Minify Cache\r\n */\r\nexports.optimize = function(pFiles_a, pCache_b){\r\n 'use strict';\r\n \r\n /* if passed string, or object \r\n * putting it to array\r\n */\r\n if (typeof pFiles_a === 'string' ||\r\n !pFiles_a[0])\r\n pFiles_a=[pFiles_a]; \r\n \r\n \r\n var lName;\r\n \r\n var dataReaded_f=function(pFileName, pData){\r\n \r\n }\r\n /* moving thru all elements of js files array */\r\n for(var i=0; pFiles_a[i]; i++){\r\n /* if postProcessing function exist\r\n * getting file name and passet next\r\n */\r\n var lPostProcessing_o = pJSFiles_a[i]; \r\n if(typeof lPostProcessing_o === 'object'){\r\n for(lName in lPostProcessing_o){\r\n }\r\n }else lName = pFiles_a[i];\r\n console.log('reading file ' + lName + '...'); \r\n \r\n fs.readFile(lName, fileReaded(pFiles_a[i], dataReaded_f));\r\n }\r\n /* saving the name of last readed file for hash saving function */\r\n lLastFileName = lName;\r\n \r\n return true;\r\n}\r\n\r\n\r\n"],[0,"/* funct"]],"start1":1229,"start2":1229,"length1":16,"length2":1687}]],"length":16624,"saved":false} +{"ts":1342251816134,"patch":[[{"diffs":[[0,"Processing_o = p"],[-1,"JS"],[0,""],[1,""],[0,"Files_a[i]; "]],"start1":2441,"start2":2441,"length1":34,"length2":32},{"diffs":[[0," \r\n "],[1," \r\n /* if it's last file send true */"],[0,"\r\n fs.rea"]],"start1":2682,"start2":2682,"length1":32,"length2":83},{"diffs":[[0,".readFile(lName,"],[1,"\r\n "],[0," fileReaded(pFil"]],"start1":2761,"start2":2761,"length1":32,"length2":45},{"diffs":[[0,"pFiles_a[i],"],[-1," dataReaded_f"],[1,"\r\n dataReaded_f,\r\n (i===pFiles_a.length)?true:false"],[0,"));\r\n }\r\n"]],"start1":2802,"start2":2802,"length1":37,"length2":105},{"diffs":[[0,"*/\r\n"],[-1," lLastFileName = lName;\r\n"],[0," "]],"start1":2975,"start2":2975,"length1":36,"length2":8}]],"length":16726,"saved":false} +{"ts":1342251974471,"patch":[[{"diffs":[[0," \r\n "],[-1," var dataReaded_f=function(pFileName, pData){\r\n "],[1,"var dataReaded_f=function(pFileName, pData){ \r\n /*\r\n * if postProcessing function exist\r\n * getting it from pFileName object\r\n */\r\n var lMoreProcessing_f;\r\n if(typeof pFileName === 'object'){\r\n var lName;\r\n for(lName in pFileName){\r\n break;\r\n }\r\n lMoreProcessing_f = pFileName[lName]; \r\n pFileName = lName;\r\n }\r\n console.log('file ' + pFileName + ' readed');\r\n \r\n if (!isFileChanged(pFileName, pData)) {\r\n console.log('file: ' + pFileName + ' do not changed...');\r\n return;\r\n }\r\n \r\n /*********************************/\r\n /* сжимаем код через uglify-js */\r\n var uglify_js=function(pDdata){\r\n \r\n /* подключаем модуль uglify-js\r\n * если его нет - дальнейшая \r\n * работа функции не имеет смысла\r\n */\r\n var jsp;\r\n var pro;\r\n try{\r\n jsp = require(\"uglify-js\").parser;\r\n pro = require(\"uglify-js\").uglify;\r\n }catch(error){\r\n console.log('can\\'n load uglify-js\\n' +\r\n 'to use js-minification you need to install uglify-js\\n' +\r\n 'npm install uglify-js\\n' +\r\n 'https://github.com/mishoo/UglifyJS');\r\n return false;\r\n }\r\n \r\n var orig_code = pDdata.toString();\r\n var ast = jsp.parse(orig_code); // parse code and get the initial AST\r\n ast = pro.ast_mangle(ast); // get a new AST with mangled names\r\n ast = pro.ast_squeeze(ast); // get an AST with compression optimizations\r\n var result_code = pro.gen_code(ast); // compressed code here\r\n return result_code;\r\n };\r\n /*********************************/\r\n var final_code=uglify_js(pData);\r\n \r\n var minFileName=pFileName.replace('.js','.min.js');\r\n \r\n /* если мы сжимаем client.js -\r\n * меняем строку cloudfunc.js на\r\n * cloudfunc.min.js и выводим сообщение\r\n *\r\n * меняем строку keyBinding.js на\r\n * keyBinding.min.js\r\n * если другой файл - ничего не деалем\r\n */ \r\n \r\n /* if lMoreProcessing_f seeted up \r\n * and function associated with\r\n * current file name exists -\r\n * run it\r\n */\r\n if(lMoreProcessing_f && \r\n typeof lMoreProcessing_f === \"function\"){\r\n final_code = lMoreProcessing_f(final_code);"],[0,"\r\n "],[1," "],[-1,"}"],[1," } \r\n \r\n minFileName = path.basename(minFileName);\r\n \r\n /* записываем сжатый js-скрипт\r\n * в кэш если установлен pCache_b\r\n * или на диск, если не установлен\r\n */\r\n if(pCache_b){\r\n exports.Cache[minFileName] = final_code;\r\n console.log('file ' + minFileName + ' saved to cache...');\r\n }\r\n else{\r\n /* minimized file will be in min file\r\n * if it's possible if not -\r\n * in root\r\n */\r\n minFileName = MinFolder + minFileName;\r\n \r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n }\r\n };"],[0,"\r\n "]],"start1":2162,"start2":2162,"length1":69,"length2":3477}]],"length":20134,"saved":false} +{"ts":1342252025137,"patch":[[{"diffs":[[0," var uglify"],[-1,"_js"],[1,"JS"],[0,"=function(pDdata"]],"start1":2935,"start2":2935,"length1":35,"length2":34},{"diffs":[[0,"inal_code=uglify"],[-1,"_js"],[1,"JS"],[0,"(pData);\r\n "]],"start1":4178,"start2":4178,"length1":35,"length2":34}]],"length":20132,"saved":false} +{"ts":1342252037794,"patch":[[{"diffs":[[0," "],[-1,"\r\n"],[0," "],[-1,"/*********************************/\r\n /* сжимаем код через uglify-js */\r\n var uglifyJS=function(pDdata){\r\n \r\n /* подключаем модуль uglify-js\r\n * если его нет - дальнейшая \r\n * работа функции не имеет смысла\r\n */\r\n var jsp;\r\n var pro;\r\n try{\r\n jsp = require(\"uglify-js\").parser;\r\n pro = require(\"uglify-js\").uglify;\r\n }catch(error){\r\n console.log('can\\'n load uglify-js\\n' +\r\n 'to use js-minification you need to install uglify-js\\n' +\r\n 'npm install uglify-js\\n' +\r\n 'https://github.com/mishoo/UglifyJS');\r\n return false;\r\n }\r\n \r\n var orig_code = pDdata.toString();\r\n var ast = jsp.parse(orig_code); // parse code and get the initial AST\r\n ast = pro.ast_mangle(ast); // get a new AST with mangled names\r\n ast = pro.ast_squeeze(ast); // get an AST with compression optimizations\r\n var result_code = pro.gen_code(ast); // compressed code here\r\n return result_code;\r\n };\r\n /*********************************/"],[0,"\r\n "]],"start1":2839,"start2":2839,"length1":1328,"length2":16}]],"length":18820,"saved":false} +{"ts":1342252062420,"patch":[[{"diffs":[[0," = {};\r\n\r\n"],[1,"/*********************************/\r\n/* сжимаем код через uglify-js */\r\nvar uglifyJS=function(pDdata){\r\n \r\n /* подключаем модуль uglify-js\r\n * если его нет - дальнейшая \r\n * работа функции не имеет смысла\r\n */\r\n var jsp;\r\n var pro;\r\n try{\r\n jsp = require(\"uglify-js\").parser;\r\n pro = require(\"uglify-js\").uglify;\r\n }catch(error){\r\n console.log('can\\'n load uglify-js\\n' +\r\n 'to use js-minification you need to install uglify-js\\n' +\r\n 'npm install uglify-js\\n' +\r\n 'https://github.com/mishoo/UglifyJS');\r\n return false;\r\n }\r\n \r\n var orig_code = pDdata.toString();\r\n var ast = jsp.parse(orig_code); // parse code and get the initial AST\r\n ast = pro.ast_mangle(ast); // get a new AST with mangled names\r\n ast = pro.ast_squeeze(ast); // get an AST with compression optimizations\r\n var result_code = pro.gen_code(ast); // compressed code here\r\n return result_code;\r\n};\r\n/*********************************/\r\n\r\n\r\n"],[0,"\r\n/* functio"]],"start1":1225,"start2":1225,"length1":24,"length2":1116}]],"length":19912,"saved":false} +{"ts":1342252069874,"patch":[[{"diffs":[[0,"-js */\r\n"],[-1,"var"],[1,"function"],[0," uglifyJ"]],"start1":1301,"start2":1301,"length1":19,"length2":24},{"diffs":[[0,"uglifyJS"],[-1,"=function"],[0,"(pDdata)"]],"start1":1318,"start2":1318,"length1":25,"length2":16}]],"length":19908,"saved":false} +{"ts":1342252074049,"patch":[[{"diffs":[[0,"code;\r\n}"],[-1,";"],[0,"\r\n/*****"]],"start1":2273,"start2":2273,"length1":17,"length2":16}]],"length":19907,"saved":false} +{"ts":1342252132448,"patch":[[{"diffs":[[0,"s');"],[-1,"\r\n \r\n /* если мы сжимаем client.js -\r\n * меняем строку cloudfunc.js на\r\n * cloudfunc.min.js и выводим сообщение\r\n *\r\n * меняем строку keyBinding.js на\r\n * keyBinding.min.js\r\n * если другой файл - ничего не деалем\r\n */ "],[0," "]],"start1":4046,"start2":4046,"length1":300,"length2":8}]],"length":19615,"saved":false} +{"ts":1342252223261,"patch":[[{"diffs":[[0,"***/\r\n\r\n"],[1,"/*\r\n * Функция ищет в имени файла расширение\r\n * и если находит возвращает true\r\n * @pName - получает имя файла\r\n * @pExt - расширение\r\n */\r\nfunction checkExtension(pName,pExt)\r\n{\r\n /* если длина имени больше\r\n * длинны расширения - \r\n * имеет смысл продолжать\r\n */\r\n if(pName.length>pExt.length){\r\n var lLength=pName.length; /* длина имени*/\r\n var lExtNum=pName.lastIndexOf(pExt);/* последнее вхождение расширения*/\r\n var lExtSub=lLength-lExtNum; /* длина расширения*/\r\n /* если pExt - расширение pName */\r\n if(lExtSub===pExt.length)\r\n return true;\r\n else\r\n return false;\r\n }\r\n else return false;\r\n}\r\n"],[0,"\r\n\r\n/* f"]],"start1":2314,"start2":2314,"length1":16,"length2":723}]],"length":20322,"saved":false} +{"ts":1342252291404,"patch":[[{"diffs":[[0,"*/\r\n"],[-1,"function uglifyJS"],[1,"Minify.uglifyJS= function"],[0,"(pDd"]],"start1":1305,"start2":1305,"length1":25,"length2":33},{"diffs":[[0,"е\r\n */\r\n"],[-1,"function "],[1,"Minify._"],[0,"checkExt"]],"start1":2463,"start2":2463,"length1":25,"length2":24},{"diffs":[[0,"xtension"],[1,"=function"],[0,"(pName,p"]],"start1":2485,"start2":2485,"length1":16,"length2":25}]],"length":20338,"saved":false} +{"ts":1342252296626,"patch":[[{"diffs":[[0,"\nMinify."],[1,"_"],[0,"uglifyJS"]],"start1":1308,"start2":1308,"length1":16,"length2":17}]],"length":20339,"saved":false} +{"ts":1342252305307,"patch":[[{"diffs":[[0,"й\r\n */\r\n"],[1,"var Minify = {};"],[0,"\r\nconsol"]],"start1":135,"start2":135,"length1":16,"length2":32}]],"length":20355,"saved":false} +{"ts":1342252329072,"patch":[[{"diffs":[[0," final_code="],[1,"Minify."],[0,"uglifyJS(pDa"]],"start1":4691,"start2":4691,"length1":24,"length2":31}]],"length":20362,"saved":false} +{"ts":1342252369290,"patch":[[{"diffs":[[0," }\r\n "],[1,"\r\n if(Minify._checkExtension()){\r\n }\r\n"],[0," \r\n "]],"start1":4654,"start2":4654,"length1":32,"length2":84}]],"length":20414,"saved":false} +{"ts":1342252384868,"patch":[[{"diffs":[[0,"tension("],[1,"pFileName,'js'"],[0,")){\r\n "]],"start1":4698,"start2":4698,"length1":16,"length2":30}]],"length":20428,"saved":false} +{"ts":1342252444513,"patch":[[{"diffs":[[0," }\r\n \r\n"],[1," var final_code;\r\n var minFileName;\r\n"],[0," if(Minif"]],"start1":4656,"start2":4656,"length1":32,"length2":83},{"diffs":[[0," "],[-1,"}\r\n \r\n var"],[1," "],[0," fin"]],"start1":4780,"start2":4780,"length1":32,"length2":11},{"diffs":[[0,"uglifyJS(pData);"],[-1,"\r\n"],[0," \r\n "]],"start1":4806,"start2":4806,"length1":34,"length2":32},{"diffs":[[0," \r\n "],[1," "],[-1,"var"],[0," minFileName=pFi"]],"start1":4824,"start2":4824,"length1":35,"length2":35},{"diffs":[[0,"in.js'); "],[1," \r\n } "],[0,"\r\n \r\n "]],"start1":4883,"start2":4883,"length1":32,"length2":54}]],"length":20478,"saved":false} +{"ts":1342252486803,"patch":[[{"diffs":[[0," }"],[1,"else\r\n"],[0," "],[1," return;"],[0,"\r\n "]],"start1":4905,"start2":4905,"length1":24,"length2":41}]],"length":20495,"saved":false} +{"ts":1342252502218,"patch":[[{"diffs":[[0,"r minFileName;\r\n"],[1," \r\n /* if it's js file - getting optimized version */\r\n"],[0," if(Minif"]],"start1":4707,"start2":4707,"length1":32,"length2":101}]],"length":20564,"saved":false} +{"ts":1342252566037,"patch":[[{"diffs":[[0,"=Minify."],[1,"_"],[0,"uglifyJS"]],"start1":4867,"start2":4867,"length1":16,"length2":17}]],"length":20565,"saved":false} +{"ts":1342252609393,"patch":[[{"diffs":[[0,"\r\n\r\n"],[-1,"\r\n/* function which minificate js-files\r\n * @pJSFiles_a - varible, wich contain array\r\n * of js file names or string, if name\r\n * single, or object if postProcessing neaded\r\n * { Name:'1.js', Func: function(pFinalCode){} }\r\n * @pCache_b - if true files do not writes on disk, just saves\r\n * in Minify Cache\r\n */\r\nexports.jsScripts=function jsScripts(pJSFiles_a, pCache_b){\r\n 'use strict';\r\n /* подключаем модуль uglify-js\r\n * если его нет - дальнейшая \r\n * работа функции не имеет смысла\r\n */\r\n try{\r\n var jsp = require(\"uglify-js\").parser;\r\n var pro = require(\"uglify-js\").uglify;\r\n }catch(error){\r\n console.log('can\\'n load uglify-js\\n' +\r\n 'to use js-minification you need to install uglify-js\\n' +\r\n 'npm install uglify-js\\n' +\r\n 'https://github.com/mishoo/UglifyJS');\r\n return false;\r\n }\r\n var lLastFileName;\r\n \r\n /* if passed string, or object \r\n * putting it to array\r\n */\r\n if (typeof pJSFiles_a === 'string' ||\r\n !pJSFiles_a[0])\r\n pJSFiles_a=[pJSFiles_a]; \r\n \r\n var dataReaded_f=function(pFileName, pData){ \r\n /*\r\n * if postProcessing function exist\r\n * getting it from pFileName object\r\n */\r\n var lMoreProcessing_f;\r\n if(typeof pFileName === 'object'){\r\n var lName;\r\n for(lName in pFileName){\r\n break;\r\n }\r\n lMoreProcessing_f = pFileName[lName]; \r\n pFileName = lName;\r\n }\r\n console.log('file ' + pFileName + ' readed');\r\n \r\n if (!isFileChanged(pFileName, pData)) {\r\n console.log('file: ' + pFileName + ' do not changed...');\r\n return;\r\n }\r\n \r\n /*********************************/\r\n /* сжимаем код через uglify-js */\r\n var uglify_js=function(pDdata){\r\n var orig_code = pDdata.toString();\r\n var ast = jsp.parse(orig_code); // parse code and get the initial AST\r\n ast = pro.ast_mangle(ast); // get a new AST with mangled names\r\n ast = pro.ast_squeeze(ast); // get an AST with compression optimizations\r\n var result_code = pro.gen_code(ast); // compressed code here\r\n return result_code;\r\n };\r\n /*********************************/\r\n var final_code=uglify_js(pData);\r\n \r\n var minFileName=pFileName.replace('.js','.min.js');\r\n \r\n /* если мы сжимаем client.js -\r\n * меняем строку cloudfunc.js на\r\n * cloudfunc.min.js и выводим сообщение\r\n *\r\n * меняем строку keyBinding.js на\r\n * keyBinding.min.js\r\n * если другой файл - ничего не деалем\r\n */ \r\n \r\n /* if lMoreProcessing_f seeted up \r\n * and function associated with\r\n * current file name exists -\r\n * run it\r\n */\r\n if(lMoreProcessing_f && \r\n typeof lMoreProcessing_f === \"function\"){\r\n final_code = lMoreProcessing_f(final_code);\r\n } \r\n \r\n minFileName = path.basename(minFileName);\r\n \r\n /* записываем сжатый js-скрипт\r\n * в кэш если установлен pCache_b\r\n * или на диск, если не установлен\r\n */\r\n if(pCache_b){\r\n exports.Cache[minFileName] = final_code;\r\n console.log('file ' + minFileName + ' saved to cache...');\r\n }\r\n else{\r\n /* minimized file will be in min file\r\n * if it's possible if not -\r\n * in root\r\n */\r\n minFileName = MinFolder + minFileName;\r\n \r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n }\r\n };\r\n \r\n var lName;\r\n /* moving thru all elements of js files array */\r\n for(var i=0; pJSFiles_a[i]; i++){\r\n /* if postProcessing function exist\r\n * getting file name and passet next\r\n */\r\n var lMoreProcessing_o = pJSFiles_a[i]; \r\n if(typeof lMoreProcessing_o === 'object'){\r\n for(lName in lMoreProcessing_o){\r\n }\r\n }else lName = pJSFiles_a[i];\r\n console.log('reading file ' + lName + '...'); \r\n \r\n fs.readFile(lName, fileReaded(pJSFiles_a[i], dataReaded_f));\r\n }\r\n /* saving the name of last readed file for hash saving function */\r\n lLastFileName = lName;\r\n \r\n return true;\r\n};\r\n\r\n"],[0,"/* ф"]],"start1":6843,"start2":6843,"length1":4766,"length2":8}]],"length":15807,"saved":false} +{"ts":1342252708967,"patch":[[{"diffs":[[0,"*******/\r\n\r\n"],[1,"/*********************************/\r\n/* сжимаем код через clean-css */\r\nMinify._clean_css=function(pData){\r\n 'use strict';\r\n /* connecting cleanCSS,\r\n * if we can't find it -\r\n * return false\r\n */\r\n var cleanCSS;\r\n try{\r\n cleanCSS = require('clean-css');\r\n }catch(error){\r\n console.log('can\\'n load clean-css \\n' +\r\n 'to use css-minification you need to install clean-css \\n' +\r\n 'npm install clean-css\\n' +\r\n 'https://github.com/GoalSmashers/clean-css');\r\n return false;\r\n }\r\n /* Сохраняем весь стиль в одну переменную*/ \r\n return cleanCSS.process(pData);\r\n};\r\n/*********************************/\r\n\r\n\r\n"],[0,"/*\r\n * Функц"]],"start1":2335,"start2":2335,"length1":24,"length2":806},{"diffs":[[0," "],[-1,"'use strict';\r\n \r\n /* connecting cleanCSS,\r\n * if we can't find it -\r\n * return false\r\n */\r\n var cleanCSS;\r\n try{\r\n cleanCSS = require('clean-css');\r\n }catch(error){\r\n console.log('can\\'n load clean-css \\n' +\r\n 'to use css-minification you need to install clean-css \\n' +\r\n 'npm install clean-css\\n' +\r\n 'https://github.com/GoalSmashers/clean-css');\r\n return false;\r\n }\r\n"],[0," "]],"start1":8082,"start2":8082,"length1":533,"length2":8},{"diffs":[[0," "],[-1,"/*********************************/\r\n /* сжимаем код через clean-css */\r\n var clean_css=function(pData){\r\n /* Сохраняем весь стиль в одну переменную*/ \r\n return cleanCSS.process(pData);\r\n };\r\n /*********************************/"],[0,"\r\n "]],"start1":8445,"start2":8445,"length1":297,"length2":8}]],"length":15775,"saved":false} +{"ts":1342252714178,"patch":[[{"diffs":[[0," \r\n"],[-1," "],[0," return c"]],"start1":3031,"start2":3031,"length1":28,"length2":24}]],"length":15771,"saved":false} +{"ts":1342252725917,"patch":[[{"diffs":[[0,"code;\r\n}"],[1,";"],[0,"\r\n/*****"]],"start1":2298,"start2":2298,"length1":16,"length2":17}]],"length":15772,"saved":false} +{"ts":1342252814984,"patch":[[{"diffs":[[0,"me,'js')){\r\n"],[1," \r\n"],[0," "]],"start1":5612,"start2":5612,"length1":24,"length2":38},{"diffs":[[0,"Data); \r\n"],[-1,""],[0," minF"]],"start1":5679,"start2":5679,"length1":32,"length2":32},{"diffs":[[0,"'); \r\n"],[1," \r\n }else if(Minify._checkExtension(pFileName,'js'){\r\n \r\n var final_code=clean_css(pData);\r\n \r\n lAllStyle+=final_code;\r\n \r\n var minFileName=pFileName.replace('.css','.min.css'); \r\n \r\n ++lCSSFiles_doneCount;\r\n \r\n /* if all files writed we\r\n * save all minimized css \r\n * to one file all.min.css\r\n */ \r\n if(pCSSFiles_a.length === lCSSFiles_doneCount){\r\n /* если включена конвертация картинок в base64\r\n * вызываем её\r\n */\r\n if(pImgConvertToBase64_b)\r\n base64_images(lAllStyle);\r\n else\r\n fs.writeFile(MinFolder + 'all.min.css', lAllStyle, fileWrited(MinFolder + 'all.min.css'));\r\n }\r\n /* в другом случае - записываем сжатый css файл*/\r\n else{\r\n minFileName = MinFolder + path.basename(minFileName); \r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n }\r\n \r\n"],[0," }else\r\n "]],"start1":5751,"start2":5751,"length1":32,"length2":1107},{"diffs":[[0," }"],[-1,"else"],[0,"\r\n "]],"start1":6843,"start2":6843,"length1":20,"length2":16},{"diffs":[[0," "],[-1,"var final_code=clean_css(pData);\r\n \r\n lAllStyle+=final_code;\r\n \r\n var minFileName=pFileName.replace('.css','.min.css'); \r\n \r\n ++lCSSFiles_doneCount;\r\n \r\n /* if all files writed we\r\n * save all minimized css \r\n * to one file all.min.css\r\n */ \r\n if(pCSSFiles_a.length === lCSSFiles_doneCount){\r\n /* если включена конвертация картинок в base64\r\n * вызываем её\r\n */\r\n if(pImgConvertToBase64_b)\r\n base64_images(lAllStyle);\r\n else\r\n fs.writeFile(MinFolder + 'all.min.css', lAllStyle, fileWrited(MinFolder + 'all.min.css'));\r\n }\r\n /* в другом случае - записываем сжатый css файл*/\r\n else{\r\n minFileName = MinFolder + path.basename(minFileName); \r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n }"],[0,"\r\n "]],"start1":9537,"start2":9537,"length1":969,"length2":8}]],"length":15896,"saved":false} +{"ts":1342253047780,"patch":[[{"diffs":[[0,"me,'js')){\r\n"],[-1," \r\n"],[0," "]],"start1":5612,"start2":5612,"length1":38,"length2":24},{"diffs":[[0,"Data); \r\n"],[1,""],[0," minF"]],"start1":5665,"start2":5665,"length1":32,"length2":32},{"diffs":[[0," \r\n"],[-1," \r\n }else if(Minify._checkExtension(pFileName,'js'){\r\n \r\n var final_code=clean_css(pData);\r\n \r\n lAllStyle+=final_code;\r\n \r\n var minFileName=pFileName.replace('.css','.min.css'); \r\n \r\n ++lCSSFiles_doneCount;\r\n \r\n /* if all files writed we\r\n * save all minimized css \r\n * to one file all.min.css\r\n */ \r\n if(pCSSFiles_a.length === lCSSFiles_doneCount){\r\n /* если включена конвертация картинок в base64\r\n * вызываем её\r\n */\r\n if(pImgConvertToBase64_b)\r\n base64_images(lAllStyle);\r\n else\r\n fs.writeFile(MinFolder + 'all.min.css', lAllStyle, fileWrited(MinFolder + 'all.min.css'));\r\n }\r\n /* в другом случае - записываем сжатый css файл*/\r\n else{\r\n minFileName = MinFolder + path.basename(minFileName); \r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n }\r\n \r\n"],[0," "]],"start1":5749,"start2":5749,"length1":1083,"length2":8},{"diffs":[[0," \r\n }"],[1,"else"],[0,"\r\n re"]],"start1":5746,"start2":5746,"length1":32,"length2":36},{"diffs":[[0," \r\n "],[1,"var final_code=Minify._clean_css(pData);\r\n \r\n lAllStyle+=final_code;\r\n \r\n var minFileName=pFileName.replace('.css','.min.css'); \r\n \r\n ++lCSSFiles_doneCount;\r\n \r\n /* if all files writed we\r\n * save all minimized css \r\n * to one file all.min.css\r\n */ \r\n if(pCSSFiles_a.length === lCSSFiles_doneCount){\r\n /* если включена конвертация картинок в base64\r\n * вызываем её\r\n */\r\n if(pImgConvertToBase64_b)\r\n base64_images(lAllStyle);\r\n else\r\n fs.writeFile(MinFolder + 'all.min.css', lAllStyle, fileWrited(MinFolder + 'all.min.css'));\r\n }\r\n /* в другом случае - записываем сжатый css файл*/\r\n else{\r\n minFileName = MinFolder + path.basename(minFileName); \r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n }"],[0,"\r\n };\r\n "]],"start1":8444,"start2":8444,"length1":24,"length2":993}]],"length":15780,"saved":false} +{"ts":1342253070730,"patch":[[{"diffs":[[0,"y._clean"],[-1,"_css"],[1,"CSS"],[0,"=functio"]],"start1":2425,"start2":2425,"length1":20,"length2":19},{"diffs":[[0,"lean"],[-1,"_css"],[1,"CSS"],[0,"(pDa"]],"start1":8479,"start2":8479,"length1":12,"length2":11}]],"length":15778,"saved":false} +{"ts":1342253141116,"patch":[[{"diffs":[[0,"d');"],[-1," \r\n /*********************************/\r\n /* сжимаем код через clean-css */\r\n var html_minify=function(pData){\r\n /* Сохраняем весь стиль в одну переменную*/ \r\n \r\n var lOptions={\r\n removeComments: true,\r\n removeCommentsFromCDATA: true,\r\n removeCDATASectionsFromCDATA: true,\r\n collapseWhitespace: true,\r\n collapseBooleanAttributes: true,\r\n removeAttributeQuotes: true,\r\n removeRedundantAttributes: true,\r\n useShortDoctype: true,\r\n removeEmptyAttributes: true,\r\n /* оставляем, поскольку у нас\r\n * в элемент fm генерируеться\r\n * таблица файлов\r\n */\r\n removeEmptyElements: false,\r\n removeOptionalTags: true,\r\n removeScriptTypeAttributes: true,\r\n removeStyleLinkTypeAttributes: true\r\n };\r\n \r\n \r\n return htmlMinifier.minify(pData,lOptions);\r\n };\r\n /*********************************/"],[0,"\r\n "]],"start1":10737,"start2":10737,"length1":1288,"length2":8}]],"length":14498,"saved":false} +{"ts":1342253147905,"patch":[[{"diffs":[[0,"ode="],[1,"Minify."],[0,"html"],[-1,"_m"],[1,"M"],[0,"inif"]],"start1":10762,"start2":10762,"length1":14,"length2":20}]],"length":14504,"saved":false} +{"ts":1342253184583,"patch":[[{"diffs":[[0,"};\r\n"],[-1,"/*********************************/\r\n\r\n/*********************************/"],[0,""],[1,""],[0,"\r\n/*"]],"start1":2305,"start2":2305,"length1":82,"length2":8},{"diffs":[[0,"rocess(pData"],[-1,""],[0,""],[1,");\r\n};\r\n\r\n/* сжимаем код через htmlMinify */\r\nvar html_minify=function(pData){\r\n /* Сохраняем весь стиль в одну переменную*/ \r\n \r\n var lOptions={\r\n removeComments: true,\r\n removeCommentsFromCDATA: true,\r\n removeCDATASectionsFromCDATA: true,\r\n collapseWhitespace: true,\r\n collapseBooleanAttributes: true,\r\n removeAttributeQuotes: true,\r\n removeRedundantAttributes: true,\r\n useShortDoctype: true,\r\n removeEmptyAttributes: true,\r\n /* оставляем, поскольку у нас\r\n * в элемент fm генерируеться\r\n * таблица файлов\r\n */\r\n removeEmptyElements: false,\r\n removeOptionalTags: true,\r\n removeScriptTypeAttributes: true,\r\n removeStyleLinkTypeAttributes: true\r\n };\r\n \r\n \r\n return htmlMinifier.minify(pData,lOptions"],[0,");\r\n};\r\n/***"]],"start1":2990,"start2":2990,"length1":24,"length2":985}]],"length":15391,"saved":false} +{"ts":1342253199087,"patch":[[{"diffs":[[0,"*/\r\n"],[-1,"var "],[1,"Minify."],[0,"html"],[-1,"_m"],[1,"M"],[0,"inif"]],"start1":3044,"start2":3044,"length1":18,"length2":20}]],"length":15393,"saved":false} +{"ts":1342253253856,"patch":[[{"diffs":[[0," "],[-1,"\r\n /* connecting cleanCSS,\r\n * if we can't find it -\r\n * return false\r\n */\r\n var htmlMinifier;\r\n try{\r\n htmlMinifier = require('html-minifier');\r\n }catch(error){\r\n console.log('can\\'n load html-minifier \\n' +\r\n 'to use html-minification you need to install html-minifier\\n' +\r\n 'npm install html-minifier\\n' +\r\n 'https://github.com/kangax/html-minifier');\r\n return false;\r\n }\r\n"],[0," "]],"start1":10806,"start2":10806,"length1":527,"length2":8}]],"length":14874,"saved":false} +{"ts":1342253279954,"patch":[[{"diffs":[[0,"tion(pData){"],[1," "],[0,"\r\n /* Сох"]],"start1":3070,"start2":3070,"length1":24,"length2":32},{"diffs":[[0," \r\n"],[1," \r\n /* connecting cleanCSS,\r\n * if we can't find it -\r\n * return false\r\n */\r\n var htmlMinifier;\r\n try{\r\n htmlMinifier = require('html-minifier');\r\n }catch(error){\r\n console.log('can\\'n load html-minifier \\n' +\r\n 'to use html-minification you need to install html-minifier\\n' +\r\n 'npm install html-minifier\\n' +\r\n 'https://github.com/kangax/html-minifier');\r\n return false;\r\n }\r\n"],[0," \r\n va"]],"start1":3141,"start2":3141,"length1":24,"length2":548}]],"length":15406,"saved":false} +{"ts":1342253350682,"patch":[[{"diffs":[[0,"eName, pData){\r\n"],[1," \r\n"],[0," console."]],"start1":9771,"start2":9771,"length1":32,"length2":42},{"diffs":[[0," "],[-1,"\r\n"],[0," \r\n "]],"start1":9850,"start2":9850,"length1":34,"length2":32}]],"length":15414,"saved":false} +{"ts":1342253353036,"patch":[[{"diffs":[[0," "],[-1," "],[0,"\r\n "]],"start1":9850,"start2":9850,"length1":32,"length2":16}]],"length":15398,"saved":false} +{"ts":1342253354641,"patch":[[{"diffs":[[0,"FileName, pData)"],[1," "],[0,"{\r\n \r\n "]],"start1":9768,"start2":9768,"length1":32,"length2":33}]],"length":15399,"saved":false} +{"ts":1342253720785,"patch":[[{"diffs":[[0," \r\n"],[1," "],[0," var dat"]],"start1":6183,"start2":6183,"length1":16,"length2":19},{"diffs":[[0,"me,'js')){\r\n"],[1," \r\n"],[0," "]],"start1":7035,"start2":7035,"length1":24,"length2":38},{"diffs":[[0,"'); \r\n"],[1," \r\n } else if (Minify._checkExtension(pFileName,'html')) {\r\n \r\n final_code=Minify.htmlMinify(pData); \r\n minFileName=pFileName.replace('.html','.min.html');\r\n \r\n"],[0," }else\r\n "]],"start1":7174,"start2":7174,"length1":32,"length2":269},{"diffs":[[0,"\r\n\r\n"],[-1,"/* функция сжимает html файлы\r\n * и сохраняет их с именем .min.html\r\n * @pHTMLFiles_a - массим имен html\r\n * файлов, или строка если имя одно\r\n */\r\nexports.html=function(pHTMLFiles_a){\r\n 'use strict';\r\n \r\n /* if html file names is not array\r\n * making it array\r\n */\r\n if (typeof pHTMLFiles_a === 'string' || \r\n !pHTMLFiles_a[0])\r\n pHTMLFiles_a=[pHTMLFiles_a];\r\n var dataReaded_f=function(pFileName, pData){\r\n console.log('file ' + pFileName + ' readed');\r\n var final_code=Minify.htmlMinify(pData);\r\n \r\n var minFileName=pFileName.replace('.html','.min.html');\r\n \r\n /* adding Min folder to file path */\r\n minFileName = MinFolder + minFileName;\r\n /* записываем сжатый html файл*/\r\n fs.writeFile(minFileName, final_code, fileWrited(minFileName));\r\n };\r\n \r\n /* moving thru all elements of html files array */\r\n for(var i=0;pHTMLFiles_a[i];i++){\r\n console.log('reading file ' + pHTMLFiles_a[i]+'...');\r\n fs.readFile(pHTMLFiles_a[i],fileReaded(pHTMLFiles_a[i],dataReaded_f));\r\n }\r\n \r\n return true;\r\n};\r\n"],[0,"\r\n/*"]],"start1":11376,"start2":11376,"length1":1179,"length2":8}]],"length":14482,"saved":false} diff --git a/.c9revisions/routes/index.coffee.c9save b/.c9revisions/routes/index.coffee.c9save new file mode 100644 index 00000000..802d8b23 --- /dev/null +++ b/.c9revisions/routes/index.coffee.c9save @@ -0,0 +1 @@ +{"ts":1341058602385,"silentsave":true,"restoring":false,"patch":[[]],"length":0} diff --git a/.c9revisions/server.js.c9save b/.c9revisions/server.js.c9save new file mode 100644 index 00000000..341eb905 --- /dev/null +++ b/.c9revisions/server.js.c9save @@ -0,0 +1,10 @@ +{"ts":1340783277756,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"\"use strict\";\r\n\r\n/* Обьект содержащий все функции и переменные \r\n * серверной части Cloud Commander'а\r\n */\r\nvar CloudServer={\r\n /* функция, которая генерирует заголовки\r\n * файлов, отправляемые сервером клиенту\r\n */\r\n generateHeaders :function(){},\r\n /* функция высылает\r\n * данные клиенту\r\n */\r\n sendResponse :function(){},\r\n /* Структура содержащая функции,\r\n * и переменные, в которых\r\n * говориться о поддерживаемых\r\n * браузером технологиях\r\n */\r\n BrowserSuport :{},\r\n /* Обьект для работы с кэшем */\r\n Cashe :{},\r\n /* Обьект через который\r\n * выполняеться сжатие\r\n * скриптов и стилей\r\n */\r\n Minify :{},\r\n /* Асоциативный масив обьектов для\r\n * работы с ответами сервера\r\n * высылаемыми на запрос о файле и\r\n * хранащий информацию в виде\r\n * Responces[name]=responce;\r\n */\r\n Responses :{},\r\n \r\n /* ПЕРЕМЕННЫЕ */\r\n /* Поддержка браузером JS*/\r\n NoJS :true, \r\n /* Поддержка gzip-сжатия\r\n * браузером\r\n */\r\n Gzip :undefined,\r\n \r\n /* КОНСТАНТЫ */\r\n /* index.html */\r\n INDEX :'index.html',\r\n /* name of direcotory with libs */\r\n LIBDIR :'./lib',\r\n LIBDIRSERVER :'./lib/server'\r\n};\r\n\r\n/* \r\n * Обьект для работы с кэшем\r\n * аналог клиентского обьекта\r\n * с тем отличием, что в нём\r\n * будут храниться серверные\r\n * данные, такие как файлы\r\n * отдаваемые клиенту\r\n * (файлы проэкта по большому\r\n * счёту, для ускорения\r\n * первичной загрузки)\r\n */\r\nCloudServer.Cache={\r\n _allowed :true, /* приватный переключатель возможности работы с кэшем */\r\n /* данные в которых храняться файлы \r\n * в формате <поле> : <значение>\r\n * _data[name]=pData;\r\n * одному имени соответствуют \r\n * одни данные\r\n */\r\n _data :{},\r\n \r\n /* функция говорит можно ли работать с кэшем */\r\n isAllowed :(function(){\r\n return CloudServer.Cache._allowed;\r\n }),\r\n /* функция устанавливает возможность работать с кэшем */\r\n setAllowed :(function(pAllowed){\r\n CloudServer.Cache._allowed=pAllowed;\r\n }),\r\n /* Если доступен кэш\r\n * сохраняем в него данные\r\n */\r\n set :(function(pName, pData){\r\n if(CloudServer.Cache._allowed && pName && pData){\r\n CloudServer.Cache._data[pName]=pData;\r\n }\r\n }),\r\n /* Если доступен Cache принимаем из него данные*/\r\n get :(function(pName){\r\n if(CloudServer.Cache._allowed && pName){\r\n return CloudServer.Cache._data[pName];\r\n }\r\n else return null;\r\n }),\r\n \r\n /* Функция очищает кэш*/\r\n clear :(function(){\r\n if(CloudServer.Cache._allowed){\r\n CloudServer.Cache._data={};\r\n }\r\n })\r\n};\r\n\r\n/* Обьект для сжатия скриптов и стилей\r\n * по умолчанию - сжимаються\r\n */\r\nCloudServer.Minify={\r\n /* приватный переключатель минимизации */\r\n _allowed :{css:true,js:true,html:true, img: true},\r\n \r\n /* функция разрешает или \r\n * запрещает минимизировать\r\n * css/js/html\r\n * @pAllowed: - структура, в которой\r\n * передаються параметры\r\n * минификации, вида\r\n * {js:true,css:true,html:false; img:true}\r\n * img отвечает за перевод картинок в base64\r\n * и сохранение их в css-файл\r\n */\r\n setAllowed :(function(pAllowed){\r\n if(pAllowed){\r\n this._allowed.css=pAllowed.css; \r\n this._allowed.js=pAllowed.js; \r\n this._allowed.html=pAllowed.html; \r\n this._allowed.img=pAllowed.img; \r\n }\r\n }),\r\n \r\n /*\r\n * Функция минимизирует css/js/html\r\n * если установлены параметры минимизации\r\n */\r\n doit :(function(){\r\n if(this._allowed.css ||\r\n this._allowed.js ||\r\n this._allowed.html){\r\n var lMinify = require(CloudServer.LIBDIRSERVER+'/minify');\r\n\r\n this.done.js=this._allowed.js?lMinify.jsScripts():false;\r\n this.done.html=this._allowed.html?lMinify.html():false;\r\n this.done.css=this._allowed.css?lMinify.cssStyles(this._allowed.img):false;\r\n }\r\n }),\r\n /* свойство показывающее случилась ли ошибка*/\r\n done:{js: false,css: false, html:false}\r\n};\r\n\r\n\r\nvar LeftDir='/';\r\nvar RightDir=LeftDir;\r\n/*\r\n var Path = require('path');\r\n*/ /* модуль для работы с путями*/\r\n\r\nvar Fs = require('fs'); /* модуль для работы с файловой системой*/\r\n\r\nvar Zlib;\r\n/* node v0.4 not contains zlib \r\n */\r\ntry{\r\n Zlib = require('zlib'); /* модуль для сжатия данных gzip-ом*/\r\n}catch(error){\r\n Zlib=undefined;\r\n console.log('to use gzip-commpression' +\r\n 'you should install zlib module\\n' +\r\n 'npm install zlib');\r\n}\r\nvar CloudFunc = require(CloudServer.LIBDIR + \r\n (CloudServer.Minify.done.js?/* если стоит минификация*/\r\n '/cloudfunc.min':/* добавляем сжатый - иначе обычный */\r\n '/cloudfunc')); /* модуль с функциями */\r\n/* конструктор*/\r\nCloudServer.init=(function(){\r\n /* Переменная в которой храниться кэш*/\r\n CloudServer.Cache.setAllowed(true);\r\n /* Change default parameters of\r\n * js/css/html minification\r\n */\r\n CloudServer.Minify.setAllowed({\r\n js:true,\r\n css:true,\r\n html:true,\r\n img:true\r\n });\r\n /* Если нужно минимизируем скрипты */\r\n CloudServer.Minify.doit();\r\n});\r\n\r\n\r\n/* создаём сервер на порту 31337*/\r\nCloudServer.start=function()\r\n{\r\n CloudServer.init();\r\n \r\n var http = require('http'); \r\n http.createServer(CloudServer._controller).listen(process.env.PORT ||\r\n process.env.VCAP_APP_PORT /* cloudfoundry */ ||\r\n 31337,\r\n '0.0.0.0' || '127.0.0.1');\r\n console.log('Cloud Commander server running at http://127.0.0.1:'+\r\n (process.env.PORT===undefined?31337:process.env.PORT));\r\n};\r\n\r\n\r\n/* Функция создаёт заголовки файлов\r\n * в зависимости от расширения файла\r\n * перед отправкой их клиенту\r\n * @pName - имя файла\r\n * @pGzip - данные сжаты gzip'ом\r\n */\r\nCloudServer.generateHeaders = function(pName, pGzip){\r\n var lType='';\r\n /* высылаем заголовок в зависимости от типа файла */\r\n /* если расширение у файла css -\r\n * загружаем стили\r\n */\r\n if(CloudFunc.checkExtension(pName,'css'))\r\n lType='text/css';\r\n /* загружаем js */\r\n else if(CloudFunc.checkExtension(pName,'js'))\r\n lType='text/javascript';\r\n /* загружаем картинки*/\r\n else if(CloudFunc.checkExtension(pName,'png'))\r\n lType='image/png';\r\n /* загружаем json*/\r\n else if(CloudFunc.checkExtension(pName,'json'))\r\n lType='application/json';\r\n else if(CloudFunc.checkExtension(pName,'html'))\r\n lType='text/html'; \r\n else if(CloudFunc.checkExtension(pName,'appcache'))\r\n lType='text/cache-manifest'; \r\n /* если это неизвестный тип файла - \r\n * высылаем его просто как текст\r\n */\r\n else lType='text/plain';\r\n \r\n return {\r\n /* if type of file any, but img - \r\n * then we shoud specify charset \r\n */\r\n 'Content-Type': lType + (lType.indexOf('img')<0?'; charset=UTF-8':''),\r\n 'cache-control': 'max-age='+(31337*21),\r\n 'last-modified': new Date().toString(),\r\n 'content-encoding': pGzip?'gzip':'',\r\n /* https://developers.google.com/speed/docs/best-practices/caching?hl=ru#LeverageProxyCaching */\r\n 'Vary': 'Accept-Encoding'\r\n };\r\n};\r\n\r\n/*\r\n * Главная функция, через которую проихсодит\r\n * взаимодействие, обмен данными с клиентом\r\n * @req - запрос клиента (Request)\r\n * @res - ответ сервера (Response)\r\n */\r\nCloudServer._controller=function(pReq, pRes)\r\n{\r\n /* Читаем содержимое папки,\r\n переданное в url\r\n */\r\n var url = require(\"url\");\r\n var pathname = url.parse(pReq.url).pathname;\r\n console.log('pathname: '+pathname);\r\n \r\n /* получаем поддерживаемые браузером кодировки*/\r\n var lAcceptEncoding = pReq.headers['accept-encoding'];\r\n /* запоминаем поддерживает ли браузер\r\n * gzip-сжатие при каждом обращении к серверу\r\n * и доступен ли нам модуль zlib\r\n */ \r\n if (lAcceptEncoding && \r\n lAcceptEncoding.match(/\\bgzip\\b/) &&\r\n Zlib){\r\n CloudServer.Gzip=true;\r\n }else \r\n CloudServer.Gzip=false;\r\n /* путь в ссылке, который говорит\r\n * что js отключен\r\n */\r\n var lNoJS_s=CloudFunc.NOJS;\r\n var lFS_s=CloudFunc.FS;\r\n \r\n if(pathname!=='/favicon.ico')\r\n { \r\n console.log(\"request for \" + pathname + \" received...\");\r\n var lName;\r\n \r\n /* если в пути нет информации ни о ФС,\r\n * ни об отсутствии js,\r\n * ни о том, что это корневой\r\n * каталог - загружаем файлы проэкта\r\n */\r\n if(pathname.indexOf(lFS_s)<0 &&\r\n pathname.indexOf(lNoJS_s)<0 &&\r\n pathname!=='/'){\r\n /* если имена файлов проекта - загружаем их*/ \r\n /* убираем слеш и читаем файл с текущец директории*/\r\n //lName=Path.basename(pathname);\r\n \r\n /* добавляем текующий каталог к пути */\r\n lName='.'+pathname;\r\n console.log('reading '+lName);\r\n /* сохраняем указатель на responce и имя */\r\n CloudServer.Responses[lName]=pRes;\r\n \r\n /* Берём значение из кэша\r\n * сжатый файл - если gzip-поддерживаеться браузером\r\n * не сжатый - в обратном случае\r\n */\r\n var lFileData=CloudServer.Cache.get(CloudServer.Gzip?(lName+'_gzip'):lName);\r\n\r\n var lReadFileFunc_f=CloudServer.getReadFileFunc(lName);\r\n /* если там что-то есть передаём данные в функцию\r\n * readFile\r\n */\r\n if(lFileData){\r\n console.log('readed from cache');\r\n /* передаём данные с кэша,\r\n * если gzip включен - сжатые\r\n * в обратном случае - несжатые\r\n */\r\n lReadFileFunc_f(undefined,lFileData,true);\r\n }\r\n else Fs.readFile(lName,lReadFileFunc_f);\r\n \r\n }else{/* если мы имеем дело с файловой системой*/\r\n /* если путь не начинаеться с no-js - значит \r\n * js включен\r\n */\r\n /* убираем пометку cloud, без которой c9.io\r\n * не работает поскольку путь из двух слешей\r\n * (/fs/no-js/) - очень короткий, нужно\r\n * длиннее\r\n */\r\n \r\n if(pathname.indexOf(lNoJS_s)!==lFS_s.length && pathname!=='/'){\r\n CloudServer.NoJS=false;\r\n }else pathname=pathname.replace(lNoJS_s,'');\r\n \r\n /* убираем индекс файловой системы */\r\n if(pathname.indexOf(lFS_s)===0){\r\n pathname=pathname.replace(lFS_s,'');\r\n /* если посетитель только зашел на сайт\r\n * no-js будет пустым, как и fs\r\n */ \r\n /* если в пути нету fs - посетитель только зашел на сайт\r\n * загружаем его полностью.\r\n */\r\n }else CloudServer.NoJS=true;\r\n /* если в итоге путь пустой\r\n * делаем его корневым\r\n */ \r\n if(pathname==='')pathname='/';\r\n \r\n RightDir=pathname;\r\n LeftDir=pathname;\r\n \r\n /* если встретиться пробел - \r\n * меня код символа пробела на пробел\r\n */\r\n \r\n LeftDir=CloudFunc.replaceSpaces(LeftDir);\r\n RightDir=CloudFunc.replaceSpaces(RightDir);\r\n \r\n /* Проверяем с папкой ли мы имеем дело */\r\n \r\n /* читаем сновные данные о файле */\r\n var lStat;\r\n try{\r\n lStat=Fs.statSync(LeftDir);\r\n }catch(error){\r\n console.log(error);\r\n CloudServer.Responses[LeftDir]=pRes;\r\n CloudServer.sendResponse('OK',error.toString(),LeftDir);\r\n }\r\n /* если это каталог - \r\n * читаем его содержимое\r\n */\r\n try{ \r\n /* если установлено сжатие\r\n * меняем название html-файла и\r\n * загружаем сжатый html-файл в дальнейшем\r\n */\r\n CloudServer.INDEX=(CloudServer.Minify.done.html?'index.min.html':CloudServer.INDEX);\r\n /*\r\n * сохраним указатель на response\r\n */ \r\n CloudServer.Responses[CloudServer.INDEX]=pRes;\r\n if(lStat.isDirectory()) \r\n Fs.readdir(LeftDir,CloudServer._readDir); \r\n /* отдаём файл */\r\n else if(lStat.isFile()){\r\n CloudServer.Responses[LeftDir]=pRes;\r\n Fs.readFile(LeftDir,CloudServer.getReadFileFunc(LeftDir));\r\n console.log('reading file: '+LeftDir);\r\n }\r\n }catch(error){console.log(error);}\r\n }\r\n }\r\n};\r\n\r\n/* Функция читает ссылку или выводит информацию об ошибке*/\r\nCloudServer._readDir=function (pError, pFiles)\r\n{\r\n if(!pError)\r\n {\r\n /* данные о файлах в формате JSON*/\r\n var lJSON=[];\r\n var lJSONFile={};\r\n /* Если мы не в корне добавляем слеш к будующим ссылкам */ \r\n if(LeftDir!=='/')\r\n {\r\n RightDir+='/';\r\n LeftDir+='/';\r\n }\r\n\r\n pFiles=pFiles.sort();\r\n \r\n lJSON[0]={path:LeftDir,size:'dir'};\r\n var fReturnFalse=function returnFalse(){return false;}; \r\n for(var i=0;i','')\r\n .replace('style.css','all.min.css')\r\n :lIndex;\r\n \r\n lIndex = CloudServer.Minify.done.js?lIndex.replace('client.js','client.min.js'):lIndex;\r\n \r\n lIndex=lIndex.toString().replace('
    ','
    '+lList);\r\n /* меняем title */\r\n lIndex=lIndex.replace('Cloud Commander',\r\n ''+CloudFunc.setTitle()+'');\r\n /* отображаем панель быстрых клавишь */\r\n lList=lIndex;\r\n /* если браузер поддерживает gzip-сжатие*/\r\n lHeader=CloudServer.generateHeaders('text/html',CloudServer.Gzip);\r\n }catch(error){console.log(error);}\r\n }else{\r\n /* в обычном режиме(когда js включен\r\n * высылаем json-структуру файлов\r\n * с соответствующими заголовками\r\n */\r\n lList=JSON.stringify(lJSON);\r\n lHeader=CloudServer.generateHeaders('application/json',CloudServer.Gzip);\r\n }\r\n /* если браузер поддерживает gzip-сжатие - сжимаем данные*/ \r\n if(CloudServer.Gzip){\r\n Zlib.gzip(lList,CloudServer.getGzipDataFunc(lHeader,CloudServer.INDEX));\r\n }\r\n /* если не поддерживаеться - отсылаем данные без сжатия*/\r\n else\r\n CloudServer.sendResponse(lHeader,lList,CloudServer.INDEX);\r\n }\r\n else\r\n {\r\n console.log(pError);\r\n CloudServer.sendResponse('OK',pError.toString());\r\n }\r\n};\r\n\r\n/* Функция генерирует функция считывания файла\r\n * таким образом, что бы у нас было \r\n * имя считываемого файла\r\n * @pName - полное имя файла\r\n */\r\nCloudServer.getReadFileFunc = function(pName){\r\n/*\r\n * @pError - ошибка\r\n * @pData - данные\r\n * @pFromFile - прочитано с файла bool\r\n */ \r\n var lReadFile=function(pError,pData,pFromCache_b){\r\n if (!pError){\r\n console.log('file ' + pName + ' readed');\r\n \r\n /* берём из кэша данные файла\r\n * если их нет в кэше - \r\n * сохраняем\r\n */ \r\n if(!pFromCache_b && CloudServer.Cache.isAllowed)\r\n CloudServer.Cache.set(pName,pData);\r\n /* если кэш есть\r\n * сохраняем его в переменную\r\n * которая до этого будет пустая\r\n * по скольку мы будем вызывать этот метод\r\n * сами, ведь файл уже вычитан\r\n */\r\n \r\n var lHeader=CloudServer.generateHeaders(pName,CloudServer.Gzip);\r\n /* если браузер поддерживает gzip-сжатие - сжимаем данные*/\r\n if(CloudServer.Gzip &&!pFromCache_b){\r\n /* сжимаем содержимое */\r\n Zlib.gzip(pData,CloudServer.getGzipDataFunc(lHeader,pName)); \r\n }\r\n else{\r\n /* высылаем несжатые данные */\r\n CloudServer.sendResponse(lHeader,pData,pName);\r\n }\r\n }\r\n else\r\n {\r\n console.log(pError.path);\r\n if(pError.path!=='passwd.json')\r\n {\r\n console.log(pError);\r\n CloudServer.sendResponse('OK',pError.toString());\r\n }else{\r\n CloudServer.sendResponse('OK','passwd.json');\r\n } \r\n }\r\n };\r\n return lReadFile;\r\n};\r\n\r\n/* Функция получает сжатые данные\r\n * @pHeader - заголовок файла\r\n */\r\nCloudServer.getGzipDataFunc=function(pHeader,pName){\r\n return function(error,pResult){\r\n if(!error){\r\n /* отправляем сжатые данные\r\n * вместе с заголовком\r\n */ \r\n /* если установлена работа с кэшем\r\n * сохраняем сжатые данные\r\n */\r\n if(CloudServer.Cache.isAllowed){\r\n /* устанавливаем кєш */\r\n console.log(pName+' gziped');\r\n CloudServer.Cache.set(pName+'_gzip',pResult);\r\n }\r\n CloudServer.sendResponse(pHeader,pResult,pName); \r\n }\r\n else{\r\n console.log(error);\r\n CloudServer.sendResponse(pHeader,error);\r\n }\r\n };\r\n};\r\n/* Функция высылает ответ серверу \r\n * @pHead - заголовок\r\n * @pData - данные\r\n * @pName - имя отсылаемого файла\r\n */\r\nCloudServer.sendResponse = function(pHead, pData,pName){\r\n /* если у нас есть указатель на responce\r\n * для соответствующего файла - \r\n * высылаем его\r\n */\r\n var lResponse=CloudServer.Responses[pName];\r\n if(lResponse){\r\n lResponse.writeHead(200,pHead);\r\n lResponse.end(pData);\r\n console.log(pName+' sended');\r\n }\r\n};\r\n\r\nCloudServer.start();"]],"start1":0,"start2":0,"length1":0,"length2":22010}]],"length":22010} +{"contributors":[],"silentsave":false,"ts":1341484885313,"patch":[[{"diffs":[[0,"/server'"],[-1,""],[0,""],[1,",\r\n Port :31337, /* server port */\r\n IP :'127.0.0.1'"],[0,"\r\n};\r\n\r\n"]],"start1":1322,"start2":1322,"length1":16,"length2":98},{"diffs":[[0,"\r\n/*"],[-1,"\r\n var Path = require('path');\r\n*/ /* модуль для работы с путями*/"],[1," модуль для работы с путями*/\r\nvar Path = require('path');"],[0,"\r\n\r\n"]],"start1":4594,"start2":4594,"length1":82,"length2":69},{"diffs":[[0,"unction(){\r\n"],[1," /* Determining server.js directory\r\n * and chang current process directory\r\n * (usually /) to it.\r\n * argv[1] - is always script name\r\n */\r\n var lServerDir = Path.dirname(process.argv[1]);\r\n console.log('current dir: ' + process.cwd());\r\n console.log('server dir: ' + lServerDir); \r\n process.chdir(lServerDir);\r\n \r\n var lConfig={\r\n \"cache\" : {\"allowed\" : true},\r\n \"minification\" : {\r\n \"js\" : false,\r\n \"css\" : false,\r\n \"html\" : true,\r\n \"img\" : false\r\n }\r\n };\r\n try{\r\n console.log('reading configureation file config.json...');\r\n lConfig=require('./config');\r\n console.log('config.json readed');\r\n }catch(pError){\r\n console.log('warning: configureation file config.json not found...\\n' +\r\n 'using default values...\\n' +\r\n JSON.stringify(lConfig));\r\n }\r\n \r\n"],[0," /* Перем"]],"start1":5336,"start2":5336,"length1":24,"length2":1028},{"diffs":[[0,"Allowed("],[-1,"true"],[1,"lConfig.cache.allowed"],[0,");\r\n "]],"start1":6422,"start2":6422,"length1":20,"length2":37},{"diffs":[[0,"wed("],[-1,"{\r\n js:true,\r\n css:true,\r\n html:true,\r\n img:true\r\n }"],[1,"lConfig.minification"],[0,");\r\n"]],"start1":6564,"start2":6564,"length1":91,"length2":28},{"diffs":[[0,"ту 31337"],[-1,""],[0,""],[1," "],[0,"*/\r\nClou"]],"start1":6700,"start2":6700,"length1":16,"length2":17},{"diffs":[[0," "],[-1,"var http = require('http');"],[1,"/* constant ports of deployng servers \r\n var lCloudFoundryPort = process.env.VCAP_APP_PORT;\r\n "],[0," "],[-1,"\r\n"],[0," "],[-1," http.createServer(CloudServer._controller).listen(process.env.PORT ||\r\n"],[1,"var lNodesterPort = process.env.app_port;\r\n var lC9Port = process.env.PORT;\r\n */\r\n CloudServer.Port = process.env.PORT || /* c9 */\r\n process.env.app_port || /* nodester */\r\n "],[0," "]],"start1":6777,"start2":6777,"length1":116,"length2":393},{"diffs":[[0,"PP_PORT "],[1," || "],[0,"/* cloud"]],"start1":7192,"start2":7192,"length1":16,"length2":22},{"diffs":[[0,"y */"],[1,"\r\n "],[0," "],[-1,"||\r\n 31337,\r\n '0.0.0.0' || '127.0.0.1');\r\n console.log('Cloud Commander server running at http://127.0.0.1:'+\r\n (process.env.PORT===undefined?31337:process.env.PORT));"],[1," CloudServer.Port;\r\n \r\n CloudServer.IP = process.env.IP || /* c9 */\r\n CloudServer.IP;\r\n \r\n var http = require('http'); \r\n http.createServer(CloudServer._controller).listen(\r\n CloudServer.Port,\r\n CloudServer.IP);\r\n \r\n console.log('Cloud Commander server running at http://' +\r\n CloudServer.IP +\r\n ':' + \r\n CloudServer.Port);\r\n /*\r\n (!lC9Port?\r\n (!lCloudFoundryPort?\r\n (!lNodesterPort?31337:lNodesterPort)\r\n :lCloudFoundryPort)\r\n :lC9Port));\r\n */"],[0,"\r\n};"]],"start1":7220,"start2":7220,"length1":205,"length2":664},{"diffs":[[0,"eadDir);"],[-1," "],[0,""],[1,""],[0,"\r\n "]],"start1":14818,"start2":14818,"length1":32,"length2":16},{"diffs":[[0,"atch(err){\r\n"],[1," /*\r\n "],[0," "]],"start1":15985,"start2":15985,"length1":24,"length2":48},{"diffs":[[0,".log(err);\r\n"],[1," */\r\n"],[0," "]],"start1":16044,"start2":16044,"length1":24,"length2":44},{"diffs":[[0," 'mode':"],[-1,"undefined"],[1,"0"],[0,",\r\n "]],"start1":16121,"start2":16121,"length1":25,"length2":17},{"diffs":[[0," 'size':"],[-1,"undefined"],[1,"0"],[0,",\r\n "]],"start1":16152,"start2":16152,"length1":25,"length2":17},{"diffs":[[0," href=\"/"],[1,"css/"],[0,"reset.cs"]],"start1":18730,"start2":18730,"length1":16,"length2":20},{"diffs":[[0,"eplace('"],[1,"/css/"],[0,"style.cs"]],"start1":18786,"start2":18786,"length1":16,"length2":21},{"diffs":[[0,"Error.toString()"],[-1,""],[0,""],[1,",pName"],[0,");\r\n "]],"start1":22038,"start2":22038,"length1":32,"length2":38}]],"length":23807,"saved":false} +{"contributors":[],"silentsave":false,"ts":1342076412199,"patch":[[{"diffs":[[0,"r={\r\n /* "],[-1,""],[0,""],[1,"main Cloud Commander configuration\r\n * readed from config.json if it's\r\n * exist\r\n */\r\n Config : {\r\n \"cache\" : {\"allowed\" : true},\r\n \"minification\" : {\r\n \"js\" : false,\r\n \"css\" : false,\r\n \"html\" : true,\r\n \"img\" : false\r\n },\r\n \"server\" : true\r\n },\r\n /* "],[0,"функция, кот"]],"start1":122,"start2":122,"length1":24,"length2":480},{"diffs":[[0,"',\r\n"],[-1," /* name of direcotory with libs */\r\n"],[0," "]],"start1":1676,"start2":1676,"length1":48,"length2":8},{"diffs":[[0,"b/server',\r\n"],[1," CSSDIR :'./css',\r\n \r\n"],[0," Port "]],"start1":1737,"start2":1737,"length1":24,"length2":61},{"diffs":[[0,"={\r\n"],[-1," _allowed :true, "],[0," "]],"start1":2152,"start2":2152,"length1":39,"length2":8},{"diffs":[[0,"с кэшем */\r\n"],[1," _allowed :true,\r\n"],[0," /* данны"]],"start1":2206,"start2":2206,"length1":24,"length2":56},{"diffs":[[0," var "],[1,"lMinify;\r\n try{\r\n "],[0,"lMinify "]],"start1":4573,"start2":4573,"length1":16,"length2":68},{"diffs":[[0,");\r\n"],[-1,"\r\n this.done.js=this._allowed.js?lMinify.jsScripts():false;\r\n this.done.html=this._allowed.html?lMinify.html():false;\r\n this.done.css=this._allowed.css?lMinify.cssStyles(this._allowed.img):fals"],[1," }catch(pError){\r\n try{\r\n lMinify = require('minify');\r\n }catch(pError){\r\n return console.log('Could not minify withou minify module\\n' +\r\n 'for fixing type:\\n' +\r\n 'git submodule init\\n' +\r\n 'git submodule update\\n' +\r\n 'or\\n' +\r\n 'npm i minify');\r\n }\r\n }\r\n /*\r\n * temporary changed dir path,\r\n * becouse directory lib is write\r\n * protected by others by default\r\n * so if node process is started\r\n * from other user (root for example\r\n * in nodester) we can not write\r\n * minified versions\r\n */\r\n this.MinFolder = '/' + lMinify.MinFolder;\r\n var lMinFolder=this.MinFolder;\r\n \r\n /* post processing function for file\r\n * client.js\r\n */\r\n var lPostProcessing_f = function(pFinalCode){\r\n console.log('file name of ' +\r\n 'cloudfunc.js' +\r\n ' in ' +\r\n 'client.js' +\r\n ' changed. size:',\r\n (pFinalCode = pFinalCode\r\n .replace('cloudfunc.js','cloudfunc.min.js')\r\n .replace('keyBinding.js','keyBinding.min.js')\r\n .replace('/lib/', lMinFolder)\r\n .replace('/lib/client/', lMinFolder)).length);\r\n return pFinalCode;\r\n };\r\n \r\n this.done.js=this._allowed.js?\r\n lMinify.jsScripts([{\r\n 'client.js': lPostProcessing_f},\r\n 'lib/cloudfunc.js',\r\n 'lib/client/keyBinding.js'],\r\n true)\r\n :false;\r\n \r\n this.done.html=this._allowed.html?\r\n lMinify.html(CloudServer.INDEX):false;\r\n \r\n this.done.css=this._allowed.css?\r\n lMinify.cssStyles([CloudServer.CSSDIR + '/style.css',\r\n CloudServer.CSSDIR + '/reset.css'],\r\n this._allowed.img):false;\r\n \r\n this.Cache = lMinify.Cach"],[0,"e;\r\n"]],"start1":4690,"start2":4690,"length1":246,"length2":2796},{"diffs":[[0,"l:false}"],[1,",\r\n \r\n /* minification folder name */\r\n MinFolder :'',\r\n Cache :{}"],[0,"\r\n};\r\n\r\n"]],"start1":7593,"start2":7593,"length1":16,"length2":102},{"diffs":[[0," "],[-1,"var lConfig={\r\n \"cache\" : {\"allowed\" : true},\r\n \"minification\" : {\r\n \"js\" : false,"],[1,"try{\r\n console.log('reading configureation file config.json...');\r\n CloudServer.Config = require('./config');\r\n console.log('config.json readed');\r\n /* if command line parameter testing resolved \r\n * setting config to testing, so server\r\n * not created, just init and\r\n * all logs writed to screen"],[0,"\r\n "]],"start1":8844,"start2":8844,"length1":130,"length2":357},{"diffs":[[0," "],[1," */\r\n"],[0," "],[-1,"\"css\" : false,\r\n \"html\" : true,\r\n \"img\" : "],[1,"if(process.argv[2]==='test'){ \r\n CloudServer.Config.server=false;\r\n CloudServer.Config.logs="],[0,"false"],[1,";"],[0,"\r\n "]],"start1":9203,"start2":9203,"length1":98,"length2":152},{"diffs":[[0,"false;\r\n "],[-1," "],[0,""],[1,""],[0,"}\r\n };\r\n "]],"start1":9345,"start2":9345,"length1":36,"length2":32},{"diffs":[[0," "],[-1,"};\r\n try{\r\n console.log('reading configureation file config.json...');\r\n lConfig=require('./config');\r\n console.log('config.json readed');"],[1," \r\n if(CloudServer.Config.logs){\r\n console.log('log param setted up in config.json\\n' +\r\n 'from now all logs will be writed to log.txt');\r\n CloudServer.writeLogsToFile(); \r\n }"],[0,"\r\n "]],"start1":9368,"start2":9368,"length1":170,"length2":252},{"diffs":[[0,"ringify("],[-1,"l"],[1,"CloudServer."],[0,"Config))"]],"start1":9820,"start2":9820,"length1":17,"length2":28},{"diffs":[[0,"ig));\r\n }"],[1," "],[0,"\r\n \r\n "]],"start1":9844,"start2":9844,"length1":24,"length2":32},{"diffs":[[0,".setAllowed("],[-1,"l"],[1,"CloudServer."],[0,"Config.cache"]],"start1":9938,"start2":9938,"length1":25,"length2":36},{"diffs":[[0,"Allowed("],[-1,"l"],[1,"CloudServer."],[0,"Config.m"]],"start1":10091,"start2":10091,"length1":17,"length2":28},{"diffs":[[0,"er.IP;\r\n "],[1,"\r\n"],[0," "],[-1,"\r\n"],[1,"/* if Cloud Server started on jitsu */\r\n if(!process.env.HOME.indexOf('/opt/haibu')){\r\n CloudServer.Port = '0.0.0.0';\r\n }\r\n \r\n /* server mode or testing mode */ \r\n if(!process.argv[2] && CloudServer.Config.server){\r\n "],[0," var http"]],"start1":10939,"start2":10939,"length1":30,"length2":279},{"diffs":[[0,"'http');"],[1,"\r\n "],[0," \r\n"],[1," try{\r\n "],[0," http"]],"start1":11229,"start2":11229,"length1":22,"length2":50},{"diffs":[[0,"isten(\r\n"],[1," "],[0," "]],"start1":11319,"start2":11319,"length1":16,"length2":24},{"diffs":[[0,".Port,\r\n "],[1," "],[1," "],[0,"CloudServer.IP);"]],"start1":11354,"start2":11354,"length1":32,"length2":40},{"diffs":[[0,");\r\n "],[-1,"\r\n"],[1," \r\n "],[0," console."]],"start1":11392,"start2":11392,"length1":26,"length2":42},{"diffs":[[0,"http://' +\r\n"],[1," "],[0," Clou"]],"start1":11473,"start2":11473,"length1":24,"length2":32},{"diffs":[[0,"erver.IP +\r\n"],[1," "],[0," ':' "]],"start1":11507,"start2":11507,"length1":24,"length2":32},{"diffs":[[0," ':' + \r\n"],[1," "],[0," Clou"]],"start1":11531,"start2":11531,"length1":24,"length2":32},{"diffs":[[0,"ver.Port);\r\n"],[1," }catch(pError){\r\n console.log('Cloud Commander server could not started');\r\n console.log(pError);\r\n }\r\n }else{\r\n console.log('Cloud Commander testing mode');\r\n }\r\n"],[0," /*\r\n "]],"start1":11567,"start2":11567,"length1":24,"length2":237},{"diffs":[[0,"*/\r\n"],[-1," //lName=Path.basename(pathname);\r\n"],[0," "]],"start1":15125,"start2":15125,"length1":54,"length2":8},{"diffs":[[0,");\r\n"],[-1,"\r\n var lReadFileFunc_f=CloudServer.getReadFileFunc(lName);\r\n /* если там что-то есть передаём данные в функцию\r\n * readFile\r\n */\r\n if(lFileData){"],[1," console.log(Path.basename(lName));\r\n \r\n var lMinify=CloudServer.Minify;\r\n \r\n /* object thet contains information\r\n * about the source of file data\r\n */\r\n var lFromCache_o={'cache': true};\r\n \r\n /* if cache is empty and Cache allowed and Minify_allowed \r\n * and in Minifys cache is files, so save it to\r\n * CloudServer cache\r\n */\r\n if(!lFileData && \r\n lMinify._allowed){\r\n console.log('trying to read data from Minify.Cache');\r\n lFromCache_o.cache=false;\r\n lFileData = CloudServer.Minify.Cache[\r\n Path.basename(lName)]; \r\n }\r\n var lReadFileFunc_f=CloudServer.getReadFileFunc(lName);\r\n /* если там что-то есть передаём данные в функцию\r\n * readFile\r\n */\r\n if(lFileData){ \r\n /* if file readed not from cache - he readed from minified cache */\r\n if(lFromCache_o.cache===false)\r\n lFromCache_o.minify=true;\r\n else\r\n lFromCache_o.minify=false;\r\n "],[0,"\r\n "]],"start1":15646,"start2":15646,"length1":210,"length2":1318},{"diffs":[[0,"console.log("],[-1,"'"],[1,"lName + ' "],[0,"readed from "]],"start1":16978,"start2":16978,"length1":25,"length2":34},{"diffs":[[0,"ileData,"],[-1,"true"],[1,"lFromCache_o"],[0,");\r\n "]],"start1":17227,"start2":17227,"length1":20,"length2":28},{"diffs":[[0,"tml?"],[-1,"'index.min.html'"],[1,"\r\n '.' + CloudServer.Minify.MinFolder + 'index.min.html'\r\n "],[0,":Clo"]],"start1":19661,"start2":19661,"length1":24,"length2":105},{"diffs":[[0,"r.INDEX]=pRes;\r\n"],[1," \r\n"],[0," "]],"start1":19936,"start2":19936,"length1":32,"length2":50},{"diffs":[[0,"ctory())"],[-1," "],[0,"\r\n "]],"start1":20001,"start2":20001,"length1":36,"length2":16},{"diffs":[[0," */\r\n"],[-1,"\r\n"],[0," "]],"start1":23855,"start2":23855,"length1":18,"length2":16},{"diffs":[[0,"le.css',"],[1,"CloudServer.Minify.MinFolder + "],[0,"'all.min"]],"start1":24046,"start2":24046,"length1":16,"length2":47},{"diffs":[[0,"js',"],[-1,"'client.min.js')"],[1,"\r\n CloudServer.Minify.MinFolder + \r\n 'client.min.js')\r\n "],[0,":lIn"]],"start1":24230,"start2":24230,"length1":24,"length2":125},{"diffs":[[0,"pError "],[1," "],[0,"- ошибка"]],"start1":25957,"start2":25957,"length1":16,"length2":24},{"diffs":[[0,"pData "],[1," "],[0,"- данные"]],"start1":25987,"start2":25987,"length1":16,"length2":24},{"diffs":[[0,"* @pFrom"],[-1,"File"],[1,"Cache_o "],[0," - прочи"]],"start1":26014,"start2":26014,"length1":20,"length2":26},{"diffs":[[0,"айла"],[-1," bool"],[1,",\r\n * или из одного из кешей\r\n * Пример {cache: false, minify: true}"],[0,"\r\n *"]],"start1":26048,"start2":26048,"length1":13,"length2":97},{"diffs":[[0,"(pError,"],[1," "],[0,"pData,"],[1," "],[0,"pFromCac"]],"start1":26178,"start2":26178,"length1":22,"length2":24},{"diffs":[[0,"ata, pFromCache_"],[-1,"b"],[1,"o"],[0,"){\r\n if ("]],"start1":26189,"start2":26189,"length1":33,"length2":33},{"diffs":[[0," if("],[1,"pFromCache_o && "],[0,"!pFromCa"]],"start1":26445,"start2":26445,"length1":16,"length2":32},{"diffs":[[0,"omCache_"],[-1,"b"],[1,"o.cache"],[0," && Clou"]],"start1":26473,"start2":26473,"length1":17,"length2":23},{"diffs":[[0,"\n if("],[1," "],[0,"CloudServer.Gzip"]],"start1":26975,"start2":26975,"length1":32,"length2":33},{"diffs":[[0,".Gzip &&"],[-1,"!"],[1," !("],[0,"pFromCac"]],"start1":27003,"start2":27003,"length1":17,"length2":19},{"diffs":[[0,"omCache_"],[-1,"b"],[1,"o && pFromCache_o.cache) "],[0,"){\r\n "]],"start1":27017,"start2":27017,"length1":17,"length2":41},{"diffs":[[0,"sended');\r\n }"],[-1,""],[0,""],[1,"\r\n};\r\n\r\n/* function sets stdout to file log.txt */\r\nCloudServer.writeLogsToFile = function(){\r\n var stdo = require('fs').createWriteStream('./log.txt');\r\n \r\n process.stdout.write = (function(write) {\r\n return function(string, encoding, fd) {\r\n stdo.write(string);\r\n };\r\n })(process.stdout.write);"],[0,"\r\n};\r\n\r\nCloudSer"]],"start1":29296,"start2":29296,"length1":32,"length2":381}]],"length":29689,"saved":false} +{"ts":1342076472599,"patch":[[{"diffs":[[0,"t minify"],[-1," "],[1,"' +\r\n '"],[0,"withou m"]],"start1":4901,"start2":4901,"length1":17,"length2":52},{"diffs":[[0,"odule\\n' "],[-1,"+\r\n"],[1," +\r\n "],[0," "]],"start1":4960,"start2":4960,"length1":27,"length2":39},{"diffs":[[0," "],[-1," "],[1,"+\r\n"],[0," +\r\n "]],"start1":5031,"start2":5031,"length1":36,"length2":35},{"diffs":[[0," +\r\n "],[-1," +\r\n"],[0," "]],"start1":5043,"start2":5043,"length1":38,"length2":32},{"diffs":[[0," "],[-1," "],[0,"'git submodule i"]],"start1":5062,"start2":5062,"length1":37,"length2":32},{"diffs":[[0," "],[-1," "],[-1," "],[1,"+\r\n"],[0," "],[-1,"+\r\n"],[0," "]],"start1":5106,"start2":5106,"length1":35,"length2":23},{"diffs":[[0,"e\\n' "],[-1," "],[1,"+\r\n"],[0," +"]],"start1":5165,"start2":5165,"length1":33,"length2":35},{"diffs":[[0,"\n "],[-1,"+\r\n"],[0," "]],"start1":5183,"start2":5183,"length1":35,"length2":32},{"diffs":[[0," "],[-1," "],[0,"'or\\n' "]],"start1":5204,"start2":5204,"length1":27,"length2":16},{"diffs":[[0," "],[1,"+\r\n"],[0," "],[-1," +\r\n"],[0," "]],"start1":5240,"start2":5240,"length1":35,"length2":23}]],"length":29688,"saved":false} +{"ts":1342076507607,"patch":[[{"diffs":[[0,"lient/',"],[1,"\r\n "],[0," lMinFol"]],"start1":6568,"start2":6568,"length1":16,"length2":57}]],"length":29729,"saved":false} +{"ts":1342076549849,"patch":[[{"diffs":[[0,"nd...\\n'"],[-1," "],[0," +\r\n"],[-1," "],[0," "]],"start1":9748,"start2":9748,"length1":30,"length2":20},{"diffs":[[0," +\r\n"],[-1," "],[0," "]],"start1":9811,"start2":9811,"length1":32,"length2":24}]],"length":29711,"saved":false} +{"ts":1342076566636,"patch":[[{"diffs":[[0,"ractices"],[1,"\r\n "],[0,"/caching"]],"start1":13493,"start2":13493,"length1":16,"length2":30}]],"length":29725,"saved":false} +{"ts":1342076581525,"patch":[[{"diffs":[[0,"erver.Cache.get("],[1,"\r\n "],[0,"CloudServer.Gzip"]],"start1":15628,"start2":15628,"length1":32,"length2":50}]],"length":29743,"saved":false} +{"ts":1342076591890,"patch":[[{"diffs":[[0,"cache - "],[1,"\r\n * "],[0,"he reade"]],"start1":16787,"start2":16787,"length1":16,"length2":37},{"diffs":[[0,"d cache "],[1,"\r\n "],[0,"*/\r\n "]],"start1":16838,"start2":16838,"length1":16,"length2":35}]],"length":29783,"saved":false} +{"ts":1342076628105,"patch":[[{"diffs":[[0,"[i],"],[-1,"'size':'dir','uid':lStats.uid,'mode':lMode};"],[1,"\r\n 'size':'dir',\r\n 'uid':lStats.uid,\r\n 'mode':lMode};\r\n "],[0,"\r\n "]],"start1":21935,"start2":21935,"length1":52,"length2":136},{"diffs":[[0,"[i],"],[-1,"'uid':lStats.uid,'size':lStats.size,'mode':lMode};"],[1,"\r\n 'uid':lStats.uid,\r\n 'size':lStats.size,\r\n 'mode':lMode};\r\n "],[0,"\r\n "]],"start1":22260,"start2":22260,"length1":58,"length2":130}]],"length":29939,"saved":false} diff --git a/.c9revisions/style.css.c9save b/.c9revisions/style.css.c9save new file mode 100644 index 00000000..d1135a0e --- /dev/null +++ b/.c9revisions/style.css.c9save @@ -0,0 +1 @@ +{"ts":1341071826221,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"/*\r\n@import url(//fonts.googleapis.com/css?family=Droid+Sans+Mono);\r\n*/\r\n\r\n/* Foundation Icons General Enclosed */\r\n@font-face {\r\n font-family: 'FoundationIconsGeneralEnclosed';\r\n src: url('//dl.dropbox.com/u/78163899/mnemonia/fonts/foundation-icons-general-enclosed.woff') format('woff');\r\n font-weight: normal;\r\n font-style: normal;\r\n\r\n} \r\n/* символьный шрифт от гитхаба*/\r\n@font-face {\r\n font-family: 'Octicons Regular';\r\n font-style: normal;\r\n font-weight: normal;\r\n src: local('Octicons Regular'), url('//dl.dropbox.com/u/78163899/mnemonia/fonts/octicons-regular-webfont.woff') format('woff');\r\n}\r\n\r\n@font-face {\r\n font-family: 'Droid Sans Mono';\r\n font-style: normal;\r\n font-weight: normal;\r\n src: local('Droid Sans Mono'), local('DroidSansMono'), url('http://themes.googleusercontent.com/static/fonts/droidsansmono/v4/ns-m2xQYezAtqh7ai59hJUYuTAAIFFn5GTWtryCmBQ4.woff') format('woff');\r\n}\r\n\r\nbody{\r\n font:16px \"Droid Sans Mono\";\r\n}\r\n\r\n.menu{\r\n font: 16px 'Octicons Regular';\r\n margin-bottom: 0;\r\n}\r\n\r\n.path_icon{\r\n font-family:'FoundationIconsGeneralEnclosed';\r\n font-size:30px;\r\n color: #46A4C3;/*#55BF3F; green*/\r\n text-shadow:black 0 2px 1px;\r\n /* размер иконки и позиция на png-файле*/\r\n width: 15px;\r\n height: 15px;\r\n display: inline-block;\r\n position: relative;\r\n top: 3px;\r\n left: -4px;\r\n}\r\n.path_icon:hover{\r\n /*\r\n color:#45D827;\r\n */\r\n cursor:pointer;\r\n}\r\n.path_icon:active{\r\n text-shadow:black 0 0 1px;\r\n position: relative;\r\n top: 4px;\r\n} \r\n.icon{\r\n font-family: 'Octicons Regular';\r\n font-size:16px;\r\n width:16px;\r\n height:16px;\r\n display:inline-block;\r\n margin-left:0.5%;\r\n}\r\n.error::before{\r\n content:'\\f026';\r\n cursor:default;\r\n color:rgb(222, 41, 41);\r\n position: relative;\r\n top: -3px;\r\n}\r\n.loading{\r\n background:url(/img/spinner.gif);\r\n position:relative;\r\n top:1px;\r\n}\r\n.error:hover{\r\n color:rgba(222, 41, 41, 0.81);\r\n}\r\n.refresh-icon{\r\n background:url(/img/panel_refresh.png) no-repeat;\r\n}\r\n.refresh-icon:active{\r\n /*background-position-y: -15px;*/\r\nbackground:url(/img/panel_refresh.png) 0 -15px no-repeat;\r\n}\r\n.clear-cache{\r\n background:url(/img/console_clear.png) -4px -4px no-repeat;\r\n margin-right: 6px;\r\n margin-left: 7px;\r\n}\r\n.clear-cache:active{\r\n /*\r\n background-position-y: -25px;\r\n */\r\n top:5px;\r\n} \r\n \r\n.settings:before{\r\n content:'k';\r\n} \r\n.links{\r\n color:red; \r\n }\r\n \r\n.mini-icon {\r\n float: left; \r\n height: 16px;\r\n left: -5px;\r\n margin-left: 6px; \r\n position: relative;\r\n top: 2px;\r\n width: 16px;\r\n /* отступ перед картинкой \r\n * для нормального отображения\r\n * рамки\r\n */\r\n}\r\n/* freeupex */\r\n.directory{\r\n /*list-style-image*/\r\n background-image:url('/img/dir.png');\r\n background-repeat: no-repeat;\r\n background-position: 0 0;\r\n}\r\n.text-file{\r\n /*list-style-image*/\r\n background-image:url('/img/txt.png');\r\n background-repeat: no-repeat;\r\n background-position: 0 0;\r\n}\r\n#fm{\r\n height:90%; \r\n overflow-y: scroll;\r\n}\r\n.fm_header{\r\n font-weight: bold;\r\n}\r\n#path{\r\n margin-left:1.5%; \r\n}\r\n#left{\r\n float:left;\r\n width:90%;\r\n}\r\n/* фон файла, на котором курсор*/\r\n.current-file{\r\n border: 2px solid rgba(49, 123, 249, .40);\r\n}\r\n.selected-file{\r\n background-color: rgba(49, 123, 249, .40);\r\n color:white;\r\n}\r\n#right{\r\n float:right;\r\n}\r\n.panel{\r\n display: table;\r\n width:45%;\r\n}\r\n#keyspanel{\r\n text-align: center;\r\n}\r\n/* информация о файлах и папках*/\r\n.name{\r\n float: left;\r\n width: 37%;\r\n}\r\n.size{\r\n float:left;\r\n width:16%;\r\n /* Ставим выравнивание,\r\n * что бы размер был в\r\n * одной ровной колонке\r\n */\r\n text-align: right;\r\n /* Ставим отступ, что бы\r\n * size не налазил на uid\r\n * (owner)\r\n */\r\n margin-right: 27px;\r\n}\r\n.owner{\r\n}\r\n.mode{\r\n float: right;\r\n width: 25%;\r\n}\r\n\r\nul,li{list-style-type:none;}\r\nbutton{\r\n width:10%;\r\n}\r\na{\r\n text-decoration:none; \r\n}\r\na:hover, a:active { cursor:pointer;outline: 0; color: #06e; }\r\na:focus { outline: thin dotted; } \r\n\r\n/* Если размер окна очень маленький\r\n * располагаем имя и атрибуты файла\r\n * друг-под-другом\r\n*/\r\n/* responsive design */\r\n@media only screen and (max-width: 600px){\r\n #left{\r\n width:90% !important;\r\n }\r\n .panel >li{\r\n margin:10px;\r\n }\r\n /* если правая панель не помещаеться - прячем её */\r\n #right{\r\n display:none;\r\n }\r\n /* текущий файл под курсором */\r\n.current-file{\r\n background-color: rgba(49, 123, 249, .40);\r\n color:white;\r\n }\r\n /* делаем иконки под курсом белыми*/\r\n.current-file > .mini-icon{\r\n color:white;\r\n }\r\n.current-file > .text-file::before{\r\n color:white;\r\n }\r\n \r\n/* меняем иконки на шрифтовые*/\r\n .mini-icon {\r\n font: 60px 'Octicons Regular';\r\n width: 40%;\r\n height: 0;\r\n margin-left: 0;\r\n float: right;\r\n position: relative;\r\n top: -17px;\r\n \r\n color: rgba(246, 224, 124, 0.56);\r\n }\r\n .directory::before{\r\n content: '\\f216';\r\n }\r\n .text-file::before{\r\n color: rgba(26, 224, 124, 0.56);\r\n content: '\\f211';\r\n }\r\n .text-file{\r\n background-image:none;\r\n }\r\n \r\n \r\n\r\n /* убираем заголовок*/\r\n .fm_header{\r\n display:none;\r\n } \r\n .mode,.size,.owner{\r\n /* располагаем элементы \r\n * один под другим\r\n */\r\n display: table;\r\n float: none;\r\n width: 0;\r\n \r\n text-align: left;\r\n }\r\n /* выводим заголовки рядом с полями */\r\n .name::before{\r\n content: 'name:';\r\n font-weight: bold;\r\n font-size: 13px;\r\n }\r\n .mode::before{\r\n content: 'mode:';\r\n font-weight: bold;\r\n font-size: 13px;\r\n }\r\n .size::before{\r\n content: 'size:';\r\n font-weight: bold;\r\n font-size: 13px;\r\n }\r\n .owner::before{\r\n content: 'owner:';\r\n font-weight: bold;\r\n font-size: 13px;\r\n }\r\n \r\n .name{\r\n float: none;\r\n width:100%;\r\n font-size: 18px;\r\n }\r\n}\r\n@media only screen and (min-width: 601px) and (max-width: 767px){\r\n #left{ \r\n width:90% !important;\r\n }\r\n #right{\r\n display:none;\r\n }\r\n}\r\n\r\n@media only screen and (min-width:767px) and (max-width: 1060px){\r\n #left{ \r\n width:90% !important;\r\n }\r\n /* если правая панель не помещаеться - прячем её */\r\n #right{\r\n display:none;\r\n }\r\n} "]],"start1":0,"start2":0,"length1":0,"length2":6552}]],"length":6552} diff --git a/.c9revisions/style.css.c9save.h446bz1k.tmp b/.c9revisions/style.css.c9save.h446bz1k.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h45086jj.tmp b/.c9revisions/style.css.c9save.h45086jj.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h494cf2w.tmp b/.c9revisions/style.css.c9save.h494cf2w.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h49eoaqj.tmp b/.c9revisions/style.css.c9save.h49eoaqj.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h49glt2z.tmp b/.c9revisions/style.css.c9save.h49glt2z.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4cb87jm.tmp b/.c9revisions/style.css.c9save.h4cb87jm.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4cxz8ad.tmp b/.c9revisions/style.css.c9save.h4cxz8ad.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4e6vf1c.tmp b/.c9revisions/style.css.c9save.h4e6vf1c.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4ecjfe9.tmp b/.c9revisions/style.css.c9save.h4ecjfe9.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4ep7ra3.tmp b/.c9revisions/style.css.c9save.h4ep7ra3.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4ey1kn4.tmp b/.c9revisions/style.css.c9save.h4ey1kn4.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4g0fp4u.tmp b/.c9revisions/style.css.c9save.h4g0fp4u.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4iv95e0.tmp b/.c9revisions/style.css.c9save.h4iv95e0.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4kmojdu.tmp b/.c9revisions/style.css.c9save.h4kmojdu.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4lvdchu.tmp b/.c9revisions/style.css.c9save.h4lvdchu.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4msagka.tmp b/.c9revisions/style.css.c9save.h4msagka.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4no91mv.tmp b/.c9revisions/style.css.c9save.h4no91mv.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4schm0w.tmp b/.c9revisions/style.css.c9save.h4schm0w.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4sltm65.tmp b/.c9revisions/style.css.c9save.h4sltm65.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4swj1j2.tmp b/.c9revisions/style.css.c9save.h4swj1j2.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4tm0tx0.tmp b/.c9revisions/style.css.c9save.h4tm0tx0.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4u8yc2x.tmp b/.c9revisions/style.css.c9save.h4u8yc2x.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4uhfrrf.tmp b/.c9revisions/style.css.c9save.h4uhfrrf.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4venzsn.tmp b/.c9revisions/style.css.c9save.h4venzsn.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4vpi5qc.tmp b/.c9revisions/style.css.c9save.h4vpi5qc.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h4ztbl30.tmp b/.c9revisions/style.css.c9save.h4ztbl30.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h514zrg3.tmp b/.c9revisions/style.css.c9save.h514zrg3.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h530wuvl.tmp b/.c9revisions/style.css.c9save.h530wuvl.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h56nm0d9.tmp b/.c9revisions/style.css.c9save.h56nm0d9.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h56olmic.tmp b/.c9revisions/style.css.c9save.h56olmic.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5852pf4.tmp b/.c9revisions/style.css.c9save.h5852pf4.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h58kk2na.tmp b/.c9revisions/style.css.c9save.h58kk2na.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h59uyik4.tmp b/.c9revisions/style.css.c9save.h59uyik4.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h59ynou9.tmp b/.c9revisions/style.css.c9save.h59ynou9.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5d80d1f.tmp b/.c9revisions/style.css.c9save.h5d80d1f.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5hjdagu.tmp b/.c9revisions/style.css.c9save.h5hjdagu.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5ijdjai.tmp b/.c9revisions/style.css.c9save.h5ijdjai.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5k60ruc.tmp b/.c9revisions/style.css.c9save.h5k60ruc.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5qllef3.tmp b/.c9revisions/style.css.c9save.h5qllef3.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5roykxe.tmp b/.c9revisions/style.css.c9save.h5roykxe.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5sf2uiu.tmp b/.c9revisions/style.css.c9save.h5sf2uiu.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5sjvsq9.tmp b/.c9revisions/style.css.c9save.h5sjvsq9.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5tl1sre.tmp b/.c9revisions/style.css.c9save.h5tl1sre.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5uhjd0x.tmp b/.c9revisions/style.css.c9save.h5uhjd0x.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5vcfdbp.tmp b/.c9revisions/style.css.c9save.h5vcfdbp.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5vf6u8v.tmp b/.c9revisions/style.css.c9save.h5vf6u8v.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5wiq2l7.tmp b/.c9revisions/style.css.c9save.h5wiq2l7.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/style.css.c9save.h5ycul41.tmp b/.c9revisions/style.css.c9save.h5ycul41.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.c9revisions/test.sh.c9save b/.c9revisions/test.sh.c9save new file mode 100644 index 00000000..2ceec729 --- /dev/null +++ b/.c9revisions/test.sh.c9save @@ -0,0 +1 @@ +{"ts":1340792515433,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"#!/bin/sh\nnpm i -g jshint\necho \"jshint server.js client.js lib/cloudfunc.js\"\njshint --config ./.jshintrc ./server.js ./client.js ./lib/cloudfunc.js ./lib/server/minify.js ./lib/client/keyBinding.js"]],"start1":0,"start2":0,"length1":0,"length2":197}]],"length":197} diff --git a/.c9revisions/test/test.sh.c9save b/.c9revisions/test/test.sh.c9save new file mode 100644 index 00000000..fd3a801a --- /dev/null +++ b/.c9revisions/test/test.sh.c9save @@ -0,0 +1 @@ +{"ts":1341644191697,"silentsave":true,"restoring":false,"patch":[[{"diffs":[[1,"#!/bin/sh\r\nnpm i jshint -g\r\necho \"jshint server.js client.js lib/cloudfunc.js\"\r\njshint --config ./.jshintrc ./server.js ./client.js \r\necho \"jshint ./lib/cloudfunc.js ./lib/server/minify.js ./lib/client/keyBinding.js\"\r\njshint --config ./.jshintrc ./lib/cloudfunc.js ./lib/server/minify.js ./lib/client/keyBinding.js\r\necho \"jshint ./package.json ./config.json\"\r\njshint --config ./.jshintrc ./package.json ./config.json\r\nnpm i uglify-js clean-css html-minifier css-b64-images\r\nnode server.js test\r\nls ./min"]],"start1":0,"start2":0,"length1":0,"length2":503}]],"length":503} diff --git a/.gitignore.h4d4t753.tmp b/.gitignore.h4d4t753.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.gitignore.h57idmur.tmp b/.gitignore.h57idmur.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.gitignore.h59q9gfx.tmp b/.gitignore.h59q9gfx.tmp new file mode 100644 index 00000000..e69de29b diff --git a/.gitignore.h59vkwh4.tmp b/.gitignore.h59vkwh4.tmp new file mode 100644 index 00000000..e69de29b diff --git a/node_modules/minify b/node_modules/minify new file mode 160000 index 00000000..d08b97db --- /dev/null +++ b/node_modules/minify @@ -0,0 +1 @@ +Subproject commit d08b97db461c5e0227df178a699c376c963d48ee