efront 3.34.12 → 3.35.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/apps/moue/content//344/275/240/345/245/275/344/270/226/347/225/214.vue +21 -0
- package/apps/moue/content//344/275/240/345/245/275/345/274/200/345/217/221/350/200/205.html +1 -0
- package/apps/moue/{home/index.js → content//344/275/240/345/245/275/345/274/200/345/217/221/350/200/205.js} +4 -2
- package/apps/moue/content//344/275/240/345/245/275/345/274/200/345/217/221/350/200/205.less +4 -0
- package/apps/moue/home/index2.vue +97 -18
- package/apps/moue/index.html +1 -1
- package/coms/basic/ArrayFill.md +9 -0
- package/coms/basic/awaitable.md +10 -0
- package/coms/basic/backEach.md +7 -0
- package/coms/basic/combine.md +23 -0
- package/coms/basic/renderExpress.js +3 -2
- package/coms/basic/wait.js +5 -0
- package/coms/basic_/readme.md +5 -4
- package/coms/compile/#/350/257/264/346/230/216.md +1 -0
- package/coms/compile/Html.js +263 -0
- package/coms/compile/Html_test.js +5 -0
- package/coms/compile/Javascript.js +627 -0
- package/coms/compile/Program.js +666 -0
- package/coms/compile/autoenum.js +179 -0
- package/coms/compile/autoenum_test.js +17 -0
- package/coms/compile/autoeval.js +50 -0
- package/coms/compile/autoeval_test.js +28 -0
- package/coms/compile/autoiota.js +121 -0
- package/coms/compile/breakcode.js +83 -0
- package/coms/compile/common.js +1063 -0
- package/coms/compile/downLevel.js +901 -0
- package/coms/compile/downLevel_test.js +111 -0
- package/coms/compile/formatcode.js +57 -0
- package/coms/compile/iso8859.js +9 -0
- package/coms/compile/iso8859_test.js +2 -0
- package/coms/compile/keywords.js +6 -0
- package/coms/compile/namelist.js +154 -0
- package/coms/compile/namelist_test.js +7 -0
- package/coms/compile/polyfill.js +31 -0
- package/coms/compile/required.js +20 -0
- package/coms/compile/richcss.js +237 -0
- package/coms/compile/richcss_test.js +7 -0
- package/coms/compile/scanner.js +653 -0
- package/coms/compile/scanner2.js +202 -0
- package/coms/compile/scanner2_test.js +110 -0
- package/coms/compile/scanner_test.js +10 -0
- package/coms/compile/unstruct.js +712 -0
- package/coms/compile/unstruct_test.js +54 -0
- package/coms/compile/washcode.js +237 -0
- package/coms/compile/washcode_test.js +17 -0
- package/coms/docs/helps.js +71 -0
- package/coms/docs/markdown.js +248 -0
- package/coms/frame/route.js +1 -1
- package/coms/reptile/colored_console.js +2 -1
- package/coms/zimoli/cless.js +1 -0
- package/coms/zimoli/css.js +1 -9
- package/coms/zimoli/html.js +1 -1
- package/coms/zimoli/menu.js +1 -1
- package/coms/zimoli/menuItem.html +1 -1
- package/coms/zimoli/menuItem.js +1 -1
- package/coms/zimoli/render.js +14 -3
- package/coms/zimoli/text.js +1 -1
- package/coms/zimoli/tree.js +2 -4
- package/coms/zimoli/zimoli.js +39 -12
- package/docs/compare.md +5 -5
- package/docs/components.jsp +24 -0
- package/docs/index.html +18 -26
- package/docs/main.xht +207 -0
- package/docs/mark.xht +171 -0
- package/docs/version.jsp +3 -0
- package/docs/welcome.jsp +8 -0
- package/docs//345/221/275/344/273/244.xht +100 -0
- package/docs//347/211/210/346/234/254/350/257/264/346/230/216.md +9 -0
- package/docs//347/273/204/344/273/266.xht +111 -0
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/readme.md +8 -11
- package/apis/docs/getAllComponents.js +0 -69
- package/apps/moue/home/index.html +0 -1
- package/apps/moue/home/index.less +0 -0
- package/docs/data/iconfont-kugou.eot +0 -0
- package/docs/data/iconfont-kugou.otf +0 -0
- package/docs/data/iconfont-kugou.ttf +0 -0
- package/docs/data/iconfont-kugou.woff +0 -0
- package/docs/data/web.xml +0 -4742
- package/docs/main.js +0 -17
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var unstruct = require('./unstruct');
|
|
2
|
+
var scanner2 = require("./scanner2");
|
|
3
|
+
var { createString } = require("./common");
|
|
4
|
+
function test(codetext, expect, ret = false) {
|
|
5
|
+
var code = scanner2(codetext);
|
|
6
|
+
var i = -2;
|
|
7
|
+
code = unstruct(code, () => ++i >= 0 ? "_" + i : '_', ret);
|
|
8
|
+
assert(code.map(createString).join("; "), expect);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
test('a+b', "a + b");
|
|
12
|
+
test('a + !c', "_ = !c, a + _");
|
|
13
|
+
test('a + b * c', "_ = b * c, a + _");
|
|
14
|
+
test('a + b * !c', "_ = !c, _ = b * _, a + _");
|
|
15
|
+
test('a + b * c ** !d', '_ = !d, _ = c ** _, _ = b * _, a + _');
|
|
16
|
+
test('a * a + b * c', "_ = a * a, _0 = b * c, _ + _0");
|
|
17
|
+
test('a * a + b * c * c ** d', "_ = a * a, _0 = b * c, _1 = c ** d, _0 = _0 * _1, _ + _0");
|
|
18
|
+
test('a * a || b * c * c ** d', "_ = a * a @re _ = b * c, _0 = c ** d, _ * _0");
|
|
19
|
+
test('a * a || b * c || c * d', "_ = a * a @re _ = b * c @re c * d");
|
|
20
|
+
test('a?b:c', "_ = a; return [_ ? 1 : 2, _]; _ = b; return [2, _]; _ = c; return [1, _]");
|
|
21
|
+
test('a * a && b * c * c ** d', "_ = a * a @rz _ = b * c, _0 = c ** d, _ * _0");
|
|
22
|
+
test('a = b', "a = b; return [1, a]", true);
|
|
23
|
+
test('a = b = c', "_ = c; b = _; a = _; return [1, a]", true);
|
|
24
|
+
test('a = b = c + d', "_ = c + d; b = _; a = _; return [1, a]", true);
|
|
25
|
+
test('a = b = c + d * 1', "_ = d * 1; _ = c + _; b = _; a = _; return [1, a]", true);
|
|
26
|
+
test('return a = b', "a = b; return [1, a]", true);
|
|
27
|
+
test('a*a', "_ = a * a; return [1, _]", true);
|
|
28
|
+
test('a * a && b * c * c ** d', "_ = a * a; if (!_) return [2, _]; _ = b * c; _0 = c ** d; _ = _ * _0; return [1, _]", true);
|
|
29
|
+
|
|
30
|
+
test("await a", "_ = a; return [1, _]", true);
|
|
31
|
+
test("await a()", "_ = a(); return [1, _]", true);
|
|
32
|
+
test("(1+ +1)", "_ = +1; _ = 1 + _; _ = (_); return [1, _]", true);
|
|
33
|
+
test("await a(await b)", "_ = b; return [1, _]; _ = a(_); return [1, _]", true);
|
|
34
|
+
test("await a(await b).s(await c)", "_ = b; return [1, _]; _ = a(_); _0 = c; return [1, _0]; _ = _.s(_0); return [1, _]", true);
|
|
35
|
+
test("a*a + await a(await b).s(await c)", "_ = a * a; _0 = b; return [1, _0]; _0 = a(_0); _1 = c; return [1, _1]; _0 = _0.s(_1); return [1, _0]; _ = _ + _0; return [1, _]", true);
|
|
36
|
+
test("a*a + await a(await b(await c)).s(await c)", "_ = a * a; _0 = c; return [1, _0]; _0 = b(_0); return [1, _0]; _0 = a(_0); _1 = c; return [1, _1]; _0 = _0.s(_1); return [1, _0]; _ = _ + _0; return [1, _]", true);
|
|
37
|
+
test("await a, await b", "_ = a; return [1, _]; _ = b; return [1, _]", true);
|
|
38
|
+
test("await a * b, await b", "_ = a; return [1, _]; _ = _ * b; return [1, _]; _ = b; return [1, _]", true);
|
|
39
|
+
test("if(a) await b", "if (!a) return [1]; _ = b; return [1, _]", true);
|
|
40
|
+
test("if(a) await b; else await c", "if (!a) return [1]; _ = b; return [2, _]; _ = c; return [1, _]", true);
|
|
41
|
+
test("if(a) await b; else if(e) await c", "if (!a) return [1]; _ = b; return [2, _]; if (!e) return [1]; _ = c; return [1, _]", true);
|
|
42
|
+
test("if(a) await b; else if(e) await c else await d", "if (!a) return [1]; _ = b; return [3, _]; if (!e) return [1]; _ = c; return [2, _]; _ = d; return [1, _]", true);
|
|
43
|
+
test("if(await a) await b", "_ = a; return [1, _]; if (!_) return [1]; _ = b; return [1, _]", true);
|
|
44
|
+
test("for(a=0;a<10;a++) await a", "a = 0; return [1]; _ = a < 10; if (!_) return [3]; _ = a; return [1, _]; _ = a++; return [-2]", true);
|
|
45
|
+
test("for(a=0;a<10;a++) await a, await b", "a = 0; return [1]; _ = a < 10; if (!_) return [4]; _ = a; return [1, _]; _ = b; return [1, _]; _ = a++; return [-3]", true);
|
|
46
|
+
test("while(a) await b", "_ = a; if (!_) return [3]; _ = b; return [1, _]; return [-2]", true);
|
|
47
|
+
test("do{await b}while(a)", "_ = b; return [1, _]; _ = a; return [_ ? -2 : 1]", true);
|
|
48
|
+
test("switch(a){case 1:}", "_ = a; _0 = 1; if (_ === _0) return [1]", true);
|
|
49
|
+
test("switch(a){case 1:break;}", "_ = a; _0 = 1; if (_ === _0) return [1]; return [1]", true);
|
|
50
|
+
test("switch(a){case 1:break;case 2:break;}", "_ = a; _0 = 1; if (_ === _0) return [2]; _0 = 2; if (_ === _0) return [2]; return [2]; return [1]", true);
|
|
51
|
+
test("switch(a){case 1:case 2:break;}", "_ = a; _0 = 1; if (_ === _0) return [2]; _0 = 2; if (_ === _0) return [1]; return [1]", true);
|
|
52
|
+
test("switch(a){case 1:case 2:x=1;}", "_ = a; _0 = 1; if (_ === _0) return [2]; _0 = 2; if (_ === _0) return [1]; x = 1", true);
|
|
53
|
+
test("switch(a){case 1:case 2:x=1;}", "_ = a; _0 = 1; if (_ === _0) return [2]; _0 = 2; if (_ === _0) return [1]; x = 1", true);
|
|
54
|
+
test("with(a){ a = 1}", `_ = a; if (_0 = with_("a", [_])) _0.a = 1; else a = 1;`, true);
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
const {
|
|
2
|
+
STRAP,
|
|
3
|
+
STAMP,
|
|
4
|
+
QUOTED,
|
|
5
|
+
EXPRESS,
|
|
6
|
+
SCOPED,
|
|
7
|
+
skipAssignment,
|
|
8
|
+
getDeclared,
|
|
9
|
+
createScoped,
|
|
10
|
+
relink,
|
|
11
|
+
needBreakBetween,
|
|
12
|
+
createExpressList,
|
|
13
|
+
} = require("./common");
|
|
14
|
+
var {
|
|
15
|
+
createRefId,
|
|
16
|
+
createRefMap
|
|
17
|
+
} = require("./autoenum");
|
|
18
|
+
|
|
19
|
+
var patchExpress = function (exp) {
|
|
20
|
+
var first = exp.first;
|
|
21
|
+
if (first && first.type === QUOTED && /^(['"`])use (strict|strip)\1/i.test(first.text)) {
|
|
22
|
+
exp.marked = true;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
var getReferedMap = function (o) {
|
|
27
|
+
var res = [];
|
|
28
|
+
while (o) {
|
|
29
|
+
var n = skipAssignment(o);
|
|
30
|
+
var readed = Object.create(null);
|
|
31
|
+
while (o && o !== n) {
|
|
32
|
+
if (o.type === SCOPED) {
|
|
33
|
+
var rfs = getReferedMap(o.first);
|
|
34
|
+
for (var rf of rfs) for (var f in rf) readed[f] = true;
|
|
35
|
+
o = o.next;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
else if (o.type !== EXPRESS) {
|
|
39
|
+
o = o.next;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
var t = o.text.replace(/^\.+/, '').replace(/^([^\.\[]+)[\s\S]*$/, '$1');
|
|
43
|
+
var id = t + createRefId(o);
|
|
44
|
+
readed[id] = true;
|
|
45
|
+
var o = o.refs[o.refs.length - 1];
|
|
46
|
+
if (!o) break;
|
|
47
|
+
if (o) o = o.next;
|
|
48
|
+
}
|
|
49
|
+
res.push(readed);
|
|
50
|
+
if (o && o.type === STAMP && o.text === ',') {
|
|
51
|
+
o = o.next;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
return res;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
var addToMap = function (map, k, exp) {
|
|
60
|
+
if (!(k in map)) {
|
|
61
|
+
map[k] = [];
|
|
62
|
+
}
|
|
63
|
+
if (map[k].indexOf(map[k], exp) < 0) map[k].push(exp);
|
|
64
|
+
};
|
|
65
|
+
var washcode = function (code, pick) {
|
|
66
|
+
var envs = code.envs;
|
|
67
|
+
var explist = createExpressList(code);
|
|
68
|
+
patchExpress(explist[0]);
|
|
69
|
+
var writed_map = Object.create(null), readed_map = Object.create(null);
|
|
70
|
+
var called_map = Object.create(null);
|
|
71
|
+
for (var cx = 0, dx = explist.length; cx < dx; cx++) {
|
|
72
|
+
var exp = explist[cx];
|
|
73
|
+
console.info(`正在处理:${1 + cx}/${dx}`);
|
|
74
|
+
var scoped = createScoped(exp);
|
|
75
|
+
var refs = createRefMap(scoped);
|
|
76
|
+
var used = scoped.used;
|
|
77
|
+
var readed = Object.create(null);
|
|
78
|
+
var writed = Object.create(null);
|
|
79
|
+
var called = Object.create(null);
|
|
80
|
+
for (var k in used) {
|
|
81
|
+
if (k in refs) {
|
|
82
|
+
var ref = refs[k];
|
|
83
|
+
for (var k1 in ref) {
|
|
84
|
+
var r = ref[k1];
|
|
85
|
+
var key = k + k1;
|
|
86
|
+
if (r.ccount > 0) {
|
|
87
|
+
called[key] = true;
|
|
88
|
+
addToMap(called_map, key, exp);
|
|
89
|
+
}
|
|
90
|
+
if (r.wcount > 0) {
|
|
91
|
+
writed[key] = true;
|
|
92
|
+
addToMap(writed_map, key, exp);
|
|
93
|
+
}
|
|
94
|
+
if (r.wcount < r.length) {
|
|
95
|
+
readed[key] = true;
|
|
96
|
+
addToMap(readed_map, key, exp);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (scoped.return) {
|
|
102
|
+
for (var r of scoped.return) {
|
|
103
|
+
if (r.isend) continue;
|
|
104
|
+
var rds = getReferedMap(r.next);
|
|
105
|
+
for (var rd of rds) for (var r in rd) {
|
|
106
|
+
readed[r] = true;
|
|
107
|
+
addToMap(readed_map, r, exp);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
addToMap(writed_map, 'return', exp);
|
|
111
|
+
}
|
|
112
|
+
for (var s of scoped) {
|
|
113
|
+
if (!s.isfunc) continue;
|
|
114
|
+
var funcbody = s.body;
|
|
115
|
+
|
|
116
|
+
var rfs = s.refs;
|
|
117
|
+
var fprev = funcbody.prev;
|
|
118
|
+
var args;
|
|
119
|
+
var [args] = fprev.type === SCOPED ? getDeclared(fprev.first) : getDeclared(fprev);
|
|
120
|
+
var q = funcbody.queue;
|
|
121
|
+
if (q && q.type === SCOPED && q.entry === '(' && (q.length === 3 || q.length === 4 && q.first.type === STRAP && q.first.text === 'function')) {
|
|
122
|
+
do {
|
|
123
|
+
funcbody = q;
|
|
124
|
+
q = funcbody.queue;
|
|
125
|
+
} while (q && q.type === SCOPED && q.entry === '(');
|
|
126
|
+
}
|
|
127
|
+
var fnext = funcbody.next;
|
|
128
|
+
var iscalled = fnext && fnext.type === SCOPED && fnext.entry === '(';
|
|
129
|
+
if (iscalled) {
|
|
130
|
+
var rmps = getReferedMap(fnext);
|
|
131
|
+
var argMap = Object.create(null);
|
|
132
|
+
args.forEach((a, i) => {
|
|
133
|
+
argMap[a] = Object.keys(rmps[i]);
|
|
134
|
+
})
|
|
135
|
+
for (var k in rfs) {
|
|
136
|
+
if (!(k in argMap)) continue;
|
|
137
|
+
var u = rfs[k];
|
|
138
|
+
for (var k of argMap[k]) {
|
|
139
|
+
for (var k1 in u) {
|
|
140
|
+
var key = k + k1;
|
|
141
|
+
var u1 = u[k1];
|
|
142
|
+
if (u1.wcount > 0) {
|
|
143
|
+
writed[key] = true;
|
|
144
|
+
addToMap(writed_map, key, exp);
|
|
145
|
+
}
|
|
146
|
+
if (u1.ccount > 0) {
|
|
147
|
+
called[key] = true;
|
|
148
|
+
addToMap(called_map, key, exp);
|
|
149
|
+
}
|
|
150
|
+
if (u1.wcount < u1.length) {
|
|
151
|
+
readed[key] = true;
|
|
152
|
+
addToMap(readed_map, key, exp);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exp.called = called;
|
|
160
|
+
exp.writed = writed;
|
|
161
|
+
exp.readed = readed;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
var prevent_map = Object.create(null);
|
|
165
|
+
if (!pick) var rest = writed_map["module.exports"] || writed_map.return;
|
|
166
|
+
else if (isArray(pick)) {
|
|
167
|
+
var rest = [];
|
|
168
|
+
for (var pk of pick) for (var k in pk) {
|
|
169
|
+
if (writed_map[k]) for (var w of writed_map[k]) rest.push(w);
|
|
170
|
+
if (called_map[k]) for (var c of called_map[k]) rest.push(c);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (pick in writed_map) {
|
|
174
|
+
var ps = pick.split(".");
|
|
175
|
+
while (ps.length) {
|
|
176
|
+
prevent_map[ps.join(".")] = true;
|
|
177
|
+
ps.pop();
|
|
178
|
+
}
|
|
179
|
+
var rest = writed_map[pick];
|
|
180
|
+
}
|
|
181
|
+
for (var exp of explist) {
|
|
182
|
+
var required = [];
|
|
183
|
+
for (var k in exp.readed) {
|
|
184
|
+
if (k in prevent_map) continue;
|
|
185
|
+
var ws = writed_map[k];
|
|
186
|
+
if (!ws) {
|
|
187
|
+
var ks = k.split(".");
|
|
188
|
+
while (ks.length > 1 && !ws) {
|
|
189
|
+
ks.pop();
|
|
190
|
+
ws = writed_map[ks.join('.')];
|
|
191
|
+
}
|
|
192
|
+
if (!ws) {
|
|
193
|
+
if (!(ks[0] in envs) && !/^(arguments|this|true|false|null)$/.test(ks[0])) console.warn(`检测到错误,无法建立代码关联:${k}`);
|
|
194
|
+
prevent_map[k] = true;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (ks.join(".") in prevent_map) continue;
|
|
198
|
+
}
|
|
199
|
+
for (var w of ws) {
|
|
200
|
+
if (required.indexOf(w) < 0) required.push(w);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exp.required = required;
|
|
204
|
+
}
|
|
205
|
+
var rest = rest ? rest.slice() : [];
|
|
206
|
+
var readed = Object.create(null);
|
|
207
|
+
var writed = Object.create(null);
|
|
208
|
+
var called = Object.create(null);
|
|
209
|
+
while (rest.length > 0) {
|
|
210
|
+
var p = rest.pop();
|
|
211
|
+
if (p.marked) continue;
|
|
212
|
+
p.marked = true;
|
|
213
|
+
extend(readed, p.readed);
|
|
214
|
+
extend(called, p.called);
|
|
215
|
+
extend(writed, p.writed);
|
|
216
|
+
for (var r of p.required) {
|
|
217
|
+
if (!r.marked) rest.push(r);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
code.called = called;
|
|
221
|
+
code.readed = readed;
|
|
222
|
+
code.writed = writed;
|
|
223
|
+
code.scoped = null;
|
|
224
|
+
code.splice(0, code.length);
|
|
225
|
+
var plist = null;
|
|
226
|
+
for (var exp of explist) {
|
|
227
|
+
if (!exp.marked) continue;
|
|
228
|
+
if (plist && needBreakBetween(plist.last, exp.first)) code.push({ type: STAMP, text: ";" });
|
|
229
|
+
plist = exp;
|
|
230
|
+
for (var e of exp) code.push(e);
|
|
231
|
+
}
|
|
232
|
+
relink(code);
|
|
233
|
+
return code;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
washcode.createExpressList = createExpressList;
|
|
237
|
+
module.exports = washcode;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
var washcode = require("./washcode");
|
|
2
|
+
var scanner2 = require("./scanner2");
|
|
3
|
+
var { createString } = require("./common");
|
|
4
|
+
var test = function (str, exp) {
|
|
5
|
+
var code = scanner2(str);
|
|
6
|
+
code = washcode(code);
|
|
7
|
+
var str = createString(code);
|
|
8
|
+
assert(str, exp);
|
|
9
|
+
|
|
10
|
+
}
|
|
11
|
+
test("a=1;b;module.exports=a", "a = 1; module.exports = a")
|
|
12
|
+
// 不考虑 toString或valueOf对自身进行修改的情况
|
|
13
|
+
test("a=1+b;module.exports=b", "module.exports = b")
|
|
14
|
+
test("a=1+b;module.exports=b", "module.exports = b")
|
|
15
|
+
test("a=1+b;return b", "return b")
|
|
16
|
+
test("b.a=1; return function (){}(b)", "return function () {}(b)")
|
|
17
|
+
test("function(a) {var a = {a:1} return a }(a)", "")
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
|
|
2
|
+
var helps = [
|
|
3
|
+
"f显示版本号,version,-v,--version",
|
|
4
|
+
"f显示efront的安装路径,path,--path",
|
|
5
|
+
"f显示帮助信息,help,-h,--help,help COMMAND,-h COMMAND,--help COMMAND",
|
|
6
|
+
"f启动文档服务器,docs",
|
|
7
|
+
"f查看efront自身占用的内存,memery,memory,-m,--memery,--memory",
|
|
8
|
+
"m启动示例项目服务器,demo,demo SRCNAME",
|
|
9
|
+
"m创建应用,项目目录允许创建第二个应用,init,from SRCNAME,init APPNAME,init APPNAME from SRCNAME,from SRCNAME init APPNAME",
|
|
10
|
+
"m创建简单应用,独占项目目录的单应用,create,simple,create|simple from SRCNAME,create|simple APPNAME,create|simple APPNAME from APPNAME",
|
|
11
|
+
"m创建空应用,blank,simple,from blank,simple from blank",
|
|
12
|
+
"q自动识别环境并启动开发环境服务器,live,lives,live HTTP_PORT,live HTTP_PORT HTTPS_PORT,lives HTTPS_PORT,lives HTTPS_PORT HTTP_PORT",
|
|
13
|
+
"a在项目文件夹启动生产环境服务器,start,starts,start HTTP_PORT,start HTTP_PORT HTTPS_PORT,starts HTTPS_PORT,starts HTTPS_PORT HTTP_PORT",
|
|
14
|
+
"a在项目文件夹启动开发环境服务器,dev,devs,test,dev|test HTTP_PORT,dev|test HTTP_PORT HTTPS_PORT,devs|tests HTTPS_PORT,devs|tests HTTPS_PORT HTTP_PORT",
|
|
15
|
+
"a在当前文件夹启动服务器,server,serve|serv|http HTTP_PORT HTTPS_PORT,serve|serv|http HTTP_PORT,https HTTPS_PORT HTTP_PORT,https HTTPS_PORT,HTTP_PORT HTTPS_PORT,HTTP_PORT,",
|
|
16
|
+
"a显示本机ip地址,ip,-ip,--ip",
|
|
17
|
+
"q编译项目,public,publish,build,release",
|
|
18
|
+
"a监测文件变化,自动编译更新的部分并输出到指定目录,watch",
|
|
19
|
+
"a关闭efront服务器,kill HTTP_PORT|HTTPS_PORT,close HTTP_PORT|HTTPS_PORT",
|
|
20
|
+
"a连接一台efront服务器,取得连接号,link ADDRESS",
|
|
21
|
+
"a用一个连接号登录本机的efront服务器,接收并打印消息,care ADDRESS,care ADDRESS LINKID",
|
|
22
|
+
"a向一个连接号发送消息,cast ADDRESS LINKID MESSAGE",
|
|
23
|
+
"z检查文件或文件夹中的外部变量,check FILEPATH",
|
|
24
|
+
"q执行按efront方式加载的代码,run CODEFILE,CODEFILE",
|
|
25
|
+
"z查找含有指定的外部变量的文件,find VARIABLE,find VARIABLE FILEPATH",
|
|
26
|
+
"-从指定路径创建压缩文件,pack PUBLIC_PATH PACKAGE_PATH",
|
|
27
|
+
"a对json数据进行签名,sign JSON_PATH SIGNNAME",
|
|
28
|
+
"z根据模块的搜索路径查找真实路径,detect MODULE_PATH",
|
|
29
|
+
"z格式化代码,format MODULE_PATH TARGET_PATH TABSIZE",
|
|
30
|
+
"z导出与指定的对象路径关联的代码,pick MODULE_PATH TARGET_PATH KEYPATH",
|
|
31
|
+
"z清理代码,删除已声明未使用的代码,wash MODULE_PATH TARGET_PATH",
|
|
32
|
+
"k设置环境变量,setenv --NAME1=VALUE1 --NAME2=VALUE2,setenv NAME VALUE,set --NAME1=VALUE1,set --NAME=",
|
|
33
|
+
"k列出已配置的环境变量,listenv,env",
|
|
34
|
+
"-创建国际化文案表,translate APPNAME",
|
|
35
|
+
"-将指定的路径添加到可执行文件的扫描路径,pathx PATHNAME",
|
|
36
|
+
"-从可执行文件的扫描路径中移除指定的路径,pathxrm PATHNAME",
|
|
37
|
+
"-设置远程访问的密码,password",
|
|
38
|
+
"-创建windows平台的一键安装包,packwin|packexe PUBLIC_PATH PACKAGE_PATH",
|
|
39
|
+
"-从压缩文件提取源文件,unpack PACKAGE_PATH PUBLIC_PATH",
|
|
40
|
+
];
|
|
41
|
+
helps.forEach((str, cx) => {
|
|
42
|
+
var [info, ..._commands] = str.split(",");
|
|
43
|
+
var type = info.charAt(0);
|
|
44
|
+
var hide = type === "-";
|
|
45
|
+
info = info.slice(1);
|
|
46
|
+
var help = { info, type, hide, commands: _commands, cmds: _commands };
|
|
47
|
+
helps[cx] = help;
|
|
48
|
+
});
|
|
49
|
+
var topics = {
|
|
50
|
+
COMMAND: "命令名",
|
|
51
|
+
APPNAME: "您的应用名",
|
|
52
|
+
SRCNAME: "源项目|blank,blank,kugou,pivot",
|
|
53
|
+
HTTP_PORT: " http 端口|80",
|
|
54
|
+
HTTPS_PORT: " https 端口|443",
|
|
55
|
+
VARIABLES: "变量名",
|
|
56
|
+
ADDRESS: "efront服务器地址",
|
|
57
|
+
LINKID: "efront服务器提供的连接号",
|
|
58
|
+
MESSAGE: "文本消息",
|
|
59
|
+
PUBLIC_PATH: "软件发布目录",
|
|
60
|
+
PACKAGE_PATH: "安装包的路径",
|
|
61
|
+
JSON_PATH: "json文件所在的路径",
|
|
62
|
+
SIGNNAME: "签名",
|
|
63
|
+
FILEPATH: "文件或文件夹的路径",
|
|
64
|
+
CODEFILE: "代码文件的路径",
|
|
65
|
+
MODULE_PATH: '源文件的模糊路径',
|
|
66
|
+
TARGET_PATH: '目标文件的模糊路径',
|
|
67
|
+
KEYPATH: '对象的属性路径',
|
|
68
|
+
TABSIZE: '缩进空格数',
|
|
69
|
+
};
|
|
70
|
+
topics.VARIABLES += "," + Object.keys(topics);
|
|
71
|
+
module.exports = { helps, topics };
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
class Element {
|
|
2
|
+
childNodes = [];
|
|
3
|
+
constructor(tagName, ...content) {
|
|
4
|
+
this.tagName = tagName;
|
|
5
|
+
this.childNodes.push(...content);
|
|
6
|
+
}
|
|
7
|
+
appendChild(node) {
|
|
8
|
+
this.childNodes.push(node);
|
|
9
|
+
}
|
|
10
|
+
toString() {
|
|
11
|
+
var { tagName } = this;
|
|
12
|
+
return `<${tagName}>${this.childNodes.join('')}</${tagName}>`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
var h = function (text) {
|
|
16
|
+
var t2 = text.replace(/^\#+\s/, '');
|
|
17
|
+
var level = text.length - t2.length;
|
|
18
|
+
return new Element('h' + level, t2);
|
|
19
|
+
};
|
|
20
|
+
var p = function (text) {
|
|
21
|
+
if (text.length) return new Element("p", text);
|
|
22
|
+
};
|
|
23
|
+
var li = function (c) {
|
|
24
|
+
var li = new Element(li, c.replace(/^\*\s+|^[\d]+\.\s+/, ''));
|
|
25
|
+
return li;
|
|
26
|
+
}
|
|
27
|
+
var list_elem = null, list_tag;
|
|
28
|
+
var list = function (tag, text, li = 'li') {
|
|
29
|
+
if (!list_elem || list_tag !== tag || list_elem !== content[content.length - 1]) {
|
|
30
|
+
list_elem = new Element(tag);
|
|
31
|
+
list_tag = tag;
|
|
32
|
+
content.push(list_elem);
|
|
33
|
+
}
|
|
34
|
+
list_elem.appendChild(new Element(li, text.replace(/^\*\s+|^\d+\.\s+/, '')));
|
|
35
|
+
};
|
|
36
|
+
var ul = function (content) {
|
|
37
|
+
return list('ul', content);
|
|
38
|
+
};
|
|
39
|
+
var ol = function (content) {
|
|
40
|
+
return list('ol', content);
|
|
41
|
+
};
|
|
42
|
+
var tr = function (line) {
|
|
43
|
+
if (/^[\|\-\s]+$/.test(line)) {
|
|
44
|
+
var table = content[content.length - 1];
|
|
45
|
+
if (!table || table.tagName !== 'table') return;
|
|
46
|
+
if (!table.thead) {
|
|
47
|
+
table.thead = new Element('thead');
|
|
48
|
+
table.thead.childNodes.push(...table.childNodes.splice(0, table.childNodes.length));
|
|
49
|
+
table.childNodes.push(table.thead);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!table.tbody) {
|
|
53
|
+
table.tbody = new Element("tbody");
|
|
54
|
+
table.tbody.childNodes.push(...table.childNodes.splice(1, table.childNodes.length));
|
|
55
|
+
table.childNodes.push(table.tbody);
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
if (!table.tfoot) {
|
|
59
|
+
table.tfoot = new Element("tfoot");
|
|
60
|
+
table.tfoot.childNodes.push(...table.childNodes.slice(2, table.childNodes.length));
|
|
61
|
+
table.childNodes.push(table.tfoot);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
line = line.replace(/^\||\|$/g, '').split("|").map(t => `<td>${t}</td>`).join('');
|
|
67
|
+
return list('table', line, 'tr');
|
|
68
|
+
}
|
|
69
|
+
function richtext(line) {
|
|
70
|
+
line = line.trim();
|
|
71
|
+
line = line.replace(/\[([\s\S]*?)\](?:\(([\s\S]*?)\))?|<(\w+)>[\s\S]*?<\/\3>/g, function (_, content, href) {
|
|
72
|
+
if (/^\</.test(_)) return _;
|
|
73
|
+
if (href) href = ` href=${strings.recode(href)}`;
|
|
74
|
+
return `<a${href}>${content}</a>`;
|
|
75
|
+
});
|
|
76
|
+
var a;
|
|
77
|
+
if (/^#/.test(line)) a = h(line);
|
|
78
|
+
else if (/^\*\s+/.test(line)) ul(line);
|
|
79
|
+
else if (/^\d+\.\s+/.test(line)) ol(line);
|
|
80
|
+
else if (/^\|/.test(line)) tr(line);
|
|
81
|
+
else a = p(line);
|
|
82
|
+
if (a) content.push(a);
|
|
83
|
+
}
|
|
84
|
+
var codecolor = function (c) {
|
|
85
|
+
var envs = c.envs;
|
|
86
|
+
var predefs = Object.create(null);
|
|
87
|
+
predefs.module = true;
|
|
88
|
+
predefs.exports = true;
|
|
89
|
+
predefs["module.exports"] = true;
|
|
90
|
+
predefs.Promise = true;
|
|
91
|
+
[Boolean, Number, String, Function, Object, Array, Date, RegExp, Error].forEach(p => predefs[p.name] = true);
|
|
92
|
+
var { STRAP, SCOPED, QUOTED, LABEL, COMMENT, STAMP, VALUE, EXPRESS, PROPERTY, PIECE } = c;
|
|
93
|
+
var deep = 0;
|
|
94
|
+
var setcolor = function (o) {
|
|
95
|
+
switch (o.type) {
|
|
96
|
+
case LABEL:
|
|
97
|
+
o.text = `<label>${o.text}</label>`;
|
|
98
|
+
break;
|
|
99
|
+
case QUOTED:
|
|
100
|
+
case PIECE:
|
|
101
|
+
if (!o.length) {
|
|
102
|
+
if (/^\//.test(o.text)) {
|
|
103
|
+
o.text = `<regexp>${encode(o.text)}</regexp>`;
|
|
104
|
+
}
|
|
105
|
+
else o.text = `<text>${encode(o.text)}</text>`;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
o.forEach(setcolor);
|
|
109
|
+
o.entry = "<text>" + o.entry;
|
|
110
|
+
o.leave = o.leave + "</text>";
|
|
111
|
+
break;
|
|
112
|
+
case SCOPED:
|
|
113
|
+
deep++;
|
|
114
|
+
o.forEach(setcolor);
|
|
115
|
+
deep--;
|
|
116
|
+
o.entry = `<deep${deep}>${o.entry}</deep${deep}>`;
|
|
117
|
+
o.leave = `<deep${deep}>${o.leave}</deep${deep}>`;
|
|
118
|
+
break;
|
|
119
|
+
case VALUE:
|
|
120
|
+
if (o.isdigit) o.text = `<digit>${o.text}</digit>`;
|
|
121
|
+
else o.text = `<value>${o.text}</value>`;
|
|
122
|
+
break;
|
|
123
|
+
case PROPERTY:
|
|
124
|
+
var next = o.next;
|
|
125
|
+
if (next && next.type === c.SCOPED && next.entry === '(') {
|
|
126
|
+
o.text = `<method>${o.text}</method>`;
|
|
127
|
+
}
|
|
128
|
+
else o.text = `<property>${o.text}</property>`;
|
|
129
|
+
|
|
130
|
+
break;
|
|
131
|
+
case EXPRESS:
|
|
132
|
+
var keys = o.text.split(".");
|
|
133
|
+
var next = o.next;
|
|
134
|
+
if (next && next.type === c.SCOPED && next.entry === '(') {
|
|
135
|
+
keys[keys.length - 1] = `<invoke>${keys[keys.length - 1]}</invoke>`;
|
|
136
|
+
}
|
|
137
|
+
var [name] = keys;
|
|
138
|
+
if (/^</.test(name));
|
|
139
|
+
else if (/^(arguments|this|super|Infinity|NaN)$/.test(name)) name = `<strap>${name}</strap>`;
|
|
140
|
+
else if (name in envs) name = name in predefs ? `<predef>${name}</predef>` : `<outside>${name}</outside>`;
|
|
141
|
+
|
|
142
|
+
keys[0] = name;
|
|
143
|
+
o.text = keys.map(k => /^\</.test(k) || !k ? k : `<express>${k}</express>`).join(".");
|
|
144
|
+
break;
|
|
145
|
+
case STRAP:
|
|
146
|
+
if (/^(if|else|switch|case|do|while|for|break|continue|default|import|from|as|export|try|catch|finally|await|yield|return)/.test(o.text))
|
|
147
|
+
o.text = `<flow>${o.text}</flow>`;
|
|
148
|
+
else o.text = `<strap>${o.text}</strap>`;
|
|
149
|
+
break;
|
|
150
|
+
case STAMP:
|
|
151
|
+
if (/^(=>)$/.test(o.text) || o.text === "*" && o.prev && o.prev.type === c.STRAP) o.text = `<strap>${encode(o.text)}</strap>`;
|
|
152
|
+
else if (!/^[<\/>]+$/.test(o.text));
|
|
153
|
+
else o.text = `<stamp>${encode(o.text)}</stamp>`;
|
|
154
|
+
break;
|
|
155
|
+
case COMMENT:
|
|
156
|
+
o.text = `<comment>${encode(o.text)}</comment>`;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
c.forEach(setcolor);
|
|
161
|
+
|
|
162
|
+
}
|
|
163
|
+
var typescript = new compile$Javascript;
|
|
164
|
+
typescript.straps = typescript.straps.concat("interface", "implements", "declare", "module", "readonly", "enum");
|
|
165
|
+
var codesupports = {
|
|
166
|
+
javascript(a) {
|
|
167
|
+
var c = compile$scanner2(a);
|
|
168
|
+
codecolor(c);
|
|
169
|
+
return c.toString();
|
|
170
|
+
},
|
|
171
|
+
typescript(a) {
|
|
172
|
+
var c = compile$scanner2(a, typescript);
|
|
173
|
+
codecolor(c);
|
|
174
|
+
return c.toString();
|
|
175
|
+
},
|
|
176
|
+
html(a) {
|
|
177
|
+
var code = compile$scanner2(a, 'html');
|
|
178
|
+
var scoped = code.scoped;
|
|
179
|
+
codecolor(code);
|
|
180
|
+
backEach(scoped.richNodes, n => {
|
|
181
|
+
if (n.isScript) {
|
|
182
|
+
var js = compile$scanner2(n.innerText);
|
|
183
|
+
codecolor(js);
|
|
184
|
+
code.splice(n.innerStart, n.innerEnd - n.innerStart, { text: js.toString() });
|
|
185
|
+
}
|
|
186
|
+
})
|
|
187
|
+
return code.toString();
|
|
188
|
+
},
|
|
189
|
+
css(a) {
|
|
190
|
+
var c = compile$scanner2(a);
|
|
191
|
+
codecolor(c);
|
|
192
|
+
return c.toString();
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
codesupports.cmd = codesupports.bat;
|
|
196
|
+
codesupports.jsx = codesupports.js = codesupports.javascript;
|
|
197
|
+
codesupports.tsx = codesupports.ts = codesupports.typescript;
|
|
198
|
+
codesupports.xml = codesupports.html;
|
|
199
|
+
function codetext(type, text) {
|
|
200
|
+
try {
|
|
201
|
+
type = type.toLowerCase();
|
|
202
|
+
if (type in codesupports) text = codesupports[type](text);
|
|
203
|
+
else text = encode(text);
|
|
204
|
+
|
|
205
|
+
} catch (e) {
|
|
206
|
+
console.error(e);
|
|
207
|
+
}
|
|
208
|
+
text = text.replace(/^(\r\n|\r|\n)|\s+$/g, '');
|
|
209
|
+
var codes = text.split(/\r\n|\r|\n/);
|
|
210
|
+
var minSpace = 0;
|
|
211
|
+
for (var c of codes) {
|
|
212
|
+
var m = /^\s*/.exec(c);
|
|
213
|
+
if (m && m[0].length < c.length) {
|
|
214
|
+
minSpace = m[0].length;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (minSpace > 0) codes = codes.map(c => c.slice(minSpace));
|
|
218
|
+
return `<code type=${type}>${codes.join("<br/>").replace(/\t/g, Array(5).join(' ')).replace(/\s/g, ' ')}</code> `;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* @type {Element}
|
|
222
|
+
*/
|
|
223
|
+
var content;
|
|
224
|
+
var encode = function (text) {
|
|
225
|
+
return text.replace(/[\<\>\|]/g, a => `&#${a.charCodeAt()};`)
|
|
226
|
+
};
|
|
227
|
+
function markdown(text) {
|
|
228
|
+
var c = content = [];
|
|
229
|
+
text.replace(/ *(`+|\*+)(\S[\s\S]*?)\1 */g, function (_, q, c, i) {
|
|
230
|
+
if (/^\*/.test(q)) {
|
|
231
|
+
var m = q.length;
|
|
232
|
+
if (m & 1) c = `<i>${c}</i>`;
|
|
233
|
+
if (m & 2) c = `<b>${c}</b>`;
|
|
234
|
+
return c;
|
|
235
|
+
}
|
|
236
|
+
_ = encode(_.trim()).slice(1, -1);
|
|
237
|
+
if (/[\*#\.]\s/.test(text.slice(i - 1, i + 1))) _ = " " + _;
|
|
238
|
+
if (q.length === 1) return `<m>${_}</m>`;
|
|
239
|
+
var t = /^\S+/.exec(c);
|
|
240
|
+
if (t) t = t[0]; c = c.slice(t.length);
|
|
241
|
+
return codetext(t, c);
|
|
242
|
+
}).replace(/\s*(( \s*)+)/g, "$1").split(/\r\n|\r|\n/).forEach(richtext);
|
|
243
|
+
list_elem = null;
|
|
244
|
+
list_tag = null;
|
|
245
|
+
content = null;
|
|
246
|
+
return c.join('');
|
|
247
|
+
}
|
|
248
|
+
markdown.javascript = codetext.bind(null, 'javascript');
|
package/coms/frame/route.js
CHANGED
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
}
|
|
110
110
|
if (/^\-+$/.test(item.name)) item.line = true;
|
|
111
111
|
if (path) item.path = path;
|
|
112
|
-
if (data) item.
|
|
112
|
+
if (data) item.data = parseKV(data);
|
|
113
113
|
item.closed = true;
|
|
114
114
|
if (filter) var item0 = filter(item);
|
|
115
115
|
if (item0) item = item0;
|
|
@@ -30,10 +30,11 @@ var getColor = function (c) {
|
|
|
30
30
|
}
|
|
31
31
|
return '';
|
|
32
32
|
};
|
|
33
|
-
var colorReg = /<(\/?)([a-z][\w]*)
|
|
33
|
+
var colorReg = /<(\/?)([a-z][\w]*)\>/ig;
|
|
34
34
|
var renderColor = function (obj) {
|
|
35
35
|
var colorpath = [];
|
|
36
36
|
return String(obj).replace(colorReg, function (_, e, c) {
|
|
37
|
+
if (!getColor(c)) return _;
|
|
37
38
|
if (e) {
|
|
38
39
|
colorpath.pop();
|
|
39
40
|
c = colorpath[colorpath.length - 1];
|
package/coms/zimoli/cless.js
CHANGED
|
@@ -50,6 +50,7 @@ var head = document.getElementsByTagName("head")[0];
|
|
|
50
50
|
function cless(commFactory, innerCss, className) {
|
|
51
51
|
if (innerCss) {
|
|
52
52
|
var stylesheet = document.createElement("style");
|
|
53
|
+
//<!-- stylesheet.setAttribute("scope",className) -->
|
|
53
54
|
stylesheet.type = "text/css";
|
|
54
55
|
stylesheet.savedText = innerCss;
|
|
55
56
|
if (stylesheet.styleSheet) {
|
package/coms/zimoli/css.js
CHANGED
|
@@ -27,17 +27,9 @@ var transformValue = function (value, k) {
|
|
|
27
27
|
if (/^[\w\s\.]+$/.test(value)) return isFinite(value) ? transfromSimpleValue(value) : String(value).split(/\s+/).map(transfromSimpleValue).join(' ');
|
|
28
28
|
return value;
|
|
29
29
|
};
|
|
30
|
-
var partifyValue = function (v) {
|
|
31
|
-
return String(v).toLowerCase().split(/['"`]|\s+/).join(" ");
|
|
32
|
-
};
|
|
33
|
-
var isSameValue = function (v1, v2) {
|
|
34
|
-
return partifyValue(v1) === partifyValue(v2);
|
|
35
|
-
};
|
|
36
30
|
var setValue = function (o, k, v) {
|
|
37
31
|
if (v instanceof Array) for (var v0 of v) setValue(o, k, v0);
|
|
38
|
-
else
|
|
39
|
-
if (!isSameValue(o[k], v)) o[k] = v;
|
|
40
|
-
}
|
|
32
|
+
else o[k] = v;
|
|
41
33
|
}
|
|
42
34
|
/**
|
|
43
35
|
* 将中划线转成驼峰式
|