1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 08:48:06 +08:00
This commit is contained in:
shaoying 2020-06-23 09:30:54 +08:00
parent f3c7e1fe62
commit 4d6784cf8a
8 changed files with 103 additions and 183 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
*.swp
.DS_Store

View File

@ -6,7 +6,7 @@
</head>
<body>
<script src="/proto.js"></script>
<script src="/plugin/chrome/chrome.js"></script>
<script src="/chrome/chrome.js"></script>
</body>
<html>

View File

@ -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) {

View File

@ -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;

View File

@ -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) {
// 执行失败

View File

@ -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() {

View File

@ -0,0 +1,9 @@
fieldset.feel div.action {
clear:none;
}
fieldset.feel div.output div.content {
max-height:200px;
overflow:auto;
}

View File

@ -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: []})