Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 33 additions & 10 deletions common/web/types/src/ldml-keyboard/ldml-keyboard-xml-reader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,20 @@ export default class LDMLKeyboardXMLSourceFileReader {
* @param source any
*/
private boxArrays(source: any) {
boxXmlArray(source?.keyboard, 'layerMaps');
boxXmlArray(source?.keyboard, 'layers');
boxXmlArray(source?.keyboard?.displays, 'display');
boxXmlArray(source?.keyboard?.displays, 'displayOptions');
boxXmlArray(source?.keyboard?.names, 'name');
boxXmlArray(source?.keyboard?.vkeyMaps, 'vkeyMap');
boxXmlArray(source?.keyboard?.vkeys, 'vkey');
boxXmlArray(source?.keyboard?.keys, 'key');
boxXmlArray(source?.keyboard?.locales, 'locale');
boxXmlArray(source?.keyboard, 'transforms');
if(source?.keyboard?.layerMaps) {
for(let layerMaps of source?.keyboard?.layerMaps) {
boxXmlArray(layerMaps, 'layerMap');
if(layerMaps?.layerMap) {
for(let layerMap of layerMaps?.layerMap) {
boxXmlArray(layerMap, 'row');
if(source?.keyboard?.layers) {
for(let layers of source?.keyboard?.layers) {
boxXmlArray(layers, 'layer');
if(layers?.layer) {
for(let layer of layers?.layer) {
boxXmlArray(layer, 'row');
}
}
}
Expand All @@ -32,10 +34,31 @@ export default class LDMLKeyboardXMLSourceFileReader {
}
}
boxXmlArray(source?.keyboard?.reorders, 'reorder');
boxXmlArray(source?.keyboard?.backspaces, 'backspace');
this.boxImportsAndSpecials(source);
return source;
}

/**
* Recurse over object, boxing up any specials or imports
* @param obj any object to be traversed
*/
private boxImportsAndSpecials(obj: any) {
if (!obj) return;
if (Array.isArray(obj)) {
for (const sub of obj) {
this.boxImportsAndSpecials(sub);
}
} else if(typeof obj === 'object') {
for (const key of Object.keys(obj)) {
if (key === 'special' || key === 'import') {
boxXmlArray(obj, key);
} else {
this.boxImportsAndSpecials(obj[key]);
}
}
}
}

public validate(source: LDMLKeyboardXMLSourceFile, schemaSource: Buffer): void {
const schema = JSON.parse(schemaSource.toString('utf8'));
const ajv = new Ajv();
Expand Down Expand Up @@ -67,4 +90,4 @@ export default class LDMLKeyboardXMLSourceFileReader {

return this.boxArrays(source);
}
}
}
8 changes: 4 additions & 4 deletions common/web/types/src/ldml-keyboard/ldml-keyboard-xml.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ export interface LKKeyboard {
names?: LKNames;
settings?: LKSettings;
keys?: LKKeys;
layerMaps?: LKLayerMaps[];
vkeyMaps?: LKVkeyMaps;
layers?: LKLayerMaps[];
vkeys?: LKVkeyMaps;
transforms?: LKTransforms[];
reorders?: LKReorders;
backspaces?: LKBackspaces;
Expand Down Expand Up @@ -75,7 +75,7 @@ export interface LKKey {

export interface LKLayerMaps {
form?: string;
layerMap?: LKLayerMap[];
layer?: LKLayerMap[];
};

export interface LKLayerMap {
Expand All @@ -88,7 +88,7 @@ export interface LKRow {
};

export interface LKVkeyMaps {
vkeyMap?: LKVkeyMap[];
vkey?: LKVkeyMap[];
};

export interface LKVkeyMap {
Expand Down
4 changes: 2 additions & 2 deletions common/web/types/test/fixtures/invalid-conforms-to.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/ldmlKeyboard.dtd"
DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/dtd/ldmlKeyboard.dtd"
Disabling doctype for this invalid file, not used by compiler, and avoids complaints in IDEs etc.
-->
<keyboard locale="mt" conformsTo="nothing-anyone-ever-heard-of">
Expand All @@ -16,4 +16,4 @@
<key id="that" to="ថា" />
</keys>

</keyboard>
</keyboard>
4 changes: 2 additions & 2 deletions common/web/types/test/fixtures/invalid-structure-per-dtd.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/ldmlKeyboard.dtd"
DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/dtd/ldmlKeyboard.dtd"
Disabling doctype for this invalid file, not used by compiler, and avoids complaints in IDEs etc.
-->
<keyboard locale="mt" conformsTo="techpreview">
</keyboard>
</keyboard>
4 changes: 2 additions & 2 deletions core/src/ldml/C7043_ldml.md
Original file line number Diff line number Diff line change
Expand Up @@ -329,5 +329,5 @@ For each key:
> * UnicodeSets
> * spec: reference to `after` in reorders; various other @after refs
> * spec: ABNT2 key has hex value 0xC1 (even if kbdus.dll doesn't produce that)
> * spec: layerMaps.displayWidthInMm
> * `keys.key.mod`: TODO define this. 0 for no modifiers.
> * spec: layers.displayWidth
> * `keys.key.mod`: TODO define this. 0 for no modifiers.
10 changes: 5 additions & 5 deletions core/tests/unit/ldml/keyboards/k_001_tiny.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
@@expected: \u0127\u1790\u17B6\u0127

-->
<!DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/ldmlKeyboard.dtd">
<!DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/dtd/ldmlKeyboard.dtd">
<keyboard locale="mt" conformsTo="techpreview">
<info author="srl295" indicator="🙀" layout="qwerty" normalization="NFC" />

Expand All @@ -21,9 +21,9 @@
<key id="that" to="ថា" />
</keys>

<layerMaps form="hardware">
<layerMap id="base">
<layers form="hardware">
<layer id="base">
<row keys="hmaqtua that" /> <!-- number row -->
</layerMap>
</layerMaps>
</layer>
</layers>
</keyboard>
10 changes: 5 additions & 5 deletions core/tests/unit/ldml/keyboards/k_002_tinyu32.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
@@expected: \u0127\u1790\u17B6\u0127\uD83D\uDE40\u0127

-->
<!DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/ldmlKeyboard.dtd">
<!DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/dtd/ldmlKeyboard.dtd">
<keyboard locale="mt" conformsTo="techpreview">
<info author="srl295" indicator="🙀" layout="qwerty" normalization="NFC" />

Expand All @@ -20,9 +20,9 @@
<key id="screamcat" to="🙀" />
</keys>

<layerMaps form="hardware">
<layerMap id="base">
<layers form="hardware">
<layer id="base">
<row keys="hmaqtua that screamcat" /> <!-- number row -->
</layerMap>
</layerMaps>
</layer>
</layers>
</keyboard>
10 changes: 5 additions & 5 deletions core/tests/unit/ldml/keyboards/k_003_transform.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Note: keys should start with [K_A][K_B][K_C] not [K_Y] when transforms are funct
@@expected: y\u0020xd\u0020xeq\u0020m

-->
<!DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/ldmlKeyboard.dtd">
<!DOCTYPE keyboard SYSTEM "../../../../../resources/standards-data/ldml-keyboards/techpreview/dtd/ldmlKeyboard.dtd">
<keyboard locale="en" conformsTo="techpreview">
<info author="srl295" indicator="🙀" layout="qwerty" normalization="NFC" />

Expand Down Expand Up @@ -52,15 +52,15 @@ Note: keys should start with [K_A][K_B][K_C] not [K_Y] when transforms are funct
<key id="backslash" to="\u{005c}"/>
</keys>

<layerMaps form="hardware">
<layerMap id="base">
<layers form="hardware">
<layer id="base">
<row keys="space" /> <!-- number row -->
<row keys="q w e r t y u i o p" />
<row keys="a s d f g h j k l" />
<row keys="backslash z x c v b n m" />
<!-- <row keys="space" /> --> <!-- Bug: 5 rows is 'too many'? -->
</layerMap>
</layerMaps>
</layer>
</layers>

<transforms type="simple">
<transform from="ab" to="x" />
Expand Down
49 changes: 0 additions & 49 deletions developer/src/kmc-keyboard/src/compiler/bksp.ts

This file was deleted.

3 changes: 1 addition & 2 deletions developer/src/kmc-keyboard/src/compiler/compiler.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { LDMLKeyboardXMLSourceFileReader, LDMLKeyboard, KMXPlus } from '@keymanapp/common-types';
import { BkspCompiler } from './bksp.js';
import CompilerCallbacks from './callbacks.js';
import CompilerOptions from './compiler-options.js';
import { KeysCompiler } from './keys.js';
Expand All @@ -8,7 +7,7 @@ import { CompilerMessages } from './messages.js';
import { MetaCompiler } from './meta.js';
import { NameCompiler } from './name.js';
import { OrdrCompiler } from './ordr.js';
import { FinlCompiler, TranCompiler } from './tran.js';
import { BkspCompiler, FinlCompiler, TranCompiler } from './tran.js';
import { VkeyCompiler } from './vkey.js';

import LDMLKeyboardXMLSourceFile = LDMLKeyboard.LDMLKeyboardXMLSourceFile;
Expand Down
12 changes: 6 additions & 6 deletions developer/src/kmc-keyboard/src/compiler/keys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ export class KeysCompiler extends SectionCompiler {

public validate() {
let valid = true;
if(!this.keyboard.layerMaps?.[0]?.layerMap?.length) {
if(!this.keyboard.layers?.[0]?.layer?.length) {
valid = false;
this.callbacks.reportMessage(CompilerMessages.Error_MustBeAtLeastOneLayerElement());
}

if(this.keyboard.layerMaps?.[0]?.form == 'hardware') {
for(let layer of this.keyboard.layerMaps[0].layerMap) {
if(this.keyboard.layers?.[0]?.form == 'hardware') {
for(let layer of this.keyboard.layers[0].layer) {
valid = this.validateHardwareLayer(layer) && valid; // note: always validate even if previously invalid results found
}
}
Expand All @@ -62,8 +62,8 @@ export class KeysCompiler extends SectionCompiler {
public compile(sections: GlobalSections): Keys {
// Use LayerMap + keys to generate compiled keys for hardware

if(this.keyboard.layerMaps?.[0]?.form == 'hardware') {
for(let layer of this.keyboard.layerMaps[0].layerMap) {
if(this.keyboard.layers?.[0]?.form == 'hardware') {
for(let layer of this.keyboard.layers[0].layer) {
let sect = this.compileHardwareLayer(sections, layer);
return sect;
}
Expand Down Expand Up @@ -111,4 +111,4 @@ export class KeysCompiler extends SectionCompiler {
// TODO: other modifiers
return 0;
}
}
}
20 changes: 19 additions & 1 deletion developer/src/kmc-keyboard/src/compiler/tran.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { SectionCompiler } from "./section-compiler.js";

import Finl = KMXPlus.Finl;
import FinlItem = KMXPlus.FinlItem;
import Bksp = KMXPlus.Bksp;
import BkspItem = KMXPlus.BkspItem;
import GlobalSections = KMXPlus.GlobalSections;
import Tran = KMXPlus.Tran;
import TranItem = KMXPlus.TranItem;
Expand All @@ -13,7 +15,7 @@ import LDMLKeyboardXMLSourceFile = LDMLKeyboard.LDMLKeyboardXMLSourceFile;
import LKTransform = LDMLKeyboard.LKTransform;
import LKTransforms = LDMLKeyboard.LKTransforms;

type TransformCompilerType = 'simple' | 'final';
type TransformCompilerType = 'simple' | 'final' | 'backspace';

class TransformCompiler<T extends TransformCompilerType, TranBase extends Tran, TranItemBase extends TranItem> extends SectionCompiler {

Expand Down Expand Up @@ -100,3 +102,19 @@ export class FinlCompiler extends TransformCompiler<'final', Finl, FinlItem> {
return constants.section.finl;
}
};

export class BkspCompiler extends TransformCompiler<'backspace', Bksp, BkspItem> {
constructor(source: LDMLKeyboardXMLSourceFile, callbacks: CompilerCallbacks) {
super(source, callbacks);
this.type = 'backspace';
}
protected newTranItem(): BkspItem {
return new BkspItem();
}
protected newTran(): Bksp {
return new Bksp();
}
public get id() {
return constants.section.bksp;
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ export default class VisualKeyboardCompiler {
result.header.unicodeFont.size = 10;
result.header.unicodeFont.color = 0;

for(let layerMap of source.keyboard.layerMaps) {
for(let layer of layerMap.layerMap) {
for(let layers of source.keyboard.layers) {
for(let layer of layers.layer) {
this.compileHardwareLayer(source, result, layer);
}
}
Expand Down Expand Up @@ -61,4 +61,4 @@ export default class VisualKeyboardCompiler {
// TODO: other modifiers
return 0;
}
}
}
10 changes: 5 additions & 5 deletions developer/src/kmc-keyboard/src/compiler/vkey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ export class VkeyCompiler extends SectionCompiler {
}

public get required(): boolean {
return !!this.keyboard.vkeyMaps;
return !!this.keyboard.vkeys;
}

public validate(): boolean {
let valid = true;
if(this.keyboard.vkeyMaps) {
if(this.keyboard.vkeys) {
let from: string[] = [], to: string[] = [];

this.keyboard.vkeyMaps.vkeyMap.forEach(vk => {
this.keyboard.vkeys.vkey.forEach(vk => {
if(LdmlVkeyNames[vk.from] === undefined) {
this.callbacks.reportMessage(CompilerMessages.Error_VkeyIsNotValid({vkey: vk.from}));
valid = false;
Expand Down Expand Up @@ -53,11 +53,11 @@ export class VkeyCompiler extends SectionCompiler {

public compile(): Vkey {
let result = new Vkey();
if(!this.keyboard.vkeyMaps) {
if(!this.keyboard.vkeys) {
return result;
}

result.vkeys = this.keyboard.vkeyMaps?.vkeyMap.map(vk => {
result.vkeys = this.keyboard.vkeys?.vkey.map(vk => {
return {
vkey: LdmlVkeyNames[vk.from],
target: LdmlVkeyNames[vk.to]
Expand Down
Loading