efront 3.35.14 → 3.36.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.
Files changed (39) hide show
  1. package/#/345/233/275/351/231/205/345/214/226.yml +137 -0
  2. package/apps/blank/index.html +1 -21
  3. package/apps/blank/main.js +1 -1
  4. package/apps/kugou/singer/keywords.less +1 -0
  5. package/apps/pivot/auth/login.html +3 -3
  6. package/apps/sciters/main.js +31 -0
  7. package/coms/basic/#loader.js +3 -4
  8. package/coms/basic/i18n.js +27 -0
  9. package/coms/basic/i18n.md +10 -0
  10. package/coms/basic/parseYML.js +1 -0
  11. package/coms/basic/refilm_decode.js +2 -1
  12. package/coms/basic/strings.js +3 -3
  13. package/coms/compile/Javascript.js +1 -20
  14. package/coms/compile/common.js +22 -0
  15. package/coms/compile/translate.js +136 -0
  16. package/coms/compile/wraphtml.js +3 -0
  17. package/coms/docs/md5.js +174 -0
  18. package/coms/frame/route.js +1 -1
  19. package/coms/zimoli/XMLHttpRequest.js +33 -1
  20. package/coms/zimoli/alert.js +1 -1
  21. package/coms/zimoli/appendChild.js +2 -1
  22. package/coms/zimoli/button.less +1 -0
  23. package/coms/zimoli/createEvent.js +8 -3
  24. package/coms/zimoli/cross.js +1 -1
  25. package/coms/zimoli/cross_test.js +8 -2
  26. package/coms/zimoli/forceUpdate.js +2 -6
  27. package/coms/zimoli/list.js +1 -1
  28. package/coms/zimoli/on.js +4 -2
  29. package/coms/zimoli/render.js +5 -2
  30. package/coms/zimoli/transition.js +4 -5
  31. package/coms/zimoli/tree.js +5 -3
  32. package/coms/zimoli/zimoli.js +3 -3
  33. package/docs/index.html +1 -12
  34. package/docs/main.xht +2 -1
  35. package/docs//345/267/245/345/205/267//345/233/275/351/231/205/345/214/226.xht +576 -0
  36. package/package.json +1 -1
  37. package/public/efront.js +1 -1
  38. package/readme.md +1 -1
  39. package/coms/zimoli/i18n.js +0 -192
