1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

opt frame.js

This commit is contained in:
shaoying 2021-01-20 18:35:23 +08:00
parent 0f031c36ef
commit 7ffca63865
12 changed files with 155 additions and 166 deletions

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2019 小营长 Copyright (c) 2019 码神
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,4 +1,4 @@
# volcanos # volcanos
volcanos是一个前端框架通过模块化、集群化、自动化快速的创建、共享应用程序和数据。 volcanos是一个前端框架通过模块化、集群化、自动化快速的创建、共享应用程序和数据。

View File

@ -5,7 +5,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
pane.onaction && pane.onappend._action(pane, item.action||pane.onaction.list) pane.onaction && pane.onappend._action(pane, item.action||pane.onaction.list)
pane.Status = pane.Status || function(key, value) { pane.run({}, ["search", "Footer.onimport."+key, value]) } pane.Status = pane.Status || function(key, value) { pane.run({}, ["search", "Footer.onimport."+key, value]) }
pane.run = function(event, cmds, cb, silent) { var msg = pane.request(event); cmds = cmds || [] pane.run = function(event, cmds, cb) { var msg = pane.request(event); cmds = cmds || []
return (can.onengine[cmds[0]]||can.onengine[meta.main.engine]||can.onengine.remote)(event, can, msg, pane, cmds, cb) return (can.onengine[cmds[0]]||can.onengine[meta.main.engine]||can.onengine.remote)(event, can, msg, pane, cmds, cb)
}, can[item.name] = pane, next() }, can[item.name] = pane, next()
}, target) }, target)
@ -15,13 +15,6 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
pane.onaction._init(pane, msg, [], cb, pane._target) pane.onaction._init(pane, msg, [], cb, pane._target)
}) })
}, },
_daemon: function(can, name, cb) {
can.misc.WSS(can, {type: "chrome", name: name}, cb||function(event, msg, cmd, arg) {
msg && can.run(event, ["search"].concat(msg["detail"]||[]), function(msg) {
msg.Reply()
})
})
},
search: function(event, can, msg, pane, cmds, cb) { search: function(event, can, msg, pane, cmds, cb) {
var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split("."), function(value) { var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split("."), function(value) {
@ -39,10 +32,11 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
can.misc.Run(event, can, {names: pane._name}, cmds, cb) can.misc.Run(event, can, {names: pane._name}, cmds, cb)
pane.run(event, ["search", "Footer.onimport.ncmd"]) pane.run(event, ["search", "Footer.onimport.ncmd"])
}, engine: function(event, can, msg, pane, cmds, cb) { return false }, }, engine: function(event, can, msg, pane, cmds, cb) { return false },
listen: shy("事件回调", {}, [], function(can, name, cb) { listen: shy("事件回调", {}, [], function(can, name, cb) {
arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb)
}), }),
signal: shy("事件触发", function(can, name, msg) { signal: shy("事件触发", function(can, name, msg) { msg = msg || can.request()
can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.List(can.onengine.listen.meta[name], function(cb) {
can.core.CallFunc(cb, {msg: msg}) can.core.CallFunc(cb, {msg: msg})
}) })
@ -215,26 +209,26 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
var last = sub._history[sub._history.length-1]; !sub.core.Eq(last, cmds) && cmds[0] != "action" && !slient && sub._history.push(cmds) var last = sub._history[sub._history.length-1]; !sub.core.Eq(last, cmds) && cmds[0] != "action" && !slient && sub._history.push(cmds)
return cmds return cmds
}, },
}, list.concat(Volcanos.meta.volcano).concat(Volcanos.meta.libs), function(sub) { sub.Conf(meta) }, list.concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(sub) { sub.Conf(meta)
meta.feature = sub.base.Obj(meta.feature, {}) meta.feature = sub.base.Obj(meta.feature, {})
sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"") sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"")
typeof cb == "function" && cb(sub)
meta.inputs && sub.onappend._option(sub, meta, sub._option) meta.inputs && sub.onappend._option(sub, meta, sub._option)
typeof cb == "function" && cb(sub)
}) })
}, },
_option: function(can, meta, option) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []) _option: function(can, meta, option) { var index = -1, args = can.base.Obj(meta.args||meta.arg, [])
function add(item, next) { item._input != "button" && item.type != "button" && index++ function add(item, next) { item._input != "button" && item.type != "button" && index++
var input = Volcanos(item.name, {_follow: can._follow+"."+item.name, Volcanos(item.name, {_follow: can._follow+"."+item.name,
_option: can._option, _action: can._action, _output: can._output, _status: can._status, _option: can._option, _action: can._action, _output: can._output, _status: can._status,
_target: can.onappend.input(can, item, args[index], option), _target: can.onappend.input(can, item, args[index], option),
Option: can.Option, Action: can.Action, Status: can.Status,
CloneInput: function() { add(item)._target.focus() }, CloneInput: function() { add(item)._target.focus() },
CloneField: function() { can.Clone() }, CloneField: function() { can.Clone() },
Option: can.Option, Action: can.Action, Status: can.Status, }, [item.display||"/plugin/input.js"].concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(input) {
}, [item.display||"/plugin/input.js"].concat(Volcanos.meta.volcano).concat(Volcanos.meta.libs), function(input) {
input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) { input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) {
var sub = can.core.Value(can, "_outputs.-1") var sub = can.core.Value(can, "_outputs.-1")
if (cmds && cmds[0] == "action" && sub && sub.onaction[cmds[1]]) { if (sub && cmds && cmds[0] == "action" && sub.onaction[cmds[1]]) {
return sub.onaction[cmds[1]](event, sub) return sub.onaction[cmds[1]](event, sub)
} }
@ -243,37 +237,33 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
} }
return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent)
} }, can._inputs[item.name] = input
can.onappend.figure(input, item, item.value, input._target)
can.core.Item(input.onaction, function(key, value) { can.core.Item(input.onaction, function(key, value) {
key.indexOf("on") == 0 && (input._target[key] = input._target[key] || function(event) { key.indexOf("on") == 0 && !input._target[key] && (input._target[key] = function(event) {
value(event, input) value(event, input)
}) })
}) }), can.onappend.figure(input, item, item.value, input._target)
input.onaction && input.onaction._init && input.onaction._init(input, item, [], next, input._target) can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target])
}); return can._inputs[item.name] = input })
}; can.core.Next(can.base.Obj(meta.inputs, []), add) }; can.core.Next(can.base.Obj(meta.inputs, []), add)
}, },
_action: function(can, list, action, meta) { action = action || can._action, meta = meta || can.onaction _action: function(can, list, action, meta) { action = action || can._action, meta = meta || can.onaction
can.core.List(list, function(item) { can.onappend.input(can, can.core.List(list, function(item) { can.onappend.input(can, item == ""? /*空白*/ {type: "space"}:
item == ""? /*空白*/ {type: "space"}:
typeof item == "string"? /*按键*/ {type: "button", value: item, onclick: function(event) { typeof item == "string"? /*按键*/ {type: "button", value: item, onclick: function(event) {
var cb = meta[item] || meta["_engine"] || can.onkeymap && can.onkeymap._remote can.core.CallFunc(meta[item]||meta["_engine"], [event, can, item])
typeof cb == "function" && cb(event, can, item)
}}: item.length > 0? /*列表*/ {type: "select", name: item[0], values: item.slice(1), onchange: function(event) { }}: item.length > 0? /*列表*/ {type: "select", name: item[0], values: item.slice(1), onchange: function(event) {
var which = item[event.target.selectedIndex+1] var which = item[event.target.selectedIndex+1]
var cb = meta[which]; typeof cb == "function" && cb(event, can, which) can.core.CallFunc(meta[which], [event, can, which])
var cb = meta[item[0]]; typeof cb == "function" && cb(event, can, item[0], which) can.core.CallFunc(meta[item[0]], [event, can, item[0], which])
}}: item.input? /*文本*/ {type: "input", name: item.input[0], onkeydown: function(event) { }}: item.input? /*文本*/ {type: "input", name: item.input[0], onkeydown: function(event) {
item.input[1](event, can) can.core.CallFunc(item.input[1], [event, can])
}}: typeof item == "object" && /*其它*/ item }}: typeof item == "object" && /*其它*/ item
, "", action) , "", action)})
})
}, },
_output: function(can, meta, event, cmds, cb, silent) { _output: function(can, meta, event, cmds, cb, silent) {
var msg = can.request(event); can.page.Select(can, can._output, "div.control .args", function(item) { var msg = can.request(event); can.page.Select(can, can._output, "div.control .args", function(item) {
@ -285,14 +275,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
} }
var feature = can.Conf("feature") var feature = can.Conf("feature")
var input = cmds && feature && feature[cmds[1]]; if (cmds && cmds[0] == "action" && input) { var input = cmds && cmds[0] == "action" && feature && feature[cmds[1]]; if (input) {
can.user.input(event, can, input, function(ev, button, data, list) { can.user.input(event, can, input, function(ev, button, data, list) {
cmds = cmds.slice(0, 2), can.core.Item(data, function(key, value) { cmds = cmds.slice(0, 2), can.core.Item(data, function(key, value) {
key && value && cmds.push(key, value) key && value && cmds.push(key, value)
}) })
can.run(event, cmds, function(msg) { can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")
var sub = can.core.Value(can, "_outputs.-1")
if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return } if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return }
if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return } if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return }
typeof cb == "function" && cb(msg) typeof cb == "function" && cb(msg)
@ -302,8 +291,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
return return
} }
return can.run(event, cmds||[], function(msg) { return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")
var sub = can.core.Value(can, "_outputs.-1")
if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return } if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return }
if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return } if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return }
typeof cb == "function" && cb(msg) typeof cb == "function" && cb(msg)
@ -311,26 +299,27 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
var display = msg.Option("_display") || meta.display || meta.feature.display || "/plugin/table.js" var display = msg.Option("_display") || meta.display || meta.feature.display || "/plugin/table.js"
var output = Volcanos(display, {_follow: can._follow+"."+display, Volcanos(display, {_follow: can._follow+"."+display,
_option: can._option, _action: can._action, _output: can._output, _status: can._status, _option: can._option, _action: can._action, _output: can._output, _status: can._status,
_target: can._output, _fields: can._target, _target: can._output, _fields: can._target,
Option: can.Option, Action: can.Action, Status: can.Status, Option: can.Option, Action: can.Action, Status: can.Status,
}, [display].concat(Volcanos.meta.volcano).concat(Volcanos.meta.libs), function(table) { }, [display].concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(table) {
table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) { table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) {
if (cmds && cmds[0] == "action" && table.onaction[cmds[1]]) { if (cmds && cmds[0] == "action" && table.onaction[cmds[1]]) {
return table.onaction[cmds[1]](event, table) return table.onaction[cmds[1]](event, table)
} }
return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent)
}, table._msg = msg }, can._outputs.push(table), table._msg = msg
can.page.Modify(can, can._action, ""), can.page.Modify(can, can._status, "")
table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) { table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) {
table.onaction && table.onappend._action(table, msg._action||meta._action||table.onaction.list) table.onaction && table.onappend._action(table, msg._action||meta._action||table.onaction.list)
table.ondetail && table.onappend._detail(table, msg._detail||meta._detail||table.ondetail.list) table.ondetail && table.onappend._detail(table, msg._detail||meta._detail||table.ondetail.list)
table.onexport && table.onappend._status(table, msg._export||meta._export||table.onexport.list) table.onexport && table.onappend._status(table, msg._export||meta._export||table.onexport.list)
}, can._output) }, can._output)
}); can._outputs.push(output) })
}, silent) })
}, },
_detail: function(can, list, target) { target = target || can._output _detail: function(can, list, target) { target = target || can._output
list.length > 0 && (target.oncontextmenu = function(event) { list.length > 0 && (target.oncontextmenu = function(event) {
@ -355,18 +344,18 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
}]); return ui.first }]); return ui.first
}, },
tree: function(can, list, field, split, cb, target, node) { tree: function(can, list, field, split, cb, target, node) {
node = node || {}; can.core.List(list, function(item) { node = node || {"": target}; can.core.List(list, function(item) {
item[field] && can.core.List(item[field].split(split), function(value, index, array) { item[field] && can.core.List(item[field].split(split), function(value, index, array) {
var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split) var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split)
node[name] || (node[name] = can.page.Append(can, node[last]||target, [{view: ["item", "div", value+(index==array.length-1?"":split)], onclick: function(event) { node[name] || (node[name] = can.page.Append(can, node[last], [{view: ["item", "div", value+(index==array.length-1?"":split)], onclick: function(event) {
index < array.length - 1? can.onmotion.toggle(can, node[name]): typeof cb == "function" && cb(event, item) index < array.length - 1? can.onmotion.toggle(can, node[name]): typeof cb == "function" && cb(event, item)
}}, {view: "list", style: {display: "none"}}]).last) }}, {view: "list", style: {display: "none"}}]).last)
}) })
}); return node }); return node
}, },
field: function(can, type, item, target) { type = type || "input", item = item || {} field: function(can, type, item, target) { type = type || "input", item = item || {}
return can.page.Append(can, target, [{view: [(type||"")+" "+(item.name||"")+" "+(item.pos||""), "fieldset"], list: [ return can.page.Append(can, target||can._output, [{view: [(type||"")+" "+(item.name||"")+" "+(item.pos||""), "fieldset"], list: [
item.pos? undefined: {text: [(item.nick||item.name||"").split(" ")[0]+"("+(item.help||"").split(" ")[0]+")", "legend"]}, item.pos? undefined: {text: [(item.nick||item.name||"").split(" ")[0]+"("+(item.help||"").split(" ")[0]+")", "legend"]},
{view: ["option", "form"]}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]}, {view: ["option", "form"]}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]},
]}]) ]}])
@ -448,12 +437,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
meta.type = meta.type||"story" meta.type = meta.type||"story"
can.onappend._init(can, meta, ["/plugin/state.js"], function(sub) { can.onappend._init(can, meta, ["/plugin/state.js"], function(sub) {
meta.type == "story" && sub.page.Remove(sub, sub._legend)
typeof cb == "function" && cb(sub, meta) typeof cb == "function" && cb(sub, meta)
sub.page.Remove(sub, sub._legend)
}, target||can._output) }, target||can._output)
}, },
plugin: function(can, meta, cb, target) { meta = meta || {} plugin: function(can, meta, cb, target) { meta = meta || {}
can.run({}, ["action", "command", meta.index], function(msg) { msg.Table(function(value) { meta.inputs && meta.inputs.length > 0? can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cb, target):
can.run({}, ["action", "command", meta.index||item.ctx+"."+item.cmd], function(msg) { msg.Table(function(value) {
can.onappend._plugin(can, value, meta, cb, target) can.onappend._plugin(can, value, meta, cb, target)
}) }, true) }) }, true)
}, },
@ -557,8 +547,6 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, targe
target._keys = can.onkeypop._parse(event, can, "normal", target._keys||[], item) target._keys = can.onkeypop._parse(event, can, "normal", target._keys||[], item)
}) })
} }
target.onkeyup = function(event) {
}
}, },
_parse: function(event, can, mode, list, target) { list.push(event.key) _parse: function(event, can, mode, list, target) { list.push(event.key)
can.Status && can.Status("keys", list.join("")) can.Status && can.Status("keys", list.join(""))

View File

@ -87,7 +87,7 @@ Volcanos("core", {help: "核心模块",
var can = args["can"]||args[0], msg = args["msg"]||args[1] var can = args["can"]||args[0], msg = args["msg"]||args[1]
func = typeof func == "function"? func: typeof func == "string"? this.Value(mod||can, func): func = typeof func == "function"? func: typeof func == "string"? this.Value(mod||can, func):
typeof func == "object" && func.slice? this.Value(func, this.Keys(func.slice(1))): null typeof func == "object" && func.slice? this.Value(func[0], this.Keys(func.slice(1))): null
if (typeof func != "function") { return } if (typeof func != "function") { return }
var cb = args["cb"] var cb = args["cb"]

View File

@ -65,6 +65,9 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg
for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) } for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) }
return msg._hand = true, msg return msg._hand = true, msg
}, },
Length: function() {
return msg.append && msg.append[0] && msg[msg.append[0]] && msg[msg.append[0]].length || 0
},
} }
return msg return msg
}, },

