diff --git a/frame.js b/frame.js index 5ff3320a..bb68b93c 100644 --- a/frame.js +++ b/frame.js @@ -245,6 +245,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.core.List(root.list, function(item) { var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name], onclick: function(event) { can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list) + can.onmotion.select(can, nav, "div.item", event.target) }}, {view: html.LIST}]); can.onappend.list(can, item, cb, ui.list) }) }, diff --git a/lib/base.js b/lib/base.js index cbcecb8b..d5d6e7bb 100644 --- a/lib/base.js +++ b/lib/base.js @@ -230,11 +230,11 @@ Volcanos("base", {help: "数据类型", return str.slice(0, str.indexOf(end)) }, join: function(list, sp) { return (list||[]).join(sp||ice.SP) }, - joins: function(list) { + joins: function(list, inner, outer) { for (var i = 0; i < list.length; i++) { - list[i] = typeof list[i] == lang.STRING? list[i]: list[i].join(ice.FS) + list[i] = typeof list[i] == lang.STRING? list[i]: list[i].join(inner||ice.FS) } - return list.join(ice.SP) + return list.join(outer||ice.SP) }, }) diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index a31540da..4cbc8a86 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -87,33 +87,10 @@ fieldset.word video.story { fieldset.word fieldset.story { margin:10px; border:0; clear:both; float:left; - box-shadow: 4px 4px 10px 1px #626bd0; + box-shadow:4px 4px 10px 1px #626bd0; } fieldset.word fieldset.story:hover { - box-shadow: 12px 12px 12px 6px #5764efd1; -} - -div.story[data-type=json] div.item { - margin-left:10px; - padding-left:10px; - border:solid 1px #ff000000; - border-left:dashed 1px gray; -} -div.story[data-type=json] div.item:hover { - border:solid 1px red; -} -div.story[data-type=json] span.key { - color:brown; -} -div.story[data-type=json] span.str { - color:magenta; -} -div.story[data-type=json] span.value { - cursor:copy; -} -div.story[data-type=json] span.toggle { - cursor:pointer; - color:gray; + box-shadow:12px 12px 12px 6px #5764efd1; } fieldset.word.float { @@ -128,8 +105,11 @@ fieldset.word.float>div.output { padding:20px; } fieldset.word.float div.project { - background-color:#bad1e6a6; + background:cornsilk; + left:0; top:25px; + position:fixed; padding:10px; + z-index:100; } fieldset.word.float div.content div.page { background-color:#194c79d4; @@ -156,9 +136,14 @@ fieldset.word.float h3 { text-align:center; } fieldset.word.float div.status { - color:white; clear:none; } +fieldset.word.float div.status label { + color:black; +} +fieldset.word.float div.status span { + color:black; +} fieldset.panel.cmd fieldset.word>form.option { display:none; diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 3d512c04..e00a6096 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -1,4 +1,4 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { +Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) if (msg.Length() > 0) { return can.onappend.table(can, msg) } @@ -6,128 +6,103 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.page.Select(can, target, ".story", function(item) { var data = item.dataset||{} can.core.CallFunc([can.onimport, data.type], [can, data, item]) can.page.Modify(can, item, {style: can.base.Obj(data.style)}) - // delete(data.meta) - }) - - if (can.user.mod.isCmd) { - can.page.ClassList.add(can, can._fields, "cmd") + }), can.onimport._navmenu(can) + }, + _navmenu: function(can) { if (!can.sup._navmenu) { return } + if (can.user.mod.isCmd) { can.page.ClassList.add(can, can._fields, "cmd") + can.Conf(html.WIDTH, can.Conf(html.WIDTH)-can.sup._navmenu.offsetWidth-10) can.page.Modify(can, can.sup._navmenu, {style: {height: window.innerHeight}}) - if (can.sup._navmenu) { - can.Conf("width", can.Conf("width")-can.sup._navmenu.offsetWidth-10) - can.page.Modify(can, can._output, {style: {"max-width": can.Conf("width")}}) - can.page.Modify(can, can._output, {style: {height: window.innerHeight}}) - } + can.page.Modify(can, can._output, {style: {"max-width": can.Conf(html.WIDTH)}}) + can.page.Modify(can, can._output, {style: {height: window.innerHeight}}) } else { - if (can.sup._navmenu) { - can.Conf("width", can.Conf("width")-can.sup._navmenu.offsetWidth-20) - can.page.Modify(can, can.sup._navmenu, {style: {height: window.innerHeight-240}}) - can.page.Modify(can, can._output, {style: {height: window.innerHeight-240}}) - } + can.Conf(html.WIDTH, can.Conf(html.WIDTH)-can.sup._navmenu.offsetWidth-20) + can.page.Modify(can, can.sup._navmenu, {style: {height: window.innerHeight-240}}) + can.page.Modify(can, can._output, {style: {height: window.innerHeight-240}}) } }, navmenu: function(can, data, target) { var nav = can.sup._navmenu - nav = nav || can.page.Append(can, can._fields, [{view: "navmenu"}]).first - can.sup._navmenu = nav, can._fields.insertBefore(nav, can._output) - can.onmotion.clear(can, nav) - can.page.Modify(can, can._output, {style: {float: "left", clear: "none"}}) + nav = nav||can.page.Append(can, can._fields, [{view: "navmenu"}]).first + can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output) + can.sup._navmenu = nav + + can.page.Modify(can, can._output, {style: {float: html.LEFT, clear: html.NONE}}) can.onappend.list(can, can.base.Obj(data.data), function(event, item) { var link = item.meta.link, cmd = link.split(ice.PS).pop() - - can.onmotion.select(can, nav, "div.item", event.target) if (can.onaction[cmd]) { return can.onaction[cmd](event, can) } - if (!link || link == can.Option("path")) { return } - - can.page.Cache(can.Option("path"), can._output, "some") - can.Option("path", link) - var some = can.page.Cache(can.Option("path"), can._output) - can.user.title(item.meta.name) + if (!link || link == can.Option(nfs.PATH)) { return } + can.page.Cache(can.Option(nfs.PATH), can._output, "some") + can.Option(nfs.PATH, link) + var some = can.page.Cache(can.Option(nfs.PATH), can._output) if (!some) { can.sup.Update(event, [link]) } + can.user.title(item.meta.name) return true }, nav) }, - premenu: function(can, data, target) { can.page.Select(can, can._output, "h2.story, h3.story", function(item) { - can.page.Append(can, target, [{text: [item.innerHTML, "li", item.tagName], onclick: function() { + can.page.Append(can, target, [{text: [item.innerHTML, html.LI, item.tagName], onclick: function() { item.scrollIntoView() - }}]) - item.onclick = function(event) { target.scrollIntoView() } + }}]), item.onclick = function(event) { target.scrollIntoView() } }) }, title: function(can, data, target) { can.user.mod.isCmd && can.user.title(data.text) }, spark: function(can, data, target) { - if (data["name"] == "inner") { + if (data[mdb.NAME] == html.INNER) { target.title = "点击复制", target.onclick = function(event) { can.user.copy(event, can, target.innerText) } return } - can.page.Select(can, target, "span", function(item) { + can.page.Select(can, target, html.SPAN, function(item) { item.title = "点击复制", item.onclick = function(event) { can.user.copy(event, can, item.innerText) } }) - can.page.Select(can, target, "a", function(item) { - can.page.Modify(can, item, {target: "_blank"}) - if (item.innerText == "") { - item.innerText = item.href - } - }) - }, - table: function(can, data, target) { - can.page.OrderTable(can, target) - can.page.ClassList.add(can, target, "content") - can.page.Select(can, target, "td", function(item) { - item.title = "点击复制", item.onclick = function(event) { - can.user.copy(event, can, item.innerText) - } + can.page.Select(can, target, html.A, function(item) { + if (item.innerText == "") { item.innerText = item.href } + can.page.Modify(can, item, {target: "_blank"}) }) }, - json: function(can, data, target) { - can.page.Select(can, target, "span.toggle", function(item) { - item.onclick = function(event) { can.onmotion.toggle(can, item.nextSibling) } - }) - can.page.Select(can, target, "span.value", function(item) { - item.onclick = function(event) { can.user.copy(event, can, item.innerText) } - }) - }, - field: function(can, data, target) { var item = can.base.Obj(data.meta) - item.width = parseInt(can.Conf("width")||window.innerWidth-20), item.height = parseInt(can.Conf("height")||window.innerHeight) - item.type = chat.PLUGIN - can.onappend._init(can, item, ["/plugin/state.js"], function(sub) { - sub.run = function(event, cmds, cb, silent) { - can.run(event, can.misc.concat([ctx.ACTION, "story", data.type, data.name, data.text], cmds), cb, true) - } - - sub.Conf("width", item.width=can.Conf("width")-20) - can.onengine.listen(can, "onaction_resize", function(width, height) { - can.page.Modify(can, sub._output, {style: {"max-width": sub.Conf("width", item.width=width-80)}}) - }) - if (can.core.Value(item, "auto.cmd")) { - can.core.Timer(100, function() { - var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option("_handle", "true") - sub.Update(msg._event, [ctx.ACTION, can.core.Value(item, "auto.cmd")]) - }) - } - }, can._output, target) - }, chart: function(can, data, target) { target.oncontextmenu = function(event) { - var ui = can.user.carte(event, can, {"导出": function(event, can, button) { - can.user.toPNG(can, "hi.png", target.outerHTML, parseInt(target.getAttribute(html.HEIGHT)), parseInt(target.getAttribute(html.WIDTH))) - }}, ["导出"]) + var ui = can.user.carte(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) { + can.user.toPNG(can, can.user.prompt("file name", null, "hi.png"), target.outerHTML, + parseInt(target.getAttribute(html.HEIGHT)), parseInt(target.getAttribute(html.WIDTH))) + }), [mdb.EXPORT]) can.page.Modify(can, ui._target, {style: {left: event.clientX, top: event.clientY}}) } }, + table: function(can, data, target) { + can.page.OrderTable(can, target) + can.page.ClassList.add(can, target, chat.CONTENT) + can.page.Select(can, target, html.TD, function(item) { + item.title = "点击复制", item.onclick = function(event) { + can.user.copy(event, can, item.innerText) + } + }) + }, + field: function(can, data, target, width) { var item = can.base.Obj(data.meta) + can.onappend._init(can, item, ["/plugin/state.js"], function(sub) { + sub.run = function(event, cmds, cb, silent) { + can.run(event, can.misc.concat([ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true) + } + sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20) + + can.core.Value(item, "auto.cmd") && can.core.Timer(100, function() { + var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option("_handle", "true") + sub.Update(msg._event, [ctx.ACTION, can.core.Value(item, "auto.cmd")]) + }) + }, can._output, target) + }, iframe: function(can, data, target) { var meta = can.base.Obj(data.meta) - can.page.Modify(can, target, {width: can.Conf("width")-200}) + can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200}) }, -}, ["/plugin/local/wiki/word.css"]) +}, [""]) Volcanos("onkeypop", {help: "键盘交互", list: [], _mode: { normal: { @@ -144,11 +119,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], }, _engine: {}, }) Volcanos("onaction", {help: "控件交互", list: [], - home: function(event, can) { - location.href = ice.PS - }, - - show: function(event, can) { var list = [], current = [] + play: function(event, can) { var list = [], current = [] can.page.Select(can, can._output, ".story", function(item) { switch (item.tagName) { case "H1": @@ -160,42 +131,38 @@ Volcanos("onaction", {help: "控件交互", list: [], current.push(item) }) - can.onappend._init(can, {type: "story word float"}, [], function(sub) { sub.sup = can - can.page.Modify(can, sub._target, {style: {"background": document.body.style.background}}) - can.onappend._action(sub, [ - ["布局", "开讲", "快闪", "网格"], - "大纲", "首页", "上一页", + can.onappend._init(can, {type: "story word float"}, [], function(sub) { + sub.run = can.run, sub.sup = can, can.sub = sub, can.onappend._action(sub, [ + ["布局", "开讲", "快闪", "网格"], "大纲", "首页", "上一页", ["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })), "下一页", "隐藏", "结束", ], sub._action, can.onaction) - can.sub = sub, can.onkeypop._build(can) can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) { can.keylist = can.onkeypop._parse(event, can, "normal", can.keylist) - }})) + }})), can.onkeypop._build(can) - sub.onappend._status(sub, ["page", "from", "cost"]) - sub.list = list - sub.page.Modify(sub, sub._output, {style: {"width": window.innerWidth-40}}) - sub.page.Modify(sub, sub._output, {style: {"height": window.innerHeight-93}}) - sub.ui = sub.page.Append(sub, sub._output, [{view: "project"}, {view: "content"}]) - can.core.List(list, function(page, index) { - can.onappend.item(can, "item", {name: page[0].innerHTML}, function(event) { + can.page.Modify(can, sub._target, {style: {background: document.body.style.background}}) + sub.ui = sub.page.Append(sub, sub._output, [{view: chat.PROJECT}, {view: chat.CONTENT}]) + sub.page.Modify(sub, sub._output, {style: {height: window.innerHeight-93}}) + sub.page.Modify(sub, sub._output, {style: {width: window.innerWidth-40}}) + + can.core.List(sub.list = list, function(page, index) { + can.onappend.item(can, html.ITEM, {name: page[0].innerHTML}, function(event) { can.onaction.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 "premenu": item = item.cloneNode(false); break - case "field": item = can.onappend.field(can, "story", can.base.Obj(data.meta), sub.ui.content).first; break + case chat.FIELD: item = can.onappend.field(can, chat.STORY, can.base.Obj(data.meta), sub.ui.content).first; break default: item = item.cloneNode(true) } - return can.core.CallFunc([can.onimport, data.type], [can, data, item]), item + return can.core.CallFunc([can.onimport, data.type], [sub, data, item, window.innerWidth-40]), item }), }]) - }), can.onmotion.hidden(can, sub.ui.project) - can.onaction.show(sub, 0) + }), can.onmotion.hidden(can, sub.ui.project), can.onaction.show(sub, 0) - sub.Status("from", can.base.Time(null, "%H:%M:%S")) + sub.onappend._status(sub, ["page", "from", "cost"]), sub.Status("from", can.base.Time()) var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date() sub.Status("cost", can.base.Duration(now-from)) }) @@ -216,13 +183,13 @@ Volcanos("onaction", {help: "控件交互", list: [], can.onengine.signal(can, "keymap.focus", can.request(event, {cb: null})) }, - show: function(sub, which) { sub.page.Modify(sub, sub.ui.content, {className: "content"}) + show: function(sub, which) { sub.page.Modify(sub, sub.ui.content, {className: chat.CONTENT}) sub.page.Select(sub, sub.ui.content, "div.page", function(page, index) { if (index == which || page == which) { sub.page.Select(sub, page, "h1,h2,h3", function(item) { sub.Action("菜单", item.innerHTML) }) sub.onmotion.select(sub, sub.ui.project, "div.item", index) - sub.page.ClassList.add(sub, page, "select") sub.Status("page", index+1+ice.PS+sub.list.length) + sub.page.ClassList.add(sub, page, "select") } else { sub.page.ClassList.del(sub, page, "select") } diff --git a/plugin/story/pie.js b/plugin/story/pie.js index ee538be3..416d940a 100644 --- a/plugin/story/pie.js +++ b/plugin/story/pie.js @@ -16,17 +16,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, _draw: function(can, msg, field, x, y, r, margin, which) { - function join(list) { - for (var i = 0; i < list.length; i++) { list[i] = list[i].join(ice.SP) } - return list.join(ice.FS) - } function pos(x, y, r, angle) { angle -= 90 return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)] } function pie(x, y, r, begin, span, color, cb) { can.onimport.draw({}, can, {shape: "path", style: { - "stroke-width": 1, stroke: color, fill: color, d: join([ - ["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0 0 1"].concat(pos(x, y, r, begin+span)), ["Z"] - ]), + "stroke-width": 1, stroke: color, fill: color, d: can.base.joins([ + ["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"] + ], ice.SP, ice.FS), }, onmouseenter: function(event) { can.base.isFunc(cb) && cb(event) } }) } diff --git a/plugin/story/spide.js b/plugin/story/spide.js index fd1bae77..47d84612 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -1,4 +1,5 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can.misc.Log("what------", can.Conf()) can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) if (msg.Length() == 0) { return } diff --git a/proto.js b/proto.js index 8839140d..9ecc04ab 100644 --- a/proto.js +++ b/proto.js @@ -177,7 +177,7 @@ var html = { INPUT: "input", INPUT_ARGS: ".args", TEXT: "text", TEXTAREA: "textarea", SELECT: "select", BUTTON: "button", FORM: "form", FILE: "file", SPACE: "space", CLICK: "click", SUBMIT: "submit", CANCEL: "cancel", DIV: "div", IMG: "img", CODE: "code", SPAN: "span", VIDEO: "video", - TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", + TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", A: "a", LABEL: "label", INNER: "inner", TITLE: "title", CLASS: "class", BLOCK: "block", NONE: "none",