b28-cli 1.7.1 → 1.7.2

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 (74) hide show
  1. package/.babelrc +13 -13
  2. package/README.MD +470 -466
  3. package/TestFile/output/lang/BRPT.json +24 -0
  4. package/TestFile/output/lang/CN.json +24 -0
  5. package/TestFile/output/lang/CS.json +24 -0
  6. package/TestFile/output/lang/DE.json +24 -0
  7. package/TestFile/output/lang/EN.json +24 -0
  8. package/TestFile/output/lang/ES.json +24 -0
  9. package/TestFile/output/lang/FR.json +24 -0
  10. package/TestFile/output/lang/HU.json +24 -0
  11. package/TestFile/output/lang/IT.json +24 -0
  12. package/TestFile/output/lang/KO.json +24 -0
  13. package/TestFile/output/lang/LAES.json +24 -0
  14. package/TestFile/output/lang/NL.json +24 -0
  15. package/TestFile/output/lang/PL.json +24 -0
  16. package/TestFile/output/lang/PT.json +24 -0
  17. package/TestFile/output/lang/RO.json +24 -0
  18. package/TestFile/output/lang/RU.json +24 -0
  19. package/TestFile/output/lang/TR.json +24 -0
  20. package/TestFile/output/lang/UK.json +24 -0
  21. package/TestFile/output/lang/ZH.json +24 -0
  22. package/TestFile/output/lang/brpt/translate.json +23 -0
  23. package/TestFile/output/lang/cn/translate.json +23 -0
  24. package/TestFile/output/lang/cs/translate.json +23 -0
  25. package/TestFile/output/lang/de/translate.json +23 -0
  26. package/TestFile/output/lang/es/translate.json +23 -0
  27. package/TestFile/output/lang/fr/translate.json +23 -0
  28. package/TestFile/output/lang/hu/translate.json +23 -0
  29. package/TestFile/output/lang/it/translate.json +23 -0
  30. package/TestFile/output/lang/ko/translate.json +23 -0
  31. package/TestFile/output/lang/laes/translate.json +23 -0
  32. package/TestFile/output/lang/nl/translate.json +23 -0
  33. package/TestFile/output/lang/pl/translate.json +23 -0
  34. package/TestFile/output/lang/pt/translate.json +23 -0
  35. package/TestFile/output/lang/ro/translate.json +23 -0
  36. package/TestFile/output/lang/ru/translate.json +23 -0
  37. package/TestFile/output/lang/tr/translate.json +23 -0
  38. package/TestFile/output/lang/uk/translate.json +23 -0
  39. package/TestFile/output/lang/zh/translate.json +23 -0
  40. package/TestFile/output/lang.json +25 -0
  41. package/b28n.js +739 -739
  42. package/b28nPigeonhole/11ac_ecos_b28n.js +677 -677
  43. package/b28nPigeonhole/11ac_linux_b28n_async.js +709 -709
  44. package/b28nPigeonhole/4G03_b28n_async.js +708 -708
  45. package/b28nPigeonhole/G5310P_b28n.js +650 -650
  46. package/b28nPigeonhole/es5b28n.js +711 -711
  47. package/b28nPigeonhole/es6b28n.js +857 -857
  48. package/b28nPigeonhole/readMe.md +20 -20
  49. package/b28nPigeonhole//345/276/256/344/274/201/350/267/257/347/224/261b28n.js +916 -916
  50. package/dist/ExtractLangExcel.js +138 -45
  51. package/dist/cmd.js +14 -9
  52. package/dist/excel2json.js +215 -54
  53. package/dist/extract/extract-html.js +2 -2
  54. package/dist/extract/extract-js.js +2 -2
  55. package/dist/extract/extract-regexp.js +2 -2
  56. package/dist/extract/extract-vue.js +9 -9
  57. package/dist/extract/extract.js +4 -4
  58. package/dist/extract/extractRegexp/index.js +6 -6
  59. package/dist/extract/vue/html-parser.js +16 -16
  60. package/dist/extract/vue/util.js +2 -2
  61. package/dist/extract/vue/vue-compiler.js +2 -2
  62. package/dist/extractOrigin/extract.js +2 -2
  63. package/dist/extractOrigin/extract_html_ori.js +2 -2
  64. package/dist/extractOrigin/extract_js_ori.js +2 -2
  65. package/dist/handle.js +57 -7
  66. package/dist/index.js +36 -7
  67. package/dist/mergeExcel.js +407 -0
  68. package/dist/mergeJson.js +423 -2
  69. package/dist/util/config.js +90 -32
  70. package/dist/util/index.js +48 -41
  71. package/index.js +5 -5
  72. package/package.json +63 -62
  73. package/result.txt +53 -53
  74. package/test.js +182 -182
