efront 4.9.1 → 4.9.3

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.
@@ -1,3 +1,9 @@
1
+ - zh-CN: 这个文件的内容不能在非nodejs环境中运行
2
+ en: The content of this file cannot be run in a non nodejs environment
3
+
4
+ - zh-CN: 这个文件的内容不能在线运行
5
+ en: The content of this file cannot be run online
6
+
1
7
  - zh-CN: 这个文件内的测试代码暂不支持在线查看
2
8
  en: The test code in this file does not currently support online viewing
3
9
 
@@ -87,7 +87,8 @@ function filterTime(time, formater) {
87
87
  var [year1, month1, date1, hour1, minute1, second1, milli1, day1] = getSplitedDate(now);
88
88
  var today = new Date(year1, month1 - 1, date1);
89
89
  var thatday = new Date(year, month - 1, date);
90
- var delta = (today - thatday) / 24 / 3600000;
90
+ var delta = (today - thatday) / 24 / 3600000 | 0;
91
+ var deltaSeconds = (new Date(year1, month1 - 1, date1, hour1, minute1, second1) - new Date(year, month - 1, date, hour, minute, second)) / 1000;
91
92
  if (minute === 0 && second === 0) var time = hour + "点整";
92
93
  else if (minute === 30 && second === 0) time = hour + "点半";
93
94
  else time = `${hour}:${fixLength(minute)}`;
@@ -103,18 +104,25 @@ function filterTime(time, formater) {
103
104
  }
104
105
  return `星期` + days[day] + time;
105
106
  }
