efront 3.25.2 → 3.25.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.
Files changed (40) hide show
  1. package/apps/index.jsp +97 -10
  2. package/apps/noice/index.html +43 -0
  3. package/apps/noice/main.html +3 -0
  4. package/apps/noice/main.js +96 -0
  5. package/apps/noice/main.less +30 -0
  6. package/coms/basic/FormData.js +11 -1
  7. package/coms/basic/Item.js +14 -5
  8. package/coms/basic/Tree.js +44 -5
  9. package/coms/basic/bdecode.js +34 -1
  10. package/coms/basic/cross_.js +95 -45
  11. package/coms/basic/decodeGBK.js +79 -0
  12. package/coms/basic/decodeGBK_test.js +16 -0
  13. package/coms/basic/isEmpty.js +1 -1
  14. package/coms/basic/parseKV.js +31 -3
  15. package/coms/basic/serialize.js +28 -4
  16. package/coms/frame/edit.js +3 -3
  17. package/coms/frame/list.html +4 -1
  18. package/coms/frame/list.js +18 -10
  19. package/coms/frame/list.less +3 -0
  20. package/coms/pivot/bdecode2.js +26 -0
  21. package/coms/pivot/plist.js +34 -2
  22. package/coms/reptile/cross.js +4 -2
  23. package/coms/view//344/272/272/346/260/221/345/270/201.js +53 -0
  24. package/coms/zimoli/audio.js +18 -4
  25. package/coms/zimoli/button.less +1 -1
  26. package/coms/zimoli/cast.js +11 -6
  27. package/coms/zimoli/chooseFile.js +11 -3
  28. package/coms/zimoli/contextmenu.js +37 -4
  29. package/coms/zimoli/cross.js +1 -1
  30. package/coms/zimoli/css.js +14 -5
  31. package/coms/zimoli/getGenerator.js +2 -2
  32. package/coms/zimoli/loading.html +1 -1
  33. package/coms/zimoli/menu.js +7 -7
  34. package/coms/zimoli/render.js +1 -1
  35. package/coms/zimoli/tree.js +8 -0
  36. package/coms/zimoli/tree.less +26 -0
  37. package/data/gbk.txt +1 -0
  38. package/package.json +1 -1
  39. package/public/efront.js +1 -1
  40. package/data/gbk-unicode-utf8-cn.txt +0 -6763
package/apps/index.jsp CHANGED
@@ -25,11 +25,24 @@
25
25
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
26
26
  <link rel="Shortcut Icon" href="/favicon.ico" type="image/x-icon" />
27
27
  <meta name="viewport" content="initial-scale=1,maximum-scale=1,width=device-width" />
28
- <title>efront 项目</title>
28
+ <title>欢迎使用 efront 开发套件</title>
29
29
  <style>
30
- html {
31
- height: 100%;
32
- font-family: "SF Pro SC", "SF Pro Text", "SF Pro Icons", "PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
30
+ h1 {
31
+ line-height: 1.2;
32
+ border: 12px solid transparent;
33
+ box-sizing: border-box;
34
+ text-indent: 32px;
35
+ font-size: 20px;
36
+ margin: 0;
37
+ font-weight: 400;
38
+ color: #fff;
39
+ background: #244 url('/favicon.ico') no-repeat left top 2px / 20px 20px;
40
+ }
41
+
42
+ [content] {
43
+ display: block;
44
+ font-size: 0;
45
+ padding: 12px 0 0 12px;
33
46
  }
34
47
 
35
48
  *,
@@ -39,19 +52,93 @@
39
52
  }
40
53
 