package/dist/mergeJson.js CHANGED
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  exports.__esModule = true;
4
+ exports.mergeJsonFolders = undefined;
5
+
6
+ var _typeof2 = require("babel-runtime/helpers/typeof");
7
+
8
+ var _typeof3 = _interopRequireDefault(_typeof2);
4
9
 
5
10
  var _index = require("./util/index");
6
11
 
@@ -8,9 +13,16 @@ var _path = require("path");
8
13
 
9
14
  var _path2 = _interopRequireDefault(_path);
10
15
 
16
+ var _fs = require("fs");
17
+
18
+ var _fs2 = _interopRequireDefault(_fs);
19
+
11
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
21
 
13
22
  function merge(obj) {
23
+ if (obj === undefined || obj === null) {
24
+ obj = {};
25
+ }
14
26
  var outData = Object.assign(Object.prototype.toString.call(obj) === "[object Object]" ? {} : [], obj);
15
27
 
16
28
  for (var _len = arguments.length, others = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
@@ -19,12 +31,94 @@ function merge(obj) {
19
31
 
20
32
  if (others) {
21
33
  others.forEach(function (itemObj) {
22
- outData = (0, _index.mergeObject)(outData, itemObj);
34
+ if (itemObj !== undefined && itemObj !== null) {
35
+ outData = (0, _index.mergeObject)(outData, itemObj);
36
+ }
23
37
  });
24
38
  }
25
39
  return outData;
26
40
  }
27
41
 
42
+ /**
43
+ * 同语种目录合并专用:深拷贝合并两个 JSON 对象,取两边 key 并集,次优先(次覆盖主)。
44
+ * 不引入 undefined,避免次 json 内容丢失。
45
+ * @param {Object} main 主 json(dir1)
46
+ * @param {Object} sub 次 json(dir2)
47
+ * @returns {Object} 新对象,不修改入参
48
+ */
49
+ function unionMerge(main, sub) {
50
+ var isObj = function isObj(v) {
51
+ return (typeof v === "undefined" ? "undefined" : (0, _typeof3.default)(v)) === "object" && v !== null && !Array.isArray(v);
52
+ };
53
+ var isArr = function isArr(v) {
54
+ return Array.isArray(v);
55
+ };
56
+ var dedupe = function dedupe(arr) {
57
+ var seen = new Set();
58
+ return arr.filter(function (item) {
59
+ var k = (typeof item === "undefined" ? "undefined" : (0, _typeof3.default)(item)) === "object" && item !== null ? JSON.stringify(item) : String(item);
60
+ if (seen.has(k)) return false;
61
+ seen.add(k);
62
+ return true;
63
+ });
64
+ };
65
+
66
+ if (isArr(main) && isArr(sub)) {
67
+ return dedupe([].concat(main || [], sub || []));
68
+ }
69
+ if (isArr(main) || isArr(sub)) {
70
+ var a = isArr(sub) ? sub : main;
71
+ return a ? [].concat(a) : [];
72
+ }
73
+
74
+ main = main && (typeof main === "undefined" ? "undefined" : (0, _typeof3.default)(main)) === "object" ? main : {};
75
+ sub = sub && (typeof sub === "undefined" ? "undefined" : (0, _typeof3.default)(sub)) === "object" ? sub : {};
76
+ var out = {};
77
+ var keys = new Set([].concat(Object.keys(main), Object.keys(sub)));
78
+ keys.forEach(function (key) {
79
+ var m = main[key];
80
+ var s = sub[key];
81
+ var useSub = s !== undefined && s !== null;
82
+ var useMain = m !== undefined && m !== null;
83
+ if (useSub && useMain && isObj(m) && isObj(s)) {
84
+ out[key] = unionMerge(m, s);
85
+ } else if (useSub && useMain && isArr(m) && isArr(s)) {
86
+ out[key] = dedupe([].concat(m, s));
87
+ } else if (useSub) {
88
+ out[key] = isObj(s) ? unionMerge({}, s) : isArr(s) ? [].concat(s) : s;
89
+ } else if (useMain) {
90
+ out[key] = isObj(m) ? unionMerge(m, {}) : isArr(m) ? [].concat(m) : m;
91
+ }
92
+ });
93
+ return out;
94
+ }
95
+
96
+ /**
97
+ * 递归删除键值为 undefined 的词条(对象中不写入该 key,数组中过滤掉 undefined)
98
+ */
99
+ function cleanUndefined(obj) {
100
+ if (obj === undefined || obj === null) {
101
+ return obj;
102
+ }
103
+ if (Array.isArray(obj)) {
104
+ return obj.filter(function (item) {
105
+ return item !== undefined;
106
+ }).map(function (item) {
107
+ return (typeof item === "undefined" ? "undefined" : (0, _typeof3.default)(item)) === "object" && item !== null ? cleanUndefined(item) : item;
108
+ });
109
+ }
110
+ if ((typeof obj === "undefined" ? "undefined" : (0, _typeof3.default)(obj)) === "object") {
111
+ var cleaned = {};
112
+ for (var key in obj) {
113
+ if (obj[key] !== undefined) {
114
+ cleaned[key] = (0, _typeof3.default)(obj[key]) === "object" && obj[key] !== null ? cleanUndefined(obj[key]) : obj[key];
115
+ }
116
+ }
117
+ return cleaned;
118
+ }
119
+ return obj;
120
+ }
121
+
28
122
  function mergeJson(main, file, outPath) {
29
123
  var action = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
30
124
 
@@ -40,6 +134,7 @@ function mergeJson(main, file, outPath) {
40
134
  }
41
135
  return merge.apply(undefined, data);
42
136
  }).then(function (data) {
137
+ data = cleanUndefined(data);
43
138
  if (!_path2.default.extname(outPath)) {
44
139
  outPath = _path2.default.join(outPath, "merge.json");
45
140
  }
@@ -54,4 +149,330 @@ function mergeJson(main, file, outPath) {
54
149
  });
55
150
  }
56
151
 
57
- exports.default = mergeJson;
152
+ /**
153
+ * 合并两个目录下对应相同分类文件夹的 JSON 文件(同语种合并)。
154
+ * 始终做完全合并(两边所有 key 取并集),再对数组值去重。
155
+ * @param {String} dir1 第一个目录路径
156
+ * @param {String} dir2 第二个目录路径
157
+ * @param {String} outDir 输出目录路径
158
+ * @param {Number} action 保留参数,目录合并时忽略(始终完全合并+去重)
159
+ * @returns {Promise} 返回 Promise
160
+ */
161
+ function mergeJsonFolders(dir1, dir2, outDir) {
162
+ var action = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
163
+
164
+ // 确保目录路径是绝对路径
165
+ dir1 = _path2.default.resolve(dir1);
166
+ dir2 = _path2.default.resolve(dir2);
167
+ outDir = _path2.default.resolve(outDir);
168
+
169
+ // 检查目录是否存在
170
+ if (!_fs2.default.existsSync(dir1)) {
171
+ return Promise.reject(new Error("\u76EE\u5F55\u4E0D\u5B58\u5728: " + dir1));
172
+ }
173
+ if (!_fs2.default.existsSync(dir2)) {
174
+ return Promise.reject(new Error("\u76EE\u5F55\u4E0D\u5B58\u5728: " + dir2));
175
+ }
176
+
177
+ // 扫描两个目录,获取子文件夹
178
+ var scan1 = (0, _index.scanFolder)(dir1);
179
+ var scan2 = (0, _index.scanFolder)(dir2);
180
+
181
+ // 获取两个目录的直接子文件夹名称
182
+ var getSubFolders = function getSubFolders(baseDir, folders) {
183
+ var subFolders = new Map();
184
+ folders.forEach(function (folderPath) {
185
+ var relativePath = _path2.default.relative(baseDir, folderPath);
186
+ var parts = relativePath.split(_path2.default.sep);
187
+ // 只获取第一层子文件夹
188
+ if (parts.length === 1 && parts[0] !== '') {
189
+ var folderName = parts[0];
190
+ if (!subFolders.has(folderName)) {
191
+ subFolders.set(folderName, folderPath);
192
+ }
193
+ }
194
+ });
195
+ return subFolders;
196
+ };
197
+
198
+ var subFolders1 = getSubFolders(dir1, scan1.folders);
199
+ var subFolders2 = getSubFolders(dir2, scan2.folders);
200
+
201
+ // 找到相同名称的文件夹(需要合并的)
202
+ var commonFolders = [];
203
+ subFolders1.forEach(function (folderPath1, folderName) {
204
+ if (subFolders2.has(folderName)) {
205
+ commonFolders.push({
206
+ name: folderName,
207
+ path1: folderPath1,
208
+ path2: subFolders2.get(folderName)
209
+ });
210
+ }
211
+ });
212
+
213
+ // 仅在 dir1 中存在的文件夹(无同名则原样输出)
214
+ var onlyInDir1 = [];
215
+ subFolders1.forEach(function (folderPath, folderName) {
216
+ if (!subFolders2.has(folderName)) {
217
+ onlyInDir1.push({ name: folderName, path: folderPath });
218
+ }
219
+ });
220
+
221
+ // 仅在 dir2 中存在的文件夹(无同名则原样输出)
222
+ var onlyInDir2 = [];
223
+ subFolders2.forEach(function (folderPath, folderName) {
224
+ if (!subFolders1.has(folderName)) {
225
+ onlyInDir2.push({ name: folderName, path: folderPath });
226
+ }
227
+ });
228
+
229
+ if (commonFolders.length > 0) {
230
+ (0, _index.log)("\u627E\u5230 " + commonFolders.length + " \u4E2A\u76F8\u540C\u540D\u79F0\u7684\u6587\u4EF6\u5939\uFF08\u5C06\u5408\u5E76\uFF09", _index.LOG_TYPE.LOG);
231
+ }
232
+ if (onlyInDir1.length > 0) {
233
+ (0, _index.log)("dir1 \u4E2D " + onlyInDir1.length + " \u4E2A\u65E0\u540C\u540D\u6587\u4EF6\u5939\uFF08\u5C06\u539F\u6837\u8F93\u51FA\uFF09", _index.LOG_TYPE.LOG);
234
+ }
235
+ if (onlyInDir2.length > 0) {
236
+ (0, _index.log)("dir2 \u4E2D " + onlyInDir2.length + " \u4E2A\u65E0\u540C\u540D\u6587\u4EF6\u5939\uFF08\u5C06\u539F\u6837\u8F93\u51FA\uFF09", _index.LOG_TYPE.LOG);
237
+ }
238
+
239
+ // 获取文件夹内的 JSON 文件列表(供合并与原样输出共用)
240
+ var getJsonFiles = function getJsonFiles(folderPath) {
241
+ var files = [];
242
+ try {
243
+ var items = _fs2.default.readdirSync(folderPath);
244
+ items.forEach(function (item) {
245
+ var itemPath = _path2.default.join(folderPath, item);
246
+ var stat = _fs2.default.statSync(itemPath);
247
+ if (stat.isFile() && _path2.default.extname(item).toLowerCase() === '.json') {
248
+ files.push({
249
+ name: item,
250
+ path: itemPath
251
+ });
252
+ }
253
+ });
254
+ } catch (error) {
255
+ (0, _index.log)("\u8BFB\u53D6\u6587\u4EF6\u5939\u5931\u8D25: " + folderPath + ", " + error.message, _index.LOG_TYPE.ERROR);
256
+ }
257
+ return files;
258
+ };
259
+
260
+ // 处理同名文件夹(合并)
261
+ var mergePromises = commonFolders.map(function (_ref) {
262
+ var name = _ref.name,
263
+ path1 = _ref.path1,
264
+ path2 = _ref.path2;
265
+
266
+ var jsonFiles1 = getJsonFiles(path1);
267
+ var jsonFiles2 = getJsonFiles(path2);
268
+
269
+ // 创建文件名映射,找到对应的JSON文件
270
+ var fileMap1 = new Map(jsonFiles1.map(function (f) {
271
+ return [f.name, f.path];
272
+ }));
273
+ var fileMap2 = new Map(jsonFiles2.map(function (f) {
274
+ return [f.name, f.path];
275
+ }));
276
+
277
+ // 找到所有需要合并的文件(两个文件夹中都存在的同名文件)
278
+ var filesToMerge = [];
279
+ fileMap1.forEach(function (filePath1, fileName) {
280
+ if (fileMap2.has(fileName)) {
281
+ filesToMerge.push({
282
+ fileName: fileName,
283
+ path1: filePath1,
284
+ path2: fileMap2.get(fileName)
285
+ });
286
+ }
287
+ });
288
+
289
+ // 如果没有同名文件,尝试合并所有文件
290
+ if (filesToMerge.length === 0) {
291
+ // 如果两个文件夹中都有文件,尝试合并第一个文件
292
+ if (jsonFiles1.length > 0 && jsonFiles2.length > 0) {
293
+ filesToMerge.push({
294
+ fileName: jsonFiles1[0].name,
295
+ path1: jsonFiles1[0].path,
296
+ path2: jsonFiles2[0].path
297
+ });
298
+ } else if (jsonFiles1.length > 0) {
299
+ // 只有第一个文件夹有文件
300
+ jsonFiles1.forEach(function (file) {
301
+ filesToMerge.push({
302
+ fileName: file.name,
303
+ path1: file.path,
304
+ path2: null
305
+ });
306
+ });
307
+ } else if (jsonFiles2.length > 0) {
308
+ // 只有第二个文件夹有文件
309
+ jsonFiles2.forEach(function (file) {
310
+ filesToMerge.push({
311
+ fileName: file.name,
312
+ path1: null,
313
+ path2: file.path
314
+ });
315
+ });
316
+ }
317
+ }
318
+
319
+ var loadJsonStrict = function loadJsonStrict(p) {
320
+ return p ? (0, _index.loadFile)(p).then(function (raw) {
321
+ return JSON.parse(raw);
322
+ }) : Promise.resolve(null);
323
+ };
324
+
325
+ // 合并每个文件
326
+ return Promise.all(filesToMerge.map(function (_ref2) {
327
+ var fileName = _ref2.fileName,
328
+ path1 = _ref2.path1,
329
+ path2 = _ref2.path2;
330
+
331
+ return Promise.all([loadJsonStrict(path1), loadJsonStrict(path2)]).then(function (data) {
332
+ var d0 = data[0];
333
+ var d1 = data[1];
334
+ var mergedData = void 0;
335
+ if (!d0 && !d1) {
336
+ return null;
337
+ }
338
+ if (!d0) {
339
+ mergedData = (typeof d1 === "undefined" ? "undefined" : (0, _typeof3.default)(d1)) === "object" && d1 !== null ? d1 : {};
340
+ } else if (!d1) {
341
+ mergedData = (typeof d0 === "undefined" ? "undefined" : (0, _typeof3.default)(d0)) === "object" && d0 !== null ? d0 : {};
342
+ } else {
343
+ // 同语种合并:unionMerge(主, 次),次优先,不引入 undefined
344
+ mergedData = unionMerge(d0, d1);
345
+ }
346
+
347
+ // 去重和清理:数组按元素去重并过滤undefined;对象递归对数组值去重并移除undefined值
348
+ if (Array.isArray(mergedData)) {
349
+ var seen = new Set();
350
+ mergedData = mergedData.filter(function (item) {
351
+ // 过滤掉undefined和null
352
+ if (item === undefined || item === null) {
353
+ return false;
354
+ }
355
+ var key = (typeof item === "undefined" ? "undefined" : (0, _typeof3.default)(item)) === 'object' && item !== null ? JSON.stringify(item) : String(item);
356
+ if (seen.has(key)) return false;
357
+ seen.add(key);
358
+ return true;
359
+ });
360
+ } else if ((typeof mergedData === "undefined" ? "undefined" : (0, _typeof3.default)(mergedData)) === 'object' && mergedData !== null) {
361
+ var deduplicateObject = function deduplicateObject(obj) {
362
+ var result = {};
363
+ for (var key in obj) {
364
+ // 跳过undefined值
365
+ if (obj[key] === undefined) {
366
+ continue;
367
+ }
368
+ if (Array.isArray(obj[key])) {
369
+ (function () {
370
+ var seen = new Set();
371
+ result[key] = obj[key].filter(function (item) {
372
+ // 过滤掉undefined和null
373
+ if (item === undefined || item === null) {
374
+ return false;
375
+ }
376
+ var itemKey = (typeof item === "undefined" ? "undefined" : (0, _typeof3.default)(item)) === 'object' && item !== null ? JSON.stringify(item) : String(item);
377
+ if (seen.has(itemKey)) return false;
378
+ seen.add(itemKey);
379
+ return true;
380
+ });
381
+ })();
382
+ } else if ((0, _typeof3.default)(obj[key]) === 'object' && obj[key] !== null) {
383
+ result[key] = deduplicateObject(obj[key]);
384
+ } else {
385
+ // 只保留非undefined的值
386
+ if (obj[key] !== undefined) {
387
+ result[key] = obj[key];
388
+ }
389
+ }
390
+ }
391
+ return result;
392
+ };
393
+ mergedData = deduplicateObject(mergedData);
394
+ }
395
+
396
+ // 创建输出目录结构
397
+ var outputFolder = _path2.default.join(outDir, name);
398
+ (0, _index.createFolder)(outputFolder);
399
+ var outputPath = _path2.default.join(outputFolder, fileName);
400
+
401
+ // 兜底:避免写出 undefined / null 导致输出文件内容异常;并删除键值为 undefined 的词条
402
+ if (mergedData === undefined || mergedData === null) {
403
+ (0, _index.log)("\u5408\u5E76\u7ED3\u679C\u4E3A\u7A7A\uFF0C\u5DF2\u81EA\u52A8\u5199\u51FA\u7A7A\u5BF9\u8C61\uFF1Afolder=" + name + ", file=" + fileName, _index.LOG_TYPE.WARNING);
404
+ mergedData = {};
405
+ } else {
406
+ mergedData = cleanUndefined(mergedData);
407
+ }
408
+
409
+ return (0, _index.writeJson)(mergedData, outputPath).then(function () {
410
+ (0, _index.log)("\u5408\u5E76\u5B8C\u6210: " + outputPath, _index.LOG_TYPE.DONE);
411
+ return { folder: name, file: fileName, path: outputPath };
412
+ }).catch(function (error) {
413
+ (0, _index.log)("\u5408\u5E76\u5931\u8D25: " + outputPath + ", " + error.message, _index.LOG_TYPE.ERROR);
414
+ return null;
415
+ });
416
+ }).catch(function (error) {
417
+ (0, _index.log)("\u52A0\u8F7DJSON\u6587\u4EF6\u5931\u8D25: " + error.message, _index.LOG_TYPE.ERROR);
418
+ return null;
419
+ });
420
+ }));
421
+ });
422
+
423
+ // 无同名文件夹:原样输出 dir1 中独有的文件夹及其 JSON
424
+ var copyFromDir1Promises = onlyInDir1.map(function (_ref3) {
425
+ var name = _ref3.name,
426
+ folderPath = _ref3.path;
427
+
428
+ var outputFolder = _path2.default.join(outDir, name);
429
+ (0, _index.createFolder)(outputFolder);
430
+ var jsonFiles = getJsonFiles(folderPath);
431
+ return Promise.all(jsonFiles.map(function (f) {
432
+ return (0, _index.loadJson)(f.path).then(function (data) {
433
+ data = cleanUndefined(data);
434
+ var outputPath = _path2.default.join(outputFolder, f.name);
435
+ return (0, _index.writeJson)(data, outputPath).then(function () {
436
+ (0, _index.log)("\u539F\u6837\u8F93\u51FA: " + outputPath, _index.LOG_TYPE.DONE);
437
+ return { folder: name, file: f.name, path: outputPath };
438
+ });
439
+ });
440
+ }));
441
+ });
442
+
443
+ // 无同名文件夹:原样输出 dir2 中独有的文件夹及其 JSON
444
+ var copyFromDir2Promises = onlyInDir2.map(function (_ref4) {
445
+ var name = _ref4.name,
446
+ folderPath = _ref4.path;
447
+
448
+ var outputFolder = _path2.default.join(outDir, name);
449
+ (0, _index.createFolder)(outputFolder);
450
+ var jsonFiles = getJsonFiles(folderPath);
451
+ return Promise.all(jsonFiles.map(function (f) {
452
+ return (0, _index.loadJson)(f.path).then(function (data) {
453
+ data = cleanUndefined(data);
454
+ var outputPath = _path2.default.join(outputFolder, f.name);
455
+ return (0, _index.writeJson)(data, outputPath).then(function () {
456
+ (0, _index.log)("\u539F\u6837\u8F93\u51FA: " + outputPath, _index.LOG_TYPE.DONE);
457
+ return { folder: name, file: f.name, path: outputPath };
458
+ });
459
+ });
460
+ }));
461
+ });
462
+
463
+ var allPromises = [].concat(mergePromises, copyFromDir1Promises, copyFromDir2Promises);
464
+
465
+ return Promise.all(allPromises).then(function (results) {
466
+ var successCount = results.flat().filter(function (r) {
467
+ return r !== null;
468
+ }).length;
469
+ (0, _index.log)("\u5408\u5E76\u5B8C\u6210\uFF0C\u6210\u529F\u5904\u7406 " + successCount + " \u4E2A\u6587\u4EF6", _index.LOG_TYPE.DONE);
470
+ return results;
471
+ }).catch(function (error) {
472
+ (0, _index.log)("\u5408\u5E76\u76EE\u5F55\u5931\u8D25: " + error.message, _index.LOG_TYPE.ERROR);
473
+ return [];
474
+ });
475
+ }
476
+
477
+ exports.default = mergeJson;
478
+ exports.mergeJsonFolders = mergeJsonFolders;
@@ -20,49 +20,53 @@ var CONFIG_FILE_NAME = "b28.config.js";
20
20
  var TRANS_NAME_REGEX = /^_$/;
21
21
 
22
22
  var COMMAD = {
23
- /**
24
- * 提取词条
23
+ /**
24
+ * 提取词条
25
25
  */
26
26
  GET_WORDS: 0,
27
- /**
28
- * 翻译文件
27
+ /**
28
+ * 翻译文件
29
29
  */
30
30
  TRANSLATE: 1,
31
- /**
32
- * 翻译检查
31
+ /**
32
+ * 翻译检查
33
33
  */
34
34
  CHECK_TRANSLATE: 2,
35
- /**
36
- * Excel转JSON
35
+ /**
36
+ * Excel转JSON
37
37
  */
38
38
  EXCEL_TO_JSON: 3,
39
- /**
40
- * JSON转Excel
39
+ /**
40
+ * JSON转Excel
41
41
  */
42
42
  JSON_TO_EXCEL: 4,
43
- /**
44
- * JSON文件合并
43
+ /**
44
+ * JSON文件合并
45
45
  */
46
46
  MERGE_JSON: 5,
47
- /**
48
- * 原厂代码处理添加翻译
47
+ /**
48
+ * 原厂代码处理添加翻译
49
49
  */
50
50
  ORIGINAL_CODE: 6,
51
- /**
52
- * 提取词条及json文件生成一个excel表格
51
+ /**
52
+ * 提取词条及json文件生成一个excel表格
53
53
  */
54
54
  GET_ALLWORDS: 7,
55
- /**
56
- * 翻译文件检查
55
+ /**
56
+ * 翻译文件检查
57
57
  */
58
58
  CHECK_LANGEXCEL: 8,
59
- /**
60
- * 文件转码
59
+ /**
60
+ * 文件转码
61
61
  */
62
- TRANS_ENCODE: 9
62
+ TRANS_ENCODE: 9,
63
+ /**
64
+ * 合并Excel文件
65
+ */
66
+ MERGE_EXCEL: 10
63
67
  };
64
68
 
65
- var COMMAD_TEXT = ["提取词条", "翻译文件", "翻译检查", "Excel转JSON", "JSON转Excel", "JSON合并", "原厂代码添加翻译", "提取词条及json文件生成一个excel表格", "翻译文件检查", "文件转码"];
69
+ var COMMAD_TEXT = ["提取词条", "翻译文件", "翻译检查", "Excel转JSON", "JSON转Excel", "JSON合并", "原厂代码添加翻译", "提取词条及json文件生成一个excel表格", "翻译文件检查", "文件转码", "合并Excel文件"];
66
70
 
67
71
  var valid = {
68
72
  // 空或者存在的地址
@@ -105,6 +109,23 @@ var valid = {
105
109
  return "请输入有效的文件地址";
106
110
  }
107
111
  return true;
112
+ },
113
+
114
+ // 存在的文件或文件夹
115
+ fileOrFolder: function fileOrFolder(val) {
116
+ val = val || "";
117
+ val = val.replace(/(^\s*)|(\s*$)/g, "");
118
+ if (val === "") {
119
+ return "必填";
120
+ }
121
+
122
+ if (!_path2.default.isAbsolute(val)) {
123
+ val = _path2.default.resolve(process.cwd(), val);
124
+ }
125
+ if (!_fs2.default.existsSync(val)) {
126
+ return "请输入有效的文件或目录地址";
127
+ }
128
+ return true;
108
129
  }
109
130
  };
