spiegel-keyman/core/include/ldml/keyboardprocessor_ldml.ts
Marc Durdin ea6bd8f09f chore(core): order sections according to binary format
Just reorders all work around the various sections to match the binary
format order -- that is, 'sect' first, then all other sections
alphabetically.

This also means the compiler now emits the sections in the expected
order.

No other changes to functionality.
2022-09-04 06:10:34 +10:00

199 lines
5.3 KiB
TypeScript

/*
Copyright: Copyright (C) 2022 SIL International.
Authors: srl295, mcdurdin
This file provides constants for the KMX Plus (LDML support) binary format,
to be shared between TypeScript and C++ via the generator (below)
*/
// NOTICE!
//
// If you update this file, you *must* be sure to re-run
//
// core/tools/ldml-const-builder/build.sh clean build run
//
// To update keyboardprocessor_ldml.h, and commit the result.
//
// It is not updated automatically.
/**
* Defines the section identifiers and ensures that we include each and every
* one of them in the `sections` block and gives us a type which we can iterate
* through.
*/
export type SectionIdent =
'sect' |
'keys' |
'loca' |
'meta' |
'name' |
'strs' |
'vkey';
type SectionMap = {
[id in SectionIdent]: SectionIdent;
}
interface Constants_Section {
// For now, only defining one property as other types can be inferred
section: SectionMap;
}
type Constants = Constants_Section & {[id:string]:any};
// TODO-LDML: namespace com.keyman.core.ldml {
/**
* Constants for the KMXPlus data format
* These are shared between the data access layer and the compiler.
* Note that the section IDs (section_keys etc.) are 32 bit hex
* values that are designed to appear as text when written in little endian
* format, so 0x7379656b = 'keys'
*/
export const constants: Constants = {
/**
* The version of the LDML processor
*/
version: '1.0',
/**
* Length of a raw section header, in bytes
*/
length_header: 8,
/* ------------------------------------------------------------------
* sect section
------------------------------------------------------------------ */
/**
* Minimum length of the 'sect' section, not including entries
*/
length_sect: 16,
/**
* Length of each item in the 'sect' section variable part
*/
length_sect_item: 8,
/* ------------------------------------------------------------------
* keys section
------------------------------------------------------------------ */
/**
* Minimum length of the 'keys' section not including variable parts
*/
length_keys: 16,
/**
* Length of each item in the 'keys' section variable part
*/
length_keys_item: 16,
/**
* bitwise or value for extend in keys[key].flags.
* If bit is 1, then 'to' is a string.
* If bit is 0, then 'to' is a UTF-32LE codepoint
*
* `extend = flags & keys_flags_extend`
*/
keys_flags_extend: 1,
/* ------------------------------------------------------------------
* loca section
------------------------------------------------------------------ */
/**
* Minimum length of the 'loca' section not including variable parts
*/
length_loca: 16,
/**
* Length of each item in the 'loca' section variable part
*/
length_loca_item: 4,
/* ------------------------------------------------------------------
* meta section
------------------------------------------------------------------ */
/**
* length of the 'meta' section
*/
length_meta: 40,
/**
* bitwise or value for fallback=omit in meta.settings
*/
meta_settings_fallback_omit: 1,
/**
* bitwise or value for transformFailure=omit in meta.settings
*/
meta_settings_transformFailure_omit: 2,
/**
* bitwise or value for transformPartial=hide in meta.settings
*/
meta_settings_transformPartial_hide: 4,
/* ------------------------------------------------------------------
* name section
------------------------------------------------------------------ */
/**
* Minimum length of the 'name' section not including variable parts
*/
length_name: 16,
/**
* Length of each item in the 'name' section variable part
*/
length_name_item: 4,
/* ------------------------------------------------------------------
* strs section
------------------------------------------------------------------ */
/**
* Minimum length of the 'strs' section not including variable parts
*/
length_strs: 16,
/**
* Length of each item in the 'strs' section variable part
*/
length_strs_item: 8,
/* ------------------------------------------------------------------
* vkey section
------------------------------------------------------------------ */
/**
* Minimum length of the 'vkey' section
* not including variable parts
*/
length_vkey: 16,
length_vkey_item: 8,
/**
* All section IDs.
*/
section: {
sect: 'sect',
keys: 'keys',
loca: 'loca',
meta: 'meta',
name: 'name',
strs: 'strs',
vkey: 'vkey',
},
/**
* Use to convert 4-char string into hex
* @param id section id such as 'sect'
* @returns hex ID such as 0x74636573
*/
hex_section_id: function(id:string) {
if(!id || typeof id !== 'string' || !id.match(/[a-z][a-z][a-z][a-z]/)) {
throw Error(`hex_section_id(${id}) - need a 4-character string`);
}
let r = 0;
for (let i = 3; i>=0; i--) {
r = (r << 8 | id.charCodeAt(i));
}
return r;
},
};
// }