hybridtm 0.3.0 → 0.5.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/dist/{ts/tmxHandler.d.ts → tmxHandler.d.ts} +1 -0
- package/dist/{ts/tmxHandler.js → tmxHandler.js} +10 -0
- package/dist/{tmxhandler.js.map → tmxHandler.js.map} +1 -1
- package/dist/{ts/xliffHandler.d.ts → xliffHandler.d.ts} +1 -0
- package/dist/{ts/xliffHandler.js → xliffHandler.js} +10 -0
- package/dist/{xliffhandler.js.map → xliffHandler.js.map} +1 -1
- package/package.json +14 -9
- package/dist/batchimporter.d.ts +0 -22
- package/dist/batchimporter.js +0 -203
- package/dist/constants.d.ts +0 -15
- package/dist/constants.js +0 -16
- package/dist/constants.js.map +0 -1
- package/dist/debug-progress.d.ts +0 -12
- package/dist/debug-progress.js +0 -49
- package/dist/debug-progress.js.map +0 -1
- package/dist/ngramIndex.d.ts +0 -31
- package/dist/ngramIndex.js +0 -132
- package/dist/ngramIndex.js.map +0 -1
- package/dist/ngrams.d.ts +0 -21
- package/dist/ngrams.js +0 -73
- package/dist/ngrams.js.map +0 -1
- package/dist/package.json +0 -35
- package/dist/progressProvider.d.ts +0 -17
- package/dist/progressProvider.js +0 -14
- package/dist/progressProvider.js.map +0 -1
- package/dist/simplexlifftest.d.ts +0 -1
- package/dist/simplexlifftest.js +0 -23
- package/dist/simplexlifftest.js.map +0 -1
- package/dist/test-import.d.ts +0 -12
- package/dist/test-import.js +0 -101
- package/dist/test-import.js.map +0 -1
- package/dist/test-progress-fix.d.ts +0 -1
- package/dist/test-progress-fix.js +0 -32
- package/dist/test-progress-fix.js.map +0 -1
- package/dist/test-progress.d.ts +0 -12
- package/dist/test-progress.js +0 -32
- package/dist/test-progress.js.map +0 -1
- package/dist/tests/vectorSimilarityComparison.d.ts +0 -12
- package/dist/tests/vectorSimilarityComparison.js +0 -153
- package/dist/tests/vectorSimilarityComparison.js.map +0 -1
- package/dist/tmxhandler.d.ts +0 -61
- package/dist/tmxhandler.js +0 -347
- package/dist/tmxreader.d.ts +0 -25
- package/dist/tmxreader.js +0 -51
- package/dist/tmxtest.d.ts +0 -16
- package/dist/tmxtest.js +0 -316
- package/dist/tmxtest.js.map +0 -1
- package/dist/ts/batchImporter.js.map +0 -1
- package/dist/ts/hybridtm.d.ts +0 -67
- package/dist/ts/hybridtm.js +0 -932
- package/dist/ts/hybridtm.js.map +0 -1
- package/dist/ts/hybridtmFactory.d.ts +0 -43
- package/dist/ts/hybridtmFactory.js +0 -165
- package/dist/ts/hybridtmFactory.js.map +0 -1
- package/dist/ts/importOptions.d.ts +0 -21
- package/dist/ts/importOptions.js +0 -24
- package/dist/ts/importOptions.js.map +0 -1
- package/dist/ts/index.d.ts +0 -25
- package/dist/ts/index.js +0 -22
- package/dist/ts/index.js.map +0 -1
- package/dist/ts/langEntry.d.ts +0 -64
- package/dist/ts/langEntry.js +0 -13
- package/dist/ts/langEntry.js.map +0 -1
- package/dist/ts/match.d.ts +0 -22
- package/dist/ts/match.js +0 -38
- package/dist/ts/match.js.map +0 -1
- package/dist/ts/matchQuality.d.ts +0 -16
- package/dist/ts/matchQuality.js +0 -83
- package/dist/ts/matchQuality.js.map +0 -1
- package/dist/ts/pendingEntry.d.ts +0 -24
- package/dist/ts/pendingEntry.js +0 -13
- package/dist/ts/pendingEntry.js.map +0 -1
- package/dist/ts/searchFilters.d.ts +0 -24
- package/dist/ts/searchFilters.js +0 -13
- package/dist/ts/searchFilters.js.map +0 -1
- package/dist/ts/tmxHandler.js.map +0 -1
- package/dist/ts/tmxReader.js.map +0 -1
- package/dist/ts/tmxtest.d.ts +0 -16
- package/dist/ts/tmxtest.js +0 -316
- package/dist/ts/tmxtest.js.map +0 -1
- package/dist/ts/utils.d.ts +0 -17
- package/dist/ts/utils.js +0 -49
- package/dist/ts/utils.js.map +0 -1
- package/dist/ts/xliffHandler.js.map +0 -1
- package/dist/ts/xliffReader.js.map +0 -1
- package/dist/ts/xlifftest.d.ts +0 -54
- package/dist/ts/xlifftest.js +0 -245
- package/dist/ts/xlifftest.js.map +0 -1
- package/dist/vectorSimilarityTester.d.ts +0 -56
- package/dist/vectorSimilarityTester.js +0 -164
- package/dist/vectorSimilarityTester.js.map +0 -1
- package/dist/xliffhandler.d.ts +0 -67
- package/dist/xliffhandler.js +0 -522
- package/dist/xliffreader.d.ts +0 -25
- package/dist/xliffreader.js +0 -50
- package/dist/xlifftest.d.ts +0 -54
- package/dist/xlifftest.js +0 -245
- package/dist/xlifftest.js.map +0 -1
- /package/dist/{ts/batchImporter.d.ts → batchImporter.d.ts} +0 -0
- /package/dist/{ts/batchImporter.js → batchImporter.js} +0 -0
- /package/dist/{batchimporter.js.map → batchImporter.js.map} +0 -0
- /package/dist/{ts/tmxReader.d.ts → tmxReader.d.ts} +0 -0
- /package/dist/{ts/tmxReader.js → tmxReader.js} +0 -0
- /package/dist/{tmxreader.js.map → tmxReader.js.map} +0 -0
- /package/dist/{ts/xliffReader.d.ts → xliffReader.d.ts} +0 -0
- /package/dist/{ts/xliffReader.js → xliffReader.js} +0 -0
- /package/dist/{xliffreader.js.map → xliffReader.js.map} +0 -0
package/dist/xliffhandler.js
DELETED
|
@@ -1,522 +0,0 @@
|
|
|
1
|
-
/*******************************************************************************
|
|
2
|
-
* Copyright (c) 2025-2026 Maxprograms.
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials
|
|
5
|
-
* are made available under the terms of the Eclipse License 1.0
|
|
6
|
-
* which accompanies this distribution, and is available at
|
|
7
|
-
* https://www.eclipse.org/org/documents/epl-v10.html
|
|
8
|
-
*
|
|
9
|
-
* Contributors:
|
|
10
|
-
* Maxprograms - initial API and implementation
|
|
11
|
-
*******************************************************************************/
|
|
12
|
-
import { createWriteStream } from "node:fs";
|
|
13
|
-
import { CData, TextNode, XMLElement } from "typesxml";
|
|
14
|
-
import { DEFAULT_IMPORT_OPTIONS, resolveImportOptions } from './importOptions.js';
|
|
15
|
-
import { Utils } from './utils.js';
|
|
16
|
-
export class XLIFFHandler {
|
|
17
|
-
inCdData = false;
|
|
18
|
-
currentCData = new CData('');
|
|
19
|
-
stack = [];
|
|
20
|
-
srcLang = '';
|
|
21
|
-
tgtLang = '';
|
|
22
|
-
original = '';
|
|
23
|
-
fileId = '';
|
|
24
|
-
writeStream;
|
|
25
|
-
completionPromise;
|
|
26
|
-
entryCount = 0;
|
|
27
|
-
options;
|
|
28
|
-
constructor(tempFilePath, options = DEFAULT_IMPORT_OPTIONS) {
|
|
29
|
-
this.writeStream = createWriteStream(tempFilePath, { encoding: 'utf8' });
|
|
30
|
-
this.completionPromise = new Promise((resolve, reject) => {
|
|
31
|
-
this.writeStream.once('finish', resolve);
|
|
32
|
-
this.writeStream.once('error', reject);
|
|
33
|
-
});
|
|
34
|
-
this.options = resolveImportOptions(options);
|
|
35
|
-
}
|
|
36
|
-
setGrammar(grammar) {
|
|
37
|
-
// do nothing
|
|
38
|
-
}
|
|
39
|
-
getEntryCount() {
|
|
40
|
-
return this.entryCount;
|
|
41
|
-
}
|
|
42
|
-
waitForCompletion() {
|
|
43
|
-
return this.completionPromise;
|
|
44
|
-
}
|
|
45
|
-
initialize() {
|
|
46
|
-
this.stack = new Array();
|
|
47
|
-
this.inCdData = false;
|
|
48
|
-
}
|
|
49
|
-
setCatalog(catalog) {
|
|
50
|
-
// do nothing
|
|
51
|
-
}
|
|
52
|
-
startDocument() {
|
|
53
|
-
// do nothing
|
|
54
|
-
}
|
|
55
|
-
endDocument() {
|
|
56
|
-
// Close the write stream when document ends
|
|
57
|
-
this.writeStream.end();
|
|
58
|
-
}
|
|
59
|
-
xmlDeclaration(version, encoding, standalone) {
|
|
60
|
-
// do nothing
|
|
61
|
-
}
|
|
62
|
-
startElement(name, atts) {
|
|
63
|
-
const element = new XMLElement(name);
|
|
64
|
-
atts.forEach((att) => {
|
|
65
|
-
element.setAttribute(att);
|
|
66
|
-
});
|
|
67
|
-
if ("xliff" === name) {
|
|
68
|
-
const version = element.getAttribute("version");
|
|
69
|
-
if (!version || !version.getValue().startsWith("2.")) {
|
|
70
|
-
throw new Error("Unsupported XLIFF version");
|
|
71
|
-
}
|
|
72
|
-
const srcLang = element.getAttribute("srcLang");
|
|
73
|
-
if (!srcLang) {
|
|
74
|
-
throw new Error("Missing @srcLang attribute in <xliff>");
|
|
75
|
-
}
|
|
76
|
-
const trgLang = element.getAttribute("trgLang");
|
|
77
|
-
if (!trgLang) {
|
|
78
|
-
throw new Error("Missing @trgLang attribute in <xliff>");
|
|
79
|
-
}
|
|
80
|
-
this.srcLang = srcLang.getValue();
|
|
81
|
-
this.tgtLang = trgLang.getValue();
|
|
82
|
-
}
|
|
83
|
-
if ("file" === name) {
|
|
84
|
-
const original = element.getAttribute("original");
|
|
85
|
-
this.original = original ? original.getValue() : '';
|
|
86
|
-
const id = element.getAttribute("id");
|
|
87
|
-
if (!id) {
|
|
88
|
-
throw new Error("Missing @id attribute in <file>");
|
|
89
|
-
}
|
|
90
|
-
this.fileId = id.getValue();
|
|
91
|
-
}
|
|
92
|
-
if (this.stack.length > 0) {
|
|
93
|
-
this.stack[this.stack.length - 1].addElement(element);
|
|
94
|
-
}
|
|
95
|
-
this.stack.push(element);
|
|
96
|
-
}
|
|
97
|
-
endElement(name) {
|
|
98
|
-
if ("unit" === name) {
|
|
99
|
-
const unit = this.stack[this.stack.length - 1];
|
|
100
|
-
this.processUnit(unit);
|
|
101
|
-
}
|
|
102
|
-
this.stack.pop();
|
|
103
|
-
}
|
|
104
|
-
internalSubset(declaration) {
|
|
105
|
-
// do nothing
|
|
106
|
-
}
|
|
107
|
-
characters(ch) {
|
|
108
|
-
if (this.inCdData) {
|
|
109
|
-
this.currentCData.setValue(this.currentCData.getValue() + ch);
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
const textNode = new TextNode(ch);
|
|
113
|
-
// ignore characters outside of elements
|
|
114
|
-
if (this.stack.length > 0) {
|
|
115
|
-
this.stack[this.stack.length - 1].addTextNode(textNode);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
ignorableWhitespace(ch) {
|
|
119
|
-
const textNode = new TextNode(ch);
|
|
120
|
-
// ignore characters outside of elements
|
|
121
|
-
if (this.stack.length > 0) {
|
|
122
|
-
this.stack[this.stack.length - 1].addTextNode(textNode);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
comment(ch) {
|
|
126
|
-
// do nothing
|
|
127
|
-
}
|
|
128
|
-
processingInstruction(target, data) {
|
|
129
|
-
// do nothing
|
|
130
|
-
}
|
|
131
|
-
startCDATA() {
|
|
132
|
-
this.inCdData = true;
|
|
133
|
-
}
|
|
134
|
-
endCDATA() {
|
|
135
|
-
this.inCdData = false;
|
|
136
|
-
}
|
|
137
|
-
startDTD(name, publicId, systemId) {
|
|
138
|
-
// do nothing
|
|
139
|
-
}
|
|
140
|
-
endDTD() {
|
|
141
|
-
// do nothing
|
|
142
|
-
}
|
|
143
|
-
skippedEntity(name) {
|
|
144
|
-
// do nothing
|
|
145
|
-
}
|
|
146
|
-
processUnit(unit) {
|
|
147
|
-
const id = unit.getAttribute('id');
|
|
148
|
-
if (!id) {
|
|
149
|
-
throw new Error('Missing @id attribute in <unit>');
|
|
150
|
-
}
|
|
151
|
-
const unitId = id.getValue();
|
|
152
|
-
const segmentElements = unit.getChildren().filter((child) => child.getName() === 'segment');
|
|
153
|
-
let segments = [];
|
|
154
|
-
if (segmentElements.length > 0) {
|
|
155
|
-
segments = this.buildSegments(unitId, unit, segmentElements);
|
|
156
|
-
if (segments.length === 0) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
const fallback = this.buildSingleSegment(unitId, unit);
|
|
162
|
-
if (!fallback) {
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
segments = [fallback];
|
|
166
|
-
}
|
|
167
|
-
const segmentCount = segments.length;
|
|
168
|
-
segments.forEach((segment, index) => {
|
|
169
|
-
const segmentIndex = index + 1;
|
|
170
|
-
this.writeSegmentEntries(unitId, segmentIndex, segmentCount, segment);
|
|
171
|
-
});
|
|
172
|
-
if (segmentCount > 1) {
|
|
173
|
-
this.writeMergedEntry(unitId, segments);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
buildSegments(unitId, unit, segmentElements) {
|
|
177
|
-
const segments = [];
|
|
178
|
-
segmentElements.forEach((segment) => {
|
|
179
|
-
const processed = this.buildSegmentData(unitId, unit, segment);
|
|
180
|
-
if (processed) {
|
|
181
|
-
segments.push(processed);
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
return segments;
|
|
185
|
-
}
|
|
186
|
-
buildSegmentData(unitId, unit, segment) {
|
|
187
|
-
const sourceElement = segment.getChild('source');
|
|
188
|
-
const targetElement = segment.getChild('target');
|
|
189
|
-
if (!sourceElement || !targetElement) {
|
|
190
|
-
return null;
|
|
191
|
-
}
|
|
192
|
-
const pureSource = Utils.getPureText(sourceElement);
|
|
193
|
-
const pureTarget = Utils.getPureText(targetElement);
|
|
194
|
-
if (pureSource.trim().length === 0) {
|
|
195
|
-
return null;
|
|
196
|
-
}
|
|
197
|
-
if (this.options.skipEmpty && pureTarget.trim().length === 0) {
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
const rawState = segment.getAttribute('state')?.getValue();
|
|
201
|
-
const stateRank = this.getStateRank(rawState);
|
|
202
|
-
const minRank = this.getStateRankFromOption(this.options.minState);
|
|
203
|
-
if (stateRank > 0 && stateRank < minRank) {
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
if (stateRank === 0 && this.options.skipUnconfirmed) {
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
const segmentId = segment.getAttribute('id')?.getValue();
|
|
210
|
-
const metadata = this.options.extractMetadata
|
|
211
|
-
? this.extractMetadata(unitId, unit, segment, rawState, segmentId)
|
|
212
|
-
: undefined;
|
|
213
|
-
return {
|
|
214
|
-
source: sourceElement,
|
|
215
|
-
target: targetElement,
|
|
216
|
-
pureSource,
|
|
217
|
-
pureTarget,
|
|
218
|
-
metadata,
|
|
219
|
-
segmentId
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
buildSingleSegment(unitId, unit) {
|
|
223
|
-
const combinedSource = new XMLElement('source');
|
|
224
|
-
const combinedTarget = new XMLElement('target');
|
|
225
|
-
unit.getChildren().forEach((child) => {
|
|
226
|
-
if (child.getName() === 'segment' || child.getName() === 'ignorable') {
|
|
227
|
-
const source = child.getChild('source');
|
|
228
|
-
if (source) {
|
|
229
|
-
this.appendElementContent(combinedSource, source);
|
|
230
|
-
}
|
|
231
|
-
const target = child.getChild('target');
|
|
232
|
-
if (target) {
|
|
233
|
-
this.appendElementContent(combinedTarget, target);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
const pureSource = Utils.getPureText(combinedSource);
|
|
238
|
-
const pureTarget = Utils.getPureText(combinedTarget);
|
|
239
|
-
if (pureSource.trim().length === 0) {
|
|
240
|
-
return null;
|
|
241
|
-
}
|
|
242
|
-
if (this.options.skipEmpty && pureTarget.trim().length === 0) {
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
const metadata = this.options.extractMetadata
|
|
246
|
-
? this.extractMetadata(unitId, unit, unit)
|
|
247
|
-
: undefined;
|
|
248
|
-
return {
|
|
249
|
-
source: combinedSource,
|
|
250
|
-
target: combinedTarget,
|
|
251
|
-
pureSource,
|
|
252
|
-
pureTarget,
|
|
253
|
-
metadata
|
|
254
|
-
};
|
|
255
|
-
}
|
|
256
|
-
writeSegmentEntries(unitId, segmentIndex, segmentCount, segment) {
|
|
257
|
-
const metadata = this.applySegmentPosition(segment.metadata, unitId, segment.segmentId, segmentIndex, segmentCount);
|
|
258
|
-
this.writeEntry({
|
|
259
|
-
language: this.srcLang,
|
|
260
|
-
fileId: this.fileId,
|
|
261
|
-
unitId,
|
|
262
|
-
original: this.original,
|
|
263
|
-
pureText: segment.pureSource,
|
|
264
|
-
element: segment.source.toString(),
|
|
265
|
-
segmentIndex,
|
|
266
|
-
segmentCount,
|
|
267
|
-
metadata
|
|
268
|
-
});
|
|
269
|
-
this.writeEntry({
|
|
270
|
-
language: this.tgtLang,
|
|
271
|
-
fileId: this.fileId,
|
|
272
|
-
unitId,
|
|
273
|
-
original: this.original,
|
|
274
|
-
pureText: segment.pureTarget,
|
|
275
|
-
element: segment.target.toString(),
|
|
276
|
-
segmentIndex,
|
|
277
|
-
segmentCount,
|
|
278
|
-
metadata
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
applySegmentPosition(metadata, unitId, explicitSegmentId, segmentIndex, segmentCount) {
|
|
282
|
-
if (!metadata) {
|
|
283
|
-
return undefined;
|
|
284
|
-
}
|
|
285
|
-
if (!metadata.segment) {
|
|
286
|
-
metadata.segment = {
|
|
287
|
-
provider: 'xliff',
|
|
288
|
-
fileId: this.fileId,
|
|
289
|
-
unitId,
|
|
290
|
-
segmentId: explicitSegmentId
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
metadata.segment.provider = metadata.segment.provider || 'xliff';
|
|
295
|
-
metadata.segment.fileId = metadata.segment.fileId || this.fileId;
|
|
296
|
-
metadata.segment.unitId = metadata.segment.unitId || unitId;
|
|
297
|
-
if (!metadata.segment.segmentId && explicitSegmentId) {
|
|
298
|
-
metadata.segment.segmentId = explicitSegmentId;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
if (!metadata.segment.segmentId && segmentIndex > 0) {
|
|
302
|
-
metadata.segment.segmentId = explicitSegmentId || segmentIndex.toString();
|
|
303
|
-
}
|
|
304
|
-
metadata.segment.segmentIndex = segmentIndex;
|
|
305
|
-
metadata.segment.segmentCount = segmentCount;
|
|
306
|
-
return metadata;
|
|
307
|
-
}
|
|
308
|
-
writeMergedEntry(unitId, segments) {
|
|
309
|
-
const mergedSource = new XMLElement('source');
|
|
310
|
-
const mergedTarget = new XMLElement('target');
|
|
311
|
-
segments.forEach((segment) => {
|
|
312
|
-
this.appendElementContent(mergedSource, segment.source);
|
|
313
|
-
this.appendElementContent(mergedTarget, segment.target);
|
|
314
|
-
});
|
|
315
|
-
const pureSource = Utils.getPureText(mergedSource);
|
|
316
|
-
const pureTarget = Utils.getPureText(mergedTarget);
|
|
317
|
-
if (pureSource.trim().length === 0) {
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
if (this.options.skipEmpty && pureTarget.trim().length === 0) {
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
this.writeEntry({
|
|
324
|
-
language: this.srcLang,
|
|
325
|
-
fileId: this.fileId,
|
|
326
|
-
unitId,
|
|
327
|
-
original: this.original,
|
|
328
|
-
pureText: pureSource,
|
|
329
|
-
element: mergedSource.toString(),
|
|
330
|
-
segmentIndex: 0,
|
|
331
|
-
segmentCount: segments.length
|
|
332
|
-
});
|
|
333
|
-
this.writeEntry({
|
|
334
|
-
language: this.tgtLang,
|
|
335
|
-
fileId: this.fileId,
|
|
336
|
-
unitId,
|
|
337
|
-
original: this.original,
|
|
338
|
-
pureText: pureTarget,
|
|
339
|
-
element: mergedTarget.toString(),
|
|
340
|
-
segmentIndex: 0,
|
|
341
|
-
segmentCount: segments.length
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
writeEntry(entry) {
|
|
345
|
-
const payload = {
|
|
346
|
-
language: entry.language,
|
|
347
|
-
fileId: entry.fileId,
|
|
348
|
-
original: entry.original,
|
|
349
|
-
unitId: entry.unitId,
|
|
350
|
-
pureText: entry.pureText,
|
|
351
|
-
element: entry.element,
|
|
352
|
-
segmentIndex: entry.segmentIndex,
|
|
353
|
-
segmentCount: entry.segmentCount
|
|
354
|
-
};
|
|
355
|
-
if (this.hasMetadata(entry.metadata)) {
|
|
356
|
-
payload.metadata = entry.metadata;
|
|
357
|
-
}
|
|
358
|
-
this.writeStream.write(JSON.stringify(payload) + '\n');
|
|
359
|
-
this.entryCount++;
|
|
360
|
-
}
|
|
361
|
-
hasMetadata(metadata) {
|
|
362
|
-
return !!metadata && Object.keys(metadata).length > 0;
|
|
363
|
-
}
|
|
364
|
-
appendElementContent(target, element) {
|
|
365
|
-
const content = element.getContent();
|
|
366
|
-
content.forEach((node) => {
|
|
367
|
-
if (node instanceof TextNode) {
|
|
368
|
-
target.addTextNode(node);
|
|
369
|
-
}
|
|
370
|
-
else if (node instanceof XMLElement) {
|
|
371
|
-
target.addElement(node);
|
|
372
|
-
}
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
extractMetadata(unitId, unit, segment, rawState, segmentId) {
|
|
376
|
-
const metadata = {};
|
|
377
|
-
if (this.isTranslationState(rawState)) {
|
|
378
|
-
metadata.state = rawState;
|
|
379
|
-
}
|
|
380
|
-
const subState = this.readSubState(segment);
|
|
381
|
-
if (subState) {
|
|
382
|
-
metadata.subState = subState;
|
|
383
|
-
}
|
|
384
|
-
this.assignMetadataString(metadata, 'creationDate', this.readAttribute(segment, 'creationDate') || this.readAttribute(unit, 'creationDate'));
|
|
385
|
-
this.assignMetadataString(metadata, 'creationId', this.readAttribute(segment, 'creationId') || this.readAttribute(unit, 'creationId'));
|
|
386
|
-
this.assignMetadataString(metadata, 'changeDate', this.readAttribute(segment, 'changeDate') || this.readAttribute(unit, 'changeDate'));
|
|
387
|
-
this.assignMetadataString(metadata, 'changeId', this.readAttribute(segment, 'changeId') || this.readAttribute(unit, 'changeId'));
|
|
388
|
-
this.assignMetadataString(metadata, 'creationTool', this.readAttribute(segment, 'creationTool') || this.readAttribute(unit, 'creationTool'));
|
|
389
|
-
this.assignMetadataString(metadata, 'creationToolVersion', this.readAttribute(segment, 'creationToolVersion') || this.readAttribute(unit, 'creationToolVersion'));
|
|
390
|
-
this.assignMetadataString(metadata, 'context', this.readAttribute(segment, 'context') || this.readAttribute(unit, 'context'));
|
|
391
|
-
const notes = [];
|
|
392
|
-
this.collectNotes(unit, notes);
|
|
393
|
-
this.collectNotes(segment, notes);
|
|
394
|
-
if (notes.length > 0) {
|
|
395
|
-
metadata.notes = notes;
|
|
396
|
-
}
|
|
397
|
-
const properties = {};
|
|
398
|
-
this.collectMetadataProperties(unit, properties);
|
|
399
|
-
this.collectMetadataProperties(segment, properties);
|
|
400
|
-
if (Object.keys(properties).length > 0) {
|
|
401
|
-
metadata.properties = properties;
|
|
402
|
-
if (!metadata.context) {
|
|
403
|
-
const contextKey = Object.keys(properties).find((key) => key.toLowerCase().includes('context'));
|
|
404
|
-
if (contextKey) {
|
|
405
|
-
metadata.context = properties[contextKey];
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
metadata.segment = {
|
|
410
|
-
provider: 'xliff',
|
|
411
|
-
fileId: this.fileId,
|
|
412
|
-
unitId,
|
|
413
|
-
segmentId
|
|
414
|
-
};
|
|
415
|
-
return metadata;
|
|
416
|
-
}
|
|
417
|
-
assignMetadataString(metadata, key, value) {
|
|
418
|
-
if (value && value.length > 0) {
|
|
419
|
-
metadata[key] = value;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
readAttribute(element, name) {
|
|
423
|
-
const attribute = element.getAttribute(name);
|
|
424
|
-
if (!attribute) {
|
|
425
|
-
return undefined;
|
|
426
|
-
}
|
|
427
|
-
const value = attribute.getValue();
|
|
428
|
-
return value && value.length > 0 ? value : undefined;
|
|
429
|
-
}
|
|
430
|
-
readSubState(segment) {
|
|
431
|
-
const direct = this.readAttribute(segment, 'subState');
|
|
432
|
-
if (direct) {
|
|
433
|
-
return direct;
|
|
434
|
-
}
|
|
435
|
-
const target = segment.getChild('target');
|
|
436
|
-
if (target) {
|
|
437
|
-
const targetValue = this.readAttribute(target, 'subState');
|
|
438
|
-
if (targetValue) {
|
|
439
|
-
return targetValue;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
const source = segment.getChild('source');
|
|
443
|
-
if (source) {
|
|
444
|
-
const sourceValue = this.readAttribute(source, 'subState');
|
|
445
|
-
if (sourceValue) {
|
|
446
|
-
return sourceValue;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
return undefined;
|
|
450
|
-
}
|
|
451
|
-
collectNotes(element, accumulator) {
|
|
452
|
-
element.getChildren().forEach((child) => {
|
|
453
|
-
if (child.getName() === 'notes') {
|
|
454
|
-
child.getChildren().forEach((noteElement) => {
|
|
455
|
-
if (noteElement.getName() === 'note') {
|
|
456
|
-
const value = Utils.getPureText(noteElement).trim();
|
|
457
|
-
if (value.length > 0) {
|
|
458
|
-
accumulator.push(value);
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
collectMetadataProperties(element, properties) {
|
|
466
|
-
element.getChildren().forEach((child) => {
|
|
467
|
-
const name = child.getName();
|
|
468
|
-
if (name.endsWith('metadata')) {
|
|
469
|
-
child.getChildren().forEach((metaGroup) => {
|
|
470
|
-
if (!metaGroup.getName().endsWith('metaGroup')) {
|
|
471
|
-
return;
|
|
472
|
-
}
|
|
473
|
-
const category = metaGroup.getAttribute('category')?.getValue();
|
|
474
|
-
metaGroup.getChildren().forEach((meta) => {
|
|
475
|
-
if (!meta.getName().endsWith('meta')) {
|
|
476
|
-
return;
|
|
477
|
-
}
|
|
478
|
-
const typeValue = meta.getAttribute('type')?.getValue();
|
|
479
|
-
const key = category ? category + ':' + (typeValue || '') : (typeValue || '');
|
|
480
|
-
const content = Utils.getPureText(meta).trim();
|
|
481
|
-
if (key.length > 0 && content.length > 0) {
|
|
482
|
-
properties[key] = content;
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
});
|
|
488
|
-
}
|
|
489
|
-
getStateRank(rawState) {
|
|
490
|
-
if (!this.isTranslationState(rawState)) {
|
|
491
|
-
return 0;
|
|
492
|
-
}
|
|
493
|
-
return this.getStateRankFromOption(rawState);
|
|
494
|
-
}
|
|
495
|
-
getStateRankFromOption(state) {
|
|
496
|
-
if (!state) {
|
|
497
|
-
return 0;
|
|
498
|
-
}
|
|
499
|
-
switch (state) {
|
|
500
|
-
case 'initial':
|
|
501
|
-
return 0;
|
|
502
|
-
case 'translated':
|
|
503
|
-
return 1;
|
|
504
|
-
case 'reviewed':
|
|
505
|
-
return 2;
|
|
506
|
-
case 'final':
|
|
507
|
-
return 3;
|
|
508
|
-
default:
|
|
509
|
-
return 0;
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
isTranslationState(value) {
|
|
513
|
-
return value === 'initial'
|
|
514
|
-
|| value === 'translated'
|
|
515
|
-
|| value === 'reviewed'
|
|
516
|
-
|| value === 'final';
|
|
517
|
-
}
|
|
518
|
-
getGrammar() {
|
|
519
|
-
return undefined;
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
//# sourceMappingURL=xliffHandler.js.map
|
package/dist/xliffreader.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/*******************************************************************************
|
|
2
|
-
* Copyright (c) 2025-2026 Maxprograms.
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials
|
|
5
|
-
* are made available under the terms of the Eclipse License 1.0
|
|
6
|
-
* which accompanies this distribution, and is available at
|
|
7
|
-
* https://www.eclipse.org/org/documents/epl-v10.html
|
|
8
|
-
*
|
|
9
|
-
* Contributors:
|
|
10
|
-
* Maxprograms - initial API and implementation
|
|
11
|
-
*******************************************************************************/
|
|
12
|
-
import { SAXParser } from "typesxml";
|
|
13
|
-
import { ImportOptions } from './importOptions.js';
|
|
14
|
-
import { XLIFFHandler } from './xliffHandler.js';
|
|
15
|
-
export declare class XLIFFReader {
|
|
16
|
-
parser: SAXParser;
|
|
17
|
-
tempFilePath: string;
|
|
18
|
-
handler: XLIFFHandler;
|
|
19
|
-
filePath: string;
|
|
20
|
-
private readonly options;
|
|
21
|
-
constructor(filePath: string, options?: ImportOptions);
|
|
22
|
-
parse(): Promise<void>;
|
|
23
|
-
getTempFilePath(): string;
|
|
24
|
-
getEntryCount(): number;
|
|
25
|
-
}
|
package/dist/xliffreader.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/*******************************************************************************
|
|
2
|
-
* Copyright (c) 2025-2026 Maxprograms.
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials
|
|
5
|
-
* are made available under the terms of the Eclipse License 1.0
|
|
6
|
-
* which accompanies this distribution, and is available at
|
|
7
|
-
* https://www.eclipse.org/org/documents/epl-v10.html
|
|
8
|
-
*
|
|
9
|
-
* Contributors:
|
|
10
|
-
* Maxprograms - initial API and implementation
|
|
11
|
-
*******************************************************************************/
|
|
12
|
-
import { tmpdir } from "node:os";
|
|
13
|
-
import { join } from 'node:path';
|
|
14
|
-
import { SAXParser } from "typesxml";
|
|
15
|
-
import { DEFAULT_IMPORT_OPTIONS, resolveImportOptions } from './importOptions.js';
|
|
16
|
-
import { XLIFFHandler } from './xliffHandler.js';
|
|
17
|
-
export class XLIFFReader {
|
|
18
|
-
parser;
|
|
19
|
-
tempFilePath;
|
|
20
|
-
handler;
|
|
21
|
-
filePath;
|
|
22
|
-
options;
|
|
23
|
-
constructor(filePath, options = DEFAULT_IMPORT_OPTIONS) {
|
|
24
|
-
this.filePath = filePath;
|
|
25
|
-
this.options = resolveImportOptions(options);
|
|
26
|
-
// Generate temp file path
|
|
27
|
-
const tempDir = tmpdir();
|
|
28
|
-
const tempFileName = 'xliff_' + Date.now() + '_' + Math.random().toString(36).substring(7) + '.jsonl';
|
|
29
|
-
this.tempFilePath = join(tempDir, tempFileName);
|
|
30
|
-
this.parser = new SAXParser();
|
|
31
|
-
this.handler = new XLIFFHandler(this.tempFilePath, this.options);
|
|
32
|
-
this.parser.setContentHandler(this.handler);
|
|
33
|
-
}
|
|
34
|
-
async parse() {
|
|
35
|
-
try {
|
|
36
|
-
this.parser.parseFile(this.filePath);
|
|
37
|
-
await this.handler.waitForCompletion();
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
throw error instanceof Error ? error : new Error(String(error));
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
getTempFilePath() {
|
|
44
|
-
return this.tempFilePath;
|
|
45
|
-
}
|
|
46
|
-
getEntryCount() {
|
|
47
|
-
return this.handler.getEntryCount();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=xliffReader.js.map
|
package/dist/xlifftest.d.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
export declare class XLIFFTest {
|
|
2
|
-
private static readonly NAME;
|
|
3
|
-
private static readonly DB_PATH;
|
|
4
|
-
private static readonly SAMPLE_XLIFF;
|
|
5
|
-
runTest(): Promise<void>;
|
|
6
|
-
private resetEnvironment;
|
|
7
|
-
private verifyEntry;
|
|
8
|
-
private expectTranslationMatch;
|
|
9
|
-
private expectConcordanceMatch;
|
|
10
|
-
private verifyMetadataRoundtrip;
|
|
11
|
-
private assertMetadataEquals;
|
|
12
|
-
}
|
|
13
|
-
/*******************************************************************************
|
|
14
|
-
|
|
15
|
-
Follow the steps to create a translation project from your DITA map
|
|
16
|
-
|
|
17
|
-
I need to edit the name or description of a translation memory
|
|
18
|
-
|
|
19
|
-
How do I add more target languages to my project?
|
|
20
|
-
|
|
21
|
-
What should I do after updating my DITA content?
|
|
22
|
-
|
|
23
|
-
Export a memory as a TMX file to save the translation data
|
|
24
|
-
|
|
25
|
-
Associate existing memories with the new project to reuse translations
|
|
26
|
-
|
|
27
|
-
I want to permanently remove a project from the system
|
|
28
|
-
|
|
29
|
-
Select a name and location for the TMX file containing memory data
|
|
30
|
-
|
|
31
|
-
Import a TMX file into a memory from the command line
|
|
32
|
-
|
|
33
|
-
Fluenta recovers exact matches from translations stored in the previous cycle
|
|
34
|
-
|
|
35
|
-
You don't need to pay again for translation of content that didn't change
|
|
36
|
-
|
|
37
|
-
A company specialized in providing translation and localization services
|
|
38
|
-
|
|
39
|
-
Before using the Command Line Interface you must start Fluenta from the GUI at least once
|
|
40
|
-
|
|
41
|
-
Create a JSON file containing the data required for creating the memory
|
|
42
|
-
|
|
43
|
-
An XLIFF file is generated for each selected target language
|
|
44
|
-
|
|
45
|
-
Check your email and register the evaluation key using the instructions
|
|
46
|
-
|
|
47
|
-
Additional configurations can be added by the user as required
|
|
48
|
-
|
|
49
|
-
Use the buttons in the dialog to update the configuration file
|
|
50
|
-
|
|
51
|
-
The configuration file is automatically updated as you add or remove elements
|
|
52
|
-
|
|
53
|
-
Avoid using folders that could be modified by other programs while you work
|
|
54
|
-
*/
|