efront 4.24.0 → 4.24.2

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.
@@ -13,6 +13,7 @@
13
13
  >jscode,
14
14
  >pre {
15
15
  height: 100%;
16
+ margin: 0;
16
17
  }
17
18
 
18
19
  &.top {
@@ -23,7 +24,8 @@
23
24
 
24
25
  &.left,
25
26
  &.right {
26
- height: 100%;
27
+ border-radius: 0;
28
+ height: 260px;
27
29
  width: 50%;
28
30
  }
29
31
 
@@ -17,8 +17,8 @@
17
17
  // │ href │
18
18
  // └────────────────────────────────────────────────────────────────────────────────────────────────┘
19
19
 
20
- // -------/// ---------------1---------------------------------///////////////////2-----3--------//////// ------4----2/////5---------------------------------------------------6------------------------------------------------------------------------------------//////////////-7--5///8-------9----------//10--11---10/8/--12----////
21
- var reg = /^([^\:\/\\\?#\[]+\:(?![^\:\/\\\?\#]*@|[\/\\][^\/\\]))?(?:\/\/|\\\\)?(?:(([^\:\/\\\?#]+)?(?:\:([^\/\\\?#]+))?)@)?(([^\/\\@\?\#\.]*?[^\/\\@\:\?\#\.\d][^\/\\@\:\?\#\.]*?|[^\/\\@\:\?\#\.]+(?:\:[^\@\/\\\?#\.]*[^\d\@\:\/\\\?#\.]+|(?:\.[^\/\\@\:\?\#\.]+)+))?(?:(?:\:|^)(\d+))?)(((?:\/|\\|^)[^\?#]*)?(\?([^#]*))?)(#[\s\S]*)?$/;
20
+ // -------/// ----------------1----------------------------------///////////////////2-----3--------//////// ------4----2/////5---------------------------------------------------6----------------------------------------------------------------------------------//////////////-7--5///8-------9----------//10--11---10/8/--12----////
21
+ var reg = /^([^\:\/\\\?#\[\.]+\:(?![^\:\/\\\?\#]*@|[\/\\][^\/\\]))?(?:\/\/|\\\\)?(?:(([^\:\/\\\?#]+)?(?:\:([^\/\\\?#]+))?)@)?(([^\/\\@\?\#\.]*?[^\/\\@\:\?\#\.\d][^\/\\@\:\?\#\.]*?|[^\/\\@\:\?\#\.]+(?:\:[^\@\/\\\?#]*[^\d\@\:\/\\\?#\.]+|(?:\.[^\/\\@\:\?\#\.]+)+))?(?:(?:\:|^)(\d+))?)(((?:\/|\\|^)[^\?#]*)?(\?([^#]*))?)(#[\s\S]*)?$/;
22
22
  class URL {
23
23
  resolve(url) {
24
24
  var u = new URL;
@@ -1,5 +1,5 @@
1
1
  var parseURL = require("./parseURL");
2
- require("../efront/console");
2
+ var console = efront$console;
3
3
  var test = function (url, key, value) {
4
4
  var parsed = parseURL(url);
5
5
  if (parsed[key] !== value) console.log(parsed), console.fail(`url:${url}, key:${key}, expect:${value}, result:${parsed[key]}`);
@@ -50,6 +50,7 @@ test("http://[::]/", "host", "[::]")
50
50
  test("http://[::%12]/", "host", "[::%12]")
51
51
  test("http://[::]:80/", "hostname", "[::]")
52
52
  test("[::]:80/", "hostname", "[::]")
53
+ test("[::ffff:127.0.0.1]:80/", "hostname", "[::ffff:127.0.0.1]")
53
54
  test("[fd64:f52:f52:f52:f52:f52:f52:97]", "hostname", "[fd64:f52:f52:f52:f52:f52:f52:97]")
54
55
  test("./cluster-opt.html", "pathname", "./cluster-opt.html")
55
56
  test(":cluster-opt.html", "pathname", ":cluster-opt.html")
@@ -158,6 +158,29 @@ function translate([imap, supports], code) {
158
158
  if (a in t) v = t[a];
159
159
  else v = scanner2(`(${JSON.stringify(v)})`)[0];
160
160
  }
161
+ else if (k === 'options') {
162
+ if (v instanceof Array) {
163
+ var a = scanner2(`[]`);
164
+ v.map(function (o) {
165
+ var name = o.name;
166
+ if (!name) return scanner2(`(${JSON.stringify(o)})`)[0];
167
+ delete o.name;
168
+ name = ctn('i18n' + getm(name, t.nodup, t.warn), t);
169
+ o = scanner2(`(${JSON.stringify(o)})`)[0];
170
+ splice(o[0], 0, 0,
171
+ { type: PROPERTY, isprop: true, text: `"name"` },
172
+ { type: STAMP, text: ":" }, ...name,
173
+ { type: STAMP, text: "," });
174
+ setqueue(o);
175
+ return o;
176
+ }).forEach(function (o) {
177
+ a[0].push(...o, { type: STAMP, text: ',' });
178
+ });
179
+ a[0].pop();
180
+ setqueue(a);
181
+ v = a;
182
+ }
183
+ }
161
184
  else if (/^(name|holder|comment)$/.test(k)) v = ctn('i18n' + getm(v, t.nodup, t.warn), t);
162
185
  else v = scanner2(`(${JSON.stringify(v)})`)[0];
163
186
  o.push({
@@ -60,7 +60,7 @@ var popupEdit = function ($scope, active) {
60
60
  };
61
61
  return extend([
62
62
  {
63
- name: i18n`返回(O)`,
63
+ name: i18n`返回` + `(O)`,
64
64
  hotkey: "backspace",
65
65
  when: never,
66
66
  do() {
@@ -68,7 +68,7 @@ return extend([
68
68
  }
69
69
  },
70
70
  {
71
- name: i18n`打开(O)`,
71
+ name: i18n`打开` + `(O)`,
72
72
  hotkey: "Enter",
73
73
  when: never,
74
74
  do(d) {
@@ -78,7 +78,7 @@ return extend([
78
78
  }
79
79
  },
80
80
  {
81
- name: i18n`剪切(C)`,
81
+ name: i18n`剪切` + `(C)`,
82
82
  hotkey: "Ctrl+X",
83
83
  when: getStable,
84
84
  do(d) {
@@ -88,7 +88,7 @@ return extend([
88
88
  }
89
89
  },
90
90
  {
91
- name: i18n`复制(R)`,
91
+ name: i18n`复制` + `(R)`,
92
92
  hotkey: "Ctrl+C",
93
93
  when: getStable,
94
94
  do(d) {
@@ -98,7 +98,7 @@ return extend([
98
98
  }
99
99
  },
100
100
  {
101
- name: i18n`全选(A)`,
101
+ name: i18n`全选` + `(A)`,
102
102
  hotkey: "Ctrl+A",
103
103
  when: never,
104
104
  do(d) {
@@ -108,11 +108,11 @@ return extend([
108
108
  }
109
109
  },
110
110
  {
111
- name: i18n`替换(R)`,
111
+ name: i18n`替换` + `(R)`,
112
112
  when: never,
113
113
  },
114
114
  {
115
- name: i18n`粘贴(V)`,
115
+ name: i18n`粘贴` + `(V)`,
116
116
  hotkey: "Ctrl+V",
117
117
  when(e) {
118
118
  var copyed = getPageScope(e.target).copyed;
@@ -162,12 +162,12 @@ return extend([
162
162
  }
163
163
  },
164
164
  {
165
- name: i18n`新建文件夹(D)`,
165
+ name: i18n`新建文件夹` + `(D)`,
166
166
  when: notGetActive,
167
167
  do: popupAdd
168
168
  },
169
169
  {
170
- name: i18n`添加文件(F)`,
170
+ name: i18n`添加文件` + `(F)`,
171
171
  when: notGetActive,
172
172
  async do(d) {
173
173
  var $scope = getPageScope(d);
@@ -176,13 +176,13 @@ return extend([
176
176
  },
177
177
  {
178
178
  hotkey: "F2",
179
- name: i18n`重命名(R)`,
179
+ name: i18n`重命名` + `(R)`,
180
180
  when: getStable,
181
181
  do: popupRen
182
182
  },
183
183
  {
184
184
  get name() {
185
- return this.confirm ? i18n`确认删除(D)` : i18n`删除(D)`;
185
+ return this.confirm ? i18n`确认删除` + `(D)` : i18n`删除` + `(D)`;
186
186
  },
187
187
  hotkey: "Shift+Del",
188
188
  confirm: false,
@@ -1,6 +1,6 @@
1
1
  function main(types, elem) {
2
2
  var { field, data, readonly } = elem;
3
- elem.innerHTML = `<span -text="text()"></span>` + (readonly ? "" : '<a @click="edit()">修改</a>');
3
+ elem.innerHTML = `<span -text="text()"></span>` + (readonly ? "" : `<a @click="edit()">${i18n`修改`}</a>`);
4
4
  renderWithDefaults(elem.children, {
5
5
  text() {
6
6
  if (data[field.key]) return data[field.key].map(k => `${k.name} ${isEmpty(k.key) ? "" : `(${k.key})`}`).join(", ");
@@ -1,11 +1,11 @@
1
1
  <div head>
2
- <span v-text="origin?'修改':'添加'"></span><span -text="title"></span>
2
+ <span v-text="origin?'${i18n`修改`}':'${i18n`添加`}'"></span><span -text="title"></span>
3
3
  </div>
4
4
  <div body>
5
5
  <field v-if="!f.hidden" -repeat="f in fields" ng-src="[f,data]"></field>
6
6
  </div>
7
7
  <scrollbar></scrollbar>
8
8
  <div foot>
9
- <btn @click="remove()" class="white">取消</btn>
10
- <button type="submit">保存</button>
9
+ <btn @click="remove()" class="white">${i18n`取消`}</btn>
10
+ <button type="submit">${i18n`保存`}</button>
11
11
  </div>
@@ -27,7 +27,7 @@ function main(title, { fields, options: options0, load, remove, buttons }, edit_
27
27
  page.innerHTML = template;
28
28
  var options = [
29
29
  {
30
- name: "修改",
30
+ name: i18n`修改`,
31
31
  async do(o) {
32
32
  await edit(o);
33
33
  },
@@ -35,7 +35,7 @@ function main(title, { fields, options: options0, load, remove, buttons }, edit_
35
35
  {
36
36
  type: "danger",
37
37
  name(o) {
38
- return this.confirm === o ? "确认删除" : "删除";
38
+ return this.confirm === o ? i18n`确认删除` : i18n`删除`;
39
39
  },
40
40
  type(o) {
41
41
  return this.confirm === o ? "dark" : "danger";
@@ -207,7 +207,6 @@
207
207
  var menu = getChild(zimoli);
208
208
  if (!menu) return;
209
209
  if (menu !== result.active) {
210
- console.log(zimoli, menu);
211
210
  setActive(result.active, false);
212
211
  setActive(menu, true);
213
212
  result.active = menu;
@@ -0,0 +1 @@
1
+ data.from("status");
@@ -44,6 +44,7 @@ var cross = cross_.bind(function (callback, onerror) {
44
44
  data = Buffer.from(data);
45
45
  this.headers["Content-Length"] = data.length;
46
46
  }
47
+ if (/^\[/.test(hostname)) hostname = hostname.replace(/^\[(.*?)\]$/, "$1");
47
48
  var options = {
48
49
  method: this.method,
49
50
  hostname,
@@ -15,6 +15,7 @@ tip {
15
15
  >[body],
16
16
  >.body {
17
17
  height: 100%;
18
+
18
19
  >[textarea] {
19
20
  height: 100%;
20
21
  }
@@ -23,11 +24,12 @@ tip {
23
24
  margin: 0 -16px;
24
25
  width: auto;
25
26
  height: 100%;
26
- >list{
27
+ >list {
27
28
  min-height: auto;
28
29
  }
29
30
  }
30
31
  }
32
+
31
33
  textarea,
32
34
  [textarea] {
33
35
  width: 100%;
@@ -627,7 +627,7 @@ function table(elem) {
627
627
  render.digest();
628
628
  };
629
629
  })
630
- var tableScopes = render.getScopes(this);
630
+ var tableScopes = render.getScopes(table);
631
631
  autodragchildren(
632
632
  table,
633
633
  cellMatchManager,
@@ -249,8 +249,7 @@ thead {
249
249
  tbody,
250
250
  [tbody] {
251
251
 
252
- [type=jscode],
253
- [type=function] {
252
+ [type=jscode] {
254
253
  display: -webkit-box;
255
254
  -webkit-box-orient: vertical;
256
255
  -webkit-line-clamp: 2;
@@ -3,7 +3,11 @@
3
3
  * 确定就继续,取消就中断
4
4
  */
5
5
  function yousure(title = i18n`您确定要这么做吗?`, content = i18n`当前操作需要您再次确认`) {
6
- var options = [button(i18n`确定` + "(Y)"), button(i18n`取消` + "(N)", "white")];
6
+ var options = isArray(content) ? content : arguments[2] || [button(i18n`确定` + "(Y)"), button(i18n`取消` + "(N)", "white")];
7
+ options = options.map(a => {
8
+ if (typeof a === 'string') a = button(a);
9
+ return a;
10
+ });
7
11
  options[0].tabindex = -1;
8
12
  options[1].tabindex = -1;
9
13
  var changeFocus = function (event) {
@@ -36,12 +36,6 @@
36
36
  display: inline-block;
37
37
  vertical-align: top;
38
38
  outline: none;
39
-
40
- >n,
41
- >d {
42
- display: block;
43
- }
44
-
45
39
  }
46
40
 
47
41
  >[clist] {
@@ -90,6 +84,14 @@
90
84
  outline: none;
91
85
  border: none;
92
86
 
87
+ &:after {
88
+ content: "";
89
+ pointer-events: none;
90
+ user-select: none;
91
+ display: inline-block;
92
+ width: 16px;
93
+ }
94
+
93
95
  &:focus {
94
96
  outline: 1px solid #fff3;
95
97
  }
@@ -110,13 +112,19 @@
110
112
  <list contenteditable="false" nlist# :src="(r,i) in coderows" -style="{height:codeHeight}">
111
113
  <n current:="isCurrent(i)" -bind="i+1"></n>
112
114
  </list>
113
- <list clist# body contenteditable="true" :src="(r,i) in coderows" -style="{height:codeHeight}">
115
+ <list clist# body contenteditable:="contenteditable" :src="(r,i) in coderows" -style="{height:codeHeight}">
114
116
  <d -html="r"></d>
115
117
  </list>
116
118
  </编辑框>
117
119
  <script>
118
120
  var coder = this;
119
121
  vbox(this);
122
+ var contenteditable = !this.readonly;
123
+ watch(coder, {
124
+ readonly(v) {
125
+ contenteditable = !v;
126
+ }
127
+ })
120
128
  if (!('oninput' in document)) {
121
129
  on('focus')(this, function () {
122
130
  if (this.contentEditable) addClass(this, "noinput");
@@ -170,10 +178,37 @@
170
178
  selection = getSelection();
171
179
  render.refresh(nlist);
172
180
  };
181
+ var spacing = false;
182
+ var isEqual = function (a, b) {
183
+ return a === b || !a && !b;
184
+ };
185
+ var getNodeText = function (node) {
186
+ if (!node) return '';
187
+ if (node.nodeType === 3) return node.nodeValue;
188
+ if (node.nodeType === 1) return node.innerText;
189
+ return '';
190
+ }
173
191
  var getNodeAt = function (row, col) {
174
192
  var d = clist.at(row);
175
193
  if (!d) return [];
176
194
  var c = d.firstChild;
195
+ if (!spacing) {
196
+ var t = d.innerText;
197
+ var tbb = t.charAt(col - 3);
198
+ var tb = t.charAt(col - 2);
199
+ var ta = t.charAt(col - 1);
200
+ var tf = t.charAt(col);
201
+ var tff = t.charAt(col + 1);
202
+ if (ta === " " && isEqual(tb, anchorChar)) {
203
+ col++;
204
+ }
205
+ else if (isEqual(ta, anchorChar) && !isEqual(tb, anchorChar)) {
206
+ col++;
207
+ }
208
+ else if (anchorChar === " " && isEqual(ta, followChar) && !isEqual(tf, followChar)) {
209
+ col--;
210
+ }
211
+ }
177
212
  var inc = 0;
178
213
  while (c) {
179
214
  if (c.nodeType === 1) {
@@ -192,14 +227,10 @@
192
227
  if (inc + tl > col) {
193
228
  col -= inc;
194
229
  inc = 0;
195
- if (t.charAt(col - 1) === " ") {
196
- col++;
197
- }
198
230
  break;
199
231
  }
200
232
  else if (inc + tl === col) {
201
- if (t.charAt(col - inc - 1) === " ") col++;
202
- else break;
233
+ break;
203
234
  }
204
235
  inc += tl;
205
236
  c = c.nextSibling;
@@ -246,10 +277,12 @@
246
277
  var anchorChar = null, inText = false;
247
278
  var followChar = null, beforeText = false;
248
279
  var fixpace = function (event) {
280
+ spacing = true;
249
281
  event.preventDefault();
250
282
  insertText(' ', false);
251
283
  markAnchorOffset();
252
284
  unmarkAnchorOffset();
285
+ spacing = false;
253
286
  };
254
287
  var updatechar = function (event) {
255
288
  if (event.defaultPrevented) return;
@@ -413,22 +446,27 @@
413
446
  var patchAfter = '';
414
447
  switch (inputType) {
415
448
  case "insertText":
416
- if (data === ' ') return;
449
+ if (data === ' ') return false;
417
450
  if (anchorChar in pairsmap) {
418
451
  if (followChar === pairsmap[anchorChar] && data === followChar) {
419
452
  document.execCommand('forwardDelete');
420
453
  }
421
454
  else if (data in pairsmap) {
422
- if (inText || beforeText) return;
455
+ if (inText) {
456
+ if (/^'/.test(data)) return;
457
+ }
423
458
  patchAfter = pairsmap[data];
424
459
  }
425
460
  }
426
461
  else {
427
462
  if (data in pairsmap) {
428
- if (inText || beforeText) return;
463
+ if (inText) {
464
+ if (/^'/.test(data)) return;
465
+ }
429
466
  patchAfter = pairsmap[data];
430
467
  }
431
468
  }
469
+ spacing = false;
432
470
  break;
433
471
  case "insertParagraph":
434
472
  var i = getFocusRow();
@@ -444,11 +482,14 @@
444
482
  }
445
483
  if (patchAfter) {
446
484
  insertText(patchAfter, true);
485
+ markAnchorOffset();
447
486
  }
448
487
  return patchAfter;
449
488
  };
450
489
  var document_selection = document.getSelection();
490
+ var isInput = false;
451
491
  var insertText = function (text, isPatch) {
492
+ isInput = true;
452
493
  markAnchorOffset();
453
494
  var [an, ai, fn, fi] = selection;
454
495
  var [n, i] = getNodeAt(fn, fi);
@@ -474,7 +515,7 @@
474
515
  [an, ai] = getNodeAt(an, ai);
475
516
  document_selection.setBaseAndExtent(an, ai, n, i + d);
476
517
  }
477
-
518
+ markAnchorOffset();
478
519
  }
479
520
  var removeEndBR = function (d) {
480
521
  var e = d.lastChild;
@@ -512,8 +553,11 @@
512
553
  };
513
554
  on("input")(coder, function (event) {
514
555
  if (event.isComposing) return;
556
+ isInput = true;
515
557
  var id = ++coderid;
516
- if (updatecode(event) == null) {
558
+ spacing = true;
559
+ var patch = updatecode(event);
560
+ if (patch == null) {
517
561
  if (id !== coderid) return;
518
562
  // codetext = getCodeText();
519
563
  updateCodeHtml();
@@ -540,6 +584,7 @@
540
584
  keytab(1);
541
585
  });
542
586
  bind('selectionchange', document)(coder, function () {
587
+ if (isInput) return isInput = false;
543
588
  markAnchorOffset();
544
589
  });
545
590
  var updo = function () {
@@ -604,6 +604,10 @@
604
604
  addTranslate(f.name);
605
605
  addTranslate(f.holder);
606
606
  addTranslate(f.comment);
607
+ var options = f.options;
608
+ if (options instanceof Array) options.forEach(o => {
609
+ addTranslate(o.name);
610
+ })
607
611
  });
608
612
  }
609
613
  }
@@ -611,26 +615,47 @@
611
615
  msg.setText(i18n`提取完成`);
612
616
  var result = [];
613
617
  var preMap = Object.create(null);
618
+ var againstid = 0;
614
619
  for (var e of pretrans) {
615
620
  var data = await readText(e);
616
621
  data = parseYML(data);
617
622
  loop: for (var d of data) {
618
623
  for (var k in d) {
619
- d[k] = d[k].replace(/^\s*([\s\S]*?)([:\:]?\s*)$/, '$1');
624
+ var s = d[k];
625
+ if (typeof s === 'string') d[k] = s.replace(/^\s*([\s\S]*?)([:\:]?\s*)$/, '$1');
620
626
  }
621
627
  var liang = 0, fanyi = {};
622
628
  for (var { lang: k, id } of supports) {
623
629
  if (!d[k]) continue;
624
- if (preMap[d[k]] && preMap[d[k]] !== d) {
625
- console.log(i18n`发现不同的翻译`, k, preMap[d[k]], d);
630
+ var pd = preMap[d[k]];
631
+ if (pd && pd !== d) {
632
+ if (shallowEqual(pd, d)) continue loop;
633
+ if (!pd.against) {
634
+ pd.against = ++againstid;
635
+ }
636
+ d.against = pd.against;
637
+ console.log(i18n`发现不同的翻译`, k, pd, d);
626
638
  }
627
639
  preMap[d[k]] = d;
628
640
  liang++;
629
641
  fanyi[id] = d[k];
630
642
  }
631
- result.push({ text: d[supports[0].lang], fanyi, liang });
643
+ d = { text: d[supports[0].lang], fanyi, liang, d };
644
+ result.push(d);
632
645
  }
633
646
  }
647
+ var againsts = [];
648
+ result = result.filter(a => {
649
+ var ag = a.d.against;
650
+ delete a.d;
651
+ if (!ag) return true;
652
+ var aga = againsts[ag];
653
+ if (!aga) aga = againsts[ag] = [];
654
+ aga.push(a);
655
+ });
656
+ againsts.forEach(a => {
657
+ result.unshift.apply(result, a);
658
+ });
634
659
  var untrans = [];
635
660
  Object.keys(textMap).map(k => {
636
661
  var texts = textMap[k];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "4.24.0",
3
+ "version": "4.24.2",
4
4
  "description": "一个开发环境,提供一种自由的前端开发模式,也可作为辅助工具使用。",
5
5
  "main": "public/efront.js",
6
6
  "directories": {