efront 4.24.0 → 4.24.1

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;
@@ -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,6 +178,7 @@
170
178
  selection = getSelection();
171
179
  render.refresh(nlist);
172
180
  };
181
+ var spacing = false;
173
182
  var getNodeAt = function (row, col) {
174
183
  var d = clist.at(row);
175
184
  if (!d) return [];
@@ -192,13 +201,13 @@
192
201
  if (inc + tl > col) {
193
202
  col -= inc;
194
203
  inc = 0;
195
- if (t.charAt(col - 1) === " ") {
204
+ if (!spacing && t.charAt(col - 1) === " ") {
196
205
  col++;
197
206
  }
198
207
  break;
199
208
  }
200
209
  else if (inc + tl === col) {
201
- if (t.charAt(col - inc - 1) === " ") col++;
210
+ if (!spacing && t.charAt(col - inc - 1) === " ") col++;
202
211
  else break;
203
212
  }
204
213
  inc += tl;
@@ -246,10 +255,12 @@
246
255
  var anchorChar = null, inText = false;
247
256
  var followChar = null, beforeText = false;
248
257
  var fixpace = function (event) {
258
+ spacing = true;
249
259
  event.preventDefault();
250
260
  insertText(' ', false);
251
261
  markAnchorOffset();
252
262
  unmarkAnchorOffset();
263
+ spacing = false;
253
264
  };
254
265
  var updatechar = function (event) {
255
266
  if (event.defaultPrevented) return;
@@ -413,7 +424,7 @@
413
424
  var patchAfter = '';
414
425
  switch (inputType) {
415
426
  case "insertText":
416
- if (data === ' ') return;
427
+ if (data === ' ') return false;
417
428
  if (anchorChar in pairsmap) {
418
429
  if (followChar === pairsmap[anchorChar] && data === followChar) {
419
430
  document.execCommand('forwardDelete');
@@ -429,6 +440,7 @@
429
440
  patchAfter = pairsmap[data];
430
441
  }
431
442
  }
443
+ spacing = false;
432
444
  break;
433
445
  case "insertParagraph":
434
446
  var i = getFocusRow();
@@ -444,11 +456,14 @@
444
456
  }
445
457
  if (patchAfter) {
446
458
  insertText(patchAfter, true);
459
+ markAnchorOffset();
447
460
  }
448
461
  return patchAfter;
449
462
  };
450
463
  var document_selection = document.getSelection();
464
+ var isInput = false;
451
465
  var insertText = function (text, isPatch) {
466
+ isInput = true;
452
467
  markAnchorOffset();
453
468
  var [an, ai, fn, fi] = selection;
454
469
  var [n, i] = getNodeAt(fn, fi);
@@ -474,7 +489,7 @@
474
489
  [an, ai] = getNodeAt(an, ai);
475
490
  document_selection.setBaseAndExtent(an, ai, n, i + d);
476
491
  }
477
-
492
+ markAnchorOffset();
478
493
  }
479
494
  var removeEndBR = function (d) {
480
495
  var e = d.lastChild;
@@ -512,8 +527,11 @@
512
527
  };
513
528
  on("input")(coder, function (event) {
514
529
  if (event.isComposing) return;
530
+ isInput = true;
515
531
  var id = ++coderid;
516
- if (updatecode(event) == null) {
532
+ spacing = true;
533
+ var patch = updatecode(event);
534
+ if (patch == null) {
517
535
  if (id !== coderid) return;
518
536
  // codetext = getCodeText();
519
537
  updateCodeHtml();
@@ -540,6 +558,7 @@
540
558
  keytab(1);
541
559
  });
542
560
  bind('selectionchange', document)(coder, function () {
561
+ if (isInput) return isInput = false;
543
562
  markAnchorOffset();
544
563
  });
545
564
  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.1",
4
4
  "description": "一个开发环境,提供一种自由的前端开发模式,也可作为辅助工具使用。",
5
5
  "main": "public/efront.js",
6
6
  "directories": {