107
+ if (deltaSeconds >= 0 && deltaSeconds < 60) {
108
+ return `刚刚`;
109
+ }
110
+ if (deltaSeconds < 0) {
111
+ if (deltaSeconds > -60) {
112
+ return `${-deltaSeconds | 0}秒后`;
113
+ }
114
+ if (deltaSeconds >= -3600) {
115
+ return `还有${-deltaSeconds / 60 | 0}分钟`;
116
+ }
117
+ if (deltaSeconds > -86400) {
118
+ var a = -deltaSeconds / 3600 | 0;
119
+ var b = (-deltaSeconds + (deltaSeconds / 3600 | 0) * 3600) / 60 | 0;
120
+ if (b === 0) return `还有${a}小时`;
121
+ return `还有${a}小时${b}分钟`;
122
+ }
123
+ }
106
124
  switch (delta) {
107
125
  case 0:
108
- if (minute === minute1 && hour === hour1) {
109
- if (second <= second1) return `刚刚`;
110
- return `${second - second1}秒后`;
111
- }
112
- else if (value > now) {
113
- if (hour === hour1) {
114
- return `${minute - minute1}分钟后`;
115
- }
116
- return `还有${hour - hour1}小时${minute - minute1}分钟`;
117
- }
118
126
  return time;
119
127
  case -1:
120
128
  return "明天" + time;
@@ -2,6 +2,17 @@ assert(filterTime(''), ``);
2
2
  assert(filterTime(null), '');
3
3
  assert(filterTime(undefined), '');
4
4
  assert(filterTime("我出生的第二年"), `我出生的第二年`);
5
+ assert(filterTime(+new Date + 86300000), '还有23小时58分钟');
6
+ assert(filterTime(+new Date + 110000), '还有1分钟');
7
+ assert(filterTime(+new Date + 120000), '还有2分钟');
8
+ assert(filterTime(+new Date + 60000), '还有1分钟');
9
+ assert(filterTime(+new Date + 59000), '59秒后');
10
+ assert(filterTime(+new Date + 58000), '58秒后');
11
+ assert(filterTime(+new Date + 8000), '8秒后');
12
+ assert(filterTime(+new Date + 1000), '1秒后');
13
+ assert(filterTime(+new Date), '刚刚');
14
+ assert(filterTime(+new Date), '刚刚');
15
+ assert(filterTime(+new Date - 59000), '刚刚');
5
16
  assert(filterTime(new Date(2024, 3, 3), `y年M月d日 h:mm`), '2024年4月3日 0:00');
6
17
  assert(filterTime(new Date(2024, 3, 3), `y年M月d日 h:mm`), '2024年4月3日 0:00');
7
18
  assert(filterTime(new Date(2024, 3, 3, 19, 26, 2, 100), `y年M月d日 h:mm:ss.SSS`), '2024年4月3日 19:26:02.100');
@@ -11,18 +11,18 @@ var codecolor = function (c, encode) {
11
11
  var deep = 0;
12
12
  var used = c.used;
13
13
  var setExpress = function (o, label) {
14
- var text = o.text;
14
+ if (!o.text) return;
15
15
  var keys = o.text.split(".");
16
16
  var next = o.next;
17
17
  if (next && next.type === SCOPED && next.entry === '(') {
18
- keys[keys.length - 1] = `<invoke>${keys[keys.length - 1]}</invoke>`;
18
+ if (!/^\</.test(keys[keys.length - 1])) keys[keys.length - 1] = `<invoke>${keys[keys.length - 1]}</invoke>`;
19
19
  }
20
- var [name0] = text.split(".");
21
20
  var [name] = keys;
22
- if (/^</.test(name0));
23
- else if (/^(arguments|this|super|Infinity|NaN)$/.test(name0)) name = `<strap>${name}</strap>`;
21
+ if (/^\</.test(name));
22
+ else if (c.program?.strap_reg.test(name) || c.program?.value_reg.test(name) || /^(this|arguments)$/.test(name)) name = `<strap>${name}</strap>`;
23
+ else name = `<${label}>${name}</${label}>`;
24
24
  keys[0] = name;
25
- o.text = keys.map(k => /^\</.test(k) || !k ? k : `<${label}>${k}</${label}>`).join(".");
25
+ o.text = keys.map(k => /^\</.test(k) || !k ? k : `<express>${k}</express>`).join(".");
26
26
  }
27
27
  var setPredef = o => setExpress(o, 'predef');
28
28
  var setOutside = o => setExpress(o, 'outside');
@@ -7,6 +7,7 @@
7
7
  color: #d4d4d4;
8
8
  font-family: Consolas, "Courier New", monospace;
9
9
  vertical-align: top;
10
+ text-decoration-line: none;
10
11
  }
11
12
 
12
13
  stamp {
@@ -1,6 +1,6 @@
1
1
  function main() {
2
2
  var page = div();
3
- page.innerHTML = SpeechReconigition_test;
3
+ page.innerHTML = SpeechRecognition_test;
4
4
  var rec = new SpeechRecognition;
5
5
  rec.onresult = function (event) {
6
6
  console.log('result', event);
@@ -1,36 +1,36 @@
1
- var change = lazy(async function (src) {
2
- if (src !== this.$src) return;
3
- if (!src) remove(this.with);
4
- else if (isNode(src)) {
5
- if (isElement(src) && this.$struct.copys) {
6
- for (var c of this.$struct.copys) {
7
- if (c.name === 'class') {
8
- addClass(src, c.value);
9
- }
10
- else if (c.name === 'style') {
11
- css(src, c.value);
1
+ function container(element) {
2
+ var change = lazy(async function (src) {
3
+ if (src !== this.$src) return;
4
+ if (!src) remove(this.with);
5
+ else if (isNode(src)) {
6
+ if (isElement(src) && this.$struct.copys) {
7
+ for (var c of this.$struct.copys) {
8
+ if (c.name === 'class') {
9
+ addClass(src, c.value);
10
+ }
11
+ else if (c.name === 'style') {
12
+ css(src, c.value);
13
+ }
14
+ else src.setAttribute(c.name, c.value);
12
15
  }
13
- else src.setAttribute(c.name, c.value);
14
16
  }
17
+ zimoli.global(src, this);
15
18
  }
16
- zimoli.global(src, this);
17
- }
18
- else if (isString(src) || +src < 0) {
19
- watch(this, 'params', onparams);
20
- onparams.call(this, this.params);
21
- }
22
- });
23
- var gosrc = function (src) {
24
- if (!isHandled(this.$src) && !isHandled(src)) return;
25
- if (src !== this.$src) {
26
- this.$src = src;
27
- change.call(this, src);
28
- }
29
- };
30
- var onparams = lazy(function (params) {
31
- zimoli.go(this.$src, params, this);
32
- });
33
- function container(element) {
19
+ else if (isString(src) || +src < 0) {
20
+ watch(this, 'params', onparams);
21
+ onparams.call(this, this.params);
22
+ }
23
+ });
24
+ var gosrc = function (src) {
25
+ if (!isHandled(this.$src) && !isHandled(src)) return;
26
+ if (src !== this.$src) {
27
+ this.$src = src;
28
+ change.call(this, src);
29
+ }
30
+ };
31
+ var onparams = lazy(function (params) {
32
+ zimoli.go(this.$src, params, this);
33
+ });
34
34
  var comment = document.createComment('container');
35
35
  comment.$struct = element.$struct;
36
36
  care(comment, gosrc);
@@ -27,7 +27,10 @@ var prototype = {
27
27
  return child;
28
28
  },
29
29
  appendChild(child) {
30
+ var _appendChild = this.appendChild
31
+ delete this.appendChild;
30
32
  appendChild(this, child, false);
33
+ if (_appendChild) this.appendChild = _appendChild;
31
34
  return child;
32
35
  },
33
36
  appendTo(target) {
@@ -12,7 +12,7 @@ var abs = Math.abs;
12
12
  */
13
13
  function slider() {
14
14
  var [autoplay, circle = true] = arguments;
15
- var outter = container.cloneNode();
15
+ var outter = null;
16
16
  {
17
17
  for (let cx = 0, dx = arguments.length; cx < dx; cx++) {
18
18
  let arg = arguments[cx];
@@ -25,6 +25,7 @@ function slider() {
25
25
  }
26
26
  }
27
27
  }
28
+ if (!outter) outter = container.cloneNode();
28
29
  var _imageMain = _slider.cloneNode();
29
30
  var _imageHelp = _slider.cloneNode();
30
31
  outter.src = function (index) {
@@ -5,7 +5,7 @@ render(page, {
5
5
  btn: button,
6
6
  slider(element) {
7
7
  var images = [1, 2, 3].map(function (i) {
8
- var ele = createElement(div);
8
+ var ele = document.createElement("div");
9
9
  text(ele, i);
10
10
  return ele;
11
11
  });
@@ -1,12 +1,11 @@
1
1
  & {
2
- height: 100px;
3
2
  width: 100%;
4
3
  background: #000;
5
4
  color: #fff;
6
5
  text-align: center;
7
6
  line-height: 100px;
8
7
  font-size: 60px;
9
- position: absolute;
8
+ position: relative;
10
9
  >div{
11
10
  position: relative;
12
11
  display: inline-block;
@@ -14,6 +13,9 @@
14
13
  height: 80px;
15
14
  }
16
15
  }
16
+ btn{
17
+ font-size: 14px;
18
+ }
17
19
 
18
20
  .slider {
19
21
  width: 100%;
@@ -99,7 +99,7 @@
99
99
  z-index: 1;
100
100
  }
101
101
  </style>
102
- <form onclick="event.preventDefault()">
102
+ <form onsubmit="event.preventDefault()">
103
103
  <xmenu -src="(t,i) in tags" @active="saveTagIndex(i)"></xmenu>
104
104
  <h2 head>
105
105
  <span -bind="name"></span>
@@ -125,8 +125,8 @@
125
125
  </span>
126
126
  </p4>
127
127
  </div>
128
- <div body onkeyup="!event.isComposing&&updatecode()" onkeydown.tab="keytab(event)" #coder codearea
129
- -elseif="tags[1].actived">
128
+ <div body onkeyup="!event.isComposing&&updatecode(event)" onkeydown.tab="keytab(event)" onkeyup.enter="ontab(false)"
129
+ #coder codearea -elseif="tags[1].actived">
130
130
  </div>
131
131
  <resultpad -if="tags[1].actived" .result #coderesult></resultpad>
132
132
  <div foot -if="tags[1].actived">
@@ -193,9 +193,10 @@
193
193
  render.refresh();
194
194
  if (tags[1].actived) loadcode();
195
195
  });
196
+ var modName = '';
196
197
  var loadcode = async function () {
197
198
  jschanged = false;
198
- var modName = name.replace(/\.js$/i, '_test');
199
+ modName = name.replace(/\.js$/i, '_test');
199
200
  if (doc.test) {
200
201
  var lessdata = [], htmldata = [];
201
202
  jstext = [];
@@ -370,7 +371,41 @@
370
371
  c.contentEditable = true;
371
372
  };
372
373
  var trimspace = (_, a) => a ? "" : " ";
373
- var updatecode = lazy(function () {
374
+ var ensp = s => Array(s + 1).join("\u2002"/*&ensp*/);
375
+ var getEnspBefore = function (node) {
376
+ if (!node) return 0;
377
+ while (node && (node.nodeType !== 1 || !/^br$/i.test(node.tagName))) {
378
+ node = node.previousSibling;
379
+ }
380
+ if (node) {
381
+ var next = node.nextSibling;
382
+ if (next) {
383
+ next = /^\u2002+/.exec(next.nodeValue);
384
+ if (next) return next[0].length;
385
+ }
386
+ }
387
+ };
388
+ var ontab = function (forcetab) {
389
+ var selection = document.getSelection();
390
+ var { anchorNode, anchorOffset } = selection;
391
+ if (anchorNode.nodeType === 1) {
392
+ var child = anchorNode.childNodes[anchorOffset];
393
+ var spaceSize = 4;
394
+ if (child.nodeType === 1) spaceSize = getEnspBefore(child?.previousSibling?.previousSibling || anchorNode);
395
+ if (!spaceSize && forcetab !== false) spaceSize = 4;
396
+ if (!spaceSize) return;
397
+ var space = document.createTextNode(ensp(spaceSize));
398
+ anchorNode.insertBefore(space, child);
399
+ selection.setBaseAndExtent(space, spaceSize, space, spaceSize);
400
+ }
401
+ else if (anchorNode.nodeType === 3) {
402
+ if (forcetab === 0) return;
403
+ anchorNode.nodeValue = anchorNode.nodeValue.slice(0, anchorOffset) + ensp(4) + anchorNode.nodeValue.slice(anchorOffset);
404
+ anchorOffset += 4;
405
+ selection.setBaseAndExtent(anchorNode, anchorOffset, anchorNode, anchorOffset);
406
+ }
407
+ };
408
+ var updatecode = lazy(function (event) {
374
409
  var trimreg = /[\s\u00a0\u2002\u0080]+([\}\{\;\[\]\(\)\,\>\<\+\-\*\&\^\/%!~:?])*/g;
375
410
  var innerText = coder.innerText;
376
411
  if (jstext.replace(trimreg, trimspace).trim() === innerText.replace(trimreg, trimspace).trim()) return;
@@ -393,6 +428,14 @@
393
428
  data.patchInstance("docscode", { codetext: jstext })
394
429
  var code = compile$scanner2(jstext);
395
430
  var envs = code.envs;
431
+ if (envs.require && !window.require) {
432
+ throw i18n`这个文件的内容不能在非nodejs环境中运行`;
433
+ }
434
+ for (var k in envs) {
435
+ if (/\_test/i.test(k) && k !== modName) {
436
+ if (isProduction) throw i18n`这个文件的内容不能在线运行`;
437
+ }
438
+ }
396
439
  var argNames = Object.keys(envs);
397
440
  var args = await Promise.all(argNames.map(a => init(a + "*" + live, null, { ["init*" + live]: init, ["put*" + live]: put, ["zimoli*" + live]: zimoli, ["appendChild*" + live]: appendChild, ["remove*" + live]: remove, ["render*" + live]: render })));
398
441
  var func = createFunction("", jstext, argNames, code.async, code.yield);
@@ -424,6 +467,7 @@
424
467
  };
425
468
  var keytab = function (event) {
426
469
  event.preventDefault();
470
+ ontab();
427
471
  };
428
472
 
429
473
  var saveTagIndex = function (i) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "4.9.1",
3
+ "version": "4.9.3",
4
4
  "description": "简化前端开发,优化web性能",
5
5
  "main": "public/efront.js",
6
6
  "directories": {