From 00051a9e39780765ce7bd2c16ffdfabbcdcdc95f Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Mon, 20 May 2019 17:12:13 +0800 Subject: [PATCH] :art: #306 go get -> go mod --- README.md | 2 +- i18n/en_US.json | 8 ++++---- i18n/ja_JP.json | 8 ++++---- i18n/ko_KR.json | 8 ++++---- i18n/zh_CN.json | 8 ++++---- i18n/zh_TW.json | 8 ++++---- main.go | 2 +- output/{get.go => mod.go} | 24 ++++++++++++------------ static/css/wide.css | 6 +++--- static/css/wide.min.css | 2 +- static/js/menu.js | 4 ++-- static/js/wide.js | 4 ++-- static/js/wide.min.js | 4 ++-- static/js/wide.min.js.map | 2 +- views/index.html | 4 ++-- 15 files changed, 47 insertions(+), 47 deletions(-) rename output/{get.go => mod.go} (76%) diff --git a/README.md b/README.md index c86fee8..2c0ea72 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Wide 是一款基于 **W**eb 的 Go 语言 **IDE**。 * 运行:支持同时运行多个程序 * 代码导航:跳转到声明,查找使用,文件搜索等 * Web 开发:前端(HTML/JS/CSS)开发支持 -* go tool:go get/install/fmt 等 +* go tool:go mod/install/fmt 等 * 项目文件导出 * UI/编辑器多主题 * 支持交叉编译 diff --git a/i18n/en_US.json b/i18n/en_US.json index 2759ae6..6301db0 100644 --- a/i18n/en_US.json +++ b/i18n/en_US.json @@ -28,7 +28,7 @@ "close_all_files": "Close All", "save_all_files": "Save All", "format": "Format", - "goget": "go get", + "gomod": "go mod", "goinstall": "go install", "build": "Build", "build_n_run": "Build&Run", @@ -102,9 +102,9 @@ "start-install": "START [go install]", "install-succ": "[go install] SUCCESS", "install-error": "[go install] ERROR", - "start-get": "START [go get]", - "get-succ": "[go get] SUCCESS", - "get-error": "[go get] ERROR", + "start-mod": "START [go mod]", + "mod-succ": "[go mod] SUCCESS", + "mod-error": "[go mod] ERROR", "check_version": "Checking update", "new_version_available": "new version available", "go_env": "Go", diff --git a/i18n/ja_JP.json b/i18n/ja_JP.json index 106b05b..63931f5 100644 --- a/i18n/ja_JP.json +++ b/i18n/ja_JP.json @@ -28,7 +28,7 @@ "close_all_files": "全てのファイルを閉じる", "save_all_files": "全てを保存", "format": "フォーマット", - "goget": "go get", + "gomod": "go mod", "goinstall": "go install", "build": "ビルド", "build_n_run": "ビルド実行", @@ -102,9 +102,9 @@ "start-install": "[go install] 開始", "install-succ": "[go install] 成功", "install-error": "[go install] 失敗", - "start-get": "[go get] 開始", - "get-succ": "[go get] 成功", - "get-error": "[go get] 失敗", + "start-mod": "[go mod] 開始", + "mod-succ": "[go mod] 成功", + "mod-error": "[go mod] 失敗", "check_version": "更新をチェック中", "new_version_available": "新しいバージョンがあります", "go_env": "Go", diff --git a/i18n/ko_KR.json b/i18n/ko_KR.json index 2d2b1a9..f061d95 100644 --- a/i18n/ko_KR.json +++ b/i18n/ko_KR.json @@ -28,7 +28,7 @@ "close_all_files": "모두 닫기", "save_all_files": "일괄저장", "format": "포멧", - "goget": "go get", + "gomod": "go mod", "goinstall": "go install", "build": "빌드", "build_n_run": "빌드후실행", @@ -102,9 +102,9 @@ "start-install": "시작 [go install]", "install-succ": "[go install] 성공", "install-error": "[go install] 실패", - "start-get": "시작 [go get]", - "get-succ": "[go get] 성공", - "get-error": "[go get] 실패", + "start-mod": "시작 [go mod]", + "mod-succ": "[go mod] 성공", + "mod-error": "[go mod] 실패", "check_version": "최신버전검색중", "new_version_available": "최신업데이트 사용 가능", "go_env": "Go 환경", diff --git a/i18n/zh_CN.json b/i18n/zh_CN.json index 73e1fe4..a060b59 100644 --- a/i18n/zh_CN.json +++ b/i18n/zh_CN.json @@ -28,7 +28,7 @@ "close_all_files": "关闭所有文件", "save_all_files": "保存所有文件", "format": "格式化", - "goget": "go get", + "gomod": "go mod", "goinstall": "go install", "build": "构建", "build_n_run": "构建并运行", @@ -102,9 +102,9 @@ "start-install": "开始 [go install]", "install-succ": "[go install] 成功", "install-error": "[go install] 失败", - "start-get": "开始 [go get]", - "get-succ": "[go get] 成功", - "get-error": "[go get] 失败", + "start-mod": "开始 [go mod]", + "mod-succ": "[go mod] 成功", + "mod-error": "[go mod] 失败", "check_version": "正在检查更新", "new_version_available": "新版本可用", "go_env": "Go 环境", diff --git a/i18n/zh_TW.json b/i18n/zh_TW.json index 6264682..6d7fd72 100644 --- a/i18n/zh_TW.json +++ b/i18n/zh_TW.json @@ -28,7 +28,7 @@ "close_all_files": "關閉所有檔案", "save_all_files": "儲存所有檔案", "format": "格式化", - "goget": "go get", + "gomod": "go mod", "goinstall": "go install", "build": "編譯", "build_n_run": "編譯並執行", @@ -102,9 +102,9 @@ "start-install": "開始 [go install]", "install-succ": "[go install] 成功", "install-error": "[go install] 失敗", - "start-get": "開始 [go get]", - "get-succ": "[go get] 成功", - "get-error": "[go get] 失敗", + "start-mod": "開始 [go mod]", + "mod-succ": "[go mod] 成功", + "mod-error": "[go mod] 失敗", "check_version": "正在檢查更新", "new_version_available": "可用新版本", "go_env": "Go 環境", diff --git a/main.go b/main.go index 3c0ed83..cf0c11e 100644 --- a/main.go +++ b/main.go @@ -106,7 +106,7 @@ func main() { http.HandleFunc("/stop", handlerWrapper(output.StopHandler)) http.HandleFunc("/go/test", handlerWrapper(output.GoTestHandler)) http.HandleFunc("/go/vet", handlerWrapper(output.GoVetHandler)) - http.HandleFunc("/go/get", handlerWrapper(output.GoGetHandler)) + http.HandleFunc("/go/mod", handlerWrapper(output.GoModHandler)) http.HandleFunc("/go/install", handlerWrapper(output.GoInstallHandler)) http.HandleFunc("/output/ws", handlerWrapper(output.WSHandler)) diff --git a/output/get.go b/output/mod.go similarity index 76% rename from output/get.go rename to output/mod.go index df94b69..5f67894 100644 --- a/output/get.go +++ b/output/mod.go @@ -30,8 +30,8 @@ import ( "github.com/b3log/wide/util" ) -// GoGetHandler handles request of go get. -func GoGetHandler(w http.ResponseWriter, r *http.Request) { +// GoModHandler handles request of go mod. +func GoModHandler(w http.ResponseWriter, r *http.Request) { result := util.NewResult() defer util.RetResult(w, r, result) @@ -57,7 +57,7 @@ func GoGetHandler(w http.ResponseWriter, r *http.Request) { filePath := args["file"].(string) curDir := filepath.Dir(filePath) - cmd := exec.Command("go", "get") + cmd := exec.Command("go", "mod") cmd.Dir = curDir setCmdEnv(cmd, uid) @@ -85,10 +85,10 @@ func GoGetHandler(w http.ResponseWriter, r *http.Request) { channelRet := map[string]interface{}{} if nil != session.OutputWS[sid] { - // display "START [go get]" in front-end browser + // display "START [go mod]" in front-end browser - channelRet["output"] = "" + i18n.Get(locale, "start-get").(string) + "\n" - channelRet["cmd"] = "start-get" + channelRet["output"] = "" + i18n.Get(locale, "start-mod").(string) + "\n" + channelRet["cmd"] = "start-mod" wsChannel := session.OutputWS[sid] @@ -114,22 +114,22 @@ func GoGetHandler(w http.ResponseWriter, r *http.Request) { defer util.Recover() defer cmd.Wait() - logger.Debugf("User [%s, %s] is running [go get] [runningId=%d]", uid, sid, runningId) + logger.Debugf("User [%s, %s] is running [go mod] [runningId=%d]", uid, sid, runningId) channelRet := map[string]interface{}{} - channelRet["cmd"] = "go get" + channelRet["cmd"] = "go mod" // read all buf, _ := ioutil.ReadAll(reader) if 0 != len(buf) { - logger.Debugf("User [%s, %s] 's [go get] [runningId=%d] has done (with error)", uid, sid, runningId) + logger.Debugf("User [%s, %s] 's [go mod] [runningId=%d] has done (with error)", uid, sid, runningId) - channelRet["output"] = "" + i18n.Get(locale, "get-error").(string) + "\n" + string(buf) + channelRet["output"] = "" + i18n.Get(locale, "mod-error").(string) + "\n" + string(buf) } else { - logger.Debugf("User [%s, %s] 's running [go get] [runningId=%d] has done", uid, sid, runningId) + logger.Debugf("User [%s, %s] 's running [go mod] [runningId=%d] has done", uid, sid, runningId) - channelRet["output"] = "" + i18n.Get(locale, "get-succ").(string) + "\n" + channelRet["output"] = "" + i18n.Get(locale, "mod-succ").(string) + "\n" } if nil != session.OutputWS[sid] { diff --git a/static/css/wide.css b/static/css/wide.css index 86572a4..f8a9232 100644 --- a/static/css/wide.css +++ b/static/css/wide.css @@ -260,21 +260,21 @@ .bottom-window-group .output .start-build, .bottom-window-group .output .start-test, .start-vet, .bottom-window-group .output .start-install, -.bottom-window-group .output .start-get { +.bottom-window-group .output .start-mod { color: #999; } .bottom-window-group .output .build-succ, .bottom-window-group .output .test-succ, .vet-succ, .bottom-window-group .output .install-succ, -.bottom-window-group .output .get-succ { +.bottom-window-group .output .mod-succ { color: rgb(0,153,0); } .bottom-window-group .output .build-error, .bottom-window-group .output .test-error, .vet-error, .bottom-window-group .output .install-error, -.bottom-window-group .output .get-error { +.bottom-window-group .output .mod-error { color: #9d0000; } diff --git a/static/css/wide.min.css b/static/css/wide.min.css index 384d5bc..a79cd2f 100644 --- a/static/css/wide.min.css +++ b/static/css/wide.min.css @@ -1,6 +1,6 @@ .dialog-close-icon,.dialog-close-icon:hover{text-decoration:none}.dialog-background{height:100%;left:0;opacity:.3;position:absolute;top:0;width:100%;filter:alpha(opacity=30);display:none;background-color:#000;z-index:99}.dialog-panel{position:absolute;z-index:100;display:none;-moz-user-select:none;user-select:none;box-shadow:0 2px 10px 1px #000}.dialog-title{float:left;line-height:22px;margin-left:3px;font-weight:700}.dialog-header-bg{height:23px;background-color:#bbb;cursor:move;width:100%}.dialog-close-icon{float:right;margin:3px}.dialog-main>div{width:100%}.dialog-footer{padding:10px;text-align:right}#dialogCloseEditor button,.dialog-footer button{margin:0 5px}#dialogAlert,#dialogRemoveConfirm,.dialog-form,.dialog-prompt{padding:10px 15px 0;overflow:hidden}.dialog-main input,.dialog-main select{width:100%;margin:2px auto}#dialogGoFilePrompt>ul{position:relative;height:260px;overflow:auto;margin-top:5px;background-color:#FFF;border:1px solid #919191}#dialogPreference{margin:10px}#dialogPreference .tabs-panel{padding:10px}#dialogPreference .preference{margin-bottom:10px}#dialogPreference img.gravatar{width:48px;height:48px} body,ul{margin:0}body,button,input{font-family:Helvetica}.list li,body{overflow:hidden}::-webkit-scrollbar{background:0 0;width:16px;height:16px}::-webkit-scrollbar-corner{display:none;background-color:transparent}::-webkit-scrollbar-thumb{border:0 solid transparent;border-right-width:4px;border-left-width:4px;border-radius:9px;box-shadow:inset 0 0 0 1px rgba(128,128,128,.2),inset 0 0 0 4px rgba(128,128,128,.2)}::-webkit-scrollbar-thumb:horizontal{border-bottom-width:4px;border-top-width:4px}body{font-size:13px;color:#000}ul{padding:0;list-style:none}*{box-sizing:border-box}a{color:#4183c4;text-decoration:none}a:hover{text-decoration:underline}img{vertical-align:middle}.fn-left{float:left}.fn-right{float:right}.fn-clear:after,.fn-clear:before{display:table;content:""}.fn-clear:after{clear:both}.fn-none{display:none}.ft-small{color:#999;font-size:12px}.ft-red{color:#9d0000}.list li{cursor:pointer;line-height:20px;padding:0 3px;word-wrap:normal;word-break:normal;white-space:nowrap;text-overflow:ellipsis}.list li.selected,.list li:hover{background-color:#3875d7;color:#FFF}.list li.selected .ft-small,.list li:hover .ft-small{color:#FFF}@font-face{font-family:icomoon;src:url(fonts/icomoon.eot?lqk80d);src:url(fonts/icomoon.eot?lqk80d#iefix) format('embedded-opentype'),url(fonts/icomoon.ttf?lqk80d) format('truetype'),url(fonts/icomoon.woff?lqk80d) format('woff'),url(fonts/icomoon.svg?lqk80d#icomoon) format('svg');font-weight:400;font-style:normal}[class*=" ico-"],[class^=ico-]{font-family:icomoon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;cursor:pointer;font-size:13px;line-height:20px}.ico-qqz:before{content:"\e900"}.ico-find:before{content:"\e602"}.ico-findfiles:before{content:"\e603"}.ico-editor:before{content:"\e604"}.ico-notification:before{content:"\e607"}.ico-price:before{content:"\e616"}.ico-report:before{content:"\e605"}.ico-git:before{content:"\e624"}.ico-book:before{content:"\e623"}.ico-start:before{content:"\e9d7";text-shadow:0 0 rgba(0,0,0,.4)}.ico-tree:before{content:"\e600"}.ico-build:before{content:"\e601"}.ico-export:before{content:"\f0ed"}.ico-import:before{content:"\f0ee"}.ico-keyboard:before{content:"\f11c"}.ico-moveup:before{content:"\f148"}.ico-movedown:before{content:"\f149"}.ico-weibo:before{content:"\e621"}.ico-uniE608:before{content:"\e608"}.ico-max:before{content:"\e609"}.ico-remove:before{content:"\e60b"}.ico-buildrun:before{content:"\e60c"}.ico-about:before{content:"\e60d"}.ico-undo:before{content:"\e60e"}.ico-stop:before{content:"\e60f"}.ico-close:before{content:"\e611";text-shadow:0 0 rgba(0,0,0,.4)}.ico-format:before{content:"\e612"}.ico-restore:before{content:"\e613"}.toolbars .ico-restore:before{content:"\e60a"}.ico-min:before{content:"\e614";position:absolute;right:5px}.ico-redo:before{content:"\e615"}.ico-uniE617:before{content:"\e617"}.ico-signout:before{content:"\e618"}.ico-email:before{content:"\e619"}.ico-googleplus:before{content:"\e61a"}.ico-facebook:before{content:"\e61b"}.ico-twitter:before{content:"\e61c"}.ico-info:before{content:"\e61d"}.ico-goline:before{content:"\e61e"}.ico-share:before{content:"\e61f"}.ico-comment:before{content:"\e620"}.ico-github:before{content:"\f00a"}.ico-refresh:before{content:"\f021"}.ico-save:before{content:"\f0c7"} -.frame li,.tabs>div{padding:0 5px;cursor:pointer}.footer .cursor,.frame li,.menu>ul>li>span,.notification-count,.tabs>div{cursor:pointer}.ico,.menu .split,.menu>ul>li,.tabs>div{float:left}.frame{position:absolute;width:320px;z-index:21;display:none}.frame li{line-height:25px}.frame li.disabled,.frame li.disabled .font-ico,.frame li.disabled:hover .font-ico{color:#999}.frame a{color:#000;text-decoration:none}.frame a:hover,.frame li:hover a{color:#FFF}.frame .space{display:inline-block;width:20px;height:15px}.frame .font-ico{margin-right:5px;width:15px;display:inline-block;text-align:center}.tabs{height:21px;overflow:hidden;width:100%}.tabs>div{line-height:20px;height:20px}.tabs>div>span.changed{font-weight:700}.tabs-panel{overflow:auto;flex:1;height:100%}.edit-exprinfo,.edit-panel{position:absolute;overflow:hidden}.menu{display:block!important}.menu>ul>li>span{font-size:12px;line-height:21px;padding:4px 7px}.menu .split{border-left:1px solid #919191;height:21px;margin:0 5px 0 0}.menu img.gravatar{float:left;margin:2px 8px;height:17px;width:17px;border-radius:9px}#buildRun{color:#6DB14C;font-size:19px}#buildRun.ico-stop{color:#9d0000;font-size:16px}.share-panel{position:absolute;z-index:20;width:190px;padding:5px 0;right:0;top:21px}.share-panel .font-ico{font-size:20px;transition:all .2s ease-out 0s;margin:0 5px;width:24px}.share-panel .font-ico:hover{transform:rotate(360deg)}.edit-panel{left:20%;width:60%;height:70%;flex-flow:column;display:flex}.toolbars{position:absolute;right:5px;top:1px}.ico{background-image:url(../images/ico-file.png);height:16px;margin:2px 0 0 -2px;width:16px}.edit-exprinfo{z-index:10;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;max-height:20em;overflow-y:auto}.CodeMirror,.CodeMirror-hints{font-family:Consolas,'Courier New',monospace}.CodeMirror-hints .ico{margin:-1px 2px 0 -1px}.CodeMirror-focused .cm-matchhighlight{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAFklEQVQI12NgYGBgkKzc8x9CMDAwAAAmhwSbidEoSQAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x}.CodeMirror-hint{padding-right:18px;max-width:none}.CodeMirror-hint:hover{background:#08f;color:#fff}.CodeMirror div.CodeMirror-cursor{border-left:2px solid #333}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:transparent}.bottom-window-group{background-color:#fff;flex-flow:column}.bottom-window-group .output{font-family:Consolas,Courier New,monospace;padding:0 5px;line-height:16px;font-size:12px;overflow-x:scroll;outline:0}.bottom-window-group .output pre{margin:0;font-family:Consolas,'Courier New',monospace}.bottom-window-group .output .start-build,.bottom-window-group .output .start-get,.bottom-window-group .output .start-install,.bottom-window-group .output .start-test,.start-vet{color:#999}.bottom-window-group .output .build-succ,.bottom-window-group .output .get-succ,.bottom-window-group .output .install-succ,.bottom-window-group .output .test-succ,.vet-succ{color:#090}.bottom-window-group .output .build-error,.bottom-window-group .output .get-error,.bottom-window-group .output .install-error,.bottom-window-group .output .test-error,.vet-error{color:#9d0000}.bottom-window-group .output .stderr{color:gray;font-style:italic}.bottom-window-group .output .path{text-decoration:underline;cursor:pointer}.bottom-window-group table{width:100%}.bottom-window-group td{border-bottom:1px solid #919191;font-size:12px;line-height:19px}.bottom-window-group .notification{outline:0}.bottom-window-group .notification .severity,.bottom-window-group .notification .type{width:50px;padding:0 5px}.bottom-window-group .search{display:flex;flex-flow:column;outline:0}.footer{box-shadow:0 1px 0 0 rgba(255,255,255,.06) inset;padding-left:5px;line-height:18px;display:block!important}.notification-count{float:right;display:none;background-color:#9d0000;color:#FFF;margin:1px 5px;padding:0 2px;border-radius:3px;line-height:16px} +.frame li,.tabs>div{padding:0 5px;cursor:pointer}.footer .cursor,.frame li,.menu>ul>li>span,.notification-count,.tabs>div{cursor:pointer}.ico,.menu .split,.menu>ul>li,.tabs>div{float:left}.frame{position:absolute;width:320px;z-index:21;display:none}.frame li{line-height:25px}.frame li.disabled,.frame li.disabled .font-ico,.frame li.disabled:hover .font-ico{color:#999}.frame a{color:#000;text-decoration:none}.frame a:hover,.frame li:hover a{color:#FFF}.frame .space{display:inline-block;width:20px;height:15px}.frame .font-ico{margin-right:5px;width:15px;display:inline-block;text-align:center}.tabs{height:21px;overflow:hidden;width:100%}.tabs>div{line-height:20px;height:20px}.tabs>div>span.changed{font-weight:700}.tabs-panel{overflow:auto;flex:1;height:100%}.edit-exprinfo,.edit-panel{position:absolute;overflow:hidden}.menu{display:block!important}.menu>ul>li>span{font-size:12px;line-height:21px;padding:4px 7px}.menu .split{border-left:1px solid #919191;height:21px;margin:0 5px 0 0}.menu img.gravatar{float:left;margin:2px 8px;height:17px;width:17px;border-radius:9px}#buildRun{color:#6DB14C;font-size:19px}#buildRun.ico-stop{color:#9d0000;font-size:16px}.share-panel{position:absolute;z-index:20;width:190px;padding:5px 0;right:0;top:21px}.share-panel .font-ico{font-size:20px;transition:all .2s ease-out 0s;margin:0 5px;width:24px}.share-panel .font-ico:hover{transform:rotate(360deg)}.edit-panel{left:20%;width:60%;height:70%;flex-flow:column;display:flex}.toolbars{position:absolute;right:5px;top:1px}.ico{background-image:url(../images/ico-file.png);height:16px;margin:2px 0 0 -2px;width:16px}.edit-exprinfo{z-index:10;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;max-height:20em;overflow-y:auto}.CodeMirror,.CodeMirror-hints{font-family:Consolas,'Courier New',monospace}.CodeMirror-hints .ico{margin:-1px 2px 0 -1px}.CodeMirror-focused .cm-matchhighlight{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAFklEQVQI12NgYGBgkKzc8x9CMDAwAAAmhwSbidEoSQAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x}.CodeMirror-hint{padding-right:18px;max-width:none}.CodeMirror-hint:hover{background:#08f;color:#fff}.CodeMirror div.CodeMirror-cursor{border-left:2px solid #333}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:transparent}.bottom-window-group{background-color:#fff;flex-flow:column}.bottom-window-group .output{font-family:Consolas,Courier New,monospace;padding:0 5px;line-height:16px;font-size:12px;overflow-x:scroll;outline:0}.bottom-window-group .output pre{margin:0;font-family:Consolas,'Courier New',monospace}.bottom-window-group .output .start-build,.bottom-window-group .output .start-install,.bottom-window-group .output .start-mod,.bottom-window-group .output .start-test,.start-vet{color:#999}.bottom-window-group .output .build-succ,.bottom-window-group .output .install-succ,.bottom-window-group .output .mod-succ,.bottom-window-group .output .test-succ,.vet-succ{color:#090}.bottom-window-group .output .build-error,.bottom-window-group .output .install-error,.bottom-window-group .output .mod-error,.bottom-window-group .output .test-error,.vet-error{color:#9d0000}.bottom-window-group .output .stderr{color:gray;font-style:italic}.bottom-window-group .output .path{text-decoration:underline;cursor:pointer}.bottom-window-group table{width:100%}.bottom-window-group td{border-bottom:1px solid #919191;font-size:12px;line-height:19px}.bottom-window-group .notification{outline:0}.bottom-window-group .notification .severity,.bottom-window-group .notification .type{width:50px;padding:0 5px}.bottom-window-group .search{display:flex;flex-flow:column;outline:0}.footer{box-shadow:0 1px 0 0 rgba(255,255,255,.06) inset;padding-left:5px;line-height:18px;display:block!important}.notification-count{float:right;display:none;background-color:#9d0000;color:#FFF;margin:1px 5px;padding:0 2px;border-radius:3px;line-height:16px} .side{width:20%;position:absolute;height:100%;z-index:8;flex-flow:column;display:flex}.side-max{width:100%;z-index:11}.side-right .tabs-panel>div{overflow:auto}.side-right{flex-flow:column}#outline .ico{margin:1px 5px 0}.ico-func{background-position:-123px -21px}.ico-interface{background-position:-143px -21px}.ico-const{background-position:-103px -21px}.ico-var{background-position:-63px -21px}.ico-struct{background-position:-83px -21px}.ico-type{background-position:-163px -21px}.ico-package{background-position:-183px -21px}.ztree{width:100%;padding:0;outline:0;border:0}.ztree li a.curSelectedNode{background-color:#3875d7;border-width:0;color:#fff;height:18px;opacity:1}.ztree li a:hover{text-decoration:none}.ztree li>a>span.button,.ztree li>a>span.button.ico-ztree-dir,.ztree li>a>span.button.ico-ztree-dir-api,.ztree li>a>span.button.ico-ztree-dir-workspace{margin-right:2px}.ztree li>a>span.button{background-image:url(../images/ico-file.png);margin-right:0}.ico-ztree-dir{background-position:-2px -23px}.ico-ztree-dir-api{background-position:-22px -23px}.ico-ztree-dir-workspace{background-position:-42px -23px}.ico-ztree-html{background-position:-4px -2px}.ico-ztree-go{background-position:-22px -2px}.ico-ztree-css{background-position:-42px -2px}.ico-ztree-img{background-position:-63px -2px}.ico-ztree-other{background-position:-83px -2px}.ico-ztree-text{background-position:-103px -2px}.ico-ztree-sql{background-position:-123px -2px}.ico-ztree-pro{background-position:-142px -2px}.ico-ztree-md{background-position:-162px -2px}.ico-ztree-js{background-position:-182px -2px}.ico-ztree-xml{background-position:-202px -2px} #startPage{padding:50px 70px;line-height:28px;white-space:normal;word-wrap:break-word;overflow:auto}#startPage a{color:#4183c4;text-decoration:none}#startPage a:hover{text-decoration:underline}#startPage .title{background-color:#BBB;border-bottom-width:0!important;border-radius:3px 3px 0 0;font-size:15px;margin-bottom:10px;padding:5px 10px;color:#FFF}#startPage .details li.border,#startPage .news li{border-bottom:1px solid #919191}#startPage .details{width:30%;float:left}#startPage .details label{color:#666}#startPage .details li.border{padding-bottom:5px;margin-bottom:5px}#startPage .details li.border.workspace{line-height:18px;padding-bottom:10px!important;word-wrap:break-word;white-space:normal;word-break:break-all}#startPage .news{width:60%;float:right;border-left:1px solid #f1f1f1;margin-left:10%;padding-left:10%;white-space:nowrap;overflow:hidden}#startPage .date{color:#bbb;font-size:13px;word-wrap:normal;white-space:nowrap} #dialogAboutDialog .dialog-main{background-color:#FFF}#dialogAbout{margin:35px 20px;line-height:28px}#dialogAbout .item{margin:0 10px}#dialogAbout a{color:#4183c4;text-decoration:none}#dialogAbout a:hover{text-decoration:underline}#dialogAbout label{color:#666}#dialogAbout img{width:100px;float:left;margin-right:60px}#dialogAbout .space{margin-bottom:6px;border-bottom:1px solid #919191;padding-bottom:6px}#dialogAbout .thx ul{margin-left:50px}#dialogAbout .thx a{width:80px;display:inline-block}#dialogAbout .license{color:#999;font-size:12px;line-height:normal;height:85px;overflow-x:hidden;word-wrap:break-word} \ No newline at end of file diff --git a/static/js/menu.js b/static/js/menu.js index 3472fdd..c556aac 100644 --- a/static/js/menu.js +++ b/static/js/menu.js @@ -172,7 +172,7 @@ var menu = { openAbout: function () { $("#dialogAbout").dialog("open"); }, - goget: function () { + gomod: function () { menu.saveAllFiles(); var currentPath = editors.getCurrentPath(); @@ -189,7 +189,7 @@ var menu = { $.ajax({ type: 'POST', - url: '/go/get', + url: '/go/mod', data: JSON.stringify(request), dataType: "json", beforeSend: function () { diff --git a/static/js/wide.js b/static/js/wide.js index c8e2cb9..93e63f5 100644 --- a/static/js/wide.js +++ b/static/js/wide.js @@ -390,14 +390,14 @@ var wide = { case 'start-test': case 'start-vet': case 'start-install': - case 'start-get': + case 'start-mod': bottomGroup.fillOutput(data.output); break; case 'go test': case 'go vet': case 'go install': - case 'go get': + case 'go mod': bottomGroup.fillOutput($('.bottom-window-group .output > div').html() + data.output); break; diff --git a/static/js/wide.min.js b/static/js/wide.min.js index ecd0495..7e31192 100644 --- a/static/js/wide.min.js +++ b/static/js/wide.min.js @@ -3,9 +3,9 @@ var Tabs=function(e){e._$tabsPanel=$(e.id+" > .tabs-panel"),e._$tabs=$(e.id+" > var editors={autocompleteMutex:!1,data:[],tabs:{},getEditorByPath:function(e){for(var t=0,o=editors.data.length;t div[data-index="'+$(".edit-panel .frame").data("index")+"]").find(".ico-close").click()},closeOther:function(){var t=$(".edit-panel .frame").data("index"),o=[];if($(".edit-panel .tabs > div").each(function(e){t!==$(this).data("index")&&o.push($(this).data("index"))}),0===o.length)return!1;var e=o.splice(0,1);$("#dialogCloseEditor").data("removeData",o),$('.edit-panel .tabs > div[data-index="'+e+'"]').find(".ico-close").click()},_removeAllMarker:function(){var e=$("#dialogCloseEditor").data("removeData");if(e&&0 div[data-index="'+t+'"] .ico-close').click()}wide.curEditor&&wide.curEditor.focus()},_initClose:function(){new ZeroClipboard($("#copyFilePath")),$(".edit-panel").on("mouseup",".tabs > div",function(e){if(e.stopPropagation(),0===e.button)return $(".edit-panel .frame").hide(),!1;var t=e.screenX;return"auto"!==$(".side").css("left")&&"0px"!==$(".side").css("left")||(t=e.screenX-$(".side").width()),$(".edit-panel .frame").show().css({left:t+"px",top:"21px"}).data("index",$(this).data("index")),$("#copyFilePath").attr("data-clipboard-text",$(this).find("span:eq(0)").attr("title")),!1})},init:function(){$("#dialogCloseEditor").dialog({modal:!0,height:90,width:260,title:config.label.tip,hideFooter:!0,afterOpen:function(e){$("#dialogCloseEditor > div:eq(0)").html(config.label.file+" "+e+". "+config.label.confirm_save+"?"),$("#dialogCloseEditor button:eq(0)").focus()},afterInit:function(){$("#dialogCloseEditor button.save").click(function(){var e=$("#dialogCloseEditor").data("index");wide.fmt(editors.data[e].id,editors.data[e].editor),editors.tabs.del(editors.data[e].id),$("#dialogCloseEditor").dialog("close"),editors._removeAllMarker()}),$("#dialogCloseEditor button.discard").click(function(){var e=$("#dialogCloseEditor").data("index");editors.tabs.del(editors.data[e].id),$("#dialogCloseEditor").dialog("close"),editors._removeAllMarker()}),$("#dialogCloseEditor button.cancel").click(function(e){$("#dialogCloseEditor").dialog("close"),editors._removeAllMarker()})}}),editors.tabs=new Tabs({id:".edit-panel",setAfter:function(){wide.curEditor&&wide.curEditor.focus()},clickAfter:function(e){if("startPage"===e)return wide.curEditor=void 0,$(".footer .cursor").text(""),wide.refreshOutline(),!1},removeBefore:function(e){if("startPage"===e)return editors._removeAllMarker(),!0;for(var t=0,o=editors.data.length;t div[data-index="'+editors.data[t].id+'"] > span:eq(0)').text()),$("#dialogCloseEditor").data("index",t),!1)},removeAfter:function(e,t){0===$(".edit-panel .tabs > div").length&&menu.disabled(["close-all"]);for(var o=0,i=editors.data.length;o '+config.label.start_page+"",content:'
',after:function(){$("#startPage").load("/start?sid="+config.wideSessionId),$.ajax({url:"https://hacpai.com/apis/articles?tags=wide,golang&p=1&size=20",type:"GET",dataType:"jsonp",jsonp:"callback",success:function(e,t){var o=e.articles;if(0!==o.length){var i=o.length;9边看边练",a=0;a"+n.articleTitle+"  "+s(n.articleCreateTime,"yyyy-MM-dd")}$("#startPage .news").html(r+"")}}})}})},getCurrentId:function(){var e=editors.tabs.getCurrentId();return"startPage"===e&&(e=null),e},getCurrentPath:function(){var e=$(".edit-panel .tabs .current span:eq(0)").attr("title");return e===config.label.start_page&&(e=null),e},_initCodeMirrorHotKeys:function(){CodeMirror.registerHelper("hint","go",function(a){for(var e=/[\w$]+/,t=(a=wide.curEditor).getCursor(),o=a.getLine(t.line),i=t.ch,r=i;r span:eq(0)").attr("title"),n.code=a.getValue(),n.cursorLine=t.line,n.cursorCh=t.ch;var s=[];if(!editors.autocompleteMutex||!a.state.completionActive)return editors.autocompleteMutex=!0,$.ajax({async:!1,type:"POST",url:"/autocomplete",data:JSON.stringify(n),dataType:"json",success:function(e){var t=e[1];if(t)for(var o=0;o'+t[o].name+" "+t[o].type+"";break;case"const":i=''+t[o].name+" "+t[o].type+"";break;case"var":i=''+t[o].name+" "+t[o].type+"";break;case"package":i=''+t[o].name+" "+t[o].type+"";break;case"func":i=''+t[o].name+""+t[o].type.substring(4)+"",r+="()";break;default:console.warn("Can't handle autocomplete ["+t[o].class+"]")}s[o]={displayText:i,text:r}}a.doc.markClean(),$(".edit-panel .tabs .current > span:eq(0)").removeClass("changed")}}),setTimeout(function(){editors.autocompleteMutex=!1},20),{list:s,from:CodeMirror.Pos(t.line,i),to:CodeMirror.Pos(t.line,r)}}),CodeMirror.commands.autocompleteAfterDot=function(e){var t=e.getMode();if(t&&"go"!==t.name)return CodeMirror.Pass;var o=e.getTokenAt(e.getCursor());return"comment"===o.type||"string"===o.type||setTimeout(function(){e.state.completionActive||e.showHint({hint:CodeMirror.hint.go,completeSingle:!1})},50),CodeMirror.Pass},CodeMirror.commands.autocompleteAnyWord=function(e){e.showHint({hint:CodeMirror.hint.auto})},CodeMirror.commands.gotoLine=function(e){$("#dialogGoLinePrompt").dialog("open")},CodeMirror.commands.doNothing=function(e){},CodeMirror.commands.exprInfo=function(e){var t=wide.curEditor.getCursor(),o=newWideRequest();o.path=$(".edit-panel .tabs .current > span:eq(0)").attr("title"),o.code=wide.curEditor.getValue(),o.cursorLine=t.line,o.cursorCh=t.ch,$.ajax({type:"POST",url:"/exprinfo",data:JSON.stringify(o),dataType:"json",success:function(e){if(e.succ){var t=wide.curEditor.cursorCoords();$("body").append('
'+e.data+"
")}}})},CodeMirror.commands.copyLinesDown=function(e){var t="",o=e.listSelections()[0],i=o.anchor,r=o.head;i.line>r.line&&(i=o.head,r=o.anchor);for(var a=i.line,n=r.line;a<=n;a++)0===r.ch&&a===n||(t+="\n"+e.getLine(a));var s=r.line;0===r.ch&&(s=r.line-1),e.replaceRange(t,CodeMirror.Pos(s));var d=s-i.line+1;e.setSelection(CodeMirror.Pos(i.line+d,i.ch),CodeMirror.Pos(r.line+d,r.ch))},CodeMirror.commands.copyLinesUp=function(e){var t="",o=e.listSelections()[0],i=o.anchor,r=o.head;i.line>r.line&&(i=o.head,r=o.anchor);for(var a=i.line,n=r.line;a<=n;a++)0===r.ch&&a===n||(t+="\n"+e.getLine(a));var s=r.line;0===r.ch&&(s=r.line-1),e.replaceRange(t,CodeMirror.Pos(s)),e.setSelection(CodeMirror.Pos(i.line,i.ch),CodeMirror.Pos(r.line,r.ch))},CodeMirror.commands.moveLinesUp=function(e){var t=e.listSelections()[0],o=t.anchor,i=t.head;if(o.line>i.line&&(o=t.head,i=t.anchor),0===o.line)return!1;var r=i.line;0===i.ch&&(r=i.line-1),e.replaceRange("\n"+e.getLine(o.line-1),CodeMirror.Pos(r)),1===o.line?e.replaceRange("",CodeMirror.Pos(0,0),CodeMirror.Pos(1,0)):e.replaceRange("",CodeMirror.Pos(o.line-2,e.getLine(o.line-2).length),CodeMirror.Pos(o.line-1,e.getLine(o.line-1).length)),e.setSelection(CodeMirror.Pos(o.line-1,o.ch),CodeMirror.Pos(i.line-1,i.ch))},CodeMirror.commands.moveLinesDown=function(e){var t=e.listSelections()[0],o=t.anchor,i=t.head;if(o.line>i.line&&(o=t.head,i=t.anchor),i.line===e.lastLine())return!1;var r=i.line;0===i.ch&&(r=i.line-1),0===o.line?e.replaceRange(e.getLine(r+1)+"\n",CodeMirror.Pos(0,0)):e.replaceRange("\n"+e.getLine(r+1),CodeMirror.Pos(o.line-1)),e.replaceRange("",CodeMirror.Pos(r+1,e.getLine(r+1).length),CodeMirror.Pos(r+2,e.getLine(r+2).length)),e.setSelection(CodeMirror.Pos(o.line+1,o.ch),CodeMirror.Pos(i.line+1,i.ch))},CodeMirror.commands.jumpToDecl=function(e){var t=wide.curEditor.getCursor(),o=newWideRequest();o.path=$(".edit-panel .tabs .current > span:eq(0)").attr("title"),o.code=wide.curEditor.getValue(),o.cursorLine=t.line,o.cursorCh=t.ch,$.ajax({type:"POST",url:"/find/decl",data:JSON.stringify(o),dataType:"json",success:function(e){if(e.succ){var t=e.data,o=tree.getTIdByPath(t.path);wide.curNode=tree.fileTree.getNodeByTId(o),tree.fileTree.selectNode(wide.curNode),tree.openFile(wide.curNode,CodeMirror.Pos(t.cursorLine-1,t.cursorCh-1))}}})},CodeMirror.commands.findUsages=function(e){var t=wide.curEditor.getCursor(),o=newWideRequest();o.path=$(".edit-panel .tabs .current > span:eq(0)").attr("title"),o.code=wide.curEditor.getValue(),o.cursorLine=t.line,o.cursorCh=t.ch,$.ajax({type:"POST",url:"/find/usages",data:JSON.stringify(o),dataType:"json",success:function(e){e.succ&&editors.appendSearch(e.data,"usages","")}})},CodeMirror.commands.selectIdentifier=function(e){var t=e.getCursor(),o=e.findWordAt(t);e.extendSelection(o.anchor,o.head)}},appendSearch:function(e,t,o){for(var i='
    ',r=(o=o.toLowerCase(),0),a=e.length;r"+p+""),n+=e[r].contents[0].substring(d-s[c].length,d)+p}i+='
  • '+n+"    "+e[r].path+' ('+e[r].line+":"+e[r].ch+")
  • "}0===e.length&&(i+="
  • "+config.label.search_no_match+"
  • "),i+="
";var f=$(".bottom-window-group .search"),g=config.label.find_usages;"founds"===t&&(g=config.label.search_text),0===f.find("ul").length?(bottomGroup.searchTab=new Tabs({id:".bottom-window-group .search",removeAfter:function(e,t){1===f.find("ul").length&&f.find(".tabs").hide()}}),f.on("click","li",function(){f.find("li").removeClass("selected"),$(this).addClass("selected")}),f.on("dblclick","li",function(){var e=$(this),t=tree.getTIdByPath(e.attr("title"));tree.openFile(tree.fileTree.getNodeByTId(t)),tree.fileTree.selectNode(wide.curNode);var o=e.find(".position").data("line")-1,i=CodeMirror.Pos(o,e.find(".position").data("ch")-1),r=wide.curEditor;r.setCursor(i);var a=Math.floor(r.getScrollInfo().clientHeight/r.defaultTextHeight()/2),n=r.cursorCoords({line:i.line-a,ch:0},"local");r.scrollTo(0,n.top),wide.curEditor.focus()}),f.find(".tabs-panel > div").append(i),f.find(".tabs .first").text(g)):(f.find(".tabs").show(),bottomGroup.searchTab.add({id:"search"+(new Date).getTime(),title:g,content:i})),bottomGroup.tabs.setCurrent("search"),windows.flowBottom(),$(".bottom-window-group .search").focus()},newEditor:function(e,t){var o=wide.curNode.id;editors.tabs.add({id:o,title:''+wide.curNode.name+"",content:''}),menu.undisabled(["save-all","close-all","build","run","go-test","go-vet","go-get","go-install","find","find-next","find-previous","replace","replace-all","format","autocomplete","jump-to-decl","expr-info","find-usages","toggle-comment","edit"]);var i=document.getElementById("editor"+o);i.value=e.content;var r=CodeMirror.fromTextArea(i,{lineNumbers:!0,autofocus:!0,autoCloseBrackets:!0,matchBrackets:!0,highlightSelectionMatches:{showToken:/\w/},rulers:[{color:"#ccc",column:120,lineStyle:"dashed"}],styleActiveLine:!0,theme:config.editorTheme,tabSize:config.editorTabSize,indentUnit:4,indentWithTabs:!0,foldGutter:!0,cursorHeight:1,path:e.path,readOnly:wide.curNode.isGOAPI,profile:"xhtml",extraKeys:{"Ctrl-\\":"autocompleteAnyWord",".":"autocompleteAfterDot","Ctrl-/":"toggleComment","Ctrl-I":"exprInfo","Ctrl-L":"gotoLine","Ctrl-E":"deleteLine","Ctrl-D":"doNothing","Ctrl-B":"jumpToDecl","Ctrl-S":function(){wide.saveFile()},"Shift-Ctrl-S":function(){menu.saveAllFiles()},"Shift-Alt-F":function(){var e=editors.getCurrentPath();if(!e)return!1;wide.fmt(e,wide.curEditor)},"Alt-F7":"findUsages","Shift-Alt-Enter":function(){windows.isMaxEditor?windows.restoreEditor():windows.maxEditor()},"Shift-Ctrl-Up":"copyLinesUp","Shift-Ctrl-Down":"copyLinesDown","Shift-Alt-Up":"moveLinesUp","Shift-Alt-Down":"moveLinesDown","Shift-Alt-J":"selectIdentifier"}});"text/html"===e.mode&&emmetCodeMirror(r),r.on("cursorActivity",function(e){$(".edit-exprinfo").remove();var t=e.getCursor();$(".footer .cursor").text("| "+(t.line+1)+":"+(t.ch+1)+" |")}),r.on("blur",function(e){$(".edit-exprinfo").remove()}),r.on("changes",function(t){t.doc.isClean()?$(".edit-panel .tabs > div").each(function(){var e=$(this).find("span:eq(0)");e.attr("title")===t.options.path&&e.removeClass("changed")}):$(".edit-panel .tabs > div").each(function(){var e=$(this).find("span:eq(0)");e.attr("title")===t.options.path&&e.addClass("changed")})}),r.on("keydown",function(e,t){if(!(t.altKey||t.ctrlKey||t.shiftKey)){var o=t.which;o<48||57 table"),i="";n.cmd&&"init-notification"===n.cmd?console.log("[notification onmessage]"+o.data):(i+=''+n.severity+''+n.message+''+n.type+"",t.append(i),$(".notification-count").show())},o.onclose=function(o){console.log("[notification onclose] disconnected ("+o.code+")")},o.onerror=function(o){console.log("[notification onerror]")}}}; var tree={fileTree:void 0,getCurrentNodeLastNode:function(e){var i=e.children[e.children.length-1];return i.open?tree.getCurrentNodeLastNode(i):i},getNextShowNode:function(e){return 0!==e.level?e.getParentNode().getNextNode()?e.getParentNode().getNextNode():tree.getNextShowNode(e.getParentNode()):e.getNextNode()},isBottomNode:function(e){return!e.open&&(e.getParentNode()?!!e.getParentNode().isLastNode&&tree.isBottomNode(e.getParentNode()):!!e.isLastNode)},getTIdByPath:function(e){for(var i=tree.fileTree.transformToArray(tree.fileTree.getNodes()),t=0,o=i.length;t$(".content").height()&&(o=o-r.height()-25),r.css({top:o+"px",left:e.clientX+"px",display:"block"}).show(),a.hide()}else{wide.curNode.removable?a.find(".remove").removeClass("disabled"):a.find(".remove").addClass("disabled"),-1===wide.curNode.path.indexOf("zip",wide.curNode.path.length-"zip".length)?a.find(".decompress").hide():a.find(".decompress").show(),-1===wide.curNode.path.indexOf("go",wide.curNode.path.length-"go".length)?a.find(".linux64").hide():a.find(".linux64").show();var o=e.clientY-10;a.height()+o>$(".content").height()&&(o=o-a.height()-25),a.css({top:o+"px",left:e.clientX+"px",display:"block"}).show(),r.hide(),menu.disabled(["import","git-clone"])}$("#files").focus()}},onClick:function(e,i,t,o){t&&(wide.curNode=t,tree.fileTree.selectNode(t),menu.undisabled(["import","export","git-clone"]),tree.isDir()||menu.disabled(["import","git-clone"]),$("#files").focus())}}};tree.fileTree=$.fn.zTree.init($("#files"),i,e.data.children),session.restore()}}}),this._initSearch(),this._initRename()},openFile:function(o,e){wide.curNode=o;for(var r=e,i=0,t=editors.data.length;i input:eq(0)").keyup(function(e){var i=$(this).closest(".dialog-main").find(".dialog-footer > button:eq(0)");13!==e.which||i.prop("disabled")||i.click(),""===$.trim($(this).val())?i.prop("disabled",!0):i.prop("disabled",!1)}),$("#dialogSearchForm > input:eq(1)").keyup(function(e){var i=$(this).closest(".dialog-main").find(".dialog-footer > button:eq(0)");13!==e.which||i.prop("disabled")||i.click()}),$("#dialogSearchForm").dialog({modal:!0,height:80,width:260,title:config.label.search,okText:config.label.search,cancelText:config.label.cancel,afterOpen:function(){$("#dialogSearchForm > input:eq(0)").val("").focus(),$("#dialogSearchForm > input:eq(1)").val(""),$("#dialogSearchForm").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var i=newWideRequest();wide.curNode?i.dir=wide.curNode.path:i.dir="",i.text=$("#dialogSearchForm > input:eq(0)").val(),i.extension=$("#dialogSearchForm > input:eq(1)").val(),$.ajax({type:"POST",url:"/file/search/text",data:JSON.stringify(i),dataType:"json",success:function(e){e.succ&&($("#dialogSearchForm").dialog("close"),editors.appendSearch(e.data,"founds",i.text))}})}})},_initRename:function(){$("#dialogRenamePrompt").dialog({modal:!0,height:52,width:260,title:config.label.rename,okText:config.label.rename,cancelText:config.label.cancel,afterOpen:function(){$("#dialogRenamePrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0),$("#dialogRenamePrompt > input").val(wide.curNode.name).select().focus()},ok:function(){var e=$("#dialogRenamePrompt > input").val(),i=newWideRequest();i.oldPath=wide.curNode.path,i.newPath=wide.curNode.path.substring(0,wide.curNode.path.lastIndexOf("/")+1)+e,$.ajax({type:"POST",url:"/file/rename",data:JSON.stringify(i),dataType:"json",success:function(e){if(!e.succ)return $("#dialogRenamePrompt").dialog("close"),bottomGroup.tabs.setCurrent("notification"),windows.flowBottom(),$(".bottom-window-group .notification").focus(),!1;$("#dialogRenamePrompt").dialog("close")}})}})}}; -var wide={curNode:void 0,curEditor:void 0,curProcessId:void 0,refreshOutline:function(){if(!wide.curEditor||wide.curEditor&&"go"!==wide.curEditor.doc.getMode().name)return $("#outline").html(""),!1;var e=newWideRequest();e.code=wide.curEditor.getValue(),$.ajax({type:"POST",async:!1,url:"/outline",data:JSON.stringify(e),dataType:"json",success:function(e){if(e.succ){for(var t=e.data,o='
    ',i=["constDecls","varDecls","funcDecls","structDecls","interfaceDecls","typeDecls"],a=0,l=i.length;a '+c.Name+""}$("#outline").html(o+"
"),$("#outline li").dblclick(function(){var e=$(this),t=CodeMirror.Pos(e.data("line"),e.data("ch")),o=wide.curEditor;o.setCursor(t);var i=Math.floor(o.getScrollInfo().clientHeight/o.defaultTextHeight()/2),a=o.cursorCoords({line:t.line-i,ch:0},"local");o.scrollTo(0,a.top),o.focus()})}}})},_initDialog:function(){$(".dialog-prompt > input").keyup(function(e){var t=$(this).closest(".dialog-main").find(".dialog-footer > button:eq(0)");13!==e.which||t.prop("disabled")||t.click(),""===$.trim($(this).val())?t.prop("disabled",!0):t.prop("disabled",!1)}),$("#dialogAlert").dialog({modal:!0,height:40,width:350,title:config.label.tip,hiddenOk:!0,cancelText:config.label.confirm,afterOpen:function(e){$("#dialogAlert").html(e)}}),$("#dialogRemoveConfirm").dialog({modal:!0,height:36,width:260,title:config.label.delete,okText:config.label.delete,cancelText:config.label.cancel,afterOpen:function(){$("#dialogRemoveConfirm > b").html('"'+wide.curNode.name+'"')},ok:function(){var e=newWideRequest();e.path=wide.curNode.path,$.ajax({type:"POST",url:"/file/remove",data:JSON.stringify(e),dataType:"json",success:function(e){if(!e.succ)return $("#dialogRemoveConfirm").dialog("close"),bottomGroup.tabs.setCurrent("notification"),windows.flowBottom(),$(".bottom-window-group .notification").focus(),!1;$("#dialogRemoveConfirm").dialog("close")}})}}),$("#dialogNewFilePrompt").dialog({modal:!0,height:52,width:260,title:config.label.create_file,okText:config.label.create,cancelText:config.label.cancel,afterOpen:function(){$("#dialogNewFilePrompt > input").val("").focus(),$("#dialogNewFilePrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var t=newWideRequest(),e=$("#dialogNewFilePrompt > input").val();t.path=wide.curNode.path+"/"+e,t.fileType="f",$.ajax({type:"POST",url:"/file/new",data:JSON.stringify(t),dataType:"json",success:function(e){if(!e.succ)return $("#dialogNewFilePrompt").dialog("close"),bottomGroup.tabs.setCurrent("notification"),windows.flowBottom(),$(".bottom-window-group .notification").focus(),!1;$("#dialogNewFilePrompt").dialog("close"),setTimeout(function(){var e=tree.getTIdByPath(t.path);tree.openFile(tree.fileTree.getNodeByTId(e)),tree.fileTree.selectNode(wide.curNode)},100)}})}}),$("#dialogNewDirPrompt").dialog({modal:!0,height:52,width:260,title:config.label.create_dir,okText:config.label.create,cancelText:config.label.cancel,afterOpen:function(){$("#dialogNewDirPrompt > input").val("").focus(),$("#dialogNewDirPrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var e=$("#dialogNewDirPrompt > input").val(),t=newWideRequest();t.path=wide.curNode.path+"/"+e,t.fileType="d",$.ajax({type:"POST",url:"/file/new",data:JSON.stringify(t),dataType:"json",success:function(e){if(!e.succ)return $("#dialogNewDirPrompt").dialog("close"),bottomGroup.tabs.setCurrent("notification"),windows.flowBottom(),$(".bottom-window-group .notification").focus(),!1;$("#dialogNewDirPrompt").dialog("close")}})}}),$("#dialogGoFilePrompt").dialog({modal:!0,height:320,width:660,title:config.label.goto_file,okText:config.label.go,cancelText:config.label.cancel,afterInit:function(){$("#dialogGoFilePrompt").on("dblclick","li",function(){var e=tree.getTIdByPath($(this).find(".ft-small").text());tree.openFile(tree.fileTree.getNodeByTId(e)),tree.fileTree.selectNode(wide.curNode),$("#dialogGoFilePrompt").dialog("close"),wide.curEditor.focus()}),$("#dialogGoFilePrompt").on("click","li",function(){var e=$("#dialogGoFilePrompt > .list");e.find("li").removeClass("selected"),e.data("index",$(this).data("index")),$(this).addClass("selected")}),hotkeys.bindList($("#dialogGoFilePrompt > input"),$("#dialogGoFilePrompt > .list"),function(e){var t=tree.getTIdByPath(e.find(".ft-small").text());tree.openFile(tree.fileTree.getNodeByTId(t)),tree.fileTree.selectNode(wide.curNode),$("#dialogGoFilePrompt").dialog("close"),wide.curEditor.focus()}),$("#dialogGoFilePrompt > input").bind("input",function(){var e=$("#dialogGoFilePrompt > input").val(),t=newWideRequest();t.path="",t.name="*"+e+"*",wide.curNode&&(t.path=wide.curNode.path),$.ajax({type:"POST",url:"/file/find/name",data:JSON.stringify(t),dataType:"json",success:function(e){if(e.succ){for(var t=e.data,o="",i=0,a=t.length;i'+n+'    '+l+"":'
  • '+n+'    '+l+"
  • "}$("#dialogGoFilePrompt > ul").html(o)}}})})},afterOpen:function(){$("#dialogGoFilePrompt > input").val("").focus(),$("#dialogGoFilePrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0),$("#dialogGoFilePrompt .list").html("").data("index",0)},ok:function(){var e=tree.getTIdByPath($("#dialogGoFilePrompt .selected .ft-small").text());tree.openFile(tree.fileTree.getNodeByTId(e)),tree.fileTree.selectNode(wide.curNode),$("#dialogGoFilePrompt").dialog("close"),wide.curEditor.focus()}}),$("#dialogGoLinePrompt").dialog({modal:!0,height:52,width:260,title:config.label.goto_line,okText:config.label.go,cancelText:config.label.cancel,afterOpen:function(){$("#dialogGoLinePrompt > input").val("").focus(),$("#dialogGoLinePrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var e=parseInt($("#dialogGoLinePrompt > input").val())-1;$("#dialogGoLinePrompt").dialog("close");var t=wide.curEditor,o=t.getCursor();t.setCursor(CodeMirror.Pos(e,o.ch));var i=Math.floor(t.getScrollInfo().clientHeight/t.defaultTextHeight()/2),a=t.cursorCoords({line:e-i,ch:o.ch},"local");t.scrollTo(0,a.top),t.focus()}})},_initWS:function(){var e=new ReconnectingWebSocket(config.channel+"/output/ws?sid="+config.wideSessionId);e.onopen=function(){console.log("[output onopen] connected")},e.onmessage=function(e){console.log("[output onmessage]"+e.data);var t=JSON.parse(e.data);(goLintFound&&(goLintFound=[]),"run"===t.nextCmd)&&((s=newWideRequest()).executable=t.executable,$.ajax({type:"POST",url:"/run",data:JSON.stringify(s),dataType:"json"}));switch(t.cmd){case"run":var o=$(".bottom-window-group .output > div").html();wide.curProcessId&&""!==o?bottomGroup.fillOutput(o.replace(/<\/pre>$/g,t.output+"")):bottomGroup.fillOutput(o+"
    "+t.output+"
    "),wide.curProcessId=t.pid;break;case"run-done":bottomGroup.fillOutput($(".bottom-window-group .output > div").html().replace(/<\/pre>$/g,t.output+"")),wide.curProcessId=void 0,$("#buildRun").removeClass("ico-stop").addClass("ico-buildrun").attr("title",config.label.build_n_run);break;case"start-build":case"start-test":case"start-vet":case"start-install":case"start-get":bottomGroup.fillOutput(t.output);break;case"go test":case"go vet":case"go install":case"go get":bottomGroup.fillOutput($(".bottom-window-group .output > div").html()+t.output);break;case"git clone":bottomGroup.fillOutput($(".bottom-window-group .output > div").html()+t.output),tree.fileTree.reAsyncChildNodes(wide.curNode,"refresh",!1);break;case"build":case"cross-build":if(bottomGroup.fillOutput($(".bottom-window-group .output > div").html()+t.output),t.lints){for(var i={},a=0;a ul > li").unbind().removeClass("selected"),menu.subMenu())}),window.onbeforeunload=function(){if(0 div").each(function(){var e=$(this).find("span:eq(0)");e.attr("title")===t&&e.removeClass("changed")})}})},saveFile:function(){var e=editors.getCurrentPath();if(!e)return!1;var t=wide.curEditor;if(t.doc.isClean())return!1;if("text/x-go"===t.getOption("mode")){wide.gofmt(e,wide.curEditor);var o=newWideRequest();return o.file=e,o.code=t.getValue(),o.nextCmd="",$.ajax({type:"POST",url:"/build",data:JSON.stringify(o),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}}),void wide.refreshOutline()}wide._save(e,wide.curEditor)},stop:function(){if($("#buildRun").hasClass("ico-buildrun"))return menu.run(),!1;if(!wide.curProcessId)return!1;var e=newWideRequest();e.pid=wide.curProcessId,$.ajax({type:"POST",url:"/stop",data:JSON.stringify(e),dataType:"json",success:function(e){$("#buildRun").removeClass("ico-stop").addClass("ico-buildrun").attr("title",config.label.build_n_run)}})},gofmt:function(t,o){var i=o.getCursor(),a=o.getScrollInfo(),e=newWideRequest();e.file=t,e.code=o.getValue(),e.cursorLine=i.line,e.cursorCh=i.ch,$.ajax({async:!1,type:"POST",url:"/go/fmt",data:JSON.stringify(e),dataType:"json",success:function(e){e.succ&&(o.setValue(e.data.code),o.setCursor(i),o.scrollTo(null,a.top),wide._save(t,o))}})},fmt:function(e,t){var o=t.getOption("mode"),i=t.getCursor(),a=t.getScrollInfo(),l=newWideRequest();l.file=e,l.code=t.getValue(),l.cursorLine=i.line,l.cursorCh=i.ch;var n=null;switch(o){case"text/x-go":$.ajax({async:!1,type:"POST",url:"/go/fmt",data:JSON.stringify(l),dataType:"json",success:function(e){e.succ&&(n=e.data.code)}});break;case"text/html":n=html_beautify(t.getValue());break;case"text/javascript":case"application/json":n=js_beautify(t.getValue());break;case"text/css":n=css_beautify(t.getValue())}n&&(t.setValue(n),t.setCursor(i),t.scrollTo(null,a.top),wide._save(e,t))},getClassBySuffix:function(e){var t="ico-ztree-other ";switch(e){case"html":case"htm":t="ico-ztree-html ";break;case"go":t="ico-ztree-go ";break;case"css":t="ico-ztree-css ";break;case"txt":t="ico-ztree-text ";break;case"sql":t="ico-ztree-sql ";break;case"properties":t="ico-ztree-pro ";break;case"md":t="ico-ztree-md ";break;case"json":t="ico-ztree-js ";break;case"xml":t="ico-ztree-xml ";break;case"jpg":case"jpeg":case"bmp":case"gif":case"png":case"svg":case"ico":t="ico-ztree-img "}return t}};$(document).ready(function(){wide.init(),tree.init(),menu.init(),hotkeys.init(),session.init(),notification.init(),editors.init(),windows.init(),bottomGroup.init()}); +var wide={curNode:void 0,curEditor:void 0,curProcessId:void 0,refreshOutline:function(){if(!wide.curEditor||wide.curEditor&&"go"!==wide.curEditor.doc.getMode().name)return $("#outline").html(""),!1;var e=newWideRequest();e.code=wide.curEditor.getValue(),$.ajax({type:"POST",async:!1,url:"/outline",data:JSON.stringify(e),dataType:"json",success:function(e){if(e.succ){for(var t=e.data,o='
      ',i=["constDecls","varDecls","funcDecls","structDecls","interfaceDecls","typeDecls"],a=0,l=i.length;a '+c.Name+""}$("#outline").html(o+"
    "),$("#outline li").dblclick(function(){var e=$(this),t=CodeMirror.Pos(e.data("line"),e.data("ch")),o=wide.curEditor;o.setCursor(t);var i=Math.floor(o.getScrollInfo().clientHeight/o.defaultTextHeight()/2),a=o.cursorCoords({line:t.line-i,ch:0},"local");o.scrollTo(0,a.top),o.focus()})}}})},_initDialog:function(){$(".dialog-prompt > input").keyup(function(e){var t=$(this).closest(".dialog-main").find(".dialog-footer > button:eq(0)");13!==e.which||t.prop("disabled")||t.click(),""===$.trim($(this).val())?t.prop("disabled",!0):t.prop("disabled",!1)}),$("#dialogAlert").dialog({modal:!0,height:40,width:350,title:config.label.tip,hiddenOk:!0,cancelText:config.label.confirm,afterOpen:function(e){$("#dialogAlert").html(e)}}),$("#dialogRemoveConfirm").dialog({modal:!0,height:36,width:260,title:config.label.delete,okText:config.label.delete,cancelText:config.label.cancel,afterOpen:function(){$("#dialogRemoveConfirm > b").html('"'+wide.curNode.name+'"')},ok:function(){var e=newWideRequest();e.path=wide.curNode.path,$.ajax({type:"POST",url:"/file/remove",data:JSON.stringify(e),dataType:"json",success:function(e){if(!e.succ)return $("#dialogRemoveConfirm").dialog("close"),bottomGroup.tabs.setCurrent("notification"),windows.flowBottom(),$(".bottom-window-group .notification").focus(),!1;$("#dialogRemoveConfirm").dialog("close")}})}}),$("#dialogNewFilePrompt").dialog({modal:!0,height:52,width:260,title:config.label.create_file,okText:config.label.create,cancelText:config.label.cancel,afterOpen:function(){$("#dialogNewFilePrompt > input").val("").focus(),$("#dialogNewFilePrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var t=newWideRequest(),e=$("#dialogNewFilePrompt > input").val();t.path=wide.curNode.path+"/"+e,t.fileType="f",$.ajax({type:"POST",url:"/file/new",data:JSON.stringify(t),dataType:"json",success:function(e){if(!e.succ)return $("#dialogNewFilePrompt").dialog("close"),bottomGroup.tabs.setCurrent("notification"),windows.flowBottom(),$(".bottom-window-group .notification").focus(),!1;$("#dialogNewFilePrompt").dialog("close"),setTimeout(function(){var e=tree.getTIdByPath(t.path);tree.openFile(tree.fileTree.getNodeByTId(e)),tree.fileTree.selectNode(wide.curNode)},100)}})}}),$("#dialogNewDirPrompt").dialog({modal:!0,height:52,width:260,title:config.label.create_dir,okText:config.label.create,cancelText:config.label.cancel,afterOpen:function(){$("#dialogNewDirPrompt > input").val("").focus(),$("#dialogNewDirPrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var e=$("#dialogNewDirPrompt > input").val(),t=newWideRequest();t.path=wide.curNode.path+"/"+e,t.fileType="d",$.ajax({type:"POST",url:"/file/new",data:JSON.stringify(t),dataType:"json",success:function(e){if(!e.succ)return $("#dialogNewDirPrompt").dialog("close"),bottomGroup.tabs.setCurrent("notification"),windows.flowBottom(),$(".bottom-window-group .notification").focus(),!1;$("#dialogNewDirPrompt").dialog("close")}})}}),$("#dialogGoFilePrompt").dialog({modal:!0,height:320,width:660,title:config.label.goto_file,okText:config.label.go,cancelText:config.label.cancel,afterInit:function(){$("#dialogGoFilePrompt").on("dblclick","li",function(){var e=tree.getTIdByPath($(this).find(".ft-small").text());tree.openFile(tree.fileTree.getNodeByTId(e)),tree.fileTree.selectNode(wide.curNode),$("#dialogGoFilePrompt").dialog("close"),wide.curEditor.focus()}),$("#dialogGoFilePrompt").on("click","li",function(){var e=$("#dialogGoFilePrompt > .list");e.find("li").removeClass("selected"),e.data("index",$(this).data("index")),$(this).addClass("selected")}),hotkeys.bindList($("#dialogGoFilePrompt > input"),$("#dialogGoFilePrompt > .list"),function(e){var t=tree.getTIdByPath(e.find(".ft-small").text());tree.openFile(tree.fileTree.getNodeByTId(t)),tree.fileTree.selectNode(wide.curNode),$("#dialogGoFilePrompt").dialog("close"),wide.curEditor.focus()}),$("#dialogGoFilePrompt > input").bind("input",function(){var e=$("#dialogGoFilePrompt > input").val(),t=newWideRequest();t.path="",t.name="*"+e+"*",wide.curNode&&(t.path=wide.curNode.path),$.ajax({type:"POST",url:"/file/find/name",data:JSON.stringify(t),dataType:"json",success:function(e){if(e.succ){for(var t=e.data,o="",i=0,a=t.length;i'+n+'    '+l+"":'
  • '+n+'    '+l+"
  • "}$("#dialogGoFilePrompt > ul").html(o)}}})})},afterOpen:function(){$("#dialogGoFilePrompt > input").val("").focus(),$("#dialogGoFilePrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0),$("#dialogGoFilePrompt .list").html("").data("index",0)},ok:function(){var e=tree.getTIdByPath($("#dialogGoFilePrompt .selected .ft-small").text());tree.openFile(tree.fileTree.getNodeByTId(e)),tree.fileTree.selectNode(wide.curNode),$("#dialogGoFilePrompt").dialog("close"),wide.curEditor.focus()}}),$("#dialogGoLinePrompt").dialog({modal:!0,height:52,width:260,title:config.label.goto_line,okText:config.label.go,cancelText:config.label.cancel,afterOpen:function(){$("#dialogGoLinePrompt > input").val("").focus(),$("#dialogGoLinePrompt").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var e=parseInt($("#dialogGoLinePrompt > input").val())-1;$("#dialogGoLinePrompt").dialog("close");var t=wide.curEditor,o=t.getCursor();t.setCursor(CodeMirror.Pos(e,o.ch));var i=Math.floor(t.getScrollInfo().clientHeight/t.defaultTextHeight()/2),a=t.cursorCoords({line:e-i,ch:o.ch},"local");t.scrollTo(0,a.top),t.focus()}})},_initWS:function(){var e=new ReconnectingWebSocket(config.channel+"/output/ws?sid="+config.wideSessionId);e.onopen=function(){console.log("[output onopen] connected")},e.onmessage=function(e){console.log("[output onmessage]"+e.data);var t=JSON.parse(e.data);(goLintFound&&(goLintFound=[]),"run"===t.nextCmd)&&((s=newWideRequest()).executable=t.executable,$.ajax({type:"POST",url:"/run",data:JSON.stringify(s),dataType:"json"}));switch(t.cmd){case"run":var o=$(".bottom-window-group .output > div").html();wide.curProcessId&&""!==o?bottomGroup.fillOutput(o.replace(/<\/pre>$/g,t.output+"")):bottomGroup.fillOutput(o+"
    "+t.output+"
    "),wide.curProcessId=t.pid;break;case"run-done":bottomGroup.fillOutput($(".bottom-window-group .output > div").html().replace(/<\/pre>$/g,t.output+"")),wide.curProcessId=void 0,$("#buildRun").removeClass("ico-stop").addClass("ico-buildrun").attr("title",config.label.build_n_run);break;case"start-build":case"start-test":case"start-vet":case"start-install":case"start-mod":bottomGroup.fillOutput(t.output);break;case"go test":case"go vet":case"go install":case"go mod":bottomGroup.fillOutput($(".bottom-window-group .output > div").html()+t.output);break;case"git clone":bottomGroup.fillOutput($(".bottom-window-group .output > div").html()+t.output),tree.fileTree.reAsyncChildNodes(wide.curNode,"refresh",!1);break;case"build":case"cross-build":if(bottomGroup.fillOutput($(".bottom-window-group .output > div").html()+t.output),t.lints){for(var i={},a=0;a ul > li").unbind().removeClass("selected"),menu.subMenu())}),window.onbeforeunload=function(){if(0 div").each(function(){var e=$(this).find("span:eq(0)");e.attr("title")===t&&e.removeClass("changed")})}})},saveFile:function(){var e=editors.getCurrentPath();if(!e)return!1;var t=wide.curEditor;if(t.doc.isClean())return!1;if("text/x-go"===t.getOption("mode")){wide.gofmt(e,wide.curEditor);var o=newWideRequest();return o.file=e,o.code=t.getValue(),o.nextCmd="",$.ajax({type:"POST",url:"/build",data:JSON.stringify(o),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}}),void wide.refreshOutline()}wide._save(e,wide.curEditor)},stop:function(){if($("#buildRun").hasClass("ico-buildrun"))return menu.run(),!1;if(!wide.curProcessId)return!1;var e=newWideRequest();e.pid=wide.curProcessId,$.ajax({type:"POST",url:"/stop",data:JSON.stringify(e),dataType:"json",success:function(e){$("#buildRun").removeClass("ico-stop").addClass("ico-buildrun").attr("title",config.label.build_n_run)}})},gofmt:function(t,o){var i=o.getCursor(),a=o.getScrollInfo(),e=newWideRequest();e.file=t,e.code=o.getValue(),e.cursorLine=i.line,e.cursorCh=i.ch,$.ajax({async:!1,type:"POST",url:"/go/fmt",data:JSON.stringify(e),dataType:"json",success:function(e){e.succ&&(o.setValue(e.data.code),o.setCursor(i),o.scrollTo(null,a.top),wide._save(t,o))}})},fmt:function(e,t){var o=t.getOption("mode"),i=t.getCursor(),a=t.getScrollInfo(),l=newWideRequest();l.file=e,l.code=t.getValue(),l.cursorLine=i.line,l.cursorCh=i.ch;var n=null;switch(o){case"text/x-go":$.ajax({async:!1,type:"POST",url:"/go/fmt",data:JSON.stringify(l),dataType:"json",success:function(e){e.succ&&(n=e.data.code)}});break;case"text/html":n=html_beautify(t.getValue());break;case"text/javascript":case"application/json":n=js_beautify(t.getValue());break;case"text/css":n=css_beautify(t.getValue())}n&&(t.setValue(n),t.setCursor(i),t.scrollTo(null,a.top),wide._save(e,t))},getClassBySuffix:function(e){var t="ico-ztree-other ";switch(e){case"html":case"htm":t="ico-ztree-html ";break;case"go":t="ico-ztree-go ";break;case"css":t="ico-ztree-css ";break;case"txt":t="ico-ztree-text ";break;case"sql":t="ico-ztree-sql ";break;case"properties":t="ico-ztree-pro ";break;case"md":t="ico-ztree-md ";break;case"json":t="ico-ztree-js ";break;case"xml":t="ico-ztree-xml ";break;case"jpg":case"jpeg":case"bmp":case"gif":case"png":case"svg":case"ico":t="ico-ztree-img "}return t}};$(document).ready(function(){wide.init(),tree.init(),menu.init(),hotkeys.init(),session.init(),notification.init(),editors.init(),windows.init(),bottomGroup.init()}); var session={init:function(){this._initWS();var s=function(e){var t="normal";return e.isClosed?t="min":e.size>=$("body").width()&&(t="max"),t};setInterval(function(){var e,t=newWideRequest(),o=[],n=editors.getCurrentId()?editors.getCurrentPath():"";editors.tabs.obj._$tabs.find("div").each(function(){var e=$(this);e.find("span:eq(0)").attr("title")!==config.label.start_page&&o.push(e.find("span:eq(0)").attr("title"))}),e=tree.getOpenPaths(),t.currentFile=n,t.fileTree=e,t.files=o,t.layout={side:{size:windows.outerLayout.west.state.size,state:s(windows.outerLayout.west.state)},sideRight:{size:windows.innerLayout.east.state.size,state:s(windows.innerLayout.east.state)},bottom:{size:windows.innerLayout.south.state.size,state:s(windows.innerLayout.south.state)}},$.ajax({type:"POST",url:"/session/save",data:JSON.stringify(t),dataType:"json",success:function(e){}})},3e4)},restore:function(){if(config.latestSessionContent){for(var e=config.latestSessionContent.fileTree,t=config.latestSessionContent.files,o=config.latestSessionContent.currentFile,n="",s=[],r=tree.fileTree.transformToArray(tree.fileTree.getNodes()),i=0,a=r.length;i'+("Connected to server [sid="+config.wideSessionId+"], "+function(e,t){var o=new Date(e),n={"M+":o.getMonth()+1,"d+":o.getDate(),"h+":o.getHours(),"m+":o.getMinutes(),"s+":o.getSeconds(),"q+":Math.floor((o.getMonth()+3)/3),S:o.getMilliseconds()};for(var s in/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(o.getFullYear()+"").substr(4-RegExp.$1.length))),n)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1===RegExp.$1.length?n[s]:("00"+n[s]).substr((""+n[s]).length)));return t}((new Date).getTime(),"yyyy-MM-dd hh:mm:ss"))+''+e+"",$(".bottom-window-group .notification > table").append(t)},e.onmessage=function(e){var t=JSON.parse(e.data);switch(t.cmd){case"create-file":var o=tree.fileTree.getNodeByTId(tree.getTIdByPath(t.dir)),n=t.path.replace(t.dir+"/",""),s=CodeMirror.findModeByFileName(n),r=wide.getClassBySuffix(n.split(".")[1]);t.type&&"f"===t.type?tree.fileTree.addNodes(o,[{id:t.path,name:n,iconSkin:r,path:t.path,mode:s,removable:!0,creatable:!0}]):tree.fileTree.addNodes(o,[{id:t.path,name:n,iconSkin:"ico-ztree-dir ",path:t.path,removable:!0,creatable:!0,isParent:!0}]);break;case"remove-file":case"rename-file":o=tree.fileTree.getNodeByTId(tree.getTIdByPath(t.path));tree.fileTree.removeNode(o);for(var i=tree.fileTree.transformToArray(o),a=0,d=i.length;a'+("Disconnected from server, trying to reconnect it [sid="+config.wideSessionId+"]")+''+t+"",$(".bottom-window-group .notification > table").append(o),$(".notification-count").show()},e.onerror=function(e){console.log("[session onerror]")}}}; -var menu={init:function(){this.subMenu(),this._initPreference(),this._initAbout(),this._initShare(),$(".menu .frame li").click(function(){$(".menu > ul > li").unbind().removeClass("selected"),menu.subMenu()})},_initShare:function(){$(".menu .ico-share").hover(function(){$(".menu .share-panel").show()}),$(".share-panel .font-ico").click(function(){var e=$(this).attr("class").split("-")[2],t="https://wide.b3log.org",a="https://wide.b3log.org/static/images/wide-logo.png",i={};i.email="mailto:?subject="+$("title").text()+"&body="+$("meta[name=description]").attr("content")+" "+t;var n=encodeURIComponent($("meta[name=description]").attr("content")+" "+t+" #golang");i.twitter="https://twitter.com/intent/tweet?status="+n,i.facebook="https://www.facebook.com/sharer/sharer.php?u="+t,i.googleplus="https://plus.google.com/share?url="+t;var o=encodeURIComponent($("title").text()+". \n"+$("meta[name=description]").attr("content")+" #golang#");i.weibo="http://v.t.sina.com.cn/share/share.php?title="+o+"&url="+t+"&pic="+a,i.qqz="https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url="+t+"&sharesource=qzone&title="+o+"&pics="+a,window.open(i[e],"_blank","top=100,left=200,width=648,height=618")})},_initAbout:function(){$("#dialogAbout").load("/about",function(){$("#dialogAbout").dialog({modal:!0,title:config.label.about,hideFooter:!0,afterOpen:function(){$.ajax({url:"https://rhythm.b3log.org/version/wide/latest",type:"GET",dataType:"jsonp",jsonp:"callback",success:function(e,t){$("#dialogAbout .version").text()===e.wideVersion?$(".upgrade").text(config.label.uptodate):$(".upgrade").html(config.label.new_version_available+config.label.colon+""+e.wideVersion+"")}})}})})},disabled:function(e){for(var t=0,a=e.length;t ul > li").click(function(e){1!==$(e.target).closest(".frame").length&&($(this).find(".frame").show(),$(".menu > ul > li").removeClass("selected"),$(this).addClass("selected"),$(".menu > ul > li").unbind(),$(".menu > ul > li").mouseover(function(){1!==$(e.target).closest(".frame").length&&($(".menu .frame").hide(),$(this).find(".frame").show(),$(".menu > ul > li").removeClass("selected"),$(this).addClass("selected"))}))})},openPreference:function(){$("#dialogPreference").dialog("open")},saveAllFiles:function(){if($(".menu li.save-all").hasClass("disabled"))return!1;for(var e=0,t=editors.data.length;e div").each(function(e){0!==e&&t.push($(this).data("index"))}),$("#dialogCloseEditor").data("removeData",t),$(".edit-panel .tabs .ico-close:eq(0)").click()},exit:function(){var e=newWideRequest();$.ajax({type:"POST",url:"/logout",data:JSON.stringify(e),dataType:"json",success:function(e){e.succ&&(window.location.href="/login")}})},openAbout:function(){$("#dialogAbout").dialog("open")},goget:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.go-get").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,$.ajax({type:"POST",url:"/go/get",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},goinstall:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.go-install").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,$.ajax({type:"POST",url:"/go/install",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},test:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.go-test").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,$.ajax({type:"POST",url:"/go/test",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},govet:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.go-vet").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,$.ajax({type:"POST",url:"/go/vet",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},run:function(){if(menu.saveAllFiles(),$("#buildRun").hasClass("ico-stop"))return wide.stop(),!1;var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.run").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,t.code=wide.curEditor.getValue(),t.nextCmd="run",$.ajax({type:"POST",url:"/build",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput(),$("#buildRun").addClass("ico-stop").removeClass("ico-buildrun").attr("title",config.label.stop)},success:function(e){}})},build:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.build").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,t.code=wide.curEditor.getValue(),t.nextCmd="",$.ajax({type:"POST",url:"/build",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},_initPreference:function(){$("#dialogPreference").load("/preference",function(){$("#dialogPreference input").keyup(function(){var t=!1,a=[],e="";$("#dialogPreference input").each(function(){var e=$(this);e.val()!=e.data("value")&&(t=!0),""===$.trim(e.val())&&a.push(e)});var i=$("#dialogPreference").closest(".dialog-main").find(".dialog-footer > button:eq(0)");if(t?i.prop("disabled",!1):i.prop("disabled",!0),0===a.length)$("#dialogPreference").find(".tip").html(""),i.prop("disabled",!1);else{for(var n=0,o=a.length;n div[data-index="'+l+'"]').text()+"] -> ["+r.substr(0,r.length-1)+"]: "+config.label.no_empty+"
    "}$("#dialogPreference").find(".tip").html(e),i.prop("disabled",!0)}}),$("#dialogPreference select").on("change",function(){var e=!1;$("#dialogPreference select").each(function(){$(this).val()!==$(this).data("value")&&(e=!0)});var t=$("#dialogPreference").closest(".dialog-main").find(".dialog-footer > button:eq(0)");e?t.prop("disabled",!1):t.prop("disabled",!0)}),$("#dialogPreference").dialog({modal:!0,height:280,width:800,title:config.label.preference,okText:config.label.apply,cancelText:config.label.cancel,afterOpen:function(){$("#dialogPreference").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var e=newWideRequest(),t=$("#dialogPreference"),o=t.find("input[name=fontFamily]"),l=t.find("input[name=fontSize]"),r=t.find("select[name=goFmt]"),s=t.find("input[name=GoBuildArgsForLinux]"),d=t.find("input[name=GoBuildArgsForWindows]"),u=t.find("input[name=GoBuildArgsForDarwin]"),c=t.find("input[name=workspace]"),f=t.find("input[name=password]"),p=t.find("input[name=email]"),g=t.find("select[name=locale]"),v=t.find("select[name=theme]"),m=t.find("input[name=editorFontFamily]"),h=t.find("input[name=editorFontSize]"),b=t.find("input[name=editorLineHeight]"),w=t.find("select[name=editorTheme]"),y=t.find("input[name=editorTabSize]"),P=t.find("select[name=keymap]");$.extend(e,{fontFamily:o.val(),fontSize:l.val(),goFmt:r.val(),GoBuildArgsForLinux:s.val(),GoBuildArgsForWindows:d.val(),GoBuildArgsForDarwin:u.val(),workspace:c.val(),password:f.val(),locale:g.val(),theme:v.val(),editorFontFamily:m.val(),editorFontSize:h.val(),editorLineHeight:b.val(),editorTheme:w.val(),editorTabSize:y.val(),keymap:P.val()}),config.keymap!==P.val()&&window.location.reload(),$.ajax({type:"POST",url:"/preference",data:JSON.stringify(e),success:function(e,t,a){if(!e.succ)return!1;o.data("value",o.val()),l.data("value",l.val()),r.data("value",r.val()),s.data("value",s.val()),d.data("value",d.val()),u.data("value",u.val()),c.data("value",c.val()),f.data("value",f.val()),p.data("value",p.val()),g.data("value",g.val()),v.data("value",v.val()),m.data("value",m.val()),h.data("value",h.val()),b.data("value",b.val()),w.data("value",w.val()),y.data("value",y.val()),P.data("value",P.val()),config.keymap=P.val(),$("#dialogPreference").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0),$("#themesLink").attr("href","/static/css/themes/"+v.val()+".css"),config.editorTheme=w.val();for(var i=0,n=editors.data.length;i ul > li").unbind().removeClass("selected"),menu.subMenu()})},_initShare:function(){$(".menu .ico-share").hover(function(){$(".menu .share-panel").show()}),$(".share-panel .font-ico").click(function(){var e=$(this).attr("class").split("-")[2],t="https://wide.b3log.org",a="https://wide.b3log.org/static/images/wide-logo.png",i={};i.email="mailto:?subject="+$("title").text()+"&body="+$("meta[name=description]").attr("content")+" "+t;var n=encodeURIComponent($("meta[name=description]").attr("content")+" "+t+" #golang");i.twitter="https://twitter.com/intent/tweet?status="+n,i.facebook="https://www.facebook.com/sharer/sharer.php?u="+t,i.googleplus="https://plus.google.com/share?url="+t;var o=encodeURIComponent($("title").text()+". \n"+$("meta[name=description]").attr("content")+" #golang#");i.weibo="http://v.t.sina.com.cn/share/share.php?title="+o+"&url="+t+"&pic="+a,i.qqz="https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url="+t+"&sharesource=qzone&title="+o+"&pics="+a,window.open(i[e],"_blank","top=100,left=200,width=648,height=618")})},_initAbout:function(){$("#dialogAbout").load("/about",function(){$("#dialogAbout").dialog({modal:!0,title:config.label.about,hideFooter:!0,afterOpen:function(){$.ajax({url:"https://rhythm.b3log.org/version/wide/latest",type:"GET",dataType:"jsonp",jsonp:"callback",success:function(e,t){$("#dialogAbout .version").text()===e.wideVersion?$(".upgrade").text(config.label.uptodate):$(".upgrade").html(config.label.new_version_available+config.label.colon+""+e.wideVersion+"")}})}})})},disabled:function(e){for(var t=0,a=e.length;t ul > li").click(function(e){1!==$(e.target).closest(".frame").length&&($(this).find(".frame").show(),$(".menu > ul > li").removeClass("selected"),$(this).addClass("selected"),$(".menu > ul > li").unbind(),$(".menu > ul > li").mouseover(function(){1!==$(e.target).closest(".frame").length&&($(".menu .frame").hide(),$(this).find(".frame").show(),$(".menu > ul > li").removeClass("selected"),$(this).addClass("selected"))}))})},openPreference:function(){$("#dialogPreference").dialog("open")},saveAllFiles:function(){if($(".menu li.save-all").hasClass("disabled"))return!1;for(var e=0,t=editors.data.length;e div").each(function(e){0!==e&&t.push($(this).data("index"))}),$("#dialogCloseEditor").data("removeData",t),$(".edit-panel .tabs .ico-close:eq(0)").click()},exit:function(){var e=newWideRequest();$.ajax({type:"POST",url:"/logout",data:JSON.stringify(e),dataType:"json",success:function(e){e.succ&&(window.location.href="/login")}})},openAbout:function(){$("#dialogAbout").dialog("open")},gomod:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.go-get").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,$.ajax({type:"POST",url:"/go/mod",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},goinstall:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.go-install").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,$.ajax({type:"POST",url:"/go/install",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},test:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.go-test").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,$.ajax({type:"POST",url:"/go/test",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},govet:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.go-vet").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,$.ajax({type:"POST",url:"/go/vet",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},run:function(){if(menu.saveAllFiles(),$("#buildRun").hasClass("ico-stop"))return wide.stop(),!1;var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.run").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,t.code=wide.curEditor.getValue(),t.nextCmd="run",$.ajax({type:"POST",url:"/build",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput(),$("#buildRun").addClass("ico-stop").removeClass("ico-buildrun").attr("title",config.label.stop)},success:function(e){}})},build:function(){menu.saveAllFiles();var e=editors.getCurrentPath();if(!e)return!1;if($(".menu li.build").hasClass("disabled"))return!1;var t=newWideRequest();t.file=e,t.code=wide.curEditor.getValue(),t.nextCmd="",$.ajax({type:"POST",url:"/build",data:JSON.stringify(t),dataType:"json",beforeSend:function(){bottomGroup.resetOutput()},success:function(e){}})},_initPreference:function(){$("#dialogPreference").load("/preference",function(){$("#dialogPreference input").keyup(function(){var t=!1,a=[],e="";$("#dialogPreference input").each(function(){var e=$(this);e.val()!=e.data("value")&&(t=!0),""===$.trim(e.val())&&a.push(e)});var i=$("#dialogPreference").closest(".dialog-main").find(".dialog-footer > button:eq(0)");if(t?i.prop("disabled",!1):i.prop("disabled",!0),0===a.length)$("#dialogPreference").find(".tip").html(""),i.prop("disabled",!1);else{for(var n=0,o=a.length;n div[data-index="'+l+'"]').text()+"] -> ["+r.substr(0,r.length-1)+"]: "+config.label.no_empty+"
    "}$("#dialogPreference").find(".tip").html(e),i.prop("disabled",!0)}}),$("#dialogPreference select").on("change",function(){var e=!1;$("#dialogPreference select").each(function(){$(this).val()!==$(this).data("value")&&(e=!0)});var t=$("#dialogPreference").closest(".dialog-main").find(".dialog-footer > button:eq(0)");e?t.prop("disabled",!1):t.prop("disabled",!0)}),$("#dialogPreference").dialog({modal:!0,height:280,width:800,title:config.label.preference,okText:config.label.apply,cancelText:config.label.cancel,afterOpen:function(){$("#dialogPreference").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0)},ok:function(){var e=newWideRequest(),t=$("#dialogPreference"),o=t.find("input[name=fontFamily]"),l=t.find("input[name=fontSize]"),r=t.find("select[name=goFmt]"),s=t.find("input[name=GoBuildArgsForLinux]"),d=t.find("input[name=GoBuildArgsForWindows]"),u=t.find("input[name=GoBuildArgsForDarwin]"),c=t.find("input[name=workspace]"),f=t.find("input[name=password]"),p=t.find("input[name=email]"),g=t.find("select[name=locale]"),v=t.find("select[name=theme]"),m=t.find("input[name=editorFontFamily]"),h=t.find("input[name=editorFontSize]"),b=t.find("input[name=editorLineHeight]"),w=t.find("select[name=editorTheme]"),y=t.find("input[name=editorTabSize]"),P=t.find("select[name=keymap]");$.extend(e,{fontFamily:o.val(),fontSize:l.val(),goFmt:r.val(),GoBuildArgsForLinux:s.val(),GoBuildArgsForWindows:d.val(),GoBuildArgsForDarwin:u.val(),workspace:c.val(),password:f.val(),locale:g.val(),theme:v.val(),editorFontFamily:m.val(),editorFontSize:h.val(),editorLineHeight:b.val(),editorTheme:w.val(),editorTabSize:y.val(),keymap:P.val()}),config.keymap!==P.val()&&window.location.reload(),$.ajax({type:"POST",url:"/preference",data:JSON.stringify(e),success:function(e,t,a){if(!e.succ)return!1;o.data("value",o.val()),l.data("value",l.val()),r.data("value",r.val()),s.data("value",s.val()),d.data("value",d.val()),u.data("value",u.val()),c.data("value",c.val()),f.data("value",f.val()),p.data("value",p.val()),g.data("value",g.val()),v.data("value",v.val()),m.data("value",m.val()),h.data("value",h.val()),b.data("value",b.val()),w.data("value",w.val()),y.data("value",y.val()),P.data("value",P.val()),config.keymap=P.val(),$("#dialogPreference").closest(".dialog-main").find(".dialog-footer > button:eq(0)").prop("disabled",!0),$("#themesLink").attr("href","/static/css/themes/"+v.val()+".css"),config.editorTheme=w.val();for(var i=0,n=editors.data.length;io.height()?40===e.which?o.scrollTop(o.scrollTop()+r.height()):o.scrollTop(r[0].offsetTop):o.scrollTop(0),38!==e.which&&40!==e.which&&13!==e.which&&void 0})},_bindOutput:function(){$(".bottom-window-group .output").keydown(function(e){var t=hotkeys.defaultKeyMap;if(e.altKey===t.clearWindow.altKey&&e.which===t.clearWindow.which)return bottomGroup.clear("output"),void e.preventDefault()})},_bindFileTree:function(){$("#files").keydown(function(e){e.preventDefault();var t=hotkeys.defaultKeyMap;if(e.ctrlKey!==t.search.ctrlKey||e.which!==t.search.which)if(e.ctrlKey!==t.rename.ctrlKey||e.which!==t.rename.which)switch(e.which){case 46:tree.removeIt();break;case 13:if(!wide.curNode)return!1;if(tree.isDir()){if(wide.curNode.open)return!1;tree.fileTree.expandNode(wide.curNode,!0,!1,!0),$("#files").focus();break}tree.openFile(wide.curNode);break;case 38:var i={};if(wide.curNode){if(wide.curNode&&wide.curNode.isFirstNode&&0===wide.curNode.level)return!1;i=wide.curNode.getPreNode(),wide.curNode.isFirstNode&&wide.curNode.getParentNode()&&(i=wide.curNode.getParentNode());var r=wide.curNode.getPreNode();r&&tree.isDir()&&r.open&&(i=tree.getCurrentNodeLastNode(r))}else i=tree.fileTree.getNodeByTId("files_1");wide.curNode=i,tree.fileTree.selectNode(i),$("#files").focus();break;case 40:i={};if(wide.curNode){if(wide.curNode&&tree.isBottomNode(wide.curNode))return!1;i=wide.curNode.getNextNode(),tree.isDir()&&wide.curNode.open&&(i=wide.curNode.children[0]);var o=tree.getNextShowNode(wide.curNode);wide.curNode.isLastNode&&0!==wide.curNode.level&&!wide.curNode.open&&o&&(i=o)}else i=tree.fileTree.getNodeByTId("files_1");i&&(wide.curNode=i,tree.fileTree.selectNode(i)),$("#files").focus();break;case 37:if(!wide.curNode)return wide.curNode=tree.fileTree.getNodeByTId("files_1"),tree.fileTree.selectNode(wide.curNode),$("#files").focus(),!1;if(!tree.isDir()||!wide.curNode.open)return!1;tree.fileTree.expandNode(wide.curNode,!1,!1,!0),$("#files").focus();break;case 39:if(!wide.curNode)return wide.curNode=tree.fileTree.getNodeByTId("files_1"),tree.fileTree.selectNode(wide.curNode),$("#files").focus(),!1;if(!tree.isDir()||wide.curNode.open)return!1;tree.fileTree.expandNode(wide.curNode,!0,!1,!0),$("#files").focus();break;case 116:if(!wide.curNode||!tree.isDir())return!1;tree.refresh(wide.curNode)}else wide.curNode.removable&&$("#dialogRenamePrompt").dialog("open");else $("#dialogSearchForm").dialog("open")})},_bindDocument:function(){var l=this.defaultKeyMap;$(document).keydown(function(e){if(e.ctrlKey===l.goEditor.ctrlKey&&e.which===l.goEditor.which)return l.goEditor.fun(),void e.preventDefault();if(e.ctrlKey===l.goFileTree.ctrlKey&&e.which===l.goFileTree.which)return l.goFileTree.fun(),void e.preventDefault();if(e.ctrlKey===l.goOutline.ctrlKey&&e.which===l.goOutline.which)return l.goOutline.fun(),void e.preventDefault();if(e.ctrlKey===l.goOutput.ctrlKey&&e.which===l.goOutput.which)return l.goOutput.fun(),void e.preventDefault();if(e.ctrlKey===l.goSearch.ctrlKey&&e.which===l.goSearch.which)return l.goSearch.fun(),void e.preventDefault();if(e.ctrlKey===l.goNotification.ctrlKey&&e.which===l.goNotification.which)return l.goNotification.fun(),void e.preventDefault();if(e.ctrlKey===l.closeCurEditor.ctrlKey&&e.which===l.closeCurEditor.which)return $(".edit-panel .tabs > div.current").find(".ico-close").click(),void e.preventDefault();if(e.ctrlKey!==l.changeEditor.ctrlKey||e.which!==l.changeEditor.which)return e.which===l.build.which?(menu.build(),void e.preventDefault()):e.which===l.buildRun.which?(menu.run(),void e.preventDefault()):void(e.ctrlKey===l.goFile.ctrlKey&&e.altKey===l.goFile.altKey&&e.shiftKey===l.goFile.shiftKey&&e.which===l.goFile.which&&$("#dialogGoFilePrompt").dialog("open"));if("notification"===document.activeElement.className||"output"===document.activeElement.className||"search"===document.activeElement.className){for(var t=["output","search","notification"],i="",r=0,o=t.length;r div").text("")},resetOutput:function(){this.clear("output"),bottomGroup.tabs.setCurrent("output"),windows.flowBottom()},_initTabs:function(){this.tabs=new Tabs({id:".bottom-window-group",clickAfter:function(t){this._$tabsPanel.find("."+t).focus()}})},fillOutput:function(t){var o=$(".bottom-window-group .output");-1!==(t=(t=t.replace(/\r/g,"")).replace(/\n/g,"
    ")).indexOf("
    ")&&(t=Autolinker.link(t)),o.find("div").html(t),o.parent().scrollTop(o[0].scrollHeight)}}; diff --git a/static/js/wide.min.js.map b/static/js/wide.min.js.map index d085435..f22b11a 100644 --- a/static/js/wide.min.js.map +++ b/static/js/wide.min.js.map @@ -1 +1 @@ -{"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","find","add","getCurrentId","$tabsPanel","append","title","content","after","prevId","$tabs","stack","children","remove","i","removeAfter","path","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","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","k","test","RegExp","$1","getFullYear","substr","start_page","load","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","class","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","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","refresh","reAsyncChildNodes","$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","dir","extension","select","oldPath","newPath","lastIndexOf","curProcessId","outlineHTML","decls","maxj","Ch","Line","Name","dblclick","_initDialog","confirm","delete","create_file","create","fileType","create_dir","goto_file","$list","hotkeys","bindList","$selected","goFileHTML","icoSkin","getClassBySuffix","goto_line","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","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","qqz","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","$GoBuildArgsForLinux","$GoBuildArgsForWindows","$GoBuildArgsForDarwin","$workspace","$password","$email","$locale","$theme","$editorFontFamily","$editorFontSize","$editorLineHeight","$editorTheme","$editorTabSize","$keymap","fontFamily","fontSize","goFmt","GoBuildArgsForLinux","GoBuildArgsForWindows","GoBuildArgsForDarwin","workspace","password","locale","editorFontFamily","editorFontSize","editorLineHeight","reload","jqXHR","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","currentId","nextTId","_initTabs","_initFrame","$path","mouseup","offsetY","$output","Autolinker","link"],"mappings":"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","file":"wide.min.js","sourcesContent":["/*\r\n * Copyright (c) 2014-present, 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 * https://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 Liyuan Li\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('
    '\r\n + data.title + '
    ');\r\n $tabsPanel.append('
    ' + data.content\r\n + '
    ');\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-present, 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 * https://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 Liyuan Li\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: \"v@b3log.org\"\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 = \"
    \"\r\n + settings.title + \"
    \";\r\n\r\n // Sets footerHTML.\r\n if (!settings.hideFooter) {\r\n if (!settings.hiddenOk) {\r\n footerHTML = \"\";\r\n }\r\n footerHTML += \"\";\r\n }\r\n\r\n var dialogHTML = \"
    \" + headerHTML\r\n + \"
    \"\r\n + footerHTML + \"
    \";\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 = \"
    \";\r\n }\r\n\r\n // Package dialog.\r\n $(\"#\" + id).wrap(\"
    \");\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\r\n * @version 1.1.1.0, Jan 12, 2016\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 + ' ' + fileName + '. ' + 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: ' ' + config.label.start_page + '',\r\n content: '
    ',\r\n after: function () {\r\n $(\"#startPage\").load('/start?sid=' + config.wideSessionId);\r\n $.ajax({\r\n url: \"https://hacpai.com/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 = \"\");\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: '/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 = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ' '\r\n + autocompleteArray[i].type + '';\r\n break;\r\n case \"const\":\r\n displayText = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ' '\r\n + autocompleteArray[i].type + '';\r\n break;\r\n case \"var\":\r\n displayText = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ' '\r\n + autocompleteArray[i].type + '';\r\n break;\r\n case \"package\":\r\n displayText = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ' '\r\n + autocompleteArray[i].type + '';\r\n break;\r\n case \"func\":\r\n displayText = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ''\r\n + autocompleteArray[i].type.substring(4) + '';\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: '/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('
    ' + result.data + '
    ');\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: '/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: '/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 = '
      ',\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 = '' + keyWord + '';\r\n }\r\n contents += data[i].contents[0].substring(startIndex - matches[j].length, startIndex) + keyWord;\r\n }\r\n\r\n searcHTML += '
    • '\r\n + contents + \"    \" + data[i].path\r\n + ' (' + data[i].line + ':'\r\n + data[i].ch + ')
    • ';\r\n }\r\n\r\n if (data.length === 0) {\r\n searcHTML += '
    • ' + config.label.search_no_match + '
    • ';\r\n }\r\n searcHTML += '
    ';\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: '' + wide.curNode.name + '',\r\n content: ''\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\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 += '' + data.severity\r\n + '' + data.message\r\n + '' + data.type + '';\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\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: '/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('/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: '/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 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 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: '/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: \"/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: '/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(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: '/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: '/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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\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: '/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 = '
      ',\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 += '
    • ' + obj.Name + '
    • ';\r\n }\r\n }\r\n $(\"#outline\").html(outlineHTML + '
    ');\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: '/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: '/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: '/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: '/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 += '
  • '\r\n + name + '    '\r\n + path + '
  • ';\r\n } else {\r\n goFileHTML += '
  • '\r\n + name + '    '\r\n + path + '
  • ';\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 _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: '/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 + '
    ' + data.output + '
    ');\r\n } else {\r\n bottomGroup.fillOutput(content.replace(/<\\/pre>$/g, data.output + ''));\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 + ''));\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 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: '/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('/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: '/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: '/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: '/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: '/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: '/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-present, 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 * https://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 Liyuan Li\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: '/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 += '' + data.severity\r\n + '' + data.message\r\n + '' + data.type + '';\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 += '' + data.severity\r\n + '' + data.message\r\n + '' + data.type + '';\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\r\n * @version 1.0.1.3, Oct 5, 2018\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.qqz = \"https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=\" + url + \"&sharesource=qzone&title=\" + title+ \"&pics=\" + 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('/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 + \"\" + data.wideVersion + \"\");\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: '/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: '/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: '/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: '/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: '/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: '/build',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n\r\n $(\"#buildRun\").addClass(\"ico-stop\")\r\n .removeClass(\"ico-buildrun\").attr(\"title\", config.label.stop);\r\n },\r\n success: function (result) {\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: '/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('/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 + \"
    \";\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 $GoBuildArgsForLinux = $dialogPreference.find(\"input[name=GoBuildArgsForLinux]\"),\r\n $GoBuildArgsForWindows = $dialogPreference.find(\"input[name=GoBuildArgsForWindows]\"),\r\n $GoBuildArgsForDarwin = $dialogPreference.find(\"input[name=GoBuildArgsForDarwin]\"),\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 \"GoBuildArgsForLinux\": $GoBuildArgsForLinux.val(),\r\n \"GoBuildArgsForWindows\": $GoBuildArgsForWindows.val(),\r\n \"GoBuildArgsForDarwin\": $GoBuildArgsForDarwin.val(),\r\n \"workspace\": $workspace.val(),\r\n \"password\": $password.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: '/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 $GoBuildArgsForLinux.data(\"value\", $GoBuildArgsForLinux.val());\r\n $GoBuildArgsForWindows.data(\"value\", $GoBuildArgsForWindows.val());\r\n $GoBuildArgsForDarwin.data(\"value\", $GoBuildArgsForDarwin.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\", '/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","/*\r\n * Copyright (c) 2014-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\r\n * @version 1.1.2.2, Feb 16, 2016\r\n */\r\nvar windows = {\r\n isMaxEditor: false,\r\n outerLayout: {},\r\n innerLayout: {},\r\n init: function () {\r\n if (!config.latestSessionContent) {\r\n config.latestSessionContent = {\r\n \"fileTree\": [],\r\n \"files\": [],\r\n \"currentFile\": \"\",\r\n };\r\n }\r\n \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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\r\n * @version 1.1.1.1, Mar 15, 2017\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(/\\r/g, '');\r\n data = data.replace(/\\n/g, '
    ');\r\n\r\n if (-1 !== data.indexOf(\"
    \")) {\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"]} \ No newline at end of file +{"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","find","add","getCurrentId","$tabsPanel","append","title","content","after","prevId","$tabs","stack","children","remove","i","removeAfter","path","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","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","k","test","RegExp","$1","getFullYear","substr","start_page","load","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","class","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","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","refresh","reAsyncChildNodes","$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","dir","extension","select","oldPath","newPath","lastIndexOf","curProcessId","outlineHTML","decls","maxj","Ch","Line","Name","dblclick","_initDialog","confirm","delete","create_file","create","fileType","create_dir","goto_file","$list","hotkeys","bindList","$selected","goFileHTML","icoSkin","getClassBySuffix","goto_line","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","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","qqz","about","wideVersion","uptodate","new_version_available","colon","wideDownload","mouseover","openPreference","closeAllFiles","exit","location","href","openAbout","gomod","goinstall","govet","build","isChange","emptys","emptysTip","tabIndex","no_empty","preference","$dialogPreference","$fontFamily","$fontSize","$goFmt","$GoBuildArgsForLinux","$GoBuildArgsForWindows","$GoBuildArgsForDarwin","$workspace","$password","$email","$locale","$theme","$editorFontFamily","$editorFontSize","$editorLineHeight","$editorTheme","$editorTabSize","$keymap","fontFamily","fontSize","goFmt","GoBuildArgsForLinux","GoBuildArgsForWindows","GoBuildArgsForDarwin","workspace","password","locale","editorFontFamily","editorFontSize","editorLineHeight","reload","jqXHR","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","currentId","nextTId","_initTabs","_initFrame","$path","mouseup","offsetY","$output","Autolinker","link"],"mappings":"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","file":"wide.min.js","sourcesContent":["/*\r\n * Copyright (c) 2014-present, 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 * https://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 Liyuan Li\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('
    '\r\n + data.title + '
    ');\r\n $tabsPanel.append('
    ' + data.content\r\n + '
    ');\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-present, 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 * https://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 Liyuan Li\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: \"v@b3log.org\"\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 = \"
    \"\r\n + settings.title + \"
    \";\r\n\r\n // Sets footerHTML.\r\n if (!settings.hideFooter) {\r\n if (!settings.hiddenOk) {\r\n footerHTML = \"\";\r\n }\r\n footerHTML += \"\";\r\n }\r\n\r\n var dialogHTML = \"
    \" + headerHTML\r\n + \"
    \"\r\n + footerHTML + \"
    \";\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 = \"
    \";\r\n }\r\n\r\n // Package dialog.\r\n $(\"#\" + id).wrap(\"
    \");\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\r\n * @version 1.1.1.0, Jan 12, 2016\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 + ' ' + fileName + '. ' + 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: ' ' + config.label.start_page + '',\r\n content: '
    ',\r\n after: function () {\r\n $(\"#startPage\").load('/start?sid=' + config.wideSessionId);\r\n $.ajax({\r\n url: \"https://hacpai.com/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 = \"\");\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: '/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 = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ' '\r\n + autocompleteArray[i].type + '';\r\n break;\r\n case \"const\":\r\n displayText = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ' '\r\n + autocompleteArray[i].type + '';\r\n break;\r\n case \"var\":\r\n displayText = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ' '\r\n + autocompleteArray[i].type + '';\r\n break;\r\n case \"package\":\r\n displayText = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ' '\r\n + autocompleteArray[i].type + '';\r\n break;\r\n case \"func\":\r\n displayText = ''// + autocompleteArray[i].class \r\n + '' + autocompleteArray[i].name + ''\r\n + autocompleteArray[i].type.substring(4) + '';\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: '/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('
    ' + result.data + '
    ');\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: '/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: '/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 = '
      ',\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 = '' + keyWord + '';\r\n }\r\n contents += data[i].contents[0].substring(startIndex - matches[j].length, startIndex) + keyWord;\r\n }\r\n\r\n searcHTML += '
    • '\r\n + contents + \"    \" + data[i].path\r\n + ' (' + data[i].line + ':'\r\n + data[i].ch + ')
    • ';\r\n }\r\n\r\n if (data.length === 0) {\r\n searcHTML += '
    • ' + config.label.search_no_match + '
    • ';\r\n }\r\n searcHTML += '
    ';\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: '' + wide.curNode.name + '',\r\n content: ''\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\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 += '' + data.severity\r\n + '' + data.message\r\n + '' + data.type + '';\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\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: '/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('/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: '/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 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 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: '/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: \"/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: '/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(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: '/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: '/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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\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: '/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 = '
      ',\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 += '
    • ' + obj.Name + '
    • ';\r\n }\r\n }\r\n $(\"#outline\").html(outlineHTML + '
    ');\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: '/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: '/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: '/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: '/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 += '
  • '\r\n + name + '    '\r\n + path + '
  • ';\r\n } else {\r\n goFileHTML += '
  • '\r\n + name + '    '\r\n + path + '
  • ';\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 _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: '/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 + '
    ' + data.output + '
    ');\r\n } else {\r\n bottomGroup.fillOutput(content.replace(/<\\/pre>$/g, data.output + ''));\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 + ''));\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-mod':\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 mod':\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: '/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('/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: '/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: '/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: '/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: '/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: '/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-present, 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 * https://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 Liyuan Li\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: '/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 += '' + data.severity\r\n + '' + data.message\r\n + '' + data.type + '';\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 += '' + data.severity\r\n + '' + data.message\r\n + '' + data.type + '';\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\r\n * @version 1.0.1.3, Oct 5, 2018\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.qqz = \"https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=\" + url + \"&sharesource=qzone&title=\" + title+ \"&pics=\" + 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('/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 + \"\" + data.wideVersion + \"\");\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: '/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 gomod: 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: '/go/mod',\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: '/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: '/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: '/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: '/build',\r\n data: JSON.stringify(request),\r\n dataType: \"json\",\r\n beforeSend: function () {\r\n bottomGroup.resetOutput();\r\n\r\n $(\"#buildRun\").addClass(\"ico-stop\")\r\n .removeClass(\"ico-buildrun\").attr(\"title\", config.label.stop);\r\n },\r\n success: function (result) {\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: '/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('/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 + \"
    \";\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 $GoBuildArgsForLinux = $dialogPreference.find(\"input[name=GoBuildArgsForLinux]\"),\r\n $GoBuildArgsForWindows = $dialogPreference.find(\"input[name=GoBuildArgsForWindows]\"),\r\n $GoBuildArgsForDarwin = $dialogPreference.find(\"input[name=GoBuildArgsForDarwin]\"),\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 \"GoBuildArgsForLinux\": $GoBuildArgsForLinux.val(),\r\n \"GoBuildArgsForWindows\": $GoBuildArgsForWindows.val(),\r\n \"GoBuildArgsForDarwin\": $GoBuildArgsForDarwin.val(),\r\n \"workspace\": $workspace.val(),\r\n \"password\": $password.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: '/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 $GoBuildArgsForLinux.data(\"value\", $GoBuildArgsForLinux.val());\r\n $GoBuildArgsForWindows.data(\"value\", $GoBuildArgsForWindows.val());\r\n $GoBuildArgsForDarwin.data(\"value\", $GoBuildArgsForDarwin.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\", '/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","/*\r\n * Copyright (c) 2014-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\r\n * @version 1.1.2.2, Feb 16, 2016\r\n */\r\nvar windows = {\r\n isMaxEditor: false,\r\n outerLayout: {},\r\n innerLayout: {},\r\n init: function () {\r\n if (!config.latestSessionContent) {\r\n config.latestSessionContent = {\r\n \"fileTree\": [],\r\n \"files\": [],\r\n \"currentFile\": \"\",\r\n };\r\n }\r\n \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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\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-present, 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 * https://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 Liyuan Li\r\n * @author Liang Ding\r\n * @version 1.1.1.1, Mar 15, 2017\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(/\\r/g, '');\r\n data = data.replace(/\\n/g, '
    ');\r\n\r\n if (-1 !== data.indexOf(\"
    \")) {\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"]} \ No newline at end of file diff --git a/views/index.html b/views/index.html index 0b7880f..25a06d5 100644 --- a/views/index.html +++ b/views/index.html @@ -277,9 +277,9 @@ {{.i18n.test}}
  • -
  • +
  • - {{.i18n.goget}} + {{.i18n.gomod}}