efront 3.34.12 → 3.35.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/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 +1 -1
- 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 +594 -0
- package/coms/compile/Program.js +664 -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 +17 -0
- package/docs/index.html +16 -26
- package/docs/main.xht +182 -0
- package/docs/mark.xht +166 -0
- package/docs/welcome.jsp +7 -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 +87 -0
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/readme.md +6 -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/main.js +0 -17
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<style>
|
|
2
|
+
& {
|
|
3
|
+
text-align: center;
|
|
4
|
+
padding: 60px 0;
|
|
5
|
+
}
|
|
6
|
+
</style>
|
|
7
|
+
<template>
|
|
8
|
+
<div>
|
|
9
|
+
<btn @click="alert('你好,一线开发者', 'success')">你好,世界</btn>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
<script>
|
|
13
|
+
export default {
|
|
14
|
+
methods: {
|
|
15
|
+
alert,
|
|
16
|
+
},
|
|
17
|
+
components: {
|
|
18
|
+
btn: moue(button, "click"),
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
</script>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div><btn @click="alert('你好,基线开发者')">你好开发者</btn></div>
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
function main() {
|
|
2
2
|
var compiled = Vue.compile(template.toString());
|
|
3
|
-
console.log(compiled);
|
|
4
3
|
return new Vue({
|
|
4
|
+
methods: { alert },
|
|
5
|
+
components: {
|
|
6
|
+
btn: moue(button, 'click')
|
|
7
|
+
},
|
|
5
8
|
render() {
|
|
6
9
|
var res = compiled.render.apply(this, arguments);
|
|
7
|
-
console.log(res);
|
|
8
10
|
return res;
|
|
9
11
|
},
|
|
10
12
|
staticRenderFns: compiled.staticRenderFns,
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
<style lang="less" scoped>
|
|
2
|
+
// 只支持 less 一种
|
|
2
3
|
& {
|
|
3
4
|
color: #fff;
|
|
4
|
-
background: #
|
|
5
|
+
background: #567;
|
|
5
6
|
height: 100%;
|
|
6
7
|
width: 100%;
|
|
7
8
|
position: relative;
|
|
8
9
|
appearance: none;
|
|
9
10
|
}
|
|
11
|
+
|
|
10
12
|
&,
|
|
11
13
|
* {
|
|
12
14
|
box-sizing: border-box;
|
|
13
15
|
}
|
|
16
|
+
@theight: 54px;
|
|
17
|
+
@lwidth: 300px;
|
|
14
18
|
.nav {
|
|
15
|
-
height:
|
|
16
|
-
margin-top:
|
|
17
|
-
background: #
|
|
19
|
+
height: @theight;
|
|
20
|
+
margin-top: -@theight;
|
|
21
|
+
background: #069;
|
|
18
22
|
}
|
|
19
23
|
> .menu,
|
|
20
24
|
> .main {
|
|
@@ -24,39 +28,114 @@
|
|
|
24
28
|
}
|
|
25
29
|
> .menu {
|
|
26
30
|
background: #000;
|
|
27
|
-
width:
|
|
28
|
-
margin-left:
|
|
31
|
+
width: @lwidth;
|
|
32
|
+
margin-left: -@lwidth;
|
|
29
33
|
max-width: 600px;
|
|
30
|
-
min-width:
|
|
34
|
+
min-width: @theight;
|
|
35
|
+
}
|
|
36
|
+
.menu-items {
|
|
37
|
+
padding: 20px 0;
|
|
31
38
|
}
|
|
32
39
|
> .main {
|
|
33
40
|
width: 100%;
|
|
34
41
|
}
|
|
35
42
|
& {
|
|
36
|
-
padding:
|
|
43
|
+
padding: @theight 0 0 @lwidth;
|
|
37
44
|
}
|
|
38
45
|
> .body {
|
|
39
46
|
width: 100%;
|
|
40
47
|
}
|
|
48
|
+
button {
|
|
49
|
+
display: block;
|
|
50
|
+
appearance: none;
|
|
51
|
+
width: 100%;
|
|
52
|
+
background: #fff4;
|
|
53
|
+
color: #fff;
|
|
54
|
+
position: relative;
|
|
55
|
+
padding: 10px 16px;
|
|
56
|
+
&:hover {
|
|
57
|
+
background: #9cf4;
|
|
58
|
+
}
|
|
59
|
+
&:active {
|
|
60
|
+
background: #9cf3;
|
|
61
|
+
}
|
|
62
|
+
&.actived {
|
|
63
|
+
color: #39c;
|
|
64
|
+
&:after {
|
|
65
|
+
display: block;
|
|
66
|
+
position: absolute;
|
|
67
|
+
right: 0;
|
|
68
|
+
top: 50%;
|
|
69
|
+
margin-top: -20px;
|
|
70
|
+
line-height: 40px;
|
|
71
|
+
bottom: 0;
|
|
72
|
+
|
|
73
|
+
padding: 0 10px;
|
|
74
|
+
font-family: "宋体", sans-serif;
|
|
75
|
+
content: ">";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
.button {
|
|
80
|
+
padding: 0 16px;
|
|
81
|
+
}
|
|
82
|
+
.title {
|
|
83
|
+
font-size: 20px;
|
|
84
|
+
line-height: 30px;
|
|
85
|
+
padding: 12px 20px;
|
|
86
|
+
}
|
|
87
|
+
tip {
|
|
88
|
+
display: block;
|
|
89
|
+
position: absolute;
|
|
90
|
+
font-size: 12px;
|
|
91
|
+
}
|
|
41
92
|
</style>
|
|
42
93
|
<template>
|
|
43
94
|
<div1 editable>
|
|
44
|
-
<div class="nav" solid
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
95
|
+
<div class="nav" solid>
|
|
96
|
+
<tip>标题栏</tip>
|
|
97
|
+
<div class="title">蛤蟆坑</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="menu">
|
|
100
|
+
<tip>菜单区</tip>
|
|
101
|
+
<div class="menu-items">
|
|
102
|
+
<button
|
|
103
|
+
:class="{ actived: m === activeMenu }"
|
|
104
|
+
@click="go(m.url), (activeMenu = m)"
|
|
105
|
+
v-for="m of menuData"
|
|
106
|
+
>
|
|
107
|
+
{{ m.name }}
|
|
108
|
+
</button>
|
|
109
|
+
</div>
|
|
48
110
|
</div>
|
|
111
|
+
<div2 class="main" ref="content">
|
|
112
|
+
<tip>内容区</tip>
|
|
113
|
+
</div2>
|
|
49
114
|
</div1>
|
|
50
115
|
</template>
|
|
51
116
|
<script>
|
|
52
117
|
export default {
|
|
53
118
|
methods: {
|
|
54
|
-
alert
|
|
119
|
+
alert,
|
|
120
|
+
go(url) {
|
|
121
|
+
zimoli.go(url, null, this.$refs.content);
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
data() {
|
|
125
|
+
var menuData = [
|
|
126
|
+
{ name: "你好,世界", url: "/content/你好世界" },
|
|
127
|
+
{ name: "你好,开发者", url: "/content/你好开发者" },
|
|
128
|
+
];
|
|
129
|
+
return {
|
|
130
|
+
activeMenu: menuData[0],
|
|
131
|
+
menuData,
|
|
132
|
+
};
|
|
133
|
+
},
|
|
134
|
+
mounted() {
|
|
135
|
+
this.go(this.activeMenu.url);
|
|
55
136
|
},
|
|
56
137
|
components: {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
div1: moue(grid)
|
|
60
|
-
}
|
|
138
|
+
div1: moue(grid),
|
|
139
|
+
},
|
|
61
140
|
};
|
|
62
|
-
</script>
|
|
141
|
+
</script>
|
package/apps/moue/index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|
11
11
|
<link rel="Shortcut Icon" href="/favicon.ico" type="image/x-icon" />
|
|
12
12
|
<meta name="viewport" content="initial-scale=1,maximum-scale=1,width=device-width" />
|
|
13
|
-
<title
|
|
13
|
+
<title>与vue混合使用的示例项目</title>
|
|
14
14
|
<style>
|
|
15
15
|
body,
|
|
16
16
|
html {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
把一个类似Image对象转换成可以被`await`的对象,即附加一个then方法,当onload事件触发或complete属性为真时完成。
|
|
2
|
+
如:
|
|
3
|
+
```javascript
|
|
4
|
+
var img = new Image;
|
|
5
|
+
img.src = 图像路径;
|
|
6
|
+
await awaitable(img); // 等待加载完成
|
|
7
|
+
var canvas = document.createElement("canvas");
|
|
8
|
+
var context = canvas.getContext("2d");
|
|
9
|
+
context.drawImage(img,0,0); // 此时已可以直接绘制
|
|
10
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
组合工具,把传入的数组队列进行组合,列出所有可能出现的情况
|
|
2
|
+
如:
|
|
3
|
+
```javascript
|
|
4
|
+
var 数组1=[1,2,3];
|
|
5
|
+
var 数组2=[10,20];
|
|
6
|
+
var 数组3=["字符串1","字符串二"];
|
|
7
|
+
var 组合结果 = combine(数组1,数组2,数组3);
|
|
8
|
+
组合结果 如下:
|
|
9
|
+
[
|
|
10
|
+
[1,10,"字符串1"],
|
|
11
|
+
[1,10,"字符串二"],
|
|
12
|
+
[1,20,"字符串1"],
|
|
13
|
+
[1,20,"字符串二"],
|
|
14
|
+
[2,10,"字符串1"],
|
|
15
|
+
[2,10,"字符串二"],
|
|
16
|
+
[2,20,"字符串1"],
|
|
17
|
+
[2,20,"字符串二"],
|
|
18
|
+
[3,10,"字符串1"],
|
|
19
|
+
[3,10,"字符串二"],
|
|
20
|
+
[3,20,"字符串1"],
|
|
21
|
+
[3,20,"字符串二"]
|
|
22
|
+
]
|
|
23
|
+
```
|
|
@@ -81,7 +81,7 @@ function main(express) {
|
|
|
81
81
|
add_exp(str);
|
|
82
82
|
}
|
|
83
83
|
lastIndex = match.index + m.length;
|
|
84
|
-
if (match[1] || match[0] === '?' && (express.length <= lastIndex || /[\]\}\)]/.test(express.charAt(lastIndex)))) {
|
|
84
|
+
if (match[1] || match[0] === '?' && (express.length <= lastIndex || /[\]\}\)\|\*\.\?&%\^\>\<\:\;\,]/.test(express.charAt(lastIndex)))) {
|
|
85
85
|
exp.push(match[1]);
|
|
86
86
|
}
|
|
87
87
|
else if (/[\[\{\(]/.test(m)) {
|
package/coms/basic_/readme.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# efront 兼容性说明
|
|
2
2
|
* `coms/basic_`目录的代码均为非标准实现,如果你要兼容低版本的运行环境,尽量避免使用高级的功能
|
|
3
|
+
* 当前的`efront`进行代码降级时用到了`typescript`,所以下文有些问题的描述会误伤`typescript`,不用觉得奇怪。
|
|
3
4
|
* 已知在转换成低版本代码后与高级版本有区别的语法如下:
|
|
4
5
|
1. ```javascript
|
|
5
6
|
class ... extends Array {...}
|
|
@@ -26,12 +27,12 @@
|
|
|
26
27
|
console.log(arguments[0])// 0
|
|
27
28
|
}(0));
|
|
28
29
|
```
|
|
29
|
-
非严格模式且没有默认值的`arguments`是会被代码中的语句改掉的,而其他两种情况不会。`efront`和`typescript`在把默认值赋值的语句移动到函数体内时,都没有处理这一细节,即原来只读的`arguments`可能被函数内的语句改掉。`efront
|
|
30
|
+
非严格模式且没有默认值的`arguments`是会被代码中的语句改掉的,而其他两种情况不会。`efront`和`typescript`在把默认值赋值的语句移动到函数体内时,都没有处理这一细节,即原来只读的`arguments`可能被函数内的语句改掉。`efront`内提供的一些组件,可能也会有一部分有因此而无法降级使用的问题,如果您发现了相关的问题,可以向我反馈,我会尽快处理。
|
|
30
31
|
|
|
31
32
|
4. ```javascript
|
|
32
33
|
async function () {
|
|
33
34
|
await ...;
|
|
34
|
-
arguments;
|
|
35
|
+
arguments;
|
|
35
36
|
}
|
|
36
37
|
// 或
|
|
37
38
|
function* (){
|
|
@@ -39,7 +40,7 @@
|
|
|
39
40
|
arguments;
|
|
40
41
|
}
|
|
41
42
|
```
|
|
42
|
-
|
|
43
|
+
`typescript` 转换这两类新型函数后,`arguments`对象的内容有误。这不是一个难解决的问题,应该只是`typescript`已发现但不愿解决的问题。`efront`在降级编译时临时使用变量重命名的方法对代码中的`arguments`进行替换使其内容与原生高级代码一致。
|
|
43
44
|
|
|
44
45
|
5. ```javascript
|
|
45
46
|
Object.keys
|
|
@@ -80,7 +81,7 @@
|
|
|
80
81
|
obj.for
|
|
81
82
|
```
|
|
82
83
|
类似这种用`.`取属性的语句,由于属性名与`js`的保留字一样,`ie6`等浏览器会报错,但您可以在`efront`提供的环境中放心使用。因为`efront`本身就会把取属性的语句处理掉。
|
|
83
|
-
10. `ie8`及以下浏览器中存在的一些与现代`js`标准不同的特性,`efront
|
|
84
|
+
10. `ie8`及以下浏览器中存在的一些与现代`js`标准不同的特性,`efront`提供的组件可能不兼容,在为这类环境进行应用开发时,应避免使用。
|
|
84
85
|
```javascript
|
|
85
86
|
Object.defineProperty(...);
|
|
86
87
|
({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
`coms/compile`目录的代码不仅不完善,且可能随时被修改或删除,仅供`efront`自身使用。您可能可以临时使用其中的暂时可用的部分功能,但不能寄希望于它会稳定或长期存在。
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
var iso8859 = require("./iso8859");
|
|
2
|
+
var Program = require("./Program");
|
|
3
|
+
var strings = require("../basic/strings");
|
|
4
|
+
|
|
5
|
+
const {
|
|
6
|
+
/* 1 */COMMENT,
|
|
7
|
+
/* 2 */SPACE,
|
|
8
|
+
/* 4 */STRAP,
|
|
9
|
+
/* 8 */STAMP,
|
|
10
|
+
/* 16 */VALUE,
|
|
11
|
+
/* 32 */QUOTED,
|
|
12
|
+
/* 64 */PIECE,
|
|
13
|
+
/* 128 */EXPRESS,
|
|
14
|
+
/* 256 */SCOPED,
|
|
15
|
+
/* 512 */LABEL,
|
|
16
|
+
/*1024 */PROPERTY,
|
|
17
|
+
createScoped,
|
|
18
|
+
} = require("./common");
|
|
19
|
+
var ignore = { test() { return false } };
|
|
20
|
+
|
|
21
|
+
class Html extends Program {
|
|
22
|
+
straps = [];
|
|
23
|
+
value_reg = ignore;
|
|
24
|
+
strapexp_reg = ignore;
|
|
25
|
+
forceend_reg = ignore;
|
|
26
|
+
classstrap_reg = ignore;
|
|
27
|
+
scopes = [];
|
|
28
|
+
intag = false;
|
|
29
|
+
stamps = "/<>=".split("");
|
|
30
|
+
tags = [];
|
|
31
|
+
quotes = [["'", "'", /\\[\s\S]/], ["\"", "\"", /\\[\s\S]/]]
|
|
32
|
+
}
|
|
33
|
+
var p = new Program;
|
|
34
|
+
var replaceISO8859 = function (data) {
|
|
35
|
+
return String(data).replace(/<\!--([\s\S]*)--\>$/g, '$1').replace(/&\w+;/g, a => iso8859[a] || a).replace(/&#(\d+);/g, (_, a) => String.fromCodePoint(a))
|
|
36
|
+
};
|
|
37
|
+
var parseExpress = function (data, mayberepeat) {
|
|
38
|
+
data = replaceISO8859(data);
|
|
39
|
+
if (mayberepeat && /\s+(in|of)\s+/.test(data)) {
|
|
40
|
+
data = data.split(/\s+(in|of)\s+/).pop();
|
|
41
|
+
}
|
|
42
|
+
p.lastIndex = 0;
|
|
43
|
+
return p.exec(data);
|
|
44
|
+
};
|
|
45
|
+
var keep_reg = /^(SCRIPT|STYLE)$/i;
|
|
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
|
+
};
|
|
78
|
+
var toCamelCase = function (a) {
|
|
79
|
+
return a.replace(/\-([\s\S])/g, (_, a) => a.toUpperCase());
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
class Node { }
|
|
83
|
+
|
|
84
|
+
Html.prototype.createScoped = function (code) {
|
|
85
|
+
var used = Object.create(null);
|
|
86
|
+
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
|
+
var scriptNodes = [], styleNodes = [], tempNodes = [];
|
|
93
|
+
for (var cx = 0, dx = code.length, c = code[0]; cx < dx; c = code[++cx])switch (c.type) {
|
|
94
|
+
case LABEL:
|
|
95
|
+
if (!/^(script|style|template)$/i.test(c.text)) {
|
|
96
|
+
var v = toCamelCase(c.text)
|
|
97
|
+
if (!used[v]) used[v] = [];
|
|
98
|
+
used[v].push(c);
|
|
99
|
+
}
|
|
100
|
+
if (!c.isclose) {
|
|
101
|
+
var node = new Node;
|
|
102
|
+
node.tagName = c.text.toUpperCase();
|
|
103
|
+
nodePath.push(node);
|
|
104
|
+
node.childNodes = [];
|
|
105
|
+
node.children = [];
|
|
106
|
+
var outerStart = cx;
|
|
107
|
+
while (code[outerStart] !== c.prev) outerStart--;
|
|
108
|
+
node.outerStart = outerStart;
|
|
109
|
+
childNodes.push(node);
|
|
110
|
+
children.push(node);
|
|
111
|
+
children = node.children;
|
|
112
|
+
childNodes = node.childNodes;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
var tagName = c.text.toUpperCase();
|
|
116
|
+
for (var cy = nodePath.length - 1; cy >= 0; cy--) {
|
|
117
|
+
if (nodePath[cy].tagName === tagName) break;
|
|
118
|
+
}
|
|
119
|
+
var node = nodePath[cy];
|
|
120
|
+
var outerEnd = cx;
|
|
121
|
+
while (code[outerEnd++] !== c.next);
|
|
122
|
+
node.outerEnd = outerEnd;
|
|
123
|
+
var innerEnd = cx;
|
|
124
|
+
while (code[innerEnd] !== c.prev) innerEnd--;
|
|
125
|
+
node.innerEnd = innerEnd;
|
|
126
|
+
var children1 = node.children;
|
|
127
|
+
var childNodes1 = node.childNodes;
|
|
128
|
+
for (var n of nodePath.splice(cy + 1, nodePath.length)) {
|
|
129
|
+
n.noclose = true;
|
|
130
|
+
for (var c of n.childNodes) childNodes1.push(c);
|
|
131
|
+
for (var c of n.children) children1.push(c);
|
|
132
|
+
}
|
|
133
|
+
if (childNodes1.length) node.innerStart = childNodes1[0].outerStart;
|
|
134
|
+
else node.innerStart = innerEnd;
|
|
135
|
+
if (node.tagName === "SCRIPT") scriptNodes.push(node), tempNodes.push(node), node.isScript = true;
|
|
136
|
+
else if (node.tagName === "STYLE") styleNodes.push(node), tempNodes.push(node), node.isStyle = true;
|
|
137
|
+
nodePath.pop();
|
|
138
|
+
node = nodePath[nodePath.length - 1];
|
|
139
|
+
childNodes = node.childNodes;
|
|
140
|
+
children = node.children;
|
|
141
|
+
}
|
|
142
|
+
continue;
|
|
143
|
+
case PROPERTY:
|
|
144
|
+
if (c.next && c.next.type === STAMP && c.next.text === '=') {
|
|
145
|
+
if (/^(element|render|)id$/i.test(c.text)) {
|
|
146
|
+
var nn = c.next.next;
|
|
147
|
+
if (!nn || nn.length > 0) continue;
|
|
148
|
+
if (nn.type === EXPRESS || nn.type === QUOTED) {
|
|
149
|
+
vars[strings.decode(nn.text)] = true;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
if (/^\#/.test(c.text)) {
|
|
155
|
+
var id = c.text.slice(1);
|
|
156
|
+
vars[toCamelCase(id)] = true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
case QUOTED:
|
|
161
|
+
var t = strings.decode(c.text);
|
|
162
|
+
var p = t.prev;
|
|
163
|
+
var pp = p && p.prev;
|
|
164
|
+
var mayberepeat = p && pp && p.type === STAMP && p.text === "=" && /\-(src|repeat|for|each|foreach)$/i.test(pp.text)
|
|
165
|
+
t = parseExpress(t, mayberepeat);
|
|
166
|
+
var envs = createScoped(t).envs;
|
|
167
|
+
for (var k in envs) {
|
|
168
|
+
if (!used[k]) used[k] = [];
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
case EXPRESS:
|
|
172
|
+
var t = c.text;
|
|
173
|
+
t = parseExpress(t);
|
|
174
|
+
var envs = createScoped(t).envs;
|
|
175
|
+
for (var k in envs) {
|
|
176
|
+
if (!used[k]) used[k] = [];
|
|
177
|
+
}
|
|
178
|
+
break;
|
|
179
|
+
case PIECE:
|
|
180
|
+
case COMMENT:
|
|
181
|
+
var n = new Node;
|
|
182
|
+
n.text = c.text;
|
|
183
|
+
n.outerStart = cx;
|
|
184
|
+
childNodes.push(n);
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
var envs = Object.create(null);
|
|
188
|
+
for (var k in used) {
|
|
189
|
+
if (!vars[k]) {
|
|
190
|
+
envs[k] = true;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
var scripts = [];
|
|
194
|
+
var styles = [];
|
|
195
|
+
var scoped = [];
|
|
196
|
+
scoped.richNodes = tempNodes.slice();
|
|
197
|
+
code = code.slice();
|
|
198
|
+
for (var c of scriptNodes) scripts.push(c.innerText = replaceISO8859(this.createString(code.slice(c.innerStart, c.innerEnd))));
|
|
199
|
+
for (var c of styleNodes) styles.push(c.innerText = replaceISO8859(this.createString(code.slice(c.innerStart, c.innerEnd))));
|
|
200
|
+
while (tempNodes.length) {
|
|
201
|
+
var c = tempNodes.pop();
|
|
202
|
+
code.splice(c.outerStart, c.outerEnd - c.outerStart);
|
|
203
|
+
}
|
|
204
|
+
scoped.scripts = scripts;
|
|
205
|
+
scoped.styles = styles;
|
|
206
|
+
var rootNodes = dom.childNodes.filter(a => !/^(script|style)$/i.test(a.tagName));
|
|
207
|
+
if (rootNodes.length === 1) {
|
|
208
|
+
scoped.outerHTML = this.createString(code);
|
|
209
|
+
var root = rootNodes[0];
|
|
210
|
+
scoped.tagName = root.tagName;
|
|
211
|
+
while (code[code.length - 1].type === COMMENT || code[code.length - 1].type === SPACE) code.pop();
|
|
212
|
+
while (code[0].type === COMMENT || code[0].type === SPACE) code.shift();
|
|
213
|
+
var attrarea = code.splice(0, root.innerStart - root.outerStart);
|
|
214
|
+
var attrs = [];
|
|
215
|
+
for (var a of attrarea) {
|
|
216
|
+
if (a.type === PROPERTY) {
|
|
217
|
+
var at = { name: a.text };
|
|
218
|
+
attrs.push(at);
|
|
219
|
+
var n = a.next;
|
|
220
|
+
if (!n) continue;
|
|
221
|
+
if (n.type !== STAMP || n.text !== '=') continue;
|
|
222
|
+
var nn = n.next;
|
|
223
|
+
if (!nn) return;
|
|
224
|
+
at.value = nn.text;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
code.splice(root.innerEnd - root.outerEnd, code.length);
|
|
228
|
+
scoped.innerHTML = this.createString(code);
|
|
229
|
+
scoped.attributes = attrs;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
scoped.innerHTML = this.createString(code);
|
|
233
|
+
}
|
|
234
|
+
scoped.envs = envs;
|
|
235
|
+
scoped.vars = vars;
|
|
236
|
+
scoped.used = used;
|
|
237
|
+
return scoped;
|
|
238
|
+
};
|
|
239
|
+
Html.prototype.createString = function (code) {
|
|
240
|
+
var dist = [];
|
|
241
|
+
var keepspace = code.keepspace;
|
|
242
|
+
var p = null;
|
|
243
|
+
for (var c of code) {
|
|
244
|
+
switch (c.type) {
|
|
245
|
+
case PIECE:
|
|
246
|
+
if (p && p.type === PIECE) dist.push(" ");
|
|
247
|
+
dist.push(c.text);
|
|
248
|
+
break;
|
|
249
|
+
case SPACE:
|
|
250
|
+
if (keepspace) dist.push(c.text);
|
|
251
|
+
break;
|
|
252
|
+
case PROPERTY:
|
|
253
|
+
dist.push(" ");
|
|
254
|
+
dist.push(c.text);
|
|
255
|
+
break;
|
|
256
|
+
default:
|
|
257
|
+
dist.push(c.text);
|
|
258
|
+
}
|
|
259
|
+
p = c;
|
|
260
|
+
}
|
|
261
|
+
return dist.join('');
|
|
262
|
+
}
|
|
263
|
+
module.exports = Html;
|