From a0d8bc87645f190afb93c3849b0a6cb88679331a Mon Sep 17 00:00:00 2001 From: shylinux Date: Wed, 15 Mar 2023 20:37:20 +0800 Subject: [PATCH] opt vimer.js --- frame.js | 12 +- lib/user.js | 9 +- plugin/local/code/inner.css | 26 +- plugin/local/code/inner.js | 433 ++++++++++-------------------- plugin/local/code/inner/syntax.js | 40 +++ plugin/local/code/vimer.js | 176 +++++------- plugin/table.js | 21 +- proto.js | 6 +- 8 files changed, 285 insertions(+), 438 deletions(-) diff --git a/frame.js b/frame.js index 82549f37..5dc04246 100644 --- a/frame.js +++ b/frame.js @@ -146,7 +146,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { msg.RunAction(event, can.core.Value(sub, chat._OUTPUTS_CURRENT), [ctx.ACTION, button]) || msg.RunAction(event, sub, [ctx.ACTION, button]) || sub.runAction(event, button) }) }) }), can.base.isFunc(cb) && cb(sub) - sub.isCmdMode() && meta.index != web.CODE_VIMER && can.page.insertBefore(can, can.user.header(can), sub._output, sub._fields) + sub.isCmdMode() && !can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER) && can.page.insertBefore(can, can.user.header(can), sub._output, sub._fields) }); return sub }, _option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {}) @@ -658,14 +658,12 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||document.body can.onkeymap._build(can), target.onkeydown = function(event) { can.misc.Event(event, can, function(msg) { if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) } - if (can.page.tagis(event.target, html.SELECT, html.INPUT)) { return } - // if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } - can.onengine.signal(can, chat.ONKEYDOWN, can.request(event, {"model": can.user.isWebview && event.metaKey? "webview": "normal"})) + if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } + can.onengine.signal(can, chat.ONKEYDOWN, can.request(event, {"model": can.user.isWebview && event.metaKey? "webview": mdb.NORMAL})) }) }, target.onkeyup = function(event) { can.misc.Event(event, can, function(msg) { if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) } - if (can.page.tagis(event.target, html.SELECT, html.INPUT)) { return } - // if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } - can.onengine.signal(can, chat.ONKEYUP, can.request(event, {"model": "normal"})) + if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } + can.onengine.signal(can, chat.ONKEYUP, can.request(event, {"model": mdb.NORMAL})) }) } }, _build: function(can) { can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {list: {}} diff --git a/lib/user.js b/lib/user.js index 8fcf6794..496e1a33 100644 --- a/lib/user.js +++ b/lib/user.js @@ -108,16 +108,15 @@ Volcanos("user", { return can.user.toastSuccess(can, text, "copy success"), can.misc.Log(nfs.COPY, text), text }, carte: function(event, can, meta, list, cb, parent, trans) { parent || can.onmotion.clearCarte(can) - var msg = can.request(event) - trans = trans||meta._trans + var msg = can.request(event); trans = trans||meta._trans meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta)); if (!list || list.length == 0) { return } function click(event, button) { can.misc.Event(event, can, function() { can.onkeymap.prevent(event) meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): can.base.isFunc(cb)? cb(event, button, meta, carte): can.onaction && can.onaction[button] && can.core.CallFunc([can.onaction, button], [event, can, button]) - can.onmotion.clearCarte(can) + meta._style == nfs.PATH || can.onmotion.clearCarte(can) }) } function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) } var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, meta._style||"", chat.FLOAT]], list: can.core.List(list, function(item, index) { - if (item == "filter") { + if (item == web.FILTER) { return {input: [html.FILTER, function(event) { if (event.key == lang.ESCAPE) { return carte.close() } can.onkeymap.selectItems(event, can, carte._target) }], _init: function(target) { can.onmotion.delay(can, function() { target.placeholder = "search in "+(can.core.List(list, function(item) { if (item) { return item } }).length-1)+" items", target.focus() }) } } @@ -125,7 +124,7 @@ Volcanos("user", { function subs(event) { var sub = can.user.carte(event, can, meta, item.slice(1), cb||function(event, button) { can.onimport && can.onimport[item[0]] && can.onimport[item[0]](can, button) }, carte, trans); can.onlayout.figure(event, can, sub._target, true), remove_sub(carte), carte._sub = sub } - return item === ""? /* 0.space */ {type: html.HR}: can.base.isString(item)||can.base.isNumber(item)? /* 1.string */ {view: [html.ITEM, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) { click(event, item) }, onmouseenter: function(event) { remove_sub(carte) } }: + return item === ""? /* 0.space */ {type: html.HR}: can.base.isString(item)||can.base.isNumber(item)? /* 1.string */ {view: [html.ITEM, html.DIV, meta._style == ice.CMD? item: can.user.trans(can, item, trans)], onclick: function(event) { click(event, item) }, onmouseenter: function(event) { remove_sub(carte) } }: can.base.isArray(item)? /* 2.array */ {view: html.ITEM, list: [{text: can.user.trans(can, item[0], trans)}, {text: [ice.SP+can.page.unicode.next, "", [html.ICON, "next"]]}], onmouseenter: subs, onclick: subs}: /* 3.object */ item })}]); can.onkeymap.prevent(event), can.page.Select(can, ui._target, html.IMG, function(target) { target.onload = function() { can.onlayout.figure(event, can, ui._target) } }) var carte = {_target: ui._target, _parent: parent, layout: can.onlayout.figure(event, can, ui._target, false, 0.8), close: function() { can.page.Remove(can, ui._target) }}; return carte diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 08cf187c..6e83d4fa 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -9,9 +9,6 @@ fieldset.inner>div.output div.content td.text span.function { color:lightgreen; fieldset.inner>div.output div.content td.text span.constant { color:magenta; } fieldset.inner>div.output div.content td.text span.string { color:magenta; } fieldset.inner>div.output div.content td.text span.object { color:cyan; } -fieldset.inner>div.output>div.layout>div.layout>div.content * { font-family:monospace; font-size:14px; outline:none; } -fieldset.inner>div.output>div.layout>div.tabs { font-family:monospace; font-size:14px; } -fieldset.inner>div.output>div.layout>div.path { font-family:monospace; font-size:14px; } fieldset.inner>div.output>div.project { width:230px; } fieldset.inner>div.output>div.project * { font-family:monospace; font-size:14px; outline:none; } fieldset.inner>div.output>div.project div.action { width:100%; } @@ -24,26 +21,25 @@ fieldset.inner>div.output>div.project>div.zone div.action>div.item { padding-rig fieldset.inner>div.output>div.project>div.zone div.action>div.item>span.delete { top:3px; right:5px; } fieldset.inner>div.output>div.project>div.zone div.action>div.item>input { width:100%; } fieldset.inner>div.output>div.project>div.zone fieldset.plug { position:static; } +fieldset.inner>div.output>div.layout.flow>div.layout>div.content * { font-family:monospace; font-size:14px; outline:none; } +fieldset.inner>div.output>div.layout.flow>div.tabs { font-family:monospace; font-size:14px; display:none; } +fieldset.inner>div.output>div.layout.flow>div.path { font-family:monospace; font-size:14px; display:none; } fieldset.inner>div.output>div.layout.flow { position:relative; } -fieldset.inner>div.output>div.layout.flow>div.tabs { display:none; } -fieldset.inner>div.output>div.layout.flow>div.path { display:none; } fieldset.inner.cmd>div.output>div.project { border-right:dimgray solid 1px; } fieldset.inner.cmd>div.output div.profile { border-left:dimgray solid 1px; } fieldset.inner.cmd>div.output div.display { border-top:dimgray solid 1px; } fieldset.inner.cmd>div.output>div.project>div.zone>div.item { font-style:italic; font-weight:bold; line-height:32px; } fieldset.inner.cmd>div.output>div.project>div.zone>div.item>span.icon { font-style:normal; font-weight:normal; line-height:32px; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs { height:38px; display:block; overflow:hidden; } -fieldset.inner.cmd>div.output>div.layout.flow>div.display>div.status { position:sticky; bottom:0; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs.hide { display:none; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div { padding:10px; height:38px; float:left; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div>span { font-style:italic; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div>span.icon { padding:0 5px; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.website.icon { font-size:18px; line-height:32px; padding:2px 5px; position:sticky; top:0; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.usernick { float:right; position:sticky; top:0; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.avatar { padding:0; height:38px; float:right; position:sticky; top:0; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.avatar>img { height:38px; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.time { float:right; position:sticky; top:0; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div.icon { position:sticky; top:0; } +fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div.icon { font-size:18px; line-height:32px; padding:2px 5px; position:sticky; top:0; } +fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div.tabs>span { font-style:italic; } +fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div.tabs>span.icon { padding:0 5px; } +fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div.usernick { float:right; position:sticky; top:0; } +fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div.avatar { padding:0; height:38px; float:right; position:sticky; top:0; } +fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div.avatar>img { height:38px; } +fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div.time { float:right; position:sticky; top:0; } fieldset.inner.cmd>div.output>div.layout.flow>div.path { font-style:italic; padding:5px; display:block; } fieldset.inner.cmd>div.output>div.layout.flow>div.path.hide { display:none; } fieldset.inner.cmd>div.output>div.layout.flow>div.path span.func { padding:5px 10px; margin-left:20px; } @@ -53,6 +49,7 @@ fieldset.inner.cmd>div.output>div.layout.flow>div.path span.mode.insert { backgr fieldset.inner.cmd>div.output>div.layout.flow>div.path span.view { font-size:22px; line-height:12px; padding:0 4px; float:right; cursor:pointer; } fieldset.inner.cmd>div.output>div.layout.flow>div.plug { height:32px; clear:both; position:fixed; bottom:0; right:0; } fieldset.inner.cmd>div.output>div.layout.flow>div.plug>legend { font-size:1rem; padding:0 10px; float:right; } +fieldset.inner.cmd>div.output>div.layout.flow>div.display>div.status { position:sticky; bottom:0; } body.zh fieldset.inner>div.output>div.project>div.zone>div.item { letter-spacing:10px; } body.black fieldset.inner>div.output div.content td.text span.comment { background-color:blue; color:cyan; } @@ -94,6 +91,7 @@ div.carte.history.float * { tab-size:2; } div.vimer.open.float td:first-child { display:none; } div.path span.item { padding:5px; } div.carte.path.float { font-size:14px; border-radius:0; } div.carte.path.float div.item { padding:5px; } +div.carte.cmd.float { font-size:14px; border-radius:0; } div.cmd.path.float div.item { padding:5px; } tr.line>td.line { text-align:right; padding:0 10px; position:sticky; left:0; } tr.line>td.text { line-height:20px; white-space:pre; padding-left:10px; cursor:text; } body.white tr.line.select { background-color:dimgray; } body.white tr.line:hover { background-color:dimgray; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 19f4d7bc..b4ac705c 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,5 +1,5 @@ (function() { -const PROJECT_HIDE = "web.code.inner:project", TABFILE_HIDE = "web.code.inner:tabview" +const PROJECT_HIDE = "web.code.inner:project", TABVIEW_HIDE = "web.code.inner:tabview" const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "web.code.inner:selectLine" const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select" Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.clear(can), can.onappend.style(can, code.INNER) @@ -12,7 +12,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (can.base.endWith(p, "-story/", "-dict/")) { return } if (p && paths.indexOf(p) == -1 && p[0] != ice.PS) { paths.push(p) } }) - can.db = {paths: paths, tabview: {}, _history: [], history: [], profile_size: {}, display_size: {}, toolkit: {}}, can.onengine.plugin(can, can.onplugin) + can.db = {paths: paths, tabview: {}, history: [], _history: [], toolkit: {}}, can.onengine.plugin(can, can.onplugin), can.sup.onimport._process = function() {} can.ui = can.onappend.layout(can, can._output, "", [html.PROJECT, [html.TABS, nfs.PATH, [html.CONTENT, html.PROFILE], html.DISPLAY, html.PLUG]]) can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display, can.onmotion.hidden(can, can.ui.plug) switch (can.Mode()) { @@ -20,88 +20,63 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break case chat.CMD: can.onmotion.hidden(can, can._status), can.onkeymap._build(can) can.misc.sessionStorage(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project) - if (can.misc.sessionStorage(can, TABFILE_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) } - var plug = can.base.Obj(msg.Option(html.PLUG), []).concat(can.misc.Search(can, log.DEBUG) == ice.TRUE? ["can.debug", "log.debug"]: []) - // plug.length > 0 && can.run({}, [ctx.ACTION, ctx.COMMAND].concat(plug.reverse()), function(msg) { msg.Table(function(value) { can.onimport.toolkit(can, value) }) }) + if (can.misc.sessionStorage(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) } case chat.FULL: // no break default: can.onimport.project(can, paths), can.onimport._tabs(can) can.onmotion.delay(can, function() { can.core.Next(files.slice(1), function(file, next) { can.onimport._tabview(can, paths[0], file, "", next) }, function() { - can.core.List(can.base.Obj(msg.Option(html.TABS)), function(item) { can.onimport.tabview(can, paths[0], item, ctx.INDEX) }) if (can.user.isWebview) { var last = can.misc.localStorage(can, CURRENT_FILE); if (last) { var ls = can.core.Split(last, ice.DF); ls.length > 0 && can.onimport._tabview(can, ls[0], ls[1], ls[2]) } } }) }) } var args = can.misc.SearchHash(can); can.db.tabview[can.onexport.keys(can)] = msg can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (!can.user.isWebview && args.length > 0 && can.isCmdMode()) { - can.onimport._tabview(can, args[args.length-3]||can.Option(nfs.PATH), args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) + can.onimport._tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) } }), can.base.isFunc(cb) && cb(msg) }, - _keydown: function(can) { can.onkeymap._build(can) }, _tabs: function(can) { if (!can.isCmdMode()) { return can.ui.tabs = can._action } - can.user.isMobile || can.core.List([ - {name: can.page.unicode.menu, onclick: function() { - can.user.carte(event, can, can.onaction, can.onaction.list.concat(can.user.isWebview? ["全屏", "录屏", "编辑器", "浏览器"]: [])) - }}, - false && {name: can.page.unicode.back, style: {"font-size": "14px", "padding-top": "3px"}, onclick: function(event) { - var list = {}; can.user.carte(event, can, {_style: "history"}, can.core.List(can.db.history, function(item) { - var value = [item.path, item.file, item.line, ice.TB+(item.text&&item.text.length>30? item.text.slice(0, 30)+"...": item.text||"")].join(ice.DF); if (!list[value]) { list[value] = item; return value } - }).reverse(), function(event, button, meta, carte) { carte.close() - var ls = button.split(ice.DF); can.onimport.tabview(can, ls[0], ls[1], ls[2]) - }) - }}, - {name: can.page.unicode.refresh, style: {"font-size": "24px", "padding-top": "1px"}, onclick: function() { location.reload() }}, - false && {name: can.page.unicode.reback, style: {"font-size": "14px", "padding-top": "3px"}, onclick: function() { - var list = {}; can.user.carte(event, can, {_style: "tabview"}, can.core.Item(can.db.tabview), function(event, button, meta, carte) { carte.close() - var ls = button.split(ice.DF); can.onimport.tabview(can, ls[0], ls[1]) - }) - }}, - ], function(item) { can.page.Append(can, can.ui.tabs, [can.base.Copy(item, {view: [[html.ICON, web.WEBSITE], html.DIV, item.name]})]) }) - can.page.Append(can, can.ui.tabs, can.user.header(can)) + can.page.Append(can, can.ui.tabs, can.core.List([ + {name: can.page.unicode.menu, onclick: function() { can.user.carte(event, can, can.onaction, can.onaction.list.concat(can.user.isWebview? ["全屏", "录屏", "编辑器", "浏览器"]: [])) }}, + {name: can.page.unicode.refresh, style: {"font-size": "24px", "padding-top": 0}, onclick: function() { location.reload() }}, + ], function(item) { return can.base.Copy(item, {view: [[html.ITEM, html.ICON], "", item.name]}) })), can.page.Append(can, can.ui.tabs, can.user.header(can)) }, - __tabPath: function(can, skip) { can.onmotion.clear(can, can.ui.path) - can.onimport._tabPath(can, ice.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(ls) { - if (ls[0] == ice.USR && ls.length > 2) { - can.onimport.tabview(can, ls.slice(0, 2).join(ice.PS)+ice.PS, ls.slice(2).join(ice.PS)) - } else if (ls.length > 1) { - can.onimport.tabview(can, ls.slice(0, 1).join(ice.PS)+ice.PS, ls.slice(1).join(ice.PS)) - } else { - can.onimport.tabview(can, nfs.PWD, ls[0]) - } - }, can.ui.path), can.onimport._tabFunc(can, can.ui.path, skip), can.onimport._tabMode(can), can.onimport._tabIcon(can) + __tabPath: function(can, cache) { + can.onimport._tabPath(can, ice.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(p) { + var ls = can.onexport.split(can, p); can.onimport.tabview(can, ls[0], ls[1]) + }, can.ui.path), can.onimport._tabFunc(can, can.ui.path, cache), can.onimport._tabMode(can), can.onimport._tabIcon(can) + can.ui.path.ondblclick = function(event) { + var show = can.onmotion.toggle(can, can.ui.tabs); can.onmotion.toggle(can, can.ui.project, show), can.onimport.layout(can) + can.isCmdMode() && can.misc.sessionStorage(can, TABVIEW_HIDE, show? "": html.HIDE) + } }, - _tabPath: function(can, ps, key, value, cb, target) { can.core.List(can.core.Split(value, ps), function(value, index, array) { - can.page.Append(can, target, [{text: [value+(index 10? ["filter"]: []).concat(msg.Table(function(value) { + tabPath: function(event, can, ps, key, pre, cb, parent) { can.runAction(event, mdb.INPUTS, [key, pre, lex.SPLIT], function(msg) { var _trans = {} + var carte = can.user[parent? "carteRight": "carte"](event, can, {_style: key}, (msg.Length() > 10? [web.FILTER]: []).concat(msg.Table(function(value) { var p = can.core.Split(value[key], ps).pop()+(can.base.endWith(value[key], ps)? ps: ""); return _trans[p] = value[key], p })), function(event, button) { - can.base.endWith(button, ps)? can.onimport.tabPath(event, can, ps, key, pre+button, cb, carte): cb(can.core.Split(_trans[button], ps)) + can.base.endWith(button, ps)? can.onimport.tabPath(event, can, ps, key, pre+button, cb, carte): cb(_trans[button], pre) }, parent)._target, file = can.core.Split(event.target.innerHTML.trim(), ice.PT)[0] can.page.Select(can, carte, html.DIV_ITEM, function(target) { target.innerHTML.trim() != event.target.innerHTML.trim() && can.base.beginWith(target.innerHTML, file+ice.PT) && carte.insertBefore(target, carte.firstChild) }) function remove(p) { if (p && p._sub) { remove(p._sub), can.page.Remove(can, p._sub), delete(p._sub) } } if (parent) { remove(parent), parent._sub = carte } }) }, - _tabFunc: function(can, target, skip) { - can.ui.path.ondblclick = function(event) { - var show = can.onmotion.toggle(can, can.ui.tabs); can.onmotion.toggle(can, can.ui.project, show), can.onimport.layout(can) - can.isCmdMode() && can.misc.sessionStorage(can, TABFILE_HIDE, show? "": html.HIDE) - } - if (skip) { var func = can.db._func||{list: []} } else { var func = can.onexport.func(can); can.db._func = func } + _tabFunc: function(can, target, cache) { + if (cache) { var func = can.db._func||{list: []} } else { var func = can.onexport.func(can); can.db._func = func } if (func.list.length > 0) { can.db.tabFunc = can.db.tabFunc||{} var last = can.db.tabFunc[can.Option(nfs.PATH)+can.Option(nfs.FILE)]||{}; can.db.tabFunc[can.Option(nfs.PATH)+can.Option(nfs.FILE)] = last var carte, list = [web.FILTER]; can.core.Item(last, function(key) { list.push(key) }), list = list.concat(func.list) } - can.page.Append(can, target, [{view: [[html.ITEM, "func"], html.SPAN, (func.current||"func")+"/"+can.db.max+func.percent+ice.SP+can.base.Size(can._msg.result[0].length)], onclick: function(event) { + can.page.Append(can, target, [{view: [[html.ITEM, "func"], html.SPAN, (func.current||"func")+ice.PS+can.db.max+func.percent+ice.SP+can.base.Size(can._msg.result[0].length)], onclick: function(event) { carte = can.user.carte(event, can, {_style: nfs.PATH}, list, function(ev, button) { last[button] = true, carte.close() - can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.core.Split(button, ice.DF)[1]) + can.onimport.tabview(can, "", can.Option(nfs.FILE), can.core.Split(button, ice.DF)[1]) }) }}]) }, _tabMode: function(can) { var mode = can.db.mode||"", target = can.ui.current; if (target && mode != mdb.PLUGIN) { mode += ice.SP+target.selectionStart+ice.PS+target.value.length } - can.page.Append(can, can.ui.path, [{text: [mode, "", ["mode", can.db.mode||""]], onclick: function(event) { + can.page.Append(can, can.ui.path, [{text: [mode, "", [ice.MODE, can.db.mode||""]], onclick: function(event) { var list = {}; can.core.Item(can.onkeymap._mode[can.db.mode], function(k, cb) { list[cb.help+ice.TB+k] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } }) can.core.Item(can.onkeymap._mode[can.db.mode+"_ctrl"], function(k, cb) { list[cb.help+ice.TB+"C-"+k] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } }) can.user.carte(event, can, list, []) @@ -127,16 +102,16 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl if (!can.user.isWebview) { return can.onimport.tabview(can, path, file, line, cb) } if (!can.db.tabview[key]) { return can.onimport.tabview(can, path, file, line, cb), can.db.tabview[key] = true } }, - tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH); var key = can.onexport.keys(can, path, file); can.db._keylist = [] + tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH); var key = can.onexport.keys(can, path, file) function isIndex() { return line == ctx.INDEX } function isSpace() { return line == web.SPACE } function show(skip) { can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.db.tabview[key] can.Option(can.onimport.history(can, {path: path, file: file, line: line||can.misc.sessionStorage(can, SELECT_LINE+ice.DF+path+file)||can._msg.Option(nfs.LINE)||1})) can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg; can.onexport.hash(can) can.isCmdMode() && can.onexport.title(can, path+file), can.onmotion.select(can, can.ui.tabs, html.DIV_TABS, msg._tab), can.isCmdMode() && msg._tab.scrollIntoView() - if (isIndex()) { - can.ui.path.innerHTML = can.Option(nfs.FILE) - } else if (isSpace()) { - can.ui.path.innerHTML = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)})) + if (isSpace()) { can.ui.path.innerHTML = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)})) } else if (isIndex()) { + can.onimport._tabPath(can, ice.PT, ice.CMD, can.Option(nfs.FILE), function(p, pre) { + can.onimport.tabview(can, "", can.core.Keys(can.base.trimSuffix(pre, ice.PT), p), ctx.INDEX) + }, can.ui.path) } else { can.onimport.__tabPath(can) } can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, html.FIELDSET_STORY, [[[html.IFRAME, html.CONTENT]]]), function(target) { if (can.onmotion.toggle(can, target, target == msg._content)) { can.ui.content = msg._content } @@ -152,65 +127,56 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl function load(msg) { var skip = false; can.db.tabview[key] = msg can.onimport.tabs(can, [{name: can.base.beginWith(file, "http://")? file.split(ice.QS)[0]: file.split(isIndex()? ice.PT: ice.PS).pop(), text: file, _menu: shy([ nfs.SAVE, nfs.TRASH, web.REFRESH, - ], function(event, button, meta) { - can.onaction[button](event, can, button) - })}], function(event, tabs) { + ], function(event, button, meta) { can.onaction[button](event, can, button) })}], function(event, tabs) { can._tab = msg._tab = tabs._target, show(skip), skip = true }, function(tabs) { can.onengine.signal(can, VIEW_REMOVE, msg), can.ui.zone.source.refresh() msg._content != can.ui._content && can.page.Remove(can, msg._content), msg._profile != can.ui._profile && can.page.Remove(can, msg._profile) - delete(can.ui._content._cache[key]), delete(can.ui._profile._cache[key]), delete(can.ui.display._cache[key]) - delete(can._cache_data[key]), delete(can.db.tabview[key]) + delete(can.ui._content._cache[key]), delete(can.ui._profile._cache[key]), delete(can.ui._display._cache[key]) + delete(can.db.tabview[key]), delete(can._cache_data[key]) }, can.ui.tabs) } - can.db._keylist = [] if (can.db.tabview[key]) { return !can._msg._tab && !can.isSimpleMode()? load(can.db.tabview[key]): show() } isIndex()||isSpace()? load(can.request({}, {index: file, line: line})): can.run({}, [path, file], load, true) }, - history: function(can, record) { - can.base.Eq(record, can.db.history[can.db.history.length-1], mdb.TEXT) || can.db.history.push(record) + history: function(can, record) { can.base.Eq(record, can.db.history[can.db.history.length-1], mdb.TEXT) || can.db.history.push(record) return can.Status(ice.BACK, can.db.history.length), record }, - project: function(can, path) { - can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) { - if (can.base.isFunc(cb)) { return {name: name, _trans: can.onfigure._trans? can.onfigure._trans[name]||"": "", _init: function(target, zone) { return cb(can, target, zone, path) }} } - }), can.ui.project), can.user.isMobile && !can.user.isLandscape() && can.onmotion.hidden(can, can.ui.project) - }, - profile: function(can, msg) { var _msg = can.db.tabview[can.onexport.keys(can)] + project: function(can, path) { can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) { + if (can.base.isFunc(cb)) { return {name: name, _trans: can.onfigure._trans? can.onfigure._trans[name]||"": "", _init: function(target, zone) { return cb(can, target, zone, path) }} } + }), can.ui.project) }, + profile: function(can, msg) { var _msg = can.db.tabview[can.onexport.keys(can)]; _msg.Option(html.WIDTH, msg.Option(html.WIDTH)||0.5) if (msg.Result().indexOf("