View File

@ -1,21 +1,12 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "volcanos", "name": "volcanos", "version": "0.0.1",
"version": "0.0.1",
"background": {"page": "/publish/chrome/chrome.html"}, "background": {"page": "/publish/chrome/chrome.html"},
"browser_action": {"default_popup": "/publish/chrome/popup.html"}, "browser_action": {"default_popup": "/publish/chrome/popup.html"},
"content_scripts": [ "content_scripts": [{"matches": ["<all_urls>"],
{ "js": ["/proto.js", "/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js",
"matches": ["<all_urls>"],
"js": ["/proto.js",
"/lib/base.js",
"/lib/core.js",
"/lib/misc.js",
"/lib/page.js",
"/lib/user.js",
"/publish/chrome/contexts.js" "/publish/chrome/contexts.js"
] ]}
}
], ],
"permissions": [ "permissions": [
"tabs", "tabs",

View File

@ -26,9 +26,10 @@ fieldset.Action>div.action div.item.select {
background-color:#2e515f; background-color:#2e515f;
} }
fieldset.Action div.output {
}
fieldset.Action div.output.tabs { fieldset.Action div.output.tabs {
margin:28px 10px; margin-top:28px;
padding-bottom:28px;
} }
fieldset.Action div.output.flow fieldset.plugin { fieldset.Action div.output.flow fieldset.plugin {
float:left; float:left;

View File

@ -1,49 +1,38 @@
(function() { const RIVER = "river", STORM = "storm", ACTION = "action" Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) {
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { var river = can.Conf("river"), storm = can.Conf("storm")
var river = can.Conf(RIVER), storm = can.Conf(STORM) can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) {
can.onmotion.clear(can), can.core.Next(msg.Table(), function(value, next) { item.width = parseInt(can.Conf("width")), item.height = parseInt(can.Conf("height"))
value.feature = can.base.Obj(value.feature||value.meta||"{}", {}) item.feature = can.base.Obj(item.feature||item.meta)
value.inputs = can.base.Obj(value.inputs||value.list||"[]", []) item.inputs = can.base.Obj(item.inputs||item.list)
item.type = "plugin"
value.inputs.length == 0? can.run({}, ["action", "command", value.index || value.ctx+"."+value.cmd], function(msg) { can.onappend.plugin(can, item, function(sub, meta) {
value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) can.onimport._plugin(can, river, storm, sub, meta), next()
value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", []) })
can.onimport._plugin(can, target, river, storm, value), next()
}): (can.onimport._plugin(can, target, river, storm, value), next())
}) })
}, },
_plugin: function(can, target, river, storm, value) { value.name = value.name.split(" ")[0] _plugin: function(can, river, storm, sub, item) {
value.width = parseInt(can.Conf("width")), value.height = parseInt(can.Conf("height")) sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds || []
value.action = value.id || value.index || value.key+"."+value.name return can.run(event, [river, storm, item.id||item.index||item.key+"."+item.name].concat(cmds), function(msg) {
value.type = "plugin"
// 添加插件
can.onappend._init(can, value, ["/plugin/state.js"], function(plugin) {
plugin._option.dataset.id = value.action, value.target = plugin._target
plugin.run = function(event, cmds, cb, silent) { var msg = plugin.request(event); cmds = cmds || []
return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) {
typeof cb == "function" && cb(msg) typeof cb == "function" && cb(msg)
}, silent) })
} }, can._plugins = (can._plugins||[]).concat([sub])
can.page.Modify(can, plugin._target, {style: {"max-width": value.width}}) can.page.Modify(can, sub._target, {style: {"max-width": item.width}})
can.onengine.listen(can, "action.resize", function(width, height) { can.onengine.listen(can, "action.resize", function(width, height) {
can.page.Modify(can, plugin._target, {style: {"max-width": value.width = width}}) can.page.Modify(can, sub._target, {style: {"max-width": item.width = width}})
}) })
can._plugins = (can._plugins||[]).concat([plugin]) can.page.Append(can, can._action, [{view: ["item", "div", item.name], onclick: function(event) {
can.page.Append(can, can._action, [{view: ["item", "div", value.name], onclick: function(event) { can.onmotion.select(can, can._output, "fieldset.plugin", sub._target)
can.onmotion.select(can, can._output, "fieldset.plugin", value.target)
can.onmotion.select(can, can._action, "div.item", event.target) can.onmotion.select(can, can._action, "div.item", event.target)
}}]) }}])
}, target)
}, },
_share: function(can, msg, share, cb) { _share: function(can, msg, share) {
can.user.title(msg.Option("title"))
can.user.topic(can, can.user.Search(can, "topic")||msg.Option("topic")||"white") can.user.topic(can, can.user.Search(can, "topic")||msg.Option("topic")||"white")
can.Conf(RIVER, "_share"), can.Conf(STORM, share) can.user.title(can.user.Search(can, "title")||msg.Option("title"))
can.onimport._init(can, msg, [], cb, can._output) can.Conf("river", "_share"), can.Conf("storm", share)
can.onimport._init(can, msg)
}, },
}) })
Volcanos("onengine", {help: "解析引擎", list: [], Volcanos("onengine", {help: "解析引擎", list: [],
@ -69,66 +58,56 @@ Volcanos("onengine", {help: "解析引擎", list: [],
}) })
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
var share = can.user.Search(can, "share"); if (share) { var share = can.user.Search(can, "share"); if (share) {
can.run({}, ["_share", share], function(msg) { msg.append && msg[msg.append[0]]? can.onimport._share(can, msg, share, cb): can.run({}, ["_share", share], function(msg) { msg.Length()>0? can.onimport._share(can, msg, share):
can.onengine.engine({}, can, msg, can, [msg.Option("sess.river"), msg.Option("sess.storm")], function(msg) { can.onengine.engine({}, can, msg, can, [msg.Option("sess.river"), msg.Option("sess.storm")], function(msg) {
can.onimport._share(can, msg, share, cb) can.onimport._share(can, msg, share)
}) })
}) })
} }
can.onengine.listen(can, "storm.select", function(msg, river, storm) { can.onengine.listen(can, "storm.select", function(msg, river, storm) {
can.page.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._action, can._output.scrollTop+1) can.onaction._select(can, msg, river, storm)
can.page.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._output, can._output.scrollTop+1) })
can.Conf(RIVER, river), can.Conf(STORM, storm) // 转场
var position = can.page.Cache(river+"."+storm, can._action)
var position = can.page.Cache(river+"."+storm, can._output)
if (position) { can._output.scrollTo(0, position-1); return }
can.run({}, [river, storm], function(msg) { can.onengine.listen(can, "search", function(msg, word) {
if (msg.append && msg[msg.append[0]] && msg[msg.append[0]].length > 0) { if (word[0] == "*" || word[0] == "plugin") {
can.onimport._init(can, msg, list, cb, can._output) can.onexport.plugin(can, msg)
} else {
var msg = can.request({}, {river: river, storm: storm})
can.run(msg._event, ["search", "River.ondetail.添加工具"])
} }
}) })
})
can.run({}, ["search", "Header.onimport.menu", "action", can._target.ontouchstart = function(event) {
["布局", "默认布局", "流动布局", "网格布局", "标签布局", "自由布局"], can.onengine.signal(can, "action.touch", can.request(event))
], function(event, key) { }
can.core.CallFunc(can.onaction[key], {event: event, can: can, key: key})
})
can._target.ontouchstart = function(event) { can.onengine.signal(can, "action.touch", {}) }
can.Conf({width: can._output.offsetWidth-33, height: window.innerHeight}) can.Conf({width: can._output.offsetWidth-33, height: window.innerHeight})
can.onengine.listen(can, "resize", function(width, height) { can.Conf({width: width, height: height}) can.onengine.listen(can, "resize", function(width, height) { can.Conf({width: width, height: height})
can.onengine.signal(can, "action.resize", can.request({}, {width: width, height: height})) can.onengine.signal(can, "action.resize", can.request({}, {width: width, height: height}))
}) })
can.onengine.listen(can, "search", function(msg, word) { can.run({}, ["search", "Header.onimport.menu", "action",
if (word[0] != "*" && word[0] != "plugin") { return } ["布局", "默认布局", "流动布局", "网格布局", "标签布局", "自由布局"],
], function(event, key) {
can.core.CallFunc([can.onaction, key], {event: event, can: can, key: key})
})
},
_select: function(can, msg, river, storm) {
function key(name) { return can.Conf("river")+"."+can.Conf("storm")+"."+name}
can.page.Cache(key("action"), can._action, can._output.scrollTop+1)
can.page.Cache(key("output"), can._output, can._output.scrollTop+1)
var fields = (msg.Option("fields")||"pod,ctx,cmd,type,name,text").split(",") can.Conf("river", river), can.Conf("storm", storm) // 转场
can.page.Select(can, can._output, "fieldset.plugin>legend", function(item) { var position = can.page.Cache(key("output"), can._output)
if (item.innerHTML.indexOf(word[1]) == -1) { return } var position = can.page.Cache(key("action"), can._action)
if (position) { can._output.scrollTo(0, position-1); return }
can.core.List(fields, function(key) { can.run({}, [river, storm], function(msg) {
switch (key) { if (msg.Length() > 0) {
case "ctx": msg.Push(key, "web.chat"); break can.onimport._init(can, msg)
case "cmd": msg.Push(key, "action"); break } else {
case "type": msg.Push(key, "plugin"); break var msg = can.request({}, {river: river, storm: storm})
case "name": msg.Push(key, item.innerHTML); break can.run(msg._event, ["search", "River.ondetail.添加工具"])
case "text":
msg.Push(key, shy("跳转", function() {
var input = can.page.Select(can, item.parentNode, "input.args")[0]
input && input.focus()
})); break
default: msg.Push(key, "")
} }
}) })
})
})
}, },
"默认布局": function(event, can) { "默认布局": function(event, can) {
@ -161,5 +140,25 @@ Volcanos("onexport", {help: "导出数据", list: [],
item.dataset.args = JSON.stringify(list), cb(item, next) item.dataset.args = JSON.stringify(list), cb(item, next)
}) })
}, },
plugin: function(can, msg) {
var fields = (msg.Option("fields")||"pod,ctx,cmd,type,name,text").split(",")
can.page.Select(can, can._output, "fieldset.plugin>legend", function(item) {
if (item.innerHTML.indexOf(word[1]) == -1) { return }
can.core.List(fields, function(key) {
switch (key) {
case "ctx": msg.Push(key, "web.chat"); break
case "cmd": msg.Push(key, "action"); break
case "type": msg.Push(key, "plugin"); break
case "name": msg.Push(key, item.innerHTML); break
case "text":
msg.Push(key, shy("跳转", function() {
var input = can.page.Select(can, item.parentNode, "input.args")[0]
input && input.focus()
})); break
default: msg.Push(key, "")
}
})
})
},
}) })
})()

