efront 4.3.15 → 4.4.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/coms/compile/Html.js +130 -187
- package/coms/compile/Html_test.js +13 -4
- package/coms/compile/Javascript.js +2 -1
- package/coms/compile/Program.js +149 -37
- package/coms/compile/common.js +50 -7
- package/coms/compile/scanner2.js +13 -11
- package/coms/compile/scanner2_test.js +34 -6
- package/coms/docs/codetext.xht +32 -14
- package/coms/zimoli/grid.js +2 -0
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/readme.md +1 -1
package/coms/compile/Html.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
var iso8859 = require("./iso8859");
|
|
2
2
|
var Program = require("./Program");
|
|
3
|
+
var Javascript = require("./Javascript");
|
|
3
4
|
var strings = require("../basic/strings");
|
|
4
|
-
|
|
5
|
+
var common = require("./common");
|
|
5
6
|
const {
|
|
6
7
|
/* 1 */COMMENT,
|
|
7
8
|
/* 2 */SPACE,
|
|
@@ -14,22 +15,58 @@ const {
|
|
|
14
15
|
/* 256 */SCOPED,
|
|
15
16
|
/* 512 */LABEL,
|
|
16
17
|
/*1024 */PROPERTY,
|
|
18
|
+
/*2048 */ELEMENT,
|
|
17
19
|
createScoped,
|
|
18
20
|
} = require("./common");
|
|
19
21
|
var ignore = { test() { return false } };
|
|
22
|
+
var property = new Program;
|
|
23
|
+
property.stamps = "=".split('');
|
|
24
|
+
var parseProperty = function (a) {
|
|
25
|
+
property.lastIndex = 0;
|
|
26
|
+
var s = property.exec(a);
|
|
27
|
+
return s;
|
|
28
|
+
}
|
|
20
29
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
var fixElement = function (o) {
|
|
31
|
+
if (!o.attributes) return;
|
|
32
|
+
var attributes = [];
|
|
33
|
+
var needValue = false;
|
|
34
|
+
var push = function (p) {
|
|
35
|
+
attributes.push(p);
|
|
36
|
+
if (p.type === STAMP) {
|
|
37
|
+
needValue = true;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!needValue && p.type === EXPRESS) {
|
|
41
|
+
p.type = PROPERTY;
|
|
42
|
+
}
|
|
43
|
+
needValue = false;
|
|
44
|
+
}
|
|
45
|
+
o.attributes.forEach(a => {
|
|
46
|
+
if (a.type === PIECE) {
|
|
47
|
+
for (var p of parseProperty(a.text)) {
|
|
48
|
+
push(p);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
push(a);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
o.attributes = attributes;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class Html extends Javascript {
|
|
59
|
+
// value_reg = ignore;
|
|
60
|
+
// strapexp_reg = ignore;
|
|
61
|
+
// forceend_reg = ignore;
|
|
62
|
+
// classstrap_reg = ignore;
|
|
63
|
+
// // scopes = [];
|
|
64
|
+
// inTag = false;
|
|
65
|
+
scriptTags = [];
|
|
66
|
+
ignoreTags = ["SCRIPT", "STYLE"];
|
|
32
67
|
}
|
|
68
|
+
var property = new Program;
|
|
69
|
+
property.stamps = "=".split('');
|
|
33
70
|
var p = new Program;
|
|
34
71
|
var replaceISO8859 = function (data) {
|
|
35
72
|
return String(data).replace(/<\!--([\s\S]*)--\>$/g, '$1').replace(/&\w+;/g, a => iso8859[a] || a).replace(/&#(\d+);/g, (_, a) => String.fromCodePoint(a))
|
|
@@ -42,39 +79,7 @@ var parseExpress = function (data, mayberepeat) {
|
|
|
42
79
|
p.lastIndex = 0;
|
|
43
80
|
return p.exec(data);
|
|
44
81
|
};
|
|
45
|
-
|
|
46
|
-
Html.prototype.setType = function (o) {
|
|
47
|
-
var q = o.queue;
|
|
48
|
-
var p = o.prev;
|
|
49
|
-
if (!q.intag) {
|
|
50
|
-
if (p && p.type === STAMP) {
|
|
51
|
-
if (/^</.test(p.text)) {
|
|
52
|
-
if (o.type === EXPRESS) {
|
|
53
|
-
if (q.keep && o.text !== q.keep) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
q.intag = true;
|
|
57
|
-
o.type = LABEL;
|
|
58
|
-
if (/^<\//.test(p.text)) o.isclose = true, q.keep = null;
|
|
59
|
-
else if (!q.keep) o.isopen = true, q.keep = keep_reg.test(o.text) ? o.text : null;
|
|
60
|
-
}
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (o.type !== STAMP && o.type !== COMMENT) o.type = PIECE;
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
if (o.type === STAMP && /^\/?>/.test(o.text)) {
|
|
68
|
-
q.intag = false;
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (p.type == STAMP && p.text === '=');
|
|
72
|
-
else if (o.type === EXPRESS) {
|
|
73
|
-
o.type = PROPERTY;
|
|
74
|
-
o.isprop = true;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
};
|
|
82
|
+
|
|
78
83
|
var toCamelCase = function (a) {
|
|
79
84
|
return a.replace(/\-([\s\S])/g, (_, a) => a.toUpperCase());
|
|
80
85
|
}
|
|
@@ -84,109 +89,80 @@ class Node { }
|
|
|
84
89
|
Html.prototype.createScoped = function (code) {
|
|
85
90
|
var used = Object.create(null);
|
|
86
91
|
var vars = Object.create(null);
|
|
87
|
-
var dom = new Node;
|
|
88
|
-
var nodePath = [dom];
|
|
89
|
-
var childNodes = [], children = [];
|
|
90
|
-
dom.childNodes = childNodes;
|
|
91
|
-
dom.children = children;
|
|
92
92
|
var scriptNodes = [], styleNodes = [], tempNodes = [];
|
|
93
93
|
var inScript = false;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
var v = toCamelCase(c.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
nodePath.push(node);
|
|
106
|
-
node.childNodes = [];
|
|
107
|
-
node.children = [];
|
|
108
|
-
var outerStart = cx;
|
|
109
|
-
while (code[outerStart] !== c.prev) outerStart--;
|
|
110
|
-
node.outerStart = outerStart;
|
|
111
|
-
childNodes.push(node);
|
|
112
|
-
children.push(node);
|
|
113
|
-
children = node.children;
|
|
114
|
-
childNodes = node.childNodes;
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
var tagName = c.text.toUpperCase();
|
|
118
|
-
for (var cy = nodePath.length - 1; cy >= 0; cy--) {
|
|
119
|
-
if (nodePath[cy].tagName === tagName) break;
|
|
94
|
+
var run = function (c) {
|
|
95
|
+
switch (c.type) {
|
|
96
|
+
case ELEMENT:
|
|
97
|
+
var v = toCamelCase(c.tag);
|
|
98
|
+
c.tagName = c.tag.toUpperCase();
|
|
99
|
+
if (!/^(script|style|template)$/i.test(c.tagName)) {
|
|
100
|
+
fixElement(c);
|
|
101
|
+
if (c.attributes) c.attributes.forEach(run);
|
|
102
|
+
if (!used[v]) used[v] = [];
|
|
103
|
+
used[v].push(c);
|
|
104
|
+
c.forEach(run);
|
|
120
105
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
n.noclose = true;
|
|
132
|
-
for (var c of n.childNodes) childNodes1.push(c);
|
|
133
|
-
for (var c of n.children) children1.push(c);
|
|
106
|
+
else {
|
|
107
|
+
if (c.tagName === 'SCRIPT') {
|
|
108
|
+
scriptNodes.push(c);
|
|
109
|
+
tempNodes.push(c);
|
|
110
|
+
c.isScript = true;
|
|
111
|
+
}
|
|
112
|
+
else if (c.tagName === 'STYLE') {
|
|
113
|
+
styleNodes.push(c);
|
|
114
|
+
tempNodes.push(c);
|
|
115
|
+
}
|
|
134
116
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (c.next && c.next.type === STAMP && c.next.text === '=') {
|
|
147
|
-
if (/^(element|render|)id$/i.test(c.text)) {
|
|
148
|
-
var nn = c.next.next;
|
|
149
|
-
if (!nn || nn.length > 0) continue;
|
|
150
|
-
if (nn.type === EXPRESS || nn.type === QUOTED) {
|
|
151
|
-
vars[strings.decode(nn.text)] = true;
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
break;
|
|
120
|
+
case PROPERTY:
|
|
121
|
+
if (c.next && c.next.type === STAMP && c.next.text === '=') {
|
|
122
|
+
if (/^(element|render|)id$/i.test(c.text)) {
|
|
123
|
+
var nn = c.next.next;
|
|
124
|
+
if (!nn || nn.length > 0) return;
|
|
125
|
+
if (nn.type === EXPRESS || nn.type === QUOTED) {
|
|
126
|
+
vars[strings.decode(nn.text)] = true;
|
|
127
|
+
}
|
|
152
128
|
}
|
|
153
129
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
130
|
+
else {
|
|
131
|
+
if (/^\#/.test(c.text)) {
|
|
132
|
+
var id = c.text.slice(1);
|
|
133
|
+
vars[toCamelCase(id)] = true;
|
|
134
|
+
}
|
|
159
135
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
136
|
+
break;
|
|
137
|
+
case QUOTED:
|
|
138
|
+
case PIECE:
|
|
139
|
+
if (c.length) {
|
|
140
|
+
c.forEach(run);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
if (!c.text) break;
|
|
144
|
+
var t = strings.decode(c.text);
|
|
145
|
+
var p = t.prev;
|
|
146
|
+
var pp = p && p.prev;
|
|
147
|
+
var mayberepeat = p && pp && p.type === STAMP && p.text === "=" && /\-(src|repeat|for|each|foreach)$/i.test(pp.text)
|
|
148
|
+
t = parseExpress(t, mayberepeat);
|
|
149
|
+
var envs = createScoped(t).envs;
|
|
150
|
+
for (var k in envs) {
|
|
151
|
+
if (!used[k]) used[k] = [];
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case EXPRESS:
|
|
155
|
+
if (inScript) return;
|
|
156
|
+
var t = c.text;
|
|
157
|
+
t = parseExpress(t);
|
|
158
|
+
var envs = createScoped(t).envs;
|
|
159
|
+
for (var k in envs) {
|
|
160
|
+
if (!used[k]) used[k] = [];
|
|
161
|
+
}
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
code.forEach(run);
|
|
190
166
|
var envs = Object.create(null);
|
|
191
167
|
for (var k in used) {
|
|
192
168
|
if (!vars[k]) {
|
|
@@ -196,71 +172,38 @@ Html.prototype.createScoped = function (code) {
|
|
|
196
172
|
var scripts = [];
|
|
197
173
|
var styles = [];
|
|
198
174
|
var scoped = [];
|
|
199
|
-
|
|
175
|
+
for (var c of scriptNodes) scripts.push(c.innerText = replaceISO8859(this.createString(c)));
|
|
176
|
+
for (var c of styleNodes) styles.push(c.innerText = replaceISO8859(this.createString(c)));
|
|
177
|
+
scoped.richNodes = tempNodes;
|
|
200
178
|
code = code.slice();
|
|
201
|
-
for (var c of scriptNodes) scripts.push(c.innerText = replaceISO8859(this.createString(code.slice(c.innerStart, c.innerEnd))));
|
|
202
|
-
for (var c of styleNodes) styles.push(c.innerText = replaceISO8859(this.createString(code.slice(c.innerStart, c.innerEnd))));
|
|
203
|
-
while (tempNodes.length) {
|
|
204
|
-
var c = tempNodes.pop();
|
|
205
|
-
code.splice(c.outerStart, c.outerEnd - c.outerStart);
|
|
206
|
-
}
|
|
207
179
|
scoped.scripts = scripts;
|
|
208
180
|
scoped.styles = styles;
|
|
209
|
-
var rootNodes =
|
|
181
|
+
var rootNodes = code.filter(a => !/^(script|style)$/i.test(a.tagName) && !(a.type & (SPACE | COMMENT)));
|
|
210
182
|
if (rootNodes.length === 1) {
|
|
211
|
-
scoped.outerHTML = this.createString(
|
|
183
|
+
scoped.outerHTML = this.createString(rootNodes);
|
|
212
184
|
var root = rootNodes[0];
|
|
213
185
|
scoped.tagName = root.tagName;
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
var attrarea = code.splice(0, root.innerStart - root.outerStart);
|
|
217
|
-
var attrs = [];
|
|
218
|
-
for (var a of attrarea) {
|
|
186
|
+
var attrs = rootNodes[0].attributes;
|
|
187
|
+
if (attrs) for (var a of attrs) {
|
|
219
188
|
if (a.type === PROPERTY) {
|
|
220
|
-
|
|
221
|
-
attrs.push(at);
|
|
189
|
+
a.name = a.text;
|
|
222
190
|
var n = a.next;
|
|
223
191
|
if (!n) continue;
|
|
224
192
|
if (n.type !== STAMP || n.text !== '=') continue;
|
|
225
193
|
var nn = n.next;
|
|
226
|
-
if (!nn)
|
|
227
|
-
|
|
194
|
+
if (!nn) continue;
|
|
195
|
+
a.value = nn.text;
|
|
228
196
|
}
|
|
229
197
|
}
|
|
230
|
-
|
|
231
|
-
scoped.innerHTML = this.createString(code);
|
|
232
|
-
scoped.attributes = attrs;
|
|
198
|
+
scoped.innerHTML = this.createString(rootNodes[0]);
|
|
233
199
|
}
|
|
234
200
|
else {
|
|
235
|
-
scoped.innerHTML = this.createString(
|
|
201
|
+
scoped.innerHTML = this.createString(rootNodes);
|
|
236
202
|
}
|
|
237
203
|
scoped.envs = envs;
|
|
238
204
|
scoped.vars = vars;
|
|
239
205
|
scoped.used = used;
|
|
240
206
|
return scoped;
|
|
241
207
|
};
|
|
242
|
-
Html.prototype.createString =
|
|
243
|
-
var dist = [];
|
|
244
|
-
var keepspace = code.keepspace;
|
|
245
|
-
var p = null;
|
|
246
|
-
for (var c of code) {
|
|
247
|
-
switch (c.type) {
|
|
248
|
-
case PIECE:
|
|
249
|
-
if (p && p.type & (PIECE | EXPRESS)) dist.push(" ");
|
|
250
|
-
dist.push(c.text);
|
|
251
|
-
break;
|
|
252
|
-
case SPACE:
|
|
253
|
-
if (keepspace) dist.push(c.text);
|
|
254
|
-
break;
|
|
255
|
-
case PROPERTY:
|
|
256
|
-
dist.push(" ");
|
|
257
|
-
dist.push(c.text);
|
|
258
|
-
break;
|
|
259
|
-
default:
|
|
260
|
-
dist.push(c.text);
|
|
261
|
-
}
|
|
262
|
-
p = c;
|
|
263
|
-
}
|
|
264
|
-
return dist.join('');
|
|
265
|
-
}
|
|
208
|
+
Html.prototype.createString = common.createString;
|
|
266
209
|
module.exports = Html;
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
var Html = require("./Html");
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
var test = function (source, pick, value) {
|
|
3
|
+
var h = new Html;
|
|
4
|
+
var b = h.exec(source);
|
|
5
|
+
assert(h.createString(b), source);
|
|
6
|
+
if (pick) {
|
|
7
|
+
assert(seek(b, pick), value);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
test("<h><a #c>b</a><c b=x>d</c><d/><e>2px</e></h>");
|
|
11
|
+
test("<a>Let's Encrypt</a>");
|
|
12
|
+
test("<style>{a-b:2}</style>");
|
|
13
|
+
assert(scanner2("<a>Let's Encrypt</a>", Html).length, 1);
|
|
14
|
+
test('<a href="${i18n``}">Let\'s Encrypt</a>');
|
|
@@ -15,6 +15,7 @@ const {
|
|
|
15
15
|
/* 256 */SCOPED,
|
|
16
16
|
/* 512 */LABEL,
|
|
17
17
|
/*1024 */PROPERTY,
|
|
18
|
+
/*2048 */ELEMENT,
|
|
18
19
|
createString,
|
|
19
20
|
getDeclared,
|
|
20
21
|
createScoped,
|
|
@@ -333,7 +334,7 @@ Javascript.prototype.detectLabel = function (o) {
|
|
|
333
334
|
Javascript.prototype.setType = function (o) {
|
|
334
335
|
if (this.detectLabel(o)) return false;
|
|
335
336
|
var last = o.prev;
|
|
336
|
-
if (o.type === EXPRESS && /^\.[^\.]
|
|
337
|
+
if (o.type === EXPRESS && /^\.[^\.]|^\.$/.test(o.text) && last && last.type === STAMP && last.text === "?") {
|
|
337
338
|
last = o.prev = snapExpressHead(last.prev);
|
|
338
339
|
last.type = EXPRESS;
|
|
339
340
|
return false;
|