41
54
  body {
42
- border: none;
55
+ background: url('feedback/logo.svg') no-repeat left bottom -160px;
56
+ }
57
+
58
+ body,
59
+ html {
60
+ height: 100%;
43
61
  margin: 0;
44
62
  padding: 0;
45
- height: 100%;
46
- overflow: hidden;
63
+ }
64
+
65
+ th,
66
+ td {
67
+ text-align: left;
68
+ }
69
+
70
+ a {
71
+ display: inline-block;
72
+ width: 160px;
73
+ text-decoration: none;
74
+ line-height: 1.2;
75
+ margin: 0 12px 12px 0;
76
+ padding: 4px 6px;
77
+ border: 1px solid #0001;
78
+ background: #fff9;
79
+ }
80
+
81
+ a:hover {
82
+ border-color: #0004;
83
+ }
84
+
85
+ a>[name] {
86
+ font-size: 18px;
87
+ }
88
+
89
+ a>[time] {
90
+ font-size: 6px;
91
+ color: #999;
92
+ }
93
+
94
+ a:hover>[name] {
95
+ text-decoration: underline;
96
+ }
97
+
98
+ [name] {
99
+ display: block;
47
100
  }
48
101
  </style>
49
102
  </head>
50
103
 
51
104
  <body scroll=no max-render=1440>
52
- 欢迎使用efront开发套件
53
- <script serverside>
54
- return context.names.map(n => `<a href="${n}">${n}</a>`)
105
+ <div content>
106
+ <script serverside>
107
+ var rows = [];
108
+ var fs = require("fs");
109
+ var path = require("path");
110
+ for (var n of context.names) {
111
+ var stats = await new Promise(function (ok, oh) {
112
+ fs.stat(path.join(__dirname, n), function (error, stats) {
113
+ if (error) return oh(error);
114
+ ok(stats);
115
+ })
116
+ });
117
+
118
+ rows.push(`<a href="${n}?${stats.mtime.toLocaleDateString()}" target=_blank ><b name>${n}</b><span time>${stats.mtime.toLocaleDateString()}</span></a>`);
119
+ }
120
+ return rows.join('')
121
+ </script>
122
+ <a href="https://www.npmjs.com/package/efront">
123
+ <b name>efront</b>
124
+ <span time>&nbsp;</span>
125
+ </a>
126
+ </div>
127
+ <script>
128
+ - function () {
129
+ var time = document.body.querySelector("a:last-child>[time]");
130
+ var xhr = new XMLHttpRequest;
131
+ xhr.open("get", '/**www.npmjs.com/package/efront');
132
+ xhr.onload = function () {
133
+ var d = xhr.getResponseHeader("last-modified");
134
+ if (!d) return;
135
+ d = new Date(d);
136
+ time.innerHTML = d.toLocaleDateString();
137
+ var a = time.parentNode;
138
+ a.href += '?' + +d;
139
+ };
140
+ xhr.send();
141
+ }();
55
142
  </script>
56
143
  </body>
57
144
 
