efront 4.23.3 → 4.23.5

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 (33) hide show
  1. package/apps/pivot/link/index.html +5 -0
  2. package/apps/pivot/link/list.html +23 -2
  3. package/coms/basic/spaces.js +6 -0
  4. package/coms/compile/Program.js +3 -1
  5. package/coms/compile/formatcode.js +6 -4
  6. package/coms/compile/rescan.js +2 -2
  7. package/coms/compile//347/264/240/351/246/250.js +1 -1
  8. package/coms/zimoli/list.js +0 -1
  9. package/coms/zimoli/menu.js +1 -8
  10. package/coms/zimoli/menuList.js +3 -3
  11. package/coms/zimoli/render.js +18 -12
  12. package/coms/zimoli/scrollbar.js +2 -1
  13. package/coms/zimoli/touchList.js +2 -2
  14. package/coms/zimoli/user.js +1 -0
  15. package/coms/zimoli/zimoli.js +10 -3
  16. package/coms//350/214/250/350/217/260/list.js +59 -0
  17. package/coms//350/214/250/350/217/260/list.less +3 -0
  18. package/coms//350/214/250/350/217/260/tab.js +128 -40
  19. package/coms//350/214/250/350/217/260//346/240/207/347/255/276/345/214/226.js +2 -2
  20. package/coms//350/214/250/350/217/260//346/270/262/346/237/223.js +0 -2
  21. package/coms//350/214/250/350/217/260//347/274/226/350/276/221/346/241/206.xht +299 -113
  22. package/docs//347/273/204/344/273/266.xht +7 -4
  23. package/package.json +1 -1
  24. package/public/efront.js +1 -1
  25. package/public/pivot/page/auth/login.txt +1 -1
  26. package/public/pivot/page/cert/main.txt +1 -1
  27. package/public/pivot/page/cert/orders.txt +1 -1
  28. package/public/pivot/page/cert/update.txt +1 -1
  29. package/public/pivot/page/db/act.txt +1 -1
  30. package/public/pivot/page/db/config.txt +1 -1
  31. package/public/pivot/page/db/edit.txt +1 -1
  32. package/public/pivot/page/db/list.txt +1 -1
  33. package/public/pivot//344/270/273/351/241/265.html +2 -2
@@ -1,2 +1,7 @@
1
+ <style>
2
+ menu{
3
+ margin: 10px 0;
4
+ }
5
+ </style>
1
6
  <menu @active="saveIndex(i)" -src="(m,i) in menus" #navbar></menu>
2
7
  <container -src="navbar.selected?.path"></container>
@@ -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>
@@ -20,7 +20,13 @@ var unicode = [
20
20
  "\\ud834[\\udd73-\\udd7a]"// "\\u{1d173}-\\u{1d17a}"
21
21
  ];