110
131
 
@@ -256,13 +277,13 @@ var baseQuestions = [{
256
277
  }], [{
257
278
  type: "input",
258
279
  name: "mainJsonPath",
259
- message: "主json文件地址:",
260
- validate: valid.existFile
280
+ message: "主json文件地址或目录:",
281
+ validate: valid.fileOrFolder
261
282
  }, {
262
283
  type: "input",
263
284
  name: "mergeJsonPath",
264
- message: "次json文件地址:",
265
- validate: valid.existFile
285
+ message: "次json文件地址或目录:",
286
+ validate: valid.fileOrFolder
266
287
  }, {
267
288
  type: "input",
268
289
  name: "outMergeJsonPath",
@@ -370,10 +391,47 @@ var baseQuestions = [{
370
391
  name: "transEncode",
371
392
  message: "转码后文件的编码方式(默认UTF-8)",
372
393
  default: "utf-8"
394
+ }], [{
395
+ type: "input",
396
+ name: "excelPath1",
397
+ message: "第一个Excel文件地址:",
398
+ validate: valid.existFile
399
+ }, {
400
+ type: "input",
401
+ name: "sheetName1",
402
+ message: "第一个Excel中对应的sheet:",
403
+ default: ""
404
+ }, {
405
+ type: "input",
406
+ name: "excelPath2",
407
+ message: "第二个Excel文件地址:",
408
+ validate: valid.existFile
409
+ }, {
410
+ type: "input",
411
+ name: "sheetName2",
412
+ message: "第二个Excel中对应的sheet:",
413
+ default: ""
414
+ }, {
415
+ type: "input",
416
+ name: "keyName",
417
+ message: "key对应列:",
418
+ default: "EN"
419
+ }, {
420
+ type: "input",
421
+ name: "valueName",
422
+ message: "value对应列(ALL代表所有语种列):",
423
+ default: "ALL"
424
+ }, {
425
+ type: "input",
426
+ name: "outPath",
427
+ message: "输出json文件目录:",
428
+ default: function _default(answers) {
429
+ return (0, _index.getDirname)(answers.excelPath1);
430
+ }
373
431
  }]];
374
432
 
375
- /**
376
- * 忽略文件正则
433
+ /**
434
+ * 忽略文件正则
377
435
  */
378
436
  var EXCLUDE_FILE = "**/{img,images,lang,b28,goform,node_modules,cgi-bin,css}/**";
379
437
  var EXCLUDE_FILE_END = "**/{img,lang,b28,goform,cgi-bin,*.min.js,*shiv.js,*respond.js,*shim.js,.gitignore,.pidTmp,*.css,*.jpg,*.png,*.gif,*.bat,*.cgi}";
@@ -382,12 +440,12 @@ var EXTNAME_VUE = "**/*.vue";
382
440
  var EXTNAME_OTHER = "**/{*.jsx,*.ts}";
383
441
  var EXTNAME_HTML = "**/{*.aspx,*.asp,*.ejs,*.html,*.htm}";
384
442
  var TRANS_EXCLUDE = "**/{*.min.js,*shiv.js,*respond.js,*shim.js,.gitignore,.pidTmp,*.css,*.jpg,*.jpeg,*.png,*.gif,*.bat,*.cgi}";
385
- /**
386
- * 不进行匹配词条的正则
443
+ /**
444
+ * 不进行匹配词条的正则
387
445
  */
388
446
  var IGNORE_REGEXP = [/^[a-z]*[0-9]+[a-z]*$/i, /^[a-z]$/i, /^(mac|ip|TPC|QVLAN|VLAN|SSID|PPPoE|WPA|WPA2|WPA2-PSK|WPA-PSK|WEP|TKIP|AES|TKIP&AES|N\/A|mBPS|KB\/s|ping|UPnP|ASCII|hex|APSD|)$/i, /<%([\s\S]*)%>/i, /\(\[([\s\S]*)\]\)/i, /^(&nbsp;)+$/i, /[a-z0-9]*&[a-z]*=/i, /^(\s*<\s*\/([a-z0-9]+)?>\s*)*$/i, /^((ht|f)tps?):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?/i];
389
- /**
390
- * 不进行匹配词条的规则函数
447
+ /**
448
+ * 不进行匹配词条的规则函数
391
449
  */
392
450
  var IGNORE_WORDS = ["none", "visible", "display", "block"];
393
451
  var IGNORE_FUNCTIONS = [