wide/static/js/wide.min.js.map

1 line
253 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["tabs.js","dialog.js","editors.js","notification.js","tree.js","wide.js","session.js","menu.js","windows.js","hotkeys.js","bottomGroup.js"],"names":["Tabs","obj","_$tabsPanel","$","id","_$tabs","_stack","this","STACKSIZE","_init","_it","each","data","length","splice","push","extend","prototype","_that","on","event","hasClass","setCurrent","clickAfter","parent","isRemove","removeBefore","del","stopPropagation","_hasId","$tabs","find","add","getCurrentId","$tabsPanel","append","title","content","after","stack","prevId","children","remove","i","removeAfter","path","$currentTab","removeClass","hide","addClass","show","setAfter","tId","tree","getTIdByPath","node","fileTree","getNodeByTId","selectNode","wide","curNode","ii","editors","curEditor","editor","cursor","getCursor","setCursor","focus","refreshOutline","text","line","ch","fn","dialog","version","author","dpuuid","Date","getTime","PROP_NAME","Dialog","_defaults","styleClass","background","panel","main","footer","headerMiddle","headerBg","closeIcon","closeIconHover","_attach","target","settings","uuid","inst","_newInst","replace","_getInst","err","_destroyDialog","removeData","prependTo","unwrap","removeAttr","_getDefaults","windowH","window","height","windowW","width","dialogH","parseInt","dialogW","okText","cancelText","footerHTML","headerHTML","hideFooter","hiddenOk","dialogHTML","bgHTML","modal","bgHeight","document","documentElement","scrollHeight","wrap","cloneObj","clone","get","bind","_close","$buttons","undefined","ok","_bindMove","keyup","keyCode","resize","afterInit","className","mousedown","_document","getElementById","x","clientX","style","left","y","clientY","top","ondragstart","onselectstart","onselect","setCapture","captureEvents","Event","MOUSEMOVE","MOUSEUP","onmousemove","positionX","positionY","onmouseup","releaseCapture","css","close","_closeDialog","_openDialog","msg","$dialog","position","afterOpen","_updateDialog","html","defaults","key","theme","styleName","options","otherArgs","Array","slice","call","arguments","shift","apply","concat","jQuery","autocompleteMutex","tabs","getEditorByPath","click","closeOther","currentIndex","firstIndex","_removeAllMarker","removeIndex","_initClose","ZeroClipboard","button","screenX","attr","init","config","label","tip","fileName","file","confirm_save","fmt","doc","isClean","nextId","menu","disabled","cancelSelectedNode","_initCodeMirrorHotKeys","openStartPage","dateFormat","time","date","dateObj","M+","getMonth","d+","getDate","h+","getHours","m+","getMinutes","s+","getSeconds","q+","Math","floor","S","getMilliseconds","test","RegExp","$1","getFullYear","substr","k","start_page","load","context","wideSessionId","ajax","url","type","dataType","jsonp","success","textStatus","articles","listHTML","community","article","articlePermalink","articleTitle","articleCreateTime","ret","getCurrentPath","currentPath","CodeMirror","registerHelper","word","cur","curLine","getLine","start","end","charAt","request","newWideRequest","code","getValue","cursorLine","cursorCh","autocompleteHints","state","completionActive","async","JSON","stringify","autocompleteArray","displayText","name","substring","console","warn","markClean","setTimeout","list","from","Pos","to","commands","autocompleteAfterDot","cm","mode","getMode","Pass","token","getTokenAt","showHint","hint","go","completeSingle","autocompleteAnyWord","auto","gotoLine","doNothing","exprInfo","result","succ","cursorCoords","copyLinesDown","selectoion","listSelections","anchor","head","max","replaceToLine","replaceRange","offset","setSelection","copyLinesUp","moveLinesUp","moveLinesDown","lastLine","jumpToDecl","openFile","findUsages","appendSearch","selectIdentifier","findWordAt","extendSelection","searcHTML","toLowerCase","contents","lowerCaseContents","matches","split","startIndex","endIndex","j","keyWord","search_no_match","$search","find_usages","search_text","bottomGroup","searchTab","$it","half","getScrollInfo","clientHeight","defaultTextHeight","scrollTo","windows","flowBottom","newEditor","iconSkin","undisabled","textArea","value","fromTextArea","lineNumbers","autofocus","autoCloseBrackets","matchBrackets","highlightSelectionMatches","showToken","rulers","color","column","lineStyle","styleActiveLine","editorTheme","tabSize","editorTabSize","indentUnit","indentWithTabs","foldGutter","cursorHeight","readOnly","isGOAPI","profile","extraKeys","Ctrl-\\",".","Ctrl-/","Ctrl-I","Ctrl-L","Ctrl-E","Ctrl-D","Ctrl-B","Ctrl-S","saveFile","Shift-Ctrl-S","saveAllFiles","Shift-Alt-F","Alt-F7","Shift-Alt-Enter","isMaxEditor","restoreEditor","maxEditor","Shift-Ctrl-Up","Shift-Ctrl-Down","Shift-Alt-Up","Shift-Alt-Down","Shift-Alt-J","emmetCodeMirror","$span","evt","altKey","ctrlKey","shiftKey","which","autocomplete","random","setSize","setOption","keymap","notification","_initWS","notificationWS","ReconnectingWebSocket","channel","onopen","log","onmessage","e","parse","$notification","notificationHTML","cmd","severity","message","onclose","onerror","getCurrentNodeLastNode","returnNode","open","getNextShowNode","level","getParentNode","getNextNode","isBottomNode","isLastNode","nodes","transformToArray","getNodes","getOpenPaths","paths","getAllParents","parents","parentTId","isParents","parentPath","parentNode","isDir","indexOf","newFile","it","newDir","removeIt","removable","rename","export","isSucc","crossCompile","platform","decompress","dir","reAsyncChildNodes","refresh","gitClone","import","fileupload","formData","done","fail","$dirRMenu","$fileRMenu","setting","view","showTitle","selectedMulti","enable","autoParam","callback","onDblClick","treeId","treeNode","onRightClick","creatable","display","onClick","clickFlag","zTree","session","restore","_initSearch","_initRename","tempCursor","findModeByFileName","mime","error","$okBtn","closest","prop","trim","val","search","cancel","extension","select","oldPath","newPath","lastIndexOf","curProcessId","outlineHTML","decls","maxj","Ch","Line","Name","dblclick","_initDialog","confirm","create_file","create","fileType","create_dir","goto_file","$list","hotkeys","bindList","$selected","goFileHTML","icoSkin","getClassBySuffix","goto_line","git_clone","repository","outputWS","goLintFound","nextCmd","executable","fillOutput","output","pid","build_n_run","lints","files","lint","lineNo","signal","_initFooter","unbind","subMenu","onbeforeunload","oncontextmenu","_save","getOption","gofmt","beforeSend","resetOutput","stop","run","scrollInfo","setValue","formatted","html_beautify","js_beautify","css_beautify","suffix","ready","getLayoutState","paneState","isClosed","size","setInterval","filse","currentId","currentFile","layout","side","outerLayout","west","sideRight","innerLayout","east","bottom","south","latestSessionContent","nodesToOpen","jj","isOpen","l","expandNode","kk","m","mm","n","nn","c","sessionWS","addNodes","isParent","removeNode","_initPreference","_initAbout","_initShare","hover","pic","urls","email","twitterShare","encodeURIComponent","twitter","facebook","googleplus","weibo","tencent","about","wideVersion","uptodate","new_version_available","colon","wideDownload","mouseover","openPreference","closeAllFiles","exit","location","href","openAbout","goget","goinstall","govet","build","isChange","emptys","emptysTip","tabIndex","no_empty","preference","$dialogPreference","$fontFamily","$fontSize","$goFmt","$workspace","$password","$email","$locale","$theme","$editorFontFamily","$editorFontSize","$editorLineHeight","$editorTheme","$editorTabSize","$keymap","fontFamily","fontSize","goFmt","workspace","password","locale","editorFontFamily","editorFontSize","editorLineHeight","reload","jqXHR","staticServer","north__paneSelector","center__paneSelector","south__paneSelector","north__size","south__size","spacing_open","north__spacing_open","south__spacing_open","fxSpeed_open","fxSpeed_close","fxSettings_close","easing","fxSettings_open","paneSelector","togglerLength_open","togglerLength_closed","togglerAlign_closed","slideTrigger_open","spacing_closed","minSize","togglerClass","togglerTip_open","min","togglerTip_closed","restore_side","resizerTip","initClosed","center","restore_outline","restore_bottom","ondrag_end","pane","refreshEditor","onresize_end","onclose_end","onopen_end","onshow_end","addCloseBtn","maxSide","maxSideRight","maxBottom","toggleEditor","restoreBottom","restoreSide","restoreSideRight","sizePane","max_editor","editorDatas","slideOpen","defaultKeyMap","goEditor","fun","goFileTree","goOutline","goOutput","goSearch","goNotification","clearWindow","changeEditor","closeCurEditor","goFile","buildRun","$source","enterFun","keydown","index","count","scrollTop","offsetTop","_bindOutput","hotKeys","clear","preventDefault","_bindFileTree","isFirstNode","getPreNode","preNode","nextShowNode","_bindDocument","activeElement","nextPath","nextTId","_initTabs","_initFrame","$path","mouseup","offsetY","$output","Autolinker","link"],"mappings":"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","file":"wide.min.js","sourcesContent":["/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file tabs.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @version 1.0.0.1, Dec 8, 2015\r\n */\r\nvar Tabs = function (obj) {\r\n obj._$tabsPanel = $(obj.id + \" > .tabs-panel\");\r\n obj._$tabs = $(obj.id + \" > .tabs\");\r\n obj._stack = [];\r\n\r\n this.obj = obj;\r\n this.obj.STACKSIZE = 64;\r\n\r\n this._init(obj);\r\n\r\n // DOM 元素存在时,应顺序入栈\r\n var _it = this;\r\n $(obj.id + \" > .tabs > div\").each(function () {\r\n var id = $(this).data(\"index\");\r\n if (obj._stack.length === _it.obj.STACKSIZE) {\r\n obj._stack.splice(0, 1);\r\n }\r\n if (obj._stack[obj._stack.length - 1] !== id) {\r\n _it.obj._stack.push(id);\r\n }\r\n });\r\n\r\n};\r\n\r\n$.extend(Tabs.prototype, {\r\n _init: function (obj) {\r\n var _that = this;\r\n\r\n obj._$tabs.on(\"click\", \"div\", function (event) {\r\n if ($(this).hasClass('current')) {\r\n return false;\r\n }\r\n\r\n var id = $(this).data(\"index\");\r\n _that.setCurrent(id);\r\n if (typeof (obj.clickAfter) === \"function\") {\r\n obj.clickAfter(id);\r\n }\r\n });\r\n\r\n obj._$tabs.on(\"click\", \".ico-close\", function (event) {\r\n var id = $(this).parent().data(\"index\"),\r\n isRemove = true;\r\n\r\n if (typeof obj.removeBefore === 'function') {\r\n isRemove = obj.removeBefore(id);\r\n }\r\n\r\n if (isRemove) {\r\n _that.del(id);\r\n }\r\n event.stopPropagation();\r\n });\r\n },\r\n _hasId: function (id) {\r\n var $tabs = this.obj._$tabs;\r\n if ($tabs.find('div[data-index=\"' + id + '\"]').length === 0) {\r\n return false;\r\n }\r\n return true;\r\n },\r\n add: function (data) {\r\n // 添加当前 tab\r\n if (this.getCurrentId() === data.id) {\r\n return false;\r\n }\r\n\r\n // 当前 tab 已经存在\r\n if (this._hasId(data.id)) {\r\n this.setCurrent(data.id);\r\n return false;\r\n }\r\n\r\n var $tabsPanel = this.obj._$tabsPanel,\r\n $tabs = this.obj._$tabs;\r\n\r\n $tabs.append('<div data-index=\"' + data.id + '\">'\r\n + data.title + ' <span class=\"ico-close font-ico\"></span></div>');\r\n $tabsPanel.append('<div data-index=\"' + data.id + '\">' + data.content\r\n + '</div>');\r\n\r\n this.setCurrent(data.id);\r\n\r\n if (typeof data.after === 'function') {\r\n data.after();\r\n }\r\n },\r\n del: function (id) {\r\n var $tabsPanel = this.obj._$tabsPanel,\r\n $tabs = this.obj._$tabs,\r\n stack = this.obj._stack,\r\n prevId = null;\r\n\r\n $tabs.children(\"div[data-index='\" + id + \"']\").remove();\r\n $tabsPanel.children(\"div[data-index='\" + id + \"']\").remove();\r\n\r\n // 移除堆栈中该 id\r\n for (var i = 0; i < stack.length; i++) {\r\n if (id === stack[i]) {\r\n stack.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n\r\n prevId = stack[stack.length - 1];\r\n\r\n if (typeof this.obj.removeAfter === 'function') {\r\n this.obj.removeAfter(id, prevId);\r\n }\r\n\r\n this.setCurrent(prevId);\r\n },\r\n getCurrentId: function () {\r\n var $tabs = this.obj._$tabs;\r\n return $tabs.children(\".current\").data(\"index\");\r\n },\r\n setCurrent: function (path) {\r\n if (!path) {\r\n return false;\r\n }\r\n\r\n var $tabsPanel = this.obj._$tabsPanel,\r\n $tabs = this.obj._$tabs;\r\n\r\n var $currentTab = $tabs.children(\".current\");\r\n if ($currentTab.data(\"index\") === path) {\r\n return false;\r\n }\r\n\r\n // tab 顺序入栈,如栈满则清除\r\n var stack = this.obj._stack;\r\n if (stack.length === this.obj.STACKSIZE) {\r\n stack.splice(0, 1);\r\n }\r\n if (stack[stack.length - 1] !== path) {\r\n this.obj._stack.push(path);\r\n }\r\n\r\n $tabs.children(\"div\").removeClass(\"current\");\r\n $tabsPanel.children(\"div\").hide();\r\n\r\n $tabs.children('div[data-index=\"' + path + '\"]').addClass(\"current\");\r\n $tabsPanel.children('div[data-index=\"' + path + '\"]').show();\r\n\r\n if (typeof this.obj.setAfter === 'function') {\r\n this.obj.setAfter();\r\n }\r\n\r\n var id = this.getCurrentId();\r\n if (\"startPage\" === id) {\r\n return;\r\n }\r\n\r\n // set tree node selected\r\n var tId = tree.getTIdByPath(id);\r\n var node = tree.fileTree.getNodeByTId(tId);\r\n tree.fileTree.selectNode(node);\r\n wide.curNode = node;\r\n\r\n for (var i = 0, ii = editors.data.length; i < ii; i++) {\r\n if (editors.data[i].id === id) {\r\n wide.curEditor = editors.data[i].editor;\r\n break;\r\n }\r\n }\r\n\r\n if (wide.curEditor) {\r\n var cursor = wide.curEditor.getCursor();\r\n wide.curEditor.setCursor(cursor);\r\n wide.curEditor.focus();\r\n wide.refreshOutline();\r\n\r\n $(\".footer .cursor\").text('| ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + ' |');\r\n }\r\n }\r\n});","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file dialog.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @version 1.0.0.1, Dec 8, 2015\r\n */\r\n(function ($) {\r\n $.fn.extend({\r\n dialog: {\r\n version: \"0.0.1.7\",\r\n author: \"lly219@gmail.com\"\r\n }\r\n });\r\n\r\n var dpuuid = new Date().getTime();\r\n var PROP_NAME = 'dialog';\r\n\r\n var Dialog = function () {\r\n this._defaults = {\r\n \"styleClass\": {\r\n \"background\": \"dialog-background\",\r\n \"panel\": \"dialog-panel\",\r\n \"main\": \"dialog-main\",\r\n \"footer\": \"dialog-footer\",\r\n \"headerMiddle\": \"dialog-header-middle\",\r\n \"headerBg\": \"dialog-header-bg\",\r\n \"closeIcon\": \"dialog-close-icon\",\r\n \"closeIconHover\": \"dialog-close-icon-hover\",\r\n \"title\": \"dialog-title\"\r\n }\r\n };\r\n };\r\n\r\n $.extend(Dialog.prototype, {\r\n _attach: function (target, settings) {\r\n if (!target.id) {\r\n this.uuid++;\r\n target.id = 'dp' + this.uuid;\r\n }\r\n var inst = this._newInst($(target));\r\n\r\n inst.settings = $.extend({}, settings || {});\r\n $.data(target, PROP_NAME, inst);\r\n this._init(target);\r\n },\r\n /* Create a new instance object. */\r\n _newInst: function (target) {\r\n // escape jQuery meta chars\r\n var id = target[0].id.replace(/([^A-Za-z0-9_])/g, '\\\\\\\\$1');\r\n return {\r\n id: id\r\n };\r\n },\r\n _getInst: function (target) {\r\n try {\r\n return $.data(target, PROP_NAME);\r\n } catch (err) {\r\n throw 'Missing instance data for this dialog';\r\n }\r\n },\r\n _destroyDialog: function (target) {\r\n var inst = $.dialog._getInst(target);\r\n var id = inst.id;\r\n $.removeData(target, PROP_NAME);\r\n\r\n $(target).prependTo(\"#\" + id + \"Wrap\").unwrap();\r\n $(target).removeAttr(\"style\");\r\n\r\n var styleClass = this._getDefaults($.dialog._defaults, inst.settings, \"styleClass\");\r\n $(\".\" + styleClass.background).remove();\r\n $(\"#\" + id + \"Dialog\").remove();\r\n },\r\n _init: function (target) {\r\n var inst = this._getInst(target);\r\n var id = inst.id,\r\n settings = inst.settings;\r\n var windowH = $(window).height(),\r\n windowW = $(window).width();\r\n var styleClass = this._getDefaults($.dialog._defaults, settings, \"styleClass\"),\r\n dialogH = settings.height ? settings.height : parseInt(windowH * 0.6),\r\n dialogW = settings.width ? settings.width : parseInt(windowW * 0.6);\r\n\r\n // get settings or default value.\r\n settings.title = settings.title ? settings.title : \"\";\r\n settings.okText = settings.okText ? settings.okText : \"Ok\";\r\n settings.cancelText = settings.cancelText ? settings.cancelText : \"Cancel\";\r\n\r\n // build HTML.\r\n var footerHTML = \"\",\r\n headerHTML = \"<div class='\"\r\n + styleClass.headerBg + \"'><div class='\"\r\n + styleClass.title + \"'>\"\r\n + settings.title + \"</div><a href='javascript:void(0);' class='ico-close font-ico \"\r\n + styleClass.closeIcon + \"'></a></div>\";\r\n\r\n // Sets footerHTML.\r\n if (!settings.hideFooter) {\r\n if (!settings.hiddenOk) {\r\n footerHTML = \"<button>\" + settings.okText +\r\n \"</button>\";\r\n }\r\n footerHTML += \"<button>\"\r\n + settings.cancelText + \"</button>\";\r\n }\r\n\r\n var dialogHTML = \"<div id='\" + id + \"Dialog' class='\" + styleClass.panel\r\n + \"' style='width: \" + dialogW + \"px;' onselectstart='return false;'>\" + headerHTML\r\n + \"<div class='\" + styleClass.main + \"'><div style='overflow: auto; height: \"\r\n + dialogH + \"px;'></div><div class='\" + styleClass.footer + \"'>\"\r\n + footerHTML + \"</div></div>\";\r\n\r\n var bgHTML = \"\";\r\n if (settings.modal && $(\".\" + styleClass.background).length === 0) {\r\n var bgHeight = windowH < document.documentElement.scrollHeight\r\n ? document.documentElement.scrollHeight : windowH;\r\n bgHTML = \"<div style='height:\" + bgHeight\r\n + \"px;' class='\" + styleClass.background + \"'></div>\";\r\n }\r\n\r\n // Package dialog.\r\n $(\"#\" + id).wrap(\"<div id='\" + id + \"Wrap'></div>\");\r\n var cloneObj = $(target).clone(true);\r\n $(target).remove();\r\n $('body').append(bgHTML + dialogHTML);\r\n $($(\"#\" + id + \"Dialog .\" + styleClass.main + \" div\").get(0)).append(cloneObj);\r\n $(cloneObj).show();\r\n\r\n // Bind event.\r\n $(\"#\" + id + \"Dialog .\" + styleClass.closeIcon).bind(\"click\", function () {\r\n $.dialog._close(id, settings);\r\n });\r\n\r\n var $buttons = $(\"#\" + id + \"Dialog .\" + styleClass.footer + \" button\");\r\n $($buttons.get(1)).bind(\"click\", function () {\r\n $.dialog._close(id, settings);\r\n });\r\n\r\n $($buttons.get(0)).bind(\"click\", function () {\r\n if (settings.ok === undefined || settings.ok()) {\r\n $.dialog._close(id, settings);\r\n }\r\n });\r\n\r\n this._bindMove(id, styleClass.headerBg, dialogH, dialogW);\r\n\r\n // esc exit\r\n $(window).keyup(function (event) {\r\n if (event.keyCode === 27) {\r\n $.dialog._close(id, settings);\r\n }\r\n });\r\n\r\n $(window).resize(function () {\r\n var height = $(\"body\").height() > $(window).height() ? $(\"body\").height() : $(window).height();\r\n $(\".dialog-background\").height(height);\r\n });\r\n\r\n if (typeof settings.afterInit === \"function\") {\r\n settings.afterInit();\r\n }\r\n },\r\n _bindMove: function (id, className) {\r\n $(\"#\" + id + \"Dialog .\" + className).mousedown(function (event) {\r\n var _document = document;\r\n if (!event) {\r\n event = window.event;\r\n }\r\n var dialog = document.getElementById(id + \"Dialog\");\r\n var x = event.clientX - parseInt(dialog.style.left),\r\n y = event.clientY - parseInt(dialog.style.top);\r\n _document.ondragstart = \"return false;\";\r\n _document.onselectstart = \"return false;\";\r\n _document.onselect = \"document.selection.empty();\";\r\n\r\n if (this.setCapture) {\r\n this.setCapture();\r\n } else if (window.captureEvents) {\r\n window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);\r\n }\r\n\r\n _document.onmousemove = function (event) {\r\n if (!event) {\r\n event = window.event;\r\n }\r\n var positionX = event.clientX - x,\r\n positionY = event.clientY - y;\r\n if (positionX < 0) {\r\n positionX = 0;\r\n }\r\n if (positionX > $(window).width() - $(dialog).width()) {\r\n positionX = $(window).width() - $(dialog).width();\r\n }\r\n if (positionY > $(window).height() - $(dialog).height()) {\r\n positionY = $(window).height() - $(dialog).height();\r\n }\r\n if (positionY < 0) {\r\n positionY = 0;\r\n }\r\n dialog.style.left = positionX + \"px\";\r\n dialog.style.top = positionY + \"px\";\r\n };\r\n\r\n _document.onmouseup = function () {\r\n if (this.releaseCapture) {\r\n this.releaseCapture();\r\n } else if (window.captureEvents) {\r\n window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);\r\n }\r\n _document.onmousemove = null;\r\n _document.onmouseup = null;\r\n _document.ondragstart = null;\r\n _document.onselectstart = null;\r\n _document.onselect = null;\r\n };\r\n });\r\n },\r\n _close: function (id, settings) {\r\n if ($(\"#\" + id + \"Dialog\").css(\"display\") === \"none\") {\r\n return;\r\n }\r\n if (settings.close === undefined || settings.close()) {\r\n $(\"#\" + id + \"Dialog\").hide();\r\n if (settings.modal) {\r\n var styleClass = this._getDefaults($.dialog._defaults, settings, \"styleClass\");\r\n $(\".\" + styleClass.background).hide();\r\n }\r\n }\r\n },\r\n _closeDialog: function (target) {\r\n var inst = this._getInst(target);\r\n var id = inst.id,\r\n settings = inst.settings;\r\n $.dialog._close(id, settings);\r\n },\r\n _openDialog: function (target, msg) {\r\n var inst = this._getInst(target);\r\n var id = inst.id,\r\n settings = inst.settings,\r\n top = \"\", left = \"\",\r\n $dialog = $(\"#\" + id + \"Dialog\"),\r\n windowH = $(window).height(),\r\n windowW = $(window).width(),\r\n dialogH = settings.height ? settings.height : parseInt(windowH * 0.6),\r\n dialogW = settings.width ? settings.width : parseInt(windowW * 0.6);\r\n\r\n // Sets position.\r\n if (settings.position) {\r\n top = settings.position.top;\r\n left = settings.position.left;\r\n } else {\r\n // 20(footer) + 23(header)\r\n top = parseInt((windowH - dialogH - 43) / 2);\r\n if (top < 0) {\r\n top = 0;\r\n }\r\n left = parseInt((windowW - dialogW) / 2);\r\n }\r\n $dialog.css({\r\n \"top\": top + \"px\",\r\n \"left\": left + \"px\"\r\n }).show();\r\n\r\n if (settings.modal) {\r\n var styleClass = this._getDefaults($.dialog._defaults, settings, \"styleClass\");\r\n $(\".\" + styleClass.background).show();\r\n }\r\n\r\n if (typeof settings.afterOpen === \"function\") {\r\n settings.afterOpen(msg);\r\n }\r\n\r\n $(\"#\" + id + \"Dialog .dialog-footer button:eq(0)\").focus();\r\n },\r\n _updateDialog: function (target, data) {\r\n var inst = this._getInst(target);\r\n var id = inst.id,\r\n settings = inst.settings;\r\n var styleClass = this._getDefaults($.dialog._defaults, settings, \"styleClass\");\r\n $.extend(settings, data);\r\n var $dialog = $(\"#\" + id + \"Dialog\");\r\n if (data.position) {\r\n $dialog.css({\r\n \"top\": data.position.top,\r\n \"left\": data.position.left\r\n });\r\n }\r\n\r\n if (data.width) {\r\n $dialog.width(data.width + 26);\r\n $dialog.find(\".\" + styleClass.main + \" div\")[0].style.width = data.width + \"px\";\r\n $dialog.find(\".\" + styleClass.headerBg).width(data.width + 18);\r\n }\r\n\r\n if (data.height) {\r\n $dialog.find(\".\" + styleClass.main + \" div\")[0].style.height = data.height + \"px\";\r\n }\r\n\r\n if (data.title) {\r\n $dialog.find(\".\" + styleClass.title).html(data.title);\r\n }\r\n\r\n if (data.modal !== undefined) {\r\n if (data.modal) {\r\n $(\".\" + styleClass.background).show();\r\n } else {\r\n $(\".\" + styleClass.background).hide();\r\n }\r\n }\r\n\r\n if (data.hideFooter !== undefined) {\r\n if (data.hideFooter) {\r\n $dialog.find(\".\" + styleClass.footer).hide();\r\n } else {\r\n $dialog.find(\".\" + styleClass.footer).show();\r\n }\r\n }\r\n\r\n },\r\n _getDefaults: function (defaults, settings, key) {\r\n if (key === \"styleClass\") {\r\n if (settings.theme === \"default\" || settings.theme === undefined) {\r\n return defaults.styleClass;\r\n }\r\n settings.styleClass = {};\r\n for (var styleName in defaults[key]) {\r\n settings.styleClass[styleName] = settings.theme + \"-\" + defaults.styleClass[styleName];\r\n }\r\n } else if (key === \"height\" || key === \"width\") {\r\n if (settings[key] === null || settings[key] === undefined) {\r\n return \"auto\";\r\n } else {\r\n return settings[key] + \"px\";\r\n }\r\n } else {\r\n if (settings[key] === null || settings[key] === undefined) {\r\n return defaults[key];\r\n }\r\n }\r\n return settings[key];\r\n }\r\n });\r\n\r\n $.fn.dialog = function (options) {\r\n var otherArgs = Array.prototype.slice.call(arguments);\r\n\r\n if (typeof options === 'string') {\r\n otherArgs.shift();\r\n return $.dialog['_' + options + 'Dialog'].apply($.dialog, [this[0]].concat(otherArgs));\r\n }\r\n return this.each(function () {\r\n $.dialog._attach(this, options);\r\n });\r\n };\r\n\r\n $.dialog = new Dialog();\r\n\r\n // Add another global to avoid noConflict issues with inline event handlers\r\n window['DP_jQuery_' + dpuuid] = $;\r\n})(jQuery);","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file editor.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\r\n * @version 1.1.0.0, Dec 6, 2015\r\n */\r\nvar editors = {\r\n autocompleteMutex: false,\r\n data: [],\r\n tabs: {},\r\n getEditorByPath: function (path) {\r\n for (var i = 0, ii = editors.data.length; i < ii; i++) {\r\n if (editors.data[i].editor.options.path === path) {\r\n return editors.data[i].editor;\r\n }\r\n }\r\n },\r\n close: function () {\r\n $('.edit-panel .tabs > div[data-index=\"' + $('.edit-panel .frame').data('index') + ']').find('.ico-close').click();\r\n },\r\n closeOther: function () {\r\n var currentIndex = $(\".edit-panel .frame\").data(\"index\");\r\n\r\n // 设置全部关闭标识\r\n var removeData = [];\r\n $(\".edit-panel .tabs > div\").each(function (i) {\r\n if (currentIndex !== $(this).data(\"index\")) {\r\n removeData.push($(this).data(\"index\"));\r\n }\r\n });\r\n if (removeData.length === 0) {\r\n return false;\r\n }\r\n var firstIndex = removeData.splice(0, 1);\r\n $(\"#dialogCloseEditor\").data(\"removeData\", removeData);\r\n // 开始关闭\r\n $('.edit-panel .tabs > div[data-index=\"' + firstIndex + '\"]').find(\".ico-close\").click();\r\n },\r\n _removeAllMarker: function () {\r\n var removeData = $(\"#dialogCloseEditor\").data(\"removeData\");\r\n if (removeData && removeData.length > 0) {\r\n var removeIndex = removeData.splice(0, 1);\r\n $(\"#dialogCloseEditor\").data(\"removeData\", removeData);\r\n $('.edit-panel .tabs > div[data-index=\"' + removeIndex + '\"] .ico-close').click();\r\n }\r\n if (wide.curEditor) {\r\n wide.curEditor.focus();\r\n }\r\n },\r\n _initClose: function () {\r\n new ZeroClipboard($(\"#copyFilePath\"));\r\n\r\n // 关闭、关闭其他、关闭所有\r\n $(\".edit-panel\").on(\"mouseup\", '.tabs > div', function (event) {\r\n event.stopPropagation();\r\n\r\n if (event.button === 0) { // 左键\r\n $(\".edit-panel .frame\").hide();\r\n return false;\r\n }\r\n\r\n // event.button === 2 右键\r\n var left = event.screenX;\r\n if ($(\".side\").css(\"left\") === \"auto\" || $(\".side\").css(\"left\") === \"0px\") {\r\n left = event.screenX - $(\".side\").width();\r\n }\r\n $(\".edit-panel .frame\").show().css({\r\n \"left\": left + \"px\",\r\n \"top\": \"21px\"\r\n }).data('index', $(this).data(\"index\"));\r\n\r\n $(\"#copyFilePath\").attr('data-clipboard-text', $(this).find(\"span:eq(0)\").attr(\"title\"));\r\n return false;\r\n });\r\n },\r\n init: function () {\r\n $(\"#dialogCloseEditor\").dialog({\r\n \"modal\": true,\r\n \"height\": 90,\r\n \"width\": 260,\r\n \"title\": config.label.tip,\r\n \"hideFooter\": true,\r\n \"afterOpen\": function (fileName) {\r\n $(\"#dialogCloseEditor > div:eq(0)\").html(config.label.file\r\n + ' <b>' + fileName + '</b>. ' + config.label.confirm_save + '?');\r\n $(\"#dialogCloseEditor button:eq(0)\").focus();\r\n },\r\n \"afterInit\": function () {\r\n $(\"#dialogCloseEditor button.save\").click(function () {\r\n var i = $(\"#dialogCloseEditor\").data(\"index\");\r\n wide.fmt(editors.data[i].id, editors.data[i].editor);\r\n editors.tabs.del(editors.data[i].id);\r\n $(\"#dialogCloseEditor\").dialog(\"close\");\r\n editors._removeAllMarker();\r\n });\r\n\r\n $(\"#dialogCloseEditor button.discard\").click(function () {\r\n var i = $(\"#dialogCloseEditor\").data(\"index\");\r\n editors.tabs.del(editors.data[i].id);\r\n $(\"#dialogCloseEditor\").dialog(\"close\");\r\n editors._removeAllMarker();\r\n });\r\n\r\n $(\"#dialogCloseEditor button.cancel\").click(function (event) {\r\n $(\"#dialogCloseEditor\").dialog(\"close\");\r\n editors._removeAllMarker();\r\n });\r\n }\r\n });\r\n\r\n editors.tabs = new Tabs({\r\n id: \".edit-panel\",\r\n setAfter: function () {\r\n if (wide.curEditor) {\r\n wide.curEditor.focus();\r\n }\r\n },\r\n clickAfter: function (id) {\r\n if (id === 'startPage') {\r\n wide.curEditor = undefined;\r\n $(\".footer .cursor\").text('');\r\n wide.refreshOutline();\r\n \r\n return false;\r\n }\r\n },\r\n removeBefore: function (id) {\r\n if (id === 'startPage') { // 当前关闭的 tab 是起始页\r\n editors._removeAllMarker();\r\n return true;\r\n }\r\n\r\n for (var i = 0, ii = editors.data.length; i < ii; i++) {\r\n if (editors.data[i].id === id) {\r\n if (editors.data[i].editor.doc.isClean()) {\r\n editors._removeAllMarker();\r\n return true;\r\n } else {\r\n $(\"#dialogCloseEditor\").dialog(\"open\", $('.edit-panel .tabs > div[data-index=\"'\r\n + editors.data[i].id + '\"] > span:eq(0)').text());\r\n $(\"#dialogCloseEditor\").data(\"index\", i);\r\n return false;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n },\r\n removeAfter: function (id, nextId) {\r\n if ($(\".edit-panel .tabs > div\").length === 0) {\r\n // 全部 tab 都关闭时才 disables 菜单中“全部关闭”的按钮\r\n menu.disabled(['close-all']);\r\n }\r\n\r\n // 移除编辑器\r\n for (var i = 0, ii = editors.data.length; i < ii; i++) {\r\n if (editors.data[i].id === id) {\r\n editors.data.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n if (editors.data.length === 0) { // 起始页可能存在,所以用编辑器数据判断\r\n menu.disabled(['save-all', 'build', 'run', 'go-test', 'go-vet', 'go-get', 'go-install',\r\n 'find', 'find-next', 'find-previous', 'replace', 'replace-all',\r\n 'format', 'autocomplete', 'jump-to-decl', 'expr-info', 'find-usages', 'toggle-comment',\r\n 'edit']);\r\n\r\n // remove selected tree node\r\n tree.fileTree.cancelSelectedNode();\r\n wide.curNode = undefined;\r\n wide.curEditor = undefined;\r\n wide.refreshOutline();\r\n $(\".footer .cursor\").text('');\r\n return false;\r\n }\r\n\r\n if (!nextId) {\r\n // 编辑器区域不存在打开的 Tab\r\n // remove selected tree node\r\n tree.fileTree.cancelSelectedNode();\r\n wide.curNode = undefined;\r\n wide.curEditor = undefined;\r\n wide.refreshOutline();\r\n $(\".footer .cursor\").text('');\r\n return false;\r\n }\r\n\r\n if (nextId === editors.tabs.getCurrentId()) {\r\n // 关闭的不是当前编辑器\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n this._initCodeMirrorHotKeys();\r\n this.openStartPage();\r\n this._initClose();\r\n },\r\n openStartPage: function () {\r\n wide.curEditor = undefined;\r\n wide.refreshOutline();\r\n $(\".footer .cursor\").text('');\r\n\r\n var dateFormat = function (time, fmt) {\r\n var date = new Date(time);\r\n var dateObj = {\r\n \"M+\": date.getMonth() + 1, //月份 \r\n \"d+\": date.getDate(), //日 \r\n \"h+\": date.getHours(), //小时 \r\n \"m+\": date.getMinutes(), //分 \r\n \"s+\": date.getSeconds(), //秒 \r\n \"q+\": Math.floor((date.getMonth() + 3) / 3), //季度 \r\n \"S\": date.getMilliseconds() //毫秒 \r\n };\r\n if (/(y+)/.test(fmt))\r\n fmt = fmt.replace(RegExp.$1, (date.getFullYear() + \"\").substr(4 - RegExp.$1.length));\r\n for (var k in dateObj)\r\n if (new RegExp(\"(\" + k + \")\").test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1)\r\n ? (dateObj[k]) : ((\"00\" + dateObj[k]).substr((\"\" + dateObj[k]).length)));\r\n }\r\n return fmt;\r\n };\r\n\r\n editors.tabs.add({\r\n id: \"startPage\",\r\n title: '<span title=\"' + config.label.start_page\r\n + '\"><span class=\"ico-start font-ico\"></span> ' + config.label.start_page + '</span>',\r\n content: '<div id=\"startPage\"></div>',\r\n after: function () {\r\n $(\"#startPage\").load(config.context + '/start?sid=' + config.wideSessionId);\r\n $.ajax({\r\n url: \"https://symphony.b3log.org/apis/articles?tags=wide,golang&p=1&size=20\",\r\n type: \"GET\",\r\n dataType: \"jsonp\",\r\n jsonp: \"callback\",\r\n success: function (data, textStatus) {\r\n var articles = data.articles;\r\n if (0 === articles.length) {\r\n return;\r\n }\r\n\r\n // 按 size = 20 取,但只保留最多 9 篇\r\n var length = articles.length;\r\n if (length > 9) {\r\n length = 9;\r\n }\r\n\r\n var listHTML = \"<ul><li class='title'>\" + config.label.community + \"</li>\";\r\n for (var i = 0; i < length; i++) {\r\n var article = articles[i];\r\n listHTML += \"<li>\"\r\n + \"<a target='_blank' href='http://hacpai.com\"\r\n + article.articlePermalink + \"'>\"\r\n + article.articleTitle + \"</a>&nbsp; <span class='date'>\"\r\n + dateFormat(article.articleCreateTime, 'yyyy-MM-dd');\r\n +\"</span></li>\";\r\n }\r\n\r\n $(\"#startPage .news\").html(listHTML + \"</ul>\");\r\n }\r\n });\r\n }\r\n });\r\n },\r\n getCurrentId: function () {\r\n var ret = editors.tabs.getCurrentId();\r\n if (ret === 'startPage') {\r\n ret = null;\r\n }\r\n \r\n return ret;\r\n },\r\n getCurrentPath: function () {\r\n var currentPath = $(\".edit-panel .tabs .current span:eq(0)\").attr(\"title\");\r\n if (currentPath === config.label.start_page) {\r\n currentPath = null;\r\n }\r\n return currentPath;\r\n },\r\n _initCodeMirrorHotKeys: function () {\r\n CodeMirror.registerHelper(\"hint\", \"go\", function (editor) {\r\n editor = wide.curEditor; // 使用当前编辑器覆盖实参,因为异步调用的原因,实参不一定正确\r\n var word = /[\\w$]+/;\r\n\r\n var cur = editor.getCursor(), curLine = editor.getLine(cur.line);\r\n\r\n var start = cur.ch, end = start;\r\n while (end < curLine.length && word.test(curLine.charAt(end))) {\r\n ++end;\r\n }\r\n while (start && word.test(curLine.charAt(start - 1))) {\r\n --start;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.path = $(\".edit-panel .tabs .current > span:eq(0)\").attr(\"title\");\r\n request.code = editor.getValue();\r\n request.cursorLine = cur.line;\r\n request.cursorCh = cur.ch;\r\n\r\n var autocompleteHints = [];\r\n\r\n if (editors.autocompleteMutex && editor.state.completionActive) {\r\n return;\r\n }\r\n\r\n editors.autocompleteMutex = true;\r\n\r\n $.ajax({\r\n async: false, // 同步执行\r\n type: 'POST',\r\n url: config.context + '/autocomplete',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (data) {\r\n var autocompleteArray = data[1];\r\n\r\n if (autocompleteArray) {\r\n for (var i = 0; i < autocompleteArray.length; i++) {\r\n var displayText = '',\r\n text = autocompleteArray[i].name;\r\n\r\n switch (autocompleteArray[i].class) {\r\n case \"type\":\r\n displayText = '<span class=\"fn-clear\"><span class=\"ico-type ico\"></span>'// + autocompleteArray[i].class \r\n + '<b>' + autocompleteArray[i].name + '</b> '\r\n + autocompleteArray[i].type + '</span>';\r\n break;\r\n case \"const\":\r\n displayText = '<span class=\"fn-clear\"><span class=\"ico-const ico\"></span>'// + autocompleteArray[i].class \r\n + '<b>' + autocompleteArray[i].name + '</b> '\r\n + autocompleteArray[i].type + '</span>';\r\n break;\r\n case \"var\":\r\n displayText = '<span class=\"fn-clear\"><span class=\"ico-var ico\"></span>'// + autocompleteArray[i].class \r\n + '<b>' + autocompleteArray[i].name + '</b> '\r\n + autocompleteArray[i].type + '</span>';\r\n break;\r\n case \"package\":\r\n displayText = '<span class=\"fn-clear\"><span class=\"ico-package ico\"></span>'// + autocompleteArray[i].class \r\n + '<b>' + autocompleteArray[i].name + '</b> '\r\n + autocompleteArray[i].type + '</span>';\r\n break;\r\n case \"func\":\r\n displayText = '<span><span class=\"ico-func ico\"></span>'// + autocompleteArray[i].class \r\n + '<b>' + autocompleteArray[i].name + '</b>'\r\n + autocompleteArray[i].type.substring(4) + '</span>';\r\n text += '()';\r\n break;\r\n default:\r\n console.warn(\"Can't handle autocomplete [\" + autocompleteArray[i].class + \"]\");\r\n break;\r\n }\r\n\r\n autocompleteHints[i] = {\r\n displayText: displayText,\r\n text: text\r\n };\r\n }\r\n }\r\n\r\n editor.doc.markClean();\r\n $(\".edit-panel .tabs .current > span:eq(0)\").removeClass(\"changed\");\r\n }\r\n });\r\n\r\n setTimeout(function () {\r\n editors.autocompleteMutex = false;\r\n }, 20);\r\n\r\n return {list: autocompleteHints, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)};\r\n });\r\n\r\n CodeMirror.commands.autocompleteAfterDot = function (cm) {\r\n var mode = cm.getMode();\r\n if (mode && \"go\" !== mode.name) {\r\n return CodeMirror.Pass;\r\n }\r\n\r\n var token = cm.getTokenAt(cm.getCursor());\r\n\r\n if (\"comment\" === token.type || \"string\" === token.type) {\r\n return CodeMirror.Pass;\r\n }\r\n\r\n setTimeout(function () {\r\n if (!cm.state.completionActive) {\r\n cm.showHint({hint: CodeMirror.hint.go, completeSingle: false});\r\n }\r\n }, 50);\r\n\r\n return CodeMirror.Pass;\r\n };\r\n\r\n CodeMirror.commands.autocompleteAnyWord = function (cm) {\r\n cm.showHint({hint: CodeMirror.hint.auto});\r\n };\r\n\r\n CodeMirror.commands.gotoLine = function (cm) {\r\n $(\"#dialogGoLinePrompt\").dialog(\"open\");\r\n };\r\n\r\n // 用于覆盖 cm 默认绑定的某些快捷键功能.\r\n CodeMirror.commands.doNothing = function (cm) {\r\n };\r\n\r\n CodeMirror.commands.exprInfo = function (cm) {\r\n var cur = wide.curEditor.getCursor();\r\n\r\n var request = newWideRequest();\r\n request.path = $(\".edit-panel .tabs .current > span:eq(0)\").attr(\"title\");\r\n request.code = wide.curEditor.getValue();\r\n request.cursorLine = cur.line;\r\n request.cursorCh = cur.ch;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/exprinfo',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n return;\r\n }\r\n \r\n var position = wide.curEditor.cursorCoords();\r\n $(\"body\").append('<div style=\"top:'\r\n + (position.top + 15) + 'px;left:' + position.left\r\n + 'px\" class=\"edit-exprinfo\">' + result.data + '</div>');\r\n }\r\n });\r\n };\r\n\r\n CodeMirror.commands.copyLinesDown = function (cm) {\r\n var content = '',\r\n selectoion = cm.listSelections()[0];\r\n\r\n var from = selectoion.anchor,\r\n to = selectoion.head;\r\n if (from.line > to.line) {\r\n from = selectoion.head;\r\n to = selectoion.anchor;\r\n }\r\n\r\n for (var i = from.line, max = to.line; i <= max; i++) {\r\n if (to.ch !== 0 || i !== max) { // 下一行选中为0时不应添加内容\r\n content += '\\n' + cm.getLine(i);\r\n }\r\n }\r\n // 下一行选中为0时应添加到上一行末\r\n var replaceToLine = to.line;\r\n if (to.ch === 0) {\r\n replaceToLine = to.line - 1;\r\n }\r\n cm.replaceRange(content, CodeMirror.Pos(replaceToLine));\r\n\r\n var offset = replaceToLine - from.line + 1;\r\n cm.setSelection(CodeMirror.Pos(from.line + offset, from.ch),\r\n CodeMirror.Pos(to.line + offset, to.ch));\r\n };\r\n\r\n CodeMirror.commands.copyLinesUp = function (cm) {\r\n var content = '',\r\n selectoion = cm.listSelections()[0];\r\n\r\n var from = selectoion.anchor,\r\n to = selectoion.head;\r\n if (from.line > to.line) {\r\n from = selectoion.head;\r\n to = selectoion.anchor;\r\n }\r\n\r\n for (var i = from.line, max = to.line; i <= max; i++) {\r\n if (to.ch !== 0 || i !== max) { // 下一行选中为0时不应添加内容\r\n content += '\\n' + cm.getLine(i);\r\n }\r\n }\r\n\r\n // 下一行选中为0时应添加到上一行末\r\n var replaceToLine = to.line;\r\n if (to.ch === 0) {\r\n replaceToLine = to.line - 1;\r\n }\r\n cm.replaceRange(content, CodeMirror.Pos(replaceToLine));\r\n\r\n cm.setSelection(CodeMirror.Pos(from.line, from.ch),\r\n CodeMirror.Pos(to.line, to.ch));\r\n };\r\n\r\n CodeMirror.commands.moveLinesUp = function (cm) {\r\n var selectoion = cm.listSelections()[0];\r\n\r\n var from = selectoion.anchor,\r\n to = selectoion.head;\r\n if (from.line > to.line) {\r\n from = selectoion.head;\r\n to = selectoion.anchor;\r\n }\r\n\r\n if (from.line === 0) {\r\n return false;\r\n }\r\n // 下一行选中为0时应添加到上一行末\r\n var replaceToLine = to.line;\r\n if (to.ch === 0) {\r\n replaceToLine = to.line - 1;\r\n }\r\n cm.replaceRange('\\n' + cm.getLine(from.line - 1), CodeMirror.Pos(replaceToLine));\r\n if (from.line === 1) {\r\n // 移除第一行的换行\r\n cm.replaceRange('', CodeMirror.Pos(0, 0),\r\n CodeMirror.Pos(1, 0));\r\n } else {\r\n cm.replaceRange('', CodeMirror.Pos(from.line - 2, cm.getLine(from.line - 2).length),\r\n CodeMirror.Pos(from.line - 1, cm.getLine(from.line - 1).length));\r\n }\r\n\r\n cm.setSelection(CodeMirror.Pos(from.line - 1, from.ch),\r\n CodeMirror.Pos(to.line - 1, to.ch));\r\n };\r\n\r\n CodeMirror.commands.moveLinesDown = function (cm) {\r\n var selectoion = cm.listSelections()[0];\r\n\r\n var from = selectoion.anchor,\r\n to = selectoion.head;\r\n if (from.line > to.line) {\r\n from = selectoion.head;\r\n to = selectoion.anchor;\r\n }\r\n\r\n if (to.line === cm.lastLine()) {\r\n return false;\r\n }\r\n\r\n // 下一行选中为0时应添加到上一行末\r\n var replaceToLine = to.line;\r\n if (to.ch === 0) {\r\n replaceToLine = to.line - 1;\r\n }\r\n // 把选中的下一行添加到选中区域的上一行\r\n if (from.line === 0) {\r\n cm.replaceRange(cm.getLine(replaceToLine + 1) + '\\n', CodeMirror.Pos(0, 0));\r\n } else {\r\n cm.replaceRange('\\n' + cm.getLine(replaceToLine + 1), CodeMirror.Pos(from.line - 1));\r\n }\r\n // 删除选中的下一行\r\n cm.replaceRange('', CodeMirror.Pos(replaceToLine + 1, cm.getLine(replaceToLine + 1).length),\r\n CodeMirror.Pos(replaceToLine + 2, cm.getLine(replaceToLine + 2).length));\r\n\r\n cm.setSelection(CodeMirror.Pos(from.line + 1, from.ch),\r\n CodeMirror.Pos(to.line + 1, to.ch));\r\n };\r\n\r\n CodeMirror.commands.jumpToDecl = function (cm) {\r\n var cur = wide.curEditor.getCursor();\r\n\r\n var request = newWideRequest();\r\n request.path = $(\".edit-panel .tabs .current > span:eq(0)\").attr(\"title\");\r\n request.code = wide.curEditor.getValue();\r\n request.cursorLine = cur.line;\r\n request.cursorCh = cur.ch;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/find/decl',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n return;\r\n }\r\n \r\n var data = result.data;\r\n\r\n var tId = tree.getTIdByPath(data.path);\r\n wide.curNode = tree.fileTree.getNodeByTId(tId);\r\n tree.fileTree.selectNode(wide.curNode);\r\n\r\n tree.openFile(wide.curNode, CodeMirror.Pos(data.cursorLine - 1, data.cursorCh - 1));\r\n }\r\n });\r\n };\r\n\r\n CodeMirror.commands.findUsages = function (cm) {\r\n var cur = wide.curEditor.getCursor();\r\n\r\n var request = newWideRequest();\r\n request.path = $(\".edit-panel .tabs .current > span:eq(0)\").attr(\"title\");\r\n request.code = wide.curEditor.getValue();\r\n request.cursorLine = cur.line;\r\n request.cursorCh = cur.ch;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/find/usages',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n return;\r\n }\r\n\r\n editors.appendSearch(result.data, 'usages', '');\r\n }\r\n });\r\n };\r\n\r\n CodeMirror.commands.selectIdentifier = function (cm) {\r\n var cur = cm.getCursor();\r\n var word = cm.findWordAt(cur);\r\n cm.extendSelection(word.anchor, word.head);\r\n };\r\n },\r\n appendSearch: function (data, type, key) {\r\n var searcHTML = '<ul class=\"list\">',\r\n key = key.toLowerCase();\r\n\r\n for (var i = 0, ii = data.length; i < ii; i++) {\r\n var contents = '',\r\n lowerCaseContents = data[i].contents[0].toLowerCase(),\r\n matches = lowerCaseContents.split(key),\r\n startIndex = 0,\r\n endIndex = 0;\r\n for (var j = 0, max = matches.length; j < max; j++) {\r\n startIndex = endIndex + matches[j].length;\r\n endIndex = startIndex + key.length;\r\n var keyWord = data[i].contents[0].substring(startIndex, endIndex);\r\n if (keyWord !== '') {\r\n keyWord = '<b>' + keyWord + '</b>';\r\n }\r\n contents += data[i].contents[0].substring(startIndex - matches[j].length, startIndex) + keyWord;\r\n }\r\n\r\n searcHTML += '<li title=\"' + data[i].path + '\">'\r\n + contents + \"&nbsp;&nbsp;&nbsp;&nbsp;<span class='ft-small'>\" + data[i].path\r\n + '<i class=\"position\" data-line=\"'\r\n + data[i].line + '\" data-ch=\"' + data[i].ch + '\"> (' + data[i].line + ':'\r\n + data[i].ch + ')</i></span></li>';\r\n }\r\n\r\n if (data.length === 0) {\r\n searcHTML += '<li>' + config.label.search_no_match + '</li>';\r\n }\r\n searcHTML += '</ul>';\r\n\r\n var $search = $('.bottom-window-group .search'),\r\n title = config.label.find_usages;\r\n if (type === \"founds\") {\r\n title = config.label.search_text;\r\n }\r\n if ($search.find(\"ul\").length === 0) {\r\n bottomGroup.searchTab = new Tabs({\r\n id: \".bottom-window-group .search\",\r\n removeAfter: function (id, prevId) {\r\n if ($search.find(\"ul\").length === 1) {\r\n $search.find(\".tabs\").hide();\r\n }\r\n }\r\n });\r\n\r\n $search.on(\"click\", \"li\", function () {\r\n $search.find(\"li\").removeClass(\"selected\");\r\n $(this).addClass(\"selected\");\r\n });\r\n\r\n $search.on(\"dblclick\", \"li\", function () {\r\n var $it = $(this),\r\n tId = tree.getTIdByPath($it.attr(\"title\"));\r\n tree.openFile(tree.fileTree.getNodeByTId(tId));\r\n tree.fileTree.selectNode(wide.curNode);\r\n\r\n var line = $it.find(\".position\").data(\"line\") - 1;\r\n var cursor = CodeMirror.Pos(line, $it.find(\".position\").data(\"ch\") - 1);\r\n\r\n\r\n var editor = wide.curEditor;\r\n editor.setCursor(cursor);\r\n\r\n var half = Math.floor(editor.getScrollInfo().clientHeight / editor.defaultTextHeight() / 2);\r\n var cursorCoords = editor.cursorCoords({line: cursor.line - half, ch: 0}, \"local\");\r\n editor.scrollTo(0, cursorCoords.top);\r\n\r\n wide.curEditor.focus();\r\n });\r\n\r\n $search.find(\".tabs-panel > div\").append(searcHTML);\r\n\r\n $search.find(\".tabs .first\").text(title);\r\n } else {\r\n $search.find(\".tabs\").show();\r\n bottomGroup.searchTab.add({\r\n \"id\": \"search\" + (new Date()).getTime(),\r\n \"title\": title,\r\n \"content\": searcHTML\r\n });\r\n }\r\n\r\n // focus\r\n bottomGroup.tabs.setCurrent(\"search\");\r\n windows.flowBottom();\r\n $(\".bottom-window-group .search\").focus();\r\n },\r\n // 新建一个编辑器 Tab如果已经存在 Tab 则切换到该 Tab.\r\n newEditor: function (data, cursor) {\r\n var id = wide.curNode.id;\r\n\r\n editors.tabs.add({\r\n id: id,\r\n title: '<span title=\"' + wide.curNode.path + '\"><span class=\"'\r\n + wide.curNode.iconSkin + 'ico\"></span>' + wide.curNode.name + '</span>',\r\n content: '<textarea id=\"editor' + id + '\"></textarea>'\r\n });\r\n\r\n menu.undisabled(['save-all', 'close-all', 'build', 'run', 'go-test', 'go-vet', 'go-get', 'go-install',\r\n 'find', 'find-next', 'find-previous', 'replace', 'replace-all',\r\n 'format', 'autocomplete', 'jump-to-decl', 'expr-info', 'find-usages', 'toggle-comment',\r\n 'edit']);\r\n\r\n var textArea = document.getElementById(\"editor\" + id);\r\n textArea.value = data.content;\r\n\r\n var editor = CodeMirror.fromTextArea(textArea, {\r\n lineNumbers: true,\r\n autofocus: true,\r\n autoCloseBrackets: true,\r\n matchBrackets: true,\r\n highlightSelectionMatches: {showToken: /\\w/},\r\n rulers: [{color: \"#ccc\", column: 120, lineStyle: \"dashed\"}],\r\n styleActiveLine: true,\r\n theme: config.editorTheme,\r\n tabSize: config.editorTabSize,\r\n indentUnit: 4,\r\n indentWithTabs: true,\r\n foldGutter: true,\r\n cursorHeight: 1,\r\n path: data.path,\r\n readOnly: wide.curNode.isGOAPI,\r\n profile: 'xhtml', // define Emmet output profile\r\n extraKeys: {\r\n \"Ctrl-\\\\\": \"autocompleteAnyWord\",\r\n \".\": \"autocompleteAfterDot\",\r\n \"Ctrl-/\": 'toggleComment',\r\n \"Ctrl-I\": \"exprInfo\",\r\n \"Ctrl-L\": \"gotoLine\",\r\n \"Ctrl-E\": \"deleteLine\",\r\n \"Ctrl-D\": \"doNothing\", // 取消默认的 deleteLine\r\n \"Ctrl-B\": \"jumpToDecl\",\r\n \"Ctrl-S\": function () {\r\n wide.saveFile();\r\n },\r\n \"Shift-Ctrl-S\": function () {\r\n menu.saveAllFiles();\r\n },\r\n \"Shift-Alt-F\": function () {\r\n var currentPath = editors.getCurrentPath();\r\n if (!currentPath) {\r\n return false;\r\n }\r\n wide.fmt(currentPath, wide.curEditor);\r\n },\r\n \"Alt-F7\": \"findUsages\",\r\n \"Shift-Alt-Enter\": function () {\r\n if (windows.isMaxEditor) {\r\n windows.restoreEditor();\r\n } else {\r\n windows.maxEditor();\r\n }\r\n },\r\n \"Shift-Ctrl-Up\": \"copyLinesUp\",\r\n \"Shift-Ctrl-Down\": \"copyLinesDown\",\r\n \"Shift-Alt-Up\": \"moveLinesUp\",\r\n \"Shift-Alt-Down\": \"moveLinesDown\",\r\n \"Shift-Alt-J\": \"selectIdentifier\"\r\n }\r\n });\r\n\r\n if (\"text/html\" === data.mode) {\r\n emmetCodeMirror(editor);\r\n }\r\n\r\n editor.on('cursorActivity', function (cm) {\r\n $(\".edit-exprinfo\").remove();\r\n var cursor = cm.getCursor();\r\n\r\n $(\".footer .cursor\").text('| ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + ' |');\r\n });\r\n\r\n editor.on('blur', function (cm) {\r\n $(\".edit-exprinfo\").remove();\r\n });\r\n\r\n editor.on('changes', function (cm) {\r\n if (cm.doc.isClean()) { // no modification\r\n $(\".edit-panel .tabs > div\").each(function () {\r\n var $span = $(this).find(\"span:eq(0)\");\r\n if ($span.attr(\"title\") === cm.options.path) {\r\n $span.removeClass(\"changed\");\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n // changed\r\n\r\n $(\".edit-panel .tabs > div\").each(function () {\r\n var $span = $(this).find(\"span:eq(0)\");\r\n if ($span.attr(\"title\") === cm.options.path) {\r\n $span.addClass(\"changed\");\r\n }\r\n });\r\n });\r\n\r\n editor.on('keydown', function (cm, evt) {\r\n if (evt.altKey || evt.ctrlKey || evt.shiftKey) {\r\n return;\r\n }\r\n\r\n var k = evt.which;\r\n\r\n if (k < 48) {\r\n return;\r\n }\r\n\r\n // hit [0-9]\r\n\r\n if (k > 57 && k < 65) {\r\n return;\r\n }\r\n\r\n // hit [a-z]\r\n\r\n if (k > 90) {\r\n return;\r\n }\r\n\r\n if (config.autocomplete) {\r\n if (0.5 <= Math.random()) {\r\n CodeMirror.commands.autocompleteAfterDot(cm);\r\n }\r\n }\r\n });\r\n\r\n editor.setSize('100%', $(\".edit-panel\").height() - $(\".edit-panel .tabs\").height());\r\n editor.setOption(\"mode\", data.mode);\r\n editor.setOption(\"gutters\", [\"CodeMirror-lint-markers\", \"CodeMirror-foldgutter\"]);\r\n\r\n if (\"wide\" !== config.keymap) {\r\n editor.setOption(\"keyMap\", config.keymap);\r\n }\r\n\r\n if (\"text/x-go\" === data.mode || \"application/json\" === data.mode) {\r\n editor.setOption(\"lint\", true);\r\n }\r\n\r\n if (\"application/xml\" === data.mode || \"text/html\" === data.mode) {\r\n editor.setOption(\"autoCloseTags\", true);\r\n }\r\n\r\n wide.curEditor = editor;\r\n editors.data.push({\r\n \"editor\": editor,\r\n \"id\": id\r\n });\r\n\r\n $(\".footer .cursor\").text('| ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + ' |');\r\n\r\n var half = Math.floor(wide.curEditor.getScrollInfo().clientHeight / wide.curEditor.defaultTextHeight() / 2);\r\n var cursorCoords = wide.curEditor.cursorCoords({line: cursor.line - half, ch: 0}, \"local\");\r\n wide.curEditor.scrollTo(0, cursorCoords.top);\r\n\r\n editor.setCursor(cursor);\r\n editor.focus();\r\n }\r\n};","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file notification.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\r\n * @version 1.0.0.1, Dec 8, 2015\r\n */\r\nvar notification = {\r\n init: function () {\r\n $(\".notification-count\").click(function () {\r\n bottomGroup.tabs.setCurrent(\"notification\");\r\n $(\".bottom-window-group .notification\").focus();\r\n $(this).hide();\r\n });\r\n\r\n this._initWS();\r\n },\r\n _initWS: function () {\r\n var notificationWS = new ReconnectingWebSocket(config.channel + '/notification/ws?sid=' + config.wideSessionId);\r\n\r\n notificationWS.onopen = function () {\r\n console.log('[notification onopen] connected');\r\n };\r\n\r\n notificationWS.onmessage = function (e) {\r\n var data = JSON.parse(e.data),\r\n $notification = $('.bottom-window-group .notification > table'),\r\n notificationHTML = '';\r\n \r\n if (data.cmd && \"init-notification\" === data.cmd) {\r\n console.log('[notification onmessage]' + e.data);\r\n \r\n return;\r\n }\r\n\r\n notificationHTML += '<tr><td class=\"severity\">' + data.severity\r\n + '</td><td class=\"message\">' + data.message\r\n + '</td><td class=\"type\">' + data.type + '</td></tr>';\r\n $notification.append(notificationHTML);\r\n\r\n $(\".notification-count\").show();\r\n };\r\n\r\n notificationWS.onclose = function (e) {\r\n console.log('[notification onclose] disconnected (' + e.code + ')');\r\n };\r\n\r\n notificationWS.onerror = function (e) {\r\n console.log('[notification onerror]');\r\n };\r\n }\r\n};","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file tree.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\r\n * @version 1.0.1.1, Dec 15, 2015\r\n */\r\nvar tree = {\r\n fileTree: undefined,\r\n // 递归获取当前节点展开中的最后一个节点\r\n getCurrentNodeLastNode: function (node) {\r\n var returnNode = node.children[node.children.length - 1];\r\n if (returnNode.open) {\r\n return tree.getCurrentNodeLastNode(returnNode);\r\n } else {\r\n return returnNode;\r\n }\r\n },\r\n // 按照树展现获取下一个节点\r\n getNextShowNode: function (node) {\r\n if (node.level !== 0) {\r\n if (node.getParentNode().getNextNode()) {\r\n return node.getParentNode().getNextNode();\r\n } else {\r\n return tree.getNextShowNode(node.getParentNode());\r\n }\r\n } else {\r\n return node.getNextNode();\r\n }\r\n },\r\n isBottomNode: function (node) {\r\n if (node.open) {\r\n return false;\r\n }\r\n\r\n if (node.getParentNode()) {\r\n if (node.getParentNode().isLastNode) {\r\n return tree.isBottomNode(node.getParentNode());\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (node.isLastNode) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n },\r\n getTIdByPath: function (path) {\r\n var nodes = tree.fileTree.transformToArray(tree.fileTree.getNodes());\r\n for (var i = 0, ii = nodes.length; i < ii; i++) {\r\n if (nodes[i].path === path) {\r\n return nodes[i].tId;\r\n }\r\n }\r\n\r\n return undefined;\r\n },\r\n getOpenPaths: function () {\r\n var nodes = tree.fileTree.transformToArray(tree.fileTree.getNodes()),\r\n paths = [];\r\n for (var i = 0, ii = nodes.length; i < ii; i++) {\r\n if (nodes[i].open) {\r\n paths.push(nodes[i].path);\r\n }\r\n }\r\n\r\n return paths;\r\n },\r\n getAllParents: function (node, parents) {\r\n if (!parents) {\r\n parents = [];\r\n }\r\n\r\n if (!node || !node.parentTId) {\r\n return parents;\r\n } else {\r\n parents.push(node.getParentNode());\r\n return tree.getAllParents(node.getParentNode(), parents);\r\n }\r\n },\r\n isParents: function (tId, parentPath) {\r\n var node = tree.fileTree.getNodeByTId(tId);\r\n if (!node || !node.parentTId) {\r\n return false;\r\n } else {\r\n var parentNode = tree.fileTree.getNodeByTId(node.parentTId);\r\n if (node.path === parentPath) {\r\n return true;\r\n } else {\r\n return tree.isParents(parentNode.tId, parentPath);\r\n }\r\n }\r\n },\r\n isDir: function () {\r\n if (wide.curNode.iconSkin.indexOf(\"ico-ztree-dir\") === 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n newFile: function (it) {\r\n if ($(it).hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n $(\"#dialogNewFilePrompt\").dialog(\"open\");\r\n },\r\n newDir: function (it) {\r\n if ($(it).hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n $(\"#dialogNewDirPrompt\").dialog(\"open\");\r\n },\r\n removeIt: function (it) {\r\n if (it) {\r\n if ($(it).hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n } else {\r\n if (!wide.curNode.removable) {\r\n return false;\r\n }\r\n }\r\n\r\n $(\"#dialogRemoveConfirm\").dialog(\"open\");\r\n },\r\n rename: function (it) {\r\n if (it) {\r\n if ($(it).hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n }\r\n\r\n $(\"#dialogRenamePrompt\").dialog(\"open\");\r\n },\r\n export: function () {\r\n var request = newWideRequest(),\r\n isSucc = false;\r\n request.path = wide.curNode.path;\r\n\r\n $.ajax({\r\n async: false,\r\n type: 'POST',\r\n url: config.context + '/file/zip/new',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogAlert\").dialog(\"open\", result.msg);\r\n\r\n return false;\r\n }\r\n\r\n isSucc = true;\r\n }\r\n });\r\n\r\n if (isSucc) {\r\n window.open(config.context + '/file/zip?path=' + wide.curNode.path + \".zip\");\r\n }\r\n },\r\n crossCompile: function (platform) {\r\n var request = newWideRequest();\r\n request.path = wide.curNode.path;\r\n request.platform = platform;\r\n\r\n $.ajax({\r\n async: false,\r\n type: 'POST',\r\n url: config.context + '/cross',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogAlert\").dialog(\"open\", result.msg);\r\n\r\n return false;\r\n }\r\n }\r\n });\r\n },\r\n decompress: function () {\r\n var request = newWideRequest();\r\n request.path = wide.curNode.path;\r\n\r\n $.ajax({\r\n async: false,\r\n type: 'POST',\r\n url: config.context + '/file/decompress',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogAlert\").dialog(\"open\", result.msg);\r\n\r\n return false;\r\n }\r\n\r\n var dir = wide.curNode.getParentNode();\r\n tree.fileTree.reAsyncChildNodes(dir, \"refresh\");\r\n }\r\n });\r\n },\r\n refresh: function (it) {\r\n if (it) {\r\n if ($(it).hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n }\r\n\r\n tree.fileTree.reAsyncChildNodes(wide.curNode, \"refresh\", true);\r\n },\r\n gitClone: function (it) {\r\n if (it) {\r\n if ($(it).hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n }\r\n\r\n $(\"#dialogGitClonePrompt\").dialog('open');\r\n },\r\n import: function () {\r\n var request = newWideRequest();\r\n request.path = wide.curNode.path;\r\n\r\n $('#importFileupload').fileupload({\r\n url: \"/file/upload?path=\" + request.path,\r\n dataType: 'json',\r\n formData: request,\r\n done: function (e, result) {\r\n tree.fileTree.reAsyncChildNodes(wide.curNode, \"refresh\");\r\n },\r\n fail: function () {\r\n console.log(arguments);\r\n }\r\n });\r\n },\r\n init: function () {\r\n $(\"#file\").click(function () {\r\n $(this).focus();\r\n });\r\n\r\n var request = newWideRequest();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/files',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (result.succ) {\r\n var $dirRMenu = $(\"#dirRMenu\");\r\n var $fileRMenu = $(\"#fileRMenu\");\r\n var setting = {\r\n data: {\r\n key: {\r\n title: \"path\"\r\n }\r\n },\r\n view: {\r\n showTitle: true,\r\n selectedMulti: false\r\n },\r\n async: {\r\n enable: true,\r\n url: config.context + \"/file/refresh\",\r\n autoParam: [\"path\"]\r\n },\r\n callback: {\r\n onDblClick: function (event, treeId, treeNode) {\r\n if (treeNode) {\r\n tree.openFile(treeNode);\r\n }\r\n },\r\n onRightClick: function (event, treeId, treeNode) {\r\n if (treeNode && !treeNode.isGOAPI) {\r\n menu.undisabled(['import', 'export', 'git-clone']);\r\n\r\n wide.curNode = treeNode;\r\n tree.fileTree.selectNode(treeNode);\r\n\r\n if (!tree.isDir()) { // if right click on a file\r\n if (wide.curNode.removable) {\r\n $fileRMenu.find(\".remove\").removeClass(\"disabled\");\r\n } else {\r\n $fileRMenu.find(\".remove\").addClass(\"disabled\");\r\n }\r\n\r\n if (-1 === wide.curNode.path.indexOf(\"zip\", wide.curNode.path.length - \"zip\".length)) { // !path.endsWith(\"zip\")\r\n $fileRMenu.find(\".decompress\").hide();\r\n } else {\r\n $fileRMenu.find(\".decompress\").show();\r\n }\r\n\r\n if (-1 === wide.curNode.path.indexOf(\"go\", wide.curNode.path.length - \"go\".length)) { // !path.endsWith(\"go\")\r\n $fileRMenu.find(\".linux64\").hide();\r\n } else {\r\n $fileRMenu.find(\".linux64\").show();\r\n }\r\n\r\n var top = event.clientY - 10;\r\n if ($fileRMenu.height() + top > $('.content').height()) {\r\n top = top - $fileRMenu.height() - 25;\r\n }\r\n $fileRMenu.css({\r\n \"top\": top + \"px\",\r\n \"left\": event.clientX + \"px\",\r\n \"display\": \"block\"\r\n }).show();\r\n\r\n $dirRMenu.hide();\r\n\r\n menu.disabled(['import', 'git-clone']);\r\n } else { // 右击了目录\r\n if (wide.curNode.removable) {\r\n $dirRMenu.find(\".remove\").removeClass(\"disabled\");\r\n } else {\r\n $dirRMenu.find(\".remove\").addClass(\"disabled\");\r\n }\r\n\r\n if (wide.curNode.creatable) {\r\n $dirRMenu.find(\".create\").removeClass(\"disabled\");\r\n } else {\r\n $dirRMenu.find(\".create\").addClass(\"disabled\");\r\n }\r\n\r\n var top = event.clientY - 10;\r\n if ($dirRMenu.height() + top > $('.content').height()) {\r\n top = top - $dirRMenu.height() - 25;\r\n }\r\n\r\n $dirRMenu.css({\r\n \"top\": top + \"px\",\r\n \"left\": event.clientX + \"px\",\r\n \"display\": \"block\"\r\n }).show();\r\n\r\n $fileRMenu.hide();\r\n }\r\n $(\"#files\").focus();\r\n }\r\n },\r\n onClick: function (event, treeId, treeNode, clickFlag) {\r\n if (treeNode) {\r\n wide.curNode = treeNode;\r\n tree.fileTree.selectNode(treeNode);\r\n\r\n menu.undisabled(['import', 'export', 'git-clone']);\r\n if (!tree.isDir()) {\r\n menu.disabled(['import', 'git-clone']);\r\n }\r\n\r\n $(\"#files\").focus();\r\n }\r\n }\r\n }\r\n };\r\n tree.fileTree = $.fn.zTree.init($(\"#files\"), setting, result.data.children);\r\n\r\n session.restore();\r\n }\r\n }\r\n });\r\n\r\n this._initSearch();\r\n this._initRename();\r\n },\r\n openFile: function (treeNode, cursor) {\r\n wide.curNode = treeNode;\r\n var tempCursor = cursor;\r\n\r\n for (var i = 0, ii = editors.data.length; i < ii; i++) {\r\n // 该节点文件已经打开\r\n if (editors.data[i].id === treeNode.path) {\r\n editors.tabs.setCurrent(treeNode.path);\r\n wide.curEditor = editors.data[i].editor;\r\n\r\n if (!tempCursor) {\r\n tempCursor = wide.curEditor.getCursor();\r\n }\r\n $(\".footer .cursor\").text('| ' + (tempCursor.line + 1) + ':' + (tempCursor.ch + 1) + ' |');\r\n\r\n wide.curEditor.setCursor(tempCursor);\r\n var half = Math.floor(wide.curEditor.getScrollInfo().clientHeight / wide.curEditor.defaultTextHeight() / 2);\r\n var cursorCoords = wide.curEditor.cursorCoords({line: tempCursor.line - half, ch: 0}, \"local\");\r\n wide.curEditor.scrollTo(0, cursorCoords.top);\r\n wide.curEditor.focus();\r\n\r\n wide.refreshOutline();\r\n return false;\r\n }\r\n }\r\n\r\n if (!tree.isDir()) {\r\n var request = newWideRequest();\r\n request.path = treeNode.path;\r\n\r\n $.ajax({\r\n async: false,\r\n type: 'POST',\r\n url: config.context + '/file',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogAlert\").dialog(\"open\", result.msg);\r\n\r\n return false;\r\n }\r\n\r\n var data = result.data;\r\n\r\n if (!data.mode) {\r\n var mode = CodeMirror.findModeByFileName(treeNode.path);\r\n if (mode) {\r\n data.mode = mode.mime;\r\n } else {\r\n data.mode = 'text/plain';\r\n }\r\n }\r\n\r\n if (!data.mode) {\r\n console.error(\"Can't find mode by file name [\" + treeNode.path + \"]\");\r\n }\r\n\r\n if (\"img\" === data.mode) { // 是图片文件的话新建 tab 打开\r\n // 最好是开 tab但这个最终取决于浏览器设置\r\n var w = window.open(config.context + data.path);\r\n return false;\r\n }\r\n\r\n if (!tempCursor) {\r\n tempCursor = CodeMirror.Pos(0, 0);\r\n }\r\n\r\n editors.newEditor(data, tempCursor);\r\n\r\n wide.refreshOutline();\r\n }\r\n });\r\n }\r\n },\r\n _initSearch: function () {\r\n $(\"#dialogSearchForm > input:eq(0)\").keyup(function (event) {\r\n var $okBtn = $(this).closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\r\n if (event.which === 13 && !$okBtn.prop(\"disabled\")) {\r\n $okBtn.click();\r\n }\r\n\r\n if ($.trim($(this).val()) === \"\") {\r\n $okBtn.prop(\"disabled\", true);\r\n } else {\r\n $okBtn.prop(\"disabled\", false);\r\n }\r\n });\r\n\r\n $(\"#dialogSearchForm > input:eq(1)\").keyup(function (event) {\r\n var $okBtn = $(this).closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\r\n if (event.which === 13 && !$okBtn.prop(\"disabled\")) {\r\n $okBtn.click();\r\n }\r\n });\r\n\r\n $(\"#dialogSearchForm\").dialog({\r\n \"modal\": true,\r\n \"height\": 80,\r\n \"width\": 260,\r\n \"title\": config.label.search,\r\n \"okText\": config.label.search,\r\n \"cancelText\": config.label.cancel,\r\n \"afterOpen\": function () {\r\n $(\"#dialogSearchForm > input:eq(0)\").val('').focus();\r\n $(\"#dialogSearchForm > input:eq(1)\").val('');\r\n $(\"#dialogSearchForm\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\r\n },\r\n \"ok\": function () {\r\n var request = newWideRequest();\r\n\r\n if (!wide.curNode) {\r\n request.dir = \"\";\r\n } else {\r\n request.dir = wide.curNode.path;\r\n }\r\n\r\n request.text = $(\"#dialogSearchForm > input:eq(0)\").val();\r\n request.extension = $(\"#dialogSearchForm > input:eq(1)\").val();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/file/search/text',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n return;\r\n }\r\n\r\n $(\"#dialogSearchForm\").dialog(\"close\");\r\n editors.appendSearch(result.data, 'founds', request.text);\r\n }\r\n });\r\n }\r\n });\r\n },\r\n _initRename: function () {\r\n $(\"#dialogRenamePrompt\").dialog({\r\n \"modal\": true,\r\n \"height\": 52,\r\n \"width\": 260,\r\n \"title\": config.label.rename,\r\n \"okText\": config.label.rename,\r\n \"cancelText\": config.label.cancel,\r\n \"afterOpen\": function () {\r\n $(\"#dialogRenamePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\r\n $(\"#dialogRenamePrompt > input\").val(wide.curNode.name).select().focus();\r\n },\r\n \"ok\": function () {\r\n var name = $(\"#dialogRenamePrompt > input\").val(),\r\n request = newWideRequest();\r\n\r\n request.oldPath = wide.curNode.path;\r\n request.newPath = wide.curNode.path.substring(0, wide.curNode.path.lastIndexOf(\"/\") + 1) + name;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/file/rename',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogRenamePrompt\").dialog(\"close\");\r\n bottomGroup.tabs.setCurrent(\"notification\");\r\n windows.flowBottom();\r\n $(\".bottom-window-group .notification\").focus();\r\n return false;\r\n }\r\n\r\n $(\"#dialogRenamePrompt\").dialog(\"close\");\r\n }\r\n });\r\n }\r\n });\r\n }\r\n};","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file wide.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\r\n * @version 1.0.0.1, Dec 8, 2015\r\n */\r\nvar wide = {\r\n curNode: undefined,\r\n curEditor: undefined,\r\n curProcessId: undefined, // curent running process id (pid)\r\n refreshOutline: function () {\r\n if (!wide.curEditor ||\r\n (wide.curEditor && wide.curEditor.doc.getMode().name !== \"go\")) {\r\n $(\"#outline\").html('');\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.code = wide.curEditor.getValue();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n async: false,\r\n url: config.context + '/outline',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n return;\r\n }\r\n\r\n var data = result.data;\r\n\r\n var outlineHTML = '<ul class=\"list\">',\r\n decls = ['constDecls', 'varDecls', 'funcDecls',\r\n 'structDecls', 'interfaceDecls', 'typeDecls'];\r\n\r\n for (var i = 0, max = decls.length; i < max; i++) {\r\n var key = decls[i];\r\n for (var j = 0, maxj = data[key].length; j < maxj; j++) {\r\n var obj = data[key][j];\r\n outlineHTML += '<li data-ch=\"' + obj.Ch + '\" data-line=\"'\r\n + obj.Line + '\"><span class=\"ico ico-'\r\n + key.replace('Decls', '') + '\"></span> ' + obj.Name + '</li>';\r\n }\r\n }\r\n $(\"#outline\").html(outlineHTML + '</ul>');\r\n\r\n $(\"#outline li\").dblclick(function () {\r\n var $it = $(this),\r\n cursor = CodeMirror.Pos($it.data('line'), $it.data(\"ch\"));\r\n\r\n var editor = wide.curEditor;\r\n editor.setCursor(cursor);\r\n\r\n var half = Math.floor(editor.getScrollInfo().clientHeight / editor.defaultTextHeight() / 2);\r\n var cursorCoords = editor.cursorCoords({line: cursor.line - half, ch: 0}, \"local\");\r\n editor.scrollTo(0, cursorCoords.top);\r\n\r\n editor.focus();\r\n });\r\n }\r\n });\r\n },\r\n _initDialog: function () {\r\n $(\".dialog-prompt > input\").keyup(function (event) {\r\n var $okBtn = $(this).closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\r\n if (event.which === 13 && !$okBtn.prop(\"disabled\")) {\r\n $okBtn.click();\r\n }\r\n\r\n if ($.trim($(this).val()) === \"\") {\r\n $okBtn.prop(\"disabled\", true);\r\n } else {\r\n $okBtn.prop(\"disabled\", false);\r\n }\r\n });\r\n\r\n $(\"#dialogAlert\").dialog({\r\n \"modal\": true,\r\n \"height\": 40,\r\n \"width\": 350,\r\n \"title\": config.label.tip,\r\n \"hiddenOk\": true,\r\n \"cancelText\": config.label.confirm,\r\n \"afterOpen\": function (msg) {\r\n $(\"#dialogAlert\").html(msg);\r\n }\r\n });\r\n\r\n $(\"#dialogRemoveConfirm\").dialog({\r\n \"modal\": true,\r\n \"height\": 36,\r\n \"width\": 260,\r\n \"title\": config.label.delete,\r\n \"okText\": config.label.delete,\r\n \"cancelText\": config.label.cancel,\r\n \"afterOpen\": function () {\r\n $(\"#dialogRemoveConfirm > b\").html('\"' + wide.curNode.name + '\"');\r\n },\r\n \"ok\": function () {\r\n var request = newWideRequest();\r\n request.path = wide.curNode.path;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/file/remove',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogRemoveConfirm\").dialog(\"close\");\r\n bottomGroup.tabs.setCurrent(\"notification\");\r\n windows.flowBottom();\r\n $(\".bottom-window-group .notification\").focus();\r\n return false;\r\n }\r\n\r\n $(\"#dialogRemoveConfirm\").dialog(\"close\");\r\n }\r\n });\r\n }\r\n });\r\n\r\n $(\"#dialogNewFilePrompt\").dialog({\r\n \"modal\": true,\r\n \"height\": 52,\r\n \"width\": 260,\r\n \"title\": config.label.create_file,\r\n \"okText\": config.label.create,\r\n \"cancelText\": config.label.cancel,\r\n \"afterOpen\": function () {\r\n $(\"#dialogNewFilePrompt > input\").val('').focus();\r\n $(\"#dialogNewFilePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\r\n },\r\n \"ok\": function () {\r\n var request = newWideRequest(),\r\n name = $(\"#dialogNewFilePrompt > input\").val();\r\n\r\n request.path = wide.curNode.path + \"/\" + name;\r\n request.fileType = \"f\";\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/file/new',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogNewFilePrompt\").dialog(\"close\");\r\n bottomGroup.tabs.setCurrent(\"notification\");\r\n windows.flowBottom();\r\n $(\".bottom-window-group .notification\").focus();\r\n return false;\r\n }\r\n\r\n $(\"#dialogNewFilePrompt\").dialog(\"close\");\r\n\r\n setTimeout(function () { // Delay, waiting the file change notified and then open it\r\n var tId = tree.getTIdByPath(request.path);\r\n tree.openFile(tree.fileTree.getNodeByTId(tId));\r\n tree.fileTree.selectNode(wide.curNode);\r\n }, 100);\r\n }\r\n });\r\n }\r\n });\r\n\r\n $(\"#dialogNewDirPrompt\").dialog({\r\n \"modal\": true,\r\n \"height\": 52,\r\n \"width\": 260,\r\n \"title\": config.label.create_dir,\r\n \"okText\": config.label.create,\r\n \"cancelText\": config.label.cancel,\r\n \"afterOpen\": function () {\r\n $(\"#dialogNewDirPrompt > input\").val('').focus();\r\n $(\"#dialogNewDirPrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\r\n },\r\n \"ok\": function () {\r\n var name = $(\"#dialogNewDirPrompt > input\").val(),\r\n request = newWideRequest();\r\n\r\n request.path = wide.curNode.path + \"/\" + name;\r\n request.fileType = \"d\";\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/file/new',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogNewDirPrompt\").dialog(\"close\");\r\n bottomGroup.tabs.setCurrent(\"notification\");\r\n windows.flowBottom();\r\n $(\".bottom-window-group .notification\").focus();\r\n return false;\r\n }\r\n\r\n $(\"#dialogNewDirPrompt\").dialog(\"close\");\r\n }\r\n });\r\n }\r\n });\r\n\r\n $(\"#dialogGoFilePrompt\").dialog({\r\n \"modal\": true,\r\n \"height\": 320,\r\n \"width\": 660,\r\n \"title\": config.label.goto_file,\r\n \"okText\": config.label.go,\r\n \"cancelText\": config.label.cancel,\r\n \"afterInit\": function () {\r\n $(\"#dialogGoFilePrompt\").on(\"dblclick\", \"li\", function () {\r\n var tId = tree.getTIdByPath($(this).find(\".ft-small\").text());\r\n tree.openFile(tree.fileTree.getNodeByTId(tId));\r\n tree.fileTree.selectNode(wide.curNode);\r\n $(\"#dialogGoFilePrompt\").dialog(\"close\");\r\n wide.curEditor.focus();\r\n });\r\n\r\n $(\"#dialogGoFilePrompt\").on(\"click\", \"li\", function () {\r\n var $list = $(\"#dialogGoFilePrompt > .list\");\r\n $list.find(\"li\").removeClass(\"selected\");\r\n $list.data(\"index\", $(this).data(\"index\"));\r\n $(this).addClass(\"selected\");\r\n });\r\n\r\n hotkeys.bindList($(\"#dialogGoFilePrompt > input\"), $(\"#dialogGoFilePrompt > .list\"), function ($selected) {\r\n var tId = tree.getTIdByPath($selected.find(\".ft-small\").text());\r\n tree.openFile(tree.fileTree.getNodeByTId(tId));\r\n tree.fileTree.selectNode(wide.curNode);\r\n $(\"#dialogGoFilePrompt\").dialog(\"close\");\r\n wide.curEditor.focus();\r\n });\r\n\r\n $(\"#dialogGoFilePrompt > input\").bind(\"input\", function () {\r\n var name = $(\"#dialogGoFilePrompt > input\").val();\r\n\r\n var request = newWideRequest();\r\n request.path = '';\r\n request.name = '*' + name + '*';\r\n if (wide.curNode) {\r\n request.path = wide.curNode.path;\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/file/find/name',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n return;\r\n }\r\n\r\n var data = result.data;\r\n\r\n var goFileHTML = '';\r\n for (var i = 0, max = data.length; i < max; i++) {\r\n var path = data[i].path,\r\n name = path.substr(path.lastIndexOf(\"/\") + 1),\r\n icoSkin = wide.getClassBySuffix(name.split(\".\")[1]);\r\n if (i === 0) {\r\n goFileHTML += '<li data-index=\"' + i + '\" class=\"selected\" title=\"'\r\n + path + '\"><span class=\"'\r\n + icoSkin + 'ico\"></span>'\r\n + name + '&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"ft-small\">'\r\n + path + '</span></li>';\r\n } else {\r\n goFileHTML += '<li data-index=\"' + i + '\" title=\"'\r\n + path + '\"><span class=\"' + icoSkin + 'ico\"></span>'\r\n + name + '&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"ft-small\">'\r\n + path + '</span></li>';\r\n }\r\n }\r\n\r\n $(\"#dialogGoFilePrompt > ul\").html(goFileHTML);\r\n }\r\n });\r\n });\r\n },\r\n \"afterOpen\": function () {\r\n $(\"#dialogGoFilePrompt > input\").val('').focus();\r\n $(\"#dialogGoFilePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\r\n $(\"#dialogGoFilePrompt .list\").html('').data(\"index\", 0);\r\n },\r\n \"ok\": function () {\r\n var tId = tree.getTIdByPath($(\"#dialogGoFilePrompt .selected .ft-small\").text());\r\n tree.openFile(tree.fileTree.getNodeByTId(tId));\r\n tree.fileTree.selectNode(wide.curNode);\r\n $(\"#dialogGoFilePrompt\").dialog(\"close\");\r\n wide.curEditor.focus();\r\n }\r\n });\r\n\r\n $(\"#dialogGoLinePrompt\").dialog({\r\n \"modal\": true,\r\n \"height\": 52,\r\n \"width\": 260,\r\n \"title\": config.label.goto_line,\r\n \"okText\": config.label.go,\r\n \"cancelText\": config.label.cancel,\r\n \"afterOpen\": function () {\r\n $(\"#dialogGoLinePrompt > input\").val('').focus();\r\n $(\"#dialogGoLinePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\r\n },\r\n \"ok\": function () {\r\n var line = parseInt($(\"#dialogGoLinePrompt > input\").val()) - 1;\r\n $(\"#dialogGoLinePrompt\").dialog(\"close\");\r\n\r\n var editor = wide.curEditor;\r\n var cursor = editor.getCursor();\r\n\r\n editor.setCursor(CodeMirror.Pos(line, cursor.ch));\r\n\r\n var half = Math.floor(editor.getScrollInfo().clientHeight / editor.defaultTextHeight() / 2);\r\n var cursorCoords = editor.cursorCoords({line: line - half, ch: cursor.ch}, \"local\");\r\n editor.scrollTo(0, cursorCoords.top);\r\n\r\n editor.focus();\r\n }\r\n });\r\n\r\n $(\"#dialogGitClonePrompt\").dialog({\r\n \"modal\": true,\r\n \"height\": 52,\r\n \"width\": 360,\r\n \"title\": config.label.git_clone,\r\n \"okText\": config.label.confirm,\r\n \"cancelText\": config.label.cancel,\r\n \"afterOpen\": function () {\r\n $(\"#dialogGitClonePrompt > input\").val('').focus();\r\n $(\"#dialogGitClonePrompt\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\").prop(\"disabled\", true);\r\n },\r\n \"ok\": function () {\r\n $(\"#dialogGitClonePrompt\").dialog(\"close\");\r\n\r\n var request = newWideRequest();\r\n request.path = wide.curNode.path;\r\n request.repository = $(\"#dialogGitClonePrompt > input\").val();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/git/clone',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n }\r\n });\r\n }\r\n });\r\n },\r\n _initWS: function () {\r\n var outputWS = new ReconnectingWebSocket(config.channel + '/output/ws?sid=' + config.wideSessionId);\r\n outputWS.onopen = function () {\r\n console.log('[output onopen] connected');\r\n };\r\n\r\n outputWS.onmessage = function (e) {\r\n console.log('[output onmessage]' + e.data);\r\n var data = JSON.parse(e.data);\r\n\r\n if (goLintFound) {\r\n goLintFound = [];\r\n }\r\n\r\n if ('run' === data.nextCmd) {\r\n var request = newWideRequest();\r\n request.executable = data.executable;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/run',\r\n data: JSON.stringify(request),\r\n dataType: \"json\"\r\n });\r\n }\r\n\r\n switch (data.cmd) {\r\n case 'run':\r\n var content = $('.bottom-window-group .output > div').html();\r\n if (!wide.curProcessId || '' === content) {\r\n bottomGroup.fillOutput(content + '<pre>' + data.output + '</pre>');\r\n } else {\r\n bottomGroup.fillOutput(content.replace(/<\\/pre>$/g, data.output + '</pre>'));\r\n }\r\n\r\n wide.curProcessId = data.pid;\r\n\r\n break;\r\n case 'run-done':\r\n bottomGroup.fillOutput($('.bottom-window-group .output > div').html().replace(/<\\/pre>$/g, data.output + '</pre>'));\r\n\r\n wide.curProcessId = undefined;\r\n $(\"#buildRun\").removeClass(\"ico-stop\")\r\n .addClass(\"ico-buildrun\").attr(\"title\", config.label.build_n_run);\r\n\r\n break;\r\n case 'start-build':\r\n case 'start-test':\r\n case 'start-vet':\r\n case 'start-install':\r\n case 'start-get':\r\n case 'start-git_clone':\r\n bottomGroup.fillOutput(data.output);\r\n\r\n break;\r\n case 'go test':\r\n case 'go vet':\r\n case 'go install':\r\n case 'go get':\r\n bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output);\r\n\r\n break;\r\n case 'git clone':\r\n bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output);\r\n tree.fileTree.reAsyncChildNodes(wide.curNode, \"refresh\", false);\r\n\r\n break;\r\n case 'build':\r\n case 'cross-build':\r\n bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output);\r\n\r\n if (data.lints) { // has build error\r\n var files = {};\r\n\r\n for (var i = 0; i < data.lints.length; i++) {\r\n var lint = data.lints[i];\r\n\r\n goLintFound.push({from: CodeMirror.Pos(lint.lineNo, 0),\r\n to: CodeMirror.Pos(lint.lineNo, 0),\r\n message: lint.msg, severity: lint.severity});\r\n\r\n files[lint.file] = lint.file;\r\n }\r\n\r\n $(\"#buildRun\").removeClass(\"ico-stop\")\r\n .addClass(\"ico-buildrun\").attr(\"title\", config.label.build_n_run);\r\n\r\n // trigger gutter lint\r\n for (var path in files) {\r\n var editor = editors.getEditorByPath(path);\r\n CodeMirror.signal(editor, \"change\", editor);\r\n }\r\n } else {\r\n if ('cross-build' === data.cmd) {\r\n var request = newWideRequest(),\r\n path = null;\r\n request.path = data.executable;\r\n request.name = data.name;\r\n\r\n $.ajax({\r\n async: false,\r\n type: 'POST',\r\n url: config.context + '/file/zip/new',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (!result.succ) {\r\n $(\"#dialogAlert\").dialog(\"open\", result.msg);\r\n\r\n return false;\r\n }\r\n\r\n path = result.data;\r\n }\r\n });\r\n\r\n if (path) {\r\n window.open(config.context + '/file/zip?path=' + path + \".zip\");\r\n }\r\n }\r\n }\r\n\r\n break;\r\n }\r\n };\r\n outputWS.onclose = function (e) {\r\n console.log('[output onclose] disconnected (' + e.code + ')');\r\n };\r\n outputWS.onerror = function (e) {\r\n console.log('[output onerror]');\r\n };\r\n },\r\n _initFooter: function () {\r\n $(\".footer .cursor\").dblclick(function () {\r\n $(\"#dialogGoLinePrompt\").dialog(\"open\");\r\n });\r\n },\r\n init: function () {\r\n this._initFooter();\r\n\r\n this._initWS();\r\n\r\n // 点击隐藏弹出层\r\n $(\"body\").bind(\"mouseup\", function (event) {\r\n // MAC 右键文件树失效\r\n if (event.which === 3) {\r\n return false;\r\n }\r\n\r\n $(\".frame\").hide();\r\n\r\n if (!($(event.target).closest(\".frame\").length === 1 || event.target.className === \"frame\")) {\r\n $(\".menu > ul > li\").unbind().removeClass(\"selected\");\r\n menu.subMenu();\r\n }\r\n });\r\n\r\n // 刷新提示\r\n window.onbeforeunload = function () {\r\n if (editors.data.length > 0) {\r\n return config.label.confirm_save;\r\n }\r\n };\r\n\r\n // 禁止鼠标右键菜单\r\n document.oncontextmenu = function () {\r\n return false;\r\n };\r\n\r\n this._initDialog();\r\n },\r\n _save: function (path, editor) {\r\n if (!path) {\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.file = path;\r\n request.code = editor.getValue();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/file/save',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n // reset the save state\r\n editor.doc.markClean();\r\n $(\".edit-panel .tabs > div\").each(function () {\r\n var $span = $(this).find(\"span:eq(0)\");\r\n if ($span.attr(\"title\") === path) {\r\n $span.removeClass(\"changed\");\r\n }\r\n });\r\n }\r\n });\r\n },\r\n saveFile: function () {\r\n var path = editors.getCurrentPath();\r\n if (!path) {\r\n return false;\r\n }\r\n\r\n var editor = wide.curEditor;\r\n if (editor.doc.isClean()) { // no modification\r\n return false;\r\n }\r\n\r\n if (\"text/x-go\" === editor.getOption(\"mode\")) {\r\n wide.gofmt(path, wide.curEditor); // go fmt will save\r\n\r\n // build the file at once\r\n var request = newWideRequest();\r\n request.file = path;\r\n request.code = editor.getValue();\r\n request.nextCmd = \"\"; // build only, no following operation\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/build',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n },\r\n success: function (result) {\r\n }\r\n });\r\n\r\n // refresh outline\r\n wide.refreshOutline();\r\n\r\n return;\r\n }\r\n\r\n wide._save(path, wide.curEditor);\r\n },\r\n stop: function () {\r\n if ($(\"#buildRun\").hasClass(\"ico-buildrun\")) {\r\n menu.run();\r\n return false;\r\n }\r\n\r\n if (!wide.curProcessId) {\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.pid = wide.curProcessId;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/stop',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n $(\"#buildRun\").removeClass(\"ico-stop\")\r\n .addClass(\"ico-buildrun\").attr(\"title\", config.label.build_n_run);\r\n }\r\n });\r\n },\r\n gofmt: function (path, editor) {\r\n var cursor = editor.getCursor();\r\n var scrollInfo = editor.getScrollInfo();\r\n\r\n var request = newWideRequest();\r\n request.file = path;\r\n request.code = editor.getValue();\r\n request.cursorLine = cursor.line;\r\n request.cursorCh = cursor.ch;\r\n\r\n $.ajax({\r\n async: false, // sync\r\n type: 'POST',\r\n url: config.context + '/go/fmt',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (result.succ) {\r\n editor.setValue(result.data.code);\r\n editor.setCursor(cursor);\r\n editor.scrollTo(null, scrollInfo.top);\r\n\r\n wide._save(path, editor);\r\n }\r\n }\r\n });\r\n },\r\n fmt: function (path, editor) {\r\n var mode = editor.getOption(\"mode\");\r\n\r\n var cursor = editor.getCursor();\r\n var scrollInfo = editor.getScrollInfo();\r\n\r\n var request = newWideRequest();\r\n request.file = path;\r\n request.code = editor.getValue();\r\n request.cursorLine = cursor.line;\r\n request.cursorCh = cursor.ch;\r\n\r\n var formatted = null;\r\n\r\n switch (mode) {\r\n case \"text/x-go\":\r\n $.ajax({\r\n async: false, // sync\r\n type: 'POST',\r\n url: config.context + '/go/fmt',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (result.succ) {\r\n formatted = result.data.code;\r\n }\r\n }\r\n });\r\n\r\n break;\r\n case \"text/html\":\r\n formatted = html_beautify(editor.getValue());\r\n break;\r\n case \"text/javascript\":\r\n case \"application/json\":\r\n formatted = js_beautify(editor.getValue());\r\n break;\r\n case \"text/css\":\r\n formatted = css_beautify(editor.getValue());\r\n break;\r\n default :\r\n break;\r\n }\r\n\r\n if (formatted) {\r\n editor.setValue(formatted);\r\n editor.setCursor(cursor);\r\n editor.scrollTo(null, scrollInfo.top);\r\n\r\n wide._save(path, editor);\r\n }\r\n },\r\n getClassBySuffix: function (suffix) {\r\n var iconSkin = \"ico-ztree-other \";\r\n switch (suffix) {\r\n case \"html\":\r\n case \"htm\":\r\n iconSkin = \"ico-ztree-html \";\r\n break;\r\n case \"go\":\r\n iconSkin = \"ico-ztree-go \";\r\n break;\r\n case \"css\":\r\n iconSkin = \"ico-ztree-css \";\r\n break;\r\n case \"txt\":\r\n iconSkin = \"ico-ztree-text \";\r\n break;\r\n case \"sql\":\r\n iconSkin = \"ico-ztree-sql \";\r\n break;\r\n case \"properties\":\r\n iconSkin = \"ico-ztree-pro \";\r\n break;\r\n case \"md\":\r\n iconSkin = \"ico-ztree-md \";\r\n break;\r\n case \"js\", \"json\":\r\n iconSkin = \"ico-ztree-js \";\r\n break;\r\n case \"xml\":\r\n iconSkin = \"ico-ztree-xml \";\r\n break;\r\n case \"jpg\":\r\n case \"jpeg\":\r\n case \"bmp\":\r\n case \"gif\":\r\n case \"png\":\r\n case \"svg\":\r\n case \"ico\":\r\n iconSkin = \"ico-ztree-img \";\r\n break;\r\n }\r\n\r\n return iconSkin;\r\n }\r\n};\r\n\r\n$(document).ready(function () {\r\n wide.init();\r\n tree.init();\r\n menu.init();\r\n hotkeys.init();\r\n session.init();\r\n notification.init();\r\n editors.init();\r\n windows.init();\r\n bottomGroup.init();\r\n});\r\n","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file session.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @version 1.1.0.1, Dec 8, 2015\r\n */\r\nvar session = {\r\n init: function () {\r\n this._initWS();\r\n\r\n var getLayoutState = function (paneState) {\r\n var state = 'normal';\r\n if (paneState.isClosed) {\r\n state = 'min';\r\n } else if (paneState.size >= $('body').width()) {\r\n state = 'max';\r\n }\r\n\r\n return state;\r\n };\r\n\r\n // save session content every 30 seconds\r\n setInterval(function () {\r\n var request = newWideRequest(),\r\n filse = [],\r\n fileTree = [],\r\n currentId = editors.getCurrentId(),\r\n currentFile = currentId ? editors.getCurrentPath() : \"\";\r\n\r\n editors.tabs.obj._$tabs.find(\"div\").each(function () {\r\n var $it = $(this);\r\n if ($it.find(\"span:eq(0)\").attr(\"title\") !== config.label.start_page) {\r\n filse.push($it.find(\"span:eq(0)\").attr(\"title\"));\r\n }\r\n });\r\n\r\n fileTree = tree.getOpenPaths();\r\n\r\n request.currentFile = currentFile; // current editor file\r\n request.fileTree = fileTree; // file tree expansion state\r\n request.files = filse; // editor tabs\r\n\r\n\r\n request.layout = {\r\n \"side\": {\r\n \"size\": windows.outerLayout.west.state.size,\r\n \"state\": getLayoutState(windows.outerLayout.west.state)\r\n },\r\n \"sideRight\": {\r\n \"size\": windows.innerLayout.east.state.size,\r\n \"state\": getLayoutState(windows.innerLayout.east.state)\r\n },\r\n \"bottom\": {\r\n \"size\": windows.innerLayout.south.state.size,\r\n \"state\": getLayoutState(windows.innerLayout.south.state)\r\n }\r\n };\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/session/save',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n }\r\n });\r\n }, 30000);\r\n },\r\n restore: function () {\r\n if (!config.latestSessionContent) {\r\n return;\r\n }\r\n\r\n var fileTree = config.latestSessionContent.fileTree,\r\n files = config.latestSessionContent.files,\r\n currentFile = config.latestSessionContent.currentFile,\r\n id = \"\",\r\n nodesToOpen = [];\r\n\r\n var nodes = tree.fileTree.transformToArray(tree.fileTree.getNodes());\r\n\r\n for (var i = 0, ii = nodes.length; i < ii; i++) {\r\n // expand tree\r\n for (var j = 0, jj = fileTree.length; j < jj; j++) {\r\n if (nodes[i].path === fileTree[j]) {\r\n // expand this node only if its parents are open\r\n var parents = tree.getAllParents(tree.fileTree.getNodeByTId(nodes[i].tId)),\r\n isOpen = true;\r\n for (var l = 0, max = parents.length; l < max; l++) {\r\n if (parents[l].open === false) {\r\n isOpen = false;\r\n }\r\n }\r\n if (isOpen) {\r\n tree.fileTree.expandNode(nodes[i], true, false, true);\r\n } else {\r\n // flag it is open\r\n nodes[i].open = true;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // open editors\r\n for (var k = 0, kk = files.length; k < kk; k++) {\r\n if (nodes[i].path === files[k]) {\r\n nodesToOpen.push(nodes[i]);\r\n break;\r\n }\r\n }\r\n\r\n if (nodes[i].path === currentFile) {\r\n id = nodes[i].path;\r\n\r\n // FIXME: 上面的展开是异步进行的,所以执行到这里的时候可能还没有展开完,导致定位不了可视区域\r\n tree.fileTree.selectNode(nodes[i]);\r\n wide.curNode = nodes[i];\r\n }\r\n }\r\n\r\n // handle the open sequence of editors\r\n for (var m = 0, mm = files.length; m < mm; m++) {\r\n for (var n = 0, nn = nodesToOpen.length; n < nn; n++) {\r\n if (nodesToOpen[n].path === files[m]) {\r\n tree.openFile(nodesToOpen[n]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // set the current editor\r\n editors.tabs.setCurrent(id);\r\n for (var c = 0, max = editors.data.length; c < max; c++) {\r\n if (id === editors.data[c].id) {\r\n wide.curEditor = editors.data[c].editor;\r\n break;\r\n }\r\n } \r\n },\r\n _initWS: function () {\r\n // Used for session retention, server will release all resources of the session if this channel closed\r\n var sessionWS = new ReconnectingWebSocket(config.channel + '/session/ws?sid=' + config.wideSessionId);\r\n\r\n sessionWS.onopen = function () {\r\n console.log('[session onopen] connected');\r\n\r\n var dateFormat = function (time, fmt) {\r\n var date = new Date(time);\r\n var dateObj = {\r\n \"M+\": date.getMonth() + 1,\r\n \"d+\": date.getDate(),\r\n \"h+\": date.getHours(),\r\n \"m+\": date.getMinutes(),\r\n \"s+\": date.getSeconds(),\r\n \"q+\": Math.floor((date.getMonth() + 3) / 3),\r\n \"S\": date.getMilliseconds()\r\n };\r\n if (/(y+)/.test(fmt))\r\n fmt = fmt.replace(RegExp.$1, (date.getFullYear() + \"\").substr(4 - RegExp.$1.length));\r\n for (var k in dateObj)\r\n if (new RegExp(\"(\" + k + \")\").test(fmt)) {\r\n fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1)\r\n ? (dateObj[k]) : ((\"00\" + dateObj[k]).substr((\"\" + dateObj[k]).length)));\r\n }\r\n return fmt;\r\n };\r\n\r\n var data = {type: \"Network\", severity: \"INFO\",\r\n message: \"Connected to server [sid=\" + config.wideSessionId + \"], \" + dateFormat(new Date().getTime(), 'yyyy-MM-dd hh:mm:ss')},\r\n $notification = $('.bottom-window-group .notification > table'),\r\n notificationHTML = '';\r\n\r\n notificationHTML += '<tr><td class=\"severity\">' + data.severity\r\n + '</td><td class=\"message\">' + data.message\r\n + '</td><td class=\"type\">' + data.type + '</td></tr>';\r\n $notification.append(notificationHTML);\r\n };\r\n\r\n sessionWS.onmessage = function (e) {\r\n var data = JSON.parse(e.data);\r\n switch (data.cmd) {\r\n case 'create-file':\r\n var node = tree.fileTree.getNodeByTId(tree.getTIdByPath(data.dir)),\r\n name = data.path.replace(data.dir + '/', ''),\r\n mode = CodeMirror.findModeByFileName(name),\r\n iconSkin = wide.getClassBySuffix(name.split(\".\")[1]);\r\n\r\n if (data.type && data.type === 'f') {\r\n tree.fileTree.addNodes(node, [{\r\n \"id\": data.path,\r\n \"name\": name,\r\n \"iconSkin\": iconSkin,\r\n \"path\": data.path,\r\n \"mode\": mode,\r\n \"removable\": true,\r\n \"creatable\": true\r\n }]);\r\n\r\n } else {\r\n tree.fileTree.addNodes(node, [{\r\n \"id\": data.path,\r\n \"name\": name,\r\n \"iconSkin\": \"ico-ztree-dir \",\r\n \"path\": data.path,\r\n \"removable\": true,\r\n \"creatable\": true,\r\n \"isParent\": true\r\n }]);\r\n }\r\n break;\r\n case 'remove-file':\r\n case 'rename-file':\r\n var node = tree.fileTree.getNodeByTId(tree.getTIdByPath(data.path));\r\n tree.fileTree.removeNode(node);\r\n\r\n var nodes = tree.fileTree.transformToArray(node);\r\n for (var i = 0, ii = nodes.length; i < ii; i++) {\r\n editors.tabs.del(nodes[i].path);\r\n }\r\n\r\n break;\r\n }\r\n };\r\n sessionWS.onclose = function (e) {\r\n console.log('[session onclose] disconnected (' + e.code + ')');\r\n\r\n var data = {type: \"Network\", severity: \"ERROR\",\r\n message: \"Disconnected from server, trying to reconnect it [sid=\" + config.wideSessionId + \"]\"},\r\n $notification = $('.bottom-window-group .notification > table'),\r\n notificationHTML = '';\r\n\r\n notificationHTML += '<tr><td class=\"severity\">' + data.severity\r\n + '</td><td class=\"message\">' + data.message\r\n + '</td><td class=\"type\">' + data.type + '</td></tr>';\r\n $notification.append(notificationHTML);\r\n\r\n $(\".notification-count\").show();\r\n };\r\n sessionWS.onerror = function (e) {\r\n console.log('[session onerror]');\r\n };\r\n }\r\n};","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file menu.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\r\n * @version 1.0.0.1, Dec 8, 2015\r\n */\r\nvar menu = {\r\n init: function () {\r\n this.subMenu();\r\n this._initPreference();\r\n this._initAbout();\r\n this._initShare();\r\n\r\n // 点击子菜单后消失\r\n $(\".menu .frame li\").click(function () {\r\n $(\".menu > ul > li\").unbind().removeClass(\"selected\");\r\n menu.subMenu();\r\n });\r\n },\r\n _initShare: function () {\r\n $(\".menu .ico-share\").hover(function () {\r\n $(\".menu .share-panel\").show();\r\n });\r\n\r\n $(\".share-panel .font-ico\").click(function () {\r\n var key = $(this).attr('class').split('-')[2];\r\n var url = \"https://wide.b3log.org\", pic = 'https://wide.b3log.org/static/images/wide-logo.png';\r\n var urls = {};\r\n urls.email = \"mailto:?subject=\" + $('title').text()\r\n + \"&body=\" + $('meta[name=description]').attr('content') + ' ' + url;\r\n\r\n var twitterShare = encodeURIComponent($('meta[name=description]').attr('content') + \" \" + url + \" #golang\");\r\n urls.twitter = \"https://twitter.com/intent/tweet?status=\" + twitterShare;\r\n\r\n urls.facebook = \"https://www.facebook.com/sharer/sharer.php?u=\" + url;\r\n urls.googleplus = \"https://plus.google.com/share?url=\" + url;\r\n\r\n var title = encodeURIComponent($('title').text() + '. \\n' + $('meta[name=description]').attr('content')\r\n + \" #golang#\");\r\n urls.weibo = \"http://v.t.sina.com.cn/share/share.php?title=\" + title + \"&url=\" + url + \"&pic=\" + pic;\r\n urls.tencent = \"http://share.v.t.qq.com/index.php?c=share&a=index&title=\" + title +\r\n \"&url=\" + url + \"&pic=\" + pic;\r\n\r\n window.open(urls[key], \"_blank\", \"top=100,left=200,width=648,height=618\");\r\n });\r\n },\r\n _initAbout: function () {\r\n $(\"#dialogAbout\").load(config.context + '/about', function () {\r\n $(\"#dialogAbout\").dialog({\r\n \"modal\": true,\r\n \"title\": config.label.about,\r\n \"hideFooter\": true,\r\n \"afterOpen\": function () {\r\n $.ajax({\r\n url: \"https://rhythm.b3log.org/version/wide/latest\",\r\n type: \"GET\",\r\n dataType: \"jsonp\",\r\n jsonp: \"callback\",\r\n success: function (data, textStatus) {\r\n if ($(\"#dialogAbout .version\").text() === data.wideVersion) {\r\n $(\".upgrade\").text(config.label.uptodate);\r\n } else {\r\n $(\".upgrade\").html(config.label.new_version_available + config.label.colon\r\n + \"<a href='\" + data.wideDownload\r\n + \"' target='_blank'>\" + data.wideVersion + \"</a>\");\r\n }\r\n }\r\n });\r\n }\r\n });\r\n });\r\n },\r\n disabled: function (list) {\r\n for (var i = 0, max = list.length; i < max; i++) {\r\n $(\".menu li.\" + list[i]).addClass(\"disabled\");\r\n }\r\n },\r\n undisabled: function (list) {\r\n for (var i = 0, max = list.length; i < max; i++) {\r\n $(\".menu li.\" + list[i]).removeClass(\"disabled\");\r\n }\r\n },\r\n // 焦点不在菜单上时需点击展开子菜单,否则为鼠标移动展开\r\n subMenu: function () {\r\n $(\".menu > ul > li\").click(function (event) {\r\n if ($(event.target).closest(\".frame\").length === 1) {\r\n return;\r\n }\r\n var $it = $(this);\r\n $it.find('.frame').show();\r\n $(\".menu > ul > li\").removeClass(\"selected\");\r\n $(this).addClass(\"selected\");\r\n\r\n $(\".menu > ul > li\").unbind();\r\n\r\n $(\".menu > ul > li\").mouseover(function () {\r\n if ($(event.target).closest(\".frame\").length === 1) {\r\n return;\r\n }\r\n $(\".menu .frame\").hide();\r\n $(this).find('.frame').show();\r\n $(\".menu > ul > li\").removeClass(\"selected\");\r\n $(this).addClass(\"selected\");\r\n });\r\n });\r\n },\r\n openPreference: function () {\r\n $(\"#dialogPreference\").dialog(\"open\");\r\n },\r\n saveAllFiles: function () {\r\n if ($(\".menu li.save-all\").hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n for (var i = 0, ii = editors.data.length; i < ii; i++) {\r\n var path = editors.data[i].id;\r\n var editor = editors.data[i].editor;\r\n\r\n if (\"text/x-go\" === editor.getOption(\"mode\")) {\r\n wide.fmt(path, editor);\r\n } else {\r\n wide._save(path, editor);\r\n }\r\n }\r\n },\r\n closeAllFiles: function () {\r\n if ($(\".menu li.close-all\").hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n // 设置全部关闭标识\r\n var removeData = [];\r\n $(\".edit-panel .tabs > div\").each(function (i) {\r\n if (i !== 0) {\r\n removeData.push($(this).data(\"index\"));\r\n }\r\n });\r\n $(\"#dialogCloseEditor\").data(\"removeData\", removeData);\r\n // 开始关闭\r\n $(\".edit-panel .tabs .ico-close:eq(0)\").click();\r\n },\r\n exit: function () {\r\n var request = newWideRequest();\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/logout',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n success: function (result) {\r\n if (result.succ) {\r\n window.location.href = \"/login\";\r\n }\r\n }\r\n });\r\n },\r\n openAbout: function () {\r\n $(\"#dialogAbout\").dialog(\"open\");\r\n },\r\n goget: function () {\r\n menu.saveAllFiles();\r\n\r\n var currentPath = editors.getCurrentPath();\r\n if (!currentPath) {\r\n return false;\r\n }\r\n\r\n if ($(\".menu li.go-get\").hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.file = currentPath;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/go/get',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n },\r\n success: function (result) {\r\n }\r\n });\r\n },\r\n goinstall: function () {\r\n menu.saveAllFiles();\r\n\r\n var currentPath = editors.getCurrentPath();\r\n if (!currentPath) {\r\n return false;\r\n }\r\n\r\n if ($(\".menu li.go-install\").hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.file = currentPath;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/go/install',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n },\r\n success: function (result) {\r\n }\r\n });\r\n },\r\n // go test.\r\n test: function () {\r\n menu.saveAllFiles();\r\n\r\n var currentPath = editors.getCurrentPath();\r\n if (!currentPath) {\r\n return false;\r\n }\r\n\r\n if ($(\".menu li.go-test\").hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.file = currentPath;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/go/test',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n },\r\n success: function (result) {\r\n }\r\n });\r\n },\r\n // go vet.\r\n govet: function () {\r\n menu.saveAllFiles();\r\n\r\n var currentPath = editors.getCurrentPath();\r\n if (!currentPath) {\r\n return false;\r\n }\r\n\r\n if ($(\".menu li.go-vet\").hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.file = currentPath;\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/go/vet',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n },\r\n success: function (result) {\r\n }\r\n });\r\n },\r\n // Build & Run.\r\n run: function () {\r\n menu.saveAllFiles();\r\n\r\n if ($(\"#buildRun\").hasClass(\"ico-stop\")) {\r\n wide.stop();\r\n return false;\r\n }\r\n\r\n var currentPath = editors.getCurrentPath();\r\n if (!currentPath) {\r\n return false;\r\n }\r\n\r\n if ($(\".menu li.run\").hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.file = currentPath;\r\n request.code = wide.curEditor.getValue();\r\n request.nextCmd = \"run\";\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/build',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n },\r\n success: function (result) {\r\n $(\"#buildRun\").addClass(\"ico-stop\")\r\n .removeClass(\"ico-buildrun\").attr(\"title\", config.label.stop);\r\n }\r\n });\r\n },\r\n // Build.\r\n build: function () {\r\n menu.saveAllFiles();\r\n\r\n var currentPath = editors.getCurrentPath();\r\n if (!currentPath) {\r\n return false;\r\n }\r\n\r\n if ($(\".menu li.build\").hasClass(\"disabled\")) {\r\n return false;\r\n }\r\n\r\n var request = newWideRequest();\r\n request.file = currentPath;\r\n request.code = wide.curEditor.getValue();\r\n request.nextCmd = \"\"; // build only, no following operation\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/build',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n },\r\n success: function (result) {\r\n }\r\n });\r\n },\r\n _initPreference: function () {\r\n $(\"#dialogPreference\").load(config.context + '/preference', function () {\r\n $(\"#dialogPreference input\").keyup(function () {\r\n var isChange = false,\r\n emptys = [],\r\n emptysTip = '';\r\n $(\"#dialogPreference input\").each(function () {\r\n var $it = $(this);\r\n // data-value 如为数字,则不会和 value 一样转换为 String再次不使用全等\r\n if ($it.val() != $it.data(\"value\")) {\r\n isChange = true;\r\n }\r\n\r\n if ($.trim($it.val()) === '') {\r\n emptys.push($it);\r\n }\r\n });\r\n\r\n var $okBtn = $(\"#dialogPreference\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\r\n if (isChange) {\r\n $okBtn.prop(\"disabled\", false);\r\n } else {\r\n $okBtn.prop(\"disabled\", true);\r\n }\r\n\r\n if (emptys.length === 0) {\r\n $(\"#dialogPreference\").find(\".tip\").html(\"\");\r\n $okBtn.prop(\"disabled\", false);\r\n } else {\r\n for (var i = 0, max = emptys.length; i < max; i++) {\r\n var tabIndex = emptys[i].closest('div').data(\"index\"),\r\n text = $.trim(emptys[i].parent().text());\r\n emptysTip += '[' + $('#dialogPreference .tabs > div[data-index=\"' + tabIndex + '\"]').text()\r\n + '] -> [' + text.substr(0, text.length - 1)\r\n + ']: ' + config.label.no_empty + \"<br/>\";\r\n }\r\n $(\"#dialogPreference\").find(\".tip\").html(emptysTip);\r\n $okBtn.prop(\"disabled\", true);\r\n }\r\n });\r\n\r\n $(\"#dialogPreference select\").on(\"change\", function () {\r\n var isChange = false;\r\n $(\"#dialogPreference select\").each(function () {\r\n if ($(this).val() !== $(this).data(\"value\")) {\r\n isChange = true;\r\n }\r\n });\r\n\r\n var $okBtn = $(\"#dialogPreference\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\r\n if (isChange) {\r\n $okBtn.prop(\"disabled\", false);\r\n } else {\r\n $okBtn.prop(\"disabled\", true);\r\n }\r\n });\r\n\r\n $(\"#dialogPreference\").dialog({\r\n \"modal\": true,\r\n \"height\": 280,\r\n \"width\": 800,\r\n \"title\": config.label.preference,\r\n \"okText\": config.label.apply,\r\n \"cancelText\": config.label.cancel,\r\n \"afterOpen\": function () {\r\n var $okBtn = $(\"#dialogPreference\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\r\n $okBtn.prop(\"disabled\", true);\r\n },\r\n \"ok\": function () {\r\n var request = newWideRequest(),\r\n $dialogPreference = $(\"#dialogPreference\"),\r\n $fontFamily = $dialogPreference.find(\"input[name=fontFamily]\"),\r\n $fontSize = $dialogPreference.find(\"input[name=fontSize]\"),\r\n $goFmt = $dialogPreference.find(\"select[name=goFmt]\"),\r\n $workspace = $dialogPreference.find(\"input[name=workspace]\"),\r\n $password = $dialogPreference.find(\"input[name=password]\"),\r\n $email = $dialogPreference.find(\"input[name=email]\"),\r\n $locale = $dialogPreference.find(\"select[name=locale]\"),\r\n $theme = $dialogPreference.find(\"select[name=theme]\"),\r\n $editorFontFamily = $dialogPreference.find(\"input[name=editorFontFamily]\"),\r\n $editorFontSize = $dialogPreference.find(\"input[name=editorFontSize]\"),\r\n $editorLineHeight = $dialogPreference.find(\"input[name=editorLineHeight]\"),\r\n $editorTheme = $dialogPreference.find(\"select[name=editorTheme]\"),\r\n $editorTabSize = $dialogPreference.find(\"input[name=editorTabSize]\"),\r\n $keymap = $dialogPreference.find(\"select[name=keymap]\");\r\n\r\n $.extend(request, {\r\n \"fontFamily\": $fontFamily.val(),\r\n \"fontSize\": $fontSize.val(),\r\n \"goFmt\": $goFmt.val(),\r\n \"workspace\": $workspace.val(),\r\n \"password\": $password.val(),\r\n \"email\": $email.val(),\r\n \"locale\": $locale.val(),\r\n \"theme\": $theme.val(),\r\n \"editorFontFamily\": $editorFontFamily.val(),\r\n \"editorFontSize\": $editorFontSize.val(),\r\n \"editorLineHeight\": $editorLineHeight.val(),\r\n \"editorTheme\": $editorTheme.val(),\r\n \"editorTabSize\": $editorTabSize.val(),\r\n \"keymap\": $keymap.val()\r\n });\r\n\r\n if (config.keymap !== $keymap.val()) {\r\n window.location.reload();\r\n }\r\n\r\n $.ajax({\r\n type: 'POST',\r\n url: config.context + '/preference',\r\n data: JSON.stringify(request),\r\n success: function (result, textStatus, jqXHR) {\r\n if (!result.succ) {\r\n return false;\r\n }\r\n\r\n $fontFamily.data(\"value\", $fontFamily.val());\r\n $fontSize.data(\"value\", $fontSize.val());\r\n $goFmt.data(\"value\", $goFmt.val());\r\n $workspace.data(\"value\", $workspace.val());\r\n $password.data(\"value\", $password.val());\r\n $email.data(\"value\", $email.val());\r\n $locale.data(\"value\", $locale.val());\r\n $theme.data(\"value\", $theme.val());\r\n $editorFontFamily.data(\"value\", $editorFontFamily.val());\r\n $editorFontSize.data(\"value\", $editorFontSize.val());\r\n $editorLineHeight.data(\"value\", $editorLineHeight.val());\r\n $editorTheme.data(\"value\", $editorTheme.val());\r\n $editorTabSize.data(\"value\", $editorTabSize.val());\r\n $keymap.data(\"value\", $keymap.val());\r\n\r\n // update the config\r\n config.keymap = $keymap.val();\r\n\r\n var $okBtn = $(\"#dialogPreference\").closest(\".dialog-main\").find(\".dialog-footer > button:eq(0)\");\r\n $okBtn.prop(\"disabled\", true);\r\n\r\n $(\"#themesLink\").attr(\"href\", config.staticServer + '/static/css/themes/' + $theme.val() + '.css');\r\n\r\n config.editorTheme = $editorTheme.val();\r\n for (var i = 0, ii = editors.data.length; i < ii; i++) {\r\n editors.data[i].editor.setOption(\"theme\", $editorTheme.val());\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n new Tabs({\r\n id: \".preference\"\r\n });\r\n });\r\n }\r\n};","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file windows.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\r\n * @version 1.1.1.2, Dec 15, 2015\r\n */\r\nvar windows = {\r\n isMaxEditor: false,\r\n outerLayout: {},\r\n innerLayout: {},\r\n init: function () {\r\n if (!config.latestSessionContent.layout) {\r\n config.latestSessionContent.layout = {\r\n \"side\": {\r\n \"size\": 200,\r\n \"state\": 'normal'\r\n },\r\n \"sideRight\": {\r\n \"size\": 200,\r\n \"state\": 'normal'\r\n },\r\n \"bottom\": {\r\n \"size\": 100,\r\n \"state\": 'normal'\r\n }\r\n };\r\n }\r\n\r\n var layout = config.latestSessionContent.layout;\r\n\r\n this.outerLayout = $('body').layout({\r\n north__paneSelector: \".menu\",\r\n center__paneSelector: \".content\",\r\n south__paneSelector: \".footer\",\r\n north__size: 22,\r\n south__size: 19,\r\n spacing_open: 2,\r\n north__spacing_open: 0,\r\n south__spacing_open: 0,\r\n defaults: {\r\n fxSpeed_open: 300,\r\n fxSpeed_close: 100,\r\n fxSettings_close: {\r\n easing: \"easeOutQuint\"\r\n },\r\n fxSettings_open: {\r\n easing: \"easeInQuint\"\r\n }\r\n },\r\n west: {\r\n size: layout.side.size,\r\n paneSelector: \".side\",\r\n togglerLength_open: 0,\r\n togglerLength_closed: 15,\r\n togglerAlign_closed: \"top\",\r\n slideTrigger_open: \"mouseover\",\r\n spacing_closed: 15,\r\n minSize: 100,\r\n togglerClass: \"ico-restore\",\r\n togglerTip_open: config.label.min,\r\n togglerTip_closed: config.label.restore_side,\r\n resizerTip: config.label.resize,\r\n initClosed: (layout.side.state === 'min')\r\n }\r\n });\r\n\r\n this.innerLayout = $('div.content').layout({\r\n spacing_open: 2,\r\n defaults: {\r\n fxSpeed_open: 300,\r\n fxSpeed_close: 100,\r\n fxSettings_close: {\r\n easing: \"easeOutQuint\"\r\n },\r\n fxSettings_open: {\r\n easing: \"easeInQuint\"\r\n }\r\n },\r\n center: {\r\n paneSelector: \".edit-panel\"\r\n },\r\n east: {\r\n size: layout.sideRight.size,\r\n paneSelector: \".side-right\",\r\n togglerLength_open: 0,\r\n togglerLength_closed: 15,\r\n togglerAlign_closed: \"top\",\r\n slideTrigger_open: \"mouseover\",\r\n spacing_closed: 15,\r\n minSize: 100,\r\n togglerClass: \"ico-restore\",\r\n togglerTip_open: config.label.min,\r\n togglerTip_closed: config.label.restore_outline,\r\n resizerTip: config.label.resize,\r\n initClosed: (layout.sideRight.state === 'min')\r\n },\r\n south: {\r\n size: layout.bottom.size,\r\n paneSelector: \".bottom-window-group\",\r\n togglerLength_open: 0,\r\n togglerLength_closed: 15,\r\n togglerAlign_closed: \"top\",\r\n slideTrigger_open: \"mouseover\",\r\n spacing_closed: 16,\r\n minSize: 100,\r\n togglerClass: \"ico-restore\",\r\n togglerTip_open: config.label.min,\r\n togglerTip_closed: config.label.restore_bottom,\r\n resizerTip: config.label.resize,\r\n initClosed: (layout.bottom.state === 'min'),\r\n ondrag_end: function (type, pane) {\r\n windows.refreshEditor(pane, 'drag');\r\n },\r\n onresize_end: function (type, pane) {\r\n windows.refreshEditor(pane, 'resize');\r\n },\r\n onclose_end: function (type, pane) {\r\n windows.refreshEditor(pane, 'close');\r\n },\r\n onopen_end: function (type, pane) {\r\n windows.refreshEditor(pane, 'open');\r\n },\r\n onshow_end: function (type, pane) {\r\n windows.refreshEditor(pane, 'show');\r\n }\r\n }\r\n });\r\n\r\n this.outerLayout.addCloseBtn(\".side .ico-min\", \"west\");\r\n this.innerLayout.addCloseBtn(\".side-right .ico-min\", \"east\");\r\n this.innerLayout.addCloseBtn(\".bottom-window-group .ico-min\", \"south\");\r\n\r\n if (layout.side.state === 'max') {\r\n windows.maxSide();\r\n }\r\n if (layout.sideRight.state === 'max') {\r\n windows.maxSideRight();\r\n }\r\n if (layout.bottom.state === 'max') {\r\n windows.maxBottom();\r\n }\r\n\r\n $(\".toolbars .ico-max\").click(function () {\r\n windows.toggleEditor();\r\n });\r\n\r\n $(\".edit-panel .tabs\").on(\"dblclick\", function () {\r\n windows.toggleEditor();\r\n });\r\n\r\n $(\".bottom-window-group .tabs\").dblclick(function () {\r\n var $it = $(\".bottom-window-group\");\r\n if ($it.hasClass(\"bottom-window-group-max\")) {\r\n windows.restoreBottom();\r\n } else {\r\n windows.maxBottom($it);\r\n }\r\n });\r\n\r\n $(\".side .tabs\").dblclick(function () {\r\n var $it = $(\".side\");\r\n if ($it.hasClass(\"side-max\")) {\r\n windows.restoreSide();\r\n } else {\r\n windows.restoreSide($it);\r\n }\r\n });\r\n\r\n $(\".side-right .tabs\").dblclick(function () {\r\n var $it = $(\".side-right\");\r\n if ($it.hasClass(\"side-right-max\")) {\r\n windows.restoreSideRight();\r\n } else {\r\n windows.maxSideRight($it);\r\n }\r\n });\r\n\r\n $('.bottom-window-group .search').height($('.bottom-window-group .tabs-panel').height());\r\n $(window).resize(function () {\r\n windows.refreshEditor($('.bottom-window-group'));\r\n });\r\n\r\n },\r\n maxEditor: function () {\r\n var $it = $(\".toolbars .font-ico\");\r\n windows.outerLayout.close('west');\r\n windows.innerLayout.close('south');\r\n windows.innerLayout.close('east');\r\n $it.removeClass('ico-max').addClass('ico-restore').attr('title', config.label.min);\r\n windows.isMaxEditor = true;\r\n },\r\n maxBottom: function ($it) {\r\n $it.data('height', $it.height()).addClass(\"bottom-window-group-max\").find('.ico-min').hide();\r\n windows.outerLayout.hide('west');\r\n windows.innerLayout.hide('east');\r\n windows.innerLayout.sizePane('south', $('.content').height());\r\n },\r\n maxSide: function ($it) {\r\n $it.data('width', $it.width()).addClass(\"side-max\").find('.ico-min').hide();\r\n $('.content').hide();\r\n windows.outerLayout.sizePane('west', $('body').width());\r\n },\r\n maxSideRight: function ($it) {\r\n $it.addClass(\"side-right-max\").data('width', $it.width()).find('.ico-min').hide();\r\n windows.outerLayout.hide('west');\r\n windows.innerLayout.hide('south');\r\n windows.innerLayout.sizePane('east', $('body').width());\r\n },\r\n toggleEditor: function () {\r\n var $it = $(\".toolbars .font-ico\");\r\n if ($it.hasClass('ico-restore')) {\r\n windows.restoreEditor();\r\n } else {\r\n windows.maxEditor();\r\n }\r\n },\r\n restoreBottom: function () {\r\n var $it = $(\".bottom-window-group\");\r\n $it.removeClass(\"bottom-window-group-max\").find('.ico-min').show();\r\n windows.outerLayout.show('west');\r\n windows.innerLayout.show('east');\r\n windows.innerLayout.sizePane('south', $it.data('height'));\r\n },\r\n restoreSide: function () {\r\n var $it = $(\".side\");\r\n $it.removeClass(\"side-max\").find('.ico-min').show();\r\n $('.content').show();\r\n windows.outerLayout.sizePane('west', $it.data('width'));\r\n },\r\n restoreSideRight: function () {\r\n var $it = $(\".side-right\");\r\n $it.removeClass(\"side-right-max\").find('.ico-min').show();\r\n windows.outerLayout.show('west');\r\n windows.innerLayout.show('south');\r\n windows.innerLayout.sizePane('east', $it.data('width'));\r\n },\r\n restoreEditor: function () {\r\n windows.outerLayout.open('west');\r\n windows.innerLayout.open('south');\r\n windows.innerLayout.open('east');\r\n windows.isMaxEditor = false;\r\n $(\".toolbars .font-ico\").addClass('ico-max').removeClass('ico-restore').attr('title', config.label.max_editor);\r\n },\r\n refreshEditor: function (pane, type) {\r\n var editorDatas = editors.data,\r\n height = $('.content').height() - pane.height() - 24;\r\n switch (type) {\r\n case 'close':\r\n height = $('.content').height() - 40;\r\n break;\r\n default:\r\n break;\r\n }\r\n for (var i = 0, ii = editorDatas.length; i < ii; i++) {\r\n editorDatas[i].editor.setSize(\"100%\", height);\r\n }\r\n\r\n $('.bottom-window-group .search').height($('.bottom-window-group .tabs-panel').height());\r\n },\r\n flowBottom: function () {\r\n if (windows.innerLayout.south.state.isClosed) {\r\n windows.innerLayout.slideOpen('south');\r\n }\r\n }\r\n};","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file hotkeys.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\r\n * @version 1.0.0.2, Dec 15, 2015\r\n */\r\nvar hotkeys = {\r\n defaultKeyMap: {\r\n // Ctrl-0\r\n goEditor: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 48,\r\n fun: function () {\r\n if (wide.curEditor) {\r\n wide.curEditor.focus();\r\n }\r\n }\r\n },\r\n // Ctrl-1\r\n goFileTree: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 49,\r\n fun: function () {\r\n // 有些元素需设置 tabindex 为 -1 时才可以 focus\r\n if (windows.outerLayout.west.state.isClosed) {\r\n windows.outerLayout.slideOpen('west');\r\n }\r\n $(\"#files\").focus();\r\n }\r\n },\r\n // Ctrl-2\r\n goOutline: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 50,\r\n fun: function () {\r\n if (windows.innerLayout.east.state.isClosed) {\r\n windows.innerLayout.slideOpen('east');\r\n }\r\n\r\n $(\"#outline\").focus();\r\n }\r\n },\r\n // Ctrl-4\r\n goOutput: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 52,\r\n fun: function () {\r\n bottomGroup.tabs.setCurrent(\"output\");\r\n windows.flowBottom();\r\n $(\".bottom-window-group .output\").focus();\r\n }\r\n },\r\n // Ctrl-5\r\n goSearch: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 53,\r\n fun: function () {\r\n bottomGroup.tabs.setCurrent(\"search\");\r\n windows.flowBottom();\r\n $(\".bottom-window-group .search\").focus();\r\n }\r\n },\r\n // Ctrl-6\r\n goNotification: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 54,\r\n fun: function () {\r\n bottomGroup.tabs.setCurrent(\"notification\");\r\n windows.flowBottom();\r\n $(\".bottom-window-group .notification\").focus();\r\n }\r\n },\r\n // Alt-C\r\n clearWindow: {\r\n ctrlKey: false,\r\n altKey: true,\r\n shiftKey: false,\r\n which: 67\r\n },\r\n // Ctrl-D 窗口组切换 \r\n changeEditor: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 68\r\n },\r\n // Ctrl-F search \r\n search: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 70\r\n },\r\n // Ctrl-Q close current editor \r\n closeCurEditor: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 81\r\n },\r\n // Ctrl-R\r\n rename: {\r\n ctrlKey: true,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 82\r\n },\r\n // Shift-Alt-O 跳转到文件\r\n goFile: {\r\n ctrlKey: false,\r\n altKey: true,\r\n shiftKey: true,\r\n which: 79\r\n },\r\n // F5 Build\r\n build: {\r\n ctrlKey: false,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 116\r\n },\r\n // F6 Build & Run\r\n buildRun: {\r\n ctrlKey: false,\r\n altKey: false,\r\n shiftKey: false,\r\n which: 117\r\n }\r\n },\r\n bindList: function ($source, $list, enterFun) {\r\n $list.data(\"index\", 0);\r\n $source.keydown(function (event) {\r\n var index = $list.data(\"index\"),\r\n count = $list.find(\"li\").length;\r\n\r\n if (count === 0) {\r\n return true;\r\n }\r\n\r\n if (event.which === 38) { // up\r\n index--;\r\n if (index < 0) {\r\n index = count - 1;\r\n }\r\n }\r\n\r\n if (event.which === 40) { // down\r\n index++;\r\n if (index > count - 1) {\r\n index = 0;\r\n }\r\n }\r\n\r\n var $selected = $list.find(\"li:eq(\" + index + \")\");\r\n\r\n if (event.which === 13) { // enter\r\n enterFun($selected);\r\n }\r\n\r\n $list.find(\"li\").removeClass(\"selected\");\r\n $list.data(\"index\", index);\r\n $selected.addClass(\"selected\");\r\n\r\n if (index === 0) {\r\n $list.scrollTop(0);\r\n } else {\r\n if ($selected[0].offsetTop + $list.scrollTop() > $list.height()) {\r\n if (event.which === 40) {\r\n $list.scrollTop($list.scrollTop() + $selected.height());\r\n } else {\r\n $list.scrollTop($selected[0].offsetTop);\r\n }\r\n } else {\r\n $list.scrollTop(0);\r\n }\r\n }\r\n\r\n // 阻止上下键改变光标位置\r\n if (event.which === 38 || event.which === 40 || event.which === 13) {\r\n return false;\r\n }\r\n });\r\n },\r\n _bindOutput: function () {\r\n $(\".bottom-window-group .output\").keydown(function (event) {\r\n var hotKeys = hotkeys.defaultKeyMap;\r\n if (event.altKey === hotKeys.clearWindow.altKey\r\n && event.which === hotKeys.clearWindow.which) { // Alt-C clear output\r\n bottomGroup.clear('output');\r\n\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n });\r\n },\r\n _bindFileTree: function () {\r\n $(\"#files\").keydown(function (event) {\r\n event.preventDefault();\r\n\r\n var hotKeys = hotkeys.defaultKeyMap;\r\n if (event.ctrlKey === hotKeys.search.ctrlKey\r\n && event.which === hotKeys.search.which) { // Ctrl-F 搜索\r\n $(\"#dialogSearchForm\").dialog(\"open\");\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.rename.ctrlKey\r\n && event.which === hotKeys.rename.which) { // Ctrl-R 重命名\r\n if (wide.curNode.removable) {\r\n $(\"#dialogRenamePrompt\").dialog(\"open\");\r\n }\r\n return;\r\n }\r\n\r\n switch (event.which) {\r\n case 46: // delete\r\n tree.removeIt();\r\n break;\r\n case 13: // enter\r\n if (!wide.curNode) {\r\n return false;\r\n }\r\n\r\n if (tree.isDir()) {\r\n if (wide.curNode.open) {\r\n return false;\r\n }\r\n\r\n tree.fileTree.expandNode(wide.curNode, true, false, true);\r\n $(\"#files\").focus();\r\n\r\n break;\r\n }\r\n\r\n tree.openFile(wide.curNode);\r\n\r\n break;\r\n case 38: // up\r\n var node = {};\r\n\r\n if (!wide.curNode) { // select the first one if no node been selected\r\n node = tree.fileTree.getNodeByTId(\"files_1\");\r\n } else {\r\n if (wide.curNode && wide.curNode.isFirstNode && wide.curNode.level === 0) {\r\n return false;\r\n }\r\n\r\n node = wide.curNode.getPreNode();\r\n if (wide.curNode.isFirstNode && wide.curNode.getParentNode()) {\r\n node = wide.curNode.getParentNode();\r\n }\r\n\r\n var preNode = wide.curNode.getPreNode();\r\n if (preNode && tree.isDir() && preNode.open) {\r\n node = tree.getCurrentNodeLastNode(preNode);\r\n }\r\n }\r\n\r\n wide.curNode = node;\r\n tree.fileTree.selectNode(node);\r\n $(\"#files\").focus();\r\n break;\r\n case 40: // down\r\n var node = {};\r\n\r\n if (!wide.curNode) { // select the first one if no node been selected \r\n node = tree.fileTree.getNodeByTId(\"files_1\");\r\n } else {\r\n if (wide.curNode && tree.isBottomNode(wide.curNode)) {\r\n return false;\r\n }\r\n\r\n node = wide.curNode.getNextNode();\r\n if (tree.isDir() && wide.curNode.open) {\r\n node = wide.curNode.children[0];\r\n }\r\n\r\n var nextShowNode = tree.getNextShowNode(wide.curNode);\r\n if (wide.curNode.isLastNode && wide.curNode.level !== 0 && !wide.curNode.open && nextShowNode) {\r\n node = nextShowNode;\r\n }\r\n }\r\n\r\n if (node) {\r\n wide.curNode = node;\r\n tree.fileTree.selectNode(node);\r\n }\r\n\r\n $(\"#files\").focus();\r\n break;\r\n case 37: // left\r\n if (!wide.curNode) {\r\n wide.curNode = tree.fileTree.getNodeByTId(\"files_1\");\r\n tree.fileTree.selectNode(wide.curNode);\r\n $(\"#files\").focus();\r\n return false;\r\n }\r\n\r\n if (!tree.isDir() || !wide.curNode.open) {\r\n return false;\r\n }\r\n\r\n tree.fileTree.expandNode(wide.curNode, false, false, true);\r\n $(\"#files\").focus();\r\n break;\r\n case 39: // right\r\n if (!wide.curNode) {\r\n wide.curNode = tree.fileTree.getNodeByTId(\"files_1\");\r\n tree.fileTree.selectNode(wide.curNode);\r\n $(\"#files\").focus();\r\n return false;\r\n }\r\n\r\n if (!tree.isDir() || wide.curNode.open) {\r\n return false;\r\n }\r\n\r\n tree.fileTree.expandNode(wide.curNode, true, false, true);\r\n $(\"#files\").focus();\r\n\r\n break;\r\n case 116: // F5\r\n if (!wide.curNode || !tree.isDir()) {\r\n return false;\r\n }\r\n\r\n tree.refresh(wide.curNode);\r\n\r\n break;\r\n }\r\n });\r\n },\r\n _bindDocument: function () {\r\n var hotKeys = this.defaultKeyMap;\r\n $(document).keydown(function (event) {\r\n if (event.ctrlKey === hotKeys.goEditor.ctrlKey\r\n && event.which === hotKeys.goEditor.which) { // Ctrl-0 焦点切换到当前编辑器\r\n hotKeys.goEditor.fun();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.goFileTree.ctrlKey\r\n && event.which === hotKeys.goFileTree.which) { // Ctrl-1 焦点切换到文件树\r\n hotKeys.goFileTree.fun();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.goOutline.ctrlKey\r\n && event.which === hotKeys.goOutline.which) { // Ctrl-2 焦点切换到大纲\r\n hotKeys.goOutline.fun();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.goOutput.ctrlKey\r\n && event.which === hotKeys.goOutput.which) { // Ctrl-4 焦点切换到输出窗口 \r\n hotKeys.goOutput.fun();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.goSearch.ctrlKey\r\n && event.which === hotKeys.goSearch.which) { // Ctrl-5 焦点切换到搜索窗口 \r\n hotKeys.goSearch.fun();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.goNotification.ctrlKey\r\n && event.which === hotKeys.goNotification.which) { // Ctrl-6 焦点切换到通知窗口 \r\n hotKeys.goNotification.fun();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.closeCurEditor.ctrlKey\r\n && event.which === hotKeys.closeCurEditor.which) { // Ctrl-Q 关闭当前编辑器 \r\n $(\".edit-panel .tabs > div.current\").find(\".ico-close\").click();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.changeEditor.ctrlKey\r\n && event.which === hotKeys.changeEditor.which) { // Ctrl-D 窗口组切换\r\n if (document.activeElement.className === \"notification\"\r\n || document.activeElement.className === \"output\"\r\n || document.activeElement.className === \"search\") {\r\n // 焦点在底部窗口组时,对底部进行切换\r\n var tabs = [\"output\", \"search\", \"notification\"],\r\n nextPath = \"\";\r\n for (var i = 0, ii = tabs.length; i < ii; i++) {\r\n if (bottomGroup.tabs.getCurrentId() === tabs[i]) {\r\n if (i < ii - 1) {\r\n nextPath = tabs[i + 1];\r\n } else {\r\n nextPath = tabs[0];\r\n }\r\n break;\r\n }\r\n }\r\n bottomGroup.tabs.setCurrent(nextPath);\r\n $(\".bottom-window-group .\" + nextPath).focus();\r\n\r\n event.preventDefault();\r\n\r\n return false;\r\n }\r\n\r\n if (editors.data.length > 1) {\r\n var nextPath = \"\";\r\n for (var i = 0, ii = editors.data.length; i < ii; i++) {\r\n var currentId = editors.getCurrentId();\r\n if (currentId) {\r\n if (currentId === editors.data[i].id) {\r\n if (i < ii - 1) {\r\n nextPath = editors.data[i + 1].id;\r\n wide.curEditor = editors.data[i + 1].editor;\r\n } else {\r\n nextPath = editors.data[0].id;\r\n wide.curEditor = editors.data[0].editor;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n editors.tabs.setCurrent(nextPath);\r\n var nextTId = tree.getTIdByPath(nextPath);\r\n wide.curNode = tree.fileTree.getNodeByTId(nextTId);\r\n\r\n tree.fileTree.selectNode(wide.curNode);\r\n wide.refreshOutline();\r\n var cursor = wide.curEditor.getCursor();\r\n $(\".footer .cursor\").text('| ' + (cursor.line + 1) + ':' + (cursor.ch + 1) + ' |');\r\n wide.curEditor.focus();\r\n }\r\n\r\n event.preventDefault();\r\n\r\n return false;\r\n }\r\n\r\n if (event.which === hotKeys.build.which) { // F5 Build\r\n menu.build();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.which === hotKeys.buildRun.which) { // F6 Build & Run\r\n menu.run();\r\n event.preventDefault();\r\n\r\n return;\r\n }\r\n\r\n if (event.ctrlKey === hotKeys.goFile.ctrlKey\r\n && event.altKey === hotKeys.goFile.altKey\r\n && event.shiftKey === hotKeys.goFile.shiftKey\r\n && event.which === hotKeys.goFile.which) { // Shift-Alt-O 跳转到文件\r\n $(\"#dialogGoFilePrompt\").dialog(\"open\");\r\n }\r\n });\r\n },\r\n init: function () {\r\n this._bindFileTree();\r\n this._bindOutput();\r\n this._bindDocument();\r\n }\r\n};","/*\r\n * Copyright (c) 2014-2015, b3log.org\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * @file bottomGroup.js\r\n *\r\n * @author <a href=\"http://vanessa.b3log.org\">Liyuan Li</a>\r\n * @author <a href=\"http://88250.b3log.org\">Liang Ding</a>\r\n * @version 1.1.0.1, Dec 8, 2015\r\n */\r\nvar bottomGroup = {\r\n tabs: undefined,\r\n searchTab: undefined,\r\n init: function () {\r\n this._initTabs();\r\n this._initFrame();\r\n\r\n $('.bottom-window-group .output').click(function () {\r\n $(this).focus();\r\n });\r\n\r\n $('.bottom-window-group .output').on('click', '.path', function (event) {\r\n var $path = $(this),\r\n tId = tree.getTIdByPath($path.data(\"path\"));\r\n tree.openFile(tree.fileTree.getNodeByTId(tId),\r\n CodeMirror.Pos($path.data(\"line\") - 1, $path.data(\"column\") - 1));\r\n event.preventDefault();\r\n return false;\r\n });\r\n },\r\n _initFrame: function () {\r\n $(\".bottom-window-group .output\").parent().mouseup(function (event) {\r\n event.stopPropagation();\r\n\r\n if (event.button === 0) { // 左键\r\n $(\".bottom-window-group .frame\").hide();\r\n return;\r\n }\r\n\r\n // event.button === 2 右键\r\n var left = event.screenX,\r\n $it = $(this);\r\n if ($(\".side\").css(\"left\") === \"auto\" || $(\".side\").css(\"left\") === \"0px\") {\r\n left = event.screenX - $(\".side\").width();\r\n }\r\n $(\".bottom-window-group .frame\").show().css({\r\n \"left\": left + \"px\",\r\n \"top\": (event.offsetY + event.target.offsetTop - $it.scrollTop() - 10) + \"px\"\r\n });\r\n return;\r\n });\r\n },\r\n clear: function (id) {\r\n $('.bottom-window-group .' + id + ' > div').text('');\r\n },\r\n resetOutput: function () {\r\n this.clear('output');\r\n bottomGroup.tabs.setCurrent(\"output\");\r\n windows.flowBottom();\r\n },\r\n _initTabs: function () {\r\n this.tabs = new Tabs({\r\n id: \".bottom-window-group\",\r\n clickAfter: function (id) {\r\n this._$tabsPanel.find(\".\" + id).focus();\r\n }\r\n });\r\n },\r\n fillOutput: function (data) {\r\n var $output = $('.bottom-window-group .output');\r\n\r\n data = data.replace(/\\n/g, '<br/>');\r\n\r\n if (-1 !== data.indexOf(\"<br/>\")) {\r\n data = Autolinker.link(data);\r\n }\r\n\r\n $output.find(\"div\").html(data);\r\n $output.parent().scrollTop($output[0].scrollHeight);\r\n }\r\n};\r\n"],"sourceRoot":"/source/"}