@keymanapp/common-types 17.0.154-alpha → 17.0.156-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.
Files changed (246) hide show
  1. package/build/src/consts/virtual-key-constants.d.ts +144 -138
  2. package/build/src/consts/virtual-key-constants.d.ts.map +1 -1
  3. package/build/src/consts/virtual-key-constants.js +258 -252
  4. package/build/src/consts/virtual-key-constants.js.map +1 -1
  5. package/build/src/keyman-touch-layout/keyman-touch-layout-file-reader.d.ts +8 -7
  6. package/build/src/keyman-touch-layout/keyman-touch-layout-file-reader.d.ts.map +1 -1
  7. package/build/src/keyman-touch-layout/keyman-touch-layout-file-reader.js +76 -74
  8. package/build/src/keyman-touch-layout/keyman-touch-layout-file-reader.js.map +1 -1
  9. package/build/src/keyman-touch-layout/keyman-touch-layout-file-writer.d.ts +31 -24
  10. package/build/src/keyman-touch-layout/keyman-touch-layout-file-writer.d.ts.map +1 -1
  11. package/build/src/keyman-touch-layout/keyman-touch-layout-file-writer.js +119 -75
  12. package/build/src/keyman-touch-layout/keyman-touch-layout-file-writer.js.map +1 -1
  13. package/build/src/keyman-touch-layout/keyman-touch-layout-file.d.ts +78 -76
  14. package/build/src/keyman-touch-layout/keyman-touch-layout-file.d.ts.map +1 -1
  15. package/build/src/keyman-touch-layout/keyman-touch-layout-file.js +28 -26
  16. package/build/src/keyman-touch-layout/keyman-touch-layout-file.js.map +1 -1
  17. package/build/src/kmx/element-string.d.ts +26 -24
  18. package/build/src/kmx/element-string.d.ts.map +1 -1
  19. package/build/src/kmx/element-string.js +121 -119
  20. package/build/src/kmx/element-string.js.map +1 -1
  21. package/build/src/kmx/keyman-targets.d.ts +23 -0
  22. package/build/src/kmx/keyman-targets.d.ts.map +1 -0
  23. package/build/src/kmx/keyman-targets.js +80 -0
  24. package/build/src/kmx/keyman-targets.js.map +1 -0
  25. package/build/src/kmx/kmx-builder.d.ts +35 -33
  26. package/build/src/kmx/kmx-builder.d.ts.map +1 -1
  27. package/build/src/kmx/kmx-builder.js +190 -188
  28. package/build/src/kmx/kmx-builder.js.map +1 -1
  29. package/build/src/kmx/kmx-file-reader.d.ts +16 -7
  30. package/build/src/kmx/kmx-file-reader.d.ts.map +1 -1
  31. package/build/src/kmx/kmx-file-reader.js +135 -38
  32. package/build/src/kmx/kmx-file-reader.js.map +1 -1
  33. package/build/src/kmx/kmx-plus-builder/build-disp.d.ts +20 -18
  34. package/build/src/kmx/kmx-plus-builder/build-disp.d.ts.map +1 -1
  35. package/build/src/kmx/kmx-plus-builder/build-disp.js +27 -25
  36. package/build/src/kmx/kmx-plus-builder/build-disp.js.map +1 -1
  37. package/build/src/kmx/kmx-plus-builder/build-elem.d.ts +31 -29
  38. package/build/src/kmx/kmx-plus-builder/build-elem.d.ts.map +1 -1
  39. package/build/src/kmx/kmx-plus-builder/build-elem.js +90 -88
  40. package/build/src/kmx/kmx-plus-builder/build-elem.js.map +1 -1
  41. package/build/src/kmx/kmx-plus-builder/build-keys.d.ts +60 -58
  42. package/build/src/kmx/kmx-plus-builder/build-keys.d.ts.map +1 -1
  43. package/build/src/kmx/kmx-plus-builder/build-keys.js +109 -107
  44. package/build/src/kmx/kmx-plus-builder/build-keys.js.map +1 -1
  45. package/build/src/kmx/kmx-plus-builder/build-layr.d.ts +56 -54
  46. package/build/src/kmx/kmx-plus-builder/build-layr.d.ts.map +1 -1
  47. package/build/src/kmx/kmx-plus-builder/build-layr.js +101 -99
  48. package/build/src/kmx/kmx-plus-builder/build-layr.js.map +1 -1
  49. package/build/src/kmx/kmx-plus-builder/build-list.d.ts +38 -36
  50. package/build/src/kmx/kmx-plus-builder/build-list.d.ts.map +1 -1
  51. package/build/src/kmx/kmx-plus-builder/build-list.js +67 -65
  52. package/build/src/kmx/kmx-plus-builder/build-list.js.map +1 -1
  53. package/build/src/kmx/kmx-plus-builder/build-loca.d.ts +14 -12
  54. package/build/src/kmx/kmx-plus-builder/build-loca.d.ts.map +1 -1
  55. package/build/src/kmx/kmx-plus-builder/build-loca.js +22 -20
  56. package/build/src/kmx/kmx-plus-builder/build-loca.js.map +1 -1
  57. package/build/src/kmx/kmx-plus-builder/build-meta.d.ts +19 -17
  58. package/build/src/kmx/kmx-plus-builder/build-meta.d.ts.map +1 -1
  59. package/build/src/kmx/kmx-plus-builder/build-meta.js +23 -21
  60. package/build/src/kmx/kmx-plus-builder/build-meta.js.map +1 -1
  61. package/build/src/kmx/kmx-plus-builder/build-name.d.ts +14 -12
  62. package/build/src/kmx/kmx-plus-builder/build-name.d.ts.map +1 -1
  63. package/build/src/kmx/kmx-plus-builder/build-name.js +25 -23
  64. package/build/src/kmx/kmx-plus-builder/build-name.js.map +1 -1
  65. package/build/src/kmx/kmx-plus-builder/build-sect.d.ts +18 -16
  66. package/build/src/kmx/kmx-plus-builder/build-sect.d.ts.map +1 -1
  67. package/build/src/kmx/kmx-plus-builder/build-sect.js +16 -14
  68. package/build/src/kmx/kmx-plus-builder/build-sect.js.map +1 -1
  69. package/build/src/kmx/kmx-plus-builder/build-strs.d.ts +25 -23
  70. package/build/src/kmx/kmx-plus-builder/build-strs.d.ts.map +1 -1
  71. package/build/src/kmx/kmx-plus-builder/build-strs.js +47 -45
  72. package/build/src/kmx/kmx-plus-builder/build-strs.js.map +1 -1
  73. package/build/src/kmx/kmx-plus-builder/build-tran.d.ts +35 -33
  74. package/build/src/kmx/kmx-plus-builder/build-tran.d.ts.map +1 -1
  75. package/build/src/kmx/kmx-plus-builder/build-tran.js +70 -68
  76. package/build/src/kmx/kmx-plus-builder/build-tran.js.map +1 -1
  77. package/build/src/kmx/kmx-plus-builder/build-uset.d.ts +33 -31
  78. package/build/src/kmx/kmx-plus-builder/build-uset.d.ts.map +1 -1
  79. package/build/src/kmx/kmx-plus-builder/build-uset.js +61 -59
  80. package/build/src/kmx/kmx-plus-builder/build-uset.js.map +1 -1
  81. package/build/src/kmx/kmx-plus-builder/build-vars.d.ts +24 -22
  82. package/build/src/kmx/kmx-plus-builder/build-vars.d.ts.map +1 -1
  83. package/build/src/kmx/kmx-plus-builder/build-vars.js +49 -47
  84. package/build/src/kmx/kmx-plus-builder/build-vars.js.map +1 -1
  85. package/build/src/kmx/kmx-plus-builder/build-vkey.d.ts +18 -16
  86. package/build/src/kmx/kmx-plus-builder/build-vkey.d.ts.map +1 -1
  87. package/build/src/kmx/kmx-plus-builder/build-vkey.js +25 -23
  88. package/build/src/kmx/kmx-plus-builder/build-vkey.js.map +1 -1
  89. package/build/src/kmx/kmx-plus-builder/builder-section.d.ts +12 -10
  90. package/build/src/kmx/kmx-plus-builder/builder-section.d.ts.map +1 -1
  91. package/build/src/kmx/kmx-plus-builder/builder-section.js +5 -3
  92. package/build/src/kmx/kmx-plus-builder/builder-section.js.map +1 -1
  93. package/build/src/kmx/kmx-plus-builder/kmx-plus-builder.d.ts +49 -47
  94. package/build/src/kmx/kmx-plus-builder/kmx-plus-builder.d.ts.map +1 -1
  95. package/build/src/kmx/kmx-plus-builder/kmx-plus-builder.js +146 -144
  96. package/build/src/kmx/kmx-plus-builder/kmx-plus-builder.js.map +1 -1
  97. package/build/src/kmx/kmx-plus.d.ts +331 -329
  98. package/build/src/kmx/kmx-plus.d.ts.map +1 -1
  99. package/build/src/kmx/kmx-plus.js +835 -833
  100. package/build/src/kmx/kmx-plus.js.map +1 -1
  101. package/build/src/kmx/kmx.d.ts +235 -209
  102. package/build/src/kmx/kmx.d.ts.map +1 -1
  103. package/build/src/kmx/kmx.js +299 -276
  104. package/build/src/kmx/kmx.js.map +1 -1
  105. package/build/src/kmx/string-list.d.ts +36 -34
  106. package/build/src/kmx/string-list.d.ts.map +1 -1
  107. package/build/src/kmx/string-list.js +85 -83
  108. package/build/src/kmx/string-list.js.map +1 -1
  109. package/build/src/kpj/keyman-developer-project.d.ts +74 -63
  110. package/build/src/kpj/keyman-developer-project.d.ts.map +1 -1
  111. package/build/src/kpj/keyman-developer-project.js +165 -146
  112. package/build/src/kpj/keyman-developer-project.js.map +1 -1
  113. package/build/src/kpj/kpj-file-reader.d.ts +21 -19
  114. package/build/src/kpj/kpj-file-reader.d.ts.map +1 -1
  115. package/build/src/kpj/kpj-file-reader.js +110 -96
  116. package/build/src/kpj/kpj-file-reader.js.map +1 -1
  117. package/build/src/kpj/kpj-file.d.ts +41 -39
  118. package/build/src/kpj/kpj-file.d.ts.map +1 -1
  119. package/build/src/kpj/kpj-file.js +13 -11
  120. package/build/src/kpj/kpj-file.js.map +1 -1
  121. package/build/src/kvk/kvk-file-reader.d.ts +7 -5
  122. package/build/src/kvk/kvk-file-reader.d.ts.map +1 -1
  123. package/build/src/kvk/kvk-file-reader.js +38 -35
  124. package/build/src/kvk/kvk-file-reader.js.map +1 -1
  125. package/build/src/kvk/kvk-file-writer.d.ts +22 -20
  126. package/build/src/kvk/kvk-file-writer.d.ts.map +1 -1
  127. package/build/src/kvk/kvk-file-writer.js +78 -67
  128. package/build/src/kvk/kvk-file-writer.js.map +1 -1
  129. package/build/src/kvk/kvk-file.d.ts +68 -65
  130. package/build/src/kvk/kvk-file.d.ts.map +1 -1
  131. package/build/src/kvk/kvk-file.js +67 -64
  132. package/build/src/kvk/kvk-file.js.map +1 -1
  133. package/build/src/kvk/kvks-file-reader.d.ts +26 -23
  134. package/build/src/kvk/kvks-file-reader.d.ts.map +1 -1
  135. package/build/src/kvk/kvks-file-reader.js +179 -151
  136. package/build/src/kvk/kvks-file-reader.js.map +1 -1
  137. package/build/src/kvk/kvks-file-writer.d.ts +9 -6
  138. package/build/src/kvk/kvks-file-writer.d.ts.map +1 -1
  139. package/build/src/kvk/kvks-file-writer.js +107 -98
  140. package/build/src/kvk/kvks-file-writer.js.map +1 -1
  141. package/build/src/kvk/kvks-file.d.ts +46 -44
  142. package/build/src/kvk/kvks-file.d.ts.map +1 -1
  143. package/build/src/kvk/kvks-file.js +12 -10
  144. package/build/src/kvk/kvks-file.js.map +1 -1
  145. package/build/src/kvk/visual-keyboard.d.ts +47 -35
  146. package/build/src/kvk/visual-keyboard.d.ts.map +1 -1
  147. package/build/src/kvk/visual-keyboard.js +73 -61
  148. package/build/src/kvk/visual-keyboard.js.map +1 -1
  149. package/build/src/ldml-keyboard/ldml-keyboard-testdata-xml.d.ts +58 -56
  150. package/build/src/ldml-keyboard/ldml-keyboard-testdata-xml.d.ts.map +1 -1
  151. package/build/src/ldml-keyboard/ldml-keyboard-testdata-xml.js +22 -20
  152. package/build/src/ldml-keyboard/ldml-keyboard-testdata-xml.js.map +1 -1
  153. package/build/src/ldml-keyboard/ldml-keyboard-xml-reader.d.ts +97 -95
  154. package/build/src/ldml-keyboard/ldml-keyboard-xml-reader.d.ts.map +1 -1
  155. package/build/src/ldml-keyboard/ldml-keyboard-xml-reader.js +387 -385
  156. package/build/src/ldml-keyboard/ldml-keyboard-xml-reader.js.map +1 -1
  157. package/build/src/ldml-keyboard/ldml-keyboard-xml.d.ts +163 -161
  158. package/build/src/ldml-keyboard/ldml-keyboard-xml.d.ts.map +1 -1
  159. package/build/src/ldml-keyboard/ldml-keyboard-xml.js +41 -39
  160. package/build/src/ldml-keyboard/ldml-keyboard-xml.js.map +1 -1
  161. package/build/src/ldml-keyboard/pattern-parser.d.ts +138 -136
  162. package/build/src/ldml-keyboard/pattern-parser.d.ts.map +1 -1
  163. package/build/src/ldml-keyboard/pattern-parser.js +245 -243
  164. package/build/src/ldml-keyboard/pattern-parser.js.map +1 -1
  165. package/build/src/ldml-keyboard/unicodeset-parser-api.d.ts +40 -38
  166. package/build/src/ldml-keyboard/unicodeset-parser-api.d.ts.map +1 -1
  167. package/build/src/ldml-keyboard/unicodeset-parser-api.js +30 -28
  168. package/build/src/ldml-keyboard/unicodeset-parser-api.js.map +1 -1
  169. package/build/src/main.d.ts +36 -29
  170. package/build/src/main.d.ts.map +1 -1
  171. package/build/src/main.js +35 -28
  172. package/build/src/main.js.map +1 -1
  173. package/build/src/osk/osk.d.ts +25 -0
  174. package/build/src/osk/osk.d.ts.map +1 -0
  175. package/build/src/osk/osk.js +89 -0
  176. package/build/src/osk/osk.js.map +1 -0
  177. package/build/src/package/kmp-json-file.d.ts +69 -68
  178. package/build/src/package/kmp-json-file.d.ts.map +1 -1
  179. package/build/src/package/kmp-json-file.js +4 -2
  180. package/build/src/package/kmp-json-file.js.map +1 -1
  181. package/build/src/package/kps-file.d.ts +100 -98
  182. package/build/src/package/kps-file.d.ts.map +1 -1
  183. package/build/src/package/kps-file.js +18 -16
  184. package/build/src/package/kps-file.js.map +1 -1
  185. package/build/src/schemas/displaymap.schema.d.ts +60 -0
  186. package/build/src/schemas/displaymap.schema.d.ts.map +1 -0
  187. package/build/src/schemas/displaymap.schema.js +38 -0
  188. package/build/src/schemas/displaymap.schema.js.map +1 -0
  189. package/build/src/schemas/keyman-touch-layout.clean.spec.d.ts +230 -0
  190. package/build/src/schemas/keyman-touch-layout.clean.spec.d.ts.map +1 -0
  191. package/build/src/schemas/keyman-touch-layout.clean.spec.js +154 -0
  192. package/build/src/schemas/keyman-touch-layout.clean.spec.js.map +1 -0
  193. package/build/src/schemas/keyman-touch-layout.spec.d.ts +229 -0
  194. package/build/src/schemas/keyman-touch-layout.spec.d.ts.map +1 -0
  195. package/build/src/schemas/keyman-touch-layout.spec.js +142 -0
  196. package/build/src/schemas/keyman-touch-layout.spec.js.map +1 -0
  197. package/build/src/schemas/kpj-9.0.schema.d.ts +155 -0
  198. package/build/src/schemas/kpj-9.0.schema.d.ts.map +1 -0
  199. package/build/src/schemas/kpj-9.0.schema.js +134 -0
  200. package/build/src/schemas/kpj-9.0.schema.js.map +1 -0
  201. package/build/src/schemas/kpj.schema.d.ts +121 -0
  202. package/build/src/schemas/kpj.schema.d.ts.map +1 -0
  203. package/build/src/schemas/kpj.schema.js +128 -0
  204. package/build/src/schemas/kpj.schema.js.map +1 -0
  205. package/build/src/schemas/kvks.schema.d.ts +163 -0
  206. package/build/src/schemas/kvks.schema.d.ts.map +1 -0
  207. package/build/src/schemas/kvks.schema.js +185 -0
  208. package/build/src/schemas/kvks.schema.js.map +1 -0
  209. package/build/src/schemas/ldml-keyboard.schema.d.ts +634 -0
  210. package/build/src/schemas/ldml-keyboard.schema.d.ts.map +1 -0
  211. package/build/src/schemas/ldml-keyboard.schema.js +705 -0
  212. package/build/src/schemas/ldml-keyboard.schema.js.map +1 -0
  213. package/build/src/schemas/ldml-keyboardtest.schema.d.ts +191 -0
  214. package/build/src/schemas/ldml-keyboardtest.schema.d.ts.map +1 -0
  215. package/build/src/schemas/ldml-keyboardtest.schema.js +224 -0
  216. package/build/src/schemas/ldml-keyboardtest.schema.js.map +1 -0
  217. package/build/src/schemas.d.ts +1757 -0
  218. package/build/src/schemas.d.ts.map +1 -0
  219. package/build/src/schemas.js +22 -0
  220. package/build/src/schemas.js.map +1 -0
  221. package/build/src/util/common-events.d.ts +51 -49
  222. package/build/src/util/common-events.d.ts.map +1 -1
  223. package/build/src/util/common-events.js +31 -29
  224. package/build/src/util/common-events.js.map +1 -1
  225. package/build/src/util/compiler-interfaces.d.ts +296 -136
  226. package/build/src/util/compiler-interfaces.d.ts.map +1 -1
  227. package/build/src/util/compiler-interfaces.js +294 -104
  228. package/build/src/util/compiler-interfaces.js.map +1 -1
  229. package/build/src/util/errors.d.ts +8 -0
  230. package/build/src/util/errors.d.ts.map +1 -0
  231. package/build/src/util/errors.js +8 -0
  232. package/build/src/util/errors.js.map +1 -0
  233. package/build/src/util/file-types.d.ts +98 -0
  234. package/build/src/util/file-types.d.ts.map +1 -0
  235. package/build/src/util/file-types.js +117 -0
  236. package/build/src/util/file-types.js.map +1 -0
  237. package/build/src/util/util.d.ts +32 -30
  238. package/build/src/util/util.d.ts.map +1 -1
  239. package/build/src/util/util.js +98 -96
  240. package/build/src/util/util.js.map +1 -1
  241. package/package.json +23 -4
  242. package/build/src/keyman-touch-layout.clean.spec.json +0 -170
  243. package/build/src/kpj.schema.json +0 -127
  244. package/build/src/kvks.schema.json +0 -182
  245. package/build/src/ldml-keyboard.schema.json +0 -702
  246. package/build/src/ldml-keyboardtest.schema.json +0 -221
