diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index 498c32c3..a0712d81 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -145,9 +145,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", "time_close": &ctx.Config{Name: "time_close(open/close)", Value: "open", Help: "时间区间"}, "cmd_script": &ctx.Config{Name: "cmd_script", Value: map[string]interface{}{ - "sh": "bash", - "py": "python", - "shy": "source", + "sh": "bash", "shy": "source", "py": "python", }, Help: "系统命令超时"}, "source_list": &ctx.Config{Name: "source_list", Value: []interface{}{}, Help: "系统命令超时"}, @@ -311,7 +309,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", if msg.Cmd(detail); msg.Hand { m.Cap("ps_target", msg.Cap("module")) } else { - msg.Copy(m, "target").Detail(-1, "system") + msg.Copy(m, "target").Copy(m, "result").Detail(-1, "system") msg.Cmd() } @@ -336,7 +334,8 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", } if len(rest) > 0 { - pipe := m.Spawn().Copy(msg, "option").Copy(msg, "append").Cmd("cmd", rest) + m.Log("fuck", "%v", msg.Meta) + pipe := m.Spawn().Copy(msg, "option").Copy(msg, "append").Copy(msg, "result").Cmd("cmd", rest) msg.Set("result").Set("append") msg.Copy(pipe, "result").Copy(pipe, "append") @@ -757,6 +756,14 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", "cmd_active(true/false): 是否交互", "cmd_timeout: 命令超时", "cmd_env: 环境变量", "cmd_dir: 工作目录"}, Form: map[string]int{"cmd_active": 1, "cmd_timeout": 1, "cmd_env": 2, "cmd_dir": 1, "cmd_error": 0}, Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { + if len(m.Meta["result"]) > 0 { + for _, v := range m.Meta["result"] { + if strings.TrimSpace(v) != "" { + arg = append(arg, v) + } + } + } + conf := map[string]interface{}{} if m.Confv("cmd_combine", arg[0]) != nil { conf = m.Confv("cmd_combine", arg[0]).(map[string]interface{}) diff --git a/src/contexts/cli/cli_darwin.go b/src/contexts/cli/cli_darwin.go index 7e44014c..3fe3fa74 100644 --- a/src/contexts/cli/cli_darwin.go +++ b/src/contexts/cli/cli_darwin.go @@ -16,10 +16,5 @@ func sysinfo(m *ctx.Message, c *ctx.Context, key string, arg ...string) { m.Append("blocks", kit.FmtSize(fs.Blocks*uint64(fs.Bsize))) m.Append("bavail", kit.FmtSize(fs.Bavail*uint64(fs.Bsize))) m.Append("bper", fmt.Sprintf("%d%%", fs.Bavail*100/fs.Blocks)) - - m.Append("files", fs.Files) - m.Append("ffree", fs.Ffree) - m.Append("fper", fmt.Sprintf("%d%%", fs.Ffree*100/fs.Files)) - m.Table() } diff --git a/src/contexts/nfs/nfs.go b/src/contexts/nfs/nfs.go index e67c7f92..871ab0f1 100644 --- a/src/contexts/nfs/nfs.go +++ b/src/contexts/nfs/nfs.go @@ -17,6 +17,7 @@ import ( "os" "os/exec" "path" + "regexp" "runtime" "sort" "strconv" @@ -72,7 +73,7 @@ func open(m *ctx.Message, name string, arg ...int) (string, *os.File, error) { f, e := os.OpenFile(name, flag, 0660) return name, f, e } -func dir(m *ctx.Message, name string, level int, deep bool, trip int, fields []string) { +func dir(m *ctx.Message, name string, level int, deep bool, dir_type string, trip int, dir_reg *regexp.Regexp, fields []string, format string) { back, e := os.Getwd() m.Assert(e) os.Chdir(name) @@ -80,17 +81,16 @@ func dir(m *ctx.Message, name string, level int, deep bool, trip int, fields []s if fs, e := ioutil.ReadDir("."); m.Assert(e) { for _, f := range fs { - if f.Name()[0] == '.' { + if f.Name() == "." || f.Name() == ".." { continue } f, _ := os.Stat(f.Name()) - if !(m.Confx("dir_type") == "file" && f.IsDir() || - m.Confx("dir_type") == "dir" && !f.IsDir()) { + if !(dir_type == "file" && f.IsDir() || dir_type == "dir" && !f.IsDir()) && (dir_reg == nil || dir_reg.MatchString(f.Name())) { for _, field := range fields { switch field { case "time": - m.Add("append", "time", f.ModTime().Format(m.Conf("time_format"))) + m.Add("append", "time", f.ModTime().Format(format)) case "type": if m.Assert(e) && f.IsDir() { m.Add("append", "type", "dir") @@ -156,7 +156,7 @@ func dir(m *ctx.Message, name string, level int, deep bool, trip int, fields []s } } if f.IsDir() && deep { - dir(m, f.Name(), level+1, deep, trip, fields) + dir(m, f.Name(), level+1, deep, dir_type, trip, dir_reg, fields, format) } } } @@ -1169,9 +1169,9 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心", } }}, - "dir": &ctx.Command{Name: "dir dir [dir_type both|file|dir] [dir_name name|tree|path|full] [dir_deep] fields...", - Help: "查看目录, dir: 目录名, dir_type: 文件类型, dir_name: 文件名类型, dir_deep: 递归查询, fields: 查询字段", - Form: map[string]int{"dir_type": 1, "dir_name": 1, "dir_deep": 0, "dir_sort": 2}, + "dir": &ctx.Command{Name: "dir dir [dir_type both|file|dir] [dir_deep] fields...", + Help: "查看目录, dir: 目录名, dir_type: 文件类型, dir_deep: 递归查询, fields: 查询字段", + Form: map[string]int{"dir_reg": 1, "dir_type": 1, "dir_deep": 0, "dir_sort": 2}, Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { wd, e := os.Getwd() m.Assert(e) @@ -1185,11 +1185,15 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心", dirs = path.Join(m.Option("dir_root"), dirs) } + rg, e := regexp.Compile(m.Option("dir_reg")) + for _, v := range m.Confv("paths").([]interface{}) { d := path.Join(v.(string), dirs) if s, e := os.Stat(d); e == nil { if s.IsDir() { - dir(m, d, 0, ctx.Right(m.Has("dir_deep")), trip, strings.Split(m.Confx("dir_fields", strings.Join(arg[1:], " ")), " ")) + dir(m, d, 0, ctx.Right(m.Has("dir_deep")), m.Confx("dir_type"), trip, rg, + strings.Split(m.Confx("dir_fields", strings.Join(arg[1:], " ")), " "), + m.Conf("time_format")) } else { m.Append("directory", d) return diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index 970d19b8..8bdb6e54 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -282,7 +282,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", map[string]interface{}{"componet_name": "head", "template": "head"}, map[string]interface{}{"componet_name": "clipbaord", "componet_help": "clipbaord", "template": "clipboard"}, map[string]interface{}{"componet_name": "time", "componet_help": "time", "template": "componet", - "context": "cli", "componet_cmd": "time", "arguments": []interface{}{"@string"}, + "componet_ctx": "cli", "componet_cmd": "time", "arguments": []interface{}{"@string"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "time_format", "label": "format", "value": "2006-01-02 15:04:05", @@ -615,7 +615,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", m.Add("append", "order", i) m.Add("append", "componet_name", value["componet_name"]) m.Add("append", "componet_help", value["componet_help"]) - m.Add("append", "context", value["context"]) + m.Add("append", "componet_ctx", value["componet_ctx"]) m.Add("append", "componet_cmd", value["componet_cmd"]) } } @@ -626,7 +626,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", m.Add("append", "order", i) m.Add("append", "componet_name", value["componet_name"]) m.Add("append", "componet_help", value["componet_help"]) - m.Add("append", "context", value["context"]) + m.Add("append", "componet_ctx", value["componet_ctx"]) m.Add("append", "componet_cmd", value["componet_cmd"]) } m.Table() @@ -644,7 +644,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", } else { m.Confv("componet", []interface{}{arg[0], arg[1]}, map[string]interface{}{ "componet_name": arg[2], "componet_help": arg[3], - "context": m.Confx("componet_context", arg, 4), + "componet_ctx": m.Confx("componet_context", arg, 4), "componet_cmd": m.Confx("componet_command", arg, 5), }) break @@ -755,8 +755,8 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", } context := m.Cap("module") - if val["context"] != nil { - context = val["context"].(string) + if val["componet_ctx"] != nil { + context = val["componet_ctx"].(string) } msg := m.Find(context) diff --git a/src/examples/code/code.go b/src/examples/code/code.go index 6f7fd12b..0e139a17 100644 --- a/src/examples/code/code.go +++ b/src/examples/code/code.go @@ -24,7 +24,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "login": []interface{}{ map[string]interface{}{"componet_name": "head", "template": "head"}, map[string]interface{}{"componet_name": "login", "componet_help": "login", "template": "componet", - "context": "aaa", "componet_cmd": "login", "arguments": []interface{}{"@username", "@password"}, + "componet_ctx": "aaa", "componet_cmd": "login", "arguments": []interface{}{"@username", "@password"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "username", "label": "username"}, map[string]interface{}{"type": "password", "name": "password", "label": "password"}, @@ -37,7 +37,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "index": []interface{}{ map[string]interface{}{"componet_name": "head", "template": "head"}, map[string]interface{}{"componet_name": "login", "componet_help": "login", "template": "componet", - "context": "aaa", "componet_cmd": "login", "arguments": []interface{}{"@username", "@password"}, + "componet_ctx": "aaa", "componet_cmd": "login", "arguments": []interface{}{"@username", "@password"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "username", "label": "username"}, map[string]interface{}{"type": "password", "name": "password", "label": "password"}, @@ -46,12 +46,12 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "display_append": "", "display_result": "", }, map[string]interface{}{"componet_name": "userinfo", "componet_help": "userinfo", "template": "componet", - "context": "aaa", "componet_cmd": "login", "arguments": []interface{}{"@sessid"}, + "componet_ctx": "aaa", "componet_cmd": "login", "arguments": []interface{}{"@sessid"}, "pre_run": true, }, map[string]interface{}{"componet_name": "clipboard", "componet_help": "clipboard", "template": "clipboard"}, map[string]interface{}{"componet_name": "buffer", "componet_help": "buffer", "template": "componet", - "context": "cli", "componet_cmd": "tmux", "arguments": []interface{}{"buffer"}, "inputs": []interface{}{ + "componet_ctx": "cli", "componet_cmd": "tmux", "arguments": []interface{}{"buffer"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "limit", "label": "limit", "value": "3"}, map[string]interface{}{"type": "text", "name": "index", "label": "index"}, map[string]interface{}{"type": "button", "value": "refresh"}, @@ -59,7 +59,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "pre_run": true, }, map[string]interface{}{"componet_name": "time", "componet_help": "time", "template": "componet", - "context": "cli", "componet_cmd": "time", "arguments": []interface{}{"@string"}, + "componet_ctx": "cli", "componet_cmd": "time", "arguments": []interface{}{"@string"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "time_format", "label": "format", "value": "2006-01-02 15:04:05", @@ -69,14 +69,14 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, }, map[string]interface{}{"componet_name": "json", "componet_help": "json", "template": "componet", - "context": "nfs", "componet_cmd": "json", "arguments": []interface{}{"@string"}, + "componet_ctx": "nfs", "componet_cmd": "json", "arguments": []interface{}{"@string"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "string", "label": "string"}, map[string]interface{}{"type": "button", "value": "refresh"}, }, }, map[string]interface{}{"componet_name": "dir", "componet_help": "dir", "template": "componet", - "context": "nfs", "componet_cmd": "dir", "arguments": []interface{}{"@dir", "dir_sort", "@sort_order", "@sort_field"}, + "componet_ctx": "nfs", "componet_cmd": "dir", "arguments": []interface{}{"@dir", "dir_sort", "@sort_order", "@sort_field"}, "pre_run": true, "display_result": "", "inputs": []interface{}{ map[string]interface{}{"type": "choice", "name": "dir_type", @@ -109,7 +109,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, }, map[string]interface{}{"componet_name": "upload", "componet_help": "upload", "template": "componet", - "context": "web", "componet_cmd": "upload", "form_type": "upload", + "componet_ctx": "web", "componet_cmd": "upload", "form_type": "upload", "inputs": []interface{}{ map[string]interface{}{"type": "file", "name": "upload"}, map[string]interface{}{"type": "submit", "value": "submit"}, @@ -117,33 +117,17 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "display_result": "", }, map[string]interface{}{"componet_name": "download", "componet_help": "download", "template": "componet", - "context": "cli.shy", "componet_cmd": "source", "arguments": []interface{}{"@cmd"}, + "componet_ctx": "cli.shy", "componet_cmd": "source", "arguments": []interface{}{"@cmds"}, "display_result": "", "download_file": "", "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "download_file", "value": "data_2006_0102_1504.txt", "class": "file_name"}, - map[string]interface{}{"type": "text", "name": "cmd", "value": "", + map[string]interface{}{"type": "text", "name": "cmds", "value": "", "class": "file_cmd", "clipstack": "clistack", }, }, }, map[string]interface{}{"componet_name": "command", "componet_help": "command", "template": "componet", - "context": "cli.shy", "componet_cmd": "source", "arguments": []interface{}{"@cmd"}, - "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "cmd", "value": "", - "class": "cmd", "clipstack": "void", - }, - }, - }, - map[string]interface{}{"componet_name": "command1", "componet_help": "command1", "template": "componet", - "context": "cli.shy", "componet_cmd": "source", "arguments": []interface{}{"@cmd"}, - "inputs": []interface{}{ - map[string]interface{}{"type": "text", "name": "cmd", "value": "", - "class": "cmd", "clipstack": "void", - }, - }, - }, - map[string]interface{}{"componet_name": "command2", "componet_help": "command2", "template": "componet", - "context": "cli.shy", "componet_cmd": "source", "arguments": []interface{}{"@cmd"}, + "componet_ctx": "cli.shy", "componet_cmd": "source", "arguments": []interface{}{"@cmd"}, "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "cmd", "value": "", "class": "cmd", "clipstack": "void", @@ -151,7 +135,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, }, map[string]interface{}{"componet_name": "ctx", "componet_help": "ctx", "template": "componet", - "context": "cli.shy", "componet_cmd": "context", "arguments": []interface{}{"@ctx", "list"}, + "componet_ctx": "cli.shy", "componet_cmd": "context", "arguments": []interface{}{"@ctx", "list"}, "display_result": "", "inputs": []interface{}{ map[string]interface{}{"type": "text", "name": "ctx", "value": "shy"}, @@ -159,7 +143,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, }, map[string]interface{}{"componet_name": "ccc", "componet_help": "ccc", "template": "componet", - "context": "cli.shy", "componet_cmd": "context", "arguments": []interface{}{"@current_ctx", "@ccc"}, + "componet_ctx": "cli.shy", "componet_cmd": "context", "arguments": []interface{}{"@current_ctx", "@ccc"}, "display_result": "", "inputs": []interface{}{ map[string]interface{}{"type": "choice", "name": "ccc", @@ -173,21 +157,21 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, }, map[string]interface{}{"componet_name": "cmd", "componet_help": "cmd", "template": "componet", - "context": "cli.shy", "componet_cmd": "context", "arguments": []interface{}{"@current_ctx", "command", "list"}, + "componet_ctx": "cli.shy", "componet_cmd": "context", "arguments": []interface{}{"@current_ctx", "command", "list"}, "pre_run": true, "display_result": "", "inputs": []interface{}{ map[string]interface{}{"type": "button", "value": "refresh"}, }, }, map[string]interface{}{"componet_name": "history", "componet_help": "history", "template": "componet", - "context": "cli", "componet_cmd": "config", "arguments": []interface{}{"source_list"}, + "componet_ctx": "cli", "componet_cmd": "config", "arguments": []interface{}{"source_list"}, "pre_run": true, "display_result": "", "inputs": []interface{}{ map[string]interface{}{"type": "button", "value": "refresh"}, }, }, map[string]interface{}{"componet_name": "develop", "componet_help": "develop", "template": "componet", - "context": "web.code", "componet_cmd": "config", "arguments": []interface{}{"counter"}, + "componet_ctx": "web.code", "componet_cmd": "config", "arguments": []interface{}{"counter"}, "inputs": []interface{}{ map[string]interface{}{"type": "button", "value": "refresh"}, }, @@ -195,7 +179,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "display_result": "", }, map[string]interface{}{"componet_name": "windows", "componet_help": "windows", "template": "componet", - "context": "cli", "componet_cmd": "windows", + "componet_ctx": "cli", "componet_cmd": "windows", "inputs": []interface{}{ map[string]interface{}{"type": "button", "value": "refresh"}, }, @@ -203,7 +187,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "display_result": "", }, map[string]interface{}{"componet_name": "runtime", "componet_help": "runtime", "template": "componet", - "context": "cli", "componet_cmd": "runtime", + "componet_ctx": "cli", "componet_cmd": "runtime", "inputs": []interface{}{ map[string]interface{}{"type": "button", "value": "refresh"}, }, @@ -211,7 +195,7 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", "display_result": "", }, map[string]interface{}{"componet_name": "sysinfo", "componet_help": "sysinfo", "template": "componet", - "context": "cli", "componet_cmd": "sysinfo", + "componet_ctx": "cli", "componet_cmd": "sysinfo", "inputs": []interface{}{ map[string]interface{}{"type": "button", "value": "refresh"}, }, diff --git a/usr/librarys/code.js b/usr/librarys/code.js index 09cc42c0..8a677883 100644 --- a/usr/librarys/code.js +++ b/usr/librarys/code.js @@ -1,6 +1,16 @@ +var code = { + showmap: false, + keymap: [], + inputs: [], + ninput: 0, + + ncommand: 1, + show_result: true, + show_height: "30px", +} + function copy_to_clipboard(text) { - var clipboard = document.querySelector(".clipboard") - clipboard.value = text + var clipboard = modify_node(".clipboard", {"value": text}) clipboard.select() document.execCommand("copy") clipboard.blur() @@ -9,6 +19,64 @@ function copy_to_clipboard(text) { insert_child(clipstack, "option").value = text clipstack.childElementCount > 3 && clipstack.removeChild(clipstack.lastElementChild) } +function add_keymap(input) { + if (code.ninput < code.keymap.length && input.style.display != "none") { + input.title = "keymap: "+code.keymap[code.ninput] + input.dataset["keymap"] = code.keymap[code.ninput] + insert_before(input, "label", { + "innerText": "("+code.keymap[code.ninput]+")", + "className": "keymap" + (code.showmap? " show": " hide"), + }) + code.inputs[code.keymap[code.ninput++]] = input + } + return input +} +function add_sort(append, field, cb) { + append.onclick = function(event) { + var target = event.target + var dataset = target.dataset + var nodes = target.parentElement.childNodes + for (var i = 0; i < nodes.length; i++) { + if (nodes[i] == target) { + if (target.tagName == "TH") { + dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1 + sort_table(append, i, dataset["sort_asc"] == "1") + } else if (target.tagName == "TD") { + var tr = target.parentElement.parentElement.querySelector("tr") + if (tr.childNodes[i].innerText == field) { + typeof cb == "function" && cb(event) + } + copy_to_clipboard(target.innerText) + } + } + } + } +} +function add_command() { + var name = "command"+code.ncommand++ + + var fieldset = append_child(document.querySelector("body"), "fieldset") + append_child(fieldset, "legend", {"innerText": name}) + + var option = append_child(fieldset, "form", { + "className": "option "+name, + "dataset": { + "componet_group": "index", + "componet_name": "command", + "componet_name_alias": name, + "componet_name_order": code.ncommand-1, + } + }) + + append_child(option, "input", {"style": {"display": "none"}}) + add_keymap(append_child(option, "input", { + "name": "cmd", "className": "cmd", + "onkeyup": function(event){onaction(event, "input")} + })).focus() + + add_sort(append_child(fieldset, "table", {"className": "append "+name})) + append_child(append_child(fieldset, "code", {"className": "result "+name}), "pre") +} function send_command(form, cb) { var data = {} @@ -23,26 +91,27 @@ function send_command(form, cb) { msg = msg[0] var name = data["componet_name_alias"] || data["componet_name"] - var result = document.querySelector("code.result."+name+" pre") var append = document.querySelector("table.append."+name) - if (msg && (msg.append || msg.result)) { - result && (result.innerHTML = (msg.result || []).join("")) - append && (append.innerHTML = "") + + if (result && msg) { + result.innerHTML = (msg.result || []).join("") } - - if (append && msg && msg.append) { - var tr = append_child(append, "tr") - for (var i in msg.append) { - append_child(tr, "th", msg.append[i]) - } - - var ncol = msg.append.length - var nrow = msg[msg.append[0]].length - for (var i = 0; i < nrow; i ++) { + if (append && msg) { + append.innerHTML = "" + if (msg.append) { var tr = append_child(append, "tr") - for (var k in msg.append) { - append_child(tr, "td", msg[msg.append[k]][i]) + for (var i in msg.append) { + append_child(tr, "th", msg.append[i]) + } + + var ncol = msg.append.length + var nrow = msg[msg.append[0]].length + for (var i = 0; i < nrow; i ++) { + var tr = append_child(append, "tr") + for (var k in msg.append) { + append_child(tr, "td", msg[msg.append[k]][i]) + } } } } @@ -51,7 +120,7 @@ function send_command(form, cb) { }) } -function check_argument(form, target) { +function check_option(form, target) { for (var i = 0; i < form.length-1; i++) { if (form[i] == target) { if (form[i+1].type == "button") { @@ -64,79 +133,188 @@ function check_argument(form, target) { } send_command(form) } +function add_history(input, cmd) { + var dataset = event.target.dataset + var history = JSON.parse(input.dataset["history"] || "[]") + if (history.length == 0 || cmd != history[history.length-1]) { + history.push(cmd) + } + dataset["history_last"] = history.length-1 + dataset["history"] = JSON.stringify(history) +} +function get_history(input, index, cmd) { + var history = JSON.parse(input.dataset["history"] || "[]") + var last = input.dataset["history_last"] + if (last >= 0 && last < history.length) { + last = (parseInt(last)+index+history.length) % history.length + input.dataset["history_last"] = last + cmd = history[last] + } + return cmd +} -var ncommand = 3 -function add_fieldset() { - var name = "command"+ncommand++ +function sort_table(table, index, sort_asc) { + var list = table.querySelectorAll("tr") + var new_list = [] - var fieldset = append_child(document.querySelector("body"), "fieldset") - append_child(fieldset, "legend", {"innerText": name}) - - var option = append_child(fieldset, "form", { - "className": "option "+name, - "dataset": { - "componet_group": "index", - "componet_name": "command", - "componet_name_alias": name, - "componet_name_order": ncommand-1, + var is_time = true + var is_number = true + for (var i = 1; i < list.length; i++) { + var value = Date.parse(list[i].childNodes[index].innerText) + if (!(value > 0)) { + is_time = false } - }) - append_child(option, "input", {"style": {"display": "none"}}) + var value = parseInt(list[i].childNodes[index].innerText) + if (!(value >= 0 || value <= 0)) { + is_number = false + } - append_child(option, "input", { - "name": "cmd", - "className": "cmd", - "onkeyup": function(event){onaction(event, "input")} - }).focus() + new_list.push(list[i]) + } - var append = append_child(fieldset, "table", {"className": "append "+name}) - append_child(append_child(fieldset, "code", {"className": "result "+name}), "pre") + var sort_order = "" + if (is_time) { + if (sort_asc) { + method = function(a, b) {return Date.parse(a) > Date.parse(b)} + sort_order = "time" + } else { + method = function(a, b) {return Date.parse(a) < Date.parse(b)} + sort_order = "time_r" + } + } else if (is_number) { + if (sort_asc) { + method = function(a, b) {return parseInt(a) > parseInt(b)} + sort_order = "int" + } else { + method = function(a, b) {return parseInt(a) < parseInt(b)} + sort_order = "int_r" + } + } else { + if (sort_asc) { + method = function(a, b) {return a > b} + sort_order = "str" + } else { + method = function(a, b) {return a < b} + sort_order = "str_r" + } + } + + list = new_list + new_list = [] + for (var i = 0; i < list.length; i++) { + list[i].parentElement && list[i].parentElement.removeChild(list[i]) + for (var j = i+1; j < list.length; j++) { + if (typeof method == "function" && method(list[i].childNodes[index].innerText, list[j].childNodes[index].innerText)) { + var temp = list[i] + list[i] = list[j] + list[j] = temp + } + } + new_list.push(list[i]) + } + + for (var i = 0; i < new_list.length; i++) { + table.appendChild(new_list[i]) + } + return sort_order } function onaction(event, action) { + var target = event.target + var dataset = target.dataset + switch (action) { - case "submit": - break - case "click": - if (event.target.nodeName == "INPUT") { - if (event.altKey) { - var board = document.querySelector(".clipboard") - event.target.value = board.value - check_argument(event.target.form, event.target) - } + case "keymap": + if (target.tagName == "INPUT" && target.type == "text") { + return + } + switch (event.key) { + case "g": + document.querySelectorAll("form.option label.keymap").forEach(function(item) { + code.showmap = !(item.className == "keymap show") + item.className = code.showmap? "keymap show": "keymap hide" + }) + break + case "j": + window.scrollBy(0, context.scroll_by) + break + case "k": + window.scrollBy(0, -context.scroll_by) + break + case "m": + add_command() + break + case "z": + code.show_result = !code.show_result + document.querySelectorAll("form.option input[name=cmd]").forEach(function(input) { + for (var command = input; command.tagName != "FIELDSET"; command = command.parentElement) {} + var result = command.querySelector("code.result pre") + var append = command.querySelector("table.append") + result.style.height = (code.show_result||result.innerText=="")? "": code.show_height + append.style.display = (code.show_result||!append.querySelector("tr"))? "": "none" + }) + break + case "0": + document.querySelector("form.option.command input[name=cmd]").focus() + break + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + document.querySelector("form.option.command"+event.key+" input[name=cmd]").focus() + break + default: + if (code.inputs[event.key]) { + code.inputs[event.key].focus() + } + break } break case "command": - send_command(event.target.form, function() {}) + check_option(target.form, target) + break + case "click": + if (target.nodeName == "INPUT" && event.altKey) { + var board = document.querySelector(".clipboard") + target.value = board.value + check_option(target.form, target) + } break case "input": - switch (event.key) { - case "Enter": - var clistack = document.querySelector("#clistack") - if (!clistack) { + if (event.key == "Escape") { + target.blur() + break + } + if (event.key == "Enter") { + check_option(target.form, target) + add_history(target, target.value) + break + } + + if (event.ctrlKey) { + for (var command = target; command.tagName != "FIELDSET"; command = command.parentElement) {} + var option = command.querySelector("form.option") + var append = command.querySelector("table.append") + var result = command.querySelector("code.result pre") +// yt + switch (event.key) { + case "a": + case "e": + case "b": + case "f": break - } - var history = JSON.parse(event.target.dataset["history"] || "[]") - if (history.length == 0 || event.target.value != history[history.length-1]) { - history.push(event.target.value) - insert_child(clistack, "option").value = event.target.value - } - check_argument(event.target.form, event.target) - event.target.dataset["history"] = JSON.stringify(history) - event.target.dataset["history_last"] = history.length-1 - console.log(history.length) - break - case "Escape": - if (event.target.value) { - event.target.value = "" - } else { - event.target.blur() - } - break - case "w": - if (event.ctrlKey) { - var value = event.target.value + case "h": + case "d": + case "k": + break + case "w": + var value = target.value var space = value.length > 0 && value[value.length-1] == ' ' for (var i = value.length-1; i > -1; i--) { if (space) { @@ -149,56 +327,90 @@ function onaction(event, action) { } } } - event.target.value = value.substr(0, i+1) + + target.dataset["old_string"] = value.substr(i+1, value.length) + target.value = value.substr(0, i+1) break - } - case "u": - if (event.ctrlKey && event.key == "u") { - event.target.value = "" - break - } - case "p": - if (event.ctrlKey && event.key == "p") { - var history = JSON.parse(event.target.dataset["history"] || "[]") - var last = event.target.dataset["history_last"] - console.log(last) - event.target.value = history[last--] - event.target.dataset["history_last"] = (last + history.length) % history.length - return false - break - } - case "n": - if (event.ctrlKey && event.key == "n") { - var history = JSON.parse(event.target.dataset["history"] || "[]") - var last = event.target.dataset["history_last"] - last = (last +1) % history.length - console.log(last) - event.target.value = history[last] - event.target.dataset["history_last"] = last - break - } - case "j": - if (event.ctrlKey && event.key == "j") { - var history = JSON.parse(event.target.dataset["history"] || "[]") - if (history.length == 0 || event.target.value != history[history.length-1]) { - history.push(event.target.value) - var clistack = document.querySelector("#clistack") - insert_child(clistack, "option").value = event.target.value + case "u": + if (target.value != "") { + target.dataset["old_string"] = target.value } - check_argument(event.target.form, event.target) - event.target.dataset["history"] = JSON.stringify(history) - event.target.dataset["history_last"] = history.length-1 + target.value = "" break - } - case "v": - if (event.ctrlKey && event.key == "v") { - add_fieldset() - } - case "q": - if (event.ctrlKey && event.key == "q") { + case "v": + target.value += target.dataset["old_string"] || "" + break + case "g": + var value = target.value + var search = [] + document.querySelectorAll("form.option input[name=cmd]").forEach(function(input) { + if (input.value.startsWith(value)) { + search.push(input.value) + } + }) + if (search) { + target.value = search[0] + } + break + case "j": + check_option(target.form, target) + add_history(target, target.value) + break + case "p": + target.value = get_history(target, -1, target.value) + break + case "n": + target.value = get_history(target, 1, target.value) + break + case "c": + append.innerHTML = "" + result.innerHTML = "" + break + case "z": + append.style.display = (result.style.height||!append.querySelector("tr"))? "": "none" + result.style.height = result.style.height? "": code.show_height + break + case "x": + target.value = "" + append.innerHTML = "" + result.innerHTML = "" + break + case "s": + copy_to_clipboard(result.innerText) + break + case "r": + append.innerHTML = "" + result.innerHTML = "" + check_option(option) + break + case "l": + window.scrollTo(0, command.offsetTop) + break + case "i": + for (var order = (parseInt(option.dataset["componet_name_order"])||0)+1; order < code.ncommand; order++) { + var input = document.querySelector("form.option.command"+order+" input[name=cmd]") + if (input) { + input.focus() + return + } + } + break + case "o": + for (var order = parseInt(option.dataset["componet_name_order"])-1; order >= 0; order--) { + var input = document.querySelector("form.option.command"+(order? order: "")+" input[name=cmd]") + if (input) { + input.focus() + return + } + } + break + case "m": + add_command() + break + case "q": var can_remove = false var order = -1 - for (var p = event.target; p.parentElement && p.tagName != "FIELDSET"; p = p.parentElement) { + for (var p = target; p.parentElement && p.tagName != "FIELDSET"; p = p.parentElement) { if (p.tagName == "FORM" && p.dataset["componet_name_alias"]) { can_remove = true order = p.dataset["componet_name_order"] @@ -208,135 +420,95 @@ function onaction(event, action) { p.parentElement.removeChild(p) } - for (;order < ncommand; order++) { + for (;order < code.ncommand; order++) { var input = document.querySelector("form.option.command"+order+" input[name=cmd]") if (input) { input.focus() return } } - for (;order > 0; order--) { - var input = document.querySelector("form.option.command"+order+" input[name=cmd]") + for (;order >= 0; order--) { + var input = document.querySelector("form.option.command"+(order? order: "")+" input[name=cmd]") + code.ncommand = order+1 if (input) { input.focus() - ncommand = order+1 return } } - } - default: - console.log(event) - if (event.target.dataset["last_char"] == "j" && event.key == "k") { - event.target.value = event.target.value.substr(0, event.target.value.length-2) - check_argument(event.target.form, event.target) - event.target.dataset["history"] = JSON.stringify(history) - event.target.dataset["history_last"] = history.length-1 - console.log(history.length) break - // if (event.target.value) { - // event.target.value = "" - // } else { - // event.target.blur() - // } - } - event.target.dataset["last_char"] = event.key + } } - break - case "keymap": - break - switch (event.key) { - case "g": - document.querySelectorAll("form.option label.keymap").forEach(function(item) { - item.className = (item.className == "keymap show")? "keymap hide": "keymap show" - }) - break - default: - if (inputs[event.key]) { - inputs[event.key].focus() - } - break + if (dataset["last_char"] == "j" && event.key == "k") { + target.value = target.value.substr(0, target.value.length-2) + target.blur() } - break - case "copy": - copy_to_clipboard(event.target.innerText) - break + + dataset["last_char"] = event.key + return false } } -var inputs = {} -var ninput = 0 -var keymap = ['a', 'b', 'c'] function init_option() { - inputs = {} - ninput = 0 - keymap =[] + code.inputs = {} + code.ninput = 0 + code.keymap =[] for (var i = 97; i < 123; i++) { - if (i == 103) { - continue + switch (i) { + case "g".charCodeAt(0): + case "j".charCodeAt(0): + case "k".charCodeAt(0): + case "z".charCodeAt(0): + case "m".charCodeAt(0): + continue } - keymap.push(String.fromCharCode(i)) + code.keymap.push(String.fromCharCode(i)) } - - document.querySelectorAll("form.option input").forEach(function(input) { - if (ninput < keymap.length && input.style.display != "none") { - input.title = "keymap: "+keymap[ninput] - input.dataset["keymap"] = keymap[ninput] - insert_before(input, "label", "("+keymap[ninput]+")").className = "keymap" - inputs[keymap[ninput++]] = input - } - }) + document.querySelectorAll("form.option input").forEach(add_keymap) } function init_append(event) { - var append = document.querySelectorAll("table.append").forEach(function(item) { - item.onclick = function(event) { - if (event.target.tagName == "TD") { - copy_to_clipboard(event.target.innerText) - } - } - }) + var append = document.querySelectorAll("table.append").forEach(add_sort) } function init_result(event) { var result = document.querySelectorAll("code.result pre").forEach(function(item) { - item.onselect = function(event) { - console.log(event) - - } item.onclick = function(event) { - console.log(event) - return - copy_to_clipboard(event.target.innerText) + // copy_to_clipboard(event.target.innerText) } }) } function init_download(event) { + var option = document.querySelector("form.option.dir") var append = document.querySelector("table.append.dir") - if (!append) { - return + if (!append) {return} + + function change(dir, show, run) { + if ((dir.endsWith(".sh") || dir.endsWith(".shy") || dir.endsWith(".py")) && !show) { + var command = document.querySelector("form.option.command") + var cmd = command["cmd"] + cmd.value = "run "+ dir + cmd.focus() + if (run) { + check_option(command) + } + return + } + + option["dir"].value = dir + if (dir == "" || dir.endsWith("/")) { + context.Cookie("download_dir", option["dir"].value) + } + send_command(option) + option["dir"].value = context.Cookie("download_dir") + } - insert_before(append, "input", { - "type": "button", - "value": "root", - "onclick": function(event) { - option["dir"].value = "" - context.Cookie("download_dir", option["dir"].value) - send_command(option) - return true - } + insert_button(append, "root", function(event) { + change("") }) - insert_before(append, "input", { - "type": "button", - "value": "back", - "onclick": function(event) { - var path = option["dir"].value.split("/") - while (path.pop() == "") {} - option["dir"].value = path.join("/")+(path.length? "/": "") - context.Cookie("download_dir", option["dir"].value) - send_command(option) - return true - } + insert_button(append, "back", function(event) { + var path = option["dir"].value.split("/") + while (path.pop() == "") {} + change(path.join("/")+(path.length? "/": "")) }) - var option = document.querySelector("form.option.dir") var sort_order = option["sort_order"] var sort_field = option["sort_field"] sort_field.innerHTML = "" @@ -367,171 +539,67 @@ function init_download(event) { (option["dir"].value = context.Search("download_dir")) && send_command(option) - append.onchange = append.onclick = function(event) { - console.log(event) - if (event.target.tagName == "TD") { - copy_to_clipboard(event.target.innerText.trim()) - var name = event.target.innerText.trim() - if (option["dir"].value && !option["dir"].value.endsWith("/")) { - option["dir"].value += "/"+name - } else { - option["dir"].value += name - } - if (name.endsWith(".py")) { - var cmd = document.querySelector("form.option.command input[name=cmd]") - cmd.value = "run "+ name - cmd.focus() - if (!event.altKey) { - return - } - } - if (name.endsWith("/")) { - context.Cookie("download_dir", option["dir"].value) - } - } else if (event.target.tagName == "TH") { - option["sort_field"].value = event.target.innerText.trim() - - switch (event.target.innerText.trim()) { - case "filename": - case "type": - sort_order.value = (sort_order.value == "str")? "str_r": "str" - break - case "line": - case "size": - sort_order.value = (sort_order.value == "int")? "int_r": "int" - break - case "time": - sort_order.value = (sort_order.value == "time")? "time_r": "time" - break - } + add_sort(append, "filename", function(event) { + var dir = event.target.innerText + if (option["dir"].value && !option["dir"].value.endsWith("/")) { + change(option["dir"].value+"/"+dir, event.altKey, event.shiftKey) + } else { + change(option["dir"].value+dir, event.altKey, event.shiftKey) } - - send_command(option, function(){ - option["dir"].value = context.Cookie("download_dir") - }) - } + }) } function init_context() { - var append = document.querySelector("table.append.ctx") - if (!append) { - return - } var option = document.querySelector("form.option.ctx") - insert_before(append, "input", { - "type": "button", - "value": "ctx", - "onclick": function(event) { - option["ctx"].value = "ctx" - send_command(option) - context.Cookie("current_ctx", option["ctx"].value) - return true - } - }) - insert_before(append, "input", { - "type": "button", - "value": "shy", - "onclick": function(event) { - option["ctx"].value = "shy" - send_command(option) - context.Cookie("current_ctx", option["ctx"].value) - return true - } - }) - insert_before(append, "input", { - "type": "button", - "value": "aaa", - "onclick": function(event) { - option["ctx"].value = "aaa" - send_command(option) - context.Cookie("current_ctx", option["ctx"].value) - return true - } - }) - insert_before(append, "input", { - "type": "button", - "value": "web", - "onclick": function(event) { - option["ctx"].value = "web" - send_command(option) - context.Cookie("current_ctx", option["ctx"].value) - return true - } - }) - insert_before(append, "input", { - "type": "button", - "value": "mdb", - "onclick": function(event) { - option["ctx"].value = "mdb" - send_command(option) - context.Cookie("current_ctx", option["ctx"].value) - return true - } - }) - - option["ctx"].value = context.Cookie("current_ctx") - send_command(option) - - append.onchange = append.onclick = function(event) { - console.log(event) - if (event.target.tagName == "TD") { - var name = event.target.innerText.trim() - copy_to_clipboard(name) - option["ctx"].value = name - context.Cookie("current_ctx", option["ctx"].value) - } else if (event.target.tagName == "TH") { - } + var append = document.querySelector("table.append.ctx") + if (!append) {return} + function change(ctx) { + option["ctx"].value = ctx send_command(option) + context.Cookie("current_ctx", option["ctx"].value) + return ctx } + + var contexts = ["ctx", "shy", "web", "mdb"] + for (var i = 0; i < contexts.length; i++) { + insert_button(append, contexts[i], function(event) { + change(event.target.value) + }) + } + add_sort(append, "name", function(event) { + change(event.target.innerText.trim()) + }) } + function init_command() { - var append = document.querySelector("table.append.command") - if (!append) { - return - } var option = document.querySelector("form.option.command") - insert_before(append, "input", { - "type": "button", - "value": "clear", - "onclick": function(event) { - option["cmd"].value = "" - return true - } + var append = document.querySelector("table.append.command") + var result = document.querySelector("code.result.command pre") + if (!append) {return} + + insert_button(append, "online", function(event) { + option["cmd"].value += " cmd_env IS_PROD_RUNTIME 1" + option["cmd"].focus() + send_command(option) }) - insert_before(append, "input", { - "type": "button", - "value": "exec", - "onclick": function(event) { - send_command(option) - return true - } + insert_button(append, "clear", function(event) { + option["cmd"].value = "" + result.innerHTML = "" + append.innerHTML = "" }) - insert_before(append, "input", { - "type": "button", - "value": "online", - "onclick": function(event) { - option["cmd"].value += " cmd_env IS_PROD_RUNTIME 1" - send_command(option) - option["cmd"].focus() - return true - } + insert_button(append, "exec", function(event) { + send_command(option) }) } + function init_userinfo() { - var append = document.querySelector("table.append.userinfo") - if (!append) { - return - } var option = document.querySelector("form.option.userinfo") - return - insert_before(append, "input", { - "type": "button", - "value": "logout", - "onclick": function(event) { - context.Cookie("sessid", "") - location.reload() - return true - } + var append = document.querySelector("table.append.userinfo") + if (!append) {return} + + insert_button(append, "logout", function(event) { + context.Cookie("sessid", "") + location.reload() }) } diff --git a/usr/librarys/context.js b/usr/librarys/context.js index 870e578f..90116105 100644 --- a/usr/librarys/context.js +++ b/usr/librarys/context.js @@ -94,7 +94,6 @@ context = { var arg = args.join("&"); arg && (url += ((url.indexOf("?")>-1)? "&": "?") + arg) - console.log("GET: "+url); var xhr = new XMLHttpRequest(); xhr.open("GET", url); @@ -114,8 +113,6 @@ context = { var msg = {"result": [xhr.responseText]} } - console.log(msg) - msg.result && console.log(msg.result.join("")) if (msg.download_file) { window.open(msg.download_file.join("")) } else if (msg.page_redirect) { @@ -130,38 +127,48 @@ context = { } context.isMobile = navigator.userAgent.indexOf("Mobile") > -1 +context.scroll_by = window.innerHeight/2 -function insert_child(parent, element, html, position) { - var elm = document.createElement(element) - html && (elm.innerHTML = html) - return parent.insertBefore(elm, position || parent.firstElementChild) -} -function append_child(parent, element, html) { - var elm = document.createElement(element) - html && typeof html == "string" && (elm.innerHTML = html) - if (typeof html == "object") { +function modify_node(which, html) { + var node = which + if (typeof which == "string") { + node = document.querySelector(which) + } + + html && typeof html == "string" && (node.innerHTML = html) + if (html && typeof html == "object") { for (var k in html) { if (typeof html[k] == "object") { for (var d in html[k]) { - elm[k][d] = html[k][d] + node[k][d] = html[k][d] } continue } - - elm[k] = html[k] + node[k] = html[k] } } + return node +} +function create_node(element, html) { + var node = document.createElement(element) + return modify_node(node, html) +} + +function insert_child(parent, element, html, position) { + var elm = create_node(element, html) + return parent.insertBefore(elm, position || parent.firstElementChild) +} +function append_child(parent, element, html) { + var elm = create_node(element, html) parent.append(elm) return elm } function insert_before(self, element, html) { - var elm = document.createElement(element) - html && typeof html == "string" && (elm.innerHTML = html) - if (typeof html == "object") { - for (var k in html) { - elm[k] = html[k] - } - } + var elm = create_node(element, html) return self.parentElement.insertBefore(elm, self) } - +function insert_button(which, value, callback) { + insert_before(which, "input", { + "type": "button", "value": value, "onclick": callback, + }) +} diff --git a/usr/template/code/code.tmpl b/usr/template/code/code.tmpl index dd29e583..4ef9962f 100644 --- a/usr/template/code/code.tmpl +++ b/usr/template/code/code.tmpl @@ -68,6 +68,7 @@ } table.append { font-size:14px; + overflow: auto; } table.append th { font-family:monospace; @@ -119,7 +120,7 @@ {{end}} {{define "componet"}} -