diff --git a/plugin/local/code/inner/syntax.js b/plugin/local/code/inner/syntax.js index 02bc104e..8411d1e6 100644 --- a/plugin/local/code/inner/syntax.js +++ b/plugin/local/code/inner/syntax.js @@ -273,7 +273,9 @@ Volcanos(chat.ONSYNTAX, { "not": code.DATATYPE, "first-child": code.DATATYPE, "last-child": code.DATATYPE, "nth-child": code.DATATYPE, "placeholder": code.DATATYPE, "hover": code.DATATYPE, "focus": code.DATATYPE, + "$action": code.KEYWORD, "$output": code.KEYWORD, + "output": code.KEYWORD, "background-color": code.FUNCTION, "color": code.FUNCTION, "font-family": code.FUNCTION, "font-weight": code.FUNCTION, "font-style": code.FUNCTION, "font-size": code.FUNCTION, "line-height": code.FUNCTION, diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 798c9570..98302241 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -175,138 +175,137 @@ Volcanos(chat.ONKEYMAP, { case lex.TB: case lex.SP: case nfs.PT: - case "[": - case "(": - case "{": update(); break - case "": - default: filter() - } - }, - _mode: { - plugin: { - Escape: shy("清除浮窗", function(event, can) { can.onaction.clear(event, can) }), - f: shy("打开文件", function(event, can) { can.onaction.open(event, can) }), - g: shy("查找搜索", function(event, can) { can.onaction.find(event, can) }), - d: shy("查找函数", function(event, can) { can.page.Select(can, can.ui.path, "span.func", function(target) { target.click() }) }), - n: shy("命令模式", function(event, can) { can.onaction.selectLine(can, can.onaction.selectLine(can)), can.onkeymap._normal(can) }), - i: shy("插入模式", function(event, can) { can.onaction.selectLine(can, can.onaction.selectLine(can)), can.onkeymap._insert(event, can) }), - s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }), - c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }), - v: shy("渲染界面", function(event, can) { can.onaction.show(event, can) }), - r: shy("执行命令", function(event, can) { can.onaction.exec(event, can) }), - t: shy("添加命令", function(event, can) { can.onaction["命令"](event, can) }), - p: shy("添加插件", function(event, can) { can.onaction["插件"](event, can) }), - l: shy("打开右边标签", function(can) { var next = can._tab.nextSibling; next && next.click() }), - h: shy("打开左边标签", function(can) { var prev = can._tab.previousSibling; prev && prev.click() }), - x: shy("关闭标签", function(can) { can._tab._close() }), - }, - normal: { - s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }), - c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }), - v: shy("渲染界面", function(event, can) { can.onaction.show(event, can) }), - r: shy("执行命令", function(event, can) { can.onaction.exec(event, can) }), - - Escape: shy("切换模式", function(can) { can.onkeymap._plugin(can) }), - ArrowLeft: shy("光标左移", function(can, target) { can.onkeymap.cursorMove(target, -1) }), - ArrowRight: shy("光标右移", function(can, target) { can.onkeymap.cursorMove(target, 1) }), - ArrowDown: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }), - ArrowUp: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }), - H: shy("跳到行首", function(can, target) { can.onkeymap.cursorMove(target, 0, 0) }), - L: shy("跳到行尾", function(can, target) { can.onkeymap.cursorMove(target, 0, -1) }), - h: shy("光标左移", function(can, target) { can.onkeymap.cursorMove(target, -1) }), - l: shy("光标右移", function(can, target) { can.onkeymap.cursorMove(target, 1) }), - j: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }), - k: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }), - - I: shy("插入行首", function(event, can) { can.onkeymap._insert(event, can, 0, 0) }), - A: shy("插入行尾", function(event, can) { can.onkeymap._insert(event, can, 0, -1) }), - i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }), - a: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }), - o: shy("插入下一行", function(event, can) { var text = can.current.text() - text = text.substr(0, text.indexOf(text.trimLeft()))+(can.base.endWith(text, "{")? lex.TB: "") - can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.next())) - can.onkeymap._insert(event, can, 0, -1) - }), - O: shy("插入上一行", function(event, can) { var text = can.current.text() - text = text.substr(0, text.indexOf(text.trimLeft()))+(can.base.beginWith(text, "}")? lex.TB: "") - can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.line)) - can.onkeymap._insert(event, can, 0, -1) - }), - - yy: shy("复制当前行", function(event, can, target, count) { var list = [], line = can.current.line - for (var i = 0; i < count; i++) { list.push(can.onexport.text(can, line)), line = line.nextSibling } can.db._last_text = list; return true - }), - dd: shy("剪切当前行", function(event, can, target, count) { var line = can.onaction.selectLine(can), callee = arguments.callee - var list = []; for (var i = 0; i < count; i++) { (function() { var line = can.onaction.selectLine(can), text = can.current.text(); list.push(text) - can.onaction.selectLine(can, can.onaction.deleteLine(can, line)), can.db.undo.push(function() { can.onaction.insertLine(can, text, line), can.onaction.selectLine(can, line) }) - })() } can.db._last_text = list, can.db.redo.push(function() { callee(event, can, target, count) }) - return true - }), - p: shy("向后粘贴", function(can) { if (!can.db._last_text) { return } var line = can.onaction.selectLine(can), callee = arguments.callee - for (var i = can.db._last_text.length-1; i >= 0; i--) { (function() { var line = can.onaction.insertLine(can, can.db._last_text[i], can.current.next()) - can.db.undo.push(function() { can.onaction.deleteLine(can, line), can.onaction.selectLine(can, line-1) }) - })() } can.db.redo.push(function() { callee(event, can, target, count) }) - }), - P: shy("向前粘贴", function(can) { if (!can.db._last_text) { return } var line = can.onaction.selectLine(can), callee = arguments.callee - for (var i = 0; i < can.db._last_text.length; i++) { (function() { var line = can.onaction.insertLine(can, can.db._last_text[i], can.current.line) - can.db.undo.push(function() { can.onaction.deleteLine(can, line), can.onaction.selectLine(can, line+1) }) - })() } can.db.redo.push(function() { callee(event, can, target, count) }) - }), - J: shy("合并两行", function(can) { var next = can.current.next(); if (!next) { return } - var line = can.onaction.selectLine(can), text = can.current.text(), rest = can.onexport.text(can, next) - can.ui.current.value = can.current.text(text.trimRight()+(can.base.endWith(text.trim(), "(", "[")||can.base.beginWith(rest.trim(), ",", "]", ")")? "": lex.SP)+rest.trimLeft()) - can.onkeymap.cursorMove(can.ui.current, text.length, 0), can.onaction.deleteLine(can, next) - can.db.undo.push(function() { can.onaction.modifyLine(can, line, text), can.onaction.insertLine(can, rest, line+1) }) - }), - ".": shy("重复操作", function(can) { var cb = can.db.redo.pop(); cb && cb() }), - u: shy("撤销操作", function(can) { var cb = can.db.undo.pop(); cb && cb() }), - - gg: shy("跳到某行", function(can, count) { return can.onaction.selectLine(can, count), true }), - G: shy("跳到某行", function(can, count) { return can.onaction.selectLine(can, count = count>1? count: can.db.max), true }), - zt: shy("屏幕最上", function(can, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true }), - zz: shy("屏幕中间", function(can, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true }), - zb: shy("屏幕最下", function(can, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true }), - F5: shy("刷新网页", function(can, target) { can.user.reload(true) }), - }, - normal_ctrl: { - e: shy("向上滚屏", function(can) { can.current.scroll(1); if (can.current.scroll()<2) { can.onaction.selectLine(can, can.current.next()) } }), - y: shy("向下滚屏", function(can) { can.current.scroll(-1); if (can.current.scroll()>can.current.window()-3) { can.onaction.selectLine(can, can.current.prev()) } }), - f: shy("向下翻页", function(can, count) { can.current.scroll(can.current.window()) }), - b: shy("向上翻页", function(can, count) { can.current.scroll(-can.current.window()) }), - r: shy("刷新页面", function(can) { can.user.reload(true) }), - }, - insert_ctrl: { - a: shy("光标行首", function(can, target) { for (var i = 0; i < target.value.length; i++) { if (target.value[i] != lex.TB) { break } } can.onkeymap.cursorMove(target, i, 0), can.onkeymap.prevent(event) }), - e: shy("光标行尾", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, 0, -1) }), - b: shy("光标左移", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, -1) }), - f: shy("光标右移", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, 1) }), - d: shy("删除字符", function(can, target) { can.user.isWindows && can.onkeymap.deleteText(target, target.selectionStart, 1) }), - }, - insert: { - Escape: shy("退出编辑", function(can) { can.onkeymap._normal(can), can.ui.current._keylist = [] }), - ArrowUp: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }), - ArrowDown: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }), - Backspace: shy("删除字符", function(event, can, target) { if (target.selectionStart > 0 || !can.current.prev()) { return } can.onkeymap.prevent(event) - var rest = can.current.text(); can.onaction.selectLine(can, can.current.prev()), can.onaction.deleteLine(can, can.current.next()) - var text = can.current.text(); can.ui.current.value = text+rest, can.onkeymap.cursorMove(target, 0, text.length) - }), - Tab: shy("添加缩进", function(event, can) { can.onkeymap.insertText(can.ui.current, lex.TB), can.onkeymap.prevent(event) }), - Enter: shy("插入换行", function(can, target) { - var rest = can.onkeymap.deleteText(target, target.selectionEnd).trimLeft(), text = can.ui.current.value - var left = text.substr(0, text.indexOf(text.trimLeft()))||(text.trimRight() == ""? text: "") - var line = can.onaction.selectLine(can), next = rest; for (var i = line; i < can.db.max; i++) { next += can.onexport.text(can, can.onaction._getLine(can, i)).trimLeft(); if (next != "") { break } } - function deep(text) { var deep = 0; for (var i = 0; i < text.length; i++) { if (text[i] == lex.TB) { deep += 4 } else if (text[i] == lex.SP) { deep++ } else { break } } return deep } - text.trim() && can.core.List(["{}", "[]", "()", "``"], function(item) { if (can.base.endWith(text, item[0])) { - if (can.base.beginWith(next, item[1])) { - can.onaction.insertLine(can, left+rest, can.current.next()), rest = "" - } else if (deep(text) >= deep(can.onexport.text(can, can.onaction._getLine(can, line+1))) && rest == "") { - can.onaction.insertLine(can, left+item[1], can.current.next()) - } left += lex.TB - } else if (can.base.beginWith(rest, item[1])) { left = left.slice(0, -1) }}) - var line = can.onaction.insertLine(can, left+rest, can.current.next()) - can.current.text(text.trimRight()||text), can.onaction.selectLine(can, line), can.onkeymap._insert(event, can, 0, left.length) - }), - }, - }, _engine: {}, - }) - \ No newline at end of file + case "[": // ] + case "(": // ) + case "{": update(); break // } + case "": + default: filter() + } + }, + _mode: { + plugin: { + Escape: shy("清除浮窗", function(event, can) { can.onaction.clear(event, can) }), + f: shy("打开文件", function(event, can) { can.onaction.open(event, can) }), + g: shy("查找搜索", function(event, can) { can.onaction.find(event, can) }), + d: shy("查找函数", function(event, can) { can.page.Select(can, can.ui.path, "span.func", function(target) { target.click() }) }), + n: shy("命令模式", function(event, can) { can.onaction.selectLine(can, can.onaction.selectLine(can)), can.onkeymap._normal(can) }), + i: shy("插入模式", function(event, can) { can.onaction.selectLine(can, can.onaction.selectLine(can)), can.onkeymap._insert(event, can) }), + s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }), + c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }), + v: shy("渲染界面", function(event, can) { can.onaction.show(event, can) }), + r: shy("执行命令", function(event, can) { can.onaction.exec(event, can) }), + t: shy("添加命令", function(event, can) { can.onaction["命令"](event, can) }), + p: shy("添加插件", function(event, can) { can.onaction["插件"](event, can) }), + l: shy("打开右边标签", function(can) { var next = can._tab.nextSibling; next && next.click() }), + h: shy("打开左边标签", function(can) { var prev = can._tab.previousSibling; prev && prev.click() }), + x: shy("关闭标签", function(can) { can._tab._close() }), + }, + normal: { + s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }), + c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }), + v: shy("渲染界面", function(event, can) { can.onaction.show(event, can) }), + r: shy("执行命令", function(event, can) { can.onaction.exec(event, can) }), + + Escape: shy("切换模式", function(can) { can.onkeymap._plugin(can) }), + ArrowLeft: shy("光标左移", function(can, target) { can.onkeymap.cursorMove(target, -1) }), + ArrowRight: shy("光标右移", function(can, target) { can.onkeymap.cursorMove(target, 1) }), + ArrowDown: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }), + ArrowUp: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }), + H: shy("跳到行首", function(can, target) { can.onkeymap.cursorMove(target, 0, 0) }), + L: shy("跳到行尾", function(can, target) { can.onkeymap.cursorMove(target, 0, -1) }), + h: shy("光标左移", function(can, target) { can.onkeymap.cursorMove(target, -1) }), + l: shy("光标右移", function(can, target) { can.onkeymap.cursorMove(target, 1) }), + j: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }), + k: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }), + + I: shy("插入行首", function(event, can) { can.onkeymap._insert(event, can, 0, 0) }), + A: shy("插入行尾", function(event, can) { can.onkeymap._insert(event, can, 0, -1) }), + i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }), + a: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }), + o: shy("插入下一行", function(event, can) { var text = can.current.text() + text = text.substr(0, text.indexOf(text.trimLeft()))+(can.base.endWith(text, "{")? lex.TB: "") + can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.next())) + can.onkeymap._insert(event, can, 0, -1) + }), + O: shy("插入上一行", function(event, can) { var text = can.current.text() + text = text.substr(0, text.indexOf(text.trimLeft()))+(can.base.beginWith(text, "}")? lex.TB: "") + can.onaction.selectLine(can, can.onaction.insertLine(can, text, can.current.line)) + can.onkeymap._insert(event, can, 0, -1) + }), + + yy: shy("复制当前行", function(event, can, target, count) { var list = [], line = can.current.line + for (var i = 0; i < count; i++) { list.push(can.onexport.text(can, line)), line = line.nextSibling } can.db._last_text = list; return true + }), + dd: shy("剪切当前行", function(event, can, target, count) { var line = can.onaction.selectLine(can), callee = arguments.callee + var list = []; for (var i = 0; i < count; i++) { (function() { var line = can.onaction.selectLine(can), text = can.current.text(); list.push(text) + can.onaction.selectLine(can, can.onaction.deleteLine(can, line)), can.db.undo.push(function() { can.onaction.insertLine(can, text, line), can.onaction.selectLine(can, line) }) + })() } can.db._last_text = list, can.db.redo.push(function() { callee(event, can, target, count) }) + return true + }), + p: shy("向后粘贴", function(can) { if (!can.db._last_text) { return } var line = can.onaction.selectLine(can), callee = arguments.callee + for (var i = can.db._last_text.length-1; i >= 0; i--) { (function() { var line = can.onaction.insertLine(can, can.db._last_text[i], can.current.next()) + can.db.undo.push(function() { can.onaction.deleteLine(can, line), can.onaction.selectLine(can, line-1) }) + })() } can.db.redo.push(function() { callee(event, can, target, count) }) + }), + P: shy("向前粘贴", function(can) { if (!can.db._last_text) { return } var line = can.onaction.selectLine(can), callee = arguments.callee + for (var i = 0; i < can.db._last_text.length; i++) { (function() { var line = can.onaction.insertLine(can, can.db._last_text[i], can.current.line) + can.db.undo.push(function() { can.onaction.deleteLine(can, line), can.onaction.selectLine(can, line+1) }) + })() } can.db.redo.push(function() { callee(event, can, target, count) }) + }), + J: shy("合并两行", function(can) { var next = can.current.next(); if (!next) { return } + var line = can.onaction.selectLine(can), text = can.current.text(), rest = can.onexport.text(can, next) + can.ui.current.value = can.current.text(text.trimRight()+(can.base.endWith(text.trim(), "(", "[")||can.base.beginWith(rest.trim(), ",", "]", ")")? "": lex.SP)+rest.trimLeft()) + can.onkeymap.cursorMove(can.ui.current, text.length, 0), can.onaction.deleteLine(can, next) + can.db.undo.push(function() { can.onaction.modifyLine(can, line, text), can.onaction.insertLine(can, rest, line+1) }) + }), + ".": shy("重复操作", function(can) { var cb = can.db.redo.pop(); cb && cb() }), + u: shy("撤销操作", function(can) { var cb = can.db.undo.pop(); cb && cb() }), + + gg: shy("跳到某行", function(can, count) { return can.onaction.selectLine(can, count), true }), + G: shy("跳到某行", function(can, count) { return can.onaction.selectLine(can, count = count>1? count: can.db.max), true }), + zt: shy("屏幕最上", function(can, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true }), + zz: shy("屏幕中间", function(can, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true }), + zb: shy("屏幕最下", function(can, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true }), + F5: shy("刷新网页", function(can, target) { can.user.reload(true) }), + }, + normal_ctrl: { + e: shy("向上滚屏", function(can) { can.current.scroll(1); if (can.current.scroll()<2) { can.onaction.selectLine(can, can.current.next()) } }), + y: shy("向下滚屏", function(can) { can.current.scroll(-1); if (can.current.scroll()>can.current.window()-3) { can.onaction.selectLine(can, can.current.prev()) } }), + f: shy("向下翻页", function(can, count) { can.current.scroll(can.current.window()) }), + b: shy("向上翻页", function(can, count) { can.current.scroll(-can.current.window()) }), + r: shy("刷新页面", function(can) { can.user.reload(true) }), + }, + insert_ctrl: { + a: shy("光标行首", function(can, target) { for (var i = 0; i < target.value.length; i++) { if (target.value[i] != lex.TB) { break } } can.onkeymap.cursorMove(target, i, 0), can.onkeymap.prevent(event) }), + e: shy("光标行尾", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, 0, -1) }), + b: shy("光标左移", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, -1) }), + f: shy("光标右移", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, 1) }), + d: shy("删除字符", function(can, target) { can.user.isWindows && can.onkeymap.deleteText(target, target.selectionStart, 1) }), + }, + insert: { + Escape: shy("退出编辑", function(can) { can.onkeymap._normal(can), can.ui.current._keylist = [] }), + ArrowUp: shy("光标上移", function(can, target) { can.onkeymap.cursorUp(can, target) }), + ArrowDown: shy("光标下移", function(can, target) { can.onkeymap.cursorDown(can, target) }), + Backspace: shy("删除字符", function(event, can, target) { if (target.selectionStart > 0 || !can.current.prev()) { return } can.onkeymap.prevent(event) + var rest = can.current.text(); can.onaction.selectLine(can, can.current.prev()), can.onaction.deleteLine(can, can.current.next()) + var text = can.current.text(); can.ui.current.value = text+rest, can.onkeymap.cursorMove(target, 0, text.length) + }), + Tab: shy("添加缩进", function(event, can) { can.onkeymap.insertText(can.ui.current, lex.TB), can.onkeymap.prevent(event) }), + Enter: shy("插入换行", function(can, target) { + var rest = can.onkeymap.deleteText(target, target.selectionEnd).trimLeft(), text = can.ui.current.value + var left = text.substr(0, text.indexOf(text.trimLeft()))||(text.trimRight() == ""? text: "") + var line = can.onaction.selectLine(can), next = rest; for (var i = line; i < can.db.max; i++) { next += can.onexport.text(can, can.onaction._getLine(can, i)).trimLeft(); if (next != "") { break } } + function deep(text) { var deep = 0; for (var i = 0; i < text.length; i++) { if (text[i] == lex.TB) { deep += 4 } else if (text[i] == lex.SP) { deep++ } else { break } } return deep } + text.trim() && can.core.List(["{}", "[]", "()", "``"], function(item) { if (can.base.endWith(text, item[0])) { + if (can.base.beginWith(next, item[1])) { + can.onaction.insertLine(can, left+rest, can.current.next()), rest = "" + } else if (deep(text) >= deep(can.onexport.text(can, can.onaction._getLine(can, line+1))) && rest == "") { + can.onaction.insertLine(can, left+item[1], can.current.next()) + } left += lex.TB + } else if (can.base.beginWith(rest, item[1])) { left = left.slice(0, -1) }}) + var line = can.onaction.insertLine(can, left+rest, can.current.next()) + can.current.text(text.trimRight()||text), can.onaction.selectLine(can, line), can.onkeymap._insert(event, can, 0, left.length) + }), + }, + }, _engine: {}, +}) diff --git a/plugin/table.js b/plugin/table.js index 8345d482..25370d33 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,67 +1,15 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg, target, cb) { - if (msg.index && msg.meta && msg.list) { return cb && cb(msg), can.sup.onimport._field(can.sup, msg) } - can.page.ClassList.del(can, can._fields, html.FORM) - can.page.ClassList.del(can, can._fields, html.OUTPUT) - if (can.isCmdMode() && can.Conf(ctx.STYLE) == html.FORM) { - can.page.ClassList.add(can, can._fields, html.FORM) - can.onappend.style(can, html.OUTPUT) - } if (can.Mode() == html.ZONE) { return can.onimport._vimer_zone(can, msg, target), cb && cb(msg) } + if (msg.index && msg.meta && msg.list) { return cb && cb(msg), can.sup.onimport._field(can.sup, msg) } + can.page.ClassList.del(can, can._fields, html.FORM), can.page.ClassList.del(can, can._fields, html.OUTPUT) + if (can.isCmdMode() && can.Conf(ctx.STYLE) == html.FORM) { can.page.ClassList.add(can, can._fields, html.FORM), can.onappend.style(can, html.OUTPUT) } var cbs = can.onimport[can.Conf(ctx.STYLE)||msg.Option(ctx.STYLE)]; if (can.base.isFunc(cbs)) { can.onappend.style(can, can._args[ctx.STYLE], target), can.core.CallFunc(cbs, {can: can, msg: msg, target: target}) } else { can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target), can.onmotion.story.auto(can, target) } cb && cb(msg) }, - textView: function(can, value, key, type) { if (!type) { type = key.split("_").pop() } - return value[key] && {text: [can.user.transValue(can, value, key), "", [type, value[key], can.Conf("_trans.value."+key+".style."+value[key])||""]]} - }, - shareTitle: function(can, msg, title, content) { if (msg.IsDetail()) { var value = msg.TableDetail() - msg.Option("_share_title", (value[title]||value.name||value.uid).slice(0, 6)), msg.Option("_share_content", value[content]||value.info) - } }, - itemcards: function(can, msg, cb, cbs, target) { target = target||can._output - can.onimport.shareTitle && can.onimport.shareTitle(can, msg) - if (msg.IsDetail()) { var value = msg.TableDetail(); msg.Show(can) - can.page.Select(can, target, html.TR, function(target) { - target.className.indexOf("_uid") > -1 && can.page.ClassList.add(can, target, "hide") - }) - } else { - can.page.Append(can, target, msg.Table(function(value) { - return can.onimport.itemcard(can, value, cb(value), cbs) - })), msg.Result() && can.onappend.board(can, msg) - } - can.page.Select(can, target, html.INPUT_BUTTON, function(target) { - var style = can.Conf("_style."+target.name); style && can.page.ClassList.add(can, target, style) - }) - }, - itemcard: function(can, value, list, cb) { - can.core.List(list, function(item) { if (!item || !item.list) { return } - for (var i = 0; i < item.list.length; i++) { if (item.list[i] && typeof item.list[i] == code.STRING) { item.list[i] = {text: item.list[i]} } } - }) - cb = cb|| function(event) { can.Option(UID, value.uid), can.Update() } - return {view: [[html.ITEM_CARD, value._uid? "uid-"+value._uid: ""].concat(value._style||[])], list: [ - {view: html.ACTION, _init: function(target) { if (!value.action) { return } target.innerHTML = value.action - can.page.Select(can, target, html.INPUT_BUTTON, function(target) { - var style = can.Conf("_style."+target.name)||can.page.buttonStyle(can, target.name); style && can.onappend.style(can, style, target) - target.onclick = function(event) { can.onkeymap.prevent(event), can.Update(can.request(event, value), [ctx.ACTION, target.name]) } - }) - }}, - {view: html.OUTPUT, list: [ - {img: can.misc.ResourceIcons(can, - value.icons||value.icon||value.command_icon||value.service_icon|| - value.avatar||value.user_avatar||can.Conf(mdb.ICONS), value.nodename, - ), onclick: function(event) { can.onkeymap.prevent(event) - value.user_uid && can.onappend.plugin(can, {index: "web.team.gonganxitong.profile", args: [value.user_uid]}) - }}, - {view: html.INFO, list: list}, - ], _init: function(target) { - value.action && can.onmotion.slideAction(can, target) - }}, - ], onclick: function(event) { cb && cb(event, value) - can.onmotion.select(can, event.currentTarget.parentNode, html.DIV_ITEM, event.currentTarget) - }} - }, card: function(can, msg, target, filter) { target = target||can.ui.content||can._output can.page.Append(can, target, msg.Table(function(value) { if (filter && filter(value)) { return } var img = can.misc.Resource(can, value.icon = value.icons||value.icon||value.image) @@ -323,27 +271,19 @@ Volcanos(chat.ONIMPORT, { _float: function(can, index, args) { args = args||[] can.user.isMobile? can.user.jumps(can.misc.MergePodCmd(can, {cmd: index+"/"+args.join("/")})): can.onappend._float(can, index, args) }, - myOption: function(can) { - var sub = can.sub; if (!sub) { return } - var plugin = sub._stacks_current[0] - - var PLACE_UID = can.core.Item(can.Option())[0], UID = can.core.Item(can.Option())[2]||"uid" - if (can == plugin) { - plugin.Option(ctx.INDEX, ""), plugin.Option(UID, "") - } else { - plugin.Option(PLACE_UID, can.Option(PLACE_UID)), plugin.Option(ctx.INDEX, can.ConfIndex()), plugin.Option(UID, can.Option(UID)) - } - - if (plugin == sub._stacks_root) { + myOption: function(can) { var sub = can.sub; if (!sub) { return } var plugin = sub._stacks_current[0] + current = plugin.current||{} + if (plugin == sub._stacks_root) { var PLACE_UID = can.core.Item(can.Option())[0] if (sub._stacks_current.length == 1) { plugin.sub.onexport.hash(plugin.sub, can.Option(PLACE_UID)) } else { plugin.sub.onexport.hash(plugin.sub, can.Option(PLACE_UID), can.ConfIndex(), can.Option(UID)) } } - - sub._stacks_root.onexport.title(sub._stacks_root, can.Conf("place_name"), can.ConfHelp()) + sub._stacks_root.onexport.title(sub._stacks_root, current._name, can.ConfHelp(), + can._msg && can._msg.IsDetail()? can._msg.Append(html.TITLE)||can._msg.Append(mdb.NAME)||(can._msg.Append(UID)||"").slice(0, 6): "" + ) }, myPlugin: function(can, value, cb) { var key = [value.space||can.ConfSpace(), value.index||can.ConfIndex()].concat(value.args||"").join(",") @@ -353,61 +293,129 @@ Volcanos(chat.ONIMPORT, { sub.onexport.output = function(_sub, msg) { _sub._stacks_current = sup._stacks[key] = [sub], _sub._stacks_root = sup, sub._select() } sub._select = function() { can.onimport.myOption(sub) can.page.SelectChild(can, _output, html.FIELDSET, function(target) { can.onmotion.toggle(can, target, target == sub._target) }) + can.page.SelectChild(can, sub._output, "*", function(target) { can.onmotion.toggle(can, target, true) }) + can.page.style(can, sub._action, html.DISPLAY, html.NONE), sub._output.innerHTML == "" && sub.Update() }, sub._select(), cb && cb(sub) }, _output) }, - myStory: function(can, msg, value, PLACE_UID, PLACE_NAME, STREET_NAME) { + myStory: function(can, value) { if (!can._stacks_current) { var sup = can.sup; can._stacks_root = sup, sup._stacks = {} var key = [can.ConfSpace(), can.ConfIndex()].concat(can.base.trim(can.core.Item(can.Option(), function(key, value) { return value }))).join(",") can._stacks_current = sup._stacks[key] = [can.sup] - } var _action = can._stacks_current[0]._action, _output = can._stacks_current[0]._output + sup._select = function() { var target = sup._target.parentNode; can.onimport.myOption(sup) + can.page.SelectChild(can, target, html.FIELDSET, function(target) { can.onmotion.toggle(can, target, target == sup._target) }) + can.page.SelectChild(can, _output, "*", function(target) { can.onmotion.toggle(can, target, true) }) + can.page.style(can, _action, html.DISPLAY, html.NONE), sup._output.innerHTML == "" && sup.Update() + } + } var plugin = can._stacks_current[0], _action = plugin._action, _output = plugin._output; current = plugin.current||{} value.type = html.STORY, value.style = html.OUTPUT, value.height = can.ConfHeight()-html.ACTION_HEIGHT can.onappend.plugin(can, value, function(sub) { can._stacks_current.push(sub) - sub.Conf("place_name", msg.Option(PLACE_NAME)) - can.core.List(["_trans", "_icons", "_style", "_trans.input", "_trans.value"], function(key) { + can.core.List(["_trans", "_style", "_icons", "_trans.input", "_trans.value"], function(key) { var value = sub.Conf(key); value && can.core.Item(can.Conf(key), function(k, v) { value[k] = value[k]||v }) }) + var STREET_NAME = plugin.sub.Conf("_street_name"), PLACE_NAME = plugin.sub.Conf("_place_name") var run = sub.run; sub.run = function(event, cmds, cb) { run(can.request(event, { - city_name: msg.Option(CITY_NAME), street_name: msg.Option(STREET_NAME), place_name: msg.Option(PLACE_NAME), - portal_name: can.ConfHelp(), command_uid: msg.Option("command_uid"), dashboard_uid: msg.Option("dashboard_uid"), - }), cmds, cb) + city_name: current[CITY_NAME], street_name: current[STREET_NAME], place_name: current[PLACE_NAME], + dashboard_uid: current["dashboard_uid"], command_uid: sub.Conf("command_uid"), portal_name: can.ConfHelp(), + }, can.base.Obj(sub.Conf("field.option"))), cmds, cb) } - var _sub = sub sub.onimport._field = function(sub, msg, cb) { - msg.Table(function(value) { value._goback = function() { goback(true) } - can.onimport.myStory(can, msg, value, PLACE_UID, PLACE_NAME, STREET_NAME) - }) + msg.Table(function(value) { value._goback = function() { goback(true) }, can.onimport.myStory(can, value) }) } - sub.onexport._output = function(_sub, msg) { + sub.onexport._output = function(_sub) { can.core.Item(can.onimport, function(key, value) { _sub.onimport[key] = _sub.onimport[key]||value }) can.core.Item(can.onexport, function(key, value) { _sub.onexport[key] = _sub.onexport[key]||value }) } - sub.onexport.output = function(_sub, msg) { - _sub._stacks_current = can._stacks_current, _sub._stacks_root = can._stacks_root + sub.onexport.output = function(_sub, msg) { _sub._stacks_current = can._stacks_current, _sub._stacks_root = can._stacks_root sub._select(), msg.Option(ice.MSG_ACTION) && can.onappend._action(sub, msg.Option(ice.MSG_ACTION), _action, null, true) sub.sub.onaction._goback = goback } - function goback(clear) { - if (clear) { if (_sub.Option(UID)) { _sub.Option(UID, "") } } - if (value._goback) { return value._goback() } - if (_sub.Option(UID)) { return _sub.Option(UID, ""), _sub.Update() } - can._stacks_current.pop(); var sub = can._stacks_current[can._stacks_current.length-1]; can.onimport.myOption(sub) - can._stacks_current.length == 1 && can.page.SelectChild(can, _output, "*", function(target) { can.onmotion.toggle(can, target, !can.page.tagis(target, "fieldset")) }) - can._stacks_current.length == 1 && can.onmotion.delay(can, function() { can.page.style(can, _action, "display", "none") }, 0) - if (sub._select) { return sub._select() } var target = can._stacks_root._target.parentNode - can.page.SelectChild(can, target, html.FIELDSET, function(target) { can.onmotion.toggle(can, target, target == sub._target) }) - } function reload() { sub.Update() } + function goback(clear) { if (value._goback) { return value._goback() } + if (clear) { if (sub.Option(UID)) { sub.Option(UID, "") } } + if (sub.Option(UID)) { return sub.Option(UID, ""), sub.Update() } + var last = can._stacks_current.pop(); can.page.Remove(can, last._target) + var last = can._stacks_current[can._stacks_current.length-1]; if (last._select) { + if (last.ConfIndex().split(".").pop() == "message") { last.Update() } + return last._select() + } + } + function reload() { sub.Update() } sub._select = function() { can.onimport.myOption(sub) can.page.SelectChild(can, _output, "*", function(target) { can.onmotion.toggle(can, target, target == sub._target) }) var list = [can.page.button(can, can.user.trans(can, "goback", "返回"), function(event) { goback() }), can.page.button(can, can.user.trans(can, "reload", "刷新"), function(event) { reload() })] - can.page.Appends(can, _action, list), can.page.style(can, _action, "display", "block") + can.page.Appends(can, _action, list), can.page.style(can, _action, html.DISPLAY, html.BLOCK) }, sub._select() }, _output) }, myFloat: function(can, value) { }, + myTabs: function(can, key, list, target) { var last = can.misc.Cookie(can, key) + can.page.Append(can, can.ui.tabs, can.core.List(list, function(value) { + return {text: [can.user.trans(can, value, "", "value."+key), "", [value, value == "all" && last == "" || value == last? html.SELECT: ""]], onclick: function(event) { + can.onmotion.select(can, can.ui.tabs, "*", event.target), can.misc.Cookie(can, key, value == "all"? "": value), can.Update() + }} + })) + }, + myView: function(can, msg, cb, cbs, target) { + can.onimport.itemcards(can, msg, cb, cbs, target) + }, + itemcards: function(can, msg, cb, cbs, target) { target = target||can._output + can.onimport.shareTitle(can, msg) + if (msg.IsDetail()) { var value = msg.TableDetail(); msg.Show(can) + can.page.Select(can, target, html.TR, function(target) { + target.className.indexOf("_uid") > -1 && can.page.ClassList.add(can, target, "hide") + }) + } else { + can.page.Append(can, target, msg.Table(function(value) { + return can.onimport.itemcard(can, value, cb(value), cbs) + })), msg.Result() && can.onappend.board(can, msg) + if (msg.Option(ctx.STYLE)) { + can.onappend.style(can, msg.Option(ctx.STYLE)) + } + } + can.page.Select(can, target, html.INPUT_BUTTON, function(target) { + var style = can.Conf("_style."+target.name); style && can.page.ClassList.add(can, target, style) + }) + }, + itemcard: function(can, value, list, cb) { + can.core.List(list, function(item) { if (!item || !item.list) { return } + for (var i = 0; i < item.list.length; i++) { if (item.list[i] && typeof item.list[i] == code.STRING) { item.list[i] = {text: item.list[i]} } } + }) + cb = cb|| function(event) { can.Option(UID, value.uid), can.Update() } + return {view: [[html.ITEM_CARD, value._uid? "uid-"+value._uid: ""].concat(value._style||[])], list: [ + {view: html.ACTION, _init: function(target) { if (!value.action) { return } target.innerHTML = value.action + can.page.Select(can, target, html.INPUT_BUTTON, function(target) { + var style = can.Conf("_style."+target.name)||can.page.buttonStyle(can, target.name); style && can.onappend.style(can, style, target) + target.onclick = function(event) { can.onkeymap.prevent(event), can.Update(can.request(event, value), [ctx.ACTION, target.name]) } + }) + }}, + {view: html.OUTPUT, list: [ + {img: can.misc.ResourceIcons(can, + value.icons||value.icon||value.command_icon||value.service_icon|| + value.avatar||value.user_avatar||can.Conf(mdb.ICONS), value.nodename, + ), onclick: function(event) { can.onkeymap.prevent(event) + value.user_uid && can.onappend.plugin(can, {index: "web.team.gonganxitong.profile", args: [value.user_uid]}) + }}, + {view: html.INFO, list: list}, + ], _init: function(target) { + value.action && can.onmotion.slideAction(can, target) + }}, + ], onclick: function(event) { cb && cb(event, value) + can.onmotion.select(can, event.currentTarget.parentNode, html.DIV_ITEM, event.currentTarget) + }} + }, + textView: function(can, value, key, type) { if (!type) { type = key.split("_").pop() } + return value[key] && {text: [can.user.transValue(can, value, key), "", [type, value[key], can.Conf("_trans.value."+key+".style."+value[key])||""]]} + }, + authView: function(can, value) { return can.base.isIn(value.auth_status, "issued", "2") && {view: [aaa.AUTH, html.SPAN], list: [{icon: "bi bi-patch-check-fill", style: {color: "var(--notice-bg-color)"}}]} }, + timeView: function(can, value) { return {text: [can.base.TimeTrim(value.updated_at||value.created_at), "", mdb.TIME]} }, + typeStyle: function(can, value, key) { return can.Conf("_trans.value."+key+".style."+value[key])||"" }, + roleStyle: function(can, value, key) { return can.Conf("_trans.value."+key+".style."+value[key])||"" }, + shareTitle: function(can, msg, title, content) { if (msg.IsDetail()) { var value = msg.TableDetail() + msg.Option("_share_title", (value[title]||value.name||value.uid).slice(0, 6)), msg.Option("_share_content", value[content]||value.info) + } }, }) Volcanos(chat.ONLAYOUT, { _init: function(can, height, width) { can.core.CallFunc([can.onimport, html.LAYOUT], {can: can, height: height, width: width}) },