@keymanapp/kmc-package 17.0.85-alpha
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/.nyc_output/coverage-4892-1681239251006-0.json +1 -0
- package/Makefile +38 -0
- package/build/src/kmp-compiler.d.ts +18 -0
- package/build/src/kmp-compiler.d.ts.map +1 -0
- package/build/src/kmp-compiler.js +232 -0
- package/build/src/kmp-compiler.js.map +1 -0
- package/build/src/kmp-json-file.d.ts +68 -0
- package/build/src/kmp-json-file.d.ts.map +1 -0
- package/build/src/kmp-json-file.js +2 -0
- package/build/src/kmp-json-file.js.map +1 -0
- package/build/src/kps-file.d.ts +98 -0
- package/build/src/kps-file.d.ts.map +1 -0
- package/build/src/kps-file.js +16 -0
- package/build/src/kps-file.js.map +1 -0
- package/build/test/helpers/index.d.ts +10 -0
- package/build/test/helpers/index.d.ts.map +1 -0
- package/build/test/helpers/index.js +17 -0
- package/build/test/helpers/index.js.map +1 -0
- package/build/test/test-package-compiler.d.ts +2 -0
- package/build/test/test-package-compiler.d.ts.map +1 -0
- package/build/test/test-package-compiler.js +97 -0
- package/build/test/test-package-compiler.js.map +1 -0
- package/build/test/tsconfig.tsbuildinfo +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/build.sh +66 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +146 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/kmp-compiler.ts.html +904 -0
- package/coverage/lcov-report/test/helpers/index.html +116 -0
- package/coverage/lcov-report/test/helpers/index.ts.html +136 -0
- package/coverage/lcov-report/test/index.html +116 -0
- package/coverage/lcov-report/test/test-package-compiler.ts.html +445 -0
- package/coverage/lcov.info +518 -0
- package/package.json +54 -0
- package/src/kmp-compiler.ts +273 -0
- package/src/kmp-json-file.ts +77 -0
- package/src/kps-file.ts +126 -0
- package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.js +55 -0
- package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kmp.intermediate.json +48 -0
- package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kmp.json +48 -0
- package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kmp.zipped.json +45 -0
- package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kps +35 -0
- package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.ts +6 -0
- package/test/fixtures/example.qaa.sencoten/wordlist.tsv +10 -0
- package/test/fixtures/khmer_angkor/build/khmer_angkor.js +1 -0
- package/test/fixtures/khmer_angkor/build/khmer_angkor.kmx +0 -0
- package/test/fixtures/khmer_angkor/build/khmer_angkor.kvk +0 -0
- package/test/fixtures/khmer_angkor/ref/kmp.json +110 -0
- package/test/fixtures/khmer_angkor/shared/fonts/khmer/busrakbd/khmer_busra_kbd.ttf +0 -0
- package/test/fixtures/khmer_angkor/shared/fonts/khmer/mondulkiri/FONTLOG.txt +123 -0
- package/test/fixtures/khmer_angkor/shared/fonts/khmer/mondulkiri/Mondulkiri-R.ttf +0 -0
- package/test/fixtures/khmer_angkor/shared/fonts/khmer/mondulkiri/OFL-FAQ.txt +425 -0
- package/test/fixtures/khmer_angkor/shared/fonts/khmer/mondulkiri/OFL.txt +95 -0
- package/test/fixtures/khmer_angkor/source/khmer_angkor.kps +131 -0
- package/test/fixtures/khmer_angkor/source/readme.htm +23 -0
- package/test/fixtures/khmer_angkor/source/splash.gif +0 -0
- package/test/fixtures/khmer_angkor/source/welcome/KAK_Documentation_EN.pdf +0 -0
- package/test/fixtures/khmer_angkor/source/welcome/KAK_Documentation_KH.pdf +0 -0
- package/test/fixtures/khmer_angkor/source/welcome/image002.png +0 -0
- package/test/fixtures/khmer_angkor/source/welcome/keyboard_layout.png +0 -0
- package/test/fixtures/khmer_angkor/source/welcome/welcome.htm +54 -0
- package/test/fixtures/withfolders.qaa.sencoten/build/withfolders.qaa.sencoten.model.js +55 -0
- package/test/fixtures/withfolders.qaa.sencoten/source/welcome.htm +1 -0
- package/test/fixtures/withfolders.qaa.sencoten/source/withfolders.qaa.sencoten.model.kps +41 -0
- package/test/fixtures/withfolders.qaa.sencoten/source/withfolders.qaa.sencoten.model.ts +6 -0
- package/test/fixtures/withfolders.qaa.sencoten/source/wordlist.tsv +10 -0
- package/test/fixtures/withfolders.qaa.sencoten/withfolders.qaa.sencoten.model.kmp.intermediate.json +52 -0
- package/test/fixtures/withfolders.qaa.sencoten/withfolders.qaa.sencoten.model.kmp.zipped.json +50 -0
- package/test/helpers/index.ts +17 -0
- package/test/test-package-compiler.ts +120 -0
- package/test/tsconfig.json +19 -0
- package/tsconfig.json +15 -0
package/Makefile
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Keyman Developer - kmc Package Compiler Makefile
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
!include ..\Defines.mak
|
|
6
|
+
|
|
7
|
+
# We don't depend on configure here because kmc-keyboard does that already
|
|
8
|
+
build: .virtual
|
|
9
|
+
$(GIT_BASH_FOR_KEYMAN) build.sh build
|
|
10
|
+
|
|
11
|
+
configure: .virtual
|
|
12
|
+
$(GIT_BASH_FOR_KEYMAN) build.sh configure
|
|
13
|
+
|
|
14
|
+
clean: .virtual
|
|
15
|
+
$(GIT_BASH_FOR_KEYMAN) build.sh clean
|
|
16
|
+
|
|
17
|
+
test: .virtual
|
|
18
|
+
$(GIT_BASH_FOR_KEYMAN) build.sh test
|
|
19
|
+
|
|
20
|
+
# build.sh bundle must be run from shell as it requires a temp folder to be
|
|
21
|
+
# passed in. See inst/download.in.mak for instantiation.
|
|
22
|
+
|
|
23
|
+
publish: .virtual
|
|
24
|
+
$(GIT_BASH_FOR_KEYMAN) build.sh publish
|
|
25
|
+
|
|
26
|
+
signcode:
|
|
27
|
+
@rem nothing to do
|
|
28
|
+
|
|
29
|
+
wrap-symbols:
|
|
30
|
+
@rem nothing to do
|
|
31
|
+
|
|
32
|
+
test-manifest:
|
|
33
|
+
@rem nothing to do
|
|
34
|
+
|
|
35
|
+
install:
|
|
36
|
+
@rem nothing to do
|
|
37
|
+
|
|
38
|
+
!include ..\Target.mak
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { KmpJsonFile } from './kmp-json-file.js';
|
|
2
|
+
export { type KmpJsonFile } from './kmp-json-file.js';
|
|
3
|
+
export default class KmpCompiler {
|
|
4
|
+
transformKpsToKmpObject(kpsString: string, kpsPath: string): KmpJsonFile;
|
|
5
|
+
private kpsInfoToKmpInfo;
|
|
6
|
+
private arrayWrap;
|
|
7
|
+
private kpsLanguagesToKmpLanguages;
|
|
8
|
+
private extractKeyboardVersionFromKmx;
|
|
9
|
+
private stripUndefined;
|
|
10
|
+
/**
|
|
11
|
+
* Returns a Promise to the serialized data which can then be written to a .kmp file.
|
|
12
|
+
*
|
|
13
|
+
* @param kpsFilename - Filename of the kps, not read, used only for calculating relative paths
|
|
14
|
+
* @param kmpJsonData - The kmp.json Object
|
|
15
|
+
*/
|
|
16
|
+
buildKmpFile(kpsFilename: string, kmpJsonData: KmpJsonFile): Promise<string>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=kmp-compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kmp-compiler.d.ts","sourceRoot":"","sources":["../../src/kmp-compiler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAA4D,MAAM,oBAAoB,CAAC;AAEhH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,CAAC,OAAO,OAAO,WAAW;IAEvB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW;IAiJ/E,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,6BAA6B;IAcrC,OAAO,CAAC,cAAc;IAWtB;;;;;OAKG;IACI,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAiDpF"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as xml2js from 'xml2js';
|
|
4
|
+
import JSZip from 'jszip';
|
|
5
|
+
import KEYMAN_VERSION from "@keymanapp/keyman-version";
|
|
6
|
+
const FILEVERSION_KMP_JSON = '12.0';
|
|
7
|
+
export default class KmpCompiler {
|
|
8
|
+
transformKpsToKmpObject(kpsString, kpsPath) {
|
|
9
|
+
// Load the KPS data from XML as JS structured data.
|
|
10
|
+
let kpsPackage = (() => {
|
|
11
|
+
let a;
|
|
12
|
+
let parser = new xml2js.Parser({
|
|
13
|
+
tagNameProcessors: [xml2js.processors.firstCharLowerCase],
|
|
14
|
+
explicitArray: false
|
|
15
|
+
});
|
|
16
|
+
parser.parseString(kpsString, (e, r) => { a = r; });
|
|
17
|
+
return a;
|
|
18
|
+
})();
|
|
19
|
+
let kps = kpsPackage.package;
|
|
20
|
+
//
|
|
21
|
+
// To convert to kmp.json, we need to:
|
|
22
|
+
//
|
|
23
|
+
// 1. Unwrap arrays (and convert to array where single object)
|
|
24
|
+
// 2. Fix casing on `iD`
|
|
25
|
+
// 3. Rewrap info, keyboard.languages, lexicalModel.languages, startMenu.items elements
|
|
26
|
+
// 4. Remove options.followKeyboardVersion, file.fileType
|
|
27
|
+
// 5. Convert file.copyLocation to a Number
|
|
28
|
+
// 6. Filenames need to be basenames (but this comes after processing)
|
|
29
|
+
//
|
|
30
|
+
// Start to construct the kmp.json file from the .kps file
|
|
31
|
+
let kmp = {
|
|
32
|
+
system: {
|
|
33
|
+
fileVersion: FILEVERSION_KMP_JSON,
|
|
34
|
+
keymanDeveloperVersion: KEYMAN_VERSION.VERSION
|
|
35
|
+
},
|
|
36
|
+
options: {}
|
|
37
|
+
};
|
|
38
|
+
//
|
|
39
|
+
// Fill in additional fields
|
|
40
|
+
//
|
|
41
|
+
let keys = [
|
|
42
|
+
['executeProgram', 'executeProgram'],
|
|
43
|
+
['graphicFile', 'graphicFile'],
|
|
44
|
+
['msiFileName', 'msiFilename'],
|
|
45
|
+
['msiOptions', 'msiOptions'],
|
|
46
|
+
['readMeFile', 'readmeFile']
|
|
47
|
+
];
|
|
48
|
+
for (let [src, dst] of keys) {
|
|
49
|
+
if (kps.options[src]) {
|
|
50
|
+
kmp.options[dst] = kps.options[src];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//
|
|
54
|
+
// Add basic metadata
|
|
55
|
+
//
|
|
56
|
+
if (kps.info) {
|
|
57
|
+
kmp.info = this.kpsInfoToKmpInfo(kps.info);
|
|
58
|
+
}
|
|
59
|
+
// FollowKeyboardVersion support
|
|
60
|
+
if (kps.options?.followKeyboardVersion !== undefined) {
|
|
61
|
+
kmp.info.version = {
|
|
62
|
+
description: this.extractKeyboardVersionFromKmx(kpsPath, kps)
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//
|
|
66
|
+
// Add file metadata
|
|
67
|
+
//
|
|
68
|
+
if (kps.files && kps.files.file) {
|
|
69
|
+
kmp.files = this.arrayWrap(kps.files.file).map((file) => {
|
|
70
|
+
return {
|
|
71
|
+
name: file.name,
|
|
72
|
+
description: file.description,
|
|
73
|
+
copyLocation: parseInt(file.copyLocation, 10) || undefined
|
|
74
|
+
// note: we don't emit fileType as that is not permitted in kmp.json
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
kmp.files = kmp.files ?? [];
|
|
79
|
+
// Add the standard kmp.json self-referential to match existing implementations
|
|
80
|
+
kmp.files.push({
|
|
81
|
+
name: "kmp.json",
|
|
82
|
+
description: "Package information (JSON)"
|
|
83
|
+
});
|
|
84
|
+
//
|
|
85
|
+
// Add keyboard metadata
|
|
86
|
+
//
|
|
87
|
+
if (kps.keyboards && kps.keyboards.keyboard) {
|
|
88
|
+
kmp.keyboards = this.arrayWrap(kps.keyboards.keyboard).map((keyboard) => {
|
|
89
|
+
return {
|
|
90
|
+
displayFont: keyboard.displayFont ? path.basename(keyboard.displayFont.replaceAll('\\', '/')) : undefined,
|
|
91
|
+
oskFont: keyboard.oSKFont ? path.basename(keyboard.oSKFont.replaceAll('\\', '/')) : undefined,
|
|
92
|
+
name: keyboard.name,
|
|
93
|
+
id: keyboard.iD,
|
|
94
|
+
version: keyboard.version,
|
|
95
|
+
languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(keyboard.languages.language))
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//
|
|
100
|
+
// Add lexical-model metadata
|
|
101
|
+
//
|
|
102
|
+
if (kps.lexicalModels && kps.lexicalModels.lexicalModel) {
|
|
103
|
+
kmp.lexicalModels = this.arrayWrap(kps.lexicalModels.lexicalModel).map((model) => {
|
|
104
|
+
return { name: model.name, id: model.iD, languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(model.languages.language)) };
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//
|
|
108
|
+
// Add Windows Start Menu metadata
|
|
109
|
+
//
|
|
110
|
+
if (kps.startMenu && kps.startMenu.items) {
|
|
111
|
+
kmp.startMenu = {};
|
|
112
|
+
if (kps.startMenu.addUninstallEntry)
|
|
113
|
+
kmp.startMenu.addUninstallEntry = kps.startMenu.addUninstallEntry === '';
|
|
114
|
+
if (kps.startMenu.folder)
|
|
115
|
+
kmp.startMenu.folder = kps.startMenu.folder;
|
|
116
|
+
if (kps.startMenu.items && kps.startMenu.items.item)
|
|
117
|
+
kmp.startMenu.items = this.arrayWrap(kps.startMenu.items.item);
|
|
118
|
+
}
|
|
119
|
+
//
|
|
120
|
+
// Add translation strings
|
|
121
|
+
//
|
|
122
|
+
if (kps.strings && kps.strings.string) {
|
|
123
|
+
kmp.strings = this.arrayWrap(kps.strings.string);
|
|
124
|
+
}
|
|
125
|
+
kmp = this.stripUndefined(kmp);
|
|
126
|
+
return kmp;
|
|
127
|
+
}
|
|
128
|
+
// Helper functions
|
|
129
|
+
kpsInfoToKmpInfo(info) {
|
|
130
|
+
let ni = {};
|
|
131
|
+
const keys = [
|
|
132
|
+
['author', 'author'],
|
|
133
|
+
['copyright', 'copyright'],
|
|
134
|
+
['name', 'name'],
|
|
135
|
+
['version', 'version'],
|
|
136
|
+
['webSite', 'website']
|
|
137
|
+
];
|
|
138
|
+
for (let [src, dst] of keys) {
|
|
139
|
+
if (info[src]) {
|
|
140
|
+
ni[dst] = { description: info[src]._ ?? (typeof info[src] == 'string' ? info[src].toString() : '') };
|
|
141
|
+
if (info[src].$ && info[src].$.URL)
|
|
142
|
+
ni[dst].url = info[src].$.URL;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return ni;
|
|
146
|
+
}
|
|
147
|
+
;
|
|
148
|
+
arrayWrap(a) {
|
|
149
|
+
if (Array.isArray(a)) {
|
|
150
|
+
return a;
|
|
151
|
+
}
|
|
152
|
+
return [a];
|
|
153
|
+
}
|
|
154
|
+
;
|
|
155
|
+
kpsLanguagesToKmpLanguages(language) {
|
|
156
|
+
return language.map((element) => { return { name: element._, id: element.$.ID }; });
|
|
157
|
+
}
|
|
158
|
+
;
|
|
159
|
+
extractKeyboardVersionFromKmx(kpsPath, kps) {
|
|
160
|
+
// TODO-LDML: #7340 this is incomplete; we need to read from first .kmx
|
|
161
|
+
// When we do this, we'll need to update fixtures to have the correct
|
|
162
|
+
// version string also
|
|
163
|
+
if (!kps.keyboards || !kps.keyboards.keyboard) {
|
|
164
|
+
// We don't read from the kps metadata because we want the keyboard
|
|
165
|
+
// version data here;
|
|
166
|
+
// TODO: currently model files don't support follow-version?
|
|
167
|
+
return '0.0.0';
|
|
168
|
+
}
|
|
169
|
+
let k = this.arrayWrap(kps.keyboards.keyboard);
|
|
170
|
+
return k?.[0]?.version ?? '0.0.0';
|
|
171
|
+
}
|
|
172
|
+
stripUndefined(o) {
|
|
173
|
+
for (const key in o) {
|
|
174
|
+
if (o[key] === undefined) {
|
|
175
|
+
delete o[key];
|
|
176
|
+
}
|
|
177
|
+
else if (typeof o[key] == 'object') {
|
|
178
|
+
o[key] = this.stripUndefined(o[key]);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return o;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Returns a Promise to the serialized data which can then be written to a .kmp file.
|
|
185
|
+
*
|
|
186
|
+
* @param kpsFilename - Filename of the kps, not read, used only for calculating relative paths
|
|
187
|
+
* @param kmpJsonData - The kmp.json Object
|
|
188
|
+
*/
|
|
189
|
+
buildKmpFile(kpsFilename, kmpJsonData) {
|
|
190
|
+
const zip = JSZip();
|
|
191
|
+
const kmpJsonFileName = 'kmp.json';
|
|
192
|
+
const basePath = path.dirname(kpsFilename);
|
|
193
|
+
// Make a copy of kmpJsonData, as we mutate paths for writing
|
|
194
|
+
const data = JSON.parse(JSON.stringify(kmpJsonData));
|
|
195
|
+
if (!data.files) {
|
|
196
|
+
data.files = [];
|
|
197
|
+
}
|
|
198
|
+
data.files.forEach(function (value) {
|
|
199
|
+
// Get the path of the file
|
|
200
|
+
let filename = value.name;
|
|
201
|
+
// We add this separately after zipping all other files
|
|
202
|
+
if (filename == 'kmp.json') {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (path.isAbsolute(value.name)) {
|
|
206
|
+
// absolute paths are not very cross-platform compatible -- we are going to have trouble
|
|
207
|
+
// with path separators and roots
|
|
208
|
+
// TODO: emit a warning
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// Transform separators to platform separators -- kps files may use
|
|
212
|
+
// either / or \, although older kps files were always \.
|
|
213
|
+
if (path.sep == '/') {
|
|
214
|
+
filename = filename.replace(/\\/g, '/');
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
filename = filename.replace(/\//g, '\\');
|
|
218
|
+
}
|
|
219
|
+
filename = path.resolve(basePath, filename);
|
|
220
|
+
}
|
|
221
|
+
const basename = path.basename(filename);
|
|
222
|
+
let data = fs.readFileSync(filename);
|
|
223
|
+
zip.file(basename, data);
|
|
224
|
+
// Remove path data from files before JSON save
|
|
225
|
+
value.name = basename;
|
|
226
|
+
});
|
|
227
|
+
zip.file(kmpJsonFileName, JSON.stringify(data, null, 2));
|
|
228
|
+
// Generate kmp file
|
|
229
|
+
return zip.generateAsync({ type: 'binarystring', compression: 'DEFLATE' });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=kmp-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kmp-compiler.js","sourceRoot":"","sources":["../../src/kmp-compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export interface KmpJsonFile {
|
|
2
|
+
system: KmpJsonFileSystem;
|
|
3
|
+
options: KmpJsonFileOptions;
|
|
4
|
+
info?: KmpJsonFileInfo;
|
|
5
|
+
files?: KmpJsonFileContentFile[];
|
|
6
|
+
lexicalModels?: KmpJsonFileLexicalModel[];
|
|
7
|
+
startMenu?: KmpJsonFileStartMenu;
|
|
8
|
+
keyboards?: KmpJsonFileKeyboard[];
|
|
9
|
+
strings?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface KmpJsonFileSystem {
|
|
12
|
+
keymanDeveloperVersion: string;
|
|
13
|
+
fileVersion: string;
|
|
14
|
+
}
|
|
15
|
+
export interface KmpJsonFileOptions {
|
|
16
|
+
readmeFile?: string;
|
|
17
|
+
graphicFile?: string;
|
|
18
|
+
executeProgram?: string;
|
|
19
|
+
msiFilename?: string;
|
|
20
|
+
msiOptions?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface KmpJsonFileInfo {
|
|
23
|
+
website?: KmpJsonFileInfoItem;
|
|
24
|
+
version?: KmpJsonFileInfoItem;
|
|
25
|
+
name?: KmpJsonFileInfoItem;
|
|
26
|
+
copyright?: KmpJsonFileInfoItem;
|
|
27
|
+
author?: KmpJsonFileInfoItem;
|
|
28
|
+
}
|
|
29
|
+
export interface KmpJsonFileInfoItem {
|
|
30
|
+
description: string;
|
|
31
|
+
url?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface KmpJsonFileContentFile {
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
copyLocation?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface KmpJsonFileLexicalModel {
|
|
39
|
+
name: string;
|
|
40
|
+
id: string;
|
|
41
|
+
languages: KmpJsonFileLanguage[];
|
|
42
|
+
}
|
|
43
|
+
export interface KmpJsonFileLanguage {
|
|
44
|
+
name: string;
|
|
45
|
+
id: string;
|
|
46
|
+
}
|
|
47
|
+
export interface KmpJsonFileKeyboard {
|
|
48
|
+
name: string;
|
|
49
|
+
id: string;
|
|
50
|
+
version: string;
|
|
51
|
+
oskFont?: string;
|
|
52
|
+
displayFont?: string;
|
|
53
|
+
rtl?: boolean;
|
|
54
|
+
languages?: KmpJsonFileLanguage[];
|
|
55
|
+
}
|
|
56
|
+
export interface KmpJsonFileStartMenu {
|
|
57
|
+
folder?: string;
|
|
58
|
+
addUninstallEntry?: boolean;
|
|
59
|
+
items?: KmpJsonFileStartMenuItem[];
|
|
60
|
+
}
|
|
61
|
+
export interface KmpJsonFileStartMenuItem {
|
|
62
|
+
name: string;
|
|
63
|
+
filename: string;
|
|
64
|
+
arguments?: string;
|
|
65
|
+
icon?: string;
|
|
66
|
+
location?: string;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=kmp-json-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kmp-json-file.d.ts","sourceRoot":"","sources":["../../src/kmp-json-file.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,wBAAwB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kmp-json-file.js","sourceRoot":"","sources":["../../src/kmp-json-file.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export interface KpsPackage {
|
|
2
|
+
/**
|
|
3
|
+
* <Package> -- the root element.
|
|
4
|
+
*/
|
|
5
|
+
package: KpsFile;
|
|
6
|
+
}
|
|
7
|
+
export interface KpsFile {
|
|
8
|
+
system: KpsFileSystem;
|
|
9
|
+
options: KpsFileOptions;
|
|
10
|
+
info?: KpsFileInfo;
|
|
11
|
+
files?: KpsFileContentFiles;
|
|
12
|
+
keyboards?: KpsFileKeyboards;
|
|
13
|
+
lexicalModels?: KpsFileLexicalModels;
|
|
14
|
+
startMenu?: KpsFileStartMenu;
|
|
15
|
+
strings?: KpsFileStrings;
|
|
16
|
+
}
|
|
17
|
+
export interface KpsFileSystem {
|
|
18
|
+
keymanDeveloperVersion: string;
|
|
19
|
+
fileVersion: string;
|
|
20
|
+
}
|
|
21
|
+
export interface KpsFileOptions {
|
|
22
|
+
followKeyboardVersion?: string;
|
|
23
|
+
readMeFile?: string;
|
|
24
|
+
graphicFile?: string;
|
|
25
|
+
executeProgram?: string;
|
|
26
|
+
msiFileName?: string;
|
|
27
|
+
msiOptions?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface KpsFileInfo {
|
|
30
|
+
name?: KpsFileInfoItem;
|
|
31
|
+
copyright?: KpsFileInfoItem;
|
|
32
|
+
author?: KpsFileInfoItem;
|
|
33
|
+
webSite?: KpsFileInfoItem;
|
|
34
|
+
version?: KpsFileInfoItem;
|
|
35
|
+
}
|
|
36
|
+
export interface KpsFileInfoItem {
|
|
37
|
+
_: string;
|
|
38
|
+
$: {
|
|
39
|
+
URL: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface KpsFileContentFiles {
|
|
43
|
+
file: KpsFileContentFile[] | KpsFileContentFile;
|
|
44
|
+
}
|
|
45
|
+
export interface KpsFileContentFile {
|
|
46
|
+
name: string;
|
|
47
|
+
description: string;
|
|
48
|
+
copyLocation: string;
|
|
49
|
+
fileType: string;
|
|
50
|
+
}
|
|
51
|
+
export interface KpsFileLexicalModel {
|
|
52
|
+
name: string;
|
|
53
|
+
iD: string;
|
|
54
|
+
languages: KpsFileLanguages;
|
|
55
|
+
}
|
|
56
|
+
export interface KpsFileLexicalModels {
|
|
57
|
+
lexicalModel: KpsFileLexicalModel[] | KpsFileLexicalModel;
|
|
58
|
+
}
|
|
59
|
+
export interface KpsFileLanguages {
|
|
60
|
+
language: KpsFileLanguage[] | KpsFileLanguage;
|
|
61
|
+
}
|
|
62
|
+
export interface KpsFileLanguage {
|
|
63
|
+
_: string;
|
|
64
|
+
$: {
|
|
65
|
+
ID: string;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export interface KpsFileKeyboard {
|
|
69
|
+
name: string;
|
|
70
|
+
iD: string;
|
|
71
|
+
version: string;
|
|
72
|
+
oSKFont?: string;
|
|
73
|
+
displayFont?: string;
|
|
74
|
+
rtl?: boolean;
|
|
75
|
+
languages?: KpsFileLanguages;
|
|
76
|
+
}
|
|
77
|
+
export interface KpsFileKeyboards {
|
|
78
|
+
keyboard: KpsFileKeyboard[] | KpsFileKeyboard;
|
|
79
|
+
}
|
|
80
|
+
export interface KpsFileStartMenu {
|
|
81
|
+
folder?: string;
|
|
82
|
+
addUninstallEntry?: string;
|
|
83
|
+
items?: KpsFileStartMenuItems;
|
|
84
|
+
}
|
|
85
|
+
export interface KpsFileStartMenuItem {
|
|
86
|
+
name: string;
|
|
87
|
+
filename: string;
|
|
88
|
+
arguments?: string;
|
|
89
|
+
icon?: string;
|
|
90
|
+
location?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface KpsFileStartMenuItems {
|
|
93
|
+
item: KpsFileStartMenuItem[] | KpsFileStartMenuItem;
|
|
94
|
+
}
|
|
95
|
+
export interface KpsFileStrings {
|
|
96
|
+
string: string[] | string;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=kps-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kps-file.d.ts","sourceRoot":"","sources":["../../src/kps-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//
|
|
2
|
+
// The interfaces in this file are designed with reference to the
|
|
3
|
+
// mapped structures produced by xml2js when passed a .kps file.
|
|
4
|
+
//
|
|
5
|
+
// A few notes:
|
|
6
|
+
//
|
|
7
|
+
// * Casing is updated to camelCase during load (leaving `iD` as a
|
|
8
|
+
// mixed up beastie).
|
|
9
|
+
// * Arrays are buried a layer too deep (e.g. <Files><File/><File/></Files>
|
|
10
|
+
// leads to KpsFiles.KpsFile[]
|
|
11
|
+
// * Properties such as used in Info Items use `_` and `$` and must be
|
|
12
|
+
// extracted.
|
|
13
|
+
// * Strings element is not yet checked to be correct
|
|
14
|
+
//
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=kps-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kps-file.js","sourceRoot":"","sources":["../../src/kps-file.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,iEAAiE;AACjE,gEAAgE;AAChE,EAAE;AACF,eAAe;AACf,EAAE;AACF,kEAAkE;AAClE,uBAAuB;AACvB,2EAA2E;AAC3E,gCAAgC;AAChC,sEAAsE;AACtE,eAAe;AACf,qDAAqD;AACrD,EAAE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a path to the fixture with the given path components.
|
|
3
|
+
*
|
|
4
|
+
* e.g., makePathToFixture('example.qaa.trivial')
|
|
5
|
+
* e.g., makePathToFixture('example.qaa.trivial', 'model.ts')
|
|
6
|
+
*
|
|
7
|
+
* @param components One or more path components.
|
|
8
|
+
*/
|
|
9
|
+
export declare function makePathToFixture(...components: string[]): string;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../test/helpers/index.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACF,wBAAgB,iBAAiB,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers and utilities for the Mocha tests.
|
|
3
|
+
*/
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
/**
|
|
7
|
+
* Builds a path to the fixture with the given path components.
|
|
8
|
+
*
|
|
9
|
+
* e.g., makePathToFixture('example.qaa.trivial')
|
|
10
|
+
* e.g., makePathToFixture('example.qaa.trivial', 'model.ts')
|
|
11
|
+
*
|
|
12
|
+
* @param components One or more path components.
|
|
13
|
+
*/
|
|
14
|
+
export function makePathToFixture(...components) {
|
|
15
|
+
return fileURLToPath(new URL(path.join('..', '..', '..', 'test', 'fixtures', ...components), import.meta.url));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../test/helpers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC;;;;;;;GAOG;AACF,MAAM,UAAU,iBAAiB,CAAC,GAAG,UAAoB;IACxD,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACjH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-package-compiler.d.ts","sourceRoot":"","sources":["../../test/test-package-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import 'mocha';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import { assert } from 'chai';
|
|
4
|
+
import KmpCompiler from '../src/kmp-compiler.js';
|
|
5
|
+
import { makePathToFixture } from './helpers/index.js';
|
|
6
|
+
import JSZip from 'jszip';
|
|
7
|
+
import KEYMAN_VERSION from "@keymanapp/keyman-version";
|
|
8
|
+
describe('KmpCompiler', function () {
|
|
9
|
+
const MODELS = [
|
|
10
|
+
'example.qaa.sencoten',
|
|
11
|
+
'withfolders.qaa.sencoten',
|
|
12
|
+
];
|
|
13
|
+
let kmpCompiler = new KmpCompiler();
|
|
14
|
+
for (let modelID of MODELS) {
|
|
15
|
+
const kpsPath = modelID.includes('withfolders') ?
|
|
16
|
+
makePathToFixture(modelID, 'source', `${modelID}.model.kps`) : makePathToFixture(modelID, `${modelID}.model.kps`);
|
|
17
|
+
const jsPath = modelID.includes('withfolders') ?
|
|
18
|
+
makePathToFixture(modelID, 'source', `${modelID}.model.js`) : makePathToFixture(modelID, `${modelID}.model.js`);
|
|
19
|
+
const kmpJsonIntermediatePath = makePathToFixture(modelID, `${modelID}.model.kmp.intermediate.json`);
|
|
20
|
+
const kmpJsonZippedPath = makePathToFixture(modelID, `${modelID}.model.kmp.zipped.json`);
|
|
21
|
+
const kmpJsonIntermediateFixture = JSON.parse(fs.readFileSync(kmpJsonIntermediatePath, 'utf-8'));
|
|
22
|
+
const kmpJsonZippedFixture = JSON.parse(fs.readFileSync(kmpJsonZippedPath, 'utf-8'));
|
|
23
|
+
// We override the fixture version so that we can compare with the compiler output
|
|
24
|
+
kmpJsonIntermediateFixture.system.keymanDeveloperVersion = KEYMAN_VERSION.VERSION;
|
|
25
|
+
//
|
|
26
|
+
// Test just the transform from kps to kmp.json
|
|
27
|
+
//
|
|
28
|
+
it(`should transform ${modelID}.model.kps to kmp.json`, function () {
|
|
29
|
+
let source = fs.readFileSync(kpsPath, 'utf-8');
|
|
30
|
+
let kmpJson;
|
|
31
|
+
assert.doesNotThrow(() => {
|
|
32
|
+
kmpJson = kmpCompiler.transformKpsToKmpObject(source, kpsPath);
|
|
33
|
+
});
|
|
34
|
+
// Test that the kmp.json data is identical
|
|
35
|
+
assert.deepEqual(kmpJson, kmpJsonIntermediateFixture);
|
|
36
|
+
// Note that in-memory kmp.json still contains paths in the files array.
|
|
37
|
+
// However, when building the .kmp, the final written kmp.json data is
|
|
38
|
+
// modified to strip paths.
|
|
39
|
+
// This was used when building initial test data
|
|
40
|
+
//fs.writeFileSync(kmpJsonPath, JSON.stringify(kmpJson), 'utf-8');
|
|
41
|
+
});
|
|
42
|
+
it(`should build a full .kmp for ${modelID}`, async function () {
|
|
43
|
+
const source = fs.readFileSync(kpsPath, 'utf-8');
|
|
44
|
+
const zip = JSZip();
|
|
45
|
+
// Build kmp.json in memory
|
|
46
|
+
const kmpJson = kmpCompiler.transformKpsToKmpObject(source, kpsPath);
|
|
47
|
+
// Build file.kmp in memory
|
|
48
|
+
const promise = kmpCompiler.buildKmpFile(kpsPath, kmpJson);
|
|
49
|
+
promise.then(data => {
|
|
50
|
+
// Check that file.kmp contains just 2 files - kmp.json and file.model.js,
|
|
51
|
+
// and that they match exactly what we expect
|
|
52
|
+
return zip.loadAsync(data, { checkCRC32: true }).then(zipFile => {
|
|
53
|
+
assert.equal(zipFile.length, 2);
|
|
54
|
+
return Promise.all([
|
|
55
|
+
zipFile.file("kmp.json").async('uint8array').then(kmpJsonOutput => {
|
|
56
|
+
assert.deepEqual(kmpJsonOutput, kmpJsonZippedFixture);
|
|
57
|
+
}),
|
|
58
|
+
zipFile.file(`${modelID}.model.js`).async('uint8array').then(modelJsFile => {
|
|
59
|
+
assert.deepEqual(modelJsFile, fs.readFileSync(jsPath));
|
|
60
|
+
})
|
|
61
|
+
]);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
return promise;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
it('should generates a valid .kmp (zip) file', async function () {
|
|
68
|
+
// const kmpPath = makePathToFixture('khmer_angkor', 'build', 'khmer_angkor.kmp');
|
|
69
|
+
const kpsPath = makePathToFixture('khmer_angkor', 'source', 'khmer_angkor.kps');
|
|
70
|
+
const kmpJsonRefPath = makePathToFixture('khmer_angkor', 'ref', 'kmp.json');
|
|
71
|
+
const kmpCompiler = new KmpCompiler();
|
|
72
|
+
const source = fs.readFileSync(kpsPath, 'utf-8');
|
|
73
|
+
const kmpJsonFixture = JSON.parse(fs.readFileSync(kmpJsonRefPath, 'utf-8'));
|
|
74
|
+
// We override the fixture version so that we can compare with the compiler output
|
|
75
|
+
kmpJsonFixture.system.keymanDeveloperVersion = KEYMAN_VERSION.VERSION;
|
|
76
|
+
let kmpJson = null;
|
|
77
|
+
assert.doesNotThrow(() => {
|
|
78
|
+
kmpJson = kmpCompiler.transformKpsToKmpObject(source, kpsPath);
|
|
79
|
+
});
|
|
80
|
+
const kmpData = await kmpCompiler.buildKmpFile(kpsPath, kmpJson);
|
|
81
|
+
const zip = JSZip();
|
|
82
|
+
let jszip = await zip.loadAsync(kmpData);
|
|
83
|
+
assert.isNotNull(jszip.file('kmp.json')); // kmp.json should be present
|
|
84
|
+
// kmp file should contain the following files
|
|
85
|
+
const expectedFiles = [
|
|
86
|
+
'FONTLOG.txt', 'image002.png', 'KAK_Documentation_EN.pdf', 'KAK_Documentation_KH.pdf',
|
|
87
|
+
'keyboard_layout.png', 'khmer_angkor.js', 'khmer_angkor.kmx', 'khmer_angkor.kvk',
|
|
88
|
+
'khmer_busra_kbd.ttf', 'Mondulkiri-R.ttf', 'OFL.txt', 'OFL-FAQ.txt', 'readme.htm',
|
|
89
|
+
'splash.gif', 'welcome.htm',
|
|
90
|
+
'kmp.json', // standard .kmp metadata file
|
|
91
|
+
];
|
|
92
|
+
assert.sameMembers(Object.entries(jszip.files).map(([s, o]) => o.name).sort(), expectedFiles.sort(), 'khmer_angkor.kmp file should have exactly the expected files');
|
|
93
|
+
let kmpJsonData = JSON.parse(await jszip.file('kmp.json').async('string'));
|
|
94
|
+
assert.deepEqual(kmpJsonData, kmpJsonFixture);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=test-package-compiler.js.map
|