efront 4.17.0 → 4.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/#/345/233/275/351/231/205/345/214/226.yml +30 -0
- package/apps/kugou/home.less +0 -14
- package/apps/pivot/api.yml +7 -0
- package/apps/pivot/db/config.xht +37 -0
- package/apps/pivot/db/edit.xht +47 -0
- package/apps/pivot/db/list.xht +63 -0
- package/apps/pivot/home/welcome.html +8 -0
- package/apps/pivot/home/welcome.js +12 -1
- package/apps/pivot/home/welcome.less +3 -0
- package/apps/pivot/main.js +0 -3
- package/apps/pivot/wow/root.js +7 -10
- package/coms/basic/color.js +1 -0
- package/coms/basic/data.js +6 -4
- package/coms/basic/refilm_decode.js +14 -6
- package/coms/basic/submit_.js +12 -5
- package/coms/compile/Program.js +1 -1
- package/coms/compile/downLevel.js +4 -3
- package/coms/docs/markdown.js +5 -0
- package/coms/explorer/Explorer.js +2 -1
- package/coms/explorer/context.js +2 -0
- package/coms/explorer/edit.html +2 -1
- package/coms/explorer/edit.js +6 -4
- package/coms/frame/route.js +3 -3
- package/coms/kugou/parseSongsList.js +1 -1
- package/coms/reptile/readRequestAsJson.js +26 -0
- package/coms/zimoli/back.xht +22 -3
- package/coms/zimoli/button.js +12 -2
- package/coms/zimoli/confirm.js +3 -2
- package/coms/zimoli/confirm.less +1 -2
- package/coms/zimoli/field.html +2 -1
- package/coms/zimoli/field.js +4 -0
- package/coms/zimoli/getCursorPosition.js +21 -0
- package/coms/zimoli/model.js +97 -95
- package/coms/zimoli/on.js +9 -1
- package/coms/zimoli/progbar.xht +59 -0
- package/coms/zimoli/prompt.js +81 -35
- package/coms/zimoli/prompt.less +23 -3
- package/coms/zimoli/render.js +34 -20
- package/coms/zimoli/select.js +1 -1
- package/coms/zimoli/selectList.js +8 -6
- package/coms/zimoli/selectListEdit.html +1 -1
- package/coms/zimoli/selectListEdit.js +1 -0
- package/coms/zimoli/view.js +3 -0
- package/coms/zimoli/zimoli.js +6 -5
- package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +1 -1
- package/docs/mark.xht +8 -0
- package/package.json +1 -1
- package/public/efront.js +1 -1
- /package/coms/{zimoli → basic}/checkroles.js +0 -0
|
@@ -1,3 +1,33 @@
|
|
|
1
|
+
- zh-CN: $1已存在
|
|
2
|
+
en: $1 already exists
|
|
3
|
+
|
|
4
|
+
- zh-CN: $1不存在
|
|
5
|
+
en: $1 does not exist
|
|
6
|
+
|
|
7
|
+
- zh-CN: 数据不为空
|
|
8
|
+
en: The data is not empty
|
|
9
|
+
|
|
10
|
+
- zh-CN: 您没有权限访问此内容
|
|
11
|
+
en: You do not have permission to access this content
|
|
12
|
+
|
|
13
|
+
- zh-CN: 不存在名为$1的$2
|
|
14
|
+
en: There is no $2 named $1
|
|
15
|
+
|
|
16
|
+
- zh-CN: 请设置用户密码
|
|
17
|
+
en: Please set a user password
|
|
18
|
+
|
|
19
|
+
- zh-CN: 已存在名为$1的$2
|
|
20
|
+
en: There already exists a $2 named $1
|
|
21
|
+
|
|
22
|
+
- zh-CN: 文件夹名
|
|
23
|
+
en: Folder Name
|
|
24
|
+
|
|
25
|
+
- zh-CN: 请输入名称
|
|
26
|
+
en: Please enter a name
|
|
27
|
+
|
|
28
|
+
- zh-CN: 输入名称以确认删除
|
|
29
|
+
en: Enter name to confirm deletion
|
|
30
|
+
|
|
1
31
|
- zh-CN: 目标文件存在外部引用项$1
|
|
2
32
|
en: The target file has an external reference item of $1
|
|
3
33
|
|
package/apps/kugou/home.less
CHANGED
|
@@ -94,22 +94,8 @@
|
|
|
94
94
|
font-size: 16px;
|
|
95
95
|
width: auto;
|
|
96
96
|
background: inherit;
|
|
97
|
-
margin-bottom: -60px;
|
|
98
97
|
}
|
|
99
98
|
|
|
100
|
-
.player+body>& {
|
|
101
|
-
>* {
|
|
102
|
-
|
|
103
|
-
>.vbox,
|
|
104
|
-
:not(.vbox)>.vbox {
|
|
105
|
-
padding-bottom: 60px;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
transition: padding-bottom .2s ease-out;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
|
|
113
99
|
.search-box {
|
|
114
100
|
display: block;
|
|
115
101
|
position: absolute;
|
package/apps/pivot/api.yml
CHANGED
|
@@ -13,6 +13,13 @@
|
|
|
13
13
|
invoke: options ::invoke-:key?:params
|
|
14
14
|
version: options ::version
|
|
15
15
|
uptime: options ::uptime
|
|
16
|
+
status: options ::status
|
|
17
|
+
dball: get /
|
|
18
|
+
dbget: get /:id/
|
|
19
|
+
daadd: put /:dbid/
|
|
20
|
+
dbfind: get /:dbid/:last,:size
|
|
21
|
+
dbadd: put /:id
|
|
22
|
+
dbdel: delete /:id
|
|
16
23
|
count: options ::count
|
|
17
24
|
bootlog: options ::similar
|
|
18
25
|
link: options ::link
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<style>
|
|
2
|
+
& {
|
|
3
|
+
width: 100%;
|
|
4
|
+
height: 100%;
|
|
5
|
+
display: block;
|
|
6
|
+
position: relative;
|
|
7
|
+
padding-right: 0!important;
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.design {
|
|
12
|
+
list {
|
|
13
|
+
height: 100%;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
list,
|
|
17
|
+
.options {
|
|
18
|
+
|
|
19
|
+
width: 600px;
|
|
20
|
+
margin: 0 auto;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
</style>
|
|
24
|
+
|
|
25
|
+
<div head>
|
|
26
|
+
<span -bind="db.name"></span>
|
|
27
|
+
</div>
|
|
28
|
+
<div body>
|
|
29
|
+
<div>权限</div>
|
|
30
|
+
<div>是否公开<swap -model="db.open"></swap></div>
|
|
31
|
+
</div>
|
|
32
|
+
<div foot>
|
|
33
|
+
<button>保存</button>
|
|
34
|
+
</div>
|
|
35
|
+
<script>
|
|
36
|
+
var [db] = arguments;
|
|
37
|
+
</script>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<div>
|
|
2
|
+
编辑数据 - <span -bind="db.name"></span>
|
|
3
|
+
<a @click="add">添加</a>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<div>
|
|
7
|
+
<lattice -src="m in items">
|
|
8
|
+
<div -bind="m.id"></div>
|
|
9
|
+
<div -bind="m.name"></div>
|
|
10
|
+
</lattice>
|
|
11
|
+
</div>
|
|
12
|
+
<script>
|
|
13
|
+
var [db] = arguments;
|
|
14
|
+
var a = button;
|
|
15
|
+
var add = function () {
|
|
16
|
+
var elem = document.createElement('jsoncode');
|
|
17
|
+
elem.type = 'json';
|
|
18
|
+
elem.contentEditable = true;
|
|
19
|
+
return prompt(茨菰$编辑框(elem), '输入JSON格式的数据', function (text) {
|
|
20
|
+
try {
|
|
21
|
+
JSON.parse(text);
|
|
22
|
+
return true;
|
|
23
|
+
} catch (e) {
|
|
24
|
+
console.log(text, e)
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}, {
|
|
28
|
+
wrap: true,
|
|
29
|
+
async submit(text) {
|
|
30
|
+
var d = JSON.parse(text);
|
|
31
|
+
if (db.id === '用户') {
|
|
32
|
+
if (!d.id && !d.password) {
|
|
33
|
+
return alert("缺少密码!");
|
|
34
|
+
}
|
|
35
|
+
if (d.password) {
|
|
36
|
+
delete d.password;
|
|
37
|
+
d.a = encode62.geta(d.password);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
data.from('daadd', { dbid: db.id, ...d })
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
var items = await data.from('dbfind', { dbid: db.id, size: 20 });
|
|
45
|
+
|
|
46
|
+
console.log(arguments)
|
|
47
|
+
</script>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<style>
|
|
2
|
+
& {
|
|
3
|
+
width: 100%;
|
|
4
|
+
overflow: hidden;
|
|
5
|
+
display: block;
|
|
6
|
+
padding: 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
[db] {
|
|
10
|
+
display: block;
|
|
11
|
+
border: 1px solid #000;
|
|
12
|
+
padding: 10px 6px;
|
|
13
|
+
|
|
14
|
+
h2 {
|
|
15
|
+
display: inline-block;
|
|
16
|
+
padding: 2px 6px;
|
|
17
|
+
font-size: 40px;
|
|
18
|
+
margin: 0;
|
|
19
|
+
color: #333;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
a {
|
|
23
|
+
margin-right: 6px;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
</style>
|
|
27
|
+
<lattice body a-src="db in dbs">
|
|
28
|
+
<div insert><a @click="adddb">添加</a></div>
|
|
29
|
+
<padding db>
|
|
30
|
+
<div>
|
|
31
|
+
<h2> ⩸ </h2>
|
|
32
|
+
<h2 -bind="db.name"></h2>
|
|
33
|
+
<a @click="go('/db/edit',db)">查看</a>
|
|
34
|
+
<a @click="go('/db/config',db)">配置</a>
|
|
35
|
+
<drop @click.singly.stop="deldb(db)"></drop>
|
|
36
|
+
</div>
|
|
37
|
+
</padding>
|
|
38
|
+
</lattice>
|
|
39
|
+
<script>
|
|
40
|
+
var dbs = [];
|
|
41
|
+
var a = button;
|
|
42
|
+
var load = async function name(params) {
|
|
43
|
+
dbs = await data.from("dball");
|
|
44
|
+
};
|
|
45
|
+
load();
|
|
46
|
+
var adddb = async function () {
|
|
47
|
+
var a = await prompt(i18n`请输入名称`, {
|
|
48
|
+
async submit(a) {
|
|
49
|
+
await data.from('dbadd', { id: a, name: a });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
await load();
|
|
53
|
+
};
|
|
54
|
+
var deldb = async function (db) {
|
|
55
|
+
var a = await prompt(i18n`输入名称以确认删除`, ["删除#danger", '取消'], a => a === db.name, {
|
|
56
|
+
async submit(v) {
|
|
57
|
+
await data.from('dbdel', { id: v });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
await load();
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
</script>
|
|
@@ -25,4 +25,12 @@
|
|
|
25
25
|
<padding>
|
|
26
26
|
启动时间 <span -text="filterTime(hrtime)"></span>
|
|
27
27
|
</padding>
|
|
28
|
+
</block>
|
|
29
|
+
<block>
|
|
30
|
+
<padding>
|
|
31
|
+
内存 <progbar danger:="memery[0]/memery[1]<.05" :current="memeryUsed" :total="memery[1]"></progbar>
|
|
32
|
+
<span style="color: #999;">
|
|
33
|
+
可用<span -bind="size(memery[0])"></span> / 总内存<span -bind="size(memery[1])"></span>
|
|
34
|
+
</span>
|
|
35
|
+
</padding>
|
|
28
36
|
</block>
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
function main() {
|
|
2
2
|
var page = div();
|
|
3
3
|
page.innerHTML = template;
|
|
4
|
-
|
|
4
|
+
var scope = {
|
|
5
5
|
status: [],
|
|
6
6
|
version: data.from("version"),
|
|
7
7
|
hrtime: data.from("uptime", a => new Date - a * 1000),
|
|
8
8
|
filterTime,
|
|
9
|
+
memeryUsed: 0,
|
|
10
|
+
memery: [0, 1],
|
|
11
|
+
size,
|
|
12
|
+
progbar,
|
|
9
13
|
async run(id) {
|
|
10
14
|
await new Promise(ok => setTimeout(ok, 2000));
|
|
11
15
|
var info = await data.from("run", {
|
|
@@ -19,6 +23,13 @@ function main() {
|
|
|
19
23
|
zimoli.switch();
|
|
20
24
|
zimoli();
|
|
21
25
|
}
|
|
26
|
+
};
|
|
27
|
+
renderWithDefaults(page, scope);
|
|
28
|
+
data.from("status").then(a => {
|
|
29
|
+
var [mr, mt] = a.memery;
|
|
30
|
+
scope.memeryUsed = mt - mr;
|
|
31
|
+
scope.memery = a.memery;
|
|
32
|
+
console.log('status')
|
|
22
33
|
});
|
|
23
34
|
return page;
|
|
24
35
|
}
|
package/apps/pivot/main.js
CHANGED
package/apps/pivot/wow/root.js
CHANGED
|
@@ -27,13 +27,14 @@ async function upload(f, dist, token) {
|
|
|
27
27
|
/**
|
|
28
28
|
* @type {XMLHttpRequest}
|
|
29
29
|
*/
|
|
30
|
-
var
|
|
31
|
-
var p = { percent: 0, pending: true, name: f.name, folder: dist, abort: xhr.abort.bind(xhr) };
|
|
30
|
+
var p = { percent: 0, pending: true, name: f.name, folder: dist };
|
|
32
31
|
dist = dist.replace(/^\/+|\/+$/g, '');
|
|
33
32
|
if (dist) p.url = api.base + dist + "/" + f.name;
|
|
34
33
|
else p.url = api.base + f.name;
|
|
35
34
|
this.data.push(p);
|
|
36
35
|
pending.push(p);
|
|
36
|
+
var xhr = cross(api.method, p.url, { authorization });
|
|
37
|
+
p.abort = xhr.abort.bind(xhr);
|
|
37
38
|
xhr.upload.onprogress = function ({ loaded, total }) {
|
|
38
39
|
p.percent = loaded / total;
|
|
39
40
|
render.refresh();
|
|
@@ -45,7 +46,6 @@ async function upload(f, dist, token) {
|
|
|
45
46
|
removeFromList(pending, p);
|
|
46
47
|
});
|
|
47
48
|
await xhr;
|
|
48
|
-
removeFromList(this.data, p);
|
|
49
49
|
removeFromList(pending, p);
|
|
50
50
|
}
|
|
51
51
|
return xhr;
|
|
@@ -74,9 +74,7 @@ class File {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
function main(path) {
|
|
77
|
-
var loaded = false;
|
|
78
77
|
var page = explorer$main();
|
|
79
|
-
|
|
80
78
|
extend(page.$scope, {
|
|
81
79
|
pathlist: path ? path.split('/') : [],
|
|
82
80
|
read(from, start, size) {
|
|
@@ -87,14 +85,13 @@ function main(path) {
|
|
|
87
85
|
xhr.send();
|
|
88
86
|
return xhr;
|
|
89
87
|
},
|
|
90
|
-
load(p) {
|
|
91
|
-
if (
|
|
92
|
-
location.href = "#/wow/root" + p
|
|
88
|
+
load(p, force) {
|
|
89
|
+
if (!force) {
|
|
90
|
+
location.href = "#/wow/root" + p;;
|
|
93
91
|
return { then() { } };
|
|
94
92
|
}
|
|
95
|
-
loaded = true;
|
|
96
93
|
var base = data.getInstance("base").base;
|
|
97
|
-
var p =
|
|
94
|
+
var p = this.pathlist.join('/').replace(/^\/+|\/+$/g, '');
|
|
98
95
|
var bp = p ? base + p + "/" : base;
|
|
99
96
|
p = p + '/';
|
|
100
97
|
return data.from("folder", { opt: 'list', path: encode62.timeencode(p) }, files => {
|
package/coms/basic/color.js
CHANGED
package/coms/basic/data.js
CHANGED
|
@@ -61,7 +61,9 @@ const formulaters = {
|
|
|
61
61
|
data = data.map(function (item) {
|
|
62
62
|
if (typeof item === 'string') {
|
|
63
63
|
const res = {};
|
|
64
|
-
|
|
64
|
+
if (/\s/.test(item)) item = item.split(/\s+/);
|
|
65
|
+
else item = item.split(',');
|
|
66
|
+
item.forEach((value, cx) => res[keys[cx]] = value);
|
|
65
67
|
return res;
|
|
66
68
|
}
|
|
67
69
|
return item;
|
|
@@ -385,7 +387,7 @@ function fixApi(api, href) {
|
|
|
385
387
|
};
|
|
386
388
|
api.transpile = getTranspile(api.url);
|
|
387
389
|
api.url = api.url.replace(/#[\s\S]*$/, '');
|
|
388
|
-
if (
|
|
390
|
+
if (!/^\w+?\:\/\//i.test(api.url)) {
|
|
389
391
|
if (href) {
|
|
390
392
|
var paramReg = /(?:\?([\s\S]*?))?(?:#([\s\S]*))?$/, extraSearch, extraHash, search, hash;
|
|
391
393
|
if (/[\?#]/.test(href)) {
|
|
@@ -416,7 +418,7 @@ function fixApi(api, href) {
|
|
|
416
418
|
}
|
|
417
419
|
api.method = api.method.replace(/^\w+/, a => a.toLowerCase());
|
|
418
420
|
}
|
|
419
|
-
const reg = /^(
|
|
421
|
+
const reg = /^(\w+\:\/\/|\.?\/)/i;
|
|
420
422
|
var ApiMap = function () { };
|
|
421
423
|
ApiMap.prototype = Object.create(null);
|
|
422
424
|
function createApiMap(data) {
|
|
@@ -457,7 +459,7 @@ function createApiMap(data) {
|
|
|
457
459
|
_headers = undefined;
|
|
458
460
|
}
|
|
459
461
|
if (!base) continue;
|
|
460
|
-
href =
|
|
462
|
+
href = reg.test(base) ? base : '';
|
|
461
463
|
var item1 = items1[key];
|
|
462
464
|
var items = Object.keys(item1).map(buildItem);
|
|
463
465
|
formulaters.string('id method url name comment', items).map(parseConfig).map(checkApi);
|
|
@@ -241,11 +241,6 @@ var getComment = function (piece) {
|
|
|
241
241
|
function spreadkey(name) {
|
|
242
242
|
if (/^\([\s\S]*\)$/.test(name) && /,/.test(name)) {
|
|
243
243
|
var [, name, rest_piece] = /^([\s\S]*?),([^\]]*)$/.exec(name.slice(1, name.length - 1));
|
|
244
|
-
if (rest_piece && !/=/.test(rest_piece)) {
|
|
245
|
-
var needs = { [name]: parseValue(rest_piece) };
|
|
246
|
-
} else {
|
|
247
|
-
var needs = scanNeeds(rest_piece);
|
|
248
|
-
}
|
|
249
244
|
}
|
|
250
245
|
if (/^\[[\s\S]*\]$/.test(name)) {
|
|
251
246
|
repeat = true;
|
|
@@ -258,6 +253,13 @@ function spreadkey(name) {
|
|
|
258
253
|
}
|
|
259
254
|
}
|
|
260
255
|
var [name, key, holder] = scanSlant(name, '/', 0, name.length + 1);
|
|
256
|
+
if (rest_piece) {
|
|
257
|
+
if (rest_piece && !/=/.test(rest_piece)) {
|
|
258
|
+
var needs = { [key || name]: parseValue(rest_piece) };
|
|
259
|
+
} else {
|
|
260
|
+
var needs = scanNeeds(rest_piece);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
261
263
|
return [name, key, needs, holder];
|
|
262
264
|
}
|
|
263
265
|
function parse(piece) {
|
|
@@ -290,6 +292,7 @@ function parse(piece) {
|
|
|
290
292
|
size, unit, ratio,
|
|
291
293
|
holder,
|
|
292
294
|
do: action,
|
|
295
|
+
editable,
|
|
293
296
|
needs, checks, repeat, endwith,
|
|
294
297
|
required, inlist, hidden, readonly,
|
|
295
298
|
delete_onempty, delete_onsubmit,
|
|
@@ -410,7 +413,11 @@ function parse(piece) {
|
|
|
410
413
|
type = type.slice(1);
|
|
411
414
|
}
|
|
412
415
|
if (typeof options === "string" && !/^[\$#]+\d+$/.test(options)) {
|
|
413
|
-
|
|
416
|
+
var editable = false;
|
|
417
|
+
if (/^[\+\-\*]|[\+\-\*]$/.test(options)) {
|
|
418
|
+
editable = true;
|
|
419
|
+
options = options.replace(/^[\+\-\*]|[\+\*\-]$/g, '');
|
|
420
|
+
}
|
|
414
421
|
var needUnfold = /^\[|\]$/.test(options);
|
|
415
422
|
options = options.replace(/^\[|\]$/g, '');
|
|
416
423
|
if (needUnfold || /,/.test(options)) options = scanSlant(options, ',');
|
|
@@ -427,6 +434,7 @@ function parse(piece) {
|
|
|
427
434
|
if (unit === type) unit = '';
|
|
428
435
|
var field = {
|
|
429
436
|
name, type, key, value, comment, options,
|
|
437
|
+
editable,
|
|
430
438
|
size, unit, ratio, holder,
|
|
431
439
|
needs, checks, repeat, endwith,
|
|
432
440
|
required, inlist, hidden, readonly,
|
package/coms/basic/submit_.js
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
|
-
function
|
|
1
|
+
var trimname = function (a) {
|
|
2
|
+
return a.name.replace(/^请?(输入|选择|填写)/, '')
|
|
3
|
+
};
|
|
4
|
+
function submit_() {
|
|
2
5
|
var params = {};
|
|
3
6
|
var inputs = [];
|
|
4
7
|
var select = [];
|
|
5
8
|
var checks = [];
|
|
6
9
|
var id = 0;
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
var data = Object.create(null);
|
|
11
|
+
var fieldsList = [];
|
|
12
|
+
for (var arg of arguments) {
|
|
13
|
+
if (Array.isArray(arg)) fieldsList.push(arg);
|
|
14
|
+
else Object.assign(data, arg);
|
|
15
|
+
}
|
|
16
|
+
for (var fields of fieldsList) for (var f of fields) {
|
|
17
|
+
if (!check(data, field.needs)) continue;
|
|
11
18
|
var error = valid(f, data);
|
|
12
19
|
if (error === "empty") {
|
|
13
20
|
if (f.options instanceof Array || /date|time|range|switch|swap|radio/i.test(f.type)) {
|
package/coms/compile/Program.js
CHANGED
|
@@ -867,7 +867,7 @@ class Program {
|
|
|
867
867
|
}
|
|
868
868
|
else if (last.type === STRAP) {
|
|
869
869
|
if (last.isend);
|
|
870
|
-
else scope.isObject = last.transive;
|
|
870
|
+
else scope.isObject = last.transive || last.text === 'default';
|
|
871
871
|
}
|
|
872
872
|
scope.brace = true;
|
|
873
873
|
scope.isExpress = queue.inExpress;
|
|
@@ -1391,21 +1391,22 @@ var killarg = function (head, body, _getname, setarg = true) {
|
|
|
1391
1391
|
var revar = function (body) {
|
|
1392
1392
|
for (var i = 0; i < body.length; i++) {
|
|
1393
1393
|
var o = body[i];
|
|
1394
|
+
|
|
1394
1395
|
if (o.type === STRAP) {
|
|
1395
1396
|
if (/^(const|let|var)$/.test(o.text)) {
|
|
1396
1397
|
var q = body;
|
|
1397
1398
|
if (!q) return;
|
|
1398
1399
|
splice(q, i, 1)
|
|
1399
1400
|
o = o.next;
|
|
1400
|
-
var s = i,
|
|
1401
|
+
var s = i, n = o;
|
|
1401
1402
|
if (o) do {
|
|
1402
|
-
|
|
1403
|
+
n = snapExpressFoot(n).next;
|
|
1403
1404
|
if (n && n.type === STRAP && /^(in|of)$/.test(n.text)) break;
|
|
1404
1405
|
if (n && n.text === '=') {
|
|
1405
1406
|
n = skipAssignment(n);
|
|
1406
1407
|
}
|
|
1407
1408
|
else {
|
|
1408
|
-
i = q.indexOf(
|
|
1409
|
+
i = q.indexOf(n, i);
|
|
1409
1410
|
var j = n ? q.indexOf(n, i) + 1 : q.length;
|
|
1410
1411
|
splice(q, i, j - i);
|
|
1411
1412
|
}
|
package/coms/docs/markdown.js
CHANGED
|
@@ -17,6 +17,10 @@ var h = function (text) {
|
|
|
17
17
|
var level = text.length - t2.length;
|
|
18
18
|
return new Element('h' + level, t2);
|
|
19
19
|
};
|
|
20
|
+
var block = function (text) {
|
|
21
|
+
text = text.replace(/^>\s*/, '');
|
|
22
|
+
if (text.length) return new Element("blockquote", text);
|
|
23
|
+
};
|
|
20
24
|
var p = function (text) {
|
|
21
25
|
if (text.length) return new Element("p", text);
|
|
22
26
|
};
|
|
@@ -82,6 +86,7 @@ function richtext(line) {
|
|
|
82
86
|
});
|
|
83
87
|
var a;
|
|
84
88
|
if (/^#/.test(line)) content.push(h(line));
|
|
89
|
+
else if (/^>/.test(line)) content.push(block(line));
|
|
85
90
|
else if (/^\*\s+/.test(line)) ul(line, tagIndent);
|
|
86
91
|
else if (/^\d+\.\s+/.test(line)) ol(line, tagIndent);
|
|
87
92
|
else if (/^\|/.test(line)) tr(line);
|
|
@@ -17,12 +17,13 @@ e.open = async function (p) {
|
|
|
17
17
|
if (!p.isfolder) return;
|
|
18
18
|
this.pathlist.push(p.name);
|
|
19
19
|
}
|
|
20
|
+
var forceRefresh = p == null;
|
|
20
21
|
p = "/" + this.pathlist.join("/").replace(/^\/+|\/+$/g, '');
|
|
21
22
|
var cutedMap = Object.create(null);
|
|
22
23
|
var selected = Object.create(null);
|
|
23
24
|
for (var s of this.selected) selected[s.url] = true;
|
|
24
25
|
for (var s of this.copyed) cutedMap[s.url] = s.cut;
|
|
25
|
-
var files = await this.load(p);
|
|
26
|
+
var files = await this.load(p, forceRefresh);
|
|
26
27
|
for (var f of files) {
|
|
27
28
|
if (cutedMap[f.url]) f.cut = true;
|
|
28
29
|
if (selected[f.url]) f.selected = true;
|
package/coms/explorer/context.js
CHANGED
|
@@ -43,6 +43,8 @@ var popupEdit = function ($scope, active) {
|
|
|
43
43
|
add: $scope.add,
|
|
44
44
|
name: active ? active.name : '',
|
|
45
45
|
};
|
|
46
|
+
if (active) params.isfolder = active.isfolder;
|
|
47
|
+
else params.isfolder = true;
|
|
46
48
|
|
|
47
49
|
zimoli.prepare('explorer$edit', function () {
|
|
48
50
|
var p = popup("#explorer$edit", params);
|
package/coms/explorer/edit.html
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<div head>
|
|
2
|
-
<span v-text="origin
|
|
2
|
+
<span v-text="origin?'${i18n`修改`}':'${i18n`添加`}'"></span>
|
|
3
|
+
<span>${hasOrigin?isFolder?i18n`文件夹名`:i18n`文件名`:i18n`文件夹`}</span>
|
|
3
4
|
</div>
|
|
4
5
|
<div body>
|
|
5
6
|
<field v-if="!f.readonly||!!data[f.key]" -repeat="f in fields" ng-src="[f,data]"></field>
|
package/coms/explorer/edit.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
var isFolder = false;
|
|
2
|
+
var hasOrigin = false;
|
|
1
3
|
|
|
2
|
-
|
|
3
|
-
function main({ path: root, rename, add, name, hasName }) {
|
|
4
|
+
function main({ path: root, rename, isfolder, add, name, hasName }) {
|
|
4
5
|
var fields = refilm`
|
|
5
6
|
&原始名称/origin read
|
|
6
7
|
输入新名称/name input
|
|
@@ -11,16 +12,17 @@ function main({ path: root, rename, add, name, hasName }) {
|
|
|
11
12
|
if (hasName(name)) return "命名冲突";
|
|
12
13
|
return explorer$filetip(name);
|
|
13
14
|
};
|
|
15
|
+
var origin = name.replace(/\/$/, '');
|
|
14
16
|
var a = view();
|
|
17
|
+
isFolder = isfolder;
|
|
18
|
+
hasOrigin = !!origin;
|
|
15
19
|
a.innerHTML = edit;
|
|
16
20
|
drag.on(a.firstChild, a);
|
|
17
|
-
var origin = name.replace(/\/$/, '');
|
|
18
21
|
renderWithDefaults(a, {
|
|
19
22
|
fields,
|
|
20
23
|
pathlist: root,
|
|
21
24
|
origin,
|
|
22
25
|
page: a,
|
|
23
|
-
isFolder: /\/$/.test(name),
|
|
24
26
|
data: { name: origin, origin },
|
|
25
27
|
remove() {
|
|
26
28
|
remove(a);
|
package/coms/frame/route.js
CHANGED
|
@@ -190,8 +190,8 @@
|
|
|
190
190
|
});
|
|
191
191
|
result.open = function (menu) {
|
|
192
192
|
if (!menu) {
|
|
193
|
-
|
|
194
|
-
|
|
193
|
+
if (result.active) return;
|
|
194
|
+
menu = result[0];
|
|
195
195
|
}
|
|
196
196
|
if (!menu.path) {
|
|
197
197
|
menu.closed = !menu.closed;
|
|
@@ -228,7 +228,7 @@
|
|
|
228
228
|
}
|
|
229
229
|
};
|
|
230
230
|
result.reload = function () {
|
|
231
|
-
|
|
231
|
+
zimoli();
|
|
232
232
|
return result;
|
|
233
233
|
};
|
|
234
234
|
result.from = result.fetch = function (url) {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
function readRequestAsJson(req, limit = 6000000) {
|
|
2
|
+
var total = 0;
|
|
3
|
+
var data = [];
|
|
4
|
+
return new Promise(function (ok, oh) {
|
|
5
|
+
req.on('data', function (buff) {
|
|
6
|
+
if (total > limit) return;
|
|
7
|
+
total += buff.length;
|
|
8
|
+
if (total > limit) {
|
|
9
|
+
oh(`数据量过大`);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
data.push(buff);
|
|
13
|
+
});
|
|
14
|
+
req.once('error', oh);
|
|
15
|
+
req.on('end', function () {
|
|
16
|
+
if (total > limit) return;
|
|
17
|
+
try {
|
|
18
|
+
var str = Buffer.concat(data).toString();
|
|
19
|
+
ok(JSON.parse(str));
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
oh(e);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
})
|
|
26
|
+
}
|