@@ -0,0 +1,137 @@
1
+ - zh-CN: 服务器异常$1
2
+ en: Server Exception $1
3
+
4
+ - zh-CN: $1之前需要使用$2命令在$3上设置$4
5
+ en: Before $1, you need to use the $2 command to set $4 on $3
6
+
7
+ - zh-CN: 请输入服务器密码
8
+ en: Please enter the server password
9
+
10
+ - zh-CN: 登录
11
+ en: Sign in
12
+
13
+ - zh-CN: 文本超长,无法翻译
14
+ en: The text is too long to be translated
15
+
16
+ - zh-CN: 没有权限!
17
+ en: No permission!
18
+
19
+ - zh-CN: 未找到指定的资源
20
+ en: The specified resource was not found
21
+
22
+ - zh-CN: 原始名称
23
+ en: Original Name
24
+
25
+ - zh-CN: 输入新名称
26
+ en: Enter a new name
27
+
28
+ - zh-CN: 请过一段时间再试
29
+ en: Please try again later
30
+
31
+ - zh-CN: 服务器取消了您的请求
32
+ en: The server canceled your request
33
+
34
+ - zh-CN: 文件
35
+ en: file
36
+
37
+ - zh-CN: 键名
38
+ en: Key Name
39
+
40
+ - zh-CN: 显示名
41
+ en: Display Name
42
+
43
+ - zh-CN: 密钥
44
+ en: secret key
45
+
46
+ - zh-CN: 备注
47
+ en: remarks
48
+
49
+ - zh-CN: 任务ID
50
+ en: Task ID
51
+
52
+ - zh-CN: 任务名
53
+ en: Task Name
54
+
55
+ - zh-CN: 是否启用
56
+ en: Enabled or not
57
+
58
+ - zh-CN: 任务代码
59
+ en: Task Code
60
+
61
+ - zh-CN: 标识
62
+ en: identification
63
+
64
+ - zh-CN: 应用名
65
+ en: App Name
66
+
67
+ - zh-CN: 路径
68
+ en: route
69
+
70
+ - zh-CN: 代理路径
71
+ en: Proxy Path
72
+
73
+ - zh-CN: 二维码
74
+ en: QR code
75
+
76
+ - zh-CN: 真实路径
77
+ en: Real path
78
+
79
+ - zh-CN: 动作
80
+ en: action
81
+
82
+ - zh-CN: 状态
83
+ en: state
84
+
85
+ - zh-CN: 地址
86
+ en: address
87
+
88
+ - zh-CN: 地理位置
89
+ en: geographical position
90
+
91
+ - zh-CN: 启动时间
92
+ en: Start time
93
+
94
+ - zh-CN: 端口
95
+ en: port
96
+
97
+ - zh-CN: 版本
98
+ en: edition
99
+
100
+ - zh-CN: 进程
101
+ en: process
102
+
103
+ - zh-CN: 访问量
104
+ en: Visits
105
+
106
+ - zh-CN: 房间名
107
+ en: Room name
108
+
109
+ - zh-CN: 数值
110
+ en: numerical value
111
+
112
+ - zh-CN: 文本
113
+ en: text
114
+
115
+ - zh-CN: 字典ID
116
+ en: Dictionary ID
117
+
118
+ - zh-CN: 字典名
119
+ en: Dictionary name
120
+
121
+ - zh-CN: 字典数据
122
+ en: Dictionary data
123
+
124
+ - zh-CN: 名称
125
+ en: name
126
+
127
+ - zh-CN: 服务器
128
+ en: The server
129
+
130
+ - zh-CN: 服务器地址
131
+ en: server address
132
+
133
+ - zh-CN: 密码
134
+ en: password
135
+
136
+ - zh-CN: 这是一个空白项目
137
+ en: This is a blank project
@@ -8,32 +8,12 @@
8
8
  <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
9
9
  <meta charset="utf-8" />
10
10
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
11
- <link rel="Shortcut Icon" href="/favicon.ico" type="image/x-icon" />
11
+ <link rel="Shortcut Icon" href="http://efront.cc/favicon.ico" type="image/x-icon" />
12
12
  <meta name="viewport" content="initial-scale=1,maximum-scale=1,width=device-width" />
13
13
  <title>Efront 空项目</title>
14
14
  <script deleteoncompile efrontloader>
15
15
  // 若要在开发环境使用内置组件,请保留此script标签中的代码,在编译发布时,这里的代码会自动删除
16
16
  </script>
17
- <style>
18
- html {
19
- height: 100%;
20
- font-family: "SF Pro SC", "SF Pro Text", "SF Pro Icons", "PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
21
- }
22
-
23
- *,
24
- ::before,
25
- ::after {
26
- box-sizing: border-box;
27
- }
28
-
29
- body {
30
- border: none;
31
- margin: 0;
32
- padding: 0;
33
- height: 100%;
34
- overflow: hidden;
35
- }
36
- </style>
37
17
  </head>
38
18
 
39
19
  <body scroll=no max-render=1440></body>
@@ -1,5 +1,5 @@
1
1
  function main() {
2
2
  var page = document.createElement("div");
3
- page.innerHTML = '这是一个空白项目 ';
3
+ page.innerHTML = i18n`这是一个空白项目`;
4
4
  return page;
5
5
  }
@@ -53,6 +53,7 @@
53
53
  background: #101216;
54
54
  border-radius: 4px 0 4px 0;
55
55
  display: block;
56
+ z-index: 0;
56
57
  }
57
58
  }
58
59
 
@@ -1,12 +1,12 @@
1
1
  <div head>