22
22
 
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
+ };
23
28
  spaceDefined.avoid = function (extra_tokens) {
29
+ if (extra_tokens) 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}`;
@@ -1066,7 +1066,9 @@ class Program {
1066
1066
  this.digit_reg = new RegExp(/^[+\-]?/.source + numbers, number_reg.flags);
1067
1067
  this.entry_reg = new RegExp([`${spaceDefined.reg.source}|${quotes_entries}|[${scopes}]|${numbers}(?:${spaceDefined.avoid(tokens)})*|${express}|${powers_entries}|[${stamps}]`], "gi");
1068
1068
  var stamps = this.stamps.slice();
1069
- for (var k in this.powermap) if (k.length === 1 && stamps.indexOf(k) < 0) stamps.push(k);
1069
+ for (var k in this.powermap) {
1070
+ if (k.length === 1 && stamps.indexOf(k) < 0) stamps.push(k);
1071
+ }
1070
1072
  stamps.push.apply(stamps, powers);
1071
1073
  this.stamp_reg = new RegExp(`^(${stamps.map(this.compile).join('|')})$`);
1072
1074
  quoteslike.forEach(q => {
@@ -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 = ["\r\n", code];
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;
@@ -11,7 +11,7 @@ var patchObject = function (code, objs) {
11
11
  continue;
12
12
  }
13
13
  if (c.type === EXPRESS) {
14
- if (m = /^#\\(\d+)$/.exec(c.text)) {
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('#\\' + i++, " ");
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|suppports|font-face|document|counter-style|charset|color-profile|container|font-feature-values|font-palette-values|scope|starting-style)(\s|\(|$)/i;
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("");
@@ -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);
@@ -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, src0, emit, direction);
195
+ menuList(elem, null, emit, direction);
203
196
  }
204
197
  else {
205
198
  var nodes = getArrayNodes(elem);
@@ -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 = items;
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
  }
@@ -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.id <= b.id;
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.id > 10) {
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.el)) rebuild(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.el;
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.el = el;
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,23 +1389,23 @@ function createStructure(element, useExists) {
1386
1389
  function unlock(renders) {
1387
1390
  if (!renders) return;
1388
1391
  if (!isOnce(renders)) {
1389
- var node = renders.el;
1392
+ var node = renders.e;
1390
1393
  var rid = renderIds.get(node) || 0;
1391
1394
  if (rid < 10) {
1392
1395
  rid = ++renderidOffset;
1393
- renders.id = rid;
1396
+ renders.d = rid;
1394
1397
  renderIds.set(node, rid);
1395
1398
  }
1396
1399
  on("append")(node, addRenderElement);
1397
1400
  onremove(node, removeRenderElement);
1398
1401
  }
1399
1402
  else {
1400
- buildFirst(node);
1403
+ buildFirst(renders);
1401
1404
  }
1402
1405
  }
1403
1406
  var notNull = a => a;
1404
1407
  var isOnce = a => a.r1;
1405
- var notComment = a => !isOnce(a) && a.el.nodeType !== 8;
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 = digest;
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.el = target;
1536
+ renders.e = target;
1531
1537
  $renders.set(target, renders);
1532
1538
  }
1533
1539
  return renders;
@@ -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 = 1 + l.index - f.index
167
+ height = l.index - f.index;
168
+ if (height === 0) height = 1;
168
169
  }
169
170
  return [target.src.length, height];
170
171
  }
@@ -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 < 0 && marginLeft < -7) {
104
+ if (direction <= 1 && marginLeft < -7) {
105
105
  scrollToLeft.call(currentTarget);
106
106
  }
107
- else if (direction > 0 && marginLeft > -currentTarget.clientWidth + 7) {
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) {
@@ -1,4 +1,5 @@
1
1
  var USERINFO = 'userinfo';
2
+ var encode62 = basic$encode62;
2
3
  var userInstance = data.getInstance(USERINFO);
3
4
  var emptyProto = {
4
5
  name: "",
@@ -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
- addGlobal(page, history_name, isRecover);
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
- appendChild.replace(this, _page);
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
+ }
@@ -0,0 +1,3 @@
1
+ & {
2
+ line-height: 1.36;
3
+ }
@@ -1,59 +1,147 @@
1
1
  var ensp = s => Array(s + 1).join(" "/*&ensp*/);
2
- var getEnspBefore = function (node) {
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 && (node.nodeType !== 1 || !/^br$/i.test(node.tagName))) {
5
- node = node.previousSibling;
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 next = node.nextSibling;
9
- if (next) {
10
- next = /^[\u2002\u0020\u00a0]+/.exec(next.nodeValue);
11
- if (next) return next[0].length;
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
- return function (forcetab) {
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
- var tempNode = anchorNode;
21
- var space = ensp(4);
22
- while (tempNode) {
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
- if (/[\r\n\u2028\u2029]/.test(tempNode.nodeValue)) return;
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 (anchorNode.nodeType === 1) {
43
- var child = anchorNode.childNodes[anchorOffset];
44
- var spaceSize = 4;
45
- if (child.nodeType === 1) spaceSize = getEnspBefore(child?.previousSibling?.previousSibling || anchorNode);
46
- if (!spaceSize && forcetab !== false) spaceSize = 4;
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
- anchorNode.insertBefore(space, child);
135
+ parentNode.insertBefore(space, child);
50
136
  selection.setBaseAndExtent(space, spaceSize, space, spaceSize);
137
+ return;
51
138
  }
52
- else if (anchorNode.nodeType === 3) {
53
- if (forcetab === 0) return;
54
- var spaceSize = (4 - anchorOffset % 4);
55
- anchorNode.nodeValue = anchorNode.nodeValue.slice(0, anchorOffset) + ensp(spaceSize) + anchorNode.nodeValue.slice(anchorOffset);
56
- anchorOffset += spaceSize;
57
- selection.setBaseAndExtent(anchorNode, anchorOffset, anchorNode, anchorOffset);
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
  };
@@ -1,5 +1,5 @@
1
1
 
2
- var { STRAP, SCOPED, ELEMENT, QUOTED, LABEL, COMMENT, STAMP, VALUE, EXPRESS, PROPERTY, PIECE, needhead_reg } = compile$common;
2
+ var { STRAP, SCOPED, ELEMENT, SPACE, QUOTED, LABEL, COMMENT, STAMP, VALUE, EXPRESS, PROPERTY, PIECE, needhead_reg } = compile$common;
3
3
  var predefs = Object.create(null);
4
4
  predefs.module = true;
5
5
  predefs.exports = true;
@@ -86,7 +86,7 @@ var codecolor = function (c, encode) {
86
86
  used[k].forEach(k in predefs ? setPredef : setOutside);
87
87
  }
88
88
  if (c.program) var { space_exp: spaceReg, control_reg } = c.program;
89
- if (spaceReg) var unspaceReg = new RegExp(`(?:[^${光标}])+`, 'g');
89
+ if (spaceReg) var unspaceReg = new RegExp(`(?:${spaces.avoid(光标)}+)`, 'g');
90
90
  var wraptext = function (t, l) {
91
91
  if (unspaceReg) t = t.replace(unspaceReg, a => {
92
92
  if (encode) a = encode(a);
@@ -11,10 +11,8 @@ var rows = function (type, text) {
11
11
  var c = 语言[type](text);
12
12
  标签化(c);
13
13
  text = c.toString();
14
-
15
14
  }
16
15
  else text = 标签化.encode(text);
17
-
18
16
  var codes = text.split(/\r\n|\r|\n/);
19
17
  var minSpace = Infinity;
20
18
  for (var c of codes) {