diff --git a/plugin/story/json.css b/plugin/story/json.css new file mode 100644 index 00000000..f213fbbb --- /dev/null +++ b/plugin/story/json.css @@ -0,0 +1,25 @@ +fieldset.plugin div.output div.item div.item { + border:solid 1px #0000000d; + border-left:dashed 1px lightblue; + margin-left:5px; padding-left:15px; + font-size:14px; font-family:monospace; + cursor:pointer; +} +fieldset.plugin div.output div.item div.item:hover { + border:solid 1px red; +} +fieldset.plugin div.output div.item span.nonce { + font-size:12px; font-family:auto; + color:lightblue; + cursor:pointer; +} +fieldset.plugin div.output div.item span.key { + color:yellow; +} +fieldset.plugin div.output div.item span.string { + color:magenta; +} +fieldset.plugin div.output div.item span.const { + color:cyan; +} + diff --git a/plugin/story/json.js b/plugin/story/json.js new file mode 100644 index 00000000..52b5d1de --- /dev/null +++ b/plugin/story/json.js @@ -0,0 +1,60 @@ +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) + can.onimport.show(can, can.base.Obj(msg.Result(), {}), target) + }, + show: function(can, data, target) { + function show(data, target, index, total) { var list + switch (typeof data) { + case lang.OBJECT: + if (data == null) { + return can.page.Append(can, list, [{text: "null"}]).item + return + } + function wrap(begin, end, add, cb) { + can.page.Append(can, target, [{text: begin}]) + add && can.page.Append(can, target, [{text: ["...", html.SPAN, "nonce"]}]), cb() + can.page.Append(can, target, [{text: end}]) + } + function toggle(list) { list && can.onmotion.toggle(can, list) } + function _item() { + list = list || can.page.Append(can, target, [{view: html.LIST}]).list + return can.page.Append(can, list, [{view: html.ITEM}]).item + } + + if (can.base.isArray(data)) { // 数组 + wrap("[", "]", data.length > 0, function() { can.core.List(data, function(value, index) { var item = _item() + show(value, item, index, data.length) + }) }) + } else { // 对象 + var length = can.core.Item(data).length, count = 0 + wrap("{", "}", length > 0, function() { can.core.Item(data, function(key, value) { var item = _item() + can.page.Append(can, item, [{text: ['"'+key+'"', html.SPAN, "key"], onclick: function(event) { toggle(sub) }}, {text: ': '}]) + var sub = show(value, item, count++, length) + }) }) + } + break + case lang.STRING: /* 字串 */ can.page.Append(can, target, [{text: ['"'+data+'"', html.SPAN, lang.STRING]}]); break + default: /* 其它 */ can.page.Append(can, target, [{text: [''+data+'', html.SPAN, "const"]}]) + } + (index < total-1) && can.page.Append(can, target, [{text: ice.FS}]) + return list + }; show(data, can.page.Append(can, target, [{view: html.ITEM}]).item, 0, 0) + }, +}, [""]) +Volcanos("onaction", {help: "组件菜单", list: ["展开", "折叠", "复制"], + "展开": function(event, can) { + can.page.Select(can, can._output, "div.list div.list", function(list) { + can.onmotion.hidden(can, list, true) + }) + }, + "折叠": function(event, can) { + can.page.Select(can, can._output, "div.list div.list", function(list) { + can.onmotion.hidden(can, list) + }) + }, + "复制": function(event, can) { + can.user.copy(event, can, can._msg.Result()) + }, +}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/plugin/story/pie.js b/plugin/story/pie.js index 5624c5d1..ee538be3 100644 --- a/plugin/story/pie.js +++ b/plugin/story/pie.js @@ -1,14 +1,16 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) can.onmotion.clear(can), can.onimport._show(can, msg) var r = 200, margin = 20; can.svg.Val(html.WIDTH, 2*(r+margin)), can.svg.Val(html.HEIGHT, 2*(r+margin)) - can.onimport._draw(can, msg, "value", r+margin, r+margin, r, margin, 0) + can._args = can.base.Copy({field: "value"}, can.base.ParseURL(can._display)) + can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, 0) can.onmotion.clear(can, can.ui.project), can.onappend.table(can, msg, null, can.ui.project) can.onmotion.hidden(can, can.ui.project, true) can.page.Modify(can, can.ui.project, {style: {"max-width": 480}}) can.page.Select(can, can.ui.project, html.TR, function(tr, index) { can.page.Modify(can, tr, {onmouseenter: function(event) { - can.onmotion.clear(can, can.svg), can.onimport._draw(can, msg, "value", r+margin, r+margin, r, margin, index-1) + can.onmotion.clear(can, can.svg), can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, index-1) }}) }) }) diff --git a/proto.js b/proto.js index 8f6e8529..da0f5617 100644 --- a/proto.js +++ b/proto.js @@ -184,7 +184,7 @@ var html = { CLASS: "class", BLOCK: "block", NONE: "none", TITLE: "title", A: "a", LABEL: "label", INNER: "inner", STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace", - LIST: "list", ITEM: "item", MENU: "menu", + LIST: "list", ITEM: "item", MENU: "menu", NODE: "node", SUBMIT: "submit", CANCEL: "cancel", WSS: "wss", SVG: "svg", MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width",