@@ -0,0 +1,43 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ http://efront.cc
4
+ -->
5
+ <html lang="zh-CN">
6
+
7
+ <head>
8
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
9
+ <meta charset="utf-8" />
10
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
11
+ <link rel="Shortcut Icon" href="/favicon.ico" type="image/x-icon" />
12
+ <meta name="viewport" content="initial-scale=1,maximum-scale=1,width=device-width" />
13
+ <title>声音监测仪</title>
14
+ <script deleteoncompile efrontloader>
15
+ // 若要在开发环境使用内置组件,请保留此script标签中的代码,在编译发布时,这里的代码会自动删除
16
+ efrontNoice = true;
17
+ </script>
18
+ <script>if (!window.efrontNoice && /^http\:/i.test(location.href)) location.href = location.href.replace(/^http\:/i, 'https:');</script>
19
+ <style>
20
+ html {
21
+ height: 100%;
22
+ font-family: "SF Pro SC", "SF Pro Text", "SF Pro Icons", "PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
23
+ }
24
+
25
+ *,
26
+ ::before,
27
+ ::after {
28
+ box-sizing: border-box;
29
+ }
30
+
31
+ body {
32
+ border: none;
33
+ margin: 0;
34
+ padding: 0;
35
+ height: 100%;
36
+ overflow: hidden;
37
+ }
38
+ </style>
39
+ </head>
40
+
41
+ <body scroll=no max-render=1440></body>
42
+
43
+ </html>
@@ -0,0 +1,3 @@
1
+ <span -bind="noice"></span>
2
+ <canvas></canvas>
3
+ <a>http://efront.cc/noice/</a>
@@ -0,0 +1,96 @@
1
+ var avg = function (list) {
2
+ var sum = 0, dp = 1;
3
+ for (var cx = 0, dx = list.length; cx < dx; cx++) {
4
+ var p = Math.sin(cx / dx * Math.PI);
5
+ p = p * p;
6
+ sum += list[cx] * p;
7
+ dp += p;
8
+ }
9
+ return sum / dp;
10
+ };
11
+ class Ndb {
12
+ constructor(now, ndb) {
13
+ this.now = now;
14
+ this.ndb = ndb;
15
+ }
16
+ valueOf() {
17
+ return this.ndb;
18
+ }
19
+ }
20
+ function init() {
21
+ var recoder = audio.getRecorder();
22
+ recoder.init("f");
23
+ var _block = document.createElement("noice");
24
+ _block.innerHTML = template;
25
+ render(_block, recoder);
26
+ var canvas = _block.querySelector("canvas");
27
+ canvas.width = +innerWidth;
28
+ canvas.height = +innerHeight;
29
+ var context = canvas.getContext("2d");
30
+ var date = new Date;
31
+ var noice = 0;
32
+ var noiceList, noiceCache;
33
+ var gradient = context.createLinearGradient(0, 0, 0, canvas.height); //创建渐变对象 渐变开始点和渐变结束点
34
+ gradient.addColorStop(0, '#f096'); //添加颜色点
35
+ gradient.addColorStop(0.7, '#ff06'); //添加颜色点
36
+ gradient.addColorStop(0.9, '#0cc3'); //添加颜色点
37
+ gradient.addColorStop(1, '#0cc0'); //添加颜色点
38
+ var gradient1 = context.createLinearGradient(0, 0, 0, canvas.height); //创建渐变对象 渐变开始点和渐变结束点
39
+ gradient1.addColorStop(0, '#f09'); //添加颜色点
40
+ gradient1.addColorStop(0.7, '#f90'); //添加颜色点
41
+ gradient1.addColorStop(.9, '#0cc6'); //添加颜色点
42
+ gradient1.addColorStop(1, '#0cc0'); //添加颜色点
43
+ recoder.noice = "0dB";
44
+ recoder.onprocess = function (buffer) {
45
+ if (!noiceList) noiceList = new Array(buffer.length), noiceCache = [];
46
+ context.clearRect(0, 0, canvas.width, canvas.height);
47
+ context.beginPath();
48
+ context.moveTo(0, canvas.offsetHeight / 2);
49
+ var maxdb = -1;
50
+ var mindb = 1;
51
+ var now = new Date;
52
+ var dt = now - date;
53
+ var sch = 1000;
54
+ date = now;
55
+ var dx = canvas.width / buffer.length;
56
+ Array.prototype.forEach.call(buffer, function (db, cx) {
57
+ if (db > maxdb) maxdb = db;
58
+ if (db < mindb) mindb = db;
59
+ context.lineTo(cx * dx, canvas.height / 2 - db / 4 * canvas.height);
60
+ });
61
+ context.strokeStyle = "#000";
62
+ context.stroke();
63
+ if (dt > sch) return;
64
+ var ndb = 20 * Math.log10((maxdb - mindb) * 2 ** 16);
65
+ if (noiceCache.length && now - noiceCache[0].now > 400) noiceCache.shift();
66
+ noiceCache.push(new Ndb(now, ndb));
67
+ noice = avg(noiceCache);
68
+ if (+noice) recoder.noice = noice.toFixed() + "dB";
69
+ context.beginPath();
70
+ noiceList.shift();
71
+ noiceList.push(new Ndb(now, noice));
72
+ var start = false;
73
+ noiceList.forEach(function (db, cx) {
74
+ if (!start) {
75
+ start = true;
76
+ context.moveTo(cx * dx, canvas.height);
77
+ return;
78
+ }
79
+ context.lineTo(cx * dx, canvas.height - db / 100 * canvas.height);
80
+ });
81
+ context.lineTo(canvas.width, canvas.height);
82
+ context.fillStyle = gradient;
83
+ context.strokeStyle = gradient1;
84
+ context.stroke();
85
+ context.fill();
86
+ render.refresh();
87
+ };
88
+ onmounted(_block, function () {
89
+ _block.$scope.start();
90
+ })
91
+ return _block;
92
+
93
+ }
94
+ function main() {
95
+ return init();
96
+ }
@@ -0,0 +1,30 @@
1
+ & {
2
+ display: block;
3
+ height: 100%;
4
+ }
5
+
6
+ >canvas {
7
+ width: 100%;
8
+ height: 100%;
9
+ background-image: url('data:image/png;base64,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');
10
+ background-size: 20px;
11
+ }
12
+
13
+ >span {
14
+ display: block;
15
+ font-size: 120px;
16
+ top: 12%;
17
+ line-height: 260px;
18
+ text-align: center;
19
+ position: relative;
20
+ margin-bottom: -260px;
21
+ }
22
+
23
+ >a {
24
+ position: absolute;
25
+ color: #69c;
26
+ left: 16px;
27
+ bottom: 10px;
28
+ line-height: 1;
29
+ background: #fff;
30
+ }
@@ -1,14 +1,24 @@
1
1
  var FormData = this.FormData;
