diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index 7fd31cd8..ae05290d 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -941,60 +941,57 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", continue } + // 查找模块 + msg := m.Find(kit.Select(m.Cap("module"), val["componet_ctx"])) + + // 默认变量 + msg.Option("componet_name", val["name"].(string)) + for k, v := range val { + if msg.Option(k) != "" { + continue + } + switch value := v.(type) { + case []string: + msg.Add("option", k, value) + case string: + msg.Add("option", k, value) + default: + msg.Put("option", k, value) + } + } + // 默认参数 + if val["inputs"] != nil { + for _, v := range val["inputs"].([]interface{}) { + value := v.(map[string]interface{}) + if value["name"] != nil && msg.Option(value["name"].(string)) == "" { + msg.Add("option", value["name"].(string), m.Parse(value["value"])) + } + } + } + + // 添加设备 arg = arg[:0] if kit.Right(val["componet_pod"]) { arg = append(arg, "sh", "node", kit.Format(m.Magic("session", "current.pod"))) } + // 添加命令 if kit.Right(val["componet_cmd"]) { arg = append(arg, kit.Format(val["componet_cmd"])) } if m.Has("cmds") { arg = append(arg, kit.Trans(m.Optionv("cmds"))...) } + // 添加参数 + for _, v := range kit.Trans(val["arguments"]) { + arg = append(arg, msg.Parse(v)) + } - msg := m if len(arg) > 0 { - // 查找模块 - msg = m.Find(kit.Select(m.Cap("module"), val["componet_ctx"])) - // 权限检查 if m.Options("bench") && !m.Cmds("aaa.work", "right", m.Option("componet_group"), arg[0]) { continue } - // 添加参数值 - if value, ok := val["arguments"].([]interface{}); ok { - for _, v := range value { - arg = append(arg, msg.Parse(kit.Format(v))) - } - } - - // 添加固定值 - msg.Option("componet_name", val["name"].(string)) - for k, v := range val { - if msg.Option(k) != "" { - continue - } - switch value := v.(type) { - case []string: - msg.Add("option", k, value) - case string: - msg.Add("option", k, value) - default: - msg.Put("option", k, value) - } - } - - // 添加输入值 - if val["inputs"] != nil { - for _, v := range val["inputs"].([]interface{}) { - value := v.(map[string]interface{}) - if value["name"] != nil && msg.Option(value["name"].(string)) == "" { - msg.Add("option", value["name"].(string), m.Parse(value["value"])) - } - } - } - m.Option("remote", "true") // 执行命令 diff --git a/src/examples/code/code.go b/src/examples/code/code.go index 7ac7a6d3..b3bee7f7 100644 --- a/src/examples/code/code.go +++ b/src/examples/code/code.go @@ -122,7 +122,9 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, "index": []interface{}{ map[string]interface{}{"name": "code", "template": "head"}, - map[string]interface{}{"name": "toolkit", "help": "toolkit", "template": "toolkit"}, + map[string]interface{}{"name": "toolkit", "help": "Ctrl+B", "template": "toolkit", + "componet_view": "KitList", "componet_init": "initKitList", + }, // map[string]interface{}{"name": "login", "help": "login", "template": "componet", // "componet_ctx": "aaa", "componet_cmd": "login", "arguments": []interface{}{"@username", "@password"}, // "inputs": []interface{}{ @@ -186,14 +188,6 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, "display_result": "", }, - map[string]interface{}{"name": "cmd", "help": "cmd", "template": "componet", - "componet_ctx": "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{}{"name": "pod", "help": "pod", "template": "componet", "componet_view": "PodList", "componet_init": "initPodList", "pre_run": true, "componet_ctx": "ssh", "componet_cmd": "remote", "inputs": []interface{}{ @@ -210,6 +204,12 @@ var Index = &ctx.Context{Name: "code", Help: "代码中心", }, "display_result": "", }, + map[string]interface{}{"name": "cmd", "help": "cmd", "template": "componet", + "componet_view": "CmdList", "componet_init": "initCmdList", + "componet_ctx": "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{}{"name": "mp", "template": "mp"}, map[string]interface{}{"name": "tail", "template": "tail"}, }, diff --git a/usr/librarys/code.js b/usr/librarys/code.js index 4f744941..311789cd 100644 --- a/usr/librarys/code.js +++ b/usr/librarys/code.js @@ -1,769 +1,4 @@ -var code = { - showmap: false, - keymap: [], - inputs: [], - ninput: 0, - - ntext: 1, - quick_txt: false, - - ncommand: 1, - current_cmd: "", - - show_result: false, - show_height: "30px", - hide_height: "14px", - scroll_x: 50, - scroll_y: 50, -} - -// 粘贴板 -function save_clipboard(item) { - var txt = [] - var li = item.parentElement.children - for (var i = 0; i < li.length; i++) { - if (li[i].dataset["text"]) { - txt.push(li[i].dataset["text"]) - } - } - - context.GET("", { - "componet_group": "index", - "componet_name": "cmd", - "cmd": "aaa.work "+context.Search("bench")+" clipstack '"+JSON.stringify(txt)+"'" - }, function(msg) { - alert("保存成功") - }) -} -function copy_to_clipboard(text, skip_blur, skip_toolkit) { - var clipboard = modify_node(".clipboard", {"value": text}) - if (skip_blur) { - document.execCommand("copy") - } else { - clipboard.select() - document.execCommand("copy") - clipboard.blur() - } - - var clipstack = document.querySelector("#clipstack") - insert_child(clipstack, "option").value = text - clipstack.childElementCount > 3 && clipstack.removeChild(clipstack.lastElementChild) - - if (skip_toolkit) { - return - } - - var txt = document.querySelector("div.workflow>ul>li>ul.txt") - var target = append_child(txt, "li", { - "innerText": format_date(new Date())+" "+(code.ntext++)+": "+text, - "dataset": { - "text": text, - "action": "copy_txt", - }, - "onclick": function(event) { - if (event.altKey) { - target.parentElement.removeChild(target) - return - } - - if (event.shiftKey) { - var cmd = document.querySelector("form.option.cmd"+code.current_cmd+" input[name=cmd]") - cmd && (cmd.value += " "+text) - return - } - copy_to_clipboard(text, false, true) - }, - }) -} - -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.startsWith(field)) { - typeof cb == "function" && cb(event) - } - - var has = document.querySelector("td.clip") - has && (has.className = "") - target.className = "clip" - - if (event.shiftKey) { - copy_to_clipboard(target.innerText, false, false) - return - } - - var text = window.getSelection().toString() - if (text) { - copy_to_clipboard(text, true, !event.shiftKey) - } - } - } - } - } -} - -// 命令行 -function del_command(target) { - var can_remove = false - var order = -1 - 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"] - } - } - if (p && can_remove) { - p.parentElement.removeChild(p) - } - - for (;order < code.ncommand; order++) { - var input = document.querySelector("form.option.cmd"+order+" input[name=cmd]") - if (input) { - input.focus() - return - } - } - for (;order >= 0; order--) { - var input = document.querySelector("form.option.cmd"+(order? order: "")+" input[name=cmd]") - code.ncommand = order+1 - if (input) { - input.focus() - return - } - } -} -function shrink_command_result() { - 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 append = command.querySelector("table.append") - var result = command.querySelector("code.result pre") - // append.style.display = (code.show_result||!append.querySelector("tr"))? "": "none" - result.style.height = (code.show_result||result.innerText=="")? "": code.show_height - }) -} -function add_command(init) { - var order = code.ncommand - var name = "cmd"+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": "cmd", - "componet_name_alias": name, - "componet_name_order": order, - } - }) - - append_child(option, "input", {"style": {"display": "none"}}) - append_child(option, "input", { - "name": "cmd", "className": "cmd", - "onkeyup": function(event) {onaction(event, "input")}, - "onfocus": function(event) {code.current_cmd=order} - }).focus() - - add_sort(append_child(fieldset, "table", {"className": "append "+name})) - append_child(append_child(fieldset, "code", {"className": "result "+name}), "pre") - - if (init) { - return fieldset - } - - var cmds = document.querySelector("div.workflow ul.cmd") - var cmd = append_child(cmds, "li", { - "innertText": order+": ", - "className": name, - "dataset": { - "cmd": order, - } - }) - return fieldset -} -function send_command(form, cb) { - var data = {} - for (var key in form.dataset) { - data[key] = form.dataset[key] - } - for (var i = 0; i < form.length; i++) { - if (form[i].name) { - data[form[i].name] = form[i].value - } - } - - var order = (data["componet_name_order"]||"") - var cmd = document.querySelector("div.workflow>ul>li>ul>li.cmd"+order) - cmd && (cmd.innerText = format_date(new Date())+" "+order+": "+data["cmd"]) - - context.GET("", data, function(msg) { - 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 (append && msg) { - append.innerHTML = "" - if (msg.append) { - var tr = append_child(append, "tr") - for (var i = 0; i < msg.append.length; i++) { - append_child(tr, "th", msg.append[i]+"("+(i+1)+")") - } - - 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", format(msg[msg.append[k]][i])) - } - } - - result && ( result.style.height = code.show_result? "": code.show_height) - } - } - - if (result && msg) { - if (msg["Content-Type"] && msg["Content-Type"].join("") == "text/html") { - append_child(result, "iframe").innerHTML = (msg.result || []).join("") - } else { - result.innerHTML = (msg.result || []).join("") - } - init_result() - } - - typeof(cb) == "function" && cb(msg) - }) -} -function check_option(form, target, cb) { - for (var i = 0; i < form.length-1; i++) { - if (form[i] == target) { - if (form[i+1].type == "button") { - form[i+1].click() - } else { - form[i+1].focus() - } - return false - } - } - send_command(form, cb) -} - -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 -} - -function onaction(event, action, arg) { - var target = event.target - var dataset = target.dataset - - switch (action) { - case "scroll": - var body = document.getElementsByTagName("body")[0] - if (target.tagName == "BODY") { - switch (event.key) { - case "h": - if (event.ctrlKey) { - window.scrollBy(-code.scroll_x*10, 0) - } else { - window.scrollBy(-code.scroll_x, 0) - } - break - case "H": - window.scrollBy(-body.scrollWidth, 0) - break - case "l": - if (event.ctrlKey) { - window.scrollBy(code.scroll_x*10, 0) - } else { - window.scrollBy(code.scroll_x, 0) - } - break - case "L": - window.scrollBy(body.scrollWidth, 0) - break - case "j": - if (event.ctrlKey) { - window.scrollBy(0, code.scroll_y*10) - } else { - window.scrollBy(0, code.scroll_y) - } - break - case "J": - window.scrollBy(0, body.scrollHeight) - break - case "k": - if (event.ctrlKey) { - window.scrollBy(0, -code.scroll_y*10) - } else { - window.scrollBy(0, -code.scroll_y) - } - break - case "K": - window.scrollBy(0, -body.scrollHeight) - break - } - } - return - case "keymap": - if (target.tagName == "INPUT" && target.type == "text") { - return - } - if (event.ctrlKey) { - switch (event.key) { - case "b": - var item = document.querySelector("div.workflow>div") - item.onclick() - break - case "p": - var target = document.querySelector("div.workflow>ul>li>ul>li[data-action=quick_txt]") - code.quick_txt = !code.quick_txt - target.className= code.quick_txt? "stick": "" - break - case "y": - copy_to_clipboard(prompt("text")) - break - case "s": - save_clipboard(document.querySelector("div.workflow>ul>li>ul.txt>li[data-action=save_txt")) - break - case "m": - add_command() - break - case "z": - shrink_command_result() - var target = document.querySelector("div.workflow>ul>li>ul>li[data-action=shrink_cmd]") - target.className = code.show_result? "": "stick" - break - case "r": - location.reload() - break - case "t": - location.search = "" - break - 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 "0": - document.querySelector("form.option.cmd 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.cmd"+event.key+" input[name=cmd]").focus() - break - } - return - } - - // switch (event.key) { - // default: - // if (code.inputs[event.key]) { - // code.inputs[event.key].focus() - // } - // break - // } - break - case "input": - if (event.key == "Escape") { - target.blur() - break - } - if (event.key == "Enter") { - check_option(target.form, target) - add_history(target, target.value) - break - } - - 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") - - if (event.ctrlKey) { - switch (event.key) { - case "1": - case "2": - case "3": - case "4": - case "5": - case "6": - case "7": - case "8": - case "9": - if (code.quick_txt) { - var item = document.querySelectorAll("div.workflow>ul>li>ul.txt>li[data-text]") - target.value += item[parseInt(event.key)-1].dataset["text"] - } else { - var item = document.querySelectorAll("table.append.cmd"+(parseInt(option.dataset.componet_name_order)-1)+" td") - if (event.shiftKey) { - var item = document.querySelectorAll("table.append.cmd td") - } - target.value += item[parseInt(event.key)-1].innerText - } - break - case "0": - var pre_pre = document.querySelector("code.result.cmd"+(parseInt(option.dataset.componet_name_order)-1)+" pre") - target.value += pre_pre.innerText - break - case "a": - case "e": - case "b": - case "f": - break - 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) { - if (value[i] != ' ') { - break - } - } else { - if (value[i] == ' ') { - break - } - } - } - - target.dataset["old_string"] = value.substr(i+1, value.length) - target.value = value.substr(0, i+1) - break - case "u": - if (target.value != "") { - target.dataset["old_string"] = target.value - } - target.value = "" - break - 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": - result.style.height = result.style.height? "": code.hide_height - 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.cmd"+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.cmd"+(order? order: "")+" input[name=cmd]") - if (input) { - input.focus() - return - } - } - break - case "m": - add_command() - break - case "q": - del_command(event.target) - break - } - } - - if (dataset["last_char"] == "j" && event.key == "k") { - target.value = target.value.substr(0, target.value.length-2) - target.blur() - } - - dataset["last_char"] = event.key - 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 "cmd": - check_option(target.form, target, function(msg) { - if (target["value"] == "login") { - location.reload() - } - typeof target.form.onactions == "function" && target.form.onactions(msg) - }) - break - case "toolkit": - if (event.key == "Enter") { - context.GET("", {"toolkit": dataset["cmd"], "argument": target.value}, function(msg) { - target.nextElementSibling.innerText = msg.result - event - }) - } - break - } -} - -function init_append(event) { - var append = document.querySelectorAll("table.append").forEach(add_sort) -} -function init_result(event) { - var result = document.querySelectorAll("code.result pre").forEach(function(item) { - item.onclick = function(event) { - var text = window.getSelection().toString() - if (text) { - copy_to_clipboard(text, true, !event.shiftKey) - } - } - }) -} - -function init_command() { - var option = document.querySelector("form.option.cmd") - if (!option) { - return - } - option.dataset["componet_name_alias"] = "cmd" - option.dataset["componet_name_order"] = 0 - - var action = bench_data.action - if (action && action["cmd"]) { - var option = document.querySelector("form.option.cmd") - var cmd = option.querySelector("input[name=cmd]") - cmd.value = action["cmd"].cmd[1] - check_option(option) - } - - var max = 0 - for (var k in action) { - var order = parseInt(action[k].order) - if (order > max) { - max = order - } - } - - for (var i = 1; i <= max; i++) { - var fieldset = add_command(true) - if (action["cmd"+i]) { - var option = fieldset.querySelector("form.option") - var cmd = option.querySelector("input[name=cmd]") - cmd.value = action["cmd"+i].cmd[1] - check_option(option) - } - } -} -function init_toolkit() { - text = JSON.parse(bench_data.clipstack || "[]") - for (var i = 0; i < text.length; i++) { - copy_to_clipboard(text[i]) - } - bench_data.board = bench_data.board || {} - - document.querySelectorAll("div.workflow").forEach(function(workflow) { - // 移动面板 - workflow.style.left = context.Cookie("toolkit_left") - workflow.style.top = context.Cookie("toolkit_top") - var moving = false, left0 = 0, top0 = 0, x0 = 0, y0 = 0 - workflow.onclick = function(event) { - if (event.target != workflow) { - return - } - moving = !moving - if (moving) { - left0 = workflow.offsetLeft - top0 = workflow.offsetTop - x0 = event.clientX - y0 = event.clientY - } - } - workflow.onmousemove = function(event) { - if (moving) { - workflow.style.left = (left0+(event.clientX-x0))+"px" - workflow.style.top = (top0+(event.clientY-y0))+"px" - context.Cookie("toolkit_left", workflow.style.left) - context.Cookie("toolkit_top", workflow.style.top) - } - } - - // 固定面板 - if (context.Cookie("toolkit_class")) { - workflow.className = context.Cookie("toolkit_class") - } - var head = workflow.querySelector("div") - head.onclick = function(event) { - head.dataset["show"] = !right(head.dataset["show"]) - workflow.className = right(head.dataset["show"])? "workflow max": "workflow" - context.Cookie("toolkit_class", workflow.className) - } - - // 折叠目录 - var toolkit = workflow.querySelector("ul.toolkit") - toolkit.querySelectorAll("li>div").forEach(function(menu) { - menu.onclick = function(event) { - menu.dataset["hide"] = !right(menu.dataset["hide"]) - menu.nextElementSibling.style.display = right(menu.dataset["hide"])? "none": "" - } - }) - - // 事件 - toolkit.querySelectorAll("li>ul>li").forEach(function(item) { - // if (bench_data.board["key"] == item.dataset["key"]) { - // // item.className = "stick" - // } - - item.onclick = function(event) { - var target = event.target - var data = item.dataset - switch (data["action"]) { - case "quick_txt": - code.quick_txt = !code.quick_txt - target.className= code.quick_txt? "stick": "" - break - case "copy_txt": - if (event.altKey) { - target.parentElement.removeChild(target) - return - } - if (event.shiftKey) { - var cmd = document.querySelector("form.option.cmd"+code.current_cmd+" input[name=cmd]") - cmd && (cmd.value += " "+text) - return - } - copy_to_clipboard(data["text"], true) - break - case "save_txt": - save_clipboard(item) - return - case "create_txt": - var text = prompt("text") - text && copy_to_clipboard(text) - return - case "shrink_cmd": - shrink_command_result() - var target = document.querySelector("div.workflow>ul>li>ul>li[data-action=shrink_cmd]") - target.className = code.show_result? "": "stick" - return - case "create_cmd": - add_command() - return - case "refresh_fly": - location.reload() - return - case "create_fly": - context.Command(["sess", "bench", "create"], function(msg) { - context.Search("bench", msg.result[0]) - }) - return - case "rename_fly": - context.Command(["work", context.Search("bench"), "rename", prompt("name")], function() { - location.reload() - }) - return - case "remove_fly": - var b = "" - document.querySelectorAll("div.workflow>ul.toolkit>li>ul.fly>li[data-key]").forEach(function(item){ - if (!b && item.dataset["key"] != context.Search("bench")) { - b = item.dataset["key"] - } - }) - context.Search("bench", b) - context.Command(["work", context.Search("bench"), "delete"]) - return - } - - // 切换工作流 - if (data["key"] && data["key"] != context.Search("bench")) { - context.Search("bench", data["key"]) - return - } - - // 切换命令行 - var cmd = document.querySelector("form.option.cmd"+data["cmd"]+" input[name=cmd]") - cmd && cmd.focus() - } - }) - }) -} - -Page({ +var page = Page({ initFlashText: function(page, field, option, append, result) { option.onactions = function(msg) { page.reload() @@ -784,15 +19,15 @@ Page({ {"view": ["detail", "div", tip.text]}, {"code": [tip.output, "result", "result"]}, {"view": ["action"], "list": [ - {"click": ["查看详情", function(event) { + {"button": ["查看详情", function(event) { ctx.Search("flash_index", tip.index) }]}, - {"click": ["执行代码", function(event) { + {"button": ["执行代码", function(event) { tip.code && ctx.Run(page, option.dataset, [tip.index, "run"], function(msg) { ui.output.innerText = msg.result }) }]}, - {"click": ["清空结果", function(event) { + {"button": ["清空结果", function(event) { ui.output.innerText = "" }]}, ]}, @@ -846,11 +81,563 @@ Page({ return {"button": ["ctx", "shy", "web", "mdb"], "action": change, "table": {"names": change}} }, - init: function(exp) { - init_append() - init_result() + getCmdList: function(input, step, cmd) { + var history = kit.History.get("cmd") + var length = history.length + var last = (parseInt(input.dataset["history_last"]||length)+step+length)%length + if (0 <= last && last < length) { + input.dataset["history_last"] = last + cmd = history[last].data + } + return cmd + }, + showCmdResult: function(page) { + page.conf.show_result = !page.conf.show_result + document.querySelectorAll("body>fieldset>code.result>pre").forEach(function(result) { + result.style.height = (page.conf.show_result || result.innerText=="")? "": page.conf.show_height + }) + }, + showCmdList: function(msg, option, append, result) { + append.innerHTML = "" + kit.AppendTable(append, ctx.Table(msg), msg.append) + result.innerHTML = "" + result.innerText = msg.result.join("") + return + }, + initCmdList: function(page, field, option, append, result) { + option.dataset["componet_name_alias"] = "cmd" + option.dataset["componet_name_order"] = 0 + option.onactions = function(msg) { + page.showCmdList(msg, option, append, result) + } - init_command() - init_toolkit() + var cmd = option.querySelector("input[name=cmd]") + cmd.onkeyup = function(event) { + page.onCmdList("input", cmd, option, append, result, event) + } + + var action = bench_data.action + if (action && action["cmd"]) { + cmd.value = action["cmd"].cmd[1] + ctx.Runs(page, option) + page.History.add("cmd", cmd.value) + } + + var max = 0 + for (var k in action) { + var order = parseInt(action[k].order) + if (order > max) { + max = order + } + } + + for (var i = 1; i <= max; i++) { + var ui = page.addCmdList("cmd", i) + if (action["cmd"+i]) { + ui.cmd.value = action["cmd"+i].cmd[1] + ctx.Runs(page, ui.option) + page.History.add("cmd", ui.cmd.value) + } + } + page.conf.ncommand = i + return + }, + addCmdList: function(name, order) { + var page = this + var alias = name+order + var ui = kit.AppendChild(document.querySelector("body"), [{"type": "fieldset", "data": {}, "list": [ + {"text": [alias, "legend"]}, + {"view": ["option "+alias, "form", "", "option"], "data": {"dataset": { + "componet_group": "index", "componet_name": name, "componet_name_alias": alias, "componet_name_order": order, + }, "onactions": function(msg) { + page.showCmdList(msg, ui.option, ui.append, ui.result) + }}, "list": [ + {"type": "input", "data": {"style": {"display": "none"}}}, + {"name": "cmd", "type": "input", "data": {"name": "cmd", "className": "cmd", "onkeyup": function(event) { + page.onCmdList("input", ui.cmd, ui.option, ui.append, ui.result, event) + }}}, + ]}, + {"view": ["append "+alias, "table", "", "append"]}, + {"code": ["", "result", "result "+alias]}, + ]}]) + page.OrderTable(ui.append) + page.OrderCode(ui.code) + ui.cmd.focus() + return ui + }, + delCmdList: function(name, order) { + var option = document.querySelector("form.option.cmd"+order) + option && document.body.removeChild(option.parentElement) + + for (;order < page.conf.ncommand; order++) { + var input = document.querySelector("form.option.cmd"+order+" input[name=cmd]") + if (input) { + input.focus() + return + } + } + for (;order >= 0; order--) { + var input = document.querySelector("form.option.cmd"+(order? order: "")+" input[name=cmd]") + page.conf.ncommand = order+1 + if (input) { + input.focus() + return + } + } + }, + onCmdList: function(action, target, option, append, result, event) { + var page = this + var order = option.dataset.componet_name_order + var prev_order = (parseInt(order)-1+page.conf.ncommand)%page.conf.ncommand||"" + var next_order = (parseInt(order)+1)%page.conf.ncommand||"" + + switch (action) { + case "input": + if (event.key == "Escape") { + target.blur() + + } else if (event.key == "Enter") { + target.dataset.history_last = page.History.get("cmd").length + page.History.add("cmd", target.value) + ctx.Runs(page, option) + + } else if (event.ctrlKey) { + switch (event.key) { + case "0": + var pre_pre = document.querySelector("code.result.cmd"+(event.shiftKey? next_order: prev_order)+" pre") + pre_pre && (target.value += pre_pre.innerText) + break + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + if (code.quick_txt) { + var item = document.querySelectorAll("div.workflow>ul>li>ul.txt>li[data-text]") + target.value += item[parseInt(event.key)-1].dataset["text"] + } else { + var item = document.querySelectorAll("table.append.cmd"+(event.shiftKey? next_order: prev_order)+" td") + target.value += item[parseInt(event.key)-1].innerText + } + break + case "p": + target.value = page.getCmdList(target, -1, target.value) + break + case "n": + target.value = page.getCmdList(target, 1, target.value) + break + case "g": + var value = target.value.substr(0, target.selectionStart) + var last = parseInt(target.dataset.search_last || kit.History.get("cmd").length-1) + for (var i = last; i >= 0; i--) { + var cmd = kit.History.get("cmd", i).data + if (cmd.startsWith(value)) { + target.value = cmd + target.dataset.search_last = i-1 + target.setSelectionRange(value.length, cmd.length) + break + } + } + target.dataset.search_last = "" + break + case "a": + case "e": + case "f": + case "b": + case "h": + case "d": + break + case "k": + kit.DelText(target, target.selectionStart) + break + case "u": + kit.DelText(target, 0, target.selectionEnd) + break + case "w": + var start = target.selectionStart-2 + var end = target.selectionEnd-1 + for (var i = start; i >= 0; i--) { + if (target.value[end] == " " && target.value[i] != " ") { + break + } + if (target.value[end] != " " && target.value[i] == " ") { + break + } + } + kit.DelText(target, i+1, end-i) + break + case "c": + append.innerHTML = "" + result.innerHTML = "" + break + case "r": + append.innerHTML = "" + result.innerHTML = "" + case "j": + target.dataset.history_last = page.History.get("cmd").length + page.History.add("cmd", target.value) + ctx.Runs(page, option) + break + case "l": + window.scrollTo(0, option.parentElement.offsetTop) + break + case "m": + page.addCmdList("cmd", page.conf.ncommand++) + break + case "i": + var input = document.querySelector("form.option.cmd"+next_order+" input[name=cmd]") + input && input.focus() + break + case "o": + var input = document.querySelector("form.option.cmd"+prev_order+" input[name=cmd]") + input && input.focus() + break + case "x": + result.style.height = result.style.height? "": page.conf.hide_height + break + case "z": + result.style.height = result.style.height? "": page.conf.show_height + break + case "q": + page.delCmdList("cmd", order) + default: + return + } + } else { + kit.History.add("key", event.key) + if (kit.HitText(target, "jk")) { + kit.DelText(target, target.selectionStart-2, 2) + target.blur() + } + } + event.stopPropagation() + } + }, + + initKitList: function(page, field, option, append, result) { + var ui = kit.AppendChild(field, [{"type": "ul", "list": [ + {"fork": ["粘贴板", [ + {"leaf": ["+ 保存粘贴板(Ctrl+S)", function(event) { + console.log("save_txt") + }]}, + {"leaf": ["+ 添加粘贴板(Ctrl+Y)", function(event) { + console.log("create_txt") + }]}, + {"leaf": ["+ 快捷粘贴板(Ctrl+P)", function(event) { + console.log("quick_txt") + }]}, + ]]}, + {"fork": ["命令行", [ + {"leaf": ["+ 折叠命令行(Ctrl+Z)", function(event, target) { + target.className = page.conf.show_result? "": "stick" + page.showCmdResult(page) + }]}, + {"leaf": ["+ 添加命令行(Ctrl+M)", function(event) { + page.addCmdList("cmd", page.conf.ncommand++) + }]}, + ]]}, + {"fork": ["工作流", [ + {"leaf": ["+ 刷新工作流(Ctrl+R)", function(event) { + console.log("refresh_fly") + }]}, + {"leaf": ["+ 添加工作流(Ctrl+T)", function(event) { + console.log("create_fly") + }]}, + {"leaf": ["+ 命名工作流", function(event) { + console.log("rename_fly") + }]}, + {"leaf": ["+ 删除工作流", function(event) { + console.log("remove_fly") + }]}, + ]]}, + ]}]) + /* +
  • 命令行
    + +
  • +
  • 工作流
    + +
  • + */ + return + + text = JSON.parse(bench_data.clipstack || "[]") + for (var i = 0; i < text.length; i++) { + copy_to_clipboard(text[i]) + } + bench_data.board = bench_data.board || {} + + document.querySelectorAll("div.workflow").forEach(function(workflow) { + // 移动面板 + workflow.style.left = context.Cookie("toolkit_left") + workflow.style.top = context.Cookie("toolkit_top") + var moving = false, left0 = 0, top0 = 0, x0 = 0, y0 = 0 + workflow.onclick = function(event) { + if (event.target != workflow) { + return + } + moving = !moving + if (moving) { + left0 = workflow.offsetLeft + top0 = workflow.offsetTop + x0 = event.clientX + y0 = event.clientY + } + } + workflow.onmousemove = function(event) { + if (moving) { + workflow.style.left = (left0+(event.clientX-x0))+"px" + workflow.style.top = (top0+(event.clientY-y0))+"px" + context.Cookie("toolkit_left", workflow.style.left) + context.Cookie("toolkit_top", workflow.style.top) + } + } + + // 固定面板 + if (context.Cookie("toolkit_class")) { + workflow.className = context.Cookie("toolkit_class") + } + var head = workflow.querySelector("div") + head.onclick = function(event) { + head.dataset["show"] = !right(head.dataset["show"]) + workflow.className = right(head.dataset["show"])? "workflow max": "workflow" + context.Cookie("toolkit_class", workflow.className) + } + + // 折叠目录 + var toolkit = workflow.querySelector("ul.toolkit") + toolkit.querySelectorAll("li>div").forEach(function(menu) { + menu.onclick = function(event) { + menu.dataset["hide"] = !right(menu.dataset["hide"]) + menu.nextElementSibling.style.display = right(menu.dataset["hide"])? "none": "" + } + }) + + // 事件 + toolkit.querySelectorAll("li>ul>li").forEach(function(item) { + // if (bench_data.board["key"] == item.dataset["key"]) { + // // item.className = "stick" + // } + + item.onclick = function(event) { + var target = event.target + var data = item.dataset + switch (data["action"]) { + case "quick_txt": + code.quick_txt = !code.quick_txt + target.className= code.quick_txt? "stick": "" + break + case "copy_txt": + if (event.altKey) { + target.parentElement.removeChild(target) + return + } + if (event.shiftKey) { + var cmd = document.querySelector("form.option.cmd"+code.current_cmd+" input[name=cmd]") + cmd && (cmd.value += " "+text) + return + } + copy_to_clipboard(data["text"], true) + break + case "save_txt": + save_clipboard(item) + return + case "create_txt": + var text = prompt("text") + text && copy_to_clipboard(text) + return + case "refresh_fly": + location.reload() + return + case "create_fly": + context.Command(["sess", "bench", "create"], function(msg) { + context.Search("bench", msg.result[0]) + }) + return + case "rename_fly": + context.Command(["work", context.Search("bench"), "rename", prompt("name")], function() { + location.reload() + }) + return + case "remove_fly": + var b = "" + document.querySelectorAll("div.workflow>ul.toolkit>li>ul.fly>li[data-key]").forEach(function(item){ + if (!b && item.dataset["key"] != context.Search("bench")) { + b = item.dataset["key"] + } + }) + context.Search("bench", b) + context.Command(["work", context.Search("bench"), "delete"]) + return + } + + // 切换工作流 + if (data["key"] && data["key"] != context.Search("bench")) { + context.Search("bench", data["key"]) + return + } + + // 切换命令行 + var cmd = document.querySelector("form.option.cmd"+data["cmd"]+" input[name=cmd]") + cmd && cmd.focus() + } + }) + }) + return + }, + + onaction: function(action, target, event) { + var page = this + switch (action) { + case "scroll": + if (event.target != document.body) { + return + } + switch (event.key) { + case "h": + if (event.ctrlKey) { + window.scrollBy(-page.conf.scroll_x*10, 0) + } else { + window.scrollBy(-page.conf.scroll_x, 0) + } + break + case "H": + window.scrollBy(-body.scrollWidth, 0) + break + case "l": + if (event.ctrlKey) { + window.scrollBy(page.conf.scroll_x*10, 0) + } else { + window.scrollBy(page.conf.scroll_x, 0) + } + break + case "L": + window.scrollBy(body.scrollWidth, 0) + break + case "j": + if (event.ctrlKey) { + window.scrollBy(0, page.conf.scroll_y*10) + } else { + window.scrollBy(0, page.conf.scroll_y) + } + break + case "J": + window.scrollBy(0, body.scrollHeight) + break + case "k": + if (event.ctrlKey) { + window.scrollBy(0, -page.conf.scroll_y*10) + } else { + window.scrollBy(0, -page.conf.scroll_y) + } + break + case "K": + window.scrollBy(0, -body.scrollHeight) + break + } + return + case "keymap": + if (event.key == "Escape") { + } + if (event.key == "Enter") { + } + if (event.ctrlKey) { + switch (event.key) { + case "m": + page.addCmdList("cmd", page.conf.ncommand++) + return + case "z": + page.showCmdResult(page) + return + case "0": + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + document.querySelector("form.option.cmd"+(event.key||"")+" input[name=cmd]").focus() + return + } + } + } + }, + init: function(exp) { + var page = this + var body = document.body + body.onkeydown = function(event) { + page.onaction("scroll", body, event) + } + body.onkeyup = function(event) { + page.onaction("keymap", body, event) + } + + document.querySelectorAll("body>fieldset").forEach(function(field) { + var option = field.querySelector("form.option") + var append = field.querySelector("table.append") + var result = field.querySelector("code.result pre") + page.OrderForm(page, option, append, result) + page.OrderTable(append) + page.OrderCode(result) + + var init = page[field.dataset.init] + if (typeof init == "function") { + var conf = init(page, field, option, append, result) + if (conf && conf["button"]) { + var buttons = [] + conf.button.forEach(function(value, index) { + buttons.push({"button": [value, function(event) { + typeof conf["action"] == "function" && conf["action"](value, event) + }]}) + }) + kit.InsertChild(field, append, "div", buttons) + } + if (conf && conf["table"]) { + option.onactions = function(msg) { + append.innerHTML = "" + kit.AppendTable(append, ctx.Table(msg), msg.append, function(value, key, row, index, event) { + typeof conf["table"][key] == "function" && conf["table"][key](value, key, row, index, event) + }) + } + ctx.Runs(page, option) + } + } + }) + }, + conf: { + scroll_x: 50, + scroll_y: 50, + + ncommand: 1, + show_result: true, + show_height: "30px", + hide_height: "14px", + + quick_txt: false, }, }) diff --git a/usr/librarys/context.js b/usr/librarys/context.js index 0f58d209..74704fdd 100644 --- a/usr/librarys/context.js +++ b/usr/librarys/context.js @@ -1,33 +1,5 @@ ctx = context = { __proto__: kit, - Table: function(msg, cb) { - var rows = this.PackAppend(msg) - if (typeof cb == "function") { - for (var i = 0; i < rows.length; i++) { - if (cb(rows[i], i)) { - break - } - } - } - return rows - }, - PackAppend: function(msg) { - var ret = [] - if (!msg || !msg.append || !msg.append.length || !msg[msg.append[0]]) { - return ret - } - - var ncol = msg.append.length - var nrow = msg[msg.append[0]].length - for (var i = 0; i < nrow; i++) { - var one = {} - for (var j = 0; j < ncol; j++) { - one[msg.append[j]] = msg[msg.append[j]][i] - } - ret.push(one) - } - return ret - }, Run: function(page, dataset, cmd, cb) { var option = {"cmds": cmd} for (var k in dataset) { @@ -51,14 +23,26 @@ ctx = context = { } this.Run(page, data, [], cb || form.onactions) }, - Current: function(key, value) { - context.GET("", { - "componet_group": "index", - "componet_name": "cmd", - "cmds": ["sess", "current", key, value], - }) - return value + Table: function(msg, cb) { + var ret = [] + if (!msg || !msg.append || !msg.append.length || !msg[msg.append[0]]) { + return ret + } + + var ncol = msg.append.length + var nrow = msg[msg.append[0]].length + for (var i = 0; i < nrow; i++) { + var one = {} + for (var j = 0; j < ncol; j++) { + one[msg.append[j]] = msg[msg.append[j]][i] + } + ret.push(one) + } + + typeof cb == "function" && ret.forEach(cb) + return ret }, + Share: function(objs) { var args = this.Search() for (var k in objs) { @@ -132,45 +116,13 @@ ctx = context = { document.cookie = key+"="+value+";path=/"; return this.Cookie(key); }, - Command: function(cmd, option, cb) { - if (typeof option == "function") { - cb = option - option = {} - } else { - option = option || {} - } - - option["componet_index"] = "index" - if (typeof cmd == "string") { - option["componet_name"] = "source" - option["cmd"] = cmd - } else { - option["componet_name"] = "head" - option["cmds"] = cmd - } - - this.GET("", option, function(msg) { - typeof cb == "function" && (msg && msg[0]? cb(msg[0]): cb()) - }) - }, - Cache: function(key, cb, sync) { - if (key == undefined) { - return this.cache - } - if (this.cache && !sync) { - typeof cb == "function" && cb(this.cache[key]) - return this.cache[key] - } - - var that = this - this.GET("", {"componet_group": "login", "componet_order": "userinfo"}, function(msg) { - msg = msg[0] - that.cache = {} - for (var i = 0; i < msg.append.length; i++) { - that.cache[msg.append[i]] = msg[msg.append[i]].join("") - } - typeof cb == "function" && cb(that.cache[key]) + Current: function(key, value) { + context.GET("", { + "componet_group": "index", + "componet_name": "cmd", + "cmds": ["sess", "current", key, value], }) + return value }, GET: function(url, form, cb) { form = form || {} diff --git a/usr/librarys/example.js b/usr/librarys/example.js index 6b41064e..4882a515 100644 --- a/usr/librarys/example.js +++ b/usr/librarys/example.js @@ -2,33 +2,6 @@ exp = example = { __proto__: ctx, _init: function(page) { page.__proto__ = this - document.querySelectorAll("body>fieldset").forEach(function(field) { - var init = page[field.dataset.init] - if (typeof init == "function") { - var option = field.querySelector("form.option") - var append = field.querySelector("table.append") - var result = field.querySelector("div.result") - var conf = init(page, field, option, append, result) - if (conf && conf["button"]) { - var buttons = [] - conf.button.forEach(function(value, index) { - buttons.push({"click": [value, function(event) { - typeof conf["action"] == "function" && conf["action"](value, event) - }]}) - }) - kit.InsertChild(field, append, "div", buttons) - } - if (conf && conf["table"]) { - option.onactions = function(msg) { - append.innerHTML = "" - kit.AppendTable(append, ctx.PackAppend(msg), msg.append, function(value, key, row, index, event) { - typeof conf["table"][key] && conf["table"][key](value, key, row, index, event) - }) - } - ctx.Runs(page, option) - } - } - }) return this }, reload: function() { diff --git a/usr/librarys/toolkit.js b/usr/librarys/toolkit.js index 9ce7e4ad..1500d92a 100644 --- a/usr/librarys/toolkit.js +++ b/usr/librarys/toolkit.js @@ -1,5 +1,27 @@ kit = toolkit = { + History: {cmd: [], txt: [], key: [], + add: function(type, data) { + var list = this[type] || [] + data && list.push({time: Date.now(), data: data}) + this[type] = list + return list.length + }, + get: function(type, index) { + var list = this[type] || [] + var len = list.length + return index == undefined? this[type]: this[type][(index+len)%len] + }, + }, + Log: function() { + var args = [] + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]) + } + console.log(arguments.length == 1? args[0]: args) + return args + }, isMobile: navigator.userAgent.indexOf("Mobile") > -1, + ModifyNode: function(which, html) { var node = typeof which == "string"? document.querySelector(which): which switch (typeof html) { @@ -30,23 +52,40 @@ kit = toolkit = { return elm } - // code, text, view, click + // tree, code, text, view, click // type, name, data, list + var kit = this subs = subs || {} - for (var i = 0; i < children.length; i++) { - var child = children[i] + children.forEach(function(child, i) { child.data = child.data || {} child.type = child.type || "div" - if (child.click) { + if (child.button) { child.type = "button" - child.data["innerText"] = child.click[0] - child.data["onclick"] = child.click[1] + child.data["innerText"] = child.button[0] + child.data["onclick"] = child.button[1] + } else if (child.click) { + child.data["onclick"] = child.click[0] + } else if (child.fork) { + child.type = "li" + child.list = [ + {"text": [child.fork[0], "div"]}, + {"type": "ul", "list": child.fork[1]}, + ] + } else if (child.leaf) { + child.type = "li" + child.data["innerText"] = child.leaf[0] + if (child.leaf.length > 1 && typeof child.leaf[1] == "function") { + child.data["onclick"] = function(event) { + child.leaf[1](event, node) + } + } } else if (child.view) { child.data["className"] = child.view[0] child.type = child.view.length > 1? child.view[1]: "div" child.view.length > 2 && (child.data["innerText"] = child.view[2]) + child.view.length > 3 && (child.name = child.view[3]) } else if (child.text) { child.data["innerText"] = child.text[0] child.type = child.text.length > 1? child.text[1]: "pre" @@ -57,11 +96,11 @@ kit = toolkit = { child.code.length > 2 && (child.data["className"] = child.code[2]) } - var node = this.CreateNode(child.type, child.data) - child.list && this.AppendChild(node, child.list, subs) + var node = kit.CreateNode(child.type, child.data) + child.list && kit.AppendChild(node, child.list, subs) child.name && (subs[child.name] = node) parent.append(node) - } + }) return subs }, InsertChild: function (parent, position, element, children) { @@ -69,6 +108,7 @@ kit = toolkit = { this.AppendChild(elm, children) return parent.insertBefore(elm, position || parent.firstElementChild) }, + AppendTable: function(table, data, fields, cb) { if (!data || !fields) { return @@ -90,6 +130,180 @@ kit = toolkit = { }) }) }, + RangeTable: function(table, index, sort_asc) { + var list = table.querySelectorAll("tr") + var new_list = [] + + 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 + } + + var value = parseInt(list[i].childNodes[index].innerText) + if (!(value >= 0 || value <= 0)) { + is_number = false + } + + new_list.push(list[i]) + } + + 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 + }, + OrderTable: function(table, field, cb) { + if (!table) {return} + var kit = this + table.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 + kit.RangeTable(table, i, dataset["sort_asc"] == "1") + } else if (target.tagName == "TD") { + var tr = target.parentElement.parentElement.querySelector("tr") + if (tr.childNodes[i].innerText.startsWith(field)) { + typeof cb == "function" && cb(event) + } + kit.CopyText() + } + } + } + } + }, + OrderCode: function(code) { + if (!code) {return} + + var kit = this + code.onclick = function(event) { + kit.CopyText() + } + }, + OrderForm: function(page, form, append, result) { + if (!form) {return} + form.onactions = form.onactions || function(msg) { + if (!msg) {return} + append.innerHTML = "" + kit.AppendTable(append, ctx.Table(msg), msg.append) + result.innerHTML = "" + result.innerText = msg.result.join("") + } + + form.querySelectorAll("select").forEach(function(select, index, array) { + select.onchange = function(event) { + if (index == array.length-1) { + page.Runs(page, form) + return + } + if (array[index+1].type == "button") { + array[index+1].click() + return + } + array[index+1].focus() + } + }) + form.querySelectorAll("input").forEach(function(input, index, array) { + switch (input.type) { + case "button": + input.onclick = function(event) { + if (index == array.length-1) { + page.Runs(page, form) + return + } + if (array[index+1].type == "button") { + array[index+1].click() + return + } + array[index+1].focus() + } + default: + input.onkeyup = function(event) { + if (event.key != "Enter") { + return + } + if (index == array.length-1) { + page.Runs(page, form) + return + } + if (array[index+1].type == "button") { + array[index+1].click() + return + } + array[index+1].focus() + } + } + }) + }, + + CopyText: function(text) { + text = window.getSelection().toString() + if (text == "") {return} + kit.Log(text) + kit.History.add("txt", text) + document.execCommand("copy") + }, + DelText: function(target, start, count) { + target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length) + target.setSelectionRange(start, start) + }, + HitText: function(target, text) { + var start = target.selectionStart + for (var i = 1; i < text.length+1; i++) { + var ch = text[text.length-i] + if (target.value[start-i] != ch && kit.History.get("key", -i).data != ch) { + return false + } + } + return true + }, } function right(arg) { @@ -128,187 +342,3 @@ function format_date(arg) { return arg.getFullYear()+"-"+month+"-"+date+" "+hour+":"+minute+":"+second } -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]) { - node[k][d] = html[k][d] - } - continue - } - 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 = 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, - }) -} - -function format(str) { - if (str.indexOf("http") == 0 && str.indexOf(""+str+"" - } - return str -} -function sort_table(table, index, sort_asc) { - var list = table.querySelectorAll("tr") - var new_list = [] - - 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 - } - - var value = parseInt(list[i].childNodes[index].innerText) - if (!(value >= 0 || value <= 0)) { - is_number = false - } - - new_list.push(list[i]) - } - - 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 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.startsWith(field)) { - typeof cb == "function" && cb(event) - } - } - } - } - } -} -function scroll_page(event, page) { - var body = document.querySelector("body") - - switch (event.key) { - case "h": - if (event.ctrlKey) { - window.scrollBy(-page.scroll_x*10, 0) - } else { - window.scrollBy(-page.scroll_x, 0) - } - break - case "H": - window.scrollBy(-body.scrollWidth, 0) - break - case "l": - if (event.ctrlKey) { - window.scrollBy(page.scroll_x*10, 0) - } else { - window.scrollBy(page.scroll_x, 0) - } - break - case "L": - window.scrollBy(body.scrollWidth, 0) - break - case "j": - if (event.ctrlKey) { - window.scrollBy(0, page.scroll_y*10) - } else { - window.scrollBy(0, page.scroll_y) - } - break - case "J": - window.scrollBy(0, body.scrollHeight) - break - case "k": - if (event.ctrlKey) { - window.scrollBy(0, -page.scroll_y*10) - } else { - window.scrollBy(0, -page.scroll_y) - } - break - case "K": - window.scrollBy(0, -body.scrollHeight) - break - } - return -} - diff --git a/usr/librarys/wiki.js b/usr/librarys/wiki.js index b8ab3f80..40a36aeb 100644 --- a/usr/librarys/wiki.js +++ b/usr/librarys/wiki.js @@ -215,3 +215,178 @@ window.onload = function(event) { init_table() init_layout() } + +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]) { + node[k][d] = html[k][d] + } + continue + } + node[k] = html[k] + } + } + return node +} +function create_node(element, html) { + var node = document.createElement(element) + return modify_node(node, html) +} +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 = create_node(element, html) + return self.parentElement.insertBefore(elm, self) +} + +function format(str) { + if (str.indexOf("http") == 0 && str.indexOf(""+str+"" + } + return str +} +function sort_table(table, index, sort_asc) { + var list = table.querySelectorAll("tr") + var new_list = [] + + 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 + } + + var value = parseInt(list[i].childNodes[index].innerText) + if (!(value >= 0 || value <= 0)) { + is_number = false + } + + new_list.push(list[i]) + } + + 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 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.startsWith(field)) { + typeof cb == "function" && cb(event) + } + } + } + } + } +} +function scroll_page(event, page) { + var body = document.querySelector("body") + + switch (event.key) { + case "h": + if (event.ctrlKey) { + window.scrollBy(-page.scroll_x*10, 0) + } else { + window.scrollBy(-page.scroll_x, 0) + } + break + case "H": + window.scrollBy(-body.scrollWidth, 0) + break + case "l": + if (event.ctrlKey) { + window.scrollBy(page.scroll_x*10, 0) + } else { + window.scrollBy(page.scroll_x, 0) + } + break + case "L": + window.scrollBy(body.scrollWidth, 0) + break + case "j": + if (event.ctrlKey) { + window.scrollBy(0, page.scroll_y*10) + } else { + window.scrollBy(0, page.scroll_y) + } + break + case "J": + window.scrollBy(0, body.scrollHeight) + break + case "k": + if (event.ctrlKey) { + window.scrollBy(0, -page.scroll_y*10) + } else { + window.scrollBy(0, -page.scroll_y) + } + break + case "K": + window.scrollBy(0, -body.scrollHeight) + break + } + return +} + diff --git a/usr/template/code/code.tmpl b/usr/template/code/code.tmpl index 90621eba..4e7224ca 100644 --- a/usr/template/code/code.tmpl +++ b/usr/template/code/code.tmpl @@ -9,7 +9,7 @@ - +