efront 4.33.3 → 4.34.1
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/#/345/233/275/351/231/205/345/214/226.yml +12 -0
- package/apps/_index.html +1 -4
- package/apps/pivot/link/chat.js +3 -3
- package/apps/pivot/link/list.html +1 -1
- package/coms/basic/renderExpress.js +2 -2
- package/coms/basic/renderExpress_test.js +1 -0
- package/coms/basic_/Symbol.js +12 -7
- package/coms/compile/autoenum.js +25 -4
- package/coms/compile/downLevel.js +14 -8
- package/coms/frame/chat-rtc.xht +1 -1
- package/coms/frame/chat.html +20 -11
- package/coms/frame/chat.js +159 -46
- package/coms/frame/chat.less +30 -0
- package/coms/zimoli/copyToClipboard.js +46 -0
- package/coms/zimoli/removeUnsafeTags.js +21 -0
- package/coms/zimoli/render.js +56 -10
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/public//346/226/207/344/273/266/347/263/273/347/273/237//344/270/273/351/241/265.jsp +2 -2
|
@@ -40,6 +40,18 @@
|
|
|
40
40
|
- zh-CN: 禁用
|
|
41
41
|
en: Disable
|
|
42
42
|
|
|
43
|
+
- zh-CN: 复制失败!
|
|
44
|
+
en: Copy failed!
|
|
45
|
+
|
|
46
|
+
- zh-CN: 允许
|
|
47
|
+
en: allow
|
|
48
|
+
|
|
49
|
+
- zh-CN: 不允许
|
|
50
|
+
en: not allowed
|
|
51
|
+
|
|
52
|
+
- zh-CN: 是否允许来自$1($2)的公网会话?
|
|
53
|
+
en: Will you allow public network sessions from $1 ($2)?
|
|
54
|
+
|
|
43
55
|
- zh-CN: 压缩算法不支持
|
|
44
56
|
en: Compression algorithm not supported
|
|
45
57
|
|
package/apps/_index.html
CHANGED
package/apps/pivot/link/chat.js
CHANGED
|
@@ -3,7 +3,7 @@ async function link(id, page) {
|
|
|
3
3
|
id = await data.from("link");
|
|
4
4
|
}
|
|
5
5
|
if (!page.name) $scoped.get(page).title = `会话窗口(<span nodrag>${id}</span>)`;
|
|
6
|
-
page.
|
|
6
|
+
page.clientid = id;
|
|
7
7
|
var removed = false;
|
|
8
8
|
on("remove")(page, function () {
|
|
9
9
|
removed = true;
|
|
@@ -21,8 +21,8 @@ function main(params) {
|
|
|
21
21
|
else id = params;
|
|
22
22
|
var page = frame$chat(name);
|
|
23
23
|
if (name) page.name = name;
|
|
24
|
-
care(page, 'send', function (msg) {
|
|
25
|
-
data.from("cast", { id:
|
|
24
|
+
care(page, 'send', function ([sendto, msg]) {
|
|
25
|
+
data.from("cast", { id: sendto, msg });
|
|
26
26
|
});
|
|
27
27
|
link(id, page);
|
|
28
28
|
return page;
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
${i18n`自动刷新`}
|
|
20
20
|
</span>
|
|
21
21
|
<swap -model="autoreload"></swap>
|
|
22
|
-
<btn @click="chat()">${i18n`新建连接`}</btn>
|
|
22
|
+
<!-- <btn @click="chat()">${i18n`新建连接`}</btn> -->
|
|
23
23
|
</div>
|
|
24
24
|
<div class="clusters">
|
|
25
25
|
<a -repeat="(c,i) in clusters" ng-class="{current:i===index.index}" @click="active(i,c)">
|
|
@@ -43,7 +43,7 @@ function joinsharp(sharped, ctx) {
|
|
|
43
43
|
if (sharped[sharped.length - 1] === '.') sharped[sharped.length - 1] = "";
|
|
44
44
|
for (var cx = 0, dx = sharped.length; cx < dx; cx++) {
|
|
45
45
|
var s = sharped[cx];
|
|
46
|
-
var plus =
|
|
46
|
+
var plus = /^;/.test(s);
|
|
47
47
|
if (plus) s = s.slice(1);
|
|
48
48
|
call = will;
|
|
49
49
|
will = willcall[cx + 1];
|
|
@@ -172,7 +172,7 @@ function main(express, autodef = true) {
|
|
|
172
172
|
if (/^[\[\("'`]/.test(s)) e = e.replace(/\.$/, '');
|
|
173
173
|
}
|
|
174
174
|
else if (!cache.length) {
|
|
175
|
-
return exp.push('
|
|
175
|
+
return exp.push(';' + s);
|
|
176
176
|
}
|
|
177
177
|
e += s;
|
|
178
178
|
exp[exp.length - 1] = e;
|
|
@@ -17,3 +17,4 @@ assert(renderExpress("[]?.()"), "(function(a,_){return a==_?_:a()}([]))")
|
|
|
17
17
|
assert(renderExpress("[]?.[]"), "(function(a,_){return a==_?_:a[]}([]))")
|
|
18
18
|
assert(renderExpress("a['a?.a']"), "a['a?.a']")
|
|
19
19
|
assert(renderExpress("a?.['a?.a']?.b"), "(typeof a==='undefined'||a===null?void 0:function(a,_){if(a==_)return;a=a['a?.a'];if(a==_)return;a=a.b;return a}(a))")
|
|
20
|
+
assert(renderExpress("/\?(\w+)$/.exec(location.href)?.[1]"), "(function(a,_){return a==_?_:a[1]}(/?(w+)$/.exec(location.href)))")
|
package/coms/basic_/Symbol.js
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
var Symbol = this.Symbol || function () {
|
|
2
|
+
var symbolid = 0;
|
|
2
3
|
function Symbol(a) {
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
this.id = ++symbolid;
|
|
5
|
+
this.name = String(a);
|
|
6
|
+
}
|
|
7
|
+
function Symbol1(a) {
|
|
8
|
+
if (this instanceof Symbol1) {
|
|
9
|
+
throw new Error('Symbol不是构造方法!');
|
|
5
10
|
} else if (a instanceof Symbol) {
|
|
6
|
-
|
|
11
|
+
throw new Error('无法将Symbol类型转换成字符串!');
|
|
7
12
|
} else {
|
|
8
13
|
return new Symbol(a);
|
|
9
14
|
}
|
|
10
15
|
}
|
|
11
16
|
var prototype = new Symbol;
|
|
12
17
|
prototype.toString = function () {
|
|
13
|
-
return
|
|
18
|
+
return `Symbol(${this.name}/${this.id})`;
|
|
14
19
|
};
|
|
15
20
|
prototype.valueOf = function () {
|
|
16
21
|
return this;
|
|
17
22
|
};
|
|
18
23
|
|
|
19
24
|
Symbol.prototype = prototype;
|
|
20
|
-
Symbol.iterator =
|
|
21
|
-
Symbol.asyncIterator =
|
|
25
|
+
Symbol.iterator = Symbol1('iterator');
|
|
26
|
+
Symbol.asyncIterator = Symbol1('asyncIterator');
|
|
22
27
|
var iterator = function () {
|
|
23
28
|
var arr = this, cx = 0;
|
|
24
29
|
return {
|
|
@@ -33,5 +38,5 @@ var Symbol = this.Symbol || function () {
|
|
|
33
38
|
} catch {
|
|
34
39
|
Array.prototype[Symbol.iterator] = iterator;
|
|
35
40
|
}
|
|
36
|
-
return
|
|
41
|
+
return Symbol1;
|
|
37
42
|
}();
|
package/coms/compile/autoenum.js
CHANGED
|
@@ -56,11 +56,12 @@ var createRefId = function (o) {
|
|
|
56
56
|
return ids.join('');
|
|
57
57
|
}
|
|
58
58
|
var ignore = Symbol("ignore");
|
|
59
|
+
var mapkey = null;
|
|
59
60
|
var maplist = function (u) {
|
|
60
61
|
var map = Object.create(null);
|
|
61
62
|
for (var o of u) {
|
|
62
|
-
if (o
|
|
63
|
-
o
|
|
63
|
+
if (o[mapkey]) continue;
|
|
64
|
+
o[mapkey] = true;
|
|
64
65
|
var r = createRefId(o);
|
|
65
66
|
if (!map[r]) {
|
|
66
67
|
map[r] = [];
|
|
@@ -180,7 +181,21 @@ function inCondition(o) {
|
|
|
180
181
|
return incondition;
|
|
181
182
|
|
|
182
183
|
}
|
|
183
|
-
|
|
184
|
+
var noVarOutOfFor = function (os, qq, sb, su) {
|
|
185
|
+
if (qq === sb) return true;
|
|
186
|
+
if (enumtype & REFMOVE) return false;
|
|
187
|
+
var [o] = os;
|
|
188
|
+
var us = su[o.tack];
|
|
189
|
+
if (!us) return false;
|
|
190
|
+
var otext = o.text;
|
|
191
|
+
var c = 0;
|
|
192
|
+
for (var u of us) {
|
|
193
|
+
if (u.text === otext) {
|
|
194
|
+
c++;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return c === os.length;
|
|
198
|
+
};
|
|
184
199
|
function enumref(refitem, scoped) {
|
|
185
200
|
if (enumtype === REFMOVE) {
|
|
186
201
|
var c = 0;
|
|
@@ -204,7 +219,7 @@ function enumref(refitem, scoped) {
|
|
|
204
219
|
if (o.queue.kind) break;
|
|
205
220
|
var q = o.queue;
|
|
206
221
|
if (q !== scoped.body) {
|
|
207
|
-
if (q.entry === '(' && q.queue
|
|
222
|
+
if (q.entry === '(' && noVarOutOfFor(os, q.queue, scoped.body, scoped.used)) {
|
|
208
223
|
var qp = q.prev;
|
|
209
224
|
if (qp?.type === EXPRESS) qp = qp.prev;
|
|
210
225
|
if (qp && qp.type === STRAP && qp.text === "await") qp = qp.prev;
|
|
@@ -285,10 +300,16 @@ function enumref(refitem, scoped) {
|
|
|
285
300
|
}
|
|
286
301
|
function atuoenum(scoped) {
|
|
287
302
|
var { used, caps } = scoped;
|
|
303
|
+
mapkey = Symbol('enumed');
|
|
288
304
|
for (var k in caps) {
|
|
289
305
|
var rs = maplist(used[k]);
|
|
290
306
|
enumref(rs, scoped);
|
|
291
307
|
}
|
|
308
|
+
for (var k in caps) {
|
|
309
|
+
for (var o of used[k]) {
|
|
310
|
+
delete o[mapkey];
|
|
311
|
+
}
|
|
312
|
+
}
|
|
292
313
|
}
|
|
293
314
|
var enumtype = 0;
|
|
294
315
|
var exports = module.exports = function main(code, type = REFMOVE) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var scanner2 = require("./scanner2");
|
|
2
2
|
var strings = require("../basic/strings");
|
|
3
3
|
var Program = scanner2.Program;
|
|
4
|
-
var { STAMP, SCOPED, STRAP, EXPRESS, pickAssignment, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, snapExpressFoot, isEval, canbeTemp, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, rolink, pickSentence, snapExpressHead, needBreakBetween } = require("./common");
|
|
4
|
+
var { STAMP, SCOPED, STRAP, EXPRESS, mergeTo, pickAssignment, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, snapExpressFoot, isEval, canbeTemp, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, rolink, pickSentence, snapExpressHead, needBreakBetween } = require("./common");
|
|
5
5
|
var splice2 = function (q, from, to, ...a) {
|
|
6
6
|
var cx = q.indexOf(from);
|
|
7
7
|
if (cx < 0) throw console.log(splice2.caller, console.format(`\r\n<red2>${i18n`自`}</red2>`), from && createString([from]), console.format(`\r\n<yellow>${i18n`至`}</yellow>`), to && createString([to]), console.format(`\r\n<cyan>${i18n`码列`}</cyan>`), createString(pickSentence(from))), i18n`结构异常`;
|
|
@@ -1783,28 +1783,34 @@ var down = function (scoped) {
|
|
|
1783
1783
|
};
|
|
1784
1784
|
var precode = function (text) {
|
|
1785
1785
|
if (!scoped.body) return;
|
|
1786
|
-
var
|
|
1787
|
-
var first =
|
|
1788
|
-
var last =
|
|
1786
|
+
var newcode = typeof text === 'string' ? scanner2(text) : text;
|
|
1787
|
+
var first = newcode[0];
|
|
1788
|
+
var last = newcode[newcode.length - 1];
|
|
1789
1789
|
var top = scoped.first;
|
|
1790
1790
|
if (top) top.prev = last;
|
|
1791
1791
|
if (last) last.next = top;
|
|
1792
1792
|
if (first) delete first.prev;
|
|
1793
1793
|
scoped.body.first = first || top;
|
|
1794
|
-
scoped.body.unshift.apply(scoped.body,
|
|
1794
|
+
scoped.body.unshift.apply(scoped.body, newcode);
|
|
1795
|
+
mergeTo(scoped.used, newcode.used);
|
|
1795
1796
|
};
|
|
1796
1797
|
|
|
1797
1798
|
var markcodes = [];
|
|
1799
|
+
var { caps } = scoped;
|
|
1798
1800
|
if (scoped.isfunc && scoped.caps.this && (funcMark || scoped.insett)) {
|
|
1799
1801
|
let tn = _getname("this_");
|
|
1800
1802
|
rename(scoped.caps, "this", tn);
|
|
1801
|
-
|
|
1803
|
+
caps.this.forEach(o => o.origin = 'this');
|
|
1804
|
+
caps[tn] = caps.this;
|
|
1805
|
+
delete caps.this;
|
|
1802
1806
|
markcodes.push(`${tn}=this`);
|
|
1803
1807
|
}
|
|
1804
1808
|
if (scoped.isfunc && scoped.caps.arguments && (funcMark || scoped.inseta)) {
|
|
1805
1809
|
let an = _getname("arguments_");
|
|
1806
|
-
|
|
1807
|
-
rename(
|
|
1810
|
+
caps.arguments.forEach(o => (o.origin = 'arguments', o.type = EXPRESS));
|
|
1811
|
+
rename(caps, "arguments", an);
|
|
1812
|
+
caps[an] = caps.arguments;
|
|
1813
|
+
delete caps.arguments;
|
|
1808
1814
|
markcodes.push(`${an}=arguments`);
|
|
1809
1815
|
}
|
|
1810
1816
|
var fordeep = 0;
|
package/coms/frame/chat-rtc.xht
CHANGED
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
var timeNode = document.createTextNode("");
|
|
146
146
|
var rejectTime = 0;
|
|
147
147
|
care(this, function ([type, sender, data]) {
|
|
148
|
-
if (sender !== remoteUser.
|
|
148
|
+
if (sender !== remoteUser.cid) return;
|
|
149
149
|
switch (type) {
|
|
150
150
|
case "rtc-close":
|
|
151
151
|
if (acceptTime) return remove(this);
|
package/coms/frame/chat.html
CHANGED
|
@@ -9,17 +9,17 @@
|
|
|
9
9
|
<i></i>
|
|
10
10
|
<i></i>
|
|
11
11
|
</btn>
|
|
12
|
-
<template -if="
|
|
13
|
-
<span -bind="
|
|
14
|
-
<span class="id">(<span -bind="
|
|
15
|
-
<a left -if="
|
|
12
|
+
<template -if="remoteUser">
|
|
13
|
+
<span -bind="remoteUser.name"></span>
|
|
14
|
+
<span class="id">(<span -bind="remoteUser.id"></span>)</span>
|
|
15
|
+
<a left -if="rid!==cid" disabled_="!!remoteUser.shaking" @click="call()">呼叫</a>
|
|
16
16
|
</template>
|
|
17
17
|
<template -elseif="title" -src="title"> </template>
|
|
18
18
|
<close @click="remove()"></close>
|
|
19
19
|
</div>
|
|
20
20
|
<list -if="users.length>0" -src="u in users">
|
|
21
|
-
<btn class="user" @click="
|
|
22
|
-
<avatar -if="
|
|
21
|
+
<btn class="user" @click="remoteUser=u" type_="u===remoteUser?'default':'white'" -class="{fade:u.shaking}">
|
|
22
|
+
<avatar -if="u.icon" -style="{'background-image':'url(\'icons/'+u.icon+'.ico\')'}"></avatar>
|
|
23
23
|
<avatar -else>
|
|
24
24
|
</avatar>
|
|
25
25
|
<span -text="u.name"></span>
|
|
@@ -29,9 +29,17 @@
|
|
|
29
29
|
<div>
|
|
30
30
|
<span class="id" -text="u.id"></span>
|
|
31
31
|
</div>
|
|
32
|
-
<span class="local" -if="u.
|
|
32
|
+
<span class="local" -if="cid&&u.cid===cid">本机</span>
|
|
33
33
|
</btn>
|
|
34
34
|
</list>
|
|
35
|
+
|
|
36
|
+
<div .qrcode -if="rid===cid">
|
|
37
|
+
<canvas @append="qr(this)"></canvas>
|
|
38
|
+
<p>扫码以开启<a target="_blank" href_="linkurl" @click="event.preventDefault();cplink()">公网会话</a></p>
|
|
39
|
+
<p @click="autoAllow=!autoAllow">
|
|
40
|
+
<checker -model="autoAllow"></checker>自动允许会话请求
|
|
41
|
+
</p>
|
|
42
|
+
</div>
|
|
35
43
|
<grid #body disabled>
|
|
36
44
|
<chat -src="m in msglist">
|
|
37
45
|
<padding>
|
|
@@ -40,15 +48,16 @@
|
|
|
40
48
|
</padding>
|
|
41
49
|
</chat>
|
|
42
50
|
<div textarea @mousedown="this.firstChild.focus()">
|
|
43
|
-
<div @keydown.alt.enter="send('html',text)" contenteditable
|
|
51
|
+
<div @keydown.alt.enter="send('html',text)" contenteditable@="rid!==cid" -model="text"></div>
|
|
44
52
|
</div>
|
|
45
53
|
</grid>
|
|
46
|
-
|
|
47
|
-
|
|
54
|
+
|
|
55
|
+
<div foot -style="{opacity:rid===cid?0.2:1}">
|
|
56
|
+
<a disabled_="rid===cid||!!remoteUser?.shaking" class="file" @click="chooseFile()" -if="remoteUser">
|
|
48
57
|
<template -src="fileIcon"></template>
|
|
49
58
|
<span>
|
|
50
59
|
${i18n`文件`}
|
|
51
60
|
</span>
|
|
52
61
|
</a>
|
|
53
|
-
<a @click="send('html',text);">${i18n`发送`}</a>
|
|
62
|
+
<a disabled_="rid===cid||!!remoteUser?.shaking" @click="send('html',text);">${i18n`发送`}</a>
|
|
54
63
|
</div>
|