efront 3.26.15 → 3.27.0
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/api.yml +2 -1
- package/apps/pivot/link/index.html +1 -1
- package/apps/pivot/link/index.js +4 -1
- package/apps/pivot/link/list.js +4 -3
- package/coms/basic/isSame.js +3 -0
- package/coms/basic/loader.js +1 -1
- package/coms/basic/mark.js +44 -16
- package/coms/frame/chat.html +1 -1
- package/coms/frame/chat.js +25 -5
- package/coms/frame/chat.less +9 -2
- package/coms/zimoli/data.js +4 -3
- package/coms/zimoli/deepEqual.js +1 -3
- package/coms/zimoli/getGenerator.js +8 -4
- package/coms/zimoli/grid.js +1 -1
- package/coms/zimoli/list.js +4 -0
- package/coms/zimoli/render.js +1 -1
- package/coms/zimoli/spacechar_test.js +38 -0
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/apps/pivot/api.yml
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
run: options :::run
|
|
4
4
|
share: options ::share-:opt?:path
|
|
5
5
|
folder: options ::file-:opt:::path?:to
|
|
6
|
-
cluster: options ::cluster
|
|
6
|
+
cluster: options ::cluster-list
|
|
7
|
+
clients: options ::cluster-list?:id
|
|
7
8
|
list: options :::type
|
|
8
9
|
edit: options :::type-:key?:value
|
|
9
10
|
add: options :::type-:key+:value
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<menu -src="m in menus" #navbar></menu>
|
|
1
|
+
<menu @active="saveIndex(i)" -src="(m,i) in menus" #navbar></menu>
|
|
2
2
|
<container -src="navbar.selected?.path"></container>
|
package/apps/pivot/link/index.js
CHANGED
|
@@ -6,8 +6,11 @@ function index() {
|
|
|
6
6
|
var [name, path] = a.split(/\s+/);
|
|
7
7
|
return { name, path };
|
|
8
8
|
}),
|
|
9
|
+
saveIndex(index) {
|
|
10
|
+
data.setInstance('link-index', index);
|
|
11
|
+
},
|
|
9
12
|
menu,
|
|
10
13
|
});
|
|
11
|
-
page.$scope.menus[
|
|
14
|
+
page.$scope.menus[+data.getInstance("link-index")].actived = true;
|
|
12
15
|
return page;
|
|
13
16
|
}
|
package/apps/pivot/link/list.js
CHANGED
|
@@ -4,7 +4,7 @@ function main() {
|
|
|
4
4
|
page.innerHTML = template;
|
|
5
5
|
renderWithDefaults(page, {
|
|
6
6
|
load: lazy(async function () {
|
|
7
|
-
this.clusters = data.lazyInstance("cluster"
|
|
7
|
+
this.clusters = data.lazyInstance("cluster");
|
|
8
8
|
await this.clusters;
|
|
9
9
|
this.active();
|
|
10
10
|
}, -1000),
|
|
@@ -25,11 +25,12 @@ function main() {
|
|
|
25
25
|
return ((new Date - d) / 1000 | 0) + "秒";
|
|
26
26
|
},
|
|
27
27
|
clients: [],
|
|
28
|
-
active(index = this.index.index | 0) {
|
|
28
|
+
async active(index = this.index.index | 0, c) {
|
|
29
29
|
data.setInstance('index', { index });
|
|
30
30
|
var clusters = this.clusters;
|
|
31
31
|
if (index >= clusters.length) index = clusters.length - 1;
|
|
32
|
-
this.clients =
|
|
32
|
+
if (c) this.clients = [];
|
|
33
|
+
this.clients = await data.asyncInstance("clients", { id: clusters[index] });
|
|
33
34
|
},
|
|
34
35
|
});
|
|
35
36
|
var loadid = 0;
|
package/coms/basic/loader.js
CHANGED
|
@@ -299,7 +299,7 @@ var loadModule = function (name, then, prebuilds = {}) {
|
|
|
299
299
|
if (error) {
|
|
300
300
|
if (!errored[error]) errored[error] = [];
|
|
301
301
|
errored[error].push(key);
|
|
302
|
-
_errored.push(error);
|
|
302
|
+
if (_errored.indexOf(error) < 0) _errored.push(error);
|
|
303
303
|
}
|
|
304
304
|
if (loadingCount === args.length) {
|
|
305
305
|
if (_errored.length) loadedModules[key].error = _errored;
|
package/coms/basic/mark.js
CHANGED
|
@@ -84,41 +84,64 @@ var power = function (source, search) {
|
|
|
84
84
|
return [0, source];
|
|
85
85
|
};
|
|
86
86
|
|
|
87
|
-
|
|
88
87
|
var power2 = function (src1, src2) {
|
|
88
|
+
var c = compare(src1, src2);
|
|
89
|
+
var p = c.pop();
|
|
90
|
+
if (!p) return [src1, src2, 0];
|
|
91
|
+
src1 = src1.slice(0, 0);
|
|
92
|
+
src2 = src2.slice(0, 0);
|
|
93
|
+
for (var a of c) {
|
|
94
|
+
if (a.different) src1 = src1.concat(a[0]), src2 = src2.concat(a[1]);
|
|
95
|
+
else src1 = src1.concat(MARK_PRE1, a, MARK_AFT1), src2 = src2.concat(MARK_PRE2, a, MARK_AFT2);
|
|
96
|
+
}
|
|
97
|
+
return [src1, src2, p];
|
|
98
|
+
};
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
|
|
100
|
+
var different = function (src1, src2) {
|
|
101
|
+
var res = [src1, src2];
|
|
102
|
+
res.different = true;
|
|
103
|
+
return res;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
var compare = function (src1, src2, min = 0) {
|
|
107
|
+
if (!src2 || !src1 || !src1.slice || !src2.slice) {
|
|
108
|
+
if (isSame(src1, src2)) return [src1, 1];
|
|
109
|
+
return [different(src1, src2), 0];
|
|
92
110
|
}
|
|
93
111
|
var matchers = couple(src1, src2);
|
|
94
112
|
var [match_text, match_start1, match_start2] = matchers;
|
|
95
|
-
if (match_text.length >
|
|
113
|
+
if (match_text.length > min) {
|
|
96
114
|
var src1_pre = src1.slice(0, match_start1);
|
|
97
115
|
var src1_aft = src1.slice(match_start1 + match_text.length);
|
|
98
116
|
var src2_pre = src2.slice(0, match_start2);
|
|
99
117
|
var src2_aft = src2.slice(match_start2 + match_text.length);
|
|
100
118
|
var pp = 0, ap = 0;
|
|
101
119
|
var p = match_text.length;
|
|
120
|
+
var pre, aft;
|
|
102
121
|
if (src1_pre.length) p += .1 / src1_pre.length - .2;
|
|
103
122
|
if (src1_aft.length) p += .1 / src1_aft.length - .1;
|
|
104
|
-
if (src1_pre.length > 0
|
|
105
|
-
|
|
123
|
+
if (src1_pre.length > 0 || src2_pre.length > 0) {
|
|
124
|
+
pre = compare(src1_pre, src2_pre);
|
|
125
|
+
pp = pre.pop();
|
|
106
126
|
}
|
|
107
|
-
|
|
108
|
-
|
|
127
|
+
else {
|
|
128
|
+
pre = [];
|
|
109
129
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
130
|
+
if (src1_aft.length > 0 || src2_aft.length > 0) {
|
|
131
|
+
aft = compare(src1_aft, src2_aft);
|
|
132
|
+
ap = aft.pop();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
aft = [];
|
|
136
|
+
}
|
|
137
|
+
p += (pp + ap) / src1.length / src2.length * .01;
|
|
138
|
+
pre.push(match_text);
|
|
139
|
+
return pre.concat(aft, p);
|
|
116
140
|
}
|
|
117
|
-
return [src1, src2, 0];
|
|
141
|
+
return [different(src1, src2), 0];
|
|
118
142
|
|
|
119
143
|
};
|
|
120
144
|
|
|
121
|
-
|
|
122
145
|
var setTag1 = function (pre, aft) {
|
|
123
146
|
if (arguments.length === 1) {
|
|
124
147
|
if (pre instanceof Array) {
|
|
@@ -153,5 +176,10 @@ mark.setTag1 = setTag1;
|
|
|
153
176
|
mark.setTag2 = setTag2;
|
|
154
177
|
mark.power = power;
|
|
155
178
|
mark.power2 = power2;
|
|
179
|
+
mark.compare = function (a, b) {
|
|
180
|
+
var c = compare(a, b);
|
|
181
|
+
c.power = c.pop();
|
|
182
|
+
return c;
|
|
183
|
+
};
|
|
156
184
|
mark.pair = pair;
|
|
157
185
|
mark.couple = couple;
|
package/coms/frame/chat.html
CHANGED
package/coms/frame/chat.js
CHANGED
|
@@ -14,14 +14,36 @@ function msg(elem, { m: data }, parentScopes) {
|
|
|
14
14
|
elem.innerText = data;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
var userManager = function (users, m) {
|
|
18
|
+
for (var cx = 0, dx = users.length; cx < dx; cx++) {
|
|
19
|
+
var u = users[cx];
|
|
20
|
+
if (u.id === m.id) {
|
|
21
|
+
if (m.deleted) users.splice(cx, 1);
|
|
22
|
+
else Object.assign(u, m);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!m.deleted) users.push(m);
|
|
27
|
+
};
|
|
17
28
|
function chat(title = '会话窗口') {
|
|
18
29
|
var page = view();
|
|
19
30
|
page.innerHTML = template;
|
|
20
31
|
drag.on(page.firstElementChild, page);
|
|
21
32
|
resize.on(page);
|
|
22
33
|
var localid = Date.now() + Math.sin(Math.random());
|
|
34
|
+
var users = [];
|
|
23
35
|
page.push = function (msgs) {
|
|
24
36
|
var { msglist } = this.$scope;
|
|
37
|
+
msgs = msgs.filter(m => {
|
|
38
|
+
if (!m) return false;
|
|
39
|
+
if (isString(m)) return true;
|
|
40
|
+
switch (m.type) {
|
|
41
|
+
case 'user':
|
|
42
|
+
userManager(users, m);
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
});
|
|
25
47
|
msglist.push.apply(msglist, msgs);
|
|
26
48
|
var chat = page.querySelector("chat");
|
|
27
49
|
var lastmsg = chat.getLastVisibleElement();
|
|
@@ -35,8 +57,8 @@ function chat(title = '会话窗口') {
|
|
|
35
57
|
renderWithDefaults(page, {
|
|
36
58
|
chat: list,
|
|
37
59
|
title,
|
|
38
|
-
grid,
|
|
39
60
|
msglist: [],
|
|
61
|
+
users,
|
|
40
62
|
text: '',
|
|
41
63
|
localid,
|
|
42
64
|
msg,
|
|
@@ -47,8 +69,7 @@ function chat(title = '会话窗口') {
|
|
|
47
69
|
var textarea = body.querySelector("[textarea]");
|
|
48
70
|
var lastElementChild = textarea.lastElementChild;
|
|
49
71
|
var targetHeight = Math.min(textarea.scrollHeight, body.clientHeight * .6, lastElementChild.offsetTop + lastElementChild.offsetHeight);
|
|
50
|
-
if (Math.abs(targetHeight - textarea.clientHeight) < 2) return;
|
|
51
|
-
|
|
72
|
+
if (Math.abs(targetHeight - textarea.clientHeight - textarea.clientTop) < 2) return;
|
|
52
73
|
body.resizeCell(textarea, 'top', textarea.clientHeight - targetHeight - 2);
|
|
53
74
|
},
|
|
54
75
|
send() {
|
|
@@ -61,8 +82,7 @@ function chat(title = '会话窗口') {
|
|
|
61
82
|
|
|
62
83
|
data = encode62.timeencode(data);
|
|
63
84
|
if (this.text.length > 2000) {
|
|
64
|
-
alert("信息太长,无法发送!");
|
|
65
|
-
return;
|
|
85
|
+
return alert("信息太长,无法发送!");
|
|
66
86
|
}
|
|
67
87
|
cast(page, "send", data);
|
|
68
88
|
this.body.lastElementChild.focus();
|
package/coms/frame/chat.less
CHANGED
|
@@ -76,19 +76,26 @@ msg {
|
|
|
76
76
|
line-height: 24px;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
>grid
|
|
79
|
+
>grid {
|
|
80
80
|
padding-top: 0;
|
|
81
81
|
margin-bottom: 0;
|
|
82
|
+
height: 100%;
|
|
83
|
+
background-color: #f2f4f6;
|
|
84
|
+
width: 100%;
|
|
82
85
|
|
|
83
86
|
>div {
|
|
84
87
|
height: 100%;
|
|
85
88
|
position: relative;
|
|
86
89
|
}
|
|
90
|
+
|
|
91
|
+
>chat {
|
|
92
|
+
padding-top: 50px;
|
|
93
|
+
}
|
|
87
94
|
}
|
|
88
95
|
|
|
89
96
|
|
|
90
97
|
.editor-height(@height) {
|
|
91
|
-
>grid
|
|
98
|
+
>grid:not(:last-child) {
|
|
92
99
|
padding-bottom: @height;
|
|
93
100
|
}
|
|
94
101
|
|
package/coms/zimoli/data.js
CHANGED
|
@@ -811,12 +811,12 @@ var data = {
|
|
|
811
811
|
},
|
|
812
812
|
fromApi(api, params, parse) {
|
|
813
813
|
var id = parse instanceof Function ? getInstanceId() : 0;
|
|
814
|
+
var p = privates.fromApi(api, params);
|
|
814
815
|
if (id) this.removeInstance(id);
|
|
815
816
|
var url = api.url;
|
|
816
817
|
var response = this.getInstance(id || url);
|
|
817
818
|
if (!isObject(response)) response = new LoadingArray;
|
|
818
819
|
this.responseLoading(response);
|
|
819
|
-
var p = privates.fromApi(api, params);
|
|
820
820
|
response.loading = p.loading;
|
|
821
821
|
p = response.loading_promise = p.then((data) => {
|
|
822
822
|
response.loading = null;
|
|
@@ -838,11 +838,11 @@ var data = {
|
|
|
838
838
|
},
|
|
839
839
|
fromURL(url, parse) {
|
|
840
840
|
var id = parse instanceof Function ? getInstanceId() : 0;
|
|
841
|
+
var p = privates.loadIgnoreConfig('get', url);
|
|
841
842
|
if (id) this.removeInstance(id);
|
|
842
843
|
var response = this.getInstance(id || url);
|
|
843
844
|
if (!isObject(response)) response = new LoadingArray;
|
|
844
845
|
this.responseLoading(response);
|
|
845
|
-
var p = privates.loadIgnoreConfig('get', url);
|
|
846
846
|
response.loading = p.loading;
|
|
847
847
|
p = response.loading_promise = p.then((data) => {
|
|
848
848
|
response.loading = null;
|
|
@@ -925,6 +925,7 @@ var data = {
|
|
|
925
925
|
}
|
|
926
926
|
var outdate = new Error("request outdate.");
|
|
927
927
|
var aborted = new Error("request aborted.");
|
|
928
|
+
this.responseLoading(instance);
|
|
928
929
|
promise1 = instance.loading_promise = new Promise(function (ok) {
|
|
929
930
|
if (!instance.loading) {
|
|
930
931
|
instance.loading = false;
|
|
@@ -938,7 +939,6 @@ var data = {
|
|
|
938
939
|
if (instance.loading) {
|
|
939
940
|
instance.loading.abort();
|
|
940
941
|
}
|
|
941
|
-
this.responseLoading(instance);
|
|
942
942
|
var params2 = privates.pack(sid, params1);
|
|
943
943
|
if (!privates.validApi(api, params2)) throw aborted;
|
|
944
944
|
let url = api.url;
|
|
@@ -979,6 +979,7 @@ var data = {
|
|
|
979
979
|
this.responseLoaded(instance);
|
|
980
980
|
return data;
|
|
981
981
|
});
|
|
982
|
+
promise1.params = params;
|
|
982
983
|
promise1.catch((e) => {
|
|
983
984
|
if (e === outdate || e === aborted) return;
|
|
984
985
|
this.responseCrash(e, instance);
|
package/coms/zimoli/deepEqual.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
var singleEqual =
|
|
2
|
-
return o1 === o2 || isNumber(o1) && isNumber(o2) && isNaN(o1) && isNaN(o2);
|
|
3
|
-
};
|
|
1
|
+
var singleEqual = isSame;
|
|
4
2
|
var deepEqualMarkLabel = "__zimo1i_deep_equal_mark_label";
|
|
5
3
|
var restcompare = [];
|
|
6
4
|
var ALLOW_CACHE_LENGTH = Math.min(SAFE_CIRCLE_DEPTH, 1024) * Math.min(SAFE_CIRCLE_DEPTH, 1024);
|
|
@@ -25,12 +25,16 @@ var getGenerator = function (container, tagName = 'item') {
|
|
|
25
25
|
container.$generatorScopes = scopes;
|
|
26
26
|
if (container.$generator) return container.$generator;
|
|
27
27
|
var template = document.createElement(container.tagName);
|
|
28
|
-
var templates = []
|
|
28
|
+
var templates = [];
|
|
29
|
+
for (let a of container.childNodes) {
|
|
29
30
|
if (a.hasAttribute('insert')) {
|
|
30
|
-
|
|
31
|
+
if (!templates.length) a.$isbefore = true;
|
|
32
|
+
else a.$isafter = true;
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
else {
|
|
35
|
+
templates.push(a);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
34
38
|
if (templates.length < container.childNodes.length && templates.length >= 1) {
|
|
35
39
|
var c = document.createComment('lattice');
|
|
36
40
|
c.index = null;
|
package/coms/zimoli/grid.js
CHANGED
|
@@ -203,6 +203,7 @@ var resizeView = function (event) {
|
|
|
203
203
|
grid.reshape();
|
|
204
204
|
};
|
|
205
205
|
var clearResizer = function (grid) {
|
|
206
|
+
if (!grid.editting) return;
|
|
206
207
|
var target = grid.editting.target;
|
|
207
208
|
if (target) target.style.zIndex = null;
|
|
208
209
|
var { clientX, clientY } = grid.editting;
|
|
@@ -758,7 +759,6 @@ var createPointsWithChildren = function () {
|
|
|
758
759
|
points = [0, points];
|
|
759
760
|
}
|
|
760
761
|
grid.setData(points);
|
|
761
|
-
console.log(grid.clientHeight, elements)
|
|
762
762
|
grid.reshape();
|
|
763
763
|
};
|
|
764
764
|
function main(elem) {
|
package/coms/zimoli/list.js
CHANGED
|
@@ -145,6 +145,10 @@ function ylist(container, generator, $Y) {
|
|
|
145
145
|
var ratio = itemIndex - index || 0;
|
|
146
146
|
var childrenMap = getChildrenMap();
|
|
147
147
|
var offsetBottom = 0, ratioTop = 0, offset = index, last_item = getFirstElement(0) || null, last_index = last_item && last_item.index || offset;
|
|
148
|
+
if (!last_item) {
|
|
149
|
+
last_item = list.lastChild;
|
|
150
|
+
while (last_item && last_item.$isafter) last_item = last_item.previousSibling;
|
|
151
|
+
}
|
|
148
152
|
if (last_item) last_item = getNodeTarget(last_item);
|
|
149
153
|
var count = 0, delta = 1, bottom_item, offsett = offset, offsetb = offset, top_item;
|
|
150
154
|
var indexed_item;
|
package/coms/zimoli/render.js
CHANGED
|
@@ -381,7 +381,7 @@ var renderStructure = function (element) {
|
|
|
381
381
|
if ($struct.repeat) var { value: repeat } = $struct.repeat;
|
|
382
382
|
if (!ifkey) return createRepeat.call(element, repeat);
|
|
383
383
|
if (!ifexp || !repeat) {
|
|
384
|
-
delete $struct.if;
|
|
384
|
+
if (repeat) delete $struct.if;
|
|
385
385
|
return structures[key].call(element, ifexp);
|
|
386
386
|
}
|
|
387
387
|
var { before, after } = parseIfWithRepeat(ifexp, repeat);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// 以前我骂防疫人员,在别人亲切的喊他们白衣天使的时候,我冷冷地说他们是白面无常。
|
|
2
|
+
// 后来我骂共产党,因为听到退疫的大白说的故事,无辜的打工人是怎么被它们圈禁至死的,他说的活灵活现,我不得不信。
|
|
3
|
+
// 想想自己被锁在楼里的岁月,我们合租的9个人,平均每星期收到一棵白菜两根萝卜,后来连白菜萝卜也要别人拿着个人信息去交换,就像为了活下去就不得不跪舔高高在上的它们.....刚正不阿的人被逼到跳楼也属正常。
|
|
4
|
+
// 政府只顾着大肆宣扬自己的功绩,对枉死之人置若罔闻。是怪大白没有上报?还是抢来的府权本就带贼的属性?
|
|
5
|
+
// 如果没有共产党,也许是另一翻罪恶的景象,但是为恶之人,天未诛之,还要我去赞颂它吗?
|
|
6
|
+
|
|
7
|
+
function findAllSpace(start = 0, end = start + 256) {
|
|
8
|
+
// #<--
|
|
9
|
+
var canvas = document.createElement("canvas");
|
|
10
|
+
canvas.height = 32;
|
|
11
|
+
canvas.width = 32;
|
|
12
|
+
css(canvas, 'right:0;bottom:80px;position:absolute;background-color:#fff;');
|
|
13
|
+
document.body.appendChild(canvas);
|
|
14
|
+
var context = canvas.getContext("2d", { willReadFrequently: true });
|
|
15
|
+
context.font = "16px";
|
|
16
|
+
context.textBaseline = "top";
|
|
17
|
+
var res = [], total = 0;
|
|
18
|
+
for (var cx = start, dx = end; cx < dx; cx++) {
|
|
19
|
+
context.clearRect(0, 0, canvas.width, canvas.height);
|
|
20
|
+
// 判断字符串是否由空格组成
|
|
21
|
+
var s = String.fromCodePoint(cx);
|
|
22
|
+
context.fillText(s, canvas.width >> 2, canvas.height >> 2);
|
|
23
|
+
context.strokeText(s, canvas.width >> 2, canvas.height >> 2);
|
|
24
|
+
var imgdata = context.getImageData(0, 0, canvas.width, canvas.height).data;
|
|
25
|
+
if (imgdata.findIndex(a => a !== 0) >= 0) continue;
|
|
26
|
+
res[cx] = s;
|
|
27
|
+
total++;
|
|
28
|
+
}
|
|
29
|
+
context.clearRect(0, 0, 14, 14);
|
|
30
|
+
context.fillText(String.fromCodePoint(65), 0, 7);
|
|
31
|
+
res.total = total;
|
|
32
|
+
// -->
|
|
33
|
+
return res;
|
|
34
|
+
}
|
|
35
|
+
var startTime = performance.now();
|
|
36
|
+
var spaces = findAllSpace(0, 0x7fff);
|
|
37
|
+
console.log(performance.now() - startTime);
|
|
38
|
+
console.log(spaces);
|