must-cli 1.9.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/LICENSE +22 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +192 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +16 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +142 -0
- package/dist/config/index.js.map +1 -0
- package/dist/extractors/base.d.ts +59 -0
- package/dist/extractors/base.d.ts.map +1 -0
- package/dist/extractors/base.js +204 -0
- package/dist/extractors/base.js.map +1 -0
- package/dist/extractors/html.d.ts +8 -0
- package/dist/extractors/html.d.ts.map +1 -0
- package/dist/extractors/html.js +70 -0
- package/dist/extractors/html.js.map +1 -0
- package/dist/extractors/index.d.ts +33 -0
- package/dist/extractors/index.d.ts.map +1 -0
- package/dist/extractors/index.js +86 -0
- package/dist/extractors/index.js.map +1 -0
- package/dist/extractors/javascript.d.ts +17 -0
- package/dist/extractors/javascript.d.ts.map +1 -0
- package/dist/extractors/javascript.js +249 -0
- package/dist/extractors/javascript.js.map +1 -0
- package/dist/extractors/vue.d.ts +9 -0
- package/dist/extractors/vue.d.ts.map +1 -0
- package/dist/extractors/vue.js +99 -0
- package/dist/extractors/vue.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +414 -0
- package/dist/index.js.map +1 -0
- package/dist/transformer/index.d.ts +102 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +844 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/translators/azure.d.ts +7 -0
- package/dist/translators/azure.d.ts.map +1 -0
- package/dist/translators/azure.js +43 -0
- package/dist/translators/azure.js.map +1 -0
- package/dist/translators/baidu.d.ts +8 -0
- package/dist/translators/baidu.d.ts.map +1 -0
- package/dist/translators/baidu.js +67 -0
- package/dist/translators/baidu.js.map +1 -0
- package/dist/translators/base.d.ts +15 -0
- package/dist/translators/base.d.ts.map +1 -0
- package/dist/translators/base.js +50 -0
- package/dist/translators/base.js.map +1 -0
- package/dist/translators/custom.d.ts +19 -0
- package/dist/translators/custom.d.ts.map +1 -0
- package/dist/translators/custom.js +82 -0
- package/dist/translators/custom.js.map +1 -0
- package/dist/translators/google.d.ts +6 -0
- package/dist/translators/google.d.ts.map +1 -0
- package/dist/translators/google.js +25 -0
- package/dist/translators/google.js.map +1 -0
- package/dist/translators/index.d.ts +16 -0
- package/dist/translators/index.d.ts.map +1 -0
- package/dist/translators/index.js +57 -0
- package/dist/translators/index.js.map +1 -0
- package/dist/types/index.d.ts +385 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/file.d.ts +5 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +41 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/interpolation.d.ts +68 -0
- package/dist/utils/interpolation.d.ts.map +1 -0
- package/dist/utils/interpolation.js +174 -0
- package/dist/utils/interpolation.js.map +1 -0
- package/dist/utils/text.d.ts +42 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +234 -0
- package/dist/utils/text.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseExtractor = void 0;
|
|
4
|
+
const interpolation_1 = require("../utils/interpolation");
|
|
5
|
+
class BaseExtractor {
|
|
6
|
+
constructor(config = {}) {
|
|
7
|
+
this.warnings = [];
|
|
8
|
+
this.options = {
|
|
9
|
+
includeComments: false,
|
|
10
|
+
includeTemplateLiterals: true,
|
|
11
|
+
includeJSX: true,
|
|
12
|
+
includeVue: true,
|
|
13
|
+
includeHTML: true,
|
|
14
|
+
...config.options
|
|
15
|
+
};
|
|
16
|
+
this.sourceLanguage = config.sourceLanguage || 'zh-CN';
|
|
17
|
+
this.interpolation = (0, interpolation_1.createInterpolationHandler)(config.interpolation);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 清空警告列表
|
|
21
|
+
*/
|
|
22
|
+
clearWarnings() {
|
|
23
|
+
this.warnings = [];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 获取所有警告
|
|
27
|
+
*/
|
|
28
|
+
getWarnings() {
|
|
29
|
+
return [...this.warnings];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 添加警告
|
|
33
|
+
*/
|
|
34
|
+
addWarning(type, severity, message, file, line, column, code, suggestion) {
|
|
35
|
+
this.warnings.push({
|
|
36
|
+
type,
|
|
37
|
+
severity,
|
|
38
|
+
message,
|
|
39
|
+
file,
|
|
40
|
+
line,
|
|
41
|
+
column,
|
|
42
|
+
code,
|
|
43
|
+
suggestion
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 分析表达式复杂度并返回警告信息(如果需要)
|
|
48
|
+
*/
|
|
49
|
+
analyzeExpressionComplexity(expression, file, line, column) {
|
|
50
|
+
// 简单标识符
|
|
51
|
+
if (expression.type === 'Identifier') {
|
|
52
|
+
return { isComplex: false, name: expression.name };
|
|
53
|
+
}
|
|
54
|
+
// 简单成员表达式: user.name
|
|
55
|
+
if (expression.type === 'MemberExpression') {
|
|
56
|
+
if (!expression.computed) {
|
|
57
|
+
const objectName = this.extractExpressionName(expression.object);
|
|
58
|
+
const propertyName = expression.property.type === 'Identifier'
|
|
59
|
+
? expression.property.name
|
|
60
|
+
: undefined;
|
|
61
|
+
if (objectName && propertyName) {
|
|
62
|
+
return { isComplex: false, name: `${objectName}_${propertyName}` };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// 动态成员访问: obj[key]
|
|
66
|
+
this.addWarning('complex-expression', 'warning', '动态成员访问表达式,无法静态提取变量名', file, line, column, this.getExpressionCode(expression), '建议将表达式结果先赋值给变量,再在模板中使用');
|
|
67
|
+
return { isComplex: true };
|
|
68
|
+
}
|
|
69
|
+
// 嵌套模板字符串
|
|
70
|
+
if (expression.type === 'TemplateLiteral') {
|
|
71
|
+
this.addWarning('nested-template', 'warning', '嵌套的模板字符串,难以提取和翻译', file, line, column, this.getExpressionCode(expression), '建议将嵌套的模板字符串拆分为独立的翻译单元');
|
|
72
|
+
return { isComplex: true };
|
|
73
|
+
}
|
|
74
|
+
// 条件表达式: a ? b : c
|
|
75
|
+
if (expression.type === 'ConditionalExpression') {
|
|
76
|
+
this.addWarning('conditional-expression', 'warning', '条件表达式,翻译结果可能不一致', file, line, column, this.getExpressionCode(expression), '建议将条件表达式移到模板外部,或拆分为多个独立的翻译');
|
|
77
|
+
return { isComplex: true };
|
|
78
|
+
}
|
|
79
|
+
// 函数调用
|
|
80
|
+
if (expression.type === 'CallExpression') {
|
|
81
|
+
// 检查是否是简单的格式化函数
|
|
82
|
+
const calleeName = expression.callee.type === 'Identifier'
|
|
83
|
+
? expression.callee.name
|
|
84
|
+
: undefined;
|
|
85
|
+
// 允许一些常见的格式化函数
|
|
86
|
+
const allowedFunctions = ['String', 'Number', 'toString', 'toFixed', 'toLocaleString'];
|
|
87
|
+
if (calleeName && allowedFunctions.includes(calleeName)) {
|
|
88
|
+
return { isComplex: false, name: `formatted` };
|
|
89
|
+
}
|
|
90
|
+
this.addWarning('function-call', 'info', '函数调用表达式,无法静态分析返回值', file, line, column, this.getExpressionCode(expression), '建议将函数调用结果先赋值给变量,再在模板中使用');
|
|
91
|
+
return { isComplex: true };
|
|
92
|
+
}
|
|
93
|
+
// 二元表达式: a + b, a - b
|
|
94
|
+
if (expression.type === 'BinaryExpression') {
|
|
95
|
+
this.addWarning('binary-expression', 'info', '二元表达式,无法静态分析计算结果', file, line, column, this.getExpressionCode(expression), '建议将计算结果先赋值给变量,再在模板中使用');
|
|
96
|
+
return { isComplex: true };
|
|
97
|
+
}
|
|
98
|
+
// 其他复杂表达式
|
|
99
|
+
this.addWarning('complex-expression', 'info', `复杂表达式类型: ${expression.type}`, file, line, column, this.getExpressionCode(expression), '建议简化表达式或将结果先赋值给变量');
|
|
100
|
+
return { isComplex: true };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取表达式的代码片段(简化版)
|
|
104
|
+
*/
|
|
105
|
+
getExpressionCode(expression) {
|
|
106
|
+
try {
|
|
107
|
+
// 尝试从位置信息构建代码预览
|
|
108
|
+
if (expression.start !== undefined && expression.end !== undefined) {
|
|
109
|
+
return `[${expression.type}]`;
|
|
110
|
+
}
|
|
111
|
+
return `[${expression.type}]`;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return '[unknown]';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 生成占位符
|
|
119
|
+
* @param index 占位符索引
|
|
120
|
+
* @param name 变量名(用于命名参数模式)
|
|
121
|
+
*/
|
|
122
|
+
formatPlaceholder(index, name) {
|
|
123
|
+
return this.interpolation.formatPlaceholder(index, name);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 是否使用命名参数
|
|
127
|
+
*/
|
|
128
|
+
get useNamedParams() {
|
|
129
|
+
return this.interpolation.useNamedParams;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 从表达式节点提取变量名
|
|
133
|
+
*/
|
|
134
|
+
extractExpressionName(expression) {
|
|
135
|
+
// 简单标识符: username
|
|
136
|
+
if (expression.type === 'Identifier') {
|
|
137
|
+
return expression.name;
|
|
138
|
+
}
|
|
139
|
+
// 成员表达式: user.name -> 'user_name'
|
|
140
|
+
if (expression.type === 'MemberExpression') {
|
|
141
|
+
const object = this.extractExpressionName(expression.object);
|
|
142
|
+
const property = expression.property.type === 'Identifier'
|
|
143
|
+
? expression.property.name
|
|
144
|
+
: undefined;
|
|
145
|
+
if (object && property) {
|
|
146
|
+
return `${object}_${property}`;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
createExtractedText(text, file, line, column, type, context) {
|
|
152
|
+
return {
|
|
153
|
+
text: text.trim(),
|
|
154
|
+
file,
|
|
155
|
+
line,
|
|
156
|
+
column,
|
|
157
|
+
context,
|
|
158
|
+
type
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
isValidText(text) {
|
|
162
|
+
// 去除模板占位符后检查文本
|
|
163
|
+
const placeholderRegex = this.interpolation.getPlaceholderRegex();
|
|
164
|
+
const textWithoutPlaceholders = text.replace(placeholderRegex, '');
|
|
165
|
+
// Filter out very short texts, numbers, and special characters
|
|
166
|
+
if (textWithoutPlaceholders.trim().length < 2)
|
|
167
|
+
return false;
|
|
168
|
+
if (/^[0-9\s\-_\.]+$/.test(textWithoutPlaceholders))
|
|
169
|
+
return false;
|
|
170
|
+
if (/^[a-zA-Z]{1,2}$/.test(textWithoutPlaceholders.trim()))
|
|
171
|
+
return false;
|
|
172
|
+
// Filter out URLs and paths
|
|
173
|
+
if (/^(https?:\/\/|\/|\.\/|\.\.\/|~\/)/.test(text))
|
|
174
|
+
return false;
|
|
175
|
+
if (/^[@\.][\w\-\/]+/.test(text))
|
|
176
|
+
return false; // npm packages, relative paths
|
|
177
|
+
// Filter out file extensions
|
|
178
|
+
if (/^\.[a-z]{2,4}$/i.test(text))
|
|
179
|
+
return false;
|
|
180
|
+
// Filter out hex colors
|
|
181
|
+
if (/^#[0-9a-f]{3,8}$/i.test(text))
|
|
182
|
+
return false;
|
|
183
|
+
// 根据源语言决定提取策略
|
|
184
|
+
// 目前只支持中文作为源语言,只提取包含中文的文本
|
|
185
|
+
// 未来可以扩展支持英文等其他语言
|
|
186
|
+
if (this.sourceLanguage.startsWith('zh')) {
|
|
187
|
+
// 中文源语言:必须包含中文字符
|
|
188
|
+
return /[\u4e00-\u9fa5]/.test(textWithoutPlaceholders);
|
|
189
|
+
}
|
|
190
|
+
// 日文源语言:必须包含日文字符(平假名、片假名、汉字)
|
|
191
|
+
if (this.sourceLanguage.startsWith('ja')) {
|
|
192
|
+
return /[\u3040-\u309f\u30a0-\u30ff\u4e00-\u9fa5]/.test(textWithoutPlaceholders);
|
|
193
|
+
}
|
|
194
|
+
// 韩文源语言:必须包含韩文字符
|
|
195
|
+
if (this.sourceLanguage.startsWith('ko')) {
|
|
196
|
+
return /[\uac00-\ud7af\u1100-\u11ff]/.test(textWithoutPlaceholders);
|
|
197
|
+
}
|
|
198
|
+
// 其他语言(如英文):暂不支持,返回 false
|
|
199
|
+
// 英文文案和代码本身都是英文,不好区分,未来再扩展
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.BaseExtractor = BaseExtractor;
|
|
204
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/extractors/base.ts"],"names":[],"mappings":";;;AACA,0DAA0F;AAa1F,MAAsB,aAAa;IAMjC,YAAY,SAA0B,EAAE;QAF9B,aAAQ,GAAwB,EAAE,CAAC;QAG3C,IAAI,CAAC,OAAO,GAAG;YACb,eAAe,EAAE,KAAK;YACtB,uBAAuB,EAAE,IAAI;YAC7B,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;YACjB,GAAG,MAAM,CAAC,OAAO;SAClB,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,OAAO,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,IAAA,0CAA0B,EAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACO,aAAa;QACrB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,WAAW;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACO,UAAU,CAClB,IAA+B,EAC/B,QAAmC,EACnC,OAAe,EACf,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,IAAa,EACb,UAAmB;QAEnB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI;YACJ,QAAQ;YACR,OAAO;YACP,IAAI;YACJ,IAAI;YACJ,MAAM;YACN,IAAI;YACJ,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACO,2BAA2B,CACnC,UAAe,EACf,IAAY,EACZ,IAAY,EACZ,MAAc;QAEd,QAAQ;QACR,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACrC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;QAED,qBAAqB;QACrB,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACzB,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBACjE,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;oBAC5D,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI;oBAC1B,CAAC,CAAC,SAAS,CAAC;gBACd,IAAI,UAAU,IAAI,YAAY,EAAE,CAAC;oBAC/B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,IAAI,YAAY,EAAE,EAAE,CAAC;gBACrE,CAAC;YACH,CAAC;YACD,mBAAmB;YACnB,IAAI,CAAC,UAAU,CACb,oBAAoB,EACpB,SAAS,EACT,qBAAqB,EACrB,IAAI,EAAE,IAAI,EAAE,MAAM,EAClB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAClC,wBAAwB,CACzB,CAAC;YACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,UAAU;QACV,IAAI,UAAU,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,CACb,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,IAAI,EAAE,IAAI,EAAE,MAAM,EAClB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAClC,uBAAuB,CACxB,CAAC;YACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,mBAAmB;QACnB,IAAI,UAAU,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YAChD,IAAI,CAAC,UAAU,CACb,wBAAwB,EACxB,SAAS,EACT,iBAAiB,EACjB,IAAI,EAAE,IAAI,EAAE,MAAM,EAClB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAClC,4BAA4B,CAC7B,CAAC;YACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO;QACP,IAAI,UAAU,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACzC,gBAAgB;YAChB,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;gBACxD,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI;gBACxB,CAAC,CAAC,SAAS,CAAC;YAEd,eAAe;YACf,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACvF,IAAI,UAAU,IAAI,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACjD,CAAC;YAED,IAAI,CAAC,UAAU,CACb,eAAe,EACf,MAAM,EACN,mBAAmB,EACnB,IAAI,EAAE,IAAI,EAAE,MAAM,EAClB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAClC,yBAAyB,CAC1B,CAAC;YACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,sBAAsB;QACtB,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,CACb,mBAAmB,EACnB,MAAM,EACN,kBAAkB,EAClB,IAAI,EAAE,IAAI,EAAE,MAAM,EAClB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAClC,uBAAuB,CACxB,CAAC;YACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,UAAU;QACV,IAAI,CAAC,UAAU,CACb,oBAAoB,EACpB,MAAM,EACN,YAAY,UAAU,CAAC,IAAI,EAAE,EAC7B,IAAI,EAAE,IAAI,EAAE,MAAM,EAClB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAClC,mBAAmB,CACpB,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,UAAe;QACvC,IAAI,CAAC;YACH,gBAAgB;YAChB,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBACnE,OAAO,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC;YAChC,CAAC;YACD,OAAO,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACO,iBAAiB,CAAC,KAAa,EAAE,IAAa;QACtD,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,IAAc,cAAc;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;IAC3C,CAAC;IAED;;OAEG;IACO,qBAAqB,CAAC,UAAe;QAC7C,kBAAkB;QAClB,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,IAAI,CAAC;QACzB,CAAC;QACD,kCAAkC;QAClC,IAAI,UAAU,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;gBACxD,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI;gBAC1B,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;gBACvB,OAAO,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAIS,mBAAmB,CAC3B,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,MAAc,EACd,IAA2B,EAC3B,OAAgB;QAEhB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,IAAI;YACJ,IAAI;YACJ,MAAM;YACN,OAAO;YACP,IAAI;SACL,CAAC;IACJ,CAAC;IAES,WAAW,CAAC,IAAY;QAChC,eAAe;QACf,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;QAClE,MAAM,uBAAuB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAEnE,+DAA+D;QAC/D,IAAI,uBAAuB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5D,IAAI,iBAAiB,CAAC,IAAI,CAAC,uBAAuB,CAAC;YAAE,OAAO,KAAK,CAAC;QAClE,IAAI,iBAAiB,CAAC,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QAEzE,4BAA4B;QAC5B,IAAI,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,+BAA+B;QAE/E,6BAA6B;QAC7B,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAE/C,wBAAwB;QACxB,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjD,cAAc;QACd,0BAA0B;QAC1B,kBAAkB;QAClB,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,iBAAiB;YACjB,OAAO,iBAAiB,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACzD,CAAC;QAED,6BAA6B;QAC7B,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,2CAA2C,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACnF,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,8BAA8B,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtE,CAAC;QAED,0BAA0B;QAC1B,2BAA2B;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA5RD,sCA4RC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseExtractor, ExtractorConfig } from './base';
|
|
2
|
+
import { ExtractedText } from '../types';
|
|
3
|
+
export declare class HTMLExtractor extends BaseExtractor {
|
|
4
|
+
constructor(config?: ExtractorConfig);
|
|
5
|
+
extract(filePath: string): Promise<ExtractedText[]>;
|
|
6
|
+
private getLineNumber;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/extractors/html.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,qBAAa,aAAc,SAAQ,aAAa;gBAClC,MAAM,GAAE,eAAoB;IAGlC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA6EzD,OAAO,CAAC,aAAa;CAStB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HTMLExtractor = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const jsdom_1 = require("jsdom");
|
|
6
|
+
const base_1 = require("./base");
|
|
7
|
+
class HTMLExtractor extends base_1.BaseExtractor {
|
|
8
|
+
constructor(config = {}) {
|
|
9
|
+
super(config);
|
|
10
|
+
}
|
|
11
|
+
async extract(filePath) {
|
|
12
|
+
const extractedTexts = [];
|
|
13
|
+
try {
|
|
14
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
15
|
+
const dom = new jsdom_1.JSDOM(content);
|
|
16
|
+
const document = dom.window.document;
|
|
17
|
+
// Extract text content from all elements
|
|
18
|
+
const walker = document.createTreeWalker(document.body || document.documentElement, dom.window.NodeFilter.SHOW_TEXT, {
|
|
19
|
+
acceptNode: (node) => {
|
|
20
|
+
// Skip script and style tags
|
|
21
|
+
const parent = node.parentElement;
|
|
22
|
+
if (parent && (parent.tagName === 'SCRIPT' || parent.tagName === 'STYLE')) {
|
|
23
|
+
return dom.window.NodeFilter.FILTER_REJECT;
|
|
24
|
+
}
|
|
25
|
+
const text = node.textContent?.trim();
|
|
26
|
+
if (text && this.isValidText(text)) {
|
|
27
|
+
return dom.window.NodeFilter.FILTER_ACCEPT;
|
|
28
|
+
}
|
|
29
|
+
return dom.window.NodeFilter.FILTER_REJECT;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
let node;
|
|
33
|
+
while ((node = walker.nextNode())) {
|
|
34
|
+
const text = node.textContent?.trim();
|
|
35
|
+
if (text && this.isValidText(text)) {
|
|
36
|
+
// Try to get line number from source
|
|
37
|
+
const lineNumber = this.getLineNumber(content, text);
|
|
38
|
+
extractedTexts.push(this.createExtractedText(text, filePath, lineNumber, 0, 'html'));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Extract text from attributes like title, alt, placeholder
|
|
42
|
+
const elementsWithTextAttrs = document.querySelectorAll('[title], [alt], [placeholder], [aria-label]');
|
|
43
|
+
elementsWithTextAttrs.forEach((element) => {
|
|
44
|
+
const attrs = ['title', 'alt', 'placeholder', 'aria-label'];
|
|
45
|
+
attrs.forEach(attr => {
|
|
46
|
+
const value = element.getAttribute(attr);
|
|
47
|
+
if (value && this.isValidText(value)) {
|
|
48
|
+
const lineNumber = this.getLineNumber(content, value);
|
|
49
|
+
extractedTexts.push(this.createExtractedText(value, filePath, lineNumber, 0, 'html'));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.warn(`Failed to parse HTML file ${filePath}:`, error);
|
|
56
|
+
}
|
|
57
|
+
return extractedTexts;
|
|
58
|
+
}
|
|
59
|
+
getLineNumber(content, text) {
|
|
60
|
+
const lines = content.split('\n');
|
|
61
|
+
for (let i = 0; i < lines.length; i++) {
|
|
62
|
+
if (lines[i].includes(text)) {
|
|
63
|
+
return i + 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.HTMLExtractor = HTMLExtractor;
|
|
70
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/extractors/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BaseExtractor, ExtractorConfig } from './base';
|
|
2
|
+
import { JavaScriptExtractor } from './javascript';
|
|
3
|
+
import { VueExtractor } from './vue';
|
|
4
|
+
import { HTMLExtractor } from './html';
|
|
5
|
+
import { ExtractedText, ExtractorOptions, InterpolationConfig, ExtractionWarning } from '../types';
|
|
6
|
+
export interface TextExtractorConfig {
|
|
7
|
+
options?: ExtractorOptions;
|
|
8
|
+
sourceLanguage?: string;
|
|
9
|
+
interpolation?: InterpolationConfig;
|
|
10
|
+
}
|
|
11
|
+
export interface TextExtractResult {
|
|
12
|
+
texts: ExtractedText[];
|
|
13
|
+
warnings: ExtractionWarning[];
|
|
14
|
+
}
|
|
15
|
+
export declare class TextExtractor {
|
|
16
|
+
private extractors;
|
|
17
|
+
private allWarnings;
|
|
18
|
+
constructor(config?: TextExtractorConfig);
|
|
19
|
+
/**
|
|
20
|
+
* 清空所有警告
|
|
21
|
+
*/
|
|
22
|
+
clearWarnings(): void;
|
|
23
|
+
/**
|
|
24
|
+
* 获取所有警告
|
|
25
|
+
*/
|
|
26
|
+
getWarnings(): ExtractionWarning[];
|
|
27
|
+
extractFromFile(filePath: string): Promise<ExtractedText[]>;
|
|
28
|
+
extractFromFileWithWarnings(filePath: string): Promise<TextExtractResult>;
|
|
29
|
+
private getFileExtension;
|
|
30
|
+
}
|
|
31
|
+
export { BaseExtractor, JavaScriptExtractor, VueExtractor, HTMLExtractor };
|
|
32
|
+
export type { ExtractedText, ExtractorOptions, ExtractorConfig };
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAiB,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEnG,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,WAAW,CAA2B;gBAElC,MAAM,GAAE,mBAAwB;IAe5C;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,WAAW,IAAI,iBAAiB,EAAE;IAI5B,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK3D,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6B/E,OAAO,CAAC,gBAAgB;CAazB;AAED,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AAC3E,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HTMLExtractor = exports.VueExtractor = exports.JavaScriptExtractor = exports.BaseExtractor = exports.TextExtractor = void 0;
|
|
4
|
+
const base_1 = require("./base");
|
|
5
|
+
Object.defineProperty(exports, "BaseExtractor", { enumerable: true, get: function () { return base_1.BaseExtractor; } });
|
|
6
|
+
const javascript_1 = require("./javascript");
|
|
7
|
+
Object.defineProperty(exports, "JavaScriptExtractor", { enumerable: true, get: function () { return javascript_1.JavaScriptExtractor; } });
|
|
8
|
+
const vue_1 = require("./vue");
|
|
9
|
+
Object.defineProperty(exports, "VueExtractor", { enumerable: true, get: function () { return vue_1.VueExtractor; } });
|
|
10
|
+
const html_1 = require("./html");
|
|
11
|
+
Object.defineProperty(exports, "HTMLExtractor", { enumerable: true, get: function () { return html_1.HTMLExtractor; } });
|
|
12
|
+
class TextExtractor {
|
|
13
|
+
constructor(config = {}) {
|
|
14
|
+
this.extractors = new Map();
|
|
15
|
+
this.allWarnings = [];
|
|
16
|
+
const extractorConfig = {
|
|
17
|
+
options: config.options,
|
|
18
|
+
sourceLanguage: config.sourceLanguage,
|
|
19
|
+
interpolation: config.interpolation
|
|
20
|
+
};
|
|
21
|
+
this.extractors.set('js', new javascript_1.JavaScriptExtractor(extractorConfig));
|
|
22
|
+
this.extractors.set('jsx', new javascript_1.JavaScriptExtractor(extractorConfig));
|
|
23
|
+
this.extractors.set('ts', new javascript_1.JavaScriptExtractor(extractorConfig));
|
|
24
|
+
this.extractors.set('tsx', new javascript_1.JavaScriptExtractor(extractorConfig));
|
|
25
|
+
this.extractors.set('vue', new vue_1.VueExtractor(extractorConfig));
|
|
26
|
+
this.extractors.set('html', new html_1.HTMLExtractor(extractorConfig));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 清空所有警告
|
|
30
|
+
*/
|
|
31
|
+
clearWarnings() {
|
|
32
|
+
this.allWarnings = [];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 获取所有警告
|
|
36
|
+
*/
|
|
37
|
+
getWarnings() {
|
|
38
|
+
return [...this.allWarnings];
|
|
39
|
+
}
|
|
40
|
+
async extractFromFile(filePath) {
|
|
41
|
+
const result = await this.extractFromFileWithWarnings(filePath);
|
|
42
|
+
return result.texts;
|
|
43
|
+
}
|
|
44
|
+
async extractFromFileWithWarnings(filePath) {
|
|
45
|
+
const extension = this.getFileExtension(filePath);
|
|
46
|
+
const extractor = this.extractors.get(extension);
|
|
47
|
+
if (!extractor) {
|
|
48
|
+
console.warn(`No extractor found for file type: ${extension}`);
|
|
49
|
+
return { texts: [], warnings: [] };
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
// 检查提取器是否支持带警告的提取
|
|
53
|
+
const jsExtractor = extractor;
|
|
54
|
+
if (typeof jsExtractor.extractWithWarnings === 'function') {
|
|
55
|
+
const result = await jsExtractor.extractWithWarnings(filePath);
|
|
56
|
+
this.allWarnings.push(...result.warnings);
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
// 回退到普通提取
|
|
60
|
+
const texts = await extractor.extract(filePath);
|
|
61
|
+
const warnings = extractor.getWarnings();
|
|
62
|
+
this.allWarnings.push(...warnings);
|
|
63
|
+
return { texts, warnings };
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error(`Error extracting from ${filePath}:`, error);
|
|
67
|
+
return { texts: [], warnings: [] };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
getFileExtension(filePath) {
|
|
71
|
+
const parts = filePath.split('.');
|
|
72
|
+
if (parts.length < 2)
|
|
73
|
+
return '';
|
|
74
|
+
const extension = parts[parts.length - 1].toLowerCase();
|
|
75
|
+
// Handle special cases
|
|
76
|
+
if (extension === 'jsx')
|
|
77
|
+
return 'jsx';
|
|
78
|
+
if (extension === 'tsx')
|
|
79
|
+
return 'tsx';
|
|
80
|
+
if (extension === 'ts')
|
|
81
|
+
return 'ts';
|
|
82
|
+
return extension;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.TextExtractor = TextExtractor;
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extractors/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseExtractor, ExtractorConfig, ExtractResult } from './base';
|
|
2
|
+
import { ExtractedText } from '../types';
|
|
3
|
+
export declare class JavaScriptExtractor extends BaseExtractor {
|
|
4
|
+
constructor(config?: ExtractorConfig);
|
|
5
|
+
extract(filePath: string): Promise<ExtractedText[]>;
|
|
6
|
+
extractWithWarnings(filePath: string): Promise<ExtractResult>;
|
|
7
|
+
/**
|
|
8
|
+
* 获取 AST 节点对应的源代码
|
|
9
|
+
*/
|
|
10
|
+
private getNodeCode;
|
|
11
|
+
/**
|
|
12
|
+
* 合并 JSX 子元素为一个带插值的字符串
|
|
13
|
+
* 例如: "当前等级:" + {level} + " 级" => "当前等级:{{0}} 级"
|
|
14
|
+
*/
|
|
15
|
+
private mergeJSXChildren;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=javascript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../src/extractors/javascript.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,qBAAa,mBAAoB,SAAQ,aAAa;gBACxC,MAAM,GAAE,eAAoB;IAIlC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAKnD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA0NnE;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAkCzB"}
|