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.
- package/#/345/233/275/351/231/205/345/214/226.yml +156 -108
- package/apps/pivot/api.yml +1 -0
- package/apps/pivot/cert/main.xht +1 -1
- package/apps/pivot/db/edit.xht +2 -2
- package/apps/pivot/home/welcome.html +45 -13
- package/apps/pivot/home/welcome.js +9 -2
- package/apps/pivot/home/welcome.less +16 -1
- package/apps/pivot/register.jsp +4 -0
- package/apps/pivot/task/invoke.html +1 -1
- package/apps/pivot/task/invoke.js +9 -1
- package/apps/pivot/task/invoke.less +3 -1
- package/coms/basic/parseURL.js +2 -2
- package/coms/basic/parseURL_test.js +2 -1
- package/coms/compile/translate.js +23 -0
- package/coms/explorer/context.js +11 -11
- package/coms/frame/dict.js +1 -1
- package/coms/frame/edit.html +3 -3
- package/coms/frame/list.js +2 -2
- package/coms/frame/route.js +0 -1
- package/coms/pivot/server-status.js +1 -0
- package/coms/reptile/cross.js +1 -0
- package/coms/zimoli/prompt.less +3 -1
- package/coms/zimoli/table.js +1 -1
- package/coms/zimoli/table.less +1 -2
- package/coms/zimoli/yousure.js +5 -1
- package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +62 -17
- package/docs//345/267/245/345/205/267//345/233/275/351/231/205/345/214/226.xht +29 -4
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/coms/basic/parseURL.js
CHANGED
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
// │ href │
|
|
18
18
|
// └────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
19
19
|
|
|
20
|
-
// -------///
|
|
21
|
-
var reg = /^([^\:\/\\\?#\[]+\:(?![^\:\/\\\?\#]*@|[\/\\][^\/\\]))?(?:\/\/|\\\\)?(?:(([^\:\/\\\?#]+)?(?:\:([^\/\\\?#]+))?)@)?(([^\/\\@\?\#\.]*?[^\/\\@\:\?\#\.\d][^\/\\@\:\?\#\.]*?|[^\/\\@\:\?\#\.]+(?:\:[
|
|
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
|
-
|
|
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({
|
package/coms/explorer/context.js
CHANGED
|
@@ -60,7 +60,7 @@ var popupEdit = function ($scope, active) {
|
|
|
60
60
|
};
|
|
61
61
|
return extend([
|
|
62
62
|
{
|
|
63
|
-
name: i18n
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
111
|
+
name: i18n`替换` + `(R)`,
|
|
112
112
|
when: never,
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
|
-
name: i18n
|
|
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
|
|
165
|
+
name: i18n`新建文件夹` + `(D)`,
|
|
166
166
|
when: notGetActive,
|
|
167
167
|
do: popupAdd
|
|
168
168
|
},
|
|
169
169
|
{
|
|
170
|
-
name: i18n
|
|
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
|
|
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
|
|
185
|
+
return this.confirm ? i18n`确认删除` + `(D)` : i18n`删除` + `(D)`;
|
|
186
186
|
},
|
|
187
187
|
hotkey: "Shift+Del",
|
|
188
188
|
confirm: false,
|
package/coms/frame/dict.js
CHANGED
|
@@ -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 ? "" :
|
|
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(", ");
|
package/coms/frame/edit.html
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<div head>
|
|
2
|
-
<span v-text="origin?'
|
|
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"
|
|
10
|
-
<button type="submit"
|
|
9
|
+
<btn @click="remove()" class="white">${i18n`取消`}</btn>
|
|
10
|
+
<button type="submit">${i18n`保存`}</button>
|
|
11
11
|
</div>
|
package/coms/frame/list.js
CHANGED
|
@@ -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";
|
package/coms/frame/route.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
data.from("status");
|
package/coms/reptile/cross.js
CHANGED
|
@@ -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,
|
package/coms/zimoli/prompt.less
CHANGED
|
@@ -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%;
|
package/coms/zimoli/table.js
CHANGED
package/coms/zimoli/table.less
CHANGED
package/coms/zimoli/yousure.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
625
|
-
|
|
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
|
-
|
|
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];
|