hybridtm 0.1.0 → 0.4.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/README.md +4 -3
- package/dist/hybridtm.d.ts +1 -0
- package/dist/hybridtm.js +21 -1
- package/dist/hybridtm.js.map +1 -1
- package/dist/package.json +35 -0
- package/dist/tmxhandler.d.ts +1 -0
- package/dist/tmxhandler.js +10 -0
- package/dist/tmxhandler.js.map +1 -1
- package/dist/ts/batchImporter.d.ts +22 -0
- package/dist/ts/batchImporter.js +203 -0
- package/dist/ts/batchImporter.js.map +1 -0
- package/dist/ts/hybridtm.d.ts +67 -0
- package/dist/ts/hybridtm.js +932 -0
- package/dist/ts/hybridtm.js.map +1 -0
- package/dist/ts/hybridtmFactory.d.ts +43 -0
- package/dist/ts/hybridtmFactory.js +165 -0
- package/dist/ts/hybridtmFactory.js.map +1 -0
- package/dist/ts/importOptions.d.ts +21 -0
- package/dist/ts/importOptions.js +24 -0
- package/dist/ts/importOptions.js.map +1 -0
- package/dist/ts/index.d.ts +25 -0
- package/dist/ts/index.js +22 -0
- package/dist/ts/index.js.map +1 -0
- package/dist/ts/langEntry.d.ts +64 -0
- package/dist/ts/langEntry.js +13 -0
- package/dist/ts/langEntry.js.map +1 -0
- package/dist/ts/match.d.ts +22 -0
- package/dist/ts/match.js +38 -0
- package/dist/ts/match.js.map +1 -0
- package/dist/ts/matchQuality.d.ts +16 -0
- package/dist/ts/matchQuality.js +83 -0
- package/dist/ts/matchQuality.js.map +1 -0
- package/dist/ts/pendingEntry.d.ts +24 -0
- package/dist/ts/pendingEntry.js +13 -0
- package/dist/ts/pendingEntry.js.map +1 -0
- package/dist/ts/searchFilters.d.ts +24 -0
- package/dist/ts/searchFilters.js +13 -0
- package/dist/ts/searchFilters.js.map +1 -0
- package/dist/ts/tmxHandler.d.ts +61 -0
- package/dist/ts/tmxHandler.js +347 -0
- package/dist/ts/tmxHandler.js.map +1 -0
- package/dist/ts/tmxReader.d.ts +25 -0
- package/dist/ts/tmxReader.js +51 -0
- package/dist/ts/tmxReader.js.map +1 -0
- package/dist/ts/tmxtest.d.ts +16 -0
- package/dist/ts/tmxtest.js +316 -0
- package/dist/ts/tmxtest.js.map +1 -0
- package/dist/ts/utils.d.ts +17 -0
- package/dist/ts/utils.js +49 -0
- package/dist/ts/utils.js.map +1 -0
- package/dist/ts/xliffHandler.d.ts +67 -0
- package/dist/ts/xliffHandler.js +522 -0
- package/dist/ts/xliffHandler.js.map +1 -0
- package/dist/ts/xliffReader.d.ts +25 -0
- package/dist/ts/xliffReader.js +50 -0
- package/dist/ts/xliffReader.js.map +1 -0
- package/dist/ts/xlifftest.d.ts +54 -0
- package/dist/ts/xlifftest.js +245 -0
- package/dist/ts/xlifftest.js.map +1 -0
- package/dist/xliffhandler.d.ts +1 -0
- package/dist/xliffhandler.js +10 -0
- package/dist/xliffhandler.js.map +1 -1
- package/package.json +13 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchQuality.js","sourceRoot":"","sources":["../../ts/matchQuality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iFAUiF;AAEjF,MAAM,OAAO,YAAY;IAEb,MAAM,CAAU,OAAO,GAAG,CAAC,CAAC;IAE5B,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,CAAS;QACnC,MAAM,CAAC,GAAW,CAAC,CAAC,MAAM,CAAC;QAC3B,MAAM,CAAC,GAAW,CAAC,CAAC,MAAM,CAAC;QAC3B,IAAI,GAAG,GAAW,CAAC,CAAC;QACpB,IAAI,EAAE,GAAW,CAAC,CAAC;QAEnB,mDAAmD;QACnD,MAAM,GAAG,GAAe,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAExF,kBAAkB;QAClB,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACtC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBAClC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;wBAClB,uCAAuC;wBACvC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAChB,EAAE,GAAG,CAAC,CAAC;oBACX,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClB,CAAC;YACL,CAAC;QACL,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,GAAW,EAAE,CAAC;QACxB,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;YACnC,GAAG,EAAE,CAAC;YACN,EAAE,EAAE,CAAC;QACT,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,CAAS,EAAE,CAAS;QACzC,IAAI,MAAM,GAAW,CAAC,CAAC;QACvB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACb,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,OAAO,GAAW,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,CAAC;QACb,CAAC;QAED,IAAI,CAAS,CAAC;QACd,IAAI,CAAS,CAAC;QACd,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,CAAC,GAAG,CAAC,CAAC;YACN,CAAC,GAAG,CAAC,CAAC;QACV,CAAC;aAAM,CAAC;YACJ,CAAC,GAAG,CAAC,CAAC;YACN,CAAC,GAAG,CAAC,CAAC;QACV,CAAC;QAED,0BAA0B;QAC1B,IAAI,KAAK,GAAW,CAAC,CAAC,CAAC;QACvB,IAAI,GAAW,CAAC;QAChB,IAAI,GAAG,GAAW,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO,GAAG,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;YAChF,KAAK,EAAE,CAAC;YACR,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;YACxD,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;YACxD,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC;QAC7E,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
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 { XMLElement } from "typesxml";
|
|
13
|
+
import { EntryMetadata } from './langEntry.js';
|
|
14
|
+
export interface PendingEntry {
|
|
15
|
+
fileId: string;
|
|
16
|
+
original: string;
|
|
17
|
+
unitId: string;
|
|
18
|
+
language: string;
|
|
19
|
+
pureText: string;
|
|
20
|
+
element: XMLElement;
|
|
21
|
+
segmentIndex: number;
|
|
22
|
+
segmentCount: number;
|
|
23
|
+
metadata: EntryMetadata;
|
|
24
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=pendingEntry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pendingEntry.js","sourceRoot":"","sources":["../../ts/pendingEntry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iFAUiF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
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 { TranslationState } from './importOptions.js';
|
|
13
|
+
export interface MetadataFilter {
|
|
14
|
+
states?: TranslationState[];
|
|
15
|
+
minState?: TranslationState;
|
|
16
|
+
minQuality?: number;
|
|
17
|
+
contextIncludes?: string[];
|
|
18
|
+
requiredProperties?: Record<string, string>;
|
|
19
|
+
provider?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface TranslationSearchFilters {
|
|
22
|
+
source?: MetadataFilter;
|
|
23
|
+
target?: MetadataFilter;
|
|
24
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=searchFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchFilters.js","sourceRoot":"","sources":["../../ts/searchFilters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iFAUiF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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 { Catalog, CData, ContentHandler, Grammar, XMLAttribute, XMLElement } from "typesxml";
|
|
13
|
+
import { ImportOptions } from './importOptions.js';
|
|
14
|
+
export declare class TMXHandler implements ContentHandler {
|
|
15
|
+
inCdData: boolean;
|
|
16
|
+
currentCData: CData;
|
|
17
|
+
stack: Array<XMLElement>;
|
|
18
|
+
original: string;
|
|
19
|
+
currentTu: string;
|
|
20
|
+
fileId: string;
|
|
21
|
+
currentTuElement: XMLElement | null;
|
|
22
|
+
private writeStream;
|
|
23
|
+
private readonly completionPromise;
|
|
24
|
+
private entryCount;
|
|
25
|
+
private readonly options;
|
|
26
|
+
constructor(tempFilePath: string, filename: string, options?: ImportOptions);
|
|
27
|
+
setGrammar(grammar: Grammar | undefined): void;
|
|
28
|
+
getEntryCount(): number;
|
|
29
|
+
waitForCompletion(): Promise<void>;
|
|
30
|
+
initialize(): void;
|
|
31
|
+
setCatalog(catalog: Catalog): void;
|
|
32
|
+
startDocument(): void;
|
|
33
|
+
endDocument(): void;
|
|
34
|
+
xmlDeclaration(version: string, encoding: string, standalone: string | undefined): void;
|
|
35
|
+
startElement(name: string, atts: Array<XMLAttribute>): void;
|
|
36
|
+
endElement(name: string): void;
|
|
37
|
+
internalSubset(declaration: string): void;
|
|
38
|
+
characters(ch: string): void;
|
|
39
|
+
ignorableWhitespace(ch: string): void;
|
|
40
|
+
comment(ch: string): void;
|
|
41
|
+
processingInstruction(target: string, data: string): void;
|
|
42
|
+
startCDATA(): void;
|
|
43
|
+
endCDATA(): void;
|
|
44
|
+
startDTD(name: string, publicId: string, systemId: string): void;
|
|
45
|
+
endDTD(): void;
|
|
46
|
+
skippedEntity(name: string): void;
|
|
47
|
+
getGrammar(): Grammar | undefined;
|
|
48
|
+
private extractMetadata;
|
|
49
|
+
private readAttribute;
|
|
50
|
+
private assignMetadataString;
|
|
51
|
+
private parseNumber;
|
|
52
|
+
private collectNotes;
|
|
53
|
+
private collectProperties;
|
|
54
|
+
private hasMetadata;
|
|
55
|
+
private buildContextFromProperties;
|
|
56
|
+
private findDirectionalProperty;
|
|
57
|
+
private readSegmentIdProp;
|
|
58
|
+
private attachSegmentMetadata;
|
|
59
|
+
private describeSegmentReference;
|
|
60
|
+
private parseSegmentIdentifier;
|
|
61
|
+
}
|
|
@@ -0,0 +1,347 @@
|
|
|
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 TMXHandler {
|
|
17
|
+
inCdData = false;
|
|
18
|
+
currentCData = new CData('');
|
|
19
|
+
stack = [];
|
|
20
|
+
original = '';
|
|
21
|
+
currentTu = '';
|
|
22
|
+
fileId = '';
|
|
23
|
+
currentTuElement = null;
|
|
24
|
+
writeStream;
|
|
25
|
+
completionPromise;
|
|
26
|
+
entryCount = 0;
|
|
27
|
+
options;
|
|
28
|
+
constructor(tempFilePath, filename, options = DEFAULT_IMPORT_OPTIONS) {
|
|
29
|
+
this.fileId = filename;
|
|
30
|
+
this.writeStream = createWriteStream(tempFilePath, { encoding: 'utf8' });
|
|
31
|
+
this.completionPromise = new Promise((resolve, reject) => {
|
|
32
|
+
this.writeStream.once('finish', resolve);
|
|
33
|
+
this.writeStream.once('error', reject);
|
|
34
|
+
});
|
|
35
|
+
this.options = resolveImportOptions(options);
|
|
36
|
+
}
|
|
37
|
+
setGrammar(grammar) {
|
|
38
|
+
// do nothing
|
|
39
|
+
}
|
|
40
|
+
getEntryCount() {
|
|
41
|
+
return this.entryCount;
|
|
42
|
+
}
|
|
43
|
+
waitForCompletion() {
|
|
44
|
+
return this.completionPromise;
|
|
45
|
+
}
|
|
46
|
+
initialize() {
|
|
47
|
+
this.stack = new Array();
|
|
48
|
+
this.inCdData = false;
|
|
49
|
+
}
|
|
50
|
+
setCatalog(catalog) {
|
|
51
|
+
// do nothing
|
|
52
|
+
}
|
|
53
|
+
startDocument() {
|
|
54
|
+
// do nothing
|
|
55
|
+
}
|
|
56
|
+
endDocument() {
|
|
57
|
+
// Close the write stream when document ends
|
|
58
|
+
this.writeStream.end();
|
|
59
|
+
}
|
|
60
|
+
xmlDeclaration(version, encoding, standalone) {
|
|
61
|
+
// do nothing
|
|
62
|
+
}
|
|
63
|
+
startElement(name, atts) {
|
|
64
|
+
const element = new XMLElement(name);
|
|
65
|
+
atts.forEach((att) => {
|
|
66
|
+
element.setAttribute(att);
|
|
67
|
+
});
|
|
68
|
+
if ("tu" === name) {
|
|
69
|
+
const tuid = element.getAttribute("tuid");
|
|
70
|
+
if (tuid) {
|
|
71
|
+
this.currentTu = tuid.getValue();
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.currentTu = Date.now().toString();
|
|
75
|
+
}
|
|
76
|
+
this.currentTuElement = element;
|
|
77
|
+
}
|
|
78
|
+
if (this.stack.length > 0) {
|
|
79
|
+
this.stack[this.stack.length - 1].addElement(element);
|
|
80
|
+
}
|
|
81
|
+
this.stack.push(element);
|
|
82
|
+
}
|
|
83
|
+
endElement(name) {
|
|
84
|
+
if ("tuv" === name) {
|
|
85
|
+
const tuv = this.stack[this.stack.length - 1];
|
|
86
|
+
let lang = tuv.getAttribute("xml:lang")?.getValue() || '';
|
|
87
|
+
if ('' === lang) {
|
|
88
|
+
lang = tuv.getAttribute("lang")?.getValue() || '';
|
|
89
|
+
}
|
|
90
|
+
if ('' === lang) {
|
|
91
|
+
throw new Error("Missing @xml:lang or @lang attribute in <tuv>");
|
|
92
|
+
}
|
|
93
|
+
const seg = tuv.getChild("seg");
|
|
94
|
+
if (!seg) {
|
|
95
|
+
throw new Error("Missing <seg> child element in <tuv>");
|
|
96
|
+
}
|
|
97
|
+
const pureText = Utils.getPureText(seg);
|
|
98
|
+
if (pureText.trim().length === 0 && this.options.skipEmpty) {
|
|
99
|
+
this.stack.pop();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const metadata = this.options.extractMetadata
|
|
103
|
+
? this.extractMetadata(this.currentTuElement, tuv)
|
|
104
|
+
: {};
|
|
105
|
+
const jsonEntry = {
|
|
106
|
+
language: lang,
|
|
107
|
+
fileId: this.fileId,
|
|
108
|
+
original: this.original,
|
|
109
|
+
unitId: this.currentTu,
|
|
110
|
+
pureText: pureText,
|
|
111
|
+
element: tuv.toString(),
|
|
112
|
+
segmentIndex: 0,
|
|
113
|
+
segmentCount: 1
|
|
114
|
+
};
|
|
115
|
+
if (this.hasMetadata(metadata)) {
|
|
116
|
+
jsonEntry.metadata = metadata;
|
|
117
|
+
}
|
|
118
|
+
this.writeStream.write(JSON.stringify(jsonEntry) + '\n');
|
|
119
|
+
this.entryCount++;
|
|
120
|
+
}
|
|
121
|
+
if ("tu" === name) {
|
|
122
|
+
this.currentTu = '';
|
|
123
|
+
this.currentTuElement = null;
|
|
124
|
+
}
|
|
125
|
+
this.stack.pop();
|
|
126
|
+
}
|
|
127
|
+
internalSubset(declaration) {
|
|
128
|
+
// do nothing
|
|
129
|
+
}
|
|
130
|
+
characters(ch) {
|
|
131
|
+
if (this.inCdData) {
|
|
132
|
+
this.currentCData.setValue(this.currentCData.getValue() + ch);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const textNode = new TextNode(ch);
|
|
136
|
+
// ignore characters outside of elements
|
|
137
|
+
if (this.stack.length > 0) {
|
|
138
|
+
this.stack[this.stack.length - 1].addTextNode(textNode);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
ignorableWhitespace(ch) {
|
|
142
|
+
const textNode = new TextNode(ch);
|
|
143
|
+
// ignore characters outside of elements
|
|
144
|
+
if (this.stack.length > 0) {
|
|
145
|
+
this.stack[this.stack.length - 1].addTextNode(textNode);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
comment(ch) {
|
|
149
|
+
// do nothing
|
|
150
|
+
}
|
|
151
|
+
processingInstruction(target, data) {
|
|
152
|
+
// do nothing
|
|
153
|
+
}
|
|
154
|
+
startCDATA() {
|
|
155
|
+
this.inCdData = true;
|
|
156
|
+
}
|
|
157
|
+
endCDATA() {
|
|
158
|
+
this.inCdData = false;
|
|
159
|
+
}
|
|
160
|
+
startDTD(name, publicId, systemId) {
|
|
161
|
+
// do nothing
|
|
162
|
+
}
|
|
163
|
+
endDTD() {
|
|
164
|
+
// do nothing
|
|
165
|
+
}
|
|
166
|
+
skippedEntity(name) {
|
|
167
|
+
// do nothing
|
|
168
|
+
}
|
|
169
|
+
getGrammar() {
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
extractMetadata(tu, tuv) {
|
|
173
|
+
const metadata = {};
|
|
174
|
+
this.assignMetadataString(metadata, 'creationDate', this.readAttribute(tuv, 'creationdate') || (tu ? this.readAttribute(tu, 'creationdate') : undefined));
|
|
175
|
+
this.assignMetadataString(metadata, 'creationId', this.readAttribute(tuv, 'creationid') || (tu ? this.readAttribute(tu, 'creationid') : undefined));
|
|
176
|
+
this.assignMetadataString(metadata, 'changeDate', this.readAttribute(tuv, 'changedate') || (tu ? this.readAttribute(tu, 'changedate') : undefined));
|
|
177
|
+
this.assignMetadataString(metadata, 'changeId', this.readAttribute(tuv, 'changeid') || (tu ? this.readAttribute(tu, 'changeid') : undefined));
|
|
178
|
+
this.assignMetadataString(metadata, 'creationTool', this.readAttribute(tuv, 'creationtool') || (tu ? this.readAttribute(tu, 'creationtool') : undefined));
|
|
179
|
+
this.assignMetadataString(metadata, 'creationToolVersion', this.readAttribute(tuv, 'creationtoolversion') || (tu ? this.readAttribute(tu, 'creationtoolversion') : undefined));
|
|
180
|
+
const usageCount = this.parseNumber(tu ? this.readAttribute(tu, 'usagecount') : undefined);
|
|
181
|
+
if (usageCount !== undefined) {
|
|
182
|
+
metadata.usageCount = usageCount;
|
|
183
|
+
}
|
|
184
|
+
const lastUsage = this.readAttribute(tu, 'lastusagedate');
|
|
185
|
+
if (lastUsage) {
|
|
186
|
+
metadata.lastUsageDate = lastUsage;
|
|
187
|
+
}
|
|
188
|
+
const notes = [];
|
|
189
|
+
this.collectNotes(tu, notes);
|
|
190
|
+
this.collectNotes(tuv, notes);
|
|
191
|
+
if (notes.length > 0) {
|
|
192
|
+
metadata.notes = notes;
|
|
193
|
+
}
|
|
194
|
+
const properties = {};
|
|
195
|
+
this.collectProperties(tu, properties);
|
|
196
|
+
this.collectProperties(tuv, properties);
|
|
197
|
+
const segmentId = this.readSegmentIdProp(properties);
|
|
198
|
+
if (Object.keys(properties).length > 0) {
|
|
199
|
+
metadata.properties = properties;
|
|
200
|
+
const explicitContext = properties['x-context'] || properties['context'] || properties['domain'];
|
|
201
|
+
if (explicitContext) {
|
|
202
|
+
metadata.context = explicitContext;
|
|
203
|
+
}
|
|
204
|
+
const adjacencyContext = this.buildContextFromProperties(properties);
|
|
205
|
+
if (adjacencyContext) {
|
|
206
|
+
metadata.context = metadata.context
|
|
207
|
+
? metadata.context + ' | ' + adjacencyContext
|
|
208
|
+
: adjacencyContext;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
this.attachSegmentMetadata(metadata, segmentId || this.currentTu);
|
|
212
|
+
return metadata;
|
|
213
|
+
}
|
|
214
|
+
readAttribute(element, name) {
|
|
215
|
+
if (!element) {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
const attribute = element.getAttribute(name);
|
|
219
|
+
if (!attribute) {
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
const value = attribute.getValue();
|
|
223
|
+
return value.length > 0 ? value : undefined;
|
|
224
|
+
}
|
|
225
|
+
assignMetadataString(metadata, key, value) {
|
|
226
|
+
if (value) {
|
|
227
|
+
metadata[key] = value;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
parseNumber(value) {
|
|
231
|
+
if (!value) {
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
const parsed = Number(value);
|
|
235
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
236
|
+
}
|
|
237
|
+
collectNotes(element, accumulator) {
|
|
238
|
+
if (!element) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
element.getChildren().forEach((child) => {
|
|
242
|
+
if (child.getName() === 'note') {
|
|
243
|
+
const value = Utils.getPureText(child).trim();
|
|
244
|
+
if (value.length > 0) {
|
|
245
|
+
accumulator.push(value);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
collectProperties(element, accumulator) {
|
|
251
|
+
if (!element) {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
element.getChildren().forEach((child) => {
|
|
255
|
+
if (child.getName() === 'prop') {
|
|
256
|
+
const typeAttr = child.getAttribute('type')?.getValue();
|
|
257
|
+
const key = typeAttr ? typeAttr.trim() : '';
|
|
258
|
+
if (key.length === 0) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const value = Utils.getPureText(child).trim();
|
|
262
|
+
if (value.length > 0) {
|
|
263
|
+
accumulator[key] = value;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
hasMetadata(metadata) {
|
|
269
|
+
return !!metadata && Object.keys(metadata).length > 0;
|
|
270
|
+
}
|
|
271
|
+
buildContextFromProperties(properties) {
|
|
272
|
+
const prevValue = this.findDirectionalProperty(properties, /^prev-/i);
|
|
273
|
+
const nextValue = this.findDirectionalProperty(properties, /^next-/i);
|
|
274
|
+
const segments = [];
|
|
275
|
+
if (prevValue) {
|
|
276
|
+
segments.push('prev=' + this.describeSegmentReference(prevValue));
|
|
277
|
+
}
|
|
278
|
+
if (nextValue) {
|
|
279
|
+
segments.push('next=' + this.describeSegmentReference(nextValue));
|
|
280
|
+
}
|
|
281
|
+
return segments.length > 0 ? segments.join('; ') : undefined;
|
|
282
|
+
}
|
|
283
|
+
findDirectionalProperty(properties, pattern) {
|
|
284
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
285
|
+
if (pattern.test(key) && value.length > 0) {
|
|
286
|
+
return value;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return undefined;
|
|
290
|
+
}
|
|
291
|
+
readSegmentIdProp(properties) {
|
|
292
|
+
const propertyValue = properties['xliff-segment'];
|
|
293
|
+
if (!propertyValue) {
|
|
294
|
+
return undefined;
|
|
295
|
+
}
|
|
296
|
+
const trimmed = propertyValue.trim();
|
|
297
|
+
return trimmed.length === 0 ? undefined : trimmed;
|
|
298
|
+
}
|
|
299
|
+
attachSegmentMetadata(metadata, identifier) {
|
|
300
|
+
if (!identifier) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const parsed = this.parseSegmentIdentifier(identifier);
|
|
304
|
+
if (!parsed) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
metadata.segment = {
|
|
308
|
+
provider: 'xliff-segment',
|
|
309
|
+
segmentKey: identifier,
|
|
310
|
+
fileHash: parsed.fileHash,
|
|
311
|
+
fileId: parsed.fileId,
|
|
312
|
+
unitId: parsed.unitId,
|
|
313
|
+
segmentId: parsed.segmentId
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
describeSegmentReference(value) {
|
|
317
|
+
const parsed = this.parseSegmentIdentifier(value);
|
|
318
|
+
if (!parsed) {
|
|
319
|
+
return value;
|
|
320
|
+
}
|
|
321
|
+
return value + ' (file ' + parsed.fileId + ', unit ' + parsed.unitId + ', segment ' + parsed.segmentId + ')';
|
|
322
|
+
}
|
|
323
|
+
parseSegmentIdentifier(identifier) {
|
|
324
|
+
if (!identifier) {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
const trimmed = identifier.trim();
|
|
328
|
+
if (trimmed.length === 0) {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
331
|
+
const parts = trimmed.split('-');
|
|
332
|
+
if (parts.length < 4) {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
const tail = parts.slice(-3);
|
|
336
|
+
if (!tail.every((part) => /^\d+$/.test(part))) {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
return {
|
|
340
|
+
fileHash: parts.slice(0, -3).join('-'),
|
|
341
|
+
fileId: tail[0],
|
|
342
|
+
unitId: tail[1],
|
|
343
|
+
segmentId: tail[2]
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=tmxHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmxHandler.js","sourceRoot":"","sources":["../../ts/tmxHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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 { TMXHandler } from './tmxHandler.js';
|
|
15
|
+
export declare class TMXReader {
|
|
16
|
+
parser: SAXParser;
|
|
17
|
+
filePath: string;
|
|
18
|
+
handler: TMXHandler;
|
|
19
|
+
jsonlTempPath: string;
|
|
20
|
+
private readonly options;
|
|
21
|
+
constructor(filePath: string, options?: ImportOptions);
|
|
22
|
+
parse(): Promise<void>;
|
|
23
|
+
getTempFilePath(): string;
|
|
24
|
+
getEntryCount(): number;
|
|
25
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
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 { basename, join } from 'node:path';
|
|
14
|
+
import { SAXParser } from "typesxml";
|
|
15
|
+
import { DEFAULT_IMPORT_OPTIONS, resolveImportOptions } from './importOptions.js';
|
|
16
|
+
import { TMXHandler } from './tmxHandler.js';
|
|
17
|
+
export class TMXReader {
|
|
18
|
+
parser;
|
|
19
|
+
filePath;
|
|
20
|
+
handler;
|
|
21
|
+
jsonlTempPath;
|
|
22
|
+
options;
|
|
23
|
+
constructor(filePath, options = DEFAULT_IMPORT_OPTIONS) {
|
|
24
|
+
this.filePath = filePath;
|
|
25
|
+
this.options = resolveImportOptions(options);
|
|
26
|
+
const filename = basename(filePath);
|
|
27
|
+
// Generate temp file path for the JSONL output
|
|
28
|
+
const tempDir = tmpdir();
|
|
29
|
+
const tempFileName = 'tmx_' + Date.now() + '_' + Math.random().toString(36).substring(7) + '.jsonl';
|
|
30
|
+
this.jsonlTempPath = join(tempDir, tempFileName);
|
|
31
|
+
this.parser = new SAXParser();
|
|
32
|
+
this.handler = new TMXHandler(this.jsonlTempPath, filename, this.options);
|
|
33
|
+
this.parser.setContentHandler(this.handler);
|
|
34
|
+
}
|
|
35
|
+
async parse() {
|
|
36
|
+
try {
|
|
37
|
+
this.parser.parseFile(this.filePath);
|
|
38
|
+
await this.handler.waitForCompletion();
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
getTempFilePath() {
|
|
45
|
+
return this.jsonlTempPath;
|
|
46
|
+
}
|
|
47
|
+
getEntryCount() {
|
|
48
|
+
return this.handler.getEntryCount();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=tmxReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmxReader.js","sourceRoot":"","sources":["../../ts/tmxReader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iFAUiF;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAwC,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,SAAS;IAElB,MAAM,CAAY;IAClB,QAAQ,CAAS;IACjB,OAAO,CAAa;IACpB,aAAa,CAAS;IACL,OAAO,CAAwB;IAEhD,YAAY,QAAgB,EAAE,UAAyB,sBAAsB;QACzE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEpC,+CAA+C;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QACpG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;IAED,eAAe;QACX,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,aAAa;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC;CACJ"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare class TMXTest {
|
|
2
|
+
private static readonly NAME;
|
|
3
|
+
private static readonly DB_PATH;
|
|
4
|
+
private static readonly SAMPLE_TMX;
|
|
5
|
+
private static readonly SWORD_FISH_TMX;
|
|
6
|
+
runTest(): Promise<void>;
|
|
7
|
+
private resetEnvironment;
|
|
8
|
+
private verifyEntry;
|
|
9
|
+
private verifySegmentMetadata;
|
|
10
|
+
private expectTranslationMatch;
|
|
11
|
+
private expectConcordanceMatch;
|
|
12
|
+
private logConcordanceExample;
|
|
13
|
+
private verifyMetadataRoundtrip;
|
|
14
|
+
private verifyBatchImporterRoundtrip;
|
|
15
|
+
private assertMetadataEquals;
|
|
16
|
+
}
|