2
- 请输入服务器密码
2
+ ${i18n`请输入服务器密码`}
3
3
  </div>
4
4
  <div body>
5
5
  <field ng-repeat="f in fields" ng-src="[f,data]"></field>
6
6
  </div>
7
7
  <div foot>
8
- <button pending.="pending" type="submit">登录</button>
8
+ <button pending.="pending" type="submit">${i18n`登录`}</button>
9
9
  </div>
10
10
  <div message>
11
- 登录之前需要使用&nbsp;<b>efront password</b>&nbsp;命令在服务器上设置密码
11
+ ${i18n`${i18n`登录`}之前需要使用${`&nbsp;<b>efront password</b>&nbsp;`}命令在${i18n`服务器`}上设置${i18n`密码`}`}
12
12
  </div>
@@ -0,0 +1,31 @@
1
+ var init_console = function () {
2
+ init_console = function () { };
3
+ var pad = document.createElement("console");
4
+ css(pad, 'position:fixed;bottom:0;top:0;right:0;width:300px;overflow:auto;padding:6px 10px;background:#eee;border-top:1px solid #ccc');
5
+ pad.style.zIndex = 999;
6
+ var log = function (type, style) {
7
+ return function () {
8
+ var log = document.createElement(type);
9
+ css(log, style);
10
+ css(log, 'display:block');
11
+ log.innerHTML = Array.apply(null, arguments).join(" ").replace(/</g, '&lt;').replace(/>/g, "&gt;");
12
+ pad.appendChild(log);
13
+ }
14
+ };
15
+ console.log = log("log", 'color:#333');
16
+ console.error = log("error", 'color:#f00');
17
+ console.info = log("info", 'color:#02f');
18
+ console.clear = function () {
19
+ remove(pad.children);
20
+ };
21
+ onclick(pad, function () {
22
+ pad.style.transition="background-color 300ms linear"
23
+ // pad.style.backgroundColor = "#000";
24
+ pad.innerHTML= pad.style.getPropertyValue("transition").length;
25
+ })
26
+ document.body.appendChild(pad)
27
+ };
28
+ function main() {
29
+ init_console();
30
+ return alert_test();
31
+ }
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  var window = this;
3
3
  var isProduction = true;