@@ -1,833 +1,835 @@
1
- import { constants } from '@keymanapp/ldml-keyboard-constants';
2
- import * as r from 'restructure';
3
- import { ElementString } from './element-string.js';
4
- import { ListItem } from './string-list.js';
5
- import { isOneChar, toOneChar, unescapeString } from '../util/util.js';
6
- import { KMXFile } from './kmx.js';
7
- import { VariableParser } from '../ldml-keyboard/pattern-parser.js';
8
- import { MarkerParser } from '../ldml-keyboard/pattern-parser.js';
9
- // Implementation of file structures from /core/src/ldml/C7043_ldml.md
10
- // Writer in kmx-builder.ts
11
- // Reader in kmx-loader.ts
12
- export class Section {
13
- }
14
- // 'sect'
15
- export class Sect extends Section {
16
- }
17
- ;
18
- // 'bksp' -- see 'tran'
19
- // 'elem'
20
- export class Elem extends Section {
21
- strings = [];
22
- constructor(sections) {
23
- super();
24
- this.strings.push(new ElementString(sections, '')); // C7043: null element string
25
- }
26
- /**
27
- * @param source if a string array, does not get reinterpreted as UnicodeSet. This is used with vars, etc. Or pass `["str"]` for an explicit 1-element elem.
28
- * If it is a string, will be interpreted per reorder element ruls.
29
- */
30
- allocElementString(sections, source, order, tertiary, tertiary_base, prebase) {
31
- let s = new ElementString(sections, source, order, tertiary, tertiary_base, prebase);
32
- let result = this.strings.find(item => item.isEqual(s));
33
- if (result === undefined) {
34
- result = s;
35
- this.strings.push(result);
36
- }
37
- return result;
38
- }
39
- }
40
- ;
41
- // 'keys' is now `keys2.kmap`
42
- // 'loca'
43
- export class Loca extends Section {
44
- locales = [];
45
- }
46
- ;
47
- // 'meta'
48
- export var KeyboardSettings;
49
- (function (KeyboardSettings) {
50
- KeyboardSettings[KeyboardSettings["none"] = 0] = "none";
51
- KeyboardSettings[KeyboardSettings["fallback"] = constants.meta_settings_fallback_omit] = "fallback";
52
- KeyboardSettings[KeyboardSettings["transformFailure"] = constants.meta_settings_transformFailure_omit] = "transformFailure";
53
- KeyboardSettings[KeyboardSettings["transformPartial"] = constants.meta_settings_transformPartial_hide] = "transformPartial";
54
- })(KeyboardSettings || (KeyboardSettings = {}));
55
- ;
56
- export var Meta_NormalizationForm;
57
- (function (Meta_NormalizationForm) {
58
- Meta_NormalizationForm["NFC"] = "NFC";
59
- Meta_NormalizationForm["NFD"] = "NFD";
60
- Meta_NormalizationForm["other"] = "other";
61
- })(Meta_NormalizationForm || (Meta_NormalizationForm = {}));
62
- ;
63
- export class Meta extends Section {
64
- author;
65
- conform;
66
- layout;
67
- normalization;
68
- indicator;
69
- version; // semver version string, defaults to "0"
70
- settings;
71
- }
72
- ;
73
- // 'name'
74
- export class Name extends Section {
75
- names = [];
76
- }
77
- ;
78
- // 'strs'
79
- /**
80
- * A string item in memory. This will be replaced with an index
81
- * into the string table at finalization.
82
- */
83
- export class StrsItem {
84
- /** string value */
85
- value;
86
- /** char value if this is a single-char placeholder item (CharStrsItem) */
87
- char;
88
- constructor(value, char) {
89
- if (char !== undefined) {
90
- if (!isOneChar(value)) {
91
- throw new Error(`StrsItem: ${value} is not a single char`);
92
- }
93
- if (char !== toOneChar(value)) {
94
- throw new Error(`StrsItem: ${char} is not the right codepoint for ${value}`);
95
- }
96
- }
97
- this.value = value;
98
- this.char = char;
99
- }
100
- compareTo(o) {
101
- return StrsItem.binaryStringCompare(this.value, o.value);
102
- }
103
- static binaryStringCompare(a, b) {
104
- // https://tc39.es/ecma262/multipage/abstract-operations.html#sec-islessthan
105
- if (typeof a != 'string' || typeof b != 'string') {
106
- throw new Error('binaryStringCompare: inputs must be strings');
107
- }
108
- if (a < b)
109
- return -1;
110
- if (a > b)
111
- return 1;
112
- return 0;
113
- }
114
- get isOneChar() {
115
- return this.char !== undefined;
116
- }
117
- }
118
- ;
119
- /**
120
- * A StrsItem for a single char. Used as a placeholder and hint to the builder
121
- */
122
- export class CharStrsItem extends StrsItem {
123
- constructor(value) {
124
- if (!isOneChar(value)) {
125
- throw RangeError(`not a 1-char string`);
126
- }
127
- super(value, toOneChar(value));
128
- }
129
- }
130
- ;
131
- export class Strs extends Section {
132
- strings = [new StrsItem('')]; // C7043: The null string is always requierd
133
- /**
134
- * Allocate a StrsItem given the string, unescaping if necessary.
135
- * @param s escaped string
136
- * @param singleOk if true, allocate a CharStrsItem (not in strs table) if single-char capable.
137
- * @returns
138
- */
139
- allocAndUnescapeString(s, singleOk) {
140
- return this.allocString(unescapeString(s), singleOk);
141
- }
142
- /**
143
- * Allocate a StrsItem given the string.
144
- * @param s string
145
- * @param singleOk if true, allocate a CharStrsItem (not in strs table) if single-char capable.
146
- * @returns
147
- */
148
- allocString(s, singleOk) {
149
- if (s === undefined || s === null) {
150
- // undefined or null are always equivalent to empty string, see C7043
151
- s = '';
152
- }
153
- if (typeof s !== 'string') {
154
- throw new Error('alloc_string: s must be a string, undefined, or null.');
155
- }
156
- // if it's a single char, don't push it into the list
157
- if (singleOk && isOneChar(s)) {
158
- return new CharStrsItem(s);
159
- }
160
- let result = this.strings.find(item => item.value === s);
161
- if (result === undefined) {
162
- result = new StrsItem(s);
163
- this.strings.push(result);
164
- }
165
- return result;
166
- }
167
- }
168
- ;
169
- /**
170
- * See LKVariables
171
- */
172
- export class Vars extends Section {
173
- totalCount() {
174
- return this.strings.length + this.sets.length + this.unicodeSets.length;
175
- }
176
- markers;
177
- strings = []; // ≠ StrsItem
178
- sets = [];
179
- unicodeSets = [];
180
- /**
181
- *
182
- * @returns false if any invalid variables
183
- */
184
- valid() {
185
- for (const t of [this.sets, this.strings, this.unicodeSets]) {
186
- for (const i of t) {
187
- if (!i.valid()) {
188
- return false;
189
- }
190
- }
191
- }
192
- return true;
193
- }
194
- // utilities for making use of Vars in other sections
195
- substituteSets(str, sections) {
196
- return str.replaceAll(VariableParser.SET_REFERENCE, (_entire, id) => {
197
- const val = Vars.findVariable(this.sets, id);
198
- if (val === null) {
199
- // Should have been caught during validation.
200
- throw Error(`Internal Error: reference to missing set variable ${id}`);
201
- }
202
- return val.value.value;
203
- });
204
- }
205
- substituteUnicodeSets(value, sections) {
206
- return value.replaceAll(VariableParser.SET_REFERENCE, (_entire, id) => {
207
- const v = Vars.findVariable(this.unicodeSets, id);
208
- if (v === null) {
209
- // Should have been caught during validation.
210
- throw Error(`Internal Error: reference to missing UnicodeSet variable ${id}`);
211
- }
212
- return v.value.value; // string value
213
- });
214
- }
215
- substituteStrings(str, sections) {
216
- return str.replaceAll(VariableParser.STRING_REFERENCE, (_entire, id) => {
217
- const val = this.findStringVariableValue(id);
218
- if (val === null) {
219
- // Should have been caught during validation.
220
- throw Error(`Internal Error: reference to missing string variable ${id}`);
221
- }
222
- return val;
223
- });
224
- }
225
- findStringVariableValue(id) {
226
- return Vars.findVariable(this.strings, id)?.value?.value; // Unwrap: Variable, StrsItem
227
- }
228
- substituteSetRegex(str, sections) {
229
- return str.replaceAll(VariableParser.SET_REFERENCE, (_entire, id) => {
230
- // try as set
231
- const set = Vars.findVariable(this.sets, id);
232
- if (set !== null) {
233
- const { items } = set;
234
- const inner = items.map(i => i.value.value).join('|');
235
- return `(?:${inner})`; // TODO-LDML: need to escape here
236
- }
237
- // try as unicodeset
238
- const uset = Vars.findVariable(this.unicodeSets, id);
239
- if (uset !== null) {
240
- const { unicodeSet } = uset;
241
- const inner = unicodeSet.ranges.map(([start, end]) => {
242
- const s = String.fromCodePoint(start);
243
- if (start === end) {
244
- return s;
245
- }
246
- else {
247
- const e = String.fromCodePoint(end);
248
- return `${s}-${e}`;
249
- }
250
- }).join('');
251
- return `[${inner}]`;
252
- }
253
- // else, missing
254
- throw Error(`Internal Error: reference to missing set variable ${id}`);
255
- });
256
- }
257
- /**
258
- * Variable locator facility
259
- * @param array
260
- * @param id
261
- * @returns
262
- */
263
- static findVariable(array, id) {
264
- const v = array.filter(e => e.id.value === id);
265
- if (v.length === 0) {
266
- return null;
267
- }
268
- else if (v.length !== 1) {
269
- // Should have been caught during validation
270
- throw Error(`Internal Error: Duplicate variable id ${id} crept into a variable list.`);
271
- }
272
- else {
273
- return v[0];
274
- }
275
- }
276
- substituteMarkerString(s) {
277
- return MarkerParser.toSentinelString(s, this.markers);
278
- }
279
- }
280
- ;
281
- /**
282
- * Common base for variable sections
283
- * See Variable
284
- */
285
- export class VarsItem extends Section {
286
- id;
287
- value;
288
- constructor(id, value, sections) {
289
- super();
290
- this.id = sections.strs.allocString(id);
291
- this.value = sections.strs.allocAndUnescapeString(value);
292
- }
293
- valid() {
294
- return true;
295
- }
296
- }
297
- ;
298
- export class UnicodeSetItem extends VarsItem {
299
- constructor(id, value, sections, usetparser) {
300
- super(id, value, sections);
301
- // TODO-LDML: err on max buffer size
302
- const needRanges = sections.usetparser.sizeUnicodeSet(value);
303
- this.unicodeSet = sections.usetparser.parseUnicodeSet(value, needRanges);
304
- // _unicodeSet may be null, indicating this is invalid.
305
- // A message will have been set in that case.
306
- }
307
- unicodeSet;
308
- valid() {
309
- return !!this.unicodeSet;
310
- }
311
- }
312
- ;
313
- export class SetVarItem extends VarsItem {
314
- constructor(id, value, sections) {
315
- super(id, value.join(' '), sections);
316
- this.items = sections.elem.allocElementString(sections, value);
317
- }
318
- items;
319
- valid() {
320
- return !!this.items;
321
- }
322
- }
323
- ;
324
- export class StringVarItem extends VarsItem {
325
- constructor(id, value, sections) {
326
- super(id, value, sections);
327
- }
328
- }
329
- ;
330
- // 'tran'
331
- export class TranTransform {
332
- from;
333
- to;
334
- mapFrom; // var name
335
- mapTo; // var name
336
- }
337
- export class TranGroup {
338
- type; // tran_group_type_transform | tran_group_type_reorder
339
- transforms = [];
340
- reorders = [];
341
- }
342
- export class TranReorder {
343
- elements;
344
- before;
345
- }
346
- ;
347
- export class Tran extends Section {
348
- groups = [];
349
- get id() {
350
- return constants.section.tran;
351
- }
352
- }
353
- ;
354
- export class UsetItem {
355
- uset;
356
- str;
357
- constructor(uset, str) {
358
- this.uset = uset;
359
- this.str = str;
360
- }
361
- compareTo(other) {
362
- return this.str.compareTo(other.str);
363
- }
364
- }
365
- ;
366
- export class Uset extends Section {
367
- usets = [];
368
- allocUset(set, sections) {
369
- // match the same pattern
370
- let result = this.usets.find(s => set.pattern == s.uset.pattern);
371
- if (result === undefined) {
372
- result = new UsetItem(set, sections.strs.allocString(set.pattern));
373
- this.usets.push(result);
374
- }
375
- return result;
376
- }
377
- }
378
- ;
379
- // alias type for 'bksp'
380
- export class Bksp extends Tran {
381
- get id() {
382
- return constants.section.bksp;
383
- }
384
- }
385
- ;
386
- // 'vkey'
387
- export class VkeyItem {
388
- vkey;
389
- target;
390
- }
391
- export class Vkey extends Section {
392
- vkeys = [];
393
- }
394
- ;
395
- // 'disp'
396
- export class DispItem {
397
- to;
398
- display;
399
- }
400
- ;
401
- export class Disp extends Section {
402
- baseCharacter;
403
- disps = [];
404
- }
405
- ;
406
- // 'layr'
407
- /**
408
- * In-memory `<layers>`
409
- */
410
- export class LayrList {
411
- hardware;
412
- layers = [];
413
- minDeviceWidth; // millimeters
414
- }
415
- ;
416
- /**
417
- * In-memory `<layer>`
418
- */
419
- export class LayrEntry {
420
- id;
421
- mod;
422
- rows = [];
423
- }
424
- ;
425
- /**
426
- * In-memory `<row>`
427
- */
428
- export class LayrRow {
429
- keys = [];
430
- }
431
- ;
432
- export class Layr extends Section {
433
- lists = [];
434
- }
435
- ;
436
- export class KeysKeys {
437
- flags;
438
- flicks; // for in-memory only
439
- id;
440
- longPress;
441
- longPressDefault;
442
- multiTap;
443
- switch;
444
- to;
445
- width;
446
- }
447
- ;
448
- export class KeysKmap {
449
- vkey;
450
- mod;
451
- key; // for in-memory only
452
- }
453
- ;
454
- export class KeysFlicks {
455
- flicks = [];
456
- id;
457
- compareTo(b) {
458
- return this.id.compareTo(b.id);
459
- }
460
- constructor(id) {
461
- this.id = id;
462
- }
463
- }
464
- ;
465
- export class KeysFlick {
466
- directions;
467
- flags;
468
- to;
469
- }
470
- ;
471
- export class Keys extends Section {
472
- keys = [];
473
- flicks = [];
474
- kmap = [];
475
- constructor(strs) {
476
- super();
477
- let nullFlicks = new KeysFlicks(strs.allocString(''));
478
- this.flicks.push(nullFlicks); // C7043: null element string
479
- }
480
- }
481
- ;
482
- export class List extends Section {
483
- /**
484
- * Allocate a list from a space-separated list of items.
485
- * Note that passing undefined or null or `''` will
486
- * end up being the same as the empty list `[]`
487
- * @param strs Strs section for allocation
488
- * @param s space-separated list of items
489
- * @returns a List object
490
- */
491
- allocListFromSpaces(strs, s) {
492
- s = s ?? '';
493
- return this.allocList(strs, s.split(' '));
494
- }
495
- allocListFromEscapedSpaces(strs, s) {
496
- if (s === undefined || s === null) {
497
- s = '';
498
- }
499
- return this.allocList(strs, s.split(' ').map(unescapeString));
500
- }
501
- /**
502
- * Return a List object referring to the string list.
503
- * Note that a falsy list, or a list containing only an empty string
504
- * `['']` will be stored as an empty list `[]`.
505
- * @param strs Strs section for allocation
506
- * @param s string list to allocate
507
- * @returns
508
- */
509
- allocList(strs, s) {
510
- // Special case the 'null' list for [] or ['']
511
- if (!s || (s.length === 1 && s[0] === '')) {
512
- return this.lists[0];
513
- }
514
- let result = this.lists.find(item => item.isEqual(s));
515
- if (result === undefined) {
516
- // allocate a new ListItem
517
- result = new ListItem(strs, s);
518
- this.lists.push(result);
519
- }
520
- return result;
521
- }
522
- constructor(strs) {
523
- super();
524
- this.lists.push(new ListItem(strs, [])); // C7043: null element string
525
- }
526
- lists = [];
527
- }
528
- ;
529
- export { ListItem as ListItem };
530
- ;
531
- export class KMXPlusFile extends KMXFile {
532
- /* KMXPlus file structures */
533
- COMP_PLUS_SECT_ITEM;
534
- COMP_PLUS_SECT;
535
- // COMP_PLUS_BKSP == COMP_PLUS_TRAN
536
- COMP_PLUS_BKSP_ITEM;
537
- COMP_PLUS_BKSP;
538
- COMP_PLUS_DISP_ITEM;
539
- COMP_PLUS_DISP;
540
- COMP_PLUS_ELEM_ELEMENT;
541
- COMP_PLUS_ELEM_STRING;
542
- COMP_PLUS_ELEM;
543
- // COMP_PLUS_KEYS is now COMP_PLUS_KEYS_KMAP
544
- COMP_PLUS_LAYR_ENTRY;
545
- COMP_PLUS_LAYR_KEY;
546
- COMP_PLUS_LAYR_LIST;
547
- COMP_PLUS_LAYR_ROW;
548
- COMP_PLUS_LAYR;
549
- COMP_PLUS_KEYS_FLICK;
550
- COMP_PLUS_KEYS_FLICKS;
551
- COMP_PLUS_KEYS_KEY;
552
- COMP_PLUS_KEYS_KMAP;
553
- COMP_PLUS_KEYS;
554
- COMP_PLUS_LIST_LIST;
555
- COMP_PLUS_LIST_INDEX;
556
- COMP_PLUS_LIST;
557
- COMP_PLUS_LOCA_ITEM;
558
- COMP_PLUS_LOCA;
559
- COMP_PLUS_META;
560
- COMP_PLUS_NAME_ITEM;
561
- COMP_PLUS_NAME;
562
- COMP_PLUS_STRS_ITEM;
563
- COMP_PLUS_STRS;
564
- COMP_PLUS_TRAN_GROUP;
565
- COMP_PLUS_TRAN_TRANSFORM;
566
- COMP_PLUS_TRAN_REORDER;
567
- COMP_PLUS_TRAN;
568
- COMP_PLUS_USET_USET;
569
- COMP_PLUS_USET_RANGE;
570
- COMP_PLUS_USET;
571
- COMP_PLUS_VKEY_ITEM;
572
- COMP_PLUS_VKEY;
573
- COMP_PLUS_VARS;
574
- COMP_PLUS_VARS_ITEM;
575
- /* File in-memory data */
576
- kmxplus = {};
577
- constructor() {
578
- super();
579
- // Binary-correct structures matching kmx_plus.h
580
- // helpers
581
- const STR_REF = r.uint32le;
582
- const ELEM_REF = r.uint32le;
583
- const LIST_REF = r.uint32le;
584
- const STR_OR_CHAR32 = r.uint32le;
585
- const CHAR32 = r.uint32le;
586
- const STR_OR_CHAR32_OR_USET = r.uint32le;
587
- const IDENT = r.uint32le;
588
- // 'sect'
589
- this.COMP_PLUS_SECT_ITEM = new r.Struct({
590
- sect: r.uint32le,
591
- offset: r.uint32le //? new r.VoidPointer(r.uint32le, {type: 'global'})
592
- });
593
- this.COMP_PLUS_SECT = new r.Struct({
594
- ident: IDENT,
595
- size: r.uint32le,
596
- total: r.uint32le,
597
- count: r.uint32le,
598
- items: new r.Array(this.COMP_PLUS_SECT_ITEM, 'count')
599
- });
600
- // 'bksp' - see 'tran'
601
- // 'disp'
602
- this.COMP_PLUS_DISP_ITEM = new r.Struct({
603
- to: STR_REF,
604
- display: STR_REF,
605
- });
606
- this.COMP_PLUS_DISP = new r.Struct({
607
- ident: IDENT,
608
- size: r.uint32le,
609
- count: r.uint32le,
610
- baseCharacter: CHAR32,
611
- items: new r.Array(this.COMP_PLUS_DISP_ITEM, 'count'),
612
- });
613
- // 'elem'
614
- this.COMP_PLUS_ELEM_ELEMENT = new r.Struct({
615
- element: STR_OR_CHAR32_OR_USET,
616
- flags: r.uint32le
617
- });
618
- this.COMP_PLUS_ELEM_STRING = new r.Struct({
619
- offset: r.uint32le,
620
- length: r.uint32le
621
- });
622
- this.COMP_PLUS_ELEM = new r.Struct({
623
- ident: IDENT,
624
- size: r.uint32le,
625
- count: r.uint32le,
626
- strings: new r.Array(this.COMP_PLUS_ELEM_STRING, 'count')
627
- // + variable subtable: Element data (see KMXPlusBuilder.emitElements())
628
- });
629
- // 'finl' - see 'tran'
630
- // 'keys' - see 'keys.kmap'
631
- // 'layr'
632
- this.COMP_PLUS_LAYR_ENTRY = new r.Struct({
633
- id: r.uint32le,
634
- mod: r.uint32le,
635
- row: r.uint32le,
636
- count: r.uint32le,
637
- });
638
- this.COMP_PLUS_LAYR_KEY = new r.Struct({
639
- key: r.uint32le, // str: key id
640
- });
641
- this.COMP_PLUS_LAYR_LIST = new r.Struct({
642
- hardware: r.uint32le,
643
- layer: r.uint32le,
644
- count: r.uint32le,
645
- minDeviceWidth: r.uint32le, // integer: millimeters
646
- });
647
- this.COMP_PLUS_LAYR_ROW = new r.Struct({
648
- key: r.uint32le,
649
- count: r.uint32le,
650
- });
651
- this.COMP_PLUS_LAYR = new r.Struct({
652
- ident: IDENT,
653
- size: r.uint32le,
654
- listCount: r.uint32le,
655
- layerCount: r.uint32le,
656
- rowCount: r.uint32le,
657
- keyCount: r.uint32le,
658
- lists: new r.Array(this.COMP_PLUS_LAYR_LIST, 'listCount'),
659
- layers: new r.Array(this.COMP_PLUS_LAYR_ENTRY, 'layerCount'),
660
- rows: new r.Array(this.COMP_PLUS_LAYR_ROW, 'rowCount'),
661
- keys: new r.Array(this.COMP_PLUS_LAYR_KEY, 'keyCount'),
662
- });
663
- this.COMP_PLUS_KEYS_FLICK = new r.Struct({
664
- directions: LIST_REF,
665
- flags: r.uint32le,
666
- to: STR_OR_CHAR32, // str | codepoint
667
- });
668
- this.COMP_PLUS_KEYS_FLICKS = new r.Struct({
669
- count: r.uint32le,
670
- flick: r.uint32le,
671
- id: STR_REF, // str
672
- });
673
- this.COMP_PLUS_KEYS_KEY = new r.Struct({
674
- to: STR_OR_CHAR32,
675
- flags: r.uint32le,
676
- id: STR_REF,
677
- switch: STR_REF,
678
- width: r.uint32le,
679
- longPress: LIST_REF,
680
- longPressDefault: STR_REF,
681
- multiTap: LIST_REF,
682
- flicks: r.uint32le, // index into flicks table
683
- });
684
- this.COMP_PLUS_KEYS_KMAP = new r.Struct({
685
- vkey: r.uint32le,
686
- mod: r.uint32le,
687
- key: r.uint32le, // index into 'keys' subtable
688
- });
689
- this.COMP_PLUS_KEYS = new r.Struct({
690
- ident: IDENT,
691
- size: r.uint32le,
692
- keyCount: r.uint32le,
693
- flicksCount: r.uint32le,
694
- flickCount: r.uint32le,
695
- kmapCount: r.uint32le,
696
- keys: new r.Array(this.COMP_PLUS_KEYS_KEY, 'keyCount'),
697
- flicks: new r.Array(this.COMP_PLUS_KEYS_FLICKS, 'flicksCount'),
698
- flick: new r.Array(this.COMP_PLUS_KEYS_FLICK, 'flickCount'),
699
- kmap: new r.Array(this.COMP_PLUS_KEYS_KMAP, 'kmapCount'),
700
- });
701
- // 'list'
702
- this.COMP_PLUS_LIST_LIST = new r.Struct({
703
- index: r.uint32le,
704
- count: r.uint32le,
705
- });
706
- this.COMP_PLUS_LIST_INDEX = new r.Struct({
707
- str: STR_REF, // str
708
- });
709
- this.COMP_PLUS_LIST = new r.Struct({
710
- ident: IDENT,
711
- size: r.uint32le,
712
- listCount: r.uint32le,
713
- indexCount: r.uint32le,
714
- lists: new r.Array(this.COMP_PLUS_LIST_LIST, 'listCount'),
715
- indices: new r.Array(this.COMP_PLUS_LIST_INDEX, 'indexCount'),
716
- });
717
- // 'loca'
718
- this.COMP_PLUS_LOCA_ITEM = r.uint32le; //str
719
- this.COMP_PLUS_LOCA = new r.Struct({
720
- ident: IDENT,
721
- size: r.uint32le,
722
- count: r.uint32le,
723
- items: new r.Array(this.COMP_PLUS_LOCA_ITEM, 'count')
724
- });
725
- // 'meta'
726
- this.COMP_PLUS_META = new r.Struct({
727
- ident: IDENT,
728
- size: r.uint32le,
729
- author: STR_REF,
730
- conform: STR_REF,
731
- layout: STR_REF,
732
- normalization: STR_REF,
733
- indicator: STR_REF,
734
- version: STR_REF,
735
- settings: r.uint32le, //new r.Bitfield(r.uint32le, ['fallback', 'transformFailure', 'transformPartial'])
736
- });
737
- // 'name'
738
- this.COMP_PLUS_NAME_ITEM = r.uint32le; //str
739
- this.COMP_PLUS_NAME = new r.Struct({
740
- ident: IDENT,
741
- size: r.uint32le,
742
- count: r.uint32le,
743
- items: new r.Array(this.COMP_PLUS_NAME_ITEM, 'count')
744
- });
745
- // 'ordr' now part of 'tran'
746
- // 'strs'
747
- this.COMP_PLUS_STRS_ITEM = new r.Struct({
748
- // While we use length which is number of utf-16 code units excluding null terminator,
749
- // we always write a null terminator, so we can get restructure to do that for us here
750
- offset: r.uint32le,
751
- length: r.uint32le
752
- });
753
- this.COMP_PLUS_STRS = new r.Struct({
754
- ident: IDENT,
755
- size: r.uint32le,
756
- count: r.uint32le,
757
- items: new r.Array(this.COMP_PLUS_STRS_ITEM, 'count')
758
- // + variable subtable: String data (see KMXPlusBuilder.emitStrings())
759
- });
760
- // 'tran'
761
- this.COMP_PLUS_TRAN_GROUP = new r.Struct({
762
- type: r.uint32le,
763
- count: r.uint32le,
764
- index: r.uint32le, //index into subtable
765
- });
766
- this.COMP_PLUS_TRAN_TRANSFORM = new r.Struct({
767
- from: STR_REF,
768
- to: STR_REF,
769
- mapFrom: ELEM_REF,
770
- mapTo: ELEM_REF //elem
771
- });
772
- this.COMP_PLUS_TRAN_REORDER = new r.Struct({
773
- elements: ELEM_REF,
774
- before: ELEM_REF, //elem
775
- });
776
- this.COMP_PLUS_TRAN = new r.Struct({
777
- ident: IDENT,
778
- size: r.uint32le,
779
- groupCount: r.uint32le,
780
- transformCount: r.uint32le,
781
- reorderCount: r.uint32le,
782
- groups: new r.Array(this.COMP_PLUS_TRAN_GROUP, 'groupCount'),
783
- transforms: new r.Array(this.COMP_PLUS_TRAN_TRANSFORM, 'transformCount'),
784
- reorders: new r.Array(this.COMP_PLUS_TRAN_REORDER, 'reorderCount'),
785
- });
786
- // 'uset'
787
- this.COMP_PLUS_USET_USET = new r.Struct({
788
- range: r.uint32le,
789
- count: r.uint32le,
790
- pattern: STR_REF, // str
791
- });
792
- this.COMP_PLUS_USET_RANGE = new r.Struct({
793
- start: CHAR32,
794
- end: CHAR32,
795
- });
796
- this.COMP_PLUS_USET = new r.Struct({
797
- ident: IDENT,
798
- size: r.uint32le,
799
- usetCount: r.uint32le,
800
- rangeCount: r.uint32le,
801
- usets: new r.Array(this.COMP_PLUS_USET_USET, 'usetCount'),
802
- ranges: new r.Array(this.COMP_PLUS_USET_RANGE, 'rangeCount'),
803
- });
804
- // 'vars'
805
- this.COMP_PLUS_VARS_ITEM = new r.Struct({
806
- type: r.uint32le,
807
- id: STR_REF,
808
- value: STR_REF,
809
- elem: ELEM_REF,
810
- });
811
- this.COMP_PLUS_VARS = new r.Struct({
812
- ident: IDENT,
813
- size: r.uint32le,
814
- markers: LIST_REF,
815
- varCount: r.uint32le,
816
- varEntries: new r.Array(this.COMP_PLUS_VARS_ITEM, 'varCount'),
817
- });
818
- // 'vkey'
819
- this.COMP_PLUS_VKEY_ITEM = new r.Struct({
820
- vkey: r.uint32le,
821
- target: r.uint32le
822
- });
823
- this.COMP_PLUS_VKEY = new r.Struct({
824
- ident: IDENT,
825
- size: r.uint32le,
826
- count: r.uint32le,
827
- items: new r.Array(this.COMP_PLUS_VKEY_ITEM, 'count')
828
- });
829
- // Aliases
830
- this.COMP_PLUS_BKSP = this.COMP_PLUS_TRAN;
831
- }
832
- }
833
- //# sourceMappingURL=kmx-plus.js.map
1
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="79717ffa-eda4-5839-9ea7-a96a9b42edae")}catch(e){}}();
2
+ import { constants } from '@keymanapp/ldml-keyboard-constants';
3
+ import * as r from 'restructure';
4
+ import { ElementString } from './element-string.js';
5
+ import { ListItem } from './string-list.js';
6
+ import { isOneChar, toOneChar, unescapeString } from '../util/util.js';
7
+ import { KMXFile } from './kmx.js';
8
+ import { VariableParser } from '../ldml-keyboard/pattern-parser.js';
9
+ import { MarkerParser } from '../ldml-keyboard/pattern-parser.js';
10
+ // Implementation of file structures from /core/src/ldml/C7043_ldml.md
11
+ // Writer in kmx-builder.ts
12
+ // Reader in kmx-loader.ts
13
+ export class Section {
14
+ }
15
+ // 'sect'
16
+ export class Sect extends Section {
17
+ }
18
+ ;
19
+ // 'bksp' -- see 'tran'
20
+ // 'elem'
21
+ export class Elem extends Section {
22
+ strings = [];
23
+ constructor(sections) {
24
+ super();
25
+ this.strings.push(new ElementString(sections, '')); // C7043: null element string
26
+ }
27
+ /**
28
+ * @param source if a string array, does not get reinterpreted as UnicodeSet. This is used with vars, etc. Or pass `["str"]` for an explicit 1-element elem.
29
+ * If it is a string, will be interpreted per reorder element ruls.
30
+ */
31
+ allocElementString(sections, source, order, tertiary, tertiary_base, prebase) {
32
+ let s = new ElementString(sections, source, order, tertiary, tertiary_base, prebase);
33
+ let result = this.strings.find(item => item.isEqual(s));
34
+ if (result === undefined) {
35
+ result = s;
36
+ this.strings.push(result);
37
+ }
38
+ return result;
39
+ }
40
+ }
41
+ ;
42
+ // 'keys' is now `keys2.kmap`
43
+ // 'loca'
44
+ export class Loca extends Section {
45
+ locales = [];
46
+ }
47
+ ;
48
+ // 'meta'
49
+ export var KeyboardSettings;
50
+ (function (KeyboardSettings) {
51
+ KeyboardSettings[KeyboardSettings["none"] = 0] = "none";
52
+ KeyboardSettings[KeyboardSettings["fallback"] = constants.meta_settings_fallback_omit] = "fallback";
53
+ KeyboardSettings[KeyboardSettings["transformFailure"] = constants.meta_settings_transformFailure_omit] = "transformFailure";
54
+ KeyboardSettings[KeyboardSettings["transformPartial"] = constants.meta_settings_transformPartial_hide] = "transformPartial";
55
+ })(KeyboardSettings || (KeyboardSettings = {}));
56
+ ;
57
+ export var Meta_NormalizationForm;
58
+ (function (Meta_NormalizationForm) {
59
+ Meta_NormalizationForm["NFC"] = "NFC";
60
+ Meta_NormalizationForm["NFD"] = "NFD";
61
+ Meta_NormalizationForm["other"] = "other";
62
+ })(Meta_NormalizationForm || (Meta_NormalizationForm = {}));
63
+ ;
64
+ export class Meta extends Section {
65
+ author;
66
+ conform;
67
+ layout;
68
+ normalization;
69
+ indicator;
70
+ version; // semver version string, defaults to "0"
71
+ settings;
72
+ }
73
+ ;
74
+ // 'name'
75
+ export class Name extends Section {
76
+ names = [];
77
+ }
78
+ ;
79
+ // 'strs'
80
+ /**
81
+ * A string item in memory. This will be replaced with an index
82
+ * into the string table at finalization.
83
+ */
84
+ export class StrsItem {
85
+ /** string value */
86
+ value;
87
+ /** char value if this is a single-char placeholder item (CharStrsItem) */
88
+ char;
89
+ constructor(value, char) {
90
+ if (char !== undefined) {
91
+ if (!isOneChar(value)) {
92
+ throw new Error(`StrsItem: ${value} is not a single char`);
93
+ }
94
+ if (char !== toOneChar(value)) {
95
+ throw new Error(`StrsItem: ${char} is not the right codepoint for ${value}`);
96
+ }
97
+ }
98
+ this.value = value;
99
+ this.char = char;
100
+ }
101
+ compareTo(o) {
102
+ return StrsItem.binaryStringCompare(this.value, o.value);
103
+ }
104
+ static binaryStringCompare(a, b) {
105
+ // https://tc39.es/ecma262/multipage/abstract-operations.html#sec-islessthan
106
+ if (typeof a != 'string' || typeof b != 'string') {
107
+ throw new Error('binaryStringCompare: inputs must be strings');
108
+ }
109
+ if (a < b)
110
+ return -1;
111
+ if (a > b)
112
+ return 1;
113
+ return 0;
114
+ }
115
+ get isOneChar() {
116
+ return this.char !== undefined;
117
+ }
118
+ }
119
+ ;
120
+ /**
121
+ * A StrsItem for a single char. Used as a placeholder and hint to the builder
122
+ */
123
+ export class CharStrsItem extends StrsItem {
124
+ constructor(value) {
125
+ if (!isOneChar(value)) {
126
+ throw RangeError(`not a 1-char string`);
127
+ }
128
+ super(value, toOneChar(value));
129
+ }
130
+ }
131
+ ;
132
+ export class Strs extends Section {
133
+ strings = [new StrsItem('')]; // C7043: The null string is always requierd
134
+ /**
135
+ * Allocate a StrsItem given the string, unescaping if necessary.
136
+ * @param s escaped string
137
+ * @param singleOk if true, allocate a CharStrsItem (not in strs table) if single-char capable.
138
+ * @returns
139
+ */
140
+ allocAndUnescapeString(s, singleOk) {
141
+ return this.allocString(unescapeString(s), singleOk);
142
+ }
143
+ /**
144
+ * Allocate a StrsItem given the string.
145
+ * @param s string
146
+ * @param singleOk if true, allocate a CharStrsItem (not in strs table) if single-char capable.
147
+ * @returns
148
+ */
149
+ allocString(s, singleOk) {
150
+ if (s === undefined || s === null) {
151
+ // undefined or null are always equivalent to empty string, see C7043
152
+ s = '';
153
+ }
154
+ if (typeof s !== 'string') {
155
+ throw new Error('alloc_string: s must be a string, undefined, or null.');
156
+ }
157
+ // if it's a single char, don't push it into the list
158
+ if (singleOk && isOneChar(s)) {
159
+ return new CharStrsItem(s);
160
+ }
161
+ let result = this.strings.find(item => item.value === s);
162
+ if (result === undefined) {
163
+ result = new StrsItem(s);
164
+ this.strings.push(result);
165
+ }
166
+ return result;
167
+ }
168
+ }
169
+ ;
170
+ /**
171
+ * See LKVariables
172
+ */
173
+ export class Vars extends Section {
174
+ totalCount() {
175
+ return this.strings.length + this.sets.length + this.unicodeSets.length;
176
+ }
177
+ markers;
178
+ strings = []; // ≠ StrsItem
179
+ sets = [];
180
+ unicodeSets = [];
181
+ /**
182
+ *
183
+ * @returns false if any invalid variables
184
+ */
185
+ valid() {
186
+ for (const t of [this.sets, this.strings, this.unicodeSets]) {
187
+ for (const i of t) {
188
+ if (!i.valid()) {
189
+ return false;
190
+ }
191
+ }
192
+ }
193
+ return true;
194
+ }
195
+ // utilities for making use of Vars in other sections
196
+ substituteSets(str, sections) {
197
+ return str.replaceAll(VariableParser.SET_REFERENCE, (_entire, id) => {
198
+ const val = Vars.findVariable(this.sets, id);
199
+ if (val === null) {
200
+ // Should have been caught during validation.
201
+ throw Error(`Internal Error: reference to missing set variable ${id}`);
202
+ }
203
+ return val.value.value;
204
+ });
205
+ }
206
+ substituteUnicodeSets(value, sections) {
207
+ return value.replaceAll(VariableParser.SET_REFERENCE, (_entire, id) => {
208
+ const v = Vars.findVariable(this.unicodeSets, id);
209
+ if (v === null) {
210
+ // Should have been caught during validation.
211
+ throw Error(`Internal Error: reference to missing UnicodeSet variable ${id}`);
212
+ }
213
+ return v.value.value; // string value
214
+ });
215
+ }
216
+ substituteStrings(str, sections) {
217
+ return str.replaceAll(VariableParser.STRING_REFERENCE, (_entire, id) => {
218
+ const val = this.findStringVariableValue(id);
219
+ if (val === null) {
220
+ // Should have been caught during validation.
221
+ throw Error(`Internal Error: reference to missing string variable ${id}`);
222
+ }
223
+ return val;
224
+ });
225
+ }
226
+ findStringVariableValue(id) {
227
+ return Vars.findVariable(this.strings, id)?.value?.value; // Unwrap: Variable, StrsItem
228
+ }
229
+ substituteSetRegex(str, sections) {
230
+ return str.replaceAll(VariableParser.SET_REFERENCE, (_entire, id) => {
231
+ // try as set
232
+ const set = Vars.findVariable(this.sets, id);
233
+ if (set !== null) {
234
+ const { items } = set;
235
+ const inner = items.map(i => i.value.value).join('|');
236
+ return `(?:${inner})`; // TODO-LDML: need to escape here
237
+ }
238
+ // try as unicodeset
239
+ const uset = Vars.findVariable(this.unicodeSets, id);
240
+ if (uset !== null) {
241
+ const { unicodeSet } = uset;
242
+ const inner = unicodeSet.ranges.map(([start, end]) => {
243
+ const s = String.fromCodePoint(start);
244
+ if (start === end) {
245
+ return s;
246
+ }
247
+ else {
248
+ const e = String.fromCodePoint(end);
249
+ return `${s}-${e}`;
250
+ }
251
+ }).join('');
252
+ return `[${inner}]`;
253
+ }
254
+ // else, missing
255
+ throw Error(`Internal Error: reference to missing set variable ${id}`);
256
+ });
257
+ }
258
+ /**
259
+ * Variable locator facility
260
+ * @param array
261
+ * @param id
262
+ * @returns
263
+ */
264
+ static findVariable(array, id) {
265
+ const v = array.filter(e => e.id.value === id);
266
+ if (v.length === 0) {
267
+ return null;
268
+ }
269
+ else if (v.length !== 1) {
270
+ // Should have been caught during validation
271
+ throw Error(`Internal Error: Duplicate variable id ${id} crept into a variable list.`);
272
+ }
273
+ else {
274
+ return v[0];
275
+ }
276
+ }
277
+ substituteMarkerString(s) {
278
+ return MarkerParser.toSentinelString(s, this.markers);
279
+ }
280
+ }
281
+ ;
282
+ /**
283
+ * Common base for variable sections
284
+ * See Variable
285
+ */
286
+ export class VarsItem extends Section {
287
+ id;
288
+ value;
289
+ constructor(id, value, sections) {
290
+ super();
291
+ this.id = sections.strs.allocString(id);
292
+ this.value = sections.strs.allocAndUnescapeString(value);
293
+ }
294
+ valid() {
295
+ return true;
296
+ }
297
+ }
298
+ ;
299
+ export class UnicodeSetItem extends VarsItem {
300
+ constructor(id, value, sections, usetparser) {
301
+ super(id, value, sections);
302
+ // TODO-LDML: err on max buffer size
303
+ const needRanges = sections.usetparser.sizeUnicodeSet(value);
304
+ this.unicodeSet = sections.usetparser.parseUnicodeSet(value, needRanges);
305
+ // _unicodeSet may be null, indicating this is invalid.
306
+ // A message will have been set in that case.
307
+ }
308
+ unicodeSet;
309
+ valid() {
310
+ return !!this.unicodeSet;
311
+ }
312
+ }
313
+ ;
314
+ export class SetVarItem extends VarsItem {
315
+ constructor(id, value, sections) {
316
+ super(id, value.join(' '), sections);
317
+ this.items = sections.elem.allocElementString(sections, value);
318
+ }
319
+ items;
320
+ valid() {
321
+ return !!this.items;
322
+ }
323
+ }
324
+ ;
325
+ export class StringVarItem extends VarsItem {
326
+ constructor(id, value, sections) {
327
+ super(id, value, sections);
328
+ }
329
+ }
330
+ ;
331
+ // 'tran'
332
+ export class TranTransform {
333
+ from;
334
+ to;
335
+ mapFrom; // var name
336
+ mapTo; // var name
337
+ }
338
+ export class TranGroup {
339
+ type; // tran_group_type_transform | tran_group_type_reorder
340
+ transforms = [];
341
+ reorders = [];
342
+ }
343
+ export class TranReorder {
344
+ elements;
345
+ before;
346
+ }
347
+ ;
348
+ export class Tran extends Section {
349
+ groups = [];
350
+ get id() {
351
+ return constants.section.tran;
352
+ }
353
+ }
354
+ ;
355
+ export class UsetItem {
356
+ uset;
357
+ str;
358
+ constructor(uset, str) {
359
+ this.uset = uset;
360
+ this.str = str;
361
+ }
362
+ compareTo(other) {
363
+ return this.str.compareTo(other.str);
364
+ }
365
+ }
366
+ ;
367
+ export class Uset extends Section {
368
+ usets = [];
369
+ allocUset(set, sections) {
370
+ // match the same pattern
371
+ let result = this.usets.find(s => set.pattern == s.uset.pattern);
372
+ if (result === undefined) {
373
+ result = new UsetItem(set, sections.strs.allocString(set.pattern));
374
+ this.usets.push(result);
375
+ }
376
+ return result;
377
+ }
378
+ }
379
+ ;
380
+ // alias type for 'bksp'
381
+ export class Bksp extends Tran {
382
+ get id() {
383
+ return constants.section.bksp;
384
+ }
385
+ }
386
+ ;
387
+ // 'vkey'
388
+ export class VkeyItem {
389
+ vkey;
390
+ target;
391
+ }
392
+ export class Vkey extends Section {
393
+ vkeys = [];
394
+ }
395
+ ;
396
+ // 'disp'
397
+ export class DispItem {
398
+ to;
399
+ display;
400
+ }
401
+ ;
402
+ export class Disp extends Section {
403
+ baseCharacter;
404
+ disps = [];
405
+ }
406
+ ;
407
+ // 'layr'
408
+ /**
409
+ * In-memory `<layers>`
410
+ */
411
+ export class LayrList {
412
+ hardware;
413
+ layers = [];
414
+ minDeviceWidth; // millimeters
415
+ }
416
+ ;
417
+ /**
418
+ * In-memory `<layer>`
419
+ */
420
+ export class LayrEntry {
421
+ id;
422
+ mod;
423
+ rows = [];
424
+ }
425
+ ;
426
+ /**
427
+ * In-memory `<row>`
428
+ */
429
+ export class LayrRow {
430
+ keys = [];
431
+ }
432
+ ;
433
+ export class Layr extends Section {
434
+ lists = [];
435
+ }
436
+ ;
437
+ export class KeysKeys {
438
+ flags;
439
+ flicks; // for in-memory only
440
+ id;
441
+ longPress;
442
+ longPressDefault;
443
+ multiTap;
444
+ switch;
445
+ to;
446
+ width;
447
+ }
448
+ ;
449
+ export class KeysKmap {
450
+ vkey;
451
+ mod;
452
+ key; // for in-memory only
453
+ }
454
+ ;
455
+ export class KeysFlicks {
456
+ flicks = [];
457
+ id;
458
+ compareTo(b) {
459
+ return this.id.compareTo(b.id);
460
+ }
461
+ constructor(id) {
462
+ this.id = id;
463
+ }
464
+ }
465
+ ;
466
+ export class KeysFlick {
467
+ directions;
468
+ flags;
469
+ to;
470
+ }
471
+ ;
472
+ export class Keys extends Section {
473
+ keys = [];
474
+ flicks = [];
475
+ kmap = [];
476
+ constructor(strs) {
477
+ super();
478
+ let nullFlicks = new KeysFlicks(strs.allocString(''));
479
+ this.flicks.push(nullFlicks); // C7043: null element string
480
+ }
481
+ }
482
+ ;
483
+ export class List extends Section {
484
+ /**
485
+ * Allocate a list from a space-separated list of items.
486
+ * Note that passing undefined or null or `''` will
487
+ * end up being the same as the empty list `[]`
488
+ * @param strs Strs section for allocation
489
+ * @param s space-separated list of items
490
+ * @returns a List object
491
+ */
492
+ allocListFromSpaces(strs, s) {
493
+ s = s ?? '';
494
+ return this.allocList(strs, s.split(' '));
495
+ }
496
+ allocListFromEscapedSpaces(strs, s) {
497
+ if (s === undefined || s === null) {
498
+ s = '';
499
+ }
500
+ return this.allocList(strs, s.split(' ').map(unescapeString));
501
+ }
502
+ /**
503
+ * Return a List object referring to the string list.
504
+ * Note that a falsy list, or a list containing only an empty string
505
+ * `['']` will be stored as an empty list `[]`.
506
+ * @param strs Strs section for allocation
507
+ * @param s string list to allocate
508
+ * @returns
509
+ */
510
+ allocList(strs, s) {
511
+ // Special case the 'null' list for [] or ['']
512
+ if (!s || (s.length === 1 && s[0] === '')) {
513
+ return this.lists[0];
514
+ }
515
+ let result = this.lists.find(item => item.isEqual(s));
516
+ if (result === undefined) {
517
+ // allocate a new ListItem
518
+ result = new ListItem(strs, s);
519
+ this.lists.push(result);
520
+ }
521
+ return result;
522
+ }
523
+ constructor(strs) {
524
+ super();
525
+ this.lists.push(new ListItem(strs, [])); // C7043: null element string
526
+ }
527
+ lists = [];
528
+ }
529
+ ;
530
+ export { ListItem as ListItem };
531
+ ;
532
+ export class KMXPlusFile extends KMXFile {
533
+ /* KMXPlus file structures */
534
+ COMP_PLUS_SECT_ITEM;
535
+ COMP_PLUS_SECT;
536
+ // COMP_PLUS_BKSP == COMP_PLUS_TRAN
537
+ COMP_PLUS_BKSP_ITEM;
538
+ COMP_PLUS_BKSP;
539
+ COMP_PLUS_DISP_ITEM;
540
+ COMP_PLUS_DISP;
541
+ COMP_PLUS_ELEM_ELEMENT;
542
+ COMP_PLUS_ELEM_STRING;
543
+ COMP_PLUS_ELEM;
544
+ // COMP_PLUS_KEYS is now COMP_PLUS_KEYS_KMAP
545
+ COMP_PLUS_LAYR_ENTRY;
546
+ COMP_PLUS_LAYR_KEY;
547
+ COMP_PLUS_LAYR_LIST;
548
+ COMP_PLUS_LAYR_ROW;
549
+ COMP_PLUS_LAYR;
550
+ COMP_PLUS_KEYS_FLICK;
551
+ COMP_PLUS_KEYS_FLICKS;
552
+ COMP_PLUS_KEYS_KEY;
553
+ COMP_PLUS_KEYS_KMAP;
554
+ COMP_PLUS_KEYS;
555
+ COMP_PLUS_LIST_LIST;
556
+ COMP_PLUS_LIST_INDEX;
557
+ COMP_PLUS_LIST;
558
+ COMP_PLUS_LOCA_ITEM;
559
+ COMP_PLUS_LOCA;
560
+ COMP_PLUS_META;
561
+ COMP_PLUS_NAME_ITEM;
562
+ COMP_PLUS_NAME;
563
+ COMP_PLUS_STRS_ITEM;
564
+ COMP_PLUS_STRS;
565
+ COMP_PLUS_TRAN_GROUP;
566
+ COMP_PLUS_TRAN_TRANSFORM;
567
+ COMP_PLUS_TRAN_REORDER;
568
+ COMP_PLUS_TRAN;
569
+ COMP_PLUS_USET_USET;
570
+ COMP_PLUS_USET_RANGE;
571
+ COMP_PLUS_USET;
572
+ COMP_PLUS_VKEY_ITEM;
573
+ COMP_PLUS_VKEY;
574
+ COMP_PLUS_VARS;
575
+ COMP_PLUS_VARS_ITEM;
576
+ /* File in-memory data */
577
+ kmxplus = {};
578
+ constructor() {
579
+ super();
580
+ // Binary-correct structures matching kmx_plus.h
581
+ // helpers
582
+ const STR_REF = r.uint32le;
583
+ const ELEM_REF = r.uint32le;
584
+ const LIST_REF = r.uint32le;
585
+ const STR_OR_CHAR32 = r.uint32le;
586
+ const CHAR32 = r.uint32le;
587
+ const STR_OR_CHAR32_OR_USET = r.uint32le;
588
+ const IDENT = r.uint32le;
589
+ // 'sect'
590
+ this.COMP_PLUS_SECT_ITEM = new r.Struct({
591
+ sect: r.uint32le,
592
+ offset: r.uint32le //? new r.VoidPointer(r.uint32le, {type: 'global'})
593
+ });
594
+ this.COMP_PLUS_SECT = new r.Struct({
595
+ ident: IDENT,
596
+ size: r.uint32le,
597
+ total: r.uint32le,
598
+ count: r.uint32le,
599
+ items: new r.Array(this.COMP_PLUS_SECT_ITEM, 'count')
600
+ });
601
+ // 'bksp' - see 'tran'
602
+ // 'disp'
603
+ this.COMP_PLUS_DISP_ITEM = new r.Struct({
604
+ to: STR_REF,
605
+ display: STR_REF,
606
+ });
607
+ this.COMP_PLUS_DISP = new r.Struct({
608
+ ident: IDENT,
609
+ size: r.uint32le,
610
+ count: r.uint32le,
611
+ baseCharacter: CHAR32,
612
+ items: new r.Array(this.COMP_PLUS_DISP_ITEM, 'count'),
613
+ });
614
+ // 'elem'
615
+ this.COMP_PLUS_ELEM_ELEMENT = new r.Struct({
616
+ element: STR_OR_CHAR32_OR_USET,
617
+ flags: r.uint32le
618
+ });
619
+ this.COMP_PLUS_ELEM_STRING = new r.Struct({
620
+ offset: r.uint32le,
621
+ length: r.uint32le
622
+ });
623
+ this.COMP_PLUS_ELEM = new r.Struct({
624
+ ident: IDENT,
625
+ size: r.uint32le,
626
+ count: r.uint32le,
627
+ strings: new r.Array(this.COMP_PLUS_ELEM_STRING, 'count')
628
+ // + variable subtable: Element data (see KMXPlusBuilder.emitElements())
629
+ });
630
+ // 'finl' - see 'tran'
631
+ // 'keys' - see 'keys.kmap'
632
+ // 'layr'
633
+ this.COMP_PLUS_LAYR_ENTRY = new r.Struct({
634
+ id: r.uint32le,
635
+ mod: r.uint32le,
636
+ row: r.uint32le,
637
+ count: r.uint32le,
638
+ });
639
+ this.COMP_PLUS_LAYR_KEY = new r.Struct({
640
+ key: r.uint32le, // str: key id
641
+ });
642
+ this.COMP_PLUS_LAYR_LIST = new r.Struct({
643
+ hardware: r.uint32le,
644
+ layer: r.uint32le,
645
+ count: r.uint32le,
646
+ minDeviceWidth: r.uint32le, // integer: millimeters
647
+ });
648
+ this.COMP_PLUS_LAYR_ROW = new r.Struct({
649
+ key: r.uint32le,
650
+ count: r.uint32le,
651
+ });
652
+ this.COMP_PLUS_LAYR = new r.Struct({
653
+ ident: IDENT,
654
+ size: r.uint32le,
655
+ listCount: r.uint32le,
656
+ layerCount: r.uint32le,
657
+ rowCount: r.uint32le,
658
+ keyCount: r.uint32le,
659
+ lists: new r.Array(this.COMP_PLUS_LAYR_LIST, 'listCount'),
660
+ layers: new r.Array(this.COMP_PLUS_LAYR_ENTRY, 'layerCount'),
661
+ rows: new r.Array(this.COMP_PLUS_LAYR_ROW, 'rowCount'),
662
+ keys: new r.Array(this.COMP_PLUS_LAYR_KEY, 'keyCount'),
663
+ });
664
+ this.COMP_PLUS_KEYS_FLICK = new r.Struct({
665
+ directions: LIST_REF,
666
+ flags: r.uint32le,
667
+ to: STR_OR_CHAR32, // str | codepoint
668
+ });
669
+ this.COMP_PLUS_KEYS_FLICKS = new r.Struct({
670
+ count: r.uint32le,
671
+ flick: r.uint32le,
672
+ id: STR_REF, // str
673
+ });
674
+ this.COMP_PLUS_KEYS_KEY = new r.Struct({
675
+ to: STR_OR_CHAR32,
676
+ flags: r.uint32le,
677
+ id: STR_REF,
678
+ switch: STR_REF,
679
+ width: r.uint32le,
680
+ longPress: LIST_REF,
681
+ longPressDefault: STR_REF,
682
+ multiTap: LIST_REF,
683
+ flicks: r.uint32le, // index into flicks table
684
+ });
685
+ this.COMP_PLUS_KEYS_KMAP = new r.Struct({
686
+ vkey: r.uint32le,
687
+ mod: r.uint32le,
688
+ key: r.uint32le, // index into 'keys' subtable
689
+ });
690
+ this.COMP_PLUS_KEYS = new r.Struct({
691
+ ident: IDENT,
692
+ size: r.uint32le,
693
+ keyCount: r.uint32le,
694
+ flicksCount: r.uint32le,
695
+ flickCount: r.uint32le,
696
+ kmapCount: r.uint32le,
697
+ keys: new r.Array(this.COMP_PLUS_KEYS_KEY, 'keyCount'),
698
+ flicks: new r.Array(this.COMP_PLUS_KEYS_FLICKS, 'flicksCount'),
699
+ flick: new r.Array(this.COMP_PLUS_KEYS_FLICK, 'flickCount'),
700
+ kmap: new r.Array(this.COMP_PLUS_KEYS_KMAP, 'kmapCount'),
701
+ });
702
+ // 'list'
703
+ this.COMP_PLUS_LIST_LIST = new r.Struct({
704
+ index: r.uint32le,
705
+ count: r.uint32le,
706
+ });
707
+ this.COMP_PLUS_LIST_INDEX = new r.Struct({
708
+ str: STR_REF, // str
709
+ });
710
+ this.COMP_PLUS_LIST = new r.Struct({
711
+ ident: IDENT,
712
+ size: r.uint32le,
713
+ listCount: r.uint32le,
714
+ indexCount: r.uint32le,
715
+ lists: new r.Array(this.COMP_PLUS_LIST_LIST, 'listCount'),
716
+ indices: new r.Array(this.COMP_PLUS_LIST_INDEX, 'indexCount'),
717
+ });
718
+ // 'loca'
719
+ this.COMP_PLUS_LOCA_ITEM = r.uint32le; //str
720
+ this.COMP_PLUS_LOCA = new r.Struct({
721
+ ident: IDENT,
722
+ size: r.uint32le,
723
+ count: r.uint32le,
724
+ items: new r.Array(this.COMP_PLUS_LOCA_ITEM, 'count')
725
+ });
726
+ // 'meta'
727
+ this.COMP_PLUS_META = new r.Struct({
728
+ ident: IDENT,
729
+ size: r.uint32le,
730
+ author: STR_REF,
731
+ conform: STR_REF,
732
+ layout: STR_REF,
733
+ normalization: STR_REF,
734
+ indicator: STR_REF,
735
+ version: STR_REF,
736
+ settings: r.uint32le, //new r.Bitfield(r.uint32le, ['fallback', 'transformFailure', 'transformPartial'])
737
+ });
738
+ // 'name'
739
+ this.COMP_PLUS_NAME_ITEM = r.uint32le; //str
740
+ this.COMP_PLUS_NAME = new r.Struct({
741
+ ident: IDENT,
742
+ size: r.uint32le,
743
+ count: r.uint32le,
744
+ items: new r.Array(this.COMP_PLUS_NAME_ITEM, 'count')
745
+ });
746
+ // 'ordr' now part of 'tran'
747
+ // 'strs'
748
+ this.COMP_PLUS_STRS_ITEM = new r.Struct({
749
+ // While we use length which is number of utf-16 code units excluding null terminator,
750
+ // we always write a null terminator, so we can get restructure to do that for us here
751
+ offset: r.uint32le,
752
+ length: r.uint32le
753
+ });
754
+ this.COMP_PLUS_STRS = new r.Struct({
755
+ ident: IDENT,
756
+ size: r.uint32le,
757
+ count: r.uint32le,
758
+ items: new r.Array(this.COMP_PLUS_STRS_ITEM, 'count')
759
+ // + variable subtable: String data (see KMXPlusBuilder.emitStrings())
760
+ });
761
+ // 'tran'
762
+ this.COMP_PLUS_TRAN_GROUP = new r.Struct({
763
+ type: r.uint32le,
764
+ count: r.uint32le,
765
+ index: r.uint32le, //index into subtable
766
+ });
767
+ this.COMP_PLUS_TRAN_TRANSFORM = new r.Struct({
768
+ from: STR_REF,
769
+ to: STR_REF,
770
+ mapFrom: ELEM_REF,
771
+ mapTo: ELEM_REF //elem
772
+ });
773
+ this.COMP_PLUS_TRAN_REORDER = new r.Struct({
774
+ elements: ELEM_REF,
775
+ before: ELEM_REF, //elem
776
+ });
777
+ this.COMP_PLUS_TRAN = new r.Struct({
778
+ ident: IDENT,
779
+ size: r.uint32le,
780
+ groupCount: r.uint32le,
781
+ transformCount: r.uint32le,
782
+ reorderCount: r.uint32le,
783
+ groups: new r.Array(this.COMP_PLUS_TRAN_GROUP, 'groupCount'),
784
+ transforms: new r.Array(this.COMP_PLUS_TRAN_TRANSFORM, 'transformCount'),
785
+ reorders: new r.Array(this.COMP_PLUS_TRAN_REORDER, 'reorderCount'),
786
+ });
787
+ // 'uset'
788
+ this.COMP_PLUS_USET_USET = new r.Struct({
789
+ range: r.uint32le,
790
+ count: r.uint32le,
791
+ pattern: STR_REF, // str
792
+ });
793
+ this.COMP_PLUS_USET_RANGE = new r.Struct({
794
+ start: CHAR32,
795
+ end: CHAR32,
796
+ });
797
+ this.COMP_PLUS_USET = new r.Struct({
798
+ ident: IDENT,
799
+ size: r.uint32le,
800
+ usetCount: r.uint32le,
801
+ rangeCount: r.uint32le,
802
+ usets: new r.Array(this.COMP_PLUS_USET_USET, 'usetCount'),
803
+ ranges: new r.Array(this.COMP_PLUS_USET_RANGE, 'rangeCount'),
804
+ });
805
+ // 'vars'
806
+ this.COMP_PLUS_VARS_ITEM = new r.Struct({
807
+ type: r.uint32le,
808
+ id: STR_REF,
809
+ value: STR_REF,
810
+ elem: ELEM_REF,
811
+ });
812
+ this.COMP_PLUS_VARS = new r.Struct({
813
+ ident: IDENT,
814
+ size: r.uint32le,
815
+ markers: LIST_REF,
816
+ varCount: r.uint32le,
817
+ varEntries: new r.Array(this.COMP_PLUS_VARS_ITEM, 'varCount'),
818
+ });
819
+ // 'vkey'
820
+ this.COMP_PLUS_VKEY_ITEM = new r.Struct({
821
+ vkey: r.uint32le,
822
+ target: r.uint32le
823
+ });
824
+ this.COMP_PLUS_VKEY = new r.Struct({
825
+ ident: IDENT,
826
+ size: r.uint32le,
827
+ count: r.uint32le,
828
+ items: new r.Array(this.COMP_PLUS_VKEY_ITEM, 'count')
829
+ });
830
+ // Aliases
831
+ this.COMP_PLUS_BKSP = this.COMP_PLUS_TRAN;
832
+ }
833
+ }
834
+ //# debugId=79717ffa-eda4-5839-9ea7-a96a9b42edae
835
+ //# sourceMappingURL=kmx-plus.js.map