1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 08:48:06 +08:00
volcanos/plugin/wiki/word.js
2020-03-07 11:57:24 +08:00

315 lines
15 KiB
JavaScript

Volcanos("onimport", {help: "导入数据", list: [],
init: function(can, msg, cb, output, action, option) {output.innerHTML = "";
if (msg.Option("_display") == "table") {
// 文件目录
can.page.AppendTable(can, output, msg, msg.append, function(event, value, key, index, tr, td) {
can.Export(event, value, key)
})
return typeof cb == "function" && cb(msg);
}
output.innerHTML = msg.Result()
can.page.Select(can, output, ".story", function(item) {var data = item.dataset
item.oncontextmenu = function(event) {
can.user.carte(event, shy("组件菜单", can.ondetail, can.ondetail.list, function(event, key, meta) {
var cb = meta[key] || can.onchoice[key] || can.onaction[key]; typeof cb == "function" && cb(event, can, data, key, item);
}));
event.stopPropagation(), event.preventDefault();
}
switch (item.tagName) {
case "FIELDSET":
can.Plugin(can, data.name, JSON.parse(data.meta||"{}"), function(event, cmds, cb, silent) {
can.run(event, ["action", "story", data.type, data.name, data.text].concat(cmds), cb, true)
}, item, function(sub) {
})
break
default:
var figure = can.onfigure[data.type||item.tagName]
figure && figure.init && figure.init({}, can, msg, "init", item)
}
})
return typeof cb == "function" && cb(msg)
},
}, ["/plugin/wiki/word.css"])
Volcanos("onfigure", {help: "图形绘制", list: [],
_spawn: function(sup, can) {can.sup = sup},
_swell: function(can, sub) {},
_begin: function(can) {},
_start: function(can) {},
_close: function(can) {},
premenu: {
init: function(event, can, value, cmd, target) {
can.page.Append(can, target, can.page.Select(can, can.target, "h1.story,h2.story,h3.story", function(item) {var data = item.dataset;
return {text: [item.innerHTML, "li"], onclick: function(event) {
item.scrollIntoView();
}};
}))
},
save: function(event, can, value, cmd, target) {return "premenu"},
},
endmenu: {
init: function(event, can, value, cmd, target) {},
save: function(event, can, value, cmd, target) {return "endmenu"},
},
h1: {
push: function(event, can, value) {
return [{view: ["story", "h1", value.text], dataset: {type: "title", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'title "' + value.replace(data.name+" ", "") + '"': ""
},
},
h2: {
push: function(event, can, value) {
return [{view: ["story", "h2", value.text], dataset: {type: "chapter", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'chapter "' + value.replace(data.name+" ", "") + '"': ""
},
},
h3: {
push: function(event, can, value) {
return [{view: ["story", "h3", value.text], dataset: {type: "section", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'section "' + value.replace(data.name+" ", "") + '"': ""
},
},
brief: {
push: function(event, can, value) {
return [{view: ["story", "p", value.text], dataset: {type: "brief", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'brief "'+data.name+'" `' + value + '`': ""
},
},
refer: {
push: function(event, can, value, cmd, target) {
return [{view: ["story", "ul"], dataset: {type: "refer", name: value.name, text: value.text}, list: can.core.List(value.text.split("\n"), function(line) {
return {type: "li", inner: line}
})}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'refer "'+data.name+'" `\n' + can.page.Select(can, target, "li", function(item) {
return item.innerHTML.replace(": ", " ")
}).join("\n") + '\n`': ""
},
},
spark: {
push: function(event, can, value) {
return [{view: ["story", "p", value.text], dataset: {type: "spark", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'spark "'+data.name+'" `' + value + '`': "spark"
},
},
local: {
push: function(event, can, value) {
return [{view: ["story", "div", value.text], dataset: {type: "local", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'local "'+data.name+'" '+' `' + data.text + '`': ""
},
},
shell: {
push: function(event, can, value) {
return [{view: ["story", "code", value.text], dataset: {type: "shell", name: value.name, dir: "./", text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'shell "'+data.name+'" '+'"'+data.dir+'"' +' `' + data.text + '`': ""
},
},
field: {
push: function(event, can, value) {
return [{view: ["story", "code", value.text], dataset: {type: "field", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'field "'+data.name+'" `'+data.text+'`': ""
},
},
order: {
push: function(event, can, value) {
return [{view: ["story", "ul"], dataset: {type: "order", name: value.name, text: value.text}, list: can.core.List(value.text.split("\n"), function(line) {
return {type: "li", inner: line}
})}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'order "'+data.name+'" `\n' + can.page.Select(can, target, "li", function(item) {
return item.innerHTML
}).join("\n") + '\n`': ""
},
},
table: {
data: {menu: ["追加行", "追加列", "删除行", "删除列"]},
push: function(event, can, value) {
return [{view: ["story", "table"], dataset: {type: "table", name: value.name, text: value.text}, list: can.core.List(value.text.split("\n"), function(line, index) {
return {type: "tr", list: can.core.List(line.split(" "), function(word) {
return {type: index==0? "th": "td", inner: word}
})}
})}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'table "'+data.name+'" `\n' + can.page.Select(can, target, "tr", function(tr) {
return can.page.Select(can, tr, "th,td", function(td) {
return td.innerHTML
}).join(" ")
}).join("\n") + '\n`': ""
},
},
stack: {
init: function(event, can, value, cmd, target) {var data = target.dataset;
can.page.Select(can, target, "div.stack", function(stack) {var data = stack.dataset||{};
function fold(stack) {
stack.nextSibling && (stack.nextSibling.style.display = "none")
can.page.Select(can, stack, "span.state", function(state) {
if (state.innerText == "o") {return}
can.page.ClassList.add(can, stack, "fold")
can.page.ClassList.del(can, stack, "span")
state.innerText = ">"
})
}
function span(stack) {
stack.nextSibling && (stack.nextSibling.style.display = "")
can.page.Select(can, stack, "span.state", function(state) {
if (state.innerText == "o") {return}
can.page.ClassList.add(can, stack, "span")
can.page.ClassList.del(can, stack, "fold")
state.innerText = "v"
})
}
function mark(stack, color) {
stack.style.background = color;
stack.style.color = color == ""? "": "white";
}
stack.onclick = function(event) {stack.nextSibling && (stack.nextSibling.style.display == "none"? span(stack): fold(stack))}
stack.oncontextmenu = function(event) {var detail = can.feature.detail || can.ondetail.list, target = event.target;
can.user.carte(event, shy("", can.ondetail, ["全部折叠", "全部展开", "标记颜色", "清除颜色", "red", "green", "blue"], function(event, cmd, meta) {var cb = meta[cmd];
switch (cmd) {
case "red":
case "green":
case "blue":
mark(target, cmd)
break
case "标记颜色":
can.user.prompt("请输入颜色:", function(color) {
mark(target, color)
})
break
case "清除颜色":
mark(target, "")
break
case "全部折叠":
fold(stack), can.page.Select(can, stack.nextSibling, "div.stack", fold)
break
case "全部展开":
span(stack), can.page.Select(can, stack.nextSibling, "div.stack", span)
break
}
}))
}
})
},
push: function(event, can, value) {
return [{view: ["story", "div", value.text], dataset: {type: "stack", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'stack "'+data.name+'"' +' `' + data.text + '`': ""
},
},
label: {
init: function(event, can, value, cmd, target) {var data = target.dataset;
target.Value = function(key, value) {return value && target.setAttribute(key, value), target.getAttribute(key||"class")||target[key]&&target[key].baseVal&&target[key].baseVal.value||target[key]&&target[key].baseVal||""}
},
push: function(event, can, value) {
return [{view: ["story", "svg", value.text], dataset: {type: "label", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'label "'+data.name+'"' +' `\n' + data.text + '\n`' + " " + [
target.Value("font-size")||16, target.Value("stroke")||"yellow", target.Value("fill")||"blue",
].join(" "): ""
},
},
chain: {
init: function(event, can, value, cmd, target) {var data = target.dataset;
target.Value = function(key, value) {return value && target.setAttribute(key, value), target.getAttribute(key||"class")||target[key]&&target[key].baseVal&&target[key].baseVal.value||target[key]&&target[key].baseVal||""}
},
push: function(event, can, value) {
return [{view: ["story", "svg", value.text], dataset: {type: "chain", name: value.name, text: value.text}}]
},
save: function(event, can, value, cmd, target) {var data = target.dataset;
return value? 'chain "'+data.name+'"' +' `\n' + data.text + '\n`': ""
},
},
}, [], function(can) {var sup = can.sup
})
Volcanos("onaction", {help: "组件菜单", list: ["保存", "刷新", ["操作", "只读", "排序", "编辑"]],
"保存": function(event, can, value, cmd, target) {
can.run(event, ["action", cmd, can.Option("path"), can.Export(event, "", "file")], function(msg) {
can.user.toast("保存成功")
}, true)
},
"刷新": function(event, can, value, cmd, target) {
can.run(event)
},
"只读": function(event, can, value, cmd, target) {
can.page.Select(can, can.target, ".story", function(item) {
item.setAttribute("contenteditable", false)
item.setAttribute("draggable", false)
})
},
"排序": function(event, can, value, cmd, target) {
can.page.Select(can, can.target, ".story", function(item) {
item.setAttribute("draggable", true)
item.ondragstart = function(event) {can.drag = event.target}
item.ondragover = function(event) {event.preventDefault()}
item.ondrop = function(event) {event.preventDefault()
can.target.insertBefore(can.drag, item)
}
})
},
"编辑": function(event, can, value, cmd, target) {
can.page.Select(can, can.target, ".story", function(item) {
item.setAttribute("contenteditable", true)
})
},
})
Volcanos("onchoice", {help: "组件交互", list: ["保存", "刷新", "编辑", "排序"]})
Volcanos("ondetail", {help: "组件详情", list: ["保存", "刷新", "编辑", "复制", "插入", "删除"],
"复制": function(event, can, value, cmd, target) {
var clone = target.cloneNode(true);
target.parentNode.insertBefore(clone, target);
},
"插入": function(event, can, value, cmd, target) {
can.user.input(event, can, [["type", "spark", "refer", "brief", "h3", "h2", "h1",
"local", "shell", "field", "order", "table", "stack", "label", "chain"], "name", {name: "text", type: "textarea"}], function(event, value, form, list) {
var figure = can.onfigure[form.type]
var node = can.page.Append(can, target.parentNode, figure.push(event, can, form)).first;
figure && figure.init && figure.init(event, can, figure, "init", node);
target.parentNode.insertBefore(node, target);
})
},
"删除": function(event, can, value, cmd, target) {
can.page.Remove(can, target)
},
})
Volcanos("onexport", {help: "导出数据", list: [],
file: function(event, can, shy, cmd, target) {
return can.page.Select(can, target, ".story", function(story) {
var figure = can.onfigure[story.dataset.type] || can.onfigure[story.localName];
var text = figure && figure.save && figure.save(event, can, story.innerText||story.innerHTML, cmd, story) || story.innerText||story.innerHTML
return text
}).join("\n\n")
},
})