mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-08 09:55:32 +00:00
chore(developer): move package formats to common/web/types
Package file interfaces were stored in developer/kmc-package but belong better now in common/web/types.
This commit is contained in:
parent
3b1c484538
commit
53ccdbe241
6 changed files with 31 additions and 31 deletions
|
|
@ -29,4 +29,8 @@ export * as KPJ from './kpj/kpj-file.js';
|
|||
export { KPJFileReader } from './kpj/kpj-file-reader.js';
|
||||
export { KeymanDeveloperProject } from './kpj/keyman-developer-project.js';
|
||||
|
||||
export * as util from './util/util.js';
|
||||
export * as KpsFile from './package/kps-file.js';
|
||||
export * as KmpJsonFile from './package/kmp-json-file.js';
|
||||
|
||||
export * as util from './util/util.js';
|
||||
|
||||
|
|
|
|||
|
|
@ -2,13 +2,9 @@ import * as xml2js from 'xml2js';
|
|||
import JSZip from 'jszip';
|
||||
import KEYMAN_VERSION from "@keymanapp/keyman-version";
|
||||
|
||||
import type { KpsFile, KpsFileContentFile, KpsFileInfo, KpsFileKeyboard, KpsFileLanguage, KpsFileLexicalModel, KpsFileOptions, KpsPackage } from './kps-file.js';
|
||||
import type { KmpJsonFile, KmpJsonFileInfo, KmpJsonFileLanguage, KmpJsonFileOptions } from './kmp-json-file.js';
|
||||
import { CompilerCallbacks, KvkFile } from '@keymanapp/common-types';
|
||||
import { CompilerMessages } from './messages.js';
|
||||
import { KMX, KmxFileReader } from '@keymanapp/common-types';
|
||||
|
||||
export { type KmpJsonFile } from './kmp-json-file.js';
|
||||
import { KmpJsonFile, KpsFile, KMX, KmxFileReader } from '@keymanapp/common-types';
|
||||
|
||||
const FILEVERSION_KMP_JSON = '12.0';
|
||||
|
||||
|
|
@ -17,21 +13,21 @@ export default class KmpCompiler {
|
|||
constructor(private callbacks: CompilerCallbacks) {
|
||||
}
|
||||
|
||||
public transformKpsToKmpObject(kpsFilename: string): KmpJsonFile {
|
||||
public transformKpsToKmpObject(kpsFilename: string): KmpJsonFile.KmpJsonFile {
|
||||
// Load the KPS data from XML as JS structured data.
|
||||
const data = this.callbacks.fs.readFileSync(kpsFilename, 'utf-8');
|
||||
|
||||
const kpsPackage = (() => {
|
||||
let a: KpsPackage;
|
||||
let a: KpsFile.KpsPackage;
|
||||
let parser = new xml2js.Parser({
|
||||
tagNameProcessors: [xml2js.processors.firstCharLowerCase],
|
||||
explicitArray: false
|
||||
});
|
||||
parser.parseString(data, (e: unknown, r: unknown) => { a = r as KpsPackage });
|
||||
parser.parseString(data, (e: unknown, r: unknown) => { a = r as KpsFile.KpsPackage });
|
||||
return a;
|
||||
})();
|
||||
|
||||
let kps: KpsFile = kpsPackage.package;
|
||||
let kps: KpsFile.KpsFile = kpsPackage.package;
|
||||
|
||||
//
|
||||
// To convert to kmp.json, we need to:
|
||||
|
|
@ -46,7 +42,7 @@ export default class KmpCompiler {
|
|||
|
||||
// Start to construct the kmp.json file from the .kps file
|
||||
|
||||
let kmp: KmpJsonFile = {
|
||||
let kmp: KmpJsonFile.KmpJsonFile = {
|
||||
system: {
|
||||
fileVersion: FILEVERSION_KMP_JSON,
|
||||
keymanDeveloperVersion: KEYMAN_VERSION.VERSION
|
||||
|
|
@ -58,7 +54,7 @@ export default class KmpCompiler {
|
|||
// Fill in additional fields
|
||||
//
|
||||
|
||||
let keys: [keyof KpsFileOptions, keyof KmpJsonFileOptions][] = [
|
||||
let keys: [keyof KpsFile.KpsFileOptions, keyof KmpJsonFile.KmpJsonFileOptions][] = [
|
||||
['executeProgram','executeProgram'],
|
||||
['graphicFile', 'graphicFile'],
|
||||
['msiFileName','msiFilename'],
|
||||
|
|
@ -86,7 +82,7 @@ export default class KmpCompiler {
|
|||
//
|
||||
|
||||
if(kps.files && kps.files.file) {
|
||||
kmp.files = this.arrayWrap(kps.files.file).map((file: KpsFileContentFile) => {
|
||||
kmp.files = this.arrayWrap(kps.files.file).map((file: KpsFile.KpsFileContentFile) => {
|
||||
return {
|
||||
name: file.name,
|
||||
description: file.description,
|
||||
|
|
@ -108,14 +104,14 @@ export default class KmpCompiler {
|
|||
//
|
||||
|
||||
if(kps.keyboards && kps.keyboards.keyboard) {
|
||||
kmp.keyboards = this.arrayWrap(kps.keyboards.keyboard).map((keyboard: KpsFileKeyboard) => {
|
||||
kmp.keyboards = this.arrayWrap(kps.keyboards.keyboard).map((keyboard: KpsFile.KpsFileKeyboard) => {
|
||||
return {
|
||||
displayFont: keyboard.displayFont ? this.callbacks.path.basename(keyboard.displayFont) : undefined,
|
||||
oskFont: keyboard.oSKFont ? this.callbacks.path.basename(keyboard.oSKFont) : undefined,
|
||||
name:keyboard.name,
|
||||
id:keyboard.iD,
|
||||
version:keyboard.version,
|
||||
languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(keyboard.languages.language) as KpsFileLanguage[])
|
||||
languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(keyboard.languages.language) as KpsFile.KpsFileLanguage[])
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
@ -125,8 +121,8 @@ export default class KmpCompiler {
|
|||
//
|
||||
|
||||
if(kps.lexicalModels && kps.lexicalModels.lexicalModel) {
|
||||
kmp.lexicalModels = this.arrayWrap(kps.lexicalModels.lexicalModel).map((model: KpsFileLexicalModel) => {
|
||||
return { name:model.name, id:model.iD, languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(model.languages.language) as KpsFileLanguage[]) }
|
||||
kmp.lexicalModels = this.arrayWrap(kps.lexicalModels.lexicalModel).map((model: KpsFile.KpsFileLexicalModel) => {
|
||||
return { name:model.name, id:model.iD, languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(model.languages.language) as KpsFile.KpsFileLanguage[]) }
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -160,17 +156,17 @@ export default class KmpCompiler {
|
|||
kmp.strings = this.arrayWrap(kps.strings.string);
|
||||
}
|
||||
|
||||
kmp = this.stripUndefined(kmp) as KmpJsonFile;
|
||||
kmp = this.stripUndefined(kmp) as KmpJsonFile.KmpJsonFile;
|
||||
|
||||
return kmp;
|
||||
}
|
||||
|
||||
// Helper functions
|
||||
|
||||
private kpsInfoToKmpInfo(info: KpsFileInfo): KmpJsonFileInfo {
|
||||
let ni: KmpJsonFileInfo = {};
|
||||
private kpsInfoToKmpInfo(info: KpsFile.KpsFileInfo): KmpJsonFile.KmpJsonFileInfo {
|
||||
let ni: KmpJsonFile.KmpJsonFileInfo = {};
|
||||
|
||||
const keys: [(keyof KpsFileInfo), (keyof KmpJsonFileInfo)][] = [
|
||||
const keys: [(keyof KpsFile.KpsFileInfo), (keyof KmpJsonFile.KmpJsonFileInfo)][] = [
|
||||
['author','author'],
|
||||
['copyright','copyright'],
|
||||
['name','name'],
|
||||
|
|
@ -195,11 +191,11 @@ export default class KmpCompiler {
|
|||
return [a];
|
||||
};
|
||||
|
||||
private kpsLanguagesToKmpLanguages(language: KpsFileLanguage[]): KmpJsonFileLanguage[] {
|
||||
private kpsLanguagesToKmpLanguages(language: KpsFile.KpsFileLanguage[]): KmpJsonFile.KmpJsonFileLanguage[] {
|
||||
return language.map((element) => { return { name: element._, id: element.$.ID } });
|
||||
};
|
||||
|
||||
private extractKeyboardVersionFromKmx(kpsFilename: string, kmp: KmpJsonFile) {
|
||||
private extractKeyboardVersionFromKmx(kpsFilename: string, kmp: KmpJsonFile.KmpJsonFile) {
|
||||
// The DEFAULT_VERSION used to be '1.0', but we now use '0.0' to allow
|
||||
// pre-release 0.x keyboards to be considered later than a keyboard without
|
||||
// any version metadata at all.
|
||||
|
|
@ -278,13 +274,13 @@ export default class KmpCompiler {
|
|||
* @param kpsFilename - Filename of the kps, not read, used only for calculating relative paths
|
||||
* @param kmpJsonData - The kmp.json Object
|
||||
*/
|
||||
public buildKmpFile(kpsFilename: string, kmpJsonData: KmpJsonFile): Promise<string> {
|
||||
public buildKmpFile(kpsFilename: string, kmpJsonData: KmpJsonFile.KmpJsonFile): Promise<string> {
|
||||
const zip = JSZip();
|
||||
|
||||
const kmpJsonFileName = 'kmp.json';
|
||||
|
||||
// Make a copy of kmpJsonData, as we mutate paths for writing
|
||||
const data: KmpJsonFile = JSON.parse(JSON.stringify(kmpJsonData));
|
||||
const data: KmpJsonFile.KmpJsonFile = JSON.parse(JSON.stringify(kmpJsonData));
|
||||
if(!data.files) {
|
||||
data.files = [];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import KmpCompiler from '../src/kmp-compiler.js';
|
|||
import {makePathToFixture} from './helpers/index.js';
|
||||
import JSZip from 'jszip';
|
||||
import KEYMAN_VERSION from "@keymanapp/keyman-version";
|
||||
import { type KmpJsonFile } from '../src/kmp-json-file.js';
|
||||
import { KmpJsonFile } from '@keymanapp/common-types';
|
||||
import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers';
|
||||
import { CompilerMessages } from '../src/messages.js';
|
||||
|
||||
|
|
@ -37,7 +37,7 @@ describe('KmpCompiler', function () {
|
|||
// Test just the transform from kps to kmp.json
|
||||
//
|
||||
it(`should transform ${modelID}.model.kps to kmp.json`, function () {
|
||||
let kmpJson: KmpJsonFile;
|
||||
let kmpJson: KmpJsonFile.KmpJsonFile;
|
||||
|
||||
assert.doesNotThrow(() => {
|
||||
kmpJson = kmpCompiler.transformKpsToKmpObject(kpsPath);
|
||||
|
|
@ -56,7 +56,7 @@ describe('KmpCompiler', function () {
|
|||
it(`should build a full .kmp for ${modelID}`, async function() {
|
||||
const zip = JSZip();
|
||||
// Build kmp.json in memory
|
||||
const kmpJson: KmpJsonFile = kmpCompiler.transformKpsToKmpObject(kpsPath);
|
||||
const kmpJson: KmpJsonFile.KmpJsonFile = kmpCompiler.transformKpsToKmpObject(kpsPath);
|
||||
// Build file.kmp in memory
|
||||
const promise = kmpCompiler.buildKmpFile(kpsPath, kmpJson);
|
||||
promise.then(data => {
|
||||
|
|
@ -86,7 +86,7 @@ describe('KmpCompiler', function () {
|
|||
const kmpJsonRefPath = makePathToFixture('khmer_angkor', 'ref', 'kmp.json');
|
||||
|
||||
const kmpCompiler = new KmpCompiler(callbacks);
|
||||
const kmpJsonFixture: KmpJsonFile = JSON.parse(fs.readFileSync(kmpJsonRefPath, 'utf-8'));
|
||||
const kmpJsonFixture: KmpJsonFile.KmpJsonFile = JSON.parse(fs.readFileSync(kmpJsonRefPath, 'utf-8'));
|
||||
|
||||
// We override the fixture version so that we can compare with the compiler output
|
||||
kmpJsonFixture.system.keymanDeveloperVersion = KEYMAN_VERSION.VERSION;
|
||||
|
|
@ -131,7 +131,7 @@ describe('KmpCompiler', function () {
|
|||
const kpsPath = makePathToFixture('absolute_path', 'source', 'absolute_path.kps');
|
||||
const kmpCompiler = new KmpCompiler(callbacks);
|
||||
|
||||
let kmpJson: KmpJsonFile = null;
|
||||
let kmpJson: KmpJsonFile.KmpJsonFile = null;
|
||||
|
||||
assert.doesNotThrow(() => {
|
||||
kmpJson = kmpCompiler.transformKpsToKmpObject(kpsPath);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
"allowSyntheticDefaultImports": true, // for jszip
|
||||
},
|
||||
"include": [
|
||||
"src/**/*.ts"
|
||||
"src/**/*.ts",
|
||||
],
|
||||
"references": [
|
||||
{ "path": "../../../common/web/keyman-version/tsconfig.esm.json" },
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue