efront 4.4.13 → 4.5.0

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 (54) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +54 -6
  2. package/apps/pivot/api.yml +3 -0
  3. package/apps/pivot/cert/main.xht +181 -0
  4. package/apps/pivot/cert/orders.xht +144 -0
  5. package/apps/pivot/menu.yml +1 -0
  6. package/coms/basic/assert.js +40 -16
  7. package/coms/basic/cross_.js +20 -3
  8. package/coms/basic/i18n.md +4 -2
  9. package/coms/basic/renderTags.js +23 -0
  10. package/coms/basic/shallowClone.js +8 -0
  11. package/coms/basic/shallowEqual.js +13 -4
  12. package/coms/basic/valid.js +15 -2
  13. package/coms/compile/common.js +23 -0
  14. package/coms/compile/translate.js +29 -11
  15. package/coms/compile/translate_test.js +8 -0
  16. package/coms/compile//347/264/240/351/246/250.js +2 -1
  17. package/coms/docs/codetext.xht +3 -3
  18. package/coms/frame/chat.js +1 -1
  19. package/coms/kugou/bindScroll.js +1 -1
  20. package/coms/kugou/krc.js +2 -2
  21. package/coms/layer/leftCenter.js +5 -5
  22. package/coms/pivot/acme2.js +185 -0
  23. package/coms/reptile/colored_console.js +5 -17
  24. package/coms/zimoli/appendChild.js +3 -2
  25. package/coms/zimoli/autofocus.js +2 -2
  26. package/coms/zimoli/button.less +4 -3
  27. package/coms/zimoli/checker.js +34 -15
  28. package/coms/zimoli/checker.less +2 -3
  29. package/coms/zimoli/container.js +20 -16
  30. package/coms/zimoli/data.js +64 -46
  31. package/coms/zimoli/field.js +3 -3
  32. package/coms/zimoli/field.less +8 -2
  33. package/coms/zimoli/filterTime.js +40 -9
  34. package/coms/zimoli/fromBase64.js +2 -0
  35. package/coms/zimoli/grid.js +2 -2
  36. package/coms/zimoli/isMounted.js +3 -3
  37. package/coms/zimoli/list.js +3 -3
  38. package/coms/zimoli/maps.js +1 -1
  39. package/coms/zimoli/menuList.js +1 -1
  40. package/coms/zimoli/model.js +41 -5
  41. package/coms/zimoli/on.js +4 -4
  42. package/coms/zimoli/remove.js +3 -3
  43. package/coms/zimoli/render.js +25 -33
  44. package/coms/zimoli/scrollbar.js +52 -19
  45. package/coms/zimoli/scrollbar.less +14 -2
  46. package/coms/zimoli/scrollbar_test.less +1 -0
  47. package/coms/zimoli/select.js +3 -3
  48. package/coms/zimoli/table.js +1 -1
  49. package/coms/zimoli/toBase64.js +16 -6
  50. package/coms/zimoli/view.js +19 -12
  51. package/coms/zimoli/view.less +5 -3
  52. package/docs/loader.js +1 -1
  53. package/package.json +1 -1
  54. package/public/efront.js +1 -1
@@ -1374,6 +1374,28 @@ var canbeTemp = function (body, strip = false) {
1374
1374
  if (!o) return false;
1375
1375
  return o.type === EXPRESS && (strip || !/[\.\[]/.test(o.text)) || o.type === VALUE || o.type === QUOTED && !o.length;
1376
1376
  };
1377
+ var canbeDuplicate = function (body) {
1378
+ for (var b of body) {
1379
+ switch (b.type) {
1380
+ case EXPRESS:
1381
+ if (/[\.\[]/.test(b.text)) return false;
1382
+ break;
1383
+ case SCOPED:
1384
+ if (b.isObject || b.isClass || b.entry === '[') return false;
1385
+ if (!isEval(b)) return false;
1386
+ if (!canbeTemp(b)) return false;
1387
+ break;
1388
+ case QUOTED:
1389
+ if (b.length && !canbeTemp(b)) return false;
1390
+ break;
1391
+ case STAMP:
1392
+ if (/^(\+\+|\-\-)$|^([^\=\>\<]+|>>>?|<<)?\=$/.test(b.text)) return false;
1393
+ break;
1394
+ case ELEMENT: return false;
1395
+ }
1396
+ }
1397
+ return true;
1398
+ };
1377
1399
  var pickArgument = function (o) {
1378
1400
  var res = [];
1379
1401
  var t = o && o.prev, p = o;
@@ -1457,6 +1479,7 @@ module.exports = {
1457
1479
  setqueue,
1458
1480
  replace,
1459
1481
  canbeTemp,
1482
+ canbeDuplicate,
1460
1483
  skipFunction,
1461
1484
  isHalfSentence,
1462
1485
  splice,
@@ -1,10 +1,16 @@
1
1
  var scanner2 = require("./scanner2");
2
- var { SCOPED, QUOTED, SCOPED, PROPERTY, STAMP, PIECE, setqueue, splice, relink, number_reg, replace, createString } = require("./common");
2
+ var { SCOPED, QUOTED, SCOPED, PROPERTY, STAMP, PIECE, setqueue, splice, relink, number_reg, replace, canbeDuplicate, createString } = require("./common");
3
3
  var strings = require("../basic/strings");
4
4
  var program = null;
5
5
  var patchTranslate = function (c) {
6
6
  if (c.length) {
7
- c.translate = c.map((o, i) => o.type === PIECE ? strings.decode(`\`${o.text}\``) : `$${i + 1 >> 1}`).join('').replace(/\r\n|\r|\n/g, '\r\n');
7
+ var canbeDup = true;
8
+ c.translate = c.map((o, i) => {
9
+ if (o.type === PIECE) return strings.decode(`\`${o.text}\``);
10
+ if (canbeDup && !canbeDuplicate(o)) canbeDup = false;
11
+ return `$${i + 1 >> 1}`;
12
+ }).join('').replace(/\r\n|\r|\n/g, '\r\n');
13
+ c.nodup = !canbeDup;
8
14
  }
9
15
  else {
10
16
  if (/^['"`]/.test(c.text) && c.text.length > 2) {
@@ -74,7 +80,7 @@ var ctn = function (tt, t) {
74
80
  if (a in t) return `\${${a}}`;
75
81
  return _;
76
82
  }));
77
- tn[tn.length - 1].forEach(n => {
83
+ (tn[0].type === SCOPED ? tn[0] : tn[1]).forEach(n => {
78
84
  if (n.type !== QUOTED || !n.length) return;
79
85
  n.forEach((a, i) => {
80
86
  if (a.type !== SCOPED) return;
@@ -91,13 +97,25 @@ function translate([imap, supports], code) {
91
97
  if (a.start > b.start && a.end < b.end) return -1;
92
98
  return 0;
93
99
  });
94
- var getm = function (tt, warn) {
95
- tt = tt.trim();
96
- if (!imap[tt]) {
100
+ var getm = function (tt, nodup, warn) {
101
+ var mq = /^(\s*)([\s\S]*?)(\s*)$/.exec(tt);
102
+ var mq = [mq[1] || '', mq[2], mq[3] || ''];
103
+ var tt = mq[1];
104
+ var wrap = m => {
105
+ mq[1] = m || tt;
106
+ return strings.encode(mq.join(''), '`');
107
+ };
108
+
109
+ var imp = imap[tt];
110
+ if (!imp) {
97
111
  if (warn !== false) console.warn(`<yellow>${i18n`国际化翻译缺失:`}</yellow>${tt}`);
98
- imap[tt] = supports.map(_ => tt);
112
+ imp = imap[tt] = supports.map(_ => tt);
99
113
  }
100
- return imap[tt].map(m => strings.encode(m || tt, '`'));
114
+ if (nodup && imp.length <= 1) nodup = false;
115
+ var mp = nodup ? m => "()=>" + wrap(m) : m => wrap(m);
116
+ var m = `(${imp.map(mp)})`;
117
+ if (nodup) m += '()';
118
+ return m;
101
119
  };
102
120
  var used = code.used;
103
121
  for (var t of texts) {
@@ -109,8 +127,8 @@ function translate([imap, supports], code) {
109
127
  p.leave = ")";
110
128
  }
111
129
  var tt = t.translate;
112
- var tn = ctn(`(${getm(tt)})`, t);
113
- replace(t, tn[0]);
130
+ var tn = ctn(getm(tt, t.nodup), t);
131
+ replace(t, ...tn);
114
132
  }
115
133
  else if (t.transtype === 字段名) {
116
134
  var i = t.queue.indexOf(t.prev);
@@ -138,7 +156,7 @@ function translate([imap, supports], code) {
138
156
  if (a in t) v = t[a];
139
157
  else v = scanner2(JSON.stringify(v));
140
158
  }
141
- else if (k === 'name') v = ctn(`i18n(${getm(v, t.warn)})`, t);
159
+ else if (k === 'name') v = ctn('i18n' + getm(v, t.nodup, t.warn), t);
142
160
  else v = scanner2(JSON.stringify(v));
143
161
  o.push({ type: PROPERTY, isprop: true, text: JSON.stringify(k) }, { type: STAMP, text: ':' }, ...v, { type: STAMP, text: ',' });
144
162
  })
@@ -0,0 +1,8 @@
1
+ var test = function (src, text, expact) {
2
+ var code = scanner2(text);
3
+ translate([src, Object.keys(src)], code);
4
+ assert(code.toString(), expact);
5
+ };
6
+ test({ "a$1b": ["a$1b", "c$1d"] }, 'i18n`a${a}b`', 'i18n(`a${a}b`, `c${a}d`)')
7
+ test({ "a$1b": ["a$1b", "c$1d"] }, 'i18n`a${a++}b`', 'i18n(() => `a${a++}b`, () => `c${a++}d`)()')
8
+ test({ "a$1b": ["c$1d"] }, 'i18n`a${a++}b`', 'i18n(`c${a++}d`)')
@@ -401,7 +401,6 @@ var getFromScopeList = function (name, varsList, value = name) {
401
401
  };
402
402
  var removeSelectorSpace = a => a.trim().replace(/\s*([\+~\>])\s*/g, "$1");
403
403
  var fixBase = function (b, a) {
404
- var s = splitParams(a);
405
404
  return splitParams(a).map(a => {
406
405
  if (presets.test(a)) a = `@{${a}}`;
407
406
  var replaced = false;
@@ -426,9 +425,11 @@ function evalscoped(scoped, base = '') {
426
425
  base = removeSelectorSpace(base);
427
426
  var smaps = scoped.maps;
428
427
  var root = smaps[":root"], scope = smaps[":scope"];
428
+ var and = smaps["&"];
429
429
  var vars = extend(Object.create(null), scoped.vars);
430
430
  if (root) root.forEach(r => extend(vars, r.vars));
431
431
  if (scope) scope.forEach(s => extend(vars, s.vars));
432
+ if (and) and.forEach(a => extend(vars, a.vars));
432
433
  var vlist = [vars];
433
434
  var mlist = [macros];
434
435
  var clist = [smaps];
@@ -109,8 +109,8 @@
109
109
  case QUOTED:
110
110
  if (o.length || !o.text) {
111
111
  o.forEach(setcolor);
112
- o.entry = "<text>" + o.entry;
113
- o.leave = o.leave + "</text>";
112
+ o.entry = "<text>" + o.entry + "</text>";
113
+ o.leave = "<text>" + o.leave + "</text>";
114
114
  break;
115
115
  }
116
116
  case PIECE:
@@ -299,7 +299,7 @@
299
299
  }
300
300
  }
301
301
  if (minSpace > 0) codes = codes.map(c => /^\s+/.test(c) ? c.slice(minSpace) : c);
302
- return `<code type=${type}>${codes.join("<br/>").replace(/\t/g, Array(5).join('&ensp;')).replace(/\s/g, '&ensp;')}</code> `;
302
+ return `<code type=${type}>${codes.join("<br/>").replace(/\t/g, Array(5).join('&ensp;')).replace(/\s/g, '&ensp;')}</code>`;
303
303
  }
304
304
  codetext.encode = encode;
305
305
  </script>
@@ -168,7 +168,7 @@ function chat(title = '会话窗口') {
168
168
  }
169
169
  }
170
170
  };
171
- page.renders = [function () {
171
+ page.$renders = [function () {
172
172
  this.$scope.resize(this.$scope.body);
173
173
  }];
174
174
  page.localid = localid;
@@ -53,6 +53,6 @@ function bindScroll(titlebar, page) {
53
53
  setOpacity(label, 1 - (titlebar.offsetHeight - topHeight) / (offsetHeight - topHeight));
54
54
  return {};
55
55
  };
56
- if (!page.renders) page.renders = [];
56
+ if (!page.$renders) page.$renders = [];
57
57
  page.onscroll = refresh;
58
58
  }
package/coms/kugou/krc.js CHANGED
@@ -72,7 +72,7 @@ function createLRC(lrc) {
72
72
  setClass(krcList, index);
73
73
  }
74
74
  }
75
- if (ele && firstChild && firstChild.isMounted) {
75
+ if (ele && firstChild && firstChild.$mounted) {
76
76
  var marginTop = (firstChild.parentNode.offsetHeight - ele.offsetHeight >> 1) - ele.offsetTop + firstChild.offsetTop;
77
77
  css(firstChild, `margin-top:${marginTop | 0}px;`);
78
78
  }
@@ -140,7 +140,7 @@ function createKRC(krc) {
140
140
  var current_row_word = current_words[current_row_index];
141
141
  var ele = krcList[index];
142
142
  var firstChild = krcList[0];
143
- if (ele && firstChild && firstChild.isMounted) {
143
+ if (ele && firstChild && firstChild.$mounted) {
144
144
  var marginTop = (firstChild.parentNode.offsetHeight - ele.offsetHeight >> 1) - ele.offsetTop + firstChild.offsetTop;
145
145
  if (index > 0) {
146
146
  if (markerLabel.parentNode !== ele) {
@@ -38,12 +38,12 @@ function setCurrentPage(page) {
38
38
  var currentLayer = getCurrentLayer();
39
39
  if (page !== leftPage) {
40
40
  if (currentLayer !== leftLayer) {
41
- if (!leftPage.isMounted) appendChild(leftLayer, leftPage);
41
+ if (!leftPage.$mounted) appendChild(leftLayer, leftPage);
42
42
  } else {
43
43
  remove(leftPage, false);
44
44
  }
45
45
  if (page.parentNode !== currentLayer) appendChild(currentLayer, page, false);
46
- } else if (!leftPage.isMounted) {
46
+ } else if (!leftPage.$mounted) {
47
47
  appendChild(leftLayer, leftPage, false);
48
48
  }
49
49
  }
@@ -54,16 +54,16 @@ function main(_leftPage) {
54
54
  layer.layer = function (child, old) {
55
55
  remove(old);
56
56
  if (child === leftPage) {
57
- if (!leftPage.isMounted) appendChild(leftLayer, child);
57
+ if (!leftPage.$mounted) appendChild(leftLayer, child);
58
58
  } else if (child) {
59
59
  var currentLayer = getCurrentLayer();
60
60
  appendChild(currentLayer, child);
61
61
  if (currentLayer === leftLayer) {
62
62
  if (arguments.length > 1) remove(leftPage);
63
- } else if (!leftPage.isMounted) {
63
+ } else if (!leftPage.$mounted) {
64
64
  appendChild(leftLayer, leftPage);
65
65
  }
66
66
  } else {
67
- if (!leftPage.isMounted) appendChild(leftLayer, leftPage);
67
+ if (!leftPage.$mounted) appendChild(leftLayer, leftPage);
68
68
  }
69
69
  };
@@ -0,0 +1,185 @@
1
+ var acmebase = `https://acme-v02.api.letsencrypt.org/`;
2
+ // <!-- acmebase=`https://acme-staging-v02.api.letsencrypt.org/` -->
3
+ var data1 = data.enrich(parseYML(`
4
+ ${acmebase}:
5
+ directory: get directory
6
+ ${acmebase}acme/ Content-Type=application/jose+json:
7
+ key-change: get key-change
8
+ new-account: post:^efront-location new-acct
9
+ get-account: get acct/:aid
10
+ new-order: post:^efront-location new-order
11
+ get-order|: get order/:aid/:oid
12
+ new-nonce: head:^Replay-Nonce new-nonce
13
+ revert-cert: post:^efront-location revert-cert
14
+ `));
15
+ var publicKey, privateKey;
16
+ var private_key, public_key;
17
+ var RSASSA_PKCS1_v1_5 = "RSASSA-PKCS1-v1_5";
18
+ var base64url = function (params) {
19
+ var data = JSON.stringify(params);
20
+ return toBase64(encodeUTF8(data), true);
21
+ };
22
+ var accountApi = await data1.getApi('get-account');
23
+ var orderApi = await data1.getApi('get-order');
24
+
25
+ var request = async function (id, params) {
26
+ var api = await data1.getApi(id);
27
+ if (/^(get|head)$/i.test(api.method)) return data1.from(id, params);
28
+ var protected = {
29
+ url: api.base + api.path,
30
+ };
31
+ var rest;
32
+ [protected.url, rest] = data.prepareURL(protected.url, params);
33
+ var restparams = {};
34
+ rest.forEach(k => { restparams[k] = params[k]; delete params[k]; });
35
+ var jwk = await subtle.exportKey("jwk", publicKey);
36
+ protected.alg = jwk.alg;
37
+ if (/new-account|revert-cert/i.test(id)) {
38
+ protected.jwk = {
39
+ e: jwk.e,
40
+ kty: jwk.kty,
41
+ n: jwk.n
42
+ };
43
+ }
44
+ else {
45
+ protected.kid = acme2.kid;
46
+ }
47
+ protected.nonce = await data1.from("new-nonce");
48
+ var payload = isEmpty(params) ? '' : base64url(params);
49
+ protected = base64url(protected);
50
+ var params = {
51
+ protected,
52
+ payload,
53
+ signature: toBase64(new Uint8Array(await subtle.sign({ name: RSASSA_PKCS1_v1_5, saltLength: 32 }, privateKey, new Uint8Array(encodeUTF8([protected, '.', payload].join(''))))), true)
54
+ };
55
+ extend(params, restparams);
56
+ var account = await data1.from(id, params);
57
+ return account;
58
+ };
59
+ var subtle = this.crypto?.subtle;
60
+ var acme2 = new class {
61
+ email = '';
62
+ kid = '';
63
+ aid = '';
64
+ oid = '';
65
+ domain = '';
66
+ termsOfServiceAgreed = false;
67
+ orders = [];
68
+ public_key = '';
69
+ get enabled() {
70
+ return !!subtle;
71
+ }
72
+ async initUnique() {
73
+ //https://www.w3.org/TR/WebCryptoAPI/ 第20章 只有RSASSA-PKCS1-v1_5的jwk的alg才是rs256
74
+ var k = await subtle.generateKey({
75
+ name: RSASSA_PKCS1_v1_5,
76
+ modulusLength: 4096,
77
+ publicExponent: new Uint8Array([1, 0, 1]),
78
+ hash: "SHA-256",
79
+ }, true, ["sign", "verify"]);
80
+ var { publicKey, privateKey } = k;
81
+ private_key = await subtle.exportKey("pkcs8", privateKey);
82
+ public_key = await subtle.exportKey("spki", publicKey);
83
+ private_key = toBase64(new Uint8Array(private_key));
84
+ public_key = toBase64(new Uint8Array(public_key));
85
+ var unique = [private_key, public_key].join(',');
86
+ await acme2.makeUnique(unique);
87
+ }
88
+ async makeUnique(unique) {
89
+ if (!unique) return;
90
+ var avme2 = this;
91
+ var extra;
92
+ [private_key, public_key, extra] = unique.split(',');
93
+ if (extra) {
94
+ extra = JSON.parse(decodeUTF8(fromBase64(extra)));
95
+ avme2.email = extra.email;
96
+ avme2.kid = extra.kid;
97
+ if (extra.kid) {
98
+ var account = data.getUrlParamsForApi(accountApi, extra.kid);
99
+ avme2.aid = account.aid;
100
+ }
101
+ avme2.domain = extra.domain;
102
+ avme2.termsOfServiceAgreed = extra.termsOfServiceAgreed;
103
+ avme2.orders = extra.orders;
104
+ }
105
+ try {
106
+ privateKey = await subtle.importKey("pkcs8", new Uint8Array(fromBase64(private_key)), {
107
+ name: RSASSA_PKCS1_v1_5,
108
+ hash: "SHA-256",
109
+ }, true, ["sign"]);
110
+ publicKey = await subtle.importKey("spki", new Uint8Array(fromBase64(public_key)), {
111
+ name: RSASSA_PKCS1_v1_5,
112
+ hash: "SHA-256",
113
+ }, true, ["verify"]);
114
+
115
+ avme2.public_key = public_key;
116
+ } catch (e) { alert("加载服务器公钥异常!", "error"); throw e }
117
+ }
118
+ pickUnique() {
119
+ var avme2 = this;
120
+ var extra = {
121
+ kid: avme2.kid,
122
+ email: avme2.email,
123
+ domain: avme2.domain,
124
+ orders: avme2.orders,
125
+ termsOfServiceAgreed: avme2.termsOfServiceAgreed
126
+ };
127
+ return [private_key, public_key, base64url(extra)].join(",");
128
+ }
129
+ async getTermsOfService() {
130
+ var data = await data1.from("directory");
131
+ var termsOfService = data?.meta?.termsOfService;
132
+ return termsOfService;
133
+ }
134
+ async newAccount(params) {
135
+ var account = await request("new-account", {
136
+ "contact": [
137
+ "mailto:" + params.email
138
+ ],
139
+ // onlyReturnExisting: false,// 可选
140
+ // externalAccountBinding: {},// 可选
141
+ "termsOfServiceAgreed": params.termsOfServiceAgreed
142
+ });
143
+ this.email = params.email;
144
+ this.termsOfServiceAgreed = params.termsOfServiceAgreed;
145
+ this.kid = account;
146
+ var a = data.getUrlParamsForApi(accountApi, account);
147
+ this.aid = a.aid;
148
+ return account;
149
+ }
150
+ async newOrder(params) {
151
+ var params = {
152
+ "identifiers": params.domain.trim().split(/[,;+,;\r\n\u2029\u2028\s]+/).map(n => {
153
+ if (/^\d+(\.\d+){3}$|^\[[\da-f\:]+\]$|^[\da-f\:]+$/i.test(n)) return { type: "ipv4", value: n };
154
+ return { type: "dns", value: n };
155
+ })
156
+ };
157
+ var order = await request("new-order", params);
158
+ this.domain = params.domain;
159
+ if (!this.orders) this.orders = [];
160
+ if (this.orders.indexOf(order) < 0) this.orders.unshift(order);
161
+ return order;
162
+ }
163
+ parseOrder(o) {
164
+ if (typeof o !== 'string') return o;
165
+ var order = data.getUrlParamsForApi(orderApi, o);
166
+ order.name = order.oid;
167
+ return order;
168
+ }
169
+ async getOrder(o) {
170
+ var r = await data.from(orderApi, o);
171
+ if (r.expires) r.expires = new Date(r.expires);
172
+ return r;
173
+ }
174
+ async thumbprint() {
175
+ var jwk = await subtle.exportKey('jwk', publicKey);
176
+ jwk = `{"e":"${jwk.e}","kty":"${jwk.kty}","n":"${jwk.n}"}`;
177
+ console.log(JSON.parse(jwk))
178
+ var thumb = await subtle.digest("SHA-256", new Uint8Array(encodeUTF8(jwk)));
179
+ thumb = toBase64(new Uint8Array(thumb), true);
180
+ return thumb;
181
+ }
182
+ async audit(url) {
183
+ return data.fromURL(url);
184
+ }
185
+ }
@@ -2,10 +2,12 @@
2
2
  var colored = Object.create(null);
3
3
  var lazy = require("../basic/lazy");
4
4
  var colors = require("./colors");
5
+ var renderTags = require("../basic/renderTags");
5
6
  var strings = require("../basic/strings");
6
7
  var lastLogLength = 0;
7
8
  var needNextLine = false;
8
9
  var getColor = function (c) {
10
+ if (!c) return colors.Reset;
9
11
  switch (c) {
10
12
  case "red":
11
13
  case "error":
@@ -30,23 +32,9 @@ var getColor = function (c) {
30
32
  }
31
33
  return '';
32
34
  };
33
- var colorReg = /<(\/?)([a-z][\w]*)\>/ig;
35
+ var colorReg = renderTags.reg;
34
36
  var renderColor = function (obj) {
35
- var colorpath = [];
36
- return String(obj).replace(colorReg, function (_, e, c) {
37
- if (!c || c.length < 3 || !getColor(c)) return _;
38
- if (e) {
39
- colorpath.pop();
40
- c = colorpath[colorpath.length - 1];
41
- }
42
- else colorpath.push(c);
43
- if (c) var color = getColor(c);
44
- var res = [];
45
- if (e) res.push(colors.Reset);
46
- if (color) res.push(color);
47
- if (res.length) return res.join('');
48
- return _;
49
- });
37
+ return renderTags(obj, getColor);
50
38
  };
51
39
 
52
40
  var write = function (hasNewLine, str) {
@@ -195,7 +183,7 @@ var format = function (arg, deep = 0) {
195
183
  }
196
184
  if (arg instanceof Buffer || arg instanceof ArrayBuffer || arg instanceof SharedArrayBuffer) {
197
185
  var data = new Uint8Array(arg.buffer || arg, arg.byteOffset || 0, arg.byteLength);
198
- return `<magenta><${arg.constructor.name} ${Array.prototype.slice.call(data, 0, 20).map(a => a < 16 ? "0" + a.toString(16) : a.toString(16)).join(' ')}${arg.byteLength > 20 ? ` ... 其他 ${arg.byteLength - 20} 字节` : ''}></megenta>`;
186
+ return `<magenta><${arg.constructor.name} ${Array.prototype.slice.call(data, 0, 20).map(a => a < 16 ? "0" + a.toString(16) : a.toString(16)).join(' ')}${arg.byteLength > 20 ? ` ... 其他 ${arg.byteLength - 20} 字节` : ''}></magenta>`;
199
187
  }
200
188
  else if (isFinite(arg.length)) {
201
189
  var entry = "[";
@@ -9,9 +9,9 @@ function hasEnterStyle(e) {
9
9
  }
10
10
 
11
11
  function _onappend(node, append = createEvent("append"), mount = createEvent("mounted")) {
12
- if (node.isMounted) return;
12
+ if (node.$mounted) return;
13
13
  if (node.nodeType !== 1 && node.nodeType !== 8) return;
14
- node.isMounted = true;
14
+ node.$mounted = true;
15
15
  dispatch(node, append);
16
16
  var children = Array.apply(null, node.childNodes);
17
17
  for (var c of children) {
@@ -71,6 +71,7 @@ function insertAfter(alreadyMounted, obj, transition) {
71
71
  children = children.reverse();
72
72
  for (var cx = 0, dx = children.length; cx < dx; cx++) {
73
73
  var o = release(children[cx]);
74
+ if (!o) continue;
74
75
  if (o.removeTimer) clearTimeout(o.removeTimer);
75
76
  parent.insertBefore(o, alreadyMounted.nextSibling);
76
77
  o.with && insertBefore(alreadyMounted.nextSibling, o.with, transition);
@@ -1,7 +1,7 @@
1
1
  function autofocus(e) {
2
- if (!e.renders) e.renders = [];
2
+ if (!e.$renders) e.$renders = [];
3
3
  var savedElement;
4
- e.renders.push(function () {
4
+ e.$renders.push(function () {
5
5
  var parent = rootElements[rootElements.length - 1] || document.body;
6
6
  if (savedElement === this) {
7
7
  if (this !== parent || getTargetIn(parent, document.activeElement)) return;
@@ -1,7 +1,10 @@
1
1
  @default-color: #0092cc;
2
2
 
3
+ :not(button, a)& {
4
+ display: inline-block;
5
+ }
6
+
3
7
  & {
4
- font-size: 14px;
5
8
  width: auto;
6
9
  line-height: 28px;
7
10
  background-color: @default-color;
@@ -11,7 +14,6 @@
11
14
  position: relative;
12
15
  border: none;
13
16
  margin: 0;
14
- display: inline-block;
15
17
  white-space: nowrap;
16
18
  text-align: center;
17
19
  overflow: hidden;
@@ -179,7 +181,6 @@
179
181
  content: "↻";
180
182
  font-family: 'Times New Roman', Times, serif;
181
183
  display: inline-block;
182
- vertical-align: middle;
183
184
  position: absolute;
184
185
  animation: busy-pending 2s linear 0s infinite;
185
186
  }
@@ -1,15 +1,34 @@
1
- function main(elem = document.createElement("check")) {
2
- var page = elem;
3
- page.innerHTML = checker;
4
- page.setValue = function (value) {
5
- value = !!value;
6
- if (value === this.value) return;
7
- this.value = value;
8
- if (value) {
9
- addClass(page, 'checked');
10
- } else {
11
- removeClass(page, 'checked');
12
- }
13
- };
14
- return page;
15
- }
1
+ var falseMap = Object.create(null);
2
+ falseMap["off"] = "on";
3
+ falseMap["false"] = "true";
4
+ falseMap["null"] = "true";
5
+ falseMap["0"] = "1";
6
+ var trueMap = Object.create(null);
7
+ for (var k in falseMap) trueMap[falseMap[k]] = falseMap[k];
8
+ var isTrue = function (v) {
9
+ return !!+v || v in trueMap;
10
+ };
11
+ var changeValue = function (value) {
12
+ if (typeof value === 'boolean') return !value;
13
+ if (value & 1 === value) return 1 - value;
14
+ if (value in trueMap) return trueMap[value];
15
+ if (typeof value === 'number') return +!+value;
16
+ return !+value;
17
+ };
18
+ var setValue = function (value) {
19
+ if (value === this.value) return;
20
+ this.value = value;
21
+ value = isTrue(value);
22
+ if (value) {
23
+ addClass(this, 'checked');
24
+ } else {
25
+ removeClass(this, 'checked');
26
+ }
27
+ };
28
+ function checker(ck = document.createElement('check')) {
29
+ ck.innerHTML = template;
30
+ ck.setValue = setValue;
31
+ return ck;
32
+ }
33
+ checker.isTrue = isTrue;
34
+ checker.changeValue = changeValue;
@@ -3,14 +3,13 @@
3
3
  width: .8em;
4
4
  position: relative;
5
5
  border: .1em solid;
6
- margin-right: .3em;
6
+ margin: -0.06em .3em -0.06em 0;
7
7
  font-family: sans-serif;
8
8
  display: inline-block;
9
9
  line-height: 1;
10
10
  text-align: center;
11
- margin-top: .15em;
11
+ box-sizing: border-box;
12
12
  border-radius: .12em;
13
- vertical-align: middle;
14
13
 
15
14
  >s {
16
15
  display: none;
@@ -1,34 +1,38 @@
1
- var change = async function (data) {
2
- if (!data) remove(this.with);
3
- else if (isNode(data)) {
4
- if (isElement(data) && this.$struct.copys) {
1
+ var change = lazy(async function (src) {
2
+ if (src !== this.$src) return;
3
+ if (!src) remove(this.with);
4
+ else if (isNode(src)) {
5
+ if (isElement(src) && this.$struct.copys) {
5
6
  for (var c of this.$struct.copys) {
6
7
  if (c.name === 'class') {
7
- addClass(data, c.value);
8
+ addClass(src, c.value);
8
9
  }
9
10
  else if (c.name === 'style') {
10
- css(data, c.value);
11
+ css(src, c.value);
11
12
  }
12
- else data.setAttribute(c.name, c.value);
13
+ else src.setAttribute(c.name, c.value);
13
14
  }
14
15
  }
15
- zimoli.global(data, this);
16
- }
17
- else if (isString(data) || +data < 0) zimoli.go(data, this.params, this);
18
- };
19
- var gosrc = function () {
20
- var { src } = this;
21
- if (this.hasAttribute && this.hasAttribute('src')) {
22
- src = this.getAttribute('src');
16
+ zimoli.global(src, this);
23
17
  }
18
+ else if (isString(src) || +src < 0) zimoli.go(src, this.params, this);
19
+ });
20
+ var gosrc = function (src) {
24
21
  if (src !== this.$src) {
25
- change.call(this, src);
26
22
  this.$src = src;
23
+ change.call(this, src);
27
24
  }
28
25
  };
29
26
  function container(element) {
30
27
  var comment = document.createComment('container');
31
28
  comment.$struct = element.$struct;
32
29
  care(comment, gosrc);
30
+ if (element.hasAttribute && element.hasAttribute('src')) {
31
+ var src = element.getAttribute('src');
32
+ if (src) oncemount(comment, function () {
33
+ if ("$src" in this) return;
34
+ gosrc.call(this, src);
35
+ });
36
+ }
33
37
  return comment;
34
38
  }