View File

@ -36,6 +36,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}]) }])
}) })
}, },
_daemon: function(can, name, cb) {
can.misc.WSS(can, {type: "chrome", name: name}, cb||function(event, msg, cmd, arg) {
msg && can.run(event, ["search"].concat(msg["detail"]||[]), function(msg) {
msg.Reply()
})
})
},
_state: function(can, msg, target) { _state: function(can, msg, target) {
can.core.List(can.Conf(STATE)||["time", USERNAME], function(item) { can.core.List(can.Conf(STATE)||["time", USERNAME], function(item) {
can.page.Append(can, target, [{view: ["state "+item, "div", can.Conf(item)], can.page.Append(can, target, [{view: ["state "+item, "div", can.Conf(item)],

View File

@ -149,7 +149,7 @@ Volcanos("onaction", {help: "控件交互", list: [],
// can.onimport.project(can, can.Option("path")) // can.onimport.project(can, can.Option("path"))
}) })
}, },
search: function(event, can) { searchShow: function(event, can) {
can.page.Toggle(can, can.ui.search, function() { can.page.Toggle(can, can.ui.search, function() {
// can.onaction.searchLine(event, can, "") // can.onaction.searchLine(event, can, "")
}) })
@ -259,6 +259,9 @@ Volcanos("onaction", {help: "控件交互", list: [],
can.onkeymap && can.onkeymap.selectLine(can, line, item) can.onkeymap && can.onkeymap.selectLine(can, line, item)
}) })
var pos = can.current.offset()-can.current.line.offsetTop
can.current.scroll(0, -pos)
}, },
searchLine: function(event, can, value) { value = value.trim() searchLine: function(event, can, value) { value = value.trim()
can.page.Modify(can, can.ui.search, {style: {display: ""}}) can.page.Modify(can, can.ui.search, {style: {display: ""}})
@ -273,8 +276,7 @@ Volcanos("onaction", {help: "控件交互", list: [],
value = value.replace("<", "&lt;").replace(">", "&gt;"), value = value.replace("./", "") value = value.replace("<", "&lt;").replace(">", "&gt;"), value = value.replace("./", "")
return {text: ["", "td"], list: [{text: [value, "div"]}], onclick: function(event) { return {text: ["", "td"], list: [{text: [value, "div"]}], onclick: function(event) {
line.line && can.onimport.tabview(can, can.Option("path"), line.file.replace("./", ""), parseInt(line.line), function() { line.line && can.onimport.tabview(can, can.Option("path"), line.file.replace("./", ""), parseInt(line.line), function() {
var pos = can.current.offset()-can.current.line.offsetTop can.onaction.selectLine(can, parseInt(line.line))
can.current.scroll(0, -pos)
}) })
}} }}
}, can.ui.tags) }, can.ui.tags)

View File

@ -47,6 +47,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _merge: function(can, sub)
}, },
}, ["/plugin/local/code/vimer.css"]) }, ["/plugin/local/code/vimer.css"])
Volcanos("onaction", {help: "控件交互", list: [], Volcanos("onaction", {help: "控件交互", list: [],
_engine: function(event, can, key, arg, cb) {
can.onkeymap._remote(event, can, key)
},
save: function(event, can) { save: function(event, can) {
var msg = can.request(event); msg.Option("content", can.onexport.content(can)) var msg = can.request(event); msg.Option("content", can.onexport.content(can))
can.run(event, ["action", "save", can.parse, can.Option("file"), can.Option("path")], function(msg) { can.run(event, ["action", "save", can.parse, can.Option("file"), can.Option("path")], function(msg) {

View File

@ -52,21 +52,16 @@ var Volcanos = shy("火山架", {libs: [], cache: {}}, [], function(name, can, l
return // 加载完成 return // 加载完成
} }
var source = !libs[0].endsWith("/") && (libs[0].indexOf(".") == -1? libs[0]+".js": libs[0]) || libs[0]
// 请求模块 // 请求模块
function next() { can._load(source, each), can.require(libs.slice(1), cb, each) } function next() { can._load(libs[0], each), can.require(libs.slice(1), cb, each) }
meta.cache[source]? next(): meta._load(source, next) meta.cache[libs[0]]? next(): meta._load(libs[0], next)
}, },
request: function(event, option) { event = event || {} request: function(event, option) { event = event || {}
event._msg = event._msg || can.misc.Message(event, can) event._msg = event._msg || can.misc.Message(event, can)
can.core.Item(option, event._msg.Option) can.core.Item(option, event._msg.Option)
return event._msg return event._msg
}, },
Conf: function(key, value) { return can.core.Value(can._conf, key, value) }, _conf: {},
Conf: function(key, value) {
return can.core.Value(can._conf, key, value)
}, _conf: {},
} }
if (_can_name) { if (_can_name) {