diff --git a/.gitignore b/.gitignore index 1377554e..bf9dfdce 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.swp +.DS_Store diff --git a/chrome/chrome.html b/chrome/chrome.html index e4b1dbd9..4ea6fceb 100644 --- a/chrome/chrome.html +++ b/chrome/chrome.html @@ -6,7 +6,7 @@
- + diff --git a/chrome/chrome.js b/chrome/chrome.js index c1ba12e4..57388532 100644 --- a/chrome/chrome.js +++ b/chrome/chrome.js @@ -114,15 +114,7 @@ var can = Volcanos("chrome", { can.run = function(event, cmd, cb, silent) { var msg = can.request(event) can.misc.Run(event, can, {names: "code/chrome/crx"}, cmd, cb) }, - - chrome.history.onVisited.addListener(function(item) { - can.run({}, ["history", item.id, item.url, item.title], function(msg) { - can.user.toast(item.url, item.title) - }) - }) - return - - can.misc.WSS(can, "ws://localhost:9020/space/", {node: "chrome", name: chrome.runtime.id}, function(event, msg) { + can.misc.WSS(can, "ws://localhost:9020/space/", {name: "chrome", type: "chrome"}, function(event, msg) { if (msg.Option("_handle")) {return can.user.toast(msg.result.join(""))} can.user.toast(msg.detail.join(" ")) @@ -136,10 +128,14 @@ var can = Volcanos("chrome", { msg.Reply(msg) }, function() {can.user.toast("wss connect", "iceberg")}) - can.run(can, {cmd: ["login", can.sid||""]}, function(msg) { - can.sid = msg.Result() + chrome.history.onVisited.addListener(function(item) { + can.run({}, ["history", item.id, item.title, item.url], function(msg) { + can.user.toast(item.url, item.title) + }) }) + return + chrome.bookmarks.onCreated.addListener(function(id, item) { chrome.bookmarks.get(item.parentId, function(root) { can.run(can, {cmd: ["bookmark", item.id, item.url, item.title, root[0].title]}, function(msg) { diff --git a/frame.js b/frame.js index 14fd71dd..64bb389d 100644 --- a/frame.js +++ b/frame.js @@ -2,6 +2,9 @@ // FMS: a fieldset manager system Volcanos("onengine", { _init: function(can, meta, list, cb, target) { + can.run = function(event, cmds, cb) { + return (can.onengine[cmds[0]]||can.onengine[meta.main.engine])(event, can, can.request(event), can, cmds, cb) + } can.core.Next(meta.panes, function(item, next) { can.onappend._init(can, item, meta.libs.concat(item.list), function(pane) { pane.Conf(item), pane.run = function(event, cmds, cb) { @@ -28,9 +31,11 @@ Volcanos("onengine", { _init: function(can, meta, list, cb, target) { can.onengine && getRiver(can.onengine.river) // 应用入口 + can.onappend.daemon(can, can.user.title()) can.user.title(can.user.Search(can, "title")) var pane = can[meta.main.name], msg = can.request({}); pane.onaction && pane.onaction._init(pane, msg, msg.option||[], cb, target); + }) }, target) }); }, @@ -229,9 +234,9 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met var table = Volcanos(display, { _help: display, _follow: can._follow+"."+meta.name+"."+display, _target: output, Option: sub.Option, Action: sub.Action, Status: sub.Status, _option: option, _action: action, _output: output, - }, Volcanos.meta.libs.concat(["/frame.js", display]), function(table) { table.Conf(sub.Conf()) + }, Volcanos.meta.libs.concat(["/frame.js", display]), function(table) { table.Conf(sub.Conf()), table._msg = msg table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function() {}, output) - table._msg = msg, table.run = function(event, cmds, cb, silent) { cmds = cmds || [] + table.run = function(event, cmds, cb, silent) { cmds = cmds || [] var last = sub._history[sub._history.length-1]; !can.core.Eq(last, cmds) && !silent && sub._history.push(cmds) return run(event, cmds, cb, silent) } @@ -549,6 +554,21 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met }}]); ui.input.focus(), ui.input.setSelectionRange(0, -1) }, + daemon: function(can, name) { + can.misc.WSS(can, "", {name: name, type: "chrome"}, function(event, msg) { + if (msg.Option("_handle")) {return can.onappend.toast(can, msg.result.join(""))} + + can.onappend.toast(can, msg.detail.join(" ")); switch (msg.detail[0]) { + case "pwd": msg.Echo("hello world"); break + default: + can.run(event, ["search"].concat(msg.detail), function(msg) { + msg.Reply(msg) + }); return + + msg.Reply(msg) + } + }, function() {can.user.toast("wss connect", "iceberg")}) + }, }, [], function(can) {}) Volcanos("onlayout", { _init: function(can, meta, list, cb, target) { var width = can._width, height = can._height; diff --git a/lib/misc.js b/lib/misc.js index 201b5352..4deb0136 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -82,7 +82,7 @@ var misc = Volcanos("misc", {help: "工具模块", delete(can._socket), setTimeout(function() { // 断线重连 - can.misc.WSS(can, url, args, cb, onerror, onclose, onopen) + can.misc.WSS(can, url, args, cb, onopen, onerror, onclose) }, 1000) }, can._socket.onerror = onerror || function() {if (!can._socket) {return} console.log("socket error") @@ -105,15 +105,18 @@ var misc = Volcanos("misc", {help: "工具模块", msg = (can.request||can.Event)(event, msg), msg.Reply = function() { // 回复命令 + delete(msg._can) + delete(msg._event) msg.Option("_handle", true) msg.Option("_target", msg.Option("_source")) - can.Log(["wss", order, "result"].concat(msg.result).concat([msg])) - delete(msg.event), can._socket.send(JSON.stringify(msg)) + console.log(["wss", order, "result"].concat(msg.result).concat([msg])) + can._socket.send(JSON.stringify(msg)) } try { // 执行命令 - can.Log(["wss", order].concat(msg.detail).concat([msg])) + // c + console.log(["wss", order].concat(msg.detail).concat([msg])) typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1)) } catch (e) { // 执行失败 diff --git a/pane/Header.js b/pane/Header.js index d603b1f8..94830852 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -1,5 +1,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { }, + demo: function(can, msg, cmd, cb) { + msg.Echo("hello demo world") + cb(msg) + }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) { function init() { diff --git a/plugin/local/wiki/feel.css b/plugin/local/wiki/feel.css new file mode 100644 index 00000000..972ef339 --- /dev/null +++ b/plugin/local/wiki/feel.css @@ -0,0 +1,9 @@ +fieldset.feel div.action { + clear:none; +} + +fieldset.feel div.output div.content { + max-height:200px; + overflow:auto; +} + diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index d48c44b9..290feeb2 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -1,157 +1,56 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb) { can._target.innerHTML = "", can.ui = can.page.Append(can, can._target, [ - {view: "content"}, {view: "display"}, + {view: "content"}, {view: "control"}, {view: "display"}, ]) + can.table = can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) { - return {text: [value, "td"], oncontextmenu: function(event) { - can.onappend.carte(can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) { - var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line) - }) - }, ondblclick: function(event) { - can.page.Modify(can, event.target, {contenteditable: true}) + return {text: [value, "td"], onclick: function(event) { + can.onimport.file(can, line.path) }} }) - can.core.List(msg.result, function(item) { - var ls = item.split("/") - var ls = ls[ls.length-1].split(".") - var ext = ls[ls.length-1].toLowerCase() - can.page.Append(can, can.ui.content, [can.onfigure[ext](can, item)]) - }) - }, - init: function(can, msg, cb, output, action, option) {output.innerHTML = ""; - if (!msg.append || msg.append.length == 0) {return} - - var list = msg.Table() - function view(index, width, auto, cb) {var item = list[can.page.Select(can, table, "tr")[index+1].dataset.index]; - function menu(event) {var target = event.target; - can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd]; - typeof cb == "function" && cb(event, can, item, index, "path", cmd, target); - })) - } - - var items = item.path.split("."); - switch (items[items.length-1]) { - case "png": - case "jpg": - case "JPG": - return {className: "preview", img: "/share/local/web.wiki.feel/"+item.path, width: width, oncontextmenu: menu} - case "MOV": - case "m4v": - default: - return - } + var list = msg.Table(), begin = 0, limit = 3; function page() { + can.ctrl.offset.innerHTML = begin+"-"+(begin+limit) + can.onimport.page(can, list, begin, limit) } - - var table = can.page.AppendTable(can, output, msg, msg.append); - - var begin = 0, limit = 3; - var rate = 1, width = 600; - var control = can.page.Append(can, output, [{view: ["control"], list: [ - {select: [["width", 100, 200, 400, 600, 800], function(event, value) {width = parseInt(value), page(begin, limit)}]}, - {select: [["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], function(event, value) {rate = value}]}, + can.ctrl = can.page.Append(can, can.ui.control, [ + {button: ["clear", function() { + can.ui.display.innerHTML = "" + }]}, + {select: [["height", 100, 200, 400, 600, 800], function(event, value) { + can.height = parseInt(value), page() + }]}, + {select: [["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], function(event, value) { + can.rate = value, page() + }]}, {button: ["prev", function() { - begin > 0 && (begin -= limit, page(begin, limit)); + begin > 0 && (begin -= limit, can.onimport.page(can, list, begin, limit)) }]}, {text: [begin+"-"+(begin+limit)], name: "offset"}, {button: ["next", function() { - begin < msg[msg.append[0]].length && (begin += limit, page(begin, limit)); + begin < msg[msg.append[0]].length && (begin += limit, page()) + }]}, + {select: [["limit", 1, 3, 6, 9, 12, 15], function(event, value) { + limit = parseInt(value), page() }]}, {text: [list.length]}, - {select: [["limit", 3, 6, 9, 12, 15], function(event, value) {limit = parseInt(value), page(begin, limit)}]}, - ]}]) - control.rate.value = rate - control.width.value = width + ]) - var preview = can.page.Append(can, output, [{view: ["preview"]}]).last - function page(begin, limit) { - control.offset.innerHTML = begin+"-"+(begin+limit); - can.page.Appends(can, preview, msg.Table(function(item, index) { - if (begin <= index && index < begin+limit) {return view(index, width, false, function(event) {var video = event.target; - switch (event.type) { - case "loadeddata": video.playbackRate = rate; break - case "timeupdate": video.playbackRate = rate; break - } - })} - })); - } - page(begin, limit); - - function show(index) {var item = list[can.page.Select(can, table, "tr")[index+1].dataset.index]; - var video = {}; - var timer = can.user.toast({text: "", list: [{view: "control", list: [ - {button: ["close", function(event) {video.pause(), timer.toast.Hide()}]}, - {select: [["width", 100, 200, 400, 600, 800], function(event, value) {timer.toast.Show(event, parseInt(value)+20), - width = value - timer.toast.preview.setAttribute("width", value) - // video.width = value - }]}, - {select: [["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], function(event, value) {rate = video.playbackRate = value}]}, - {button: ["prev", function(event) {show(index-1)}]}, - {text: index+"/"+list.length}, - {button: ["next", function(event) {show(index+1)}]}, - {type: "br"}, {text: item.path}, - {type: "br"}, {text: item.label}, - ]}].concat([view(index, 600, true, function(event) {video = event.target; - switch (event.type) { - case "loadeddata": video.playbackRate = rate; break - case "ended": show(index+1); break - } - })]), width: 600+20, height: 620, duration: -1}) - timer.toast.width.value = 600; - timer.toast.rate.value = rate; - } - - table.onclick = function(event) {switch (event.target.tagName) { - case "TD": - can.onimport.which(event, table, msg.append, function(index, key) { - var name = event.target.innerHTML.trim() - if (name.endsWith("/")) { - can.Option("name", name), can.run(event, [name]) - } else { - show(index); - } - }) - break - case "TH": - break - case "TR": - case "TABLE": - }} - table.oncontextmenu = function(event) {var target = event.target; - switch (event.target.tagName) { - case "TD": - can.onimport.which(event, table, msg.append, function(index, key) { - can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd]; - var id = msg.Ids(index); - var sub = can.Event(event); - msg.append.forEach(function(key) {sub.Option(key, msg[key][index].trim())}) - typeof cb == "function"? cb(event, can, msg, index, key, cmd, target): - // can.run(event, [id, typeof cb == "string"? cb: cmd, key, target.innerHTML], function(msg) { - can.run(event, ["action", typeof cb == "string"? cb: cmd, key, target.innerHTML], function(msg) { - can.onimport.init(can, msg, cb, output, option) - }, true) - })) - }) - event.stopPropagation() - event.preventDefault() - break - case "TH": - case "TR": - case "TABLE": - } - } - return typeof cb == "function" && cb(msg), table; + can.rate = can.ctrl.rate.value = 1 + limit = can.ctrl.limit.value = parseInt(msg.Option("limit"))||1 + can.height = can.ctrl.height.value = parseInt(msg.Option("height"))||400 + can.onimport.page(can, list, begin, limit) }, - which: function(event, table, list, cb) {if (event.target == table) {return cb(-1, "")} - can.page.Select(can, table, "tr", function(tr, index) {if (event.target == tr) {return cb(index-1, "")} - can.page.Select(can, tr, "th,td", function(td, order) { - if (event.target == td) {return cb(index-1, list[order])} - }) - }) + page: function(can, list, begin, limit) { can.ui.display.innerHTML = "" + for (var i = begin; i < begin+limit; i++) { can.onimport.file(can, list[i].path) } }, -}) - + file: function(can, item) { item = (can._msg.Option("prefix")||"")+"/"+item + var ls = item.split("/") + var ls = ls[ls.length-1].split(".") + var ext = ls[ls.length-1].toLowerCase() + can.page.Append(can, can.ui.display, [can.onfigure[ext](can, item)]) + }, +}, ["/plugin/local/wiki/feel.css"]) Volcanos("onfigure", {help: "组件菜单", list: [], image: function(can, path) { return {img: "/share/local/"+path} @@ -159,39 +58,27 @@ Volcanos("onfigure", {help: "组件菜单", list: [], jpg: function(can, path) { return can.onfigure.image(can, path) }, qrc: function(can, path) { return can.onfigure.image(can, path) }, - video: function(can, path) { - function cb(event) { + video: function(can, path) { var auto = true, loop = true, total = 0 + var p = location.href.startsWith("https")? "": "http://localhost:9020" + function cb(event) { console.log(event) } + return {className: "preview", type: "video", style: {height: can.height}, + data: {src: p+"/share/local/"+path, controls: "controls", autoplay: auto, loop: loop, playbackRate: can.rate}, + oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb, + onloadedmetadata: function(event) { total = event.timeStamp + event.target.currentTime = can._msg.currentTime || 0 + }, onloadeddata: cb, ontimeupdate: function(event) { + can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) + }, } - return {className: "preview", type: "video", width: width, oncontextmenu: menu, - onplay: cb, onpause: cb, - onloadedmetadata: cb, - onloadeddata: cb, - ontimeupdate: cb, - onended: cb, - data: {src: "/share/local/"+path, controls: "controls", autoplay: auto, loop: false, - }} }, - m4v: function(can, path) { return can.onfigure.image(can, path) }, + m4v: function(can, path) { return can.onfigure.video(can, path) }, }) -Volcanos("onaction", {help: "组件菜单", list: ["上传"], +Volcanos("onaction", {help: "组件菜单", list: ["", "上传"], "上传": function(event, can) { can.onappend.upload(can) }, }) -Volcanos("ondetail", {help: "组件详情", list: ["标签"], - "标签": function(event, can, msg, index, key, cmd, target) { - can.user.prompt("目标", function(kind) { - can.run(event, ["action", "标签", msg.path, kind], function() { - }, true) - }) +Volcanos("onexport", {help: "导出数据", list: ["当前行"], + position: function(can, index, total) { total = total || can.max + return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+"/"+parseInt(total) }, }) -Volcanos("onstatus", {help: "组件状态", list: ["begin", "width", "point", "which"], - "begin": function(event, can, value, cmd, target) {target.innerHTML = value? value.x+","+value.y: ""}, - "width": function(event, can, value, cmd, target) {target.innerHTML = value? value.width+","+value.height: ""}, - "point": function(event, can, value, cmd, target) {target.innerHTML = value.x+","+value.y}, - "which": function(event, can, value, cmd, target) {var figure = can.onfigure[value.tagName]; - target.innerHTML = figure? figure.show(event, can, value, target): value.tagName; - }, -}) -Volcanos("onexport", {help: "导出数据", list: []}) -