diff --git a/chrome/chrome.js b/chrome/chrome.js index 6a97df24..3b9a129a 100644 --- a/chrome/chrome.js +++ b/chrome/chrome.js @@ -21,6 +21,22 @@ var can = Volcanos("chrome", { return } + delete(msg._can) + delete(msg._event) + if (cmd[1] == "") { + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + cmd[1] = tabs[0].id + chrome.tabs.sendMessage(parseInt(cmd[1]), msg, function (res) { + msg.Copy(res), typeof cb == "function" && cb(msg) + }) + }) + } else { + chrome.tabs.sendMessage(parseInt(cmd[1]), msg, function (res) { + msg.Copy(res), typeof cb == "function" && cb(msg) + }) + } + return + // 新建标签 chrome.tabs.create({windowId: parseInt(cmd[0]), url: cmd[1], selected: false}, function() { can.chrome(msg, [cmd[0]], cb) @@ -44,13 +60,17 @@ var can = Volcanos("chrome", { 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(" ")) - switch (msg.detail[0]) { - case "space": can._share = msg.detail[2]; break - case "pwd": msg.Echo("hello world"); break - default: (can[msg.detail[0]]||can.chrome[msg.detail[0]])(msg, msg.detail.slice(1), function(msg) { - msg.Reply(msg) - }); return + // can.user.toast(msg.detail.join(" ")) + try { + switch (msg.detail[0]) { + case "space": can._share = msg.detail[2]; break + case "pwd": msg.Echo("hello world"); break + default: (can[msg.detail[0]]||can.chrome[msg.detail[0]])(msg, msg.detail.slice(1), function(msg) { + msg.Reply(msg) + }); return + } + } catch (e) { + can.user.toast(e) } msg.Reply(msg) }, function() {can.user.toast("wss connect", "iceberg")}) diff --git a/chrome/contexts.js b/chrome/contexts.js index dd60865b..8847c410 100644 --- a/chrome/contexts.js +++ b/chrome/contexts.js @@ -1,5 +1,23 @@ var can = Volcanos("chrome", { - video: function(can) { + spide: function(can, msg) { + can.page.Select(can, document.body, "video", function(item) { + var p = can.page.Select(can, document.body, "p.title")[0] + + var ls = item.src.split("?") + var ls = ls[0].split(".") + msg.Push("time", can.base.Time()) + msg.Push("type", "video") + msg.Push("name", (p && p.innerText || "video")+"."+ls[ls.length-1]) + msg.Push("text", item.src) + msg.Push("link", item.src) + }) + can.page.Select(can, document.body, "img", function(item) { + msg.Push("time", can.base.Time()) + msg.Push("type", "img") + msg.Push("name", "img") + msg.Push("text", item.src) + msg.Push("link", item.src) + }) }, }, [], function(can) { can.user = user @@ -8,6 +26,14 @@ var can = Volcanos("chrome", { can.core = core can.base = base + chrome.extension.onMessage.addListener( function (msg, sender, cb) { var action = can[msg.detail[3]||"spide"] + msg = can.request({}, msg) + delete(msg._event) + delete(msg._can) + typeof action == "function" && action(can, msg) || typeof cb == "function" && cb(msg) + }) + return + chrome.extension.onMessage.addListener( function (request, sender, sendResponse) { var title = can.page.Select(can, document.body, "p.title", function(item) { return item.innerText diff --git a/chrome/popup.html b/chrome/popup.html index 8d2f4311..36ca8697 100644 --- a/chrome/popup.html +++ b/chrome/popup.html @@ -4,7 +4,7 @@ -
+ diff --git a/chrome/spided.js b/chrome/spided.js new file mode 100644 index 00000000..c89ccc89 --- /dev/null +++ b/chrome/spided.js @@ -0,0 +1,28 @@ +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""; + can.ui = can.page.Append(can, can._target, [ + {view: ["content", "div"]}, {view: ["display", "pre"]}, + ]) + can.onappend.table(can, can.ui.content, "table", msg) + can.onappend.board(can, can.ui.display, "board", msg) + var refresh = msg.Option("_refresh") || can.Conf("feature")["_refresh"] + refresh && can.Timer(refresh, function() { + can.run({}) + }) + return typeof cb == "function" && cb(msg) + }, +}) +Volcanos("onaction", {help: "控件交互", list: [], + onclick: function(event, can) { + can.run(event, [], function() {}) + }, +}) +Volcanos("ondetail", {help: "控件交互", list: ["编辑", "删除"], + "编辑": function(event, can, key) { + console.log(key) + }, + "删除": function(event, can, key) { + console.log(key) + }, +}) + + diff --git a/frame.js b/frame.js index a1d9ca90..9e5e6a06 100644 --- a/frame.js +++ b/frame.js @@ -177,6 +177,14 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, {name: "tmux", help: "粘贴", index: "web.code.tmux.text"}, {name: "study", help: "学习", index: "web.wiki.word", args: ["usr/learning/study.shy"]}, ]}, + "chrome": {name: "chrome", action: [ + {name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: { + display: "/plugin/local/wiki/feel.js", + height: 200, limit: 3, + }}, + {name: "cached", help: "爬虫缓存", index: "web.code.chrome.cached", args: []}, + {name: "spided", help: "网页爬虫", index: "web.code.chrome.spided", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]}, + ]}, }}, "project": {name: "研发群", storm: { "studio": {name: "studio", action: [ @@ -187,9 +195,9 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, {name: "total", help: "代码统计", index: "web.code.git.total"}, ]}, "cli": {name: "cli", action: [ - {name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]}, - {name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]}, {name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]}, + {name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]}, + {name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]}, {name: "zsh", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/zsh/zsh.shy"]}, ]}, "web": {name: "web", action: [ diff --git a/pane/Action.js b/pane/Action.js index 2ff5a864..d7e467aa 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -66,6 +66,7 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, if (value.inputs.length == 0) { can.run({}, [river, storm, "action", "command", value.index], function(msg) { value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", []) + // value.feature = value.feature||can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) can.onaction.add_plugin(can, river, storm, value), next() }) diff --git a/pane/River.js b/pane/River.js index fdc51a3f..b039a7cc 100644 --- a/pane/River.js +++ b/pane/River.js @@ -2,7 +2,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, can.sublist = {} }, river: function(can) { var key = "river" - var main = can.user.Search(can, key) || "研发群" + can._main_river = can.user.Search(can, "river") || location.protocol == "chrome-extension:"? "product": "project" + can._main_storm = can.user.Search(can, "storm") || location.protocol == "chrome-extension:"? "chrome": "studio" + can.run({}, [], function(sup) { can._output.innerHTML = ""; var select; sup.Table(function(value, index, array) { var view = can.onappend.item(can, can._output, "item", value, function(event, item) { var msg = can.request(event, {_msg: sup}) can.onimport.storm(event, can, value.key) @@ -14,7 +16,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, can.onappend.menu(can, sup, value) }) - if (index == 0 || [value.key, value.name].indexOf(main) > -1) { select = view } + if (index == 0 || [value.key, value.name].indexOf(can._main_river) > -1) { select = view } }); select && select.click(), typeof cb == "function" && cb(sup) }) }, storm: function(event, can, river) { @@ -24,7 +26,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, can.run({}, [river, "storm"], function(msg) { var which = 0 list = can.page.Append(can, can._output, [{view: "sublist", list: msg.Table(function(value, index) { - river == can.user.Search(can, "river") && value.key == can.user.Search(can, "storm") && (which = index) + river == can._main_river && value.key == can._main_storm && (which = index) return {text: [value.name, "div", "subitem"], onclick: function(event) { var msg = can.request(event) msg.Option("river", can.Conf("river", river)) diff --git a/plugin/input.js b/plugin/input.js index 038f3e4d..9f4ea560 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -23,7 +23,7 @@ Volcanos("onaction", {help: "控件交互", list: [], }) } - var sub = can.sup && can.sup._outputs && can.sup._outputs[0] + var sub = can.sup && can.sup._outputs && can.sup._outputs[can.sup._outputs.length-1] var cb = sub && sub.onaction && sub.onaction[can.Conf("name")] if (typeof cb == "function") { return cb(event, sub, can.Conf("name")) } diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index b68733b2..8c11ee98 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -1,17 +1,29 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._target.innerHTML = "" + can.ui = can.page.Append(can, can._target, [ + {view: "project"}, + {view: "profile", style: {clear: "both"}}, + ]) + + can._msg = msg + can.path = can.request({}), can.list = [] + msg.Table(function(value) { value.path.endsWith("/")? can.path.Push(value): can.list.push(value) }) + can.onappend.table(can, can.ui.project, "table", can.path) + can.page.Modify(can, can._action, {style: {display: "none"}}) typeof cb == "function" && cb() + var feature = can.Conf("feature") || {} + can.begin = 0 can.Action("倍速", can.rate = 1) - can.Action("数量", can.limit = parseInt(msg.Option("limit"))||6) - can.Action("高度", can.height = parseInt(msg.Option("height"))||100) - can.Option("path") != "最近/" && can.onimport.page(can, can._msg.Table(), can.begin, can.limit) + can.Action("数量", can.limit = parseInt(feature["limit"]||msg.Option("limit"))||6) + can.Action("高度", can.height = parseInt(feature["height"]||msg.Option("height"))||100) + can.Option("path") != "最近/" && can.onimport.page(can, can.list, can.begin, can.limit) }, - page: function(can, list, begin, limit) { can._target.innerHTML = "" + page: function(can, list, begin, limit) { can.ui.profile.innerHTML = "" if (!list || list.length == 0) { return } for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path) } - can.Status("begin", begin), can.Status("limit", limit), can.Status("total", can._msg.Table().length) + can.Status("begin", begin), can.Status("limit", limit), can.Status("total", can.list.length) }, file: function(can, path) { can.Status("文件", path) var p = location.href.startsWith("http")? "": "http://localhost:9020" @@ -20,7 +32,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, var ls = path.split("/") var ls = ls[ls.length-1].split(".") var ext = ls[ls.length-1].toLowerCase() - ext && can.page.Append(can, can._target, [can.onfigure[ext](can, path)]) + ext && can.page.Append(can, can.ui.profile, [can.onfigure[ext](can, path)]) }, }, ["/plugin/local/wiki/feel.css"]) Volcanos("onfigure", {help: "组件菜单", list: [], @@ -40,10 +52,13 @@ Volcanos("onfigure", {help: "组件菜单", list: [], return {className: "preview", type: "video", style: {height: can.height}, data: {src: path, controls: "controls", autoplay: auto, loop: loop, playbackRate: can.rate}, oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb, + onmouseover: function(event) { + can.Status("文件", path) + }, onloadedmetadata: function(event) { total = event.timeStamp event.target.currentTime = can._msg.currentTime || 0 }, onloadeddata: cb, ontimeupdate: function(event) { - can.Status("position", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) + can.Status("文件") == path && can.Status("position", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) }, } }, @@ -75,19 +90,19 @@ Volcanos("onaction", {help: "组件菜单", list: [ can.page.Modify(can, can._action, {style: {display: can._action.style.display=="none"? "block": "none"}}) }, "上一页": function(event, can, key, value) { - can.begin > 0 && (can.begin -= can.limit, can.onimport.page(can, can._msg.Table(), can.begin, can.limit)) + can.begin > 0 && (can.begin -= can.limit, can.onimport.page(can, can.list, can.begin, can.limit)) }, "下一页": function(event, can, key, value) { - can.begin + can.limit < can._msg.Table().length && (can.begin += can.limit, can.onimport.page(can, can._msg.Table(), can.begin, can.limit)) + can.begin + can.limit < can.list.length && (can.begin += can.limit, can.onimport.page(can, can.list, can.begin, can.limit)) }, "数量": function(event, can, key, value) { - can.limit = parseInt(value), can.onimport.page(can, can._msg.Table(), can.begin, can.limit) + can.limit = parseInt(value), can.onimport.page(can, can.list, can.begin, can.limit) }, "高度": function(event, can, key, value) { - can.height = parseInt(value), can.onimport.page(can, can._msg.Table(), can.begin, can.limit) + can.height = parseInt(value), can.onimport.page(can, can.list, can.begin, can.limit) }, "倍速": function(event, can, key, value) { - can.rate = parseInt(value), can.onimport.page(can, can._msg.Table(), can.begin, can.limit) + can.rate = parseInt(value), can.onimport.page(can, can.list, can.begin, can.limit) }, }) Volcanos("onexport", {help: "导出数据", list: ["total", "begin", "limit", "position", "文件"], diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 8ace6fdb..980bf57f 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -1,3 +1,9 @@ +fieldset ul.story[data-type=premenu] { + cursor:pointer; +} +fieldset ul.story[data-type=premenu] li:hover { + background:cyan; +} fieldset li.H2 { font-weight:bold; font-size:20px; diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 91a6c680..6b5fd941 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -24,7 +24,12 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }, premenu: function(can, list, target) { var meta = can.base.Obj(list.meta) can.page.Select(can, can._output, "h2.story, h3.story", function(item) { - can.page.Append(can, target, [{text: [item.innerHTML, "li", item.tagName]}]) + var ui = can.page.Append(can, target, [{text: [item.innerHTML, "li", item.tagName], onclick: function() { + item.scrollIntoView() + }}]) + item.onclick = function(event) { + ui.first.scrollIntoView() + } }) }, field: function(can, item, target) { var meta = can.base.Obj(item.meta)