efront 4.23.4 → 4.23.6
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/apps/pivot/link/index.html +5 -0
- package/apps/pivot/link/list.html +23 -2
- package/coms/basic/spaces.js +7 -1
- package/coms/compile/Program.js +8 -4
- package/coms/compile/common.js +14 -0
- package/coms/compile/formatcode.js +6 -4
- package/coms/compile/rescan.js +2 -2
- package/coms/compile//347/264/240/351/246/250.js +1 -1
- package/coms/zimoli/list.js +0 -1
- package/coms/zimoli/menu.js +1 -8
- package/coms/zimoli/menuList.js +3 -3
- package/coms/zimoli/render.js +17 -11
- package/coms/zimoli/scrollbar.js +2 -1
- package/coms/zimoli/touchList.js +2 -2
- package/coms/zimoli/user.js +1 -0
- package/coms/zimoli/zimoli.js +10 -3
- package/coms//350/214/250/350/217/260/list.js +59 -0
- package/coms//350/214/250/350/217/260/list.less +3 -0
- package/coms//350/214/250/350/217/260/tab.js +128 -40
- package/coms//350/214/250/350/217/260//346/240/207/347/255/276/345/214/226.js +2 -2
- package/coms//350/214/250/350/217/260//346/270/262/346/237/223.js +0 -2
- package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +352 -116
- package/docs//347/273/204/344/273/266.xht +7 -4
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/public/pivot/page/auth/login.txt +1 -1
- package/public/pivot/page/cert/main.txt +1 -1
- package/public/pivot/page/cert/orders.txt +1 -1
- package/public/pivot/page/cert/update.txt +1 -1
- package/public/pivot/page/db/act.txt +1 -1
- package/public/pivot/page/db/config.txt +1 -1
- package/public/pivot/page/db/edit.txt +1 -1
- package/public/pivot/page/db/list.txt +1 -1
- package/public/pivot//344/270/273/351/241/265.html +2 -2
|
@@ -1,9 +1,30 @@
|
|
|
1
|
+
<style>
|
|
2
|
+
[head] {
|
|
3
|
+
margin-bottom: 10px;
|
|
4
|
+
>span,
|
|
5
|
+
>btn,
|
|
6
|
+
>swap {
|
|
7
|
+
vertical-align: top;
|
|
8
|
+
margin: 0 10px;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
btn {
|
|
12
|
+
float: right;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
</style>
|
|
17
|
+
<div head>
|
|
18
|
+
<span>
|
|
19
|
+
自动刷新
|
|
20
|
+
</span>
|
|
21
|
+
<swap -model="autoreload"></swap>
|
|
22
|
+
<btn @click="chat()">新建连接</btn>
|
|
23
|
+
</div>
|
|
1
24
|
<div class="clusters">
|
|
2
25
|
<a -repeat="(c,i) in clusters" ng-class="{current:i===index.index}" @click="active(i,c)">
|
|
3
26
|
<span -text="c"></span>
|
|
4
27
|
</a>
|
|
5
|
-
自动刷新<swap -model="autoreload"></swap>
|
|
6
|
-
<btn @click="chat()">新建连接</btn>
|
|
7
28
|
</div>
|
|
8
29
|
<lattice -src="c in clients">
|
|
9
30
|
<padding>
|
package/coms/basic/spaces.js
CHANGED
|
@@ -20,7 +20,13 @@ var unicode = [
|
|
|
20
20
|
"\\ud834[\\udd73-\\udd7a]"// "\\u{1d173}-\\u{1d17a}"
|
|
21
21
|
];
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
var toHex = a => {
|
|
24
|
+
a = a.charCodeAt(0).toString(16);
|
|
25
|
+
a = Array(5 - a.length).join('0') + a;
|
|
26
|
+
return "\\u" + a;
|
|
27
|
+
};
|
|
28
|
+
spaceDefined.avoid = function (extra_tokens, encodeAvoid) {
|
|
29
|
+
if (extra_tokens && encodeAvoid !== false) extra_tokens = extra_tokens.replace(/[^\w]/ig, toHex);
|
|
24
30
|
var u0 = "[^\\ud80c][\\udc00-\\udfff]|\\ud80c[^\\udffc]";
|
|
25
31
|
var u1 = "[^\\ud834][\\udc00-\\udfff]|\\ud834[^\\udd73-\\udd7a]";
|
|
26
32
|
return `[^${extra_tokens || ''}${spaceDefined.join('')}]|${u0}|${u1}`;
|
package/coms/compile/Program.js
CHANGED
|
@@ -241,7 +241,10 @@ class Program {
|
|
|
241
241
|
else if (!last || last.type === STAMP && (!(last.text in powermap)) && !last.istype) {
|
|
242
242
|
if (powermap[o.text] > powermap["="]) o.unary = true;
|
|
243
243
|
}
|
|
244
|
-
else if (last.type === STRAP && !last.isend
|
|
244
|
+
else if (last.type === STRAP && !last.isend
|
|
245
|
+
|| last.type === STAMP && !last.istype && !/^(\+\+|\-\-)$/.test(last.text)
|
|
246
|
+
|| last.type === SCOPED && !last.isExpress
|
|
247
|
+
) {
|
|
245
248
|
o.unary = /^[^=;,\:]$/.test(o.text);
|
|
246
249
|
if (o.unary && /^(\+|\-)$/.test(o.text) && last && last.type === STAMP && /^(\+\+|\-\-)$/.test(last.text)) o.unary = !!last.unary;
|
|
247
250
|
}
|
|
@@ -548,7 +551,6 @@ class Program {
|
|
|
548
551
|
m = match?.[0];
|
|
549
552
|
}
|
|
550
553
|
loop: while (index < text.length) {
|
|
551
|
-
|
|
552
554
|
if (queue.type & (QUOTED | ELEMENT)) {
|
|
553
555
|
var quote = quote_map[queue.entry];
|
|
554
556
|
var reg = quote.reg;
|
|
@@ -1050,7 +1052,7 @@ class Program {
|
|
|
1050
1052
|
scopes = this.compile(scopes);
|
|
1051
1053
|
tokens = Object.keys(tokens).join("");
|
|
1052
1054
|
tokens = this.compile(tokens);
|
|
1053
|
-
var express = `(?:\\\\u\\{[^\\}]+\\}|${spaceDefined.avoid(tokens)})+`;
|
|
1055
|
+
var express = `(?:\\\\u\\{[^\\}]+\\}|${spaceDefined.avoid(tokens, false)})+`;
|
|
1054
1056
|
this.express_reg = new RegExp(`^${express}$`);
|
|
1055
1057
|
this.space_reg = spaceDefined.is_reg;
|
|
1056
1058
|
this.space_exp = spaceDefined.reg;
|
|
@@ -1066,7 +1068,9 @@ class Program {
|
|
|
1066
1068
|
this.digit_reg = new RegExp(/^[+\-]?/.source + numbers, number_reg.flags);
|
|
1067
1069
|
this.entry_reg = new RegExp([`${spaceDefined.reg.source}|${quotes_entries}|[${scopes}]|${numbers}(?:${spaceDefined.avoid(tokens)})*|${express}|${powers_entries}|[${stamps}]`], "gi");
|
|
1068
1070
|
var stamps = this.stamps.slice();
|
|
1069
|
-
for (var k in this.powermap)
|
|
1071
|
+
for (var k in this.powermap) {
|
|
1072
|
+
if (k.length === 1 && stamps.indexOf(k) < 0) stamps.push(k);
|
|
1073
|
+
}
|
|
1070
1074
|
stamps.push.apply(stamps, powers);
|
|
1071
1075
|
this.stamp_reg = new RegExp(`^(${stamps.map(this.compile).join('|')})$`);
|
|
1072
1076
|
quoteslike.forEach(q => {
|
package/coms/compile/common.js
CHANGED
|
@@ -1835,6 +1835,19 @@ var patchArrawScope = function (arraw, origin) {
|
|
|
1835
1835
|
};
|
|
1836
1836
|
};
|
|
1837
1837
|
|
|
1838
|
+
var isDeclareOnly = function (o) {
|
|
1839
|
+
if (!o.kind) return false;
|
|
1840
|
+
while (o) {
|
|
1841
|
+
var q = o.queue;
|
|
1842
|
+
if (!q.kind) break;
|
|
1843
|
+
o = q;
|
|
1844
|
+
}
|
|
1845
|
+
var n = o.next;
|
|
1846
|
+
if (!n) return true;
|
|
1847
|
+
if (n.type !== STAMP || /^[,;]$/.test(n.text)) return true;
|
|
1848
|
+
return false;
|
|
1849
|
+
}
|
|
1850
|
+
|
|
1838
1851
|
module.exports = {
|
|
1839
1852
|
/* 1 */COMMENT,
|
|
1840
1853
|
/* 2 */SPACE,
|
|
@@ -1854,6 +1867,7 @@ module.exports = {
|
|
|
1854
1867
|
needfoot_reg,
|
|
1855
1868
|
unshort,
|
|
1856
1869
|
skipAssignment,
|
|
1870
|
+
isDeclareOnly,
|
|
1857
1871
|
getDeclared,
|
|
1858
1872
|
getBodyWith,
|
|
1859
1873
|
getFuncBody,
|
|
@@ -6,9 +6,11 @@ var {
|
|
|
6
6
|
relink,
|
|
7
7
|
} = require("./common");
|
|
8
8
|
var { createExpressList } = require("./washcode")
|
|
9
|
-
function format(code, step) {
|
|
9
|
+
function format(code, step, br) {
|
|
10
|
+
if (br === undefined) br = "\r\n";
|
|
11
|
+
else if (isEmpty(br)) br = '';
|
|
10
12
|
if (!code.length) return;
|
|
11
|
-
var rest = [
|
|
13
|
+
var rest = [br, code];
|
|
12
14
|
while (rest.length > 0) {
|
|
13
15
|
var code = rest.pop();
|
|
14
16
|
var lowspace = rest.pop();
|
|
@@ -54,8 +56,8 @@ function format(code, step) {
|
|
|
54
56
|
relink(code);
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
|
-
module.exports = function (code, tabSize) {
|
|
58
|
-
format(code, new Array(tabSize + 1).join(" "));
|
|
59
|
+
module.exports = function (code, tabSize, breakLine) {
|
|
60
|
+
format(code, new Array(tabSize + 1).join(" "), breakLine);
|
|
59
61
|
code.keepspace = true;
|
|
60
62
|
code.helpcode = true;
|
|
61
63
|
return code;
|
package/coms/compile/rescan.js
CHANGED
|
@@ -11,7 +11,7 @@ var patchObject = function (code, objs) {
|
|
|
11
11
|
continue;
|
|
12
12
|
}
|
|
13
13
|
if (c.type === EXPRESS) {
|
|
14
|
-
if (m =
|
|
14
|
+
if (m = /^&(\d+)$/.exec(c.text)) {
|
|
15
15
|
var o = cloneNode(objs[+m[1]], keep);
|
|
16
16
|
if (o instanceof Array) replace(c, ...o);
|
|
17
17
|
else replace(c, o);
|
|
@@ -25,7 +25,7 @@ function rescan(strs, ...args) {
|
|
|
25
25
|
var i = 0;
|
|
26
26
|
for (var s of strs) {
|
|
27
27
|
if (s) dist.push(s, ' ');
|
|
28
|
-
dist.push('
|
|
28
|
+
dist.push('&' + i++, " ");
|
|
29
29
|
}
|
|
30
30
|
dist.pop();
|
|
31
31
|
if (i > args.length) dist.pop();
|
|
@@ -298,7 +298,7 @@ macros.each = function () {
|
|
|
298
298
|
};
|
|
299
299
|
|
|
300
300
|
|
|
301
|
-
var presets = /^@(media|keyframes|layer|import|namespace|page|property|
|
|
301
|
+
var presets = /^@(media|keyframes|layer|import|namespace|page|property|supports|font-face|document|counter-style|charset|color-profile|container|font-feature-values|font-palette-values|scope|starting-style)(\s|\(|$)/i;
|
|
302
302
|
class 素心 extends Program {
|
|
303
303
|
straps = ["and", ...presets.source.replace(/^[\s\S]*?\(([\s\S]*?)\)[\s\S]*$/, '$1').split('|').map(a => "@" + a)];
|
|
304
304
|
stamps = `;:,>+~&!/`.split("");
|
package/coms/zimoli/list.js
CHANGED
|
@@ -664,7 +664,6 @@ function list() {
|
|
|
664
664
|
}
|
|
665
665
|
var savedSrc = [];
|
|
666
666
|
if (bindSrc === true) care(container, function (src, old) {
|
|
667
|
-
if (container.src !== src) return;
|
|
668
667
|
var index = container.index();
|
|
669
668
|
if (src !== old) container.clean(), index = 0;
|
|
670
669
|
else container.clean(src, savedSrc);
|
package/coms/zimoli/menu.js
CHANGED
|
@@ -181,10 +181,8 @@ function main() {
|
|
|
181
181
|
active(elem, item, null, elem.$src ? createItemTarget.call(elem, item, target) : target);
|
|
182
182
|
};
|
|
183
183
|
if ("$src" in elem) {
|
|
184
|
-
var src0 = [];
|
|
185
184
|
care(elem, function (src) {
|
|
186
185
|
bindGlobalkey(elem, src.keymap);
|
|
187
|
-
src0.splice(0, src0.length);
|
|
188
186
|
var s = getTreeFromData(src, selectedId);
|
|
189
187
|
if (s.actived) {
|
|
190
188
|
elem.selected = s.actived;
|
|
@@ -193,13 +191,8 @@ function main() {
|
|
|
193
191
|
elem.selected = s[0];
|
|
194
192
|
if (elem.selected) elem.selected.setActive(true);
|
|
195
193
|
}
|
|
196
|
-
var i = 0;
|
|
197
|
-
while (i < s.length) {
|
|
198
|
-
src0.push.apply(src0, s.slice(i, i += 1000));
|
|
199
|
-
}
|
|
200
|
-
elem.src = src0;
|
|
201
194
|
});
|
|
202
|
-
menuList(elem,
|
|
195
|
+
menuList(elem, null, emit, direction);
|
|
203
196
|
}
|
|
204
197
|
else {
|
|
205
198
|
var nodes = getArrayNodes(elem);
|
package/coms/zimoli/menuList.js
CHANGED
|
@@ -133,7 +133,7 @@ function main() {
|
|
|
133
133
|
if (!item.length) return;
|
|
134
134
|
var menu = item.menu;
|
|
135
135
|
if (!menu) {
|
|
136
|
-
var clone =render.clone(template);
|
|
136
|
+
var clone = render.clone(template);
|
|
137
137
|
clone.$src = src;
|
|
138
138
|
clone.innerHTML = template.innerHTML;
|
|
139
139
|
menu = item.menu = main(clone, item.children, active);
|
|
@@ -246,8 +246,8 @@ function main() {
|
|
|
246
246
|
switchMenu.done = true;
|
|
247
247
|
}, 300);
|
|
248
248
|
var hasIcon = function () {
|
|
249
|
-
var menus =
|
|
250
|
-
for (var menu of menus) {
|
|
249
|
+
var menus = page.src;
|
|
250
|
+
if (menus) for (var menu of menus) {
|
|
251
251
|
if (menu.icon) {
|
|
252
252
|
return true;
|
|
253
253
|
}
|
package/coms/zimoli/render.js
CHANGED
|
@@ -71,7 +71,7 @@ presets.template = function (t) {
|
|
|
71
71
|
window.elementRenders = elementRenders;
|
|
72
72
|
// -->
|
|
73
73
|
var isLe = function (a, b) {
|
|
74
|
-
return a.
|
|
74
|
+
return a.d <= b.d;
|
|
75
75
|
};
|
|
76
76
|
var renderidOffset = 10;
|
|
77
77
|
var renderidClosed = 0;
|
|
@@ -79,7 +79,7 @@ var addRenderElement = function () {
|
|
|
79
79
|
var element = this;
|
|
80
80
|
var renders = $renders.get(element);
|
|
81
81
|
buildFirst(renders);
|
|
82
|
-
if (renders.
|
|
82
|
+
if (renders.d > 10) {
|
|
83
83
|
saveToOrderedArray(elementRenders, renders, isLe);
|
|
84
84
|
}
|
|
85
85
|
};
|
|
@@ -93,7 +93,7 @@ var removeRenderElement = function () {
|
|
|
93
93
|
if (elementRenders[i] === renders) elementRenders.splice(i, 1);
|
|
94
94
|
};
|
|
95
95
|
var buildI = function (renders) {
|
|
96
|
-
if (getTargetIn(this, renders.
|
|
96
|
+
if (getTargetIn(this, renders.e)) rebuild(renders);
|
|
97
97
|
};
|
|
98
98
|
var buildO = function (renders) {
|
|
99
99
|
rebuild(renders);
|
|
@@ -145,7 +145,7 @@ var buildThisA = function (f) {
|
|
|
145
145
|
};
|
|
146
146
|
function rebuild(renders, isFirstRender) {
|
|
147
147
|
if (isFirstRender) delete renders.$ready;
|
|
148
|
-
var el = renders.
|
|
148
|
+
var el = renders.e;
|
|
149
149
|
var w = $watches.get(el);
|
|
150
150
|
if (el.$digest) digests.push(el);
|
|
151
151
|
if (!w) {
|
|
@@ -229,7 +229,7 @@ var createComment = function (type, expression) {
|
|
|
229
229
|
};
|
|
230
230
|
|
|
231
231
|
var initialComment = function (el, renders, struct) {
|
|
232
|
-
renders.
|
|
232
|
+
renders.e = el;
|
|
233
233
|
if (struct.once) renders.r1 = true;
|
|
234
234
|
$renders.set(el, renders);
|
|
235
235
|
renderlock.push(renders);
|
|
@@ -977,6 +977,9 @@ function renderEmits(replacer, emits, on) {
|
|
|
977
977
|
|
|
978
978
|
function renderRest(renders, element, struct, replacer = element) {
|
|
979
979
|
var { attrs, binds, emits, waits } = struct;
|
|
980
|
+
if (binds.src) {
|
|
981
|
+
if (!element.$src) element.$src = parseRepeat(binds.src);
|
|
982
|
+
}
|
|
980
983
|
renderDynamics(element, replacer, binds, attrs, renders);
|
|
981
984
|
if (!isElement(replacer)) replacer = element;
|
|
982
985
|
renderEmits.call(element, replacer, emits, emiters.on);
|
|
@@ -1386,11 +1389,11 @@ function createStructure(element, useExists) {
|
|
|
1386
1389
|
function unlock(renders) {
|
|
1387
1390
|
if (!renders) return;
|
|
1388
1391
|
if (!isOnce(renders)) {
|
|
1389
|
-
var node = renders.
|
|
1392
|
+
var node = renders.e;
|
|
1390
1393
|
var rid = renderIds.get(node) || 0;
|
|
1391
1394
|
if (rid < 10) {
|
|
1392
1395
|
rid = ++renderidOffset;
|
|
1393
|
-
renders.
|
|
1396
|
+
renders.d = rid;
|
|
1394
1397
|
renderIds.set(node, rid);
|
|
1395
1398
|
}
|
|
1396
1399
|
on("append")(node, addRenderElement);
|
|
@@ -1402,7 +1405,7 @@ function unlock(renders) {
|
|
|
1402
1405
|
}
|
|
1403
1406
|
var notNull = a => a;
|
|
1404
1407
|
var isOnce = a => a.r1;
|
|
1405
|
-
var notComment = a => !isOnce(a) && a.
|
|
1408
|
+
var notComment = a => !isOnce(a) && a.e.nodeType !== 8;
|
|
1406
1409
|
function renderUnlock(element) {
|
|
1407
1410
|
var locked = renderlock.filter(notNull);
|
|
1408
1411
|
renderlock = null;
|
|
@@ -1468,8 +1471,11 @@ $weaks = {
|
|
|
1468
1471
|
$parentScopes: $weaks('$parentScopes', $parented, "$parented"),
|
|
1469
1472
|
};
|
|
1470
1473
|
// -->
|
|
1471
|
-
var digest = lazy(refresh
|
|
1472
|
-
render.digest = render.apply = render.refresh =
|
|
1474
|
+
var digest = lazy(refresh);
|
|
1475
|
+
render.digest = render.apply = render.refresh = function (a) {
|
|
1476
|
+
if (isNode(a)) refresh(a);
|
|
1477
|
+
else digest();
|
|
1478
|
+
};
|
|
1473
1479
|
render.parseRepeat = parseRepeat;
|
|
1474
1480
|
"fullscreenchange,resize,load,hashchange".split(",").forEach(e => on(e)(window, digest));
|
|
1475
1481
|
var eventsBinders = "change,click,paste,cut,resize,keydown,keypress,keyup,input,drop".split(",").map(k => on(k));
|
|
@@ -1527,7 +1533,7 @@ var initRenders = function (target) {
|
|
|
1527
1533
|
var renders = $renders.get(target);
|
|
1528
1534
|
if (!renders) {
|
|
1529
1535
|
renders = [];
|
|
1530
|
-
renders.
|
|
1536
|
+
renders.e = target;
|
|
1531
1537
|
$renders.set(target, renders);
|
|
1532
1538
|
}
|
|
1533
1539
|
return renders;
|
package/coms/zimoli/scrollbar.js
CHANGED
|
@@ -164,7 +164,8 @@ var scrollbary = function () {
|
|
|
164
164
|
var l = target.getLastVisibleElement(0);
|
|
165
165
|
var height = 1;
|
|
166
166
|
if (f && l) {
|
|
167
|
-
height =
|
|
167
|
+
height = l.index - f.index;
|
|
168
|
+
if (height === 0) height = 1;
|
|
168
169
|
}
|
|
169
170
|
return [target.src.length, height];
|
|
170
171
|
}
|
package/coms/zimoli/touchList.js
CHANGED
|
@@ -101,10 +101,10 @@ var touchend = function () {
|
|
|
101
101
|
if (!currentTarget) return;
|
|
102
102
|
var marginLeft = -parseInt(currentTarget.scrollLeft) || 0;
|
|
103
103
|
moving = false;
|
|
104
|
-
if (direction
|
|
104
|
+
if (direction <= 1 && marginLeft < -7) {
|
|
105
105
|
scrollToLeft.call(currentTarget);
|
|
106
106
|
}
|
|
107
|
-
else if (direction
|
|
107
|
+
else if (direction >= 1 && marginLeft > -currentTarget.clientWidth + 7) {
|
|
108
108
|
scrollToRight.call(currentTarget);
|
|
109
109
|
}
|
|
110
110
|
else if (marginLeft < currentTarget.clientWidth - currentTarget.scrollWidth >> 1) {
|
package/coms/zimoli/user.js
CHANGED
package/coms/zimoli/zimoli.js
CHANGED
|
@@ -127,7 +127,7 @@ function go(pagepath, args, history_name, oldpagepath) {
|
|
|
127
127
|
if (!page_generators[pgpath]) {
|
|
128
128
|
return zimoli(pagepath, args, history_name, oldpagepath);
|
|
129
129
|
}
|
|
130
|
-
var page = create(pagepath, args, oldpagepath, roles, params);
|
|
130
|
+
var page = create(pagepath, args, oldpagepath, roles, params, history_name);
|
|
131
131
|
zimoliad = zimoliid;
|
|
132
132
|
var isRecover = pushstate(pagepath, history_name, oldpagepath);
|
|
133
133
|
if (isNode(history_name)) {
|
|
@@ -140,7 +140,7 @@ function go(pagepath, args, history_name, oldpagepath) {
|
|
|
140
140
|
page.disptch();
|
|
141
141
|
}
|
|
142
142
|
if (isRecover) setWithStyle(page, false);
|
|
143
|
-
|
|
143
|
+
page.mount(history_name, isRecover);
|
|
144
144
|
return page;
|
|
145
145
|
}
|
|
146
146
|
var page_generators = {};
|
|
@@ -416,9 +416,16 @@ function create(pagepath, args, from, needroles, zimolidata) {
|
|
|
416
416
|
dispatch(document, event);
|
|
417
417
|
fullfill_is_dispatched = 0;
|
|
418
418
|
}
|
|
419
|
+
var history_name = current_history;
|
|
420
|
+
var isRecover = false;
|
|
421
|
+
_page.mount = function (hname, isR) {
|
|
422
|
+
history_name = hname;
|
|
423
|
+
isRecover = isR;
|
|
424
|
+
addGlobal(this, history_name, isRecover);
|
|
425
|
+
}
|
|
419
426
|
_page.$reload = function () {
|
|
420
427
|
var _page = create(pagepath, undefined, from, undefined, zimolidata);
|
|
421
|
-
|
|
428
|
+
_page.mount(history_name, isRecover);
|
|
422
429
|
return _page;
|
|
423
430
|
};
|
|
424
431
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// 一个简化版的list,不支持回弹,且每行高度一致
|
|
2
|
+
function list(elem) {
|
|
3
|
+
var g = getGenerator(elem);
|
|
4
|
+
var src = [];
|
|
5
|
+
var childrenMap = [];
|
|
6
|
+
care(elem, function (src1, old) {
|
|
7
|
+
src = src1;
|
|
8
|
+
remove(elem.children);
|
|
9
|
+
if (isMounted(elem)) mount();
|
|
10
|
+
});
|
|
11
|
+
var at = function (i) {
|
|
12
|
+
var s = elem.start;
|
|
13
|
+
if (i < s) return;
|
|
14
|
+
var e = elem.end;
|
|
15
|
+
if (i >= e) return;
|
|
16
|
+
return elem.children[i - s];
|
|
17
|
+
}
|
|
18
|
+
var mount = function () {
|
|
19
|
+
var fsize = parseFloat(getComputedStyle(elem).lineHeight);
|
|
20
|
+
var { top, height } = getScreenPosition(elem);
|
|
21
|
+
var sheight = screen.height;
|
|
22
|
+
var i = 0;
|
|
23
|
+
if (top < -sheight) {
|
|
24
|
+
i = (-top - sheight) / fsize | 0;
|
|
25
|
+
}
|
|
26
|
+
elem.start = i;
|
|
27
|
+
css(elem, { paddingTop: i * 1.36 + 'em' });
|
|
28
|
+
top += i * fsize;
|
|
29
|
+
sheight += sheight;
|
|
30
|
+
var p = null;
|
|
31
|
+
while (top < sheight) {
|
|
32
|
+
var e = childrenMap[i];
|
|
33
|
+
if (!e) e = g(i, src[i]);
|
|
34
|
+
else delete childrenMap[i];
|
|
35
|
+
if (!e) break;
|
|
36
|
+
top += fsize;
|
|
37
|
+
e.i = i;
|
|
38
|
+
i++;
|
|
39
|
+
if (isMounted(e) && (!p || e.previousSibling === p));
|
|
40
|
+
else if (p) appendChild.after(p, e);
|
|
41
|
+
else appendChild(elem, e);
|
|
42
|
+
p = e;
|
|
43
|
+
}
|
|
44
|
+
elem.end = i;
|
|
45
|
+
};
|
|
46
|
+
var refresh = function () {
|
|
47
|
+
childrenMap = [];
|
|
48
|
+
Array.apply(null, elem.children).forEach(a => {
|
|
49
|
+
childrenMap[a.i] = a;
|
|
50
|
+
});
|
|
51
|
+
mount();
|
|
52
|
+
remove(childrenMap.filter(a => !!a));
|
|
53
|
+
childrenMap = [];
|
|
54
|
+
}
|
|
55
|
+
on("mounted")(elem, refresh);
|
|
56
|
+
elem.at = at;
|
|
57
|
+
elem.refresh = refresh;
|
|
58
|
+
return elem;
|
|
59
|
+
}
|
|
@@ -1,59 +1,147 @@
|
|
|
1
1
|
var ensp = s => Array(s + 1).join(" "/*&ensp*/);
|
|
2
|
-
var
|
|
2
|
+
var getPrevEnsp = function (rowNode) {
|
|
3
|
+
var prev = rowNode.previousSibling;
|
|
4
|
+
var m;
|
|
5
|
+
if (prev) {
|
|
6
|
+
m = /^\u0020+/.exec(prev.innerText);
|
|
7
|
+
if (m) m = m[0].length;
|
|
8
|
+
else m = 0;
|
|
9
|
+
var pl = prev.lastChild;
|
|
10
|
+
if (pl && /^deep/i.test(pl.tagName) && /[\{\[\(]$/.test(pl.innerText)) m += 4;
|
|
11
|
+
}
|
|
12
|
+
else m = 0;
|
|
13
|
+
var rf = rowNode.firstChild;
|
|
14
|
+
if (rf && /^deep/i.test(rf.tagName) && /[\}\]\)]$/.test(rf.innerText)) {
|
|
15
|
+
if (m > 4) m -= 4;
|
|
16
|
+
else m = 0;
|
|
17
|
+
}
|
|
18
|
+
return [rowNode, rf, m];
|
|
19
|
+
}
|
|
20
|
+
var getEnspAt = function (node, offset) {
|
|
3
21
|
if (!node) return 0;
|
|
4
|
-
while (node
|
|
5
|
-
|
|
22
|
+
while (node.nodeType === 1) {
|
|
23
|
+
var c = node.childNodes[offset];
|
|
24
|
+
if (!c) {
|
|
25
|
+
c = node.lastChild
|
|
26
|
+
}
|
|
27
|
+
if (!c) return [node, null, 0];
|
|
28
|
+
node = c;
|
|
29
|
+
if (node.nodeType === 3) {
|
|
30
|
+
offset = node.nodeValue.length;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
6
33
|
}
|
|
7
|
-
if (node) {
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
34
|
+
if (node.nodeType === 3) {
|
|
35
|
+
var t = node.nodeValue;
|
|
36
|
+
var s = offset;
|
|
37
|
+
while (t.charAt(s - 1) === " ") s--;
|
|
38
|
+
var e = offset;
|
|
39
|
+
while (t.charAt(e) === " ") e++;
|
|
40
|
+
var parentNode = node.parentNode;
|
|
41
|
+
var nextSibling = node.nextSibling;
|
|
42
|
+
if (e < t.length) {
|
|
43
|
+
var nextSibling1 = document.createTextNode(t.slice(e));
|
|
44
|
+
parentNode.insertBefore(nextSibling1, nextSibling);
|
|
45
|
+
nextSibling = nextSibling1;
|
|
46
|
+
}
|
|
47
|
+
if (s < t.length) {
|
|
48
|
+
if (s === 0) remove(node);
|
|
49
|
+
else node.nodeValue = t.slice(0, s);
|
|
50
|
+
}
|
|
51
|
+
return [parentNode, nextSibling, e - s];
|
|
52
|
+
}
|
|
53
|
+
return [node, null, 0];
|
|
54
|
+
};
|
|
55
|
+
var getFocusRows = function (elem, anchorNode, focusNode) {
|
|
56
|
+
var s = getTargetIn(elem, focusNode, false);
|
|
57
|
+
var e = getTargetIn(elem, anchorNode, false);
|
|
58
|
+
if (s.i > e.i) [s, e] = [e, s];
|
|
59
|
+
var rows = [];
|
|
60
|
+
if (!s || !e) return rows;
|
|
61
|
+
do {
|
|
62
|
+
rows.push(s);
|
|
63
|
+
s = s.nextSibling;
|
|
64
|
+
} while (s && s !== e);
|
|
65
|
+
rows.push(e);
|
|
66
|
+
return rows;
|
|
67
|
+
};
|
|
68
|
+
var tabRowRight = function (row) {
|
|
69
|
+
var e = document.createTextNode(ensp(4));
|
|
70
|
+
row.insertBefore(e, row.firstChild);
|
|
71
|
+
};
|
|
72
|
+
var tabRowLeft = function (row) {
|
|
73
|
+
var e = row.firstChild;
|
|
74
|
+
var size = 4;
|
|
75
|
+
while (e && size > 0) {
|
|
76
|
+
if (e.nodeType !== 3) break;
|
|
77
|
+
var nodeValue = e.nodeValue;
|
|
78
|
+
var m = / {1,4}|\t/.exec(nodeValue);
|
|
79
|
+
if (m) {
|
|
80
|
+
if (m === '\t') size -= 4;
|
|
81
|
+
else size -= m[0].length;
|
|
82
|
+
nodeValue = nodeValue.slice(m[0].length);
|
|
83
|
+
}
|
|
84
|
+
if (!nodeValue.length) {
|
|
85
|
+
var n = e.nextSibling;
|
|
86
|
+
remove(e);
|
|
87
|
+
e = n;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
size = 0;
|
|
12
91
|
}
|
|
13
92
|
}
|
|
14
93
|
};
|
|
15
|
-
|
|
94
|
+
var tabSelection = function (elem, anchorNode, focusNode, forcetab) {
|
|
95
|
+
var rows = getFocusRows(elem, anchorNode, focusNode);
|
|
96
|
+
if (forcetab > 0) rows.forEach(tabRowRight);
|
|
97
|
+
else if (forcetab < 0) rows.forEach(tabRowLeft);
|
|
98
|
+
};
|
|
99
|
+
return function (elem, forcetab) {
|
|
100
|
+
if (!elem) return;
|
|
16
101
|
var selection = document.getSelection();
|
|
17
102
|
var { anchorNode, anchorOffset, focusNode, focusOffset } = selection;
|
|
18
|
-
if (anchorNode !== focusNode || anchorOffset !== focusOffset) return;
|
|
103
|
+
if (anchorNode !== focusNode || anchorOffset !== focusOffset) return tabSelection(elem, anchorNode, focusNode, forcetab);
|
|
104
|
+
var rowNode = getTargetIn(elem, anchorNode, false);
|
|
105
|
+
var [parentNode, child, spaceSize] = getEnspAt(anchorNode, anchorOffset);
|
|
19
106
|
if (forcetab < 0) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (tempNode.nodeType === 1) {
|
|
24
|
-
if (/^br$/i.test(tempNode.tagName)) return;
|
|
25
|
-
tempNode = tempNode.lastChild || tempNode.previousSibling;
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
if (tempNode.nodeValue.indexOf(space) >= 0) {
|
|
29
|
-
tempNode.nodeValue = tempNode.nodeValue.replace(space, '');
|
|
30
|
-
if (tempNode === anchorNode) {
|
|
31
|
-
anchorOffset -= 4;
|
|
32
|
-
if (anchorOffset < 0) anchorOffset = 0;
|
|
33
|
-
selection.setBaseAndExtent(tempNode, anchorOffset, tempNode, anchorOffset);
|
|
34
|
-
}
|
|
35
|
-
return;
|
|
107
|
+
if (spaceSize > 4) {
|
|
108
|
+
if (spaceSize % 4 > 0) {
|
|
109
|
+
spaceSize -= spaceSize % 4;
|
|
36
110
|
}
|
|
37
|
-
|
|
38
|
-
tempNode = tempNode.previousSibling || tempNode.parentNode?.previousSibling;
|
|
111
|
+
else spaceSize -= 4;
|
|
39
112
|
}
|
|
113
|
+
else spaceSize = 0;
|
|
114
|
+
if (spaceSize > 0) {
|
|
115
|
+
space = document.createTextNode(ensp(spaceSize));
|
|
116
|
+
parentNode.insertBefore(space, child);
|
|
117
|
+
selection.setBaseAndExtent(space, spaceSize, space, spaceSize);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
tabRowLeft(rowNode);
|
|
40
121
|
return;
|
|
41
122
|
}
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
123
|
+
if (forcetab > 0) {
|
|
124
|
+
if (!spaceSize) {
|
|
125
|
+
if (!child) {
|
|
126
|
+
[parentNode, child, spaceSize] = getPrevEnsp(rowNode);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else if (!anchorOffset && !spaceSize || anchorOffset >= spaceSize) {
|
|
130
|
+
spaceSize += 4 - spaceSize % 4;
|
|
131
|
+
}
|
|
47
132
|
if (!spaceSize) return;
|
|
133
|
+
|
|
48
134
|
var space = document.createTextNode(ensp(spaceSize));
|
|
49
|
-
|
|
135
|
+
parentNode.insertBefore(space, child);
|
|
50
136
|
selection.setBaseAndExtent(space, spaceSize, space, spaceSize);
|
|
137
|
+
return;
|
|
51
138
|
}
|
|
52
|
-
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
139
|
+
if (forcetab === false) {
|
|
140
|
+
if (!rowNode.innerText) remove(rowNode.childNodes);
|
|
141
|
+
[parentNode, child, spaceSize] = getPrevEnsp(rowNode);
|
|
142
|
+
if (!spaceSize) return;
|
|
143
|
+
var space = document.createTextNode(ensp(spaceSize));
|
|
144
|
+
parentNode.insertBefore(space, child);
|
|
145
|
+
selection.setBaseAndExtent(space, spaceSize, space, spaceSize);
|
|
58
146
|
}
|
|
59
147
|
};
|