diff --git a/html/fs/index.html b/html/fs/index.html index 79b1914c..052b7b1b 100644 --- a/html/fs/index.html +++ b/html/fs/index.html @@ -42,6 +42,7 @@ client = 'client/', files = [ 'util', + 'format', 'promise', 'cloudfunc', client + 'dom', diff --git a/lib/client/edit.js b/lib/client/edit.js index df66e931..461374c8 100644 --- a/lib/client/edit.js +++ b/lib/client/edit.js @@ -1,4 +1,4 @@ -var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch, Zip, MenuIO; +var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch, Zip, MenuIO, Format; (function(CloudCmd, Util, DOM, CloudFunc) { 'use strict'; @@ -450,6 +450,7 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch, Zip, MenuI function onSave(text) { var ret, + size = Format.size(Value.length), isError = Util.isContainStrAtBegin(text, 'error'), path = Info.path, msg = '\nShould I save file anyway?'; @@ -457,7 +458,7 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch, Zip, MenuI if (!isError) { Edit.showMessage(text); DOM.saveDataToStorage(path, Value); - DOM.setCurrentSize(Value.length); + DOM.setCurrentSize(size); } else { ret = Dialog.confirm(text + msg); diff --git a/lib/format.js b/lib/format.js new file mode 100644 index 00000000..4b6c5983 --- /dev/null +++ b/lib/format.js @@ -0,0 +1,164 @@ +(function(scope) { + 'use strict'; + + var Scope = scope.window ? window : global; + + if (typeof module === 'object' && module.exports) + module.exports = new FormatProto(); + else + Scope.Format = new FormatProto(); + + function FormatProto() { + this.addSlashToEnd = function(path) { + var length, isSlash; + + if (path) { + length = path.length - 1; + isSlash = path[length] === '/'; + + if (!isSlash) + path += '/'; + } + + return path; + }; + + /** Функция получает короткие размеры + * конвертируя байт в килобайты, мегабойты, + * гигайбайты и терабайты + * @pSize - размер в байтах + */ + this.size = function(size) { + var isNumber = typeof size === 'number', + l1KB = 1024, + l1MB = l1KB * l1KB, + l1GB = l1MB * l1KB, + l1TB = l1GB * l1KB, + l1PB = l1TB * l1KB; + + if (isNumber) { + if (size < l1KB) size = size + 'b'; + else if (size < l1MB) size = (size/l1KB).toFixed(2) + 'kb'; + else if (size < l1GB) size = (size/l1MB).toFixed(2) + 'mb'; + else if (size < l1TB) size = (size/l1GB).toFixed(2) + 'gb'; + else if (size < l1PB) size = (size/l1TB).toFixed(2) + 'tb'; + else size = (size/l1PB).toFixed(2) + 'pb'; + } + + return size; + }; + + /** + * Функция переводит права из цыфрового вида в символьный + * @param perms - строка с правами доступа + * к файлу в 8-миричной системе + */ + this.permissions = { + symbolic: function(perms) { + var type, owner, group, all, + permsStr = '', + permissions = ''; + /* + S_IRUSR 0000400 protection: readable by owner + S_IWUSR 0000200 writable by owner + S_IXUSR 0000100 executable by owner + S_IRGRP 0000040 readable by group + S_IWGRP 0000020 writable by group + S_IXGRP 0000010 executable by group + S_IROTH 0000004 readable by all + S_IWOTH 0000002 writable by all + S_IXOTH 0000001 executable by all + */ + + if (perms) { + permsStr = perms.toString(); + /* тип файла */ + type = permsStr.charAt(0); + + switch (type - 0) { + case 1: /* обычный файл */ + type='-'; + break; + case 2: /* байт-ориентированное (символьное) устройство*/ + type='c'; + break; + case 4: /* каталог */ + type='d'; + break; + default: + type='-'; + } + + /* оставляем последние 3 символа*/ + if (permsStr.length > 5) + permsStr = permsStr.substr(3); + else + permsStr = permsStr.substr(2); + + /* Рекомендации гугла советуют вместо string[3] + * использовать string.charAt(3) + */ + /* + http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Standards_features#Standards_features + + Always preferred over non-standards featuresFor + maximum portability and compatibility, always + prefer standards features over non-standards + features (e.g., string.charAt(3) over string[3] + and element access with DOM functions instead + of using an application-specific shorthand). + */ + /* Переводим в двоичную систему */ + owner = (permsStr[0] - 0).toString(2), + group = (permsStr[1] - 0).toString(2), + all = (permsStr[2] - 0).toString(2), + + /* переводим в символьную систему*/ + permissions = + (owner[0] - 0 > 0 ? 'r' : '-') + + (owner[1] - 0 > 0 ? 'w' : '-') + + (owner[2] - 0 > 0 ? 'x' : '-') + + ' ' + + (group[0] - 0 > 0 ? 'r' : '-') + + (group[1] - 0 > 0 ? 'w' : '-') + + (group[2] - 0 > 0 ? 'x' : '-') + + ' ' + + (all[0]- 0 > 0 ? 'r' : '-') + + (all[1]- 0 > 0 ? 'w' : '-') + + (all[2]- 0 > 0 ? 'x' : '-'); + } + + return permissions; + }, + + /** + * Функция конвертирует права доступа к файлам из символьного вида + * в цыфровой + */ + numeric: function(perms) { + var owner, group, all, + length = perms && perms.length === 11; + + if (length) { + owner = (perms[0] === 'r' ? 4 : 0) + + (perms[1] === 'w' ? 2 : 0) + + (perms[2] === 'x' ? 1 : 0), + + group = (perms[4] === 'r' ? 4 : 0) + + (perms[5] === 'w' ? 2 : 0) + + (perms[6] === 'x' ? 1 : 0), + + all = (perms[8] === 'r' ? 4 : 0) + + (perms[9] === 'w' ? 2 : 0) + + (perms[10] === 'x' ? 1 : 0); + + /* добавляем 2 цифры до 5 */ + perms = '00' + owner + group + all; + } + + return perms; + } + }; + } + +})(this); diff --git a/lib/server/commander.js b/lib/server/commander.js index 68759810..554f642d 100644 --- a/lib/server/commander.js +++ b/lib/server/commander.js @@ -16,7 +16,7 @@ DIR_SERVER = DIR + 'server/', Util = require(DIR + 'util'), - format = require(DIR_SERVER + 'format'), + format = require(DIR + 'format'), users = require(DIR_SERVER + 'users'), WIN32 = process.platform === 'win32'; diff --git a/lib/server/size.js b/lib/server/size.js index da94d495..80452b45 100644 --- a/lib/server/size.js +++ b/lib/server/size.js @@ -8,8 +8,8 @@ DIR = '../', DIR_SERVER = DIR + 'server/', - format = require(DIR_SERVER + 'format'), - Util = require(DIR + 'util'), + format = require(DIR + 'format'), + Util = require(DIR + 'util'), /* The lstat() function shall be equivalent to stat(), except when path refers to a symbolic link. In that case lstat()