4
- // <!-- isProduction = false -->
5
-
4
+ // <!-- isProduction = false; -->
6
5
  var {
7
6
  parseInt,
8
7
  XMLHttpRequest,
@@ -832,7 +831,7 @@ modules.modules = modules;
832
831
  var requires_count = 3;
833
832
  var hook = function (requires_count) {
834
833
  if (requires_count !== 0) return;
835
- "alert confirm innerWidth innerHeight close prompt".split(/\s+/).map(removeGlobalProperty);
834
+ "alert confirm innerWidth innerHeight close prompt data".split(/\s+/).map(removeGlobalProperty);
836
835
  modules.Promise = Promise;
837
836
  modules.hook_time = +new Date;
838
837
  if (document) {
@@ -855,7 +854,7 @@ var initIfNotDefined = function (defined, path, onload) {
855
854
  else hook(--requires_count);
856
855
  };
857
856
 
858
- if (document) loadResponseTreeFromStorage();
857
+ if (localStorage) loadResponseTreeFromStorage();
859
858
  initIfNotDefined([].map, "[]map", map => map);
860
859
  "use ../basic_/#checkPromise.js";
861
860
  initIfNotDefined(Promise, "Promise", promise => Promise = promise);
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var languageMap = {};
3
+ var languageIndex = 0;
4
+ function i18n() {
5
+ return arguments[isFinite(this) ? this : languageIndex];
6
+ };
7
+ i18n.lang = function (type) {
8
+ var id = getLanguageIndexFromName(type) || 0;
9
+ return i18n.bind(id);
10
+ };
11
+ var getLanguageIndexFromName = function (language) {
12
+ if (isFinite(language)) return language;
13
+ if (language in languageMap) return languageMap[language];
14
+ language = String(language).toLowerCase();
15
+ for (var l of language.split(",").slice(0, 12)) {
16
+ for (var k in languageMap) {
17
+ for (var kk of k.toLowerCase().split("-")) {
18
+ if (l.indexOf(kk) >= 0) return languageMap[k];
19
+ }
20
+ }
21
+ }
22
+ return languageIndex;
23
+ };
24
+ i18n.setLanguage = function (language) {
25
+ languageIndex = getLanguageIndexFromName(language);
26
+ };
27
+ if (this.navigator) i18n.setLanguage(this.navigator.language);
@@ -0,0 +1,10 @@
1
+ 国际化工具的时的语法如下:
2
+ ```javascript
3
+ i18n`中文内容${参数}`//参数中不能有执行体,否则可能被执行多次造成异常
4
+ ```
5
+ 在项目目录存在指定的国际化文件时,efront会自动转换为类似如下版本,具体语言语种及内容以国际化文件为主:
6
+
7
+ ```javascript
8
+ i18n(`中文内容${参数}`,`English Content${参数}`)
9
+ ```
10
+ 国际化文件可以在文档国际化工具中扫描生成。
@@ -1,4 +1,5 @@
1
1
 
2
+ var strings = require("./strings");
2
3
  var eval2 = function (data) {
3
4
  if (typeof data === 'string') data = data.replace(/(\r\n|\r|\n)$/, '');
4
5
  if (!data) return null;
@@ -386,7 +386,8 @@ function parse(piece) {
386
386
  } else if (/^[\/]/.test(type)) {
387
387
  type = type.slice(1);
388
388
  }
389
- if (typeof options === "string") {
389
+ if (typeof options === "string" && !/^[\$#]+\d+$/.test(options)) {
390
+ console.log(options)
390
391
  options = is(options);
391
392
  var needUnfold = /^\[|\]$/.test(options);
392
393
  options = options.replace(/^\[|\]$/g, '');
@@ -9,8 +9,8 @@ var escapeMap = {
9
9
  var unescapeMap = {};
10
10
  for (var k in escapeMap) unescapeMap[escapeMap[k]] = k;
11
11
 
12
- function encode(str) {
13
- return "\"" + str.replace(/[\\"]/g, "\\$&").replace(/[\r\n\t\v\f\u0008\u0000-\u001f\u007f-\uffff]/g, a => {
12
+ function encode(str, q = "\"") {
13
+ return q + str.replace(new RegExp(`[\\\\${q}]`, 'g'), "\\$&").replace(/[\r\n\t\v\f\u0008\u0000-\u001f\u007f-\uffff]/g, a => {
14
14
  if (escapeMap.hasOwnProperty(a)) return escapeMap[a];
15
15
  var code = a.charCodeAt(0).toString(16);
16
16
  switch (code.length) {
@@ -22,7 +22,7 @@ function encode(str) {
22
22
  return "\\u0" + code;
23
23
  }
24
24
  return "\\u" + code;
25
- }) + "\"";
25
+ }) + q;
26
26
  }
27
27
  function decode(s) {
28
28
  var r = /^(['"`])([\s\S]*)\1$/.exec(s);
@@ -20,6 +20,7 @@ const {
20
20
  createScoped,
21
21
  snapExpressHead,
22
22
  relink,
23
+ replace,
23
24
  skipAssignment,
24
25
  } = require("./common");
25
26
  var straps = `if,in,do,as,of
@@ -288,26 +289,6 @@ var collectProperty = function (o, text) {
288
289
  q.defined[text] = o;
289
290
  };
290
291
 
291
- var replace = function (o, ...args) {
292
- var queue = o.queue;
293
- var i = queue.indexOf(o);
294
- if (i >= 0) queue.splice(i, 1, ...args);
295
- var prev = o.prev;
296
- var next = o.next;
297
- if (!args.length) {
298
- if (prev) prev.next = next;
299
- else queue.first = next;
300
- if (next) next.prev = prev;
301
- else queue.last = prev;
302
- }
303
- else {
304
- if (prev) prev.next = args[0], args[0].prev = prev;
305
- else queue.first = args[0];
306
- if (next) next.prev = args[args.length - 1], args[args.length - 1].next = next;
307
- else queue.last = args[args.length - 1];
308
- }
309
- return args.length ? args[0] : next;
310
- };
311
292
  var hasComma = function (c) {
312
293
  for (var cc of c) {
313
294
  if (cc.type === STAMP && cc.text === ',') return true;
@@ -1032,6 +1032,27 @@ var createExpressList = function (code) {
1032
1032
  }
1033
1033
  return list;
1034
1034
  };
1035
+ var replace = function (o, ...args) {
1036
+ var queue = o.queue;
1037
+ var i = queue.indexOf(o);
1038
+ if (i >= 0) queue.splice(i, 1, ...args);
1039
+ var prev = o.prev;
1040
+ var next = o.next;
1041
+ if (!args.length) {
1042
+ if (prev) prev.next = next;
1043
+ else queue.first = next;
1044
+ if (next) next.prev = prev;
1045
+ else queue.last = prev;
1046
+ }
1047
+ else {
1048
+ if (prev) prev.next = args[0], args[0].prev = prev;
1049
+ else queue.first = args[0];
1050
+ if (next) next.prev = args[args.length - 1], args[args.length - 1].next = next;
1051
+ else queue.last = args[args.length - 1];
1052
+ }
1053
+ return args.length ? args[0] : next;
1054
+ };
1055
+
1035
1056
  module.exports = {
1036
1057
  /* 1 */COMMENT,
1037
1058
  /* 2 */SPACE,
@@ -1059,5 +1080,6 @@ module.exports = {
1059
1080
  saveTo,
1060
1081
  rename,
1061
1082
  relink,
1083
+ replace,
1062
1084
  mergeTo
1063
1085
  };
@@ -0,0 +1,136 @@
1
+ var scanner2 = require("./scanner2");
2
+ var { SCOPED, QUOTED, SCOPED, PIECE, number_reg, replace, createString } = require("./common");
3
+ var strings = require("../basic/strings");
4
+ var program = null;
5
+ var patchTranslate = function (c) {
6
+ if (c.length) {
7
+ c.translate = c.map((o, i) => o.type === PIECE ? strings.decode(`\`${o.text}\``) : `$${i + 1 >> 1}`).join('');
8
+ }
9
+ else {
10
+ if (/^['"`]/.test(c.text) && c.text.length > 2) {
11
+ var text = strings.decode(c.text);
12
+ c.translate = text;
13
+ }
14
+ }
15
+
16
+ }
17
+ function getAllText(code, dest = []) {
18
+ for (var cx = 0, dx = code.length; cx < dx; cx++) {
19
+ var c = code[cx];
20
+ if (c.type === QUOTED) {
21
+ if (c.length) {
22
+ getAllText(c, dest);
23
+ if (c.entry !== '`') continue;
24
+ patchTranslate(c);
25
+ dest.push(c);
26
+ }
27
+ else {
28
+ if (/^['"`]/.test(c.text) && c.text.length > 2) {
29
+ var text = strings.decode(c.text);
30
+ if (number_reg.test(text) || program.stamp_reg.test(text) || program.space_reg.test(text)) continue;
31
+ patchTranslate(c);
32
+ dest.push(c);
33
+ }
34
+ }
35
+ }
36
+ else if (c.type === SCOPED) {
37
+ getAllText(c, dest);
38
+ }
39
+ }
40
+ return dest;
41
+ }
42
+
43
+ var [手动, 字段名] = Array(2).fill(0).map((_, i) => i + 1);
44
+ function getI18nPrefixedText(code, dist = []) {
45
+ var { used, envs } = code;
46
+ var get = function (arr, f, t) {
47
+ for (var n of arr) {
48
+ if (!n || n.type !== QUOTED || n.length && n.entry !== '`') continue;
49
+ var c = n;
50
+ c.transtype = t;
51
+ patchTranslate(c);
52
+ f(c);
53
+ }
54
+ };
55
+ if (envs.i18n) get(used.i18n.filter(o => o.text === 'i18n').map(o => {
56
+ var n = o.next;
57
+ if (n && n.type === SCOPED && n.entry !== '{') n = n.next;
58
+ return n;
59
+ }), c => dist.push(c), 手动);
60
+ if (envs.refilm) get(used.refilm.filter(o => o.text === 'refilm').map(o => o.next), c => {
61
+ c.fields = refilm([c.translate]);
62
+ dist.push(c);
63
+ }, 字段名);
64
+ return dist;
65
+ }
66
+
67
+ function translate([imap, supports], code) {
68
+ var texts = getI18nPrefixedText(code);
69
+ texts.sort((a, b) => {
70
+ if (a.start > b.start && a.end < b.end) return -1;
71
+ return 0;
72
+ });
73
+ var getm = function (tt) {
74
+ tt = tt.trim();
75
+ if (!imap[tt]) {
76
+ console.warn(`<yellow>国际化翻译缺失:</yellow>${tt}`);
77
+ imap[tt] = supports.map(_ => tt);
78
+ }
79
+ return imap[tt].map(m => strings.encode(m || tt, '`'));
80
+ };
81
+ var used = code.used;
82
+ for (var t of texts) {
83
+ if (t.transtype === 手动) {
84
+ var p = t.prev;
85
+ if (p.type === SCOPED) {
86
+ p.prev.text = 'i18n.lang';
87
+ p.entry = "(";
88
+ p.leave = ")";
89
+ }
90
+ var tt = t.translate;
91
+ replace(t, ...scanner2(`(${getm(tt)})`.replace(/[\$#]+(\d+)/g, (_, i) => {
92
+ var a = (i << 1) - 1;
93
+ if (a in t) return `\${${createString(t[a])}}`;
94
+ return _;
95
+ })));
96
+ }
97
+ else if (t.transtype === 字段名) {
98
+ var i = t.queue.indexOf(t.prev);
99
+ var e = t.queue.indexOf(t, i);
100
+ var ui = used.refilm.indexOf(t.prev);
101
+ used.refilm.splice(ui, 1);
102
+ if (!used.i18n) {
103
+ used.i18n = [];
104
+ code.envs.i18n = true;
105
+ }
106
+ t.queue.splice(i, e + 1 - i, ...scanner2("[" + t.fields.map(f => {
107
+ return "{" + Object.keys(f).map(k => {
108
+ var v = f[k];
109
+ if (/[\$#]\d+/.test(v)) v = v.replace(/[\$#]+(\d+)/g, (_, i) => {
110
+ var a = (i << 1) - 1;
111
+ if (a in t) return createString(t[a]);
112
+ return _;
113
+ });
114
+ else if (k === 'name') v = `i18n(${getm(v)})`;
115
+ else v = JSON.stringify(v);
116
+ return JSON.stringify(k) + ":" + v;
117
+ }).join(',') + "}";
118
+ }).join(',') + "]"));
119
+ }
120
+ }
121
+ if (used.refilm && !used.refilm.length) {
122
+ delete code.envs.refilm;
123
+ delete code.used.refilm;
124
+ }
125
+ }
126
+ translate.getAllText = function (data) {
127
+ var code = scanner2(String(data));
128
+ program = code.program;
129
+ var texts = [];
130
+ getAllText(code, texts);
131
+ return texts;
132
+ };
133
+ translate.手动 = 手动;
134
+ translate.字段名 = 字段名;
135
+ translate.getI18nPrefixed = getI18nPrefixedText;
136
+ module.exports = translate;
@@ -0,0 +1,3 @@
1
+ function wrapHtml(htmldata) {
2
+ return "`" + String(htmldata).trim().replace(/>\s+</g, "><").replace(/\\[^`]/g, "\\$&") + "`";
3
+ }