diff --git a/frame.js b/frame.js index c70fc277..97a43cfc 100644 --- a/frame.js +++ b/frame.js @@ -109,7 +109,7 @@ Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) close: function(can, msg, sub) { can.user.close() }, exit: function(can, msg, sub) { can.user.close() }, }) Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { - meta.index && (meta.name = meta.index), meta.name = can.core.Split(meta.name||"", "\t .\n").pop() + meta.index && (meta.name = meta.index), meta.name = can.core.Split(meta.name||"", "\t .\n").pop()||can.Conf(mdb.NAME) field = field||can.onappend.field(can, meta.type, meta, target)._target var legend = can.page.SelectOne(can, field, html.LEGEND) var option = can.page.SelectOne(can, field, html.FORM_OPTION) @@ -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() && !can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER) && 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, web.WIKI_WORD) && 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, {}) @@ -156,10 +156,15 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { list: {name: web.REFRESH, cb: function(event) { can.Update(event) }}, back: {name: "goback", cb: function(event) { can.onimport._back(can) }}, refresh: {name: web.REFRESH, cb: function(event) { can.Update(event) }}, - prev: {name: mdb.PREV, cb: function(event) { can.onaction.prev(event, can) }}, - next: {name: mdb.NEXT, cb: function(event) { can.onaction.next(event, can) }}, + prev: {name: mdb.PREV, cb: function(event) { + var sub = can.core.Value(can, chat._OUTPUTS_CURRENT) + sub.onaction && sub.onaction.prev? sub.onaction.prev(event, sub): can.onaction.prev(event, can) + }}, + next: {name: mdb.NEXT, cb: function(event) { + var sub = can.core.Value(can, chat._OUTPUTS_CURRENT) + sub.onaction && sub.onaction.next? sub.onaction.next(event, sub): can.onaction.next(event, can) + }}, play: {name: web.PLAY}, - // create: {name: mdb.CREATE}, insert: {name: mdb.CREATE}, "": {name: mdb.DELETE, cb: function(event) { can.onaction.close(event, can) }}, }[item.name||""]; if (!icon) { return } item.style = "icons" can.page.Append(can, option, [{view: [[html.ITEM, html.ICON, icon.name, item.name], html.DIV, can.page.unicode[icon.name]], title: item.name, onclick: icon.cb||function(event) { @@ -168,7 +173,6 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }}]) }) can.core.List(args.slice(can.core.List(meta.inputs, function(item) { if (item.type == mdb.TEXT) { return item } }).length), function(item, index) { meta.inputs.push({type: mdb.TEXT, name: "args"+index, value: item}) }) - function add(item, next) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item, item.type != html.BUTTON && index++ return Volcanos(item.name, {_root: can._root, _follow: can.core.Keys(can._follow, item.name), _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), _option: option||can._option, _action: can._action, _output: can._output, _status: can._status, @@ -236,8 +240,6 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { if (sub.onimport && can.base.isArray(sub.onimport.list) && sub.onimport.list.length > 0) { can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list, html.TEXT) }) } - - can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) { action === false || can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) action === false || sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg) @@ -385,7 +387,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { var code = can.page.Append(can, target||can._output, [{text: [can.page.Color(text), html.DIV, html.CODE]}]).code if (text.indexOf(" 0) { can.page.Select(can, target, html.FIELDSET, function(target) { var data = target.dataset - can.onappend.plugin(can, {index: data.index}, function(sub) { + data.index && can.onappend.plugin(can, {index: data.index}, function(sub) { can.page.Modify(can, sub._legend, data.index.split(ice.PT).pop()) }, can._output, target) }) @@ -620,7 +622,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { index > 0 && can.page.ClassList.set(can, tr, html.HIDDEN, can.page.Select(can, tr, html.TD, function(td) { if (td.innerText.toLowerCase().indexOf(value.toLowerCase()) > -1) { return td } }) == 0) }) }, delayResize: function(can, target, key) { can.onmotion.delay(can, function() { can.page.Select(can, target, key, function(_target) { - can.page.style(can, target, html.WIDTH, _target.offsetWidth+10, html.LEFT, (window.innerWidth-_target.offsetWidth)/2) + can.page.style(can, target, html.WIDTH, _target.offsetWidth+10, html.LEFT, (window.innerWidth-_target.offsetWidth)/2, html.TOP, (window.innerHeight-_target.offsetHeight)/2) }) }) }, delayLong: function(can, cb, interval, key) { can.onmotion.delay(can, cb, interval||300, key) }, delayOnce: function(can, cb, interval, list) { diff --git a/index.css b/index.css index 19b0dee9..a98f0aa2 100644 --- a/index.css +++ b/index.css @@ -137,7 +137,7 @@ div.output, fieldset>div.status, div.item.textarea, div.project div.item, div.co fieldset>div.status>legend { margin-left:2px; margin-right:0; height:30px; float:right; clear:none; } fieldset.plugin:not(.output):not(.float):not(.full):not(.cmd) { padding:10px; margin:10px; } fieldset.plugin:not(.float):not(.full):not(.cmd)>legend { float:none; } -fieldset.auto, fieldset.full, fieldset.float, div.float { position:fixed; z-index:10; } +fieldset.auto, fieldset.full, fieldset.float, div.float { position:fixed; top:0; z-index:10; } fieldset.plug { position:absolute; bottom:0; right:0; } fieldset.cmd fieldset.plug { position:fixed; bottom:32px; right:0; } fieldset.plug div.output table.content { width:100%; } // fieldset.plugin>div.output>fieldset.story { position:sticky; left:0; } @@ -170,12 +170,16 @@ fieldset.float div.item.text:hover>span.icon.delete { visibility:hidden; } fieldset.float>form.option>div.text>input { display:none; } fieldset.float>form.option>div.text>span.value { padding:7px; height:32px; display:block; } /* fieldset.float>form.option>div.item.button { display:none; } */ +fieldset.story>form.option>div.icon { display:block; } fieldset.float>form.option>div.icon { display:block; } +fieldset.full>form.option>div.icon { display:block; } fieldset.full>form.option>div.icon.delete { display:block; } fieldset.cmd>form.option>div.icon { display:block; } -fieldset.cmd>form.option>div.item.button.icons { display:none; } -fieldset.story>form.option>div.icon { display:block; } fieldset.story>form.option>div.item.button.icons { display:none; } +fieldset.float>form.option>div.item.button.icons { display:none; } +fieldset.full>form.option>div.item.button.icons { display:none; } +fieldset.cmd>form.option>div.item.button.icons { display:none; } + fieldset.plug>form.option>div.icon { margin-left:5px; } div.carte.select.float { border-radius:0; } div.carte.select.float>div.item { text-align:center; } diff --git a/panel/header.js b/panel/header.js index 4ea703be..7c67d3ad 100644 --- a/panel/header.js +++ b/panel/header.js @@ -70,6 +70,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { var themeMedia = window.matchMed onsize: function(can) { can.ConfHeight(can._target.offsetHeight), can.ConfWidth(can._target.offsetWidth) }, onmain: function(can) { can.run({}, [], function(msg) { if (!can.Conf(aaa.USERNICK, msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME))) { + debugger return msg.Option(chat.SSO)? can.user.jumps(msg.Option(chat.SSO)): can.user.login(can, function() { can.onengine.signal(can, chat.ONMAIN, msg) }, msg.Option(aaa.LOGIN)) } can.user.info.usernick = can.Conf(aaa.USERNICK), can.user.info.avatar = msg.Option(aaa.AVATAR), can.user.info.background = msg.Option(aaa.BACKGROUND) can.user.info.language = msg.SearchOrOption(aaa.LANGUAGE)||navigator.language.split("-")[0], msg.Option(nfs.SCRIPT) && can.require(can.base.Obj(msg.Option(nfs.SCRIPT)), function(can) { can.onaction.source(can, msg) }) diff --git a/plugin/local/code/inner/syntax.js b/plugin/local/code/inner/syntax.js index 66855048..72bf691c 100644 --- a/plugin/local/code/inner/syntax.js +++ b/plugin/local/code/inner/syntax.js @@ -114,27 +114,29 @@ Volcanos(chat.ONSYNTAX, { "/dev/null": code.CONSTANT, "/dev/stdout": code.CONSTANT, "/dev/stderr": code.CONSTANT, }, }, configure: {link: "sh"}, - shy: {prefix: {"#": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT}, keyword: { - "title": code.KEYWORD, "premenu": code.KEYWORD, "chapter": code.KEYWORD, "section": code.KEYWORD, - "refer": code.KEYWORD, "image": code.KEYWORD, - "spark": code.KEYWORD, "shell": code.KEYWORD, "field": code.KEYWORD, - "chart": code.KEYWORD, "label": code.KEYWORD, "chain": code.KEYWORD, "sequence": code.KEYWORD, - + shy: {prefix: {"#": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT}, keyword: {"source": code.KEYWORD, + "title": code.KEYWORD, "navmenu": code.KEYWORD, "premenu": code.KEYWORD, "chapter": code.KEYWORD, "section": code.KEYWORD, "endmenu": code.KEYWORD, + "refer": code.KEYWORD, "brief": code.KEYWORD, "spark": code.KEYWORD, "shell": code.KEYWORD, "parse": code.KEYWORD, + "order": code.KEYWORD, "table": code.KEYWORD, "chart": code.KEYWORD, "label": code.KEYWORD, "chain": code.KEYWORD, "sequence": code.KEYWORD, + "field": code.KEYWORD, "image": code.KEYWORD, "video": code.KEYWORD, "audio": code.KEYWORD, "package": code.KEYWORD, "import": code.KEYWORD, "const": code.KEYWORD, "type": code.KEYWORD, "var": code.KEYWORD, "if": code.KEYWORD, "else": code.KEYWORD, - "for": code.KEYWORD, "break": code.KEYWORD, "continue": code.KEYWORD, + "for": code.KEYWORD, "range": code.KEYWORD, "break": code.KEYWORD, "continue": code.KEYWORD, "switch": code.KEYWORD, "case": code.KEYWORD, "default": code.KEYWORD, "func": code.KEYWORD, "defer": code.KEYWORD, "return": code.KEYWORD, + "init": code.FUNCTION, "main": code.FUNCTION, "list": code.FUNCTION, "info": code.FUNCTION, + "map": code.DATATYPE, "struct": code.DATATYPE, "interface": code.DATATYPE, "string": code.DATATYPE, "int": code.DATATYPE, "true": code.CONSTANT, "false": code.CONSTANT, - "init": code.FUNCTION, "main": code.FUNCTION, "list": code.FUNCTION, - "info": code.FUNCTION, "pwd": code.FUNCTION, - "map": code.DATATYPE, "struct": code.DATATYPE, "interface": code.DATATYPE, - "string": code.DATATYPE, "int": code.DATATYPE, - "source": code.FUNCTION, + "kit": code.PACKAGE, "ice": code.PACKAGE, "m": code.OBJECT, "arg": code.OBJECT, "event": code.OBJECT, "can": code.OBJECT, "msg": code.OBJECT, "target": code.OBJECT, }, + func: function(can, push, text, indent, opts) { var ls = can.core.Split(text, "\t ") + opts.chapter = opts.chapter||0 + if (ls[0] == "chapter") { opts.chapter++, opts.section = 0, push(opts.chapter+ice.SP+ls[1]) } + if (ls[0] == "section") { opts.section++, push(opts.chapter+ice.PT+opts.section+ice.SP+ls[1]) } + }, }, py: {prefix: {"#!": code.COMMENT, "# ": code.COMMENT}, keyword: {"import": code.KEYWORD, "from": code.KEYWORD, "return": code.KEYWORD, "print": code.FUNCTION}}, go: {prefix: {"// ": code.COMMENT}, regexp: {"[A-Z_0-9]+": code.CONSTANT}, keyword: { @@ -230,6 +232,7 @@ Volcanos(chat.ONSYNTAX, { "table": code.KEYWORD, "thead": code.KEYWORD, "tbody": code.KEYWORD, "tr": code.KEYWORD, "th": code.KEYWORD, "td": code.KEYWORD, "h1": code.KEYWORD, "h2": code.KEYWORD, "h3": code.KEYWORD, "a": code.KEYWORD, "label": code.KEYWORD, "span": code.KEYWORD, "img": code.KEYWORD, "svg": code.KEYWORD, "div": code.KEYWORD, + "video": code.KEYWORD, "hover": code.DATATYPE, "focus": code.DATATYPE, "not": code.DATATYPE, "type": code.FUNCTION, "name": code.FUNCTION, "padding": code.FUNCTION, "padding-left": code.FUNCTION, "padding-top": code.FUNCTION, @@ -293,12 +296,14 @@ Volcanos(chat.ONSYNTAX, { "contexts": code.CONSTANT, }, }, - html: { + html: {split: {operator: "<=/>"}, keyword: { "DOCTYPE": code.KEYWORD, "html": code.KEYWORD, "head": code.KEYWORD, "body": code.KEYWORD, "meta": code.KEYWORD, "title": code.KEYWORD, "link": code.KEYWORD, "script": code.KEYWORD, "src": code.FUNCTION, "href": code.FUNCTION, "rel": code.FUNCTION, "style": code.FUNCTION, "width": code.FUNCTION, "height": code.FUNCTION, + "class": code.FUNCTION, + "fieldset": code.KEYWORD, "legend": code.KEYWORD, "form": code.KEYWORD, "h1": code.KEYWORD, "h2": code.KEYWORD, "h3": code.KEYWORD, "p": code.KEYWORD, "a": code.KEYWORD, "br": code.KEYWORD, "hr": code.KEYWORD, "label": code.KEYWORD, "span": code.KEYWORD, "img": code.KEYWORD, "svg": code.KEYWORD, "div": code.KEYWORD, diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index 04cae38a..92adbfec 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -4,7 +4,7 @@ fieldset.vimer>div.output input.current { background-color:transparent; color:tr fieldset.vimer>div.output input.current.insert { caret-color:black; } fieldset.vimer>div.output input.current.normal { caret-color:lightgray; } fieldset.vimer>div.output div.complete { background-color:unset; padding-top:0; display:none; overflow:auto; position:absolute; } -fieldset.vimer>div.output div.complete.insert:not(.hide) { display:block; } +fieldset.vimer>div.output div.complete.insert:not(.hide) { display:block; top:unset; } fieldset.vimer>div.output div.complete div.prefix { color:transparent; white-space:pre; float:left; } fieldset.vimer>div.output div.complete table.content thead { display:none; } fieldset.vimer>div.output div.complete table.content { width:unset; max-width:600px; display:block; } diff --git a/plugin/local/wiki/feel.css b/plugin/local/wiki/feel.css index 0e52b939..da50cdc0 100644 --- a/plugin/local/wiki/feel.css +++ b/plugin/local/wiki/feel.css @@ -1,5 +1,5 @@ fieldset.feel div.output img { display:block; float:left; } fieldset.feel div.output video { display:block; float:left; } -fieldset.feel.float div.output img { display:block; float:none; margin:auto; } -fieldset.feel.float div.output video { display:block; float:none; margin:auto; } -fieldset.feel.float div.status { display:block; } +fieldset.feel.play.float div.output img { display:block; float:none; margin:auto; } +fieldset.feel.play.float div.output video { display:block; float:none; margin:auto; } +fieldset.feel.play.float div.status { display:block; } diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index 6bd0f8b6..a3e58576 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -1,10 +1,10 @@ -Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.clear(can) +Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.clear(can), can.dir_root = msg.Option(nfs.DIR_ROOT) can._path = can.request(), can.list = [], msg.Table(function(value) { can.base.endWith(value.path, ice.PS)? can._path.Push(value): can.list.push(value) }) - can.ui = can.onlayout.profile(can, target), can._path.Table(function(item) { item.name = item.path + can.ui = can.onappend.layout(can, can._output, "", [html.PROJECT, html.DISPLAY]) + can._path.Table(function(item) { item.name = item.path can.onimport.item(can, item, function() { can.Option(nfs.PATH, item.path), can.Update() }, function() {}, can.ui.project) - }), can.isCmdMode() || can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can.ui.project) - can.base.isFunc(cb) && cb(msg), can.Action(html.HEIGHT, ice.AUTO), can.Action(mdb.LIMIT, 6) - can.dir_root = msg.Option(nfs.DIR_ROOT), can.onimport.page(can, can.list, can.begin = parseInt(msg.Option(cli.BEGIN)||"0")) + }), cb(msg), can.onimport.page(can, can.list, can.begin = parseInt(msg.Option(cli.BEGIN)||"0")) + can.isCmdMode() || can.onmotion.hidden(can, can._action), can.onmotion.delay(can, function() { can.onimport.layout(can) }) }, _file: function(can, path, index) { var p = location.href.indexOf(ice.HTTP) == 0? "": "http://localhost:9020" return path.indexOf(ice.HTTP) == 0? path: p+can.base.Path(web.SHARE_LOCAL, can.dir_root||"", path) @@ -18,6 +18,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path, i) } can.Status({begin: begin, limit: limit, total: list.length}) }, + layout: function(can) { + can.page.style(can, can.ui.display, html.WIDTH, can.ConfWidth()-can.ui.project.offsetWidth-1) + can.page.style(can, can.ui.project, html.HEIGHT, can.ui.display.offsetHeight) + }, }, [""]) Volcanos(chat.ONFIGURE, { png: function(can, path, index) { return can.onfigure.image(can, path, index) }, @@ -45,17 +49,15 @@ Volcanos(chat.ONFIGURE, { webm: function(can, path) { return can.onfigure.video(can, path) }, }) Volcanos(chat.ONACTION, {list: [ - [html.HEIGHT, 100, 200, 400, 600, 800, ice.AUTO], - [mdb.LIMIT, 1, 3, 6, 9, 12, 15, 20, 30, 50], + [html.HEIGHT, ice.AUTO, 100, 200, 400, 600, 800, ice.AUTO], + [mdb.LIMIT, 6, 1, 3, 6, 9, 12, 15, 20, 30, 50], [html.SPEED, 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], ], height: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.list) }, limit: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.list) }, speed: function(event, can, key, value) { can.Action(key, value), can.onimport.page(can, can.list) }, - prev: function(event, can) { if (can.begin > 0) { can.begin -= parseInt(can.Action(mdb.LIMIT)), can.onimport.page(can, can.list) } else { can.user.toast(can, "已经是第一页了") } }, next: function(event, can) { if (can.begin + parseInt(can.Action(mdb.LIMIT)) < can.list.length) { can.begin += parseInt(can.Action(mdb.LIMIT)), can.onimport.page(can, can.list) } else { can.user.toast(can, "已经是最后一页了") } }, - record0: function(event, can, name, cb) { can.user.input(event, can, [{name: nfs.FILE, value: name}], function(list) { var height = window.innerHeight navigator.mediaDevices.getDisplayMedia({video: {height: height}}).then(function(stream) { can.core.Next([3, 2, 1], function(item, next) { can.user.toast(can, item + "s 后开始截图"), can.onmotion.delay(can, next, 1000) }, function() { can.user.toast(can, "现在开始截图") @@ -78,7 +80,7 @@ Volcanos(chat.ONACTION, {list: [ }) }, }) Volcanos(chat.ONDETAIL, {list: ["关闭", "上一个", "下一个", "设置头像", "设置背景", "复制链接", "下载", "删除"], _init: function(can, index) { - can.onappend._init(can, {type: "story feel float"}, [], function(sub) { can.sub = sub + can.onappend._init(can, {type: "story feel play float"}, [], function(sub) { can.sub = sub, sub._legend.onclick = can._legend.onclick can.getActionSize(function(msg, left, top, width, height) { sub.onappend._action(can, can.ondetail.list, sub._action, can.ondetail), sub.onappend._status(sub, ["begin", nfs.FILE]) sub.page.style(sub, sub._target, {left: left||0, top: top||0}), sub.page.style(sub, sub._output, html.HEIGHT, height-2*html.ACTION_HEIGHT, html.WIDTH, width) can.order = index, can.show = function(order) { path = can.onimport._file(can, can.list[order].path); var cb = can.onfigure[can.base.Ext(path)]||can.onfigure[wiki.IMAGE] diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 80c9d6ce..0d326d3b 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -1,31 +1,16 @@ -fieldset.word form.option input[name=path] { width:127px; } fieldset.word>form.option>div.item>input[name=path] { width:320px; } body.mobile fieldset.word>form.option>div.item>input[name=path] { width:180px; } body.webview fieldset.word>form.option>div.item>input[name=path] { width:160px; } - fieldset.word>div.navmenu { background-color:inherit; overflow:auto; min-width:120px; clear:both; float:left; } fieldset.word>div.navmenu div.list { margin-left:20px; } fieldset.word>div.navmenu div.item { font-size:1.4em; font-weight:bold; font-family:cursive; padding:4px 20px; } fieldset.word>div.navmenu>div.item { font-size:1.6em; } - -fieldset.word a { word-break:break-all; } -fieldset.word br.story { clear:both; } -fieldset.word ul.story { text-align:left; } -fieldset.word ul.story li.H2 { font-size:1.4em; font-weight:bold; } -fieldset.word ul.story li.H3 { font-size:1.2em; } -fieldset.word ul.story[data-type=premenu] { cursor:pointer; } -fieldset.word ul.story[data-type=premenu] li:hover { background-color:cyan; color:blue; } -fieldset.word ul.story[data-type=endmenu] { clear:both; } -fieldset.word p.story[data-name=inner] { background-color:#4b6c8a7a; padding:4px 10px; border-left:solid 4px blue; margin:10px 0px; } -fieldset.word p.story[data-name=inner]:hover { background-color:#c10c8a; cursor:copy; } -fieldset.word table.content { display:block; max-height:400px; } -// fieldset.word>div.output>fieldset.story:not(.float):not(.full) { margin:10px; } -// fieldset.word>div.output>div.story { margin:10px; } -fieldset.word>div.output>p.story { margin:10px; } fieldset.word>div.output { padding:10px; } -// fieldset.word>div.output>fieldset.story { margin:10px; background-color:#58a4d37d; } -fieldset.word fieldset.story.full { margin:0; } -fieldset.word fieldset.story.float { margin:0; } +fieldset.word>div.output>p.story { margin:10px; } +fieldset.word>div.output>fieldset.story:not(:hover)>form.option { display:none; } +fieldset.word>div.output>fieldset.story:not(:hover)>div.action { display:none; } +fieldset.word a { word-break:break-all; } +fieldset.word img { word-break:break-all; } fieldset.word svg.story.auto defs marker { stroke:red; fill:red; } fieldset.word svg.story.auto rect { stroke:yellow; fill:black; } @@ -38,29 +23,21 @@ body.white fieldset.word svg.story.auto text { stroke:blue; fill:blue; } body.white fieldset.word svg.story.auto line { stroke:red; stroke-width:1; } body.white fieldset.word svg.story.auto path { stroke:red; stroke-width:1; } -fieldset.word.float { padding:0; margin:0; position:fixed; left:0; top:0; z-index:10; } -/* fieldset.word.float { padding:0; margin:0; width:-webkit-fill-available; position:fixed; left:0; top:0; z-index:10; } */ -fieldset.word.float>div.action { display:contents; } -fieldset.word.float>div.status { clear:none; display:block; } -fieldset.word.float>div.output { background-color:#f0f8ff80; text-align:center; overflow:auto; } -fieldset.word.float>div.output>div.project { background-color:#4682b46b; padding:10px; position:fixed; right:0; top:32px; z-index:10; } -fieldset.word.float div.content div.page { text-align:center; margin-top:32px; display:none; } -fieldset.word.float div.content div.page.show { display:block; } -fieldset.word.float div.content.grid div.page { background-color:#a4cbecb5; margin:10px; height:200px; width:200px; overflow:auto; display:block; float:left; } -fieldset.word.float h1 { text-align:center; } -fieldset.word.float h2 { text-align:center; } -fieldset.word.float h3 { text-align:center; } - +fieldset.word.play.float>div.action { display:contents; } +fieldset.word.play.float>div.status { clear:none; } +fieldset.word.play.float>div.output>div.project { background-color:#4682b46b; padding:10px; position:fixed; right:0; top:32px; z-index:10; } +fieldset.word.play.float div.content div.page { text-align:center; display:none; } +fieldset.word.play.float div.content div.page.show { display:block; } +fieldset.word.play.float div.content.grid div.page { background-color:#a4cbecb5; margin:10px; height:200px; width:200px; overflow:auto; display:block; float:left; } +fieldset.word.play.float h1 { text-align:center; } +fieldset.word.play.float h2 { text-align:center; } +fieldset.word.play.float h3 { text-align:center; } fieldset.word.cmd>legend { display:none; } fieldset.word.cmd>form.option { display:none; } fieldset.word.cmd>div.action { display:none; } fieldset.word.cmd>div.status { display:none; } -div.story[data-type=spark][data-name=field]>div.menu { float:left; overflow:auto; } -div.story[data-type=spark][data-name=field]>div.list { float:left; overflow:auto; } -div.story[data-type=spark][data-name=field]>div.menu div.list div.item { padding:0 20px; } - -div.story[data-type=spark][data-name=shell] label { +div.story[data-type=spark] label { -webkit-user-select:none; /*webkit浏览器*/ -khtml-user-select:none; /*早期浏览器*/ -moz-user-select:none; /*火狐*/ diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 0bfb320c..153caa42 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -1,85 +1,35 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(can) can.page.Modify(can, target, msg.Result()) can.page.Select(can, target, wiki.STORY_ITEM, function(target) { var meta = target.dataset||{} - can.core.CallFunc([can.onimport, meta.type||target.tagName.toLowerCase()], [can, meta, target]) + can.core.CallFunc([can.onimport, can.onimport[meta.name]? meta.name: meta.type||target.tagName.toLowerCase()], [can, meta, target]) meta.style && can.page.style(can, target, can.base.Obj(meta.style)) - }) + }), can.onmotion.delay(can, function() { can.onimport.layout(can) }) }, navmenu: function(can, meta, target) { var nav = can.sup._navmenu nav = can.onmotion.clear(can, nav||can.page.insertBefore(can, [wiki.NAVMENU], can._output)), can.sup._navmenu = nav - can.onimport.list(can, can.base.Obj(meta.data), function(event, item) { - var link = item.meta.link, list = can.core.Split(item.meta.link) - if (can.core.Value(can, list[0])) { return can.core.CallFunc([can, list[0]], list.slice(1)) } - if (!link || link == can.Option(nfs.PATH)) { return false } + var link = item.meta.link; if (!link || link == can.Option(nfs.PATH)) { return false } + if (can.base.beginWith(link, web.HTTP)) { return can.user.open(link) } if (can.onmotion.cache(can, function() { can.isCmdMode() && can.user.title(item.meta.name); return can.Option(nfs.PATH, link) })) { return } return can.sup.Update(event, [link]) }, nav) - - can.getActionSize(function(msg) { - can.page.style(can, nav, html.HEIGHT, can.ConfHeight()+(can.isCmdMode()? msg.Option(html.MARGIN_Y): 0)) - can.page.style(can, can._output, html.PADDING, 10, html.FLOAT, html.LEFT, html.CLEAR, html.NONE, - html.HEIGHT, can.sup._navmenu.offsetHeight, html.MAX_WIDTH, can.ConfWidth(can.ConfWidth()-nav.offsetWidth), - ) - }) - }, - premenu: function(can, meta, target) { - can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(_target) { - can.page.Append(can, target, [{text: [_target.innerHTML, html.LI, _target.tagName], onclick: function() { - _target.scrollIntoView() - }}]), _target.onclick = function(event) { can.misc.Event(event, can, function(msg) { - target.scrollIntoView() - }) } - }) }, + premenu: function(can, meta, target) { can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(_target) { + can.page.Append(can, target, [{text: [_target.innerHTML, html.DIV, html.ITEM], onclick: function() { + _target.scrollIntoView() + }}]), _target.onclick = function(event) { target.scrollIntoView() } + }) }, + endmenu: function(can, meta, target) { can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(_target) { + can.page.Append(can, target, [{text: [_target.innerHTML, html.DIV, html.ITEM], onclick: function() { + _target.scrollIntoView() + }}]) + }) }, title: function(can, meta, target) { can.isCmdMode() && target.tagName == "H1" && can.user.title(meta.text) }, spark: function(can, meta, target) { - if (meta[mdb.NAME] == chat.FIELD) { - function deep(text) { var d = 0 - for (var i = 0; i < text.length; i++) { - switch (text[i]) { - case ice.TB: d += 4; break - case ice.SP: d++; break - default: return d - } - } - return d - } - var list = []; can.core.List(target.innerText.split(ice.NL), function(line) { var _deep = deep(line) - while (list.length > 0) { if (_deep <= list[list.length-1]._deep) { list.pop() } else { break } } - var ls = can.core.Split(line), item = {_deep: _deep, meta: {index: ls[0], name: ls[1], args: ls.slice(2)}, list: []} - if (list.length > 0) { list[list.length-1].list.push(item) } list.push(item) - }) - - var first; function show(item, index, target, output) { - var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name||item.meta.index], onclick: function(event) { - can.onmotion.select(can, view.menu, html.DIV_ITEM, event.target) - if (ui.list.innerText) { return can.onmotion.toggle(can, ui.list) } - if (can.onmotion.cache(can, function() { return index }, output)) { return } - - can.core.List(item.list, function(item) { - can.onappend.plugin(can, item.meta, function(sub) { - sub.run = function(event, cmds, cb) { can.runActionCommand(event, item.meta.index, cmds, cb) } - sub.ConfHeight(item.meta.height = can.ConfHeight()/2), sub.ConfWidth(item.meta.width = can.ConfWidth()-(can.user.isWindows? 181: 165)) - can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth()) - }, output) - }) - }}, html.LIST]) - can.core.List(item.list, function(item) { item.list.length > 0 && show(item, can.core.Keys(index, item.meta.index), ui.list, output) }) - ui.list.innerText == "" && (first = first||ui.item) - } - - var view = can.page.Appends(can, target, [ - {view: html.MENU, style: {height: can.ConfHeight()/2, width: 120}}, - {view: html.LIST, style: {height: can.ConfHeight()/2, width: can.ConfWidth()-(can.user.isWindows? 181: 185)}}, - ]) - return show(list[0], list[0]._index, view.menu, view.list), first.click() - } - if (meta[mdb.NAME] == html.INNER) { return can.onmotion.copy(can, target) } can.page.Select(can, target, html.SPAN, function(item) { can.onmotion.copy(can, item) }) }, - field: function(can, meta, target, width) { var item = can.base.Obj(meta.meta) + field: function(can, meta, target, width) { var item = can.base.Obj(meta.meta); item.inputs = item.list, item.feature = item.meta can.onappend._init(can, item, [chat.PLUGIN_STATE_JS], function(sub) { sub.run = function(event, cmds, cb, silent) { var msg = sub.request(event) if (msg.Option(nfs.PATH) == can.Option(nfs.PATH)) { msg.Option(nfs.PATH, "") } @@ -94,7 +44,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }) }, can._output, target) }, - table: function(can, meta, target) { can.page.OrderTable(can, target), can.page.ClassList.add(can, target, chat.CONTENT) can.page.Select(can, target, html.TD, function(item) { can.onmotion.copy(can, item) }) @@ -111,63 +60,46 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( })); can.page.style(can, ui._target, {left: event.clientX, top: event.clientY}) }) } }, - image: function(can, meta, target) { can.page.style(can, target, html.MAX_HEIGHT, can.base.Min(can.ConfHeight(), window.innerHeight/2), html.MAX_WIDTH, can.ConfWidth()) }, - video: function(can, meta, target) { can.page.style(can, target, html.MAX_HEIGHT, can.base.Min(can.ConfHeight(), window.innerHeight/2), html.MAX_WIDTH, can.ConfWidth()) }, + image: function(can, meta, target) { + can.page.style(can, target, html.MAX_HEIGHT, can.base.Min(can.ConfHeight()-20, window.innerHeight/2), html.MAX_WIDTH, can.ConfWidth()-20) + }, + video: function(can, meta, target) { + can.page.style(can, target, html.MAX_HEIGHT, can.base.Min(can.ConfHeight()-20, window.innerHeight/2), html.MAX_WIDTH, can.ConfWidth()-20) + }, audio: function(can, meta, target) {}, - - layout: function(can) { - can.isCmdMode() && can.ConfHeight(can.page.height()) && can.page.styleHeight(can, can._output, "") + + layout: function(can) { var height = can.ConfHeight(), width = can.ConfWidth() + can.isCmdMode() && can.ConfHeight(can.page.height()) + if (can.sup._navmenu) { can.page.style(can, can.sup._navmenu, html.HEIGHT, can.ConfHeight()) + can.page.style(can, can._output, html.HEIGHT, height, html.WIDTH, width = can.ConfWidth()-can.sup._navmenu.offsetWidth, "clear", "none", "float", "left") + } else { + can.isCmdMode() && can.ConfHeight(can.page.height()) && can.page.styleHeight(can, can._output, "") + } can.core.List(can._plugins, function(sub) { - sub.ConfHeight(can.base.Min(300, can.ConfHeight()-300)), sub.ConfWidth(can.ConfWidth()-(can.user.isWindows? 40: 20)) - sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), true) + sub.ConfHeight(can.base.Min(300, height-300)), sub.ConfWidth(width-(can.user.isWindows? 40: 20)) + sub.onimport.size(sub, can.base.Min(300, height-300), width-(can.user.isWindows? 40: 20), true) }) + can.page.Select(can, can._output, can.page.Keys(html.IMG, html.VIDEO), function(target) { can.page.style(can, target, html.MAX_HEIGHT, height-20, html.MAX_WIDTH, width-20) }) }, }, [""]) -Volcanos(chat.ONKEYMAP, { - _mode: { - normal: { - "n": function(event, can) { can.ondetail.next(can.sub) }, - "j": function(event, can) { can.ondetail.next(can.sub) }, - "ArrowRight": function(event, can) { can.ondetail.next(can.sub) }, - "ArrowLeft": function(event, can) { can.ondetail.prev(can.sub) }, - "k": function(event, can) { can.ondetail.prev(can.sub) }, - "p": function(event, can) { can.ondetail.prev(can.sub) }, - - "q": function(event, can) { can.ondetail["结束"](event, can.sub) }, - "h": function(event, can) { can.ondetail["隐藏"](event, can.sub) }, - }, - }, _engine: {}, -}) -Volcanos(chat.ONACTION, { - _trans: {view: "视图"}, +Volcanos(chat.ONACTION, {_trans: {view: "视图"}, + onkeydown: function(event, can) { can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist) }, play: function(event, can) { var list = [], current = [] - can.page.Select(can, can._output, wiki.STORY_ITEM, function(item) { - can.page.tagis(item, "h1", "h2", "h3") && list.push(current = []), current.push(item) - }) - - can.onappend._init(can, {type: "story word float"}, [], function(sub) { + can.page.Select(can, can._output, wiki.STORY_ITEM, function(item) { can.page.tagis(item, "h1", "h2", "h3") && list.push(current = []), current.push(item) }) + can.onappend._init(can, {type: "story word play float"}, [], function(sub) { sub._legend.onclick = can._legend.onclick sub.run = can.run, sub.sup = can, can.sub = sub, can.onappend._action(sub, can.user.isMobile && can.page.height() > can.page.width()? [ "大纲", "上一页", "下一页", "结束", ]: [ ["布局", "开讲", "网格", "快闪"], "大纲", "首页", "上一页", ["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })), "下一页", "隐藏", "结束", - ], sub._action, can.ondetail) - - can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) { - can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist) - }})), can.onkeymap._build(can) - + ], sub._action, can.ondetail), can.onkeymap._build(can) sub.page.style(sub, sub._target, "background", can._root._target.style.background) sub.page.style(sub, sub._output, html.HEIGHT, can.page.height()-2*html.ACTION_HEIGHT) sub.page.style(sub, sub._output, html.WIDTH, can.page.width()) - - sub.ui = sub.page.Append(sub, sub._output, [{view: chat.PROJECT}, {view: chat.CONTENT}]) + sub.ui = sub.page.Append(sub, sub._output, [chat.PROJECT, chat.CONTENT]) can.core.List(sub.list = list, function(page, index) { - can.onimport.item(can, {name: page[0].innerHTML}, function(event) { - can.ondetail.show(sub, index) - }, function(event) {}, sub.ui.project) - + can.onimport.item(can, {name: page[0].innerHTML}, function(event) { can.ondetail.show(sub, index) }, function(event) {}, sub.ui.project) sub.page.Append(sub, sub.ui.content, [{view: "page"+(index==0? " first": ""), list: can.core.List(page, function(item) { var data = item.dataset||{} switch (data.type) { case wiki.PREMENU: item = item.cloneNode(false); break @@ -177,20 +109,10 @@ Volcanos(chat.ONACTION, { return can.core.CallFunc([can.onimport, data.type], [sub, data, item, can.page.width()]), item }), }]) }), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0) - sub.onappend._status(sub, [mdb.PAGE, cli.FROM, cli.COST]), sub.Status(cli.FROM, can.base.Time()) - var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date() - sub.Status(cli.COST, can.base.Duration(now-from)) - }) + var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date(); sub.Status(cli.COST, can.base.Duration(now-from)) }) }, can._root._target) }, - view: function(event, can) { - if (can._height) { - can.page.styleHeight(can, can._target, can._height), can.page.styleHeight(can, can.sup._navmenu, can._height), delete(can._height) - } else { can._height = can.page.styleHeight(can, can._target) - can.page.styleHeight(can, can._target, ""), can.page.styleHeight(can, can.sup._navmenu, "") - } - }, }) Volcanos(chat.ONDETAIL, {list: ["删除"], show: function(sub, which) { sub.page.styleClass(sub, sub.ui.content, chat.CONTENT) @@ -205,21 +127,15 @@ Volcanos(chat.ONDETAIL, {list: ["删除"], } }) }, - next: function(sub) { - sub.page.Select(sub, sub.ui.content, sub.core.Keys(html.DIV_PAGE, ice.SHOW), function(page) { - page.nextSibling? sub.sup.ondetail.show(sub, page.nextSibling): sub.user.toast(sub, cli.END) - }) - }, - prev: function(sub) { - sub.page.Select(sub, sub.ui.content, sub.core.Keys(html.DIV_PAGE, ice.SHOW), function(page) { - page.previousSibling? sub.sup.ondetail.show(sub, page.previousSibling): sub.user.toast(sub, cli.END) - }) - }, - flash: function(sub) { - sub.core.Next(sub.page.Select(sub, sub.ui.content, html.DIV_PAGE), function(page, next) { - sub.sup.ondetail.show(sub, page), sub.onmotion.delay(sub, function() { next() }) - }) - }, + next: function(sub) { sub.page.Select(sub, sub.ui.content, sub.core.Keys(html.DIV_PAGE, ice.SHOW), function(page) { + page.nextSibling? sub.sup.ondetail.show(sub, page.nextSibling): sub.user.toast(sub.sup, cli.END) + }) }, + prev: function(sub) { sub.page.Select(sub, sub.ui.content, sub.core.Keys(html.DIV_PAGE, ice.SHOW), function(page) { + page.previousSibling? sub.sup.ondetail.show(sub, page.previousSibling): sub.user.toast(sub.sup, cli.END) + }) }, + flash: function(sub) { sub.core.Next(sub.page.Select(sub, sub.ui.content, html.DIV_PAGE), function(page, next) { + sub.sup.ondetail.show(sub, page), sub.onmotion.delay(sub, next, 500) + }) }, grid: function(sub) { sub.page.styleClass(sub, sub.ui.content, "content grid") }, "开讲": function(event, can) { can.sup.ondetail.show(can, 0) }, @@ -235,3 +151,18 @@ Volcanos(chat.ONDETAIL, {list: ["删除"], "结束": function(event, can) { can.page.Remove(can, can._target) }, "删除": function(event, sub) { sub.page.Remove(sub, sub._target) }, }) +Volcanos(chat.ONKEYMAP, { + _mode: { + normal: { + "n": function(event, can) { can.ondetail.next(can.sub) }, + "j": function(event, can) { can.ondetail.next(can.sub) }, + "ArrowRight": function(event, can) { can.ondetail.next(can.sub) }, + "ArrowLeft": function(event, can) { can.ondetail.prev(can.sub) }, + "k": function(event, can) { can.ondetail.prev(can.sub) }, + "p": function(event, can) { can.ondetail.prev(can.sub) }, + + "q": function(event, can) { can.ondetail["结束"](event, can.sub) }, + "h": function(event, can) { can.ondetail["隐藏"](event, can.sub) }, + }, + }, _engine: {}, +}) diff --git a/plugin/state.js b/plugin/state.js index f228b65a..4e14231a 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -77,6 +77,7 @@ Volcanos(chat.ONACTION, {list: [ can.page.style(can, can._output, back.output), can.page.style(can, can._target, back.style), can.base.isFunc(load) && load(back) if (!sub) { return } sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth()), sub.Mode(can.Mode()), sub.onlayout._init(sub) + can._target.click() } }, "刷新界面": function(event, can) { var sub = can._outputs[0]; sub.onlayout._init(sub), can.user.toastSuccess(can) }, diff --git a/proto.js b/proto.js index 57d5e62f..ad67d5e1 100644 --- a/proto.js +++ b/proto.js @@ -79,6 +79,7 @@ var web = {CHAT: "chat", CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", DOWNLOAD: "download", TOIMAGE: "toimage", SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/", + HTTP: "http", GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE", Accept: "Accept", ContentType: "Content-Type", ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded", IMAGE_PNG: "image/png", VIDEO_WEBM: "video/webm", @@ -307,7 +308,7 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} can.base.isFunc(item.Option)? can.core.List(item.Option(), function(key) { key.indexOf("_") == 0 || key.indexOf("user.") == 0 || set(key, item.Option(key)) }): can.core.Item(can.base.isFunc(item)? item(): item, set) - }); set(ice.MSG_HEIGHT, can.ConfHeight()), set(ice.MSG_WIDTH, can.ConfWidth()), set(ice.MSG_MODE, can.Mode()) + }); set(ice.MSG_HEIGHT, can.ConfHeight()+""), set(ice.MSG_WIDTH, can.ConfWidth()+""), set(ice.MSG_MODE, can.Mode()) return msg }, runActionInputs: function(event, cmds, cb) { var msg = can.request(event), meta = can.Conf()