2
2
  if (!FormData) {
3
3
  FormData = function FormData() {
4
- this.form = {};
4
+ this.form = Object.create(null);
5
5
  }
6
6
 
7
7
  FormData.prototype.append = function (key, value) {
8
+ if (!this.form[key]) this.form[key] = [];
8
9
  this.form[key] = value;
9
10
  };
10
11
 
11
12
  FormData.prototype.toString = function () {
12
13
  return serialize(this.form);
13
14
  };
15
+ FormData.prototype.keys = function () {
16
+ return Object.keys(this.form);
17
+ };
18
+ FormData.prototype.getAll = function (k) {
19
+ return this.form[k] ? this.form[k].slice() : [];
20
+ };
21
+ FormData.prototype.get = function (k) {
22
+ return this.form[k] ? this.form[k][0] : null;
23
+ };
14
24
  }
@@ -10,7 +10,8 @@ class Item extends Array {
10
10
  this.extends(value);
11
11
  }
12
12
  extends(value) {
13
- this.value = value;
13
+ if (value instanceof Item) this.value = value.value;
14
+ else this.value = value;
14
15
  if (value.children instanceof Array) {
15
16
  var children = value.children.map(item => new Item(item));
16
17
  children.forEach(item => item.parent = item);
@@ -28,6 +29,9 @@ class Item extends Array {
28
29
  if (value.href) this.href = value.href;
29
30
  if (value.src) this.src = value.src;
30
31
  }
32
+ else {
33
+ this.tab = 1;
34
+ }
31
35
  }
32
36
 
33
37
  valueOf() {
@@ -48,10 +52,12 @@ class Item extends Array {
48
52
  }
49
53
 
50
54
  isClosed() {
51
- return !!this.value.closed;
55
+ if (isObject(this.value)) return !!this.value.closed;
56
+ return this.closed;
52
57
  }
53
58
  setClosed(value) {
54
- this.value.closed = value;
59
+ if (isObject(this.value)) this.value.closed = value;
60
+ else this.closed = value;
55
61
  }
56
62
  isActive() {
57
63
  if (isObject(this.value)) {
@@ -71,13 +77,16 @@ class Item extends Array {
71
77
  this.actived = value;
72
78
  }
73
79
  isSelected() {
74
- return !!this.value.selected;
80
+ if (isObject(this.value)) return !!this.value.selected;
81
+ return this.selected;
75
82
  }
76
83
  isChecked() {
84
+ if (isObject(this.value)) return !!this.value.checked;
77
85
  return !!this.value.checked;
78
86
  }
79
87
  getClass() {
80
- return !!this.value.class;
88
+ if (isObject(this.value)) return !!this.value.class;
89
+ return this.class;
81
90
  }
82
91
 
83
92
  }
@@ -1,4 +1,10 @@
1
+ var setRoot = function (item, root) {
2
+ item.root = root;
3
+ for (var o of item) setRoot(o, root);
4
+ };
1
5
  class Tree extends Array {
6
+ count = 0;
7
+ total = 0;
2
8
  constructor(src) {
3
9
  if (src instanceof Tree) return src;
4
10
  if (src instanceof Array && src[0] && ('tab' in src[0] || 'deep' in src[0])) {
@@ -11,6 +17,7 @@ class Tree extends Array {
11
17
  return Tree.fromData(src.children);
12
18
  }
13
19
  super();
20
+ this.root = this;
14
21
  }
15
22
  static fromData(array) {
16
23
  if (array instanceof Tree) return array;
@@ -133,21 +140,53 @@ class Tree extends Array {
133
140
  result.deep = max_deep;
134
141
  return result;
135
142
  }
136
- static appendTo(parent, datas) {
143
+ static remove(item) {
144
+ var parent = item.parent;
145
+ if (parent) {
146
+ delete item.parent;
147
+ var index = parent.indexOf(item);
148
+ if (index >= 0) {
149
+ parent.splice(index, 1);
150
+ var count = item.count;
151
+ var total = item.total;
152
+ while (parent) {
153
+ parent.count -= count;
154
+ parent.total -= total;
155
+ }
156
+ }
157
+ }
158
+ }
159
+ static appendTo(parent) {
137
160
  var tab = parent && parent.tab + 1 || 1;
138
161
  var length = parent.length;
162
+ var datas = [];
163
+ for (var cx = 1, dx = arguments.length; cx < dx; cx++) {
164
+ var arg = arguments[cx];
165
+ if (arg instanceof Item) datas.push(arg);
166
+ else if (arg instanceof Array) datas.push.apply(datas, arg);
167
+ else datas.push(arg);
168
+ }
139
169
  for (var data of datas) {
140
- if (isObject(data)) {
141
- data.tab = tab;
142
- var item = new Item(data);
170
+ if (isObject(data) || isString(data)) {
171
+ var item;
172
+ if (data instanceof Item) {
173
+ item = data;
174
+ Tree.remove(item);
175
+ }
176
+ else {
177
+ item = new Item(data);
178
+ }
179
+ item.tab = tab;
180
+ if (item.closed === undefined) item.closed = true;
143
181
  item.parent = parent;
144
- item.root = parent.root;
182
+ if (parent.root && item.root !== parent.root) setRoot(item, parent.root);
145
183
  parent.push(item);
146
184
  }
147
185
  }
148
186
  var delta = parent.length - length;
149
187
  while (parent) {
150
188
  parent.count += delta;
189
+ parent.total += delta;
151
190
  parent = parent.parent;
152
191
  }
153
192
  }
@@ -33,6 +33,39 @@ function decode(str, i) {
33
33
  }
34
34
  return [, str.length]
35
35
  }
36
+ var _indexOf = Array.prototype.indexOf;
37
+ function decodeArrayBuffer(a, i) {
38
+ var e = i;
39
+ switch (a[i]) {
40
+ case 105://i
41
+ e = _indexOf.call(a, 101/*e*/, i);
42
+ if (e < 0) e = a.length;
43
+ return [+String.fromCharCode.apply(String, a.slice(i + 1, e)), e + 1];
44
+ case 100://d
45
+ var res = {};
46
+ i++;
47
+ while (i < a.length && a[i] !== 101) {
48
+ var [k, i] = decodeArrayBuffer(a, i);
49
+ var [v, i] = decodeArrayBuffer(a, i);
50
+ k = decodeUTF8(k);
51
+ res[k] = v;
52
+ }
53
+ return [res, i + 1];
54
+ case 108://l
55
+ var res = [];
56
+ i++;
57
+ while (i < a.length && a[i] !== 101) {
58
+ var [o, i] = decodeArrayBuffer(a, i);
59
+ res.push(o);
60
+ }
61
+ return [res, i + 1];
62
+ default:
63
+ e = i;
64
+ while (a[i] >= 48/*0*/ && a[i] <= 57/*9*/) i++;
65
+ var l = +String.fromCharCode.apply(String, a.slice(e, i));
66
+ return [a.slice(++i, i += l), i];
67
+ }
68
+ }
36
69
  function bdecode(str) {
37
- return decode(str, 0)[0];
70
+ return str instanceof ArrayBuffer ? decodeArrayBuffer(new Uint8Array(str), 0)[0] : decode(str, 0)[0];
38
71
  }