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.
Files changed (49) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +30 -0
  2. package/apps/kugou/home.less +0 -14
  3. package/apps/pivot/api.yml +7 -0
  4. package/apps/pivot/db/config.xht +37 -0
  5. package/apps/pivot/db/edit.xht +47 -0
  6. package/apps/pivot/db/list.xht +63 -0
  7. package/apps/pivot/home/welcome.html +8 -0
  8. package/apps/pivot/home/welcome.js +12 -1
  9. package/apps/pivot/home/welcome.less +3 -0
  10. package/apps/pivot/main.js +0 -3
  11. package/apps/pivot/wow/root.js +7 -10
  12. package/coms/basic/color.js +1 -0
  13. package/coms/basic/data.js +6 -4
  14. package/coms/basic/refilm_decode.js +14 -6
  15. package/coms/basic/submit_.js +12 -5
  16. package/coms/compile/Program.js +1 -1
  17. package/coms/compile/downLevel.js +4 -3
  18. package/coms/docs/markdown.js +5 -0
  19. package/coms/explorer/Explorer.js +2 -1
  20. package/coms/explorer/context.js +2 -0
  21. package/coms/explorer/edit.html +2 -1
  22. package/coms/explorer/edit.js +6 -4
  23. package/coms/frame/route.js +3 -3
  24. package/coms/kugou/parseSongsList.js +1 -1
  25. package/coms/reptile/readRequestAsJson.js +26 -0
  26. package/coms/zimoli/back.xht +22 -3
  27. package/coms/zimoli/button.js +12 -2
  28. package/coms/zimoli/confirm.js +3 -2
  29. package/coms/zimoli/confirm.less +1 -2
  30. package/coms/zimoli/field.html +2 -1
  31. package/coms/zimoli/field.js +4 -0
  32. package/coms/zimoli/getCursorPosition.js +21 -0
  33. package/coms/zimoli/model.js +97 -95
  34. package/coms/zimoli/on.js +9 -1
  35. package/coms/zimoli/progbar.xht +59 -0
  36. package/coms/zimoli/prompt.js +81 -35
  37. package/coms/zimoli/prompt.less +23 -3
  38. package/coms/zimoli/render.js +34 -20
  39. package/coms/zimoli/select.js +1 -1
  40. package/coms/zimoli/selectList.js +8 -6
  41. package/coms/zimoli/selectListEdit.html +1 -1
  42. package/coms/zimoli/selectListEdit.js +1 -0
  43. package/coms/zimoli/view.js +3 -0
  44. package/coms/zimoli/zimoli.js +6 -5
  45. package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +1 -1
  46. package/docs/mark.xht +8 -0
  47. package/package.json +1 -1
  48. package/public/efront.js +1 -1
  49. /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
 
@@ -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;
@@ -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
  启动时间&nbsp;&nbsp;<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
- renderWithDefaults(page, {
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
  }
@@ -1,6 +1,9 @@
1
1
  &{
2
2
  line-height: 28px;
3
3
  }
4
+ progbar{
5
+ width: 120px;
6
+ }
4
7
  btn{
5
8
  padding: 0 16px;
6
9
  vertical-align: top;
@@ -73,9 +73,6 @@ var layer = layer$glance({
73
73
  }),
74
74
  top: frame$top
75
75
  });
76
- on("append")(layer, function () {
77
- frame$route.open();
78
- });
79
76
  on("dragover")(document, function (event) {
80
77
  event.preventDefault();
81
78
  });
@@ -27,13 +27,14 @@ async function upload(f, dist, token) {
27
27
  /**
28
28
  * @type {XMLHttpRequest}
29
29
  */
30
- var xhr = cross(api.method, dist + f.name, { authorization });
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 (loaded) {
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 = p.replace(/^\/+|\/+$/g, '');
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 => {
@@ -500,6 +500,7 @@ extend(color, {
500
500
  angle,
501
501
  parse,
502
502
  equal,
503
+ format,
503
504
  stringify,
504
505
  pair(c, alpha) {
505
506
  return doWith(gray4, c, alpha);
@@ -61,7 +61,9 @@ const formulaters = {
61
61
  data = data.map(function (item) {
62
62
  if (typeof item === 'string') {
63
63
  const res = {};
64
- item.split(/(?:\s+|,)/).map((value, cx) => res[keys[cx]] = value);
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 (!reg.test(api.url)) {
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 = /^(https?\:\/\/|\.?\/)/i;
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 = /(https?\:)?|\.?\//i.test(base) ? base : '';
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
- options = is(options);
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,
@@ -1,13 +1,20 @@
1
- function submit(fields, data) {
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 trimname = function (a) {
8
- return a.name.replace(/^请?(输入|选择|填写)/, '')
9
- };
10
- for (var f of fields) {
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)) {
@@ -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, v = o;
1401
+ var s = i, n = o;
1401
1402
  if (o) do {
1402
- var n = snapExpressFoot(o).next;
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(o, i);
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
  }
@@ -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;
@@ -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);
@@ -1,5 +1,6 @@
1
1
  <div head>
2
- <span v-text="origin?${i18n`修改`}:${i18n`添加`}"></span>${i18n`文件夹`}
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>
@@ -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);
@@ -190,8 +190,8 @@
190
190
  });
191
191
  result.open = function (menu) {
192
192
  if (!menu) {
193
- menu = result.active || result[0];
194
- delete result.active;
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
- result.load(result.active);
231
+ zimoli();
232
232
  return result;
233
233
  };
234
234
  result.from = result.fetch = function (url) {
@@ -1,5 +1,5 @@
1
1
  var singerPhotosMap = Object.create(null);
2
- data.from("singer/list.jsp", function (a) {
2
+ await data.from("singer/list.jsp", function (a) {
3
3
  a.forEach(a => {
4
4
  var b = a.replace(/\.\w+$/, '');
5
5
  singerPhotosMap[b] = a;
@@ -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
+ }