diff --git a/developer/src/kmc-kmn/src/kmw-compiler/compiler-globals.ts b/developer/src/kmc-kmn/src/kmw-compiler/compiler-globals.ts index ac353c53b5..e7ce9dd01e 100644 --- a/developer/src/kmc-kmn/src/kmw-compiler/compiler-globals.ts +++ b/developer/src/kmc-kmn/src/kmw-compiler/compiler-globals.ts @@ -8,6 +8,9 @@ export let FMnemonic: boolean; export let options: CompilerOptions; export let callbacks: CompilerCallbacks; export let kmnfile: string; +export let FUnreachableKeys: KMX.KEY[]; +export let FCallFunctions: string[]; +export let FFix183_LadderLength: number; export function setupGlobals(_callbacks: CompilerCallbacks, _options: CompilerOptions, _tab: string, _nl: string, _keyboard: KMX.KEYBOARD, _kmnfile: string) { callbacks = _callbacks; @@ -16,6 +19,9 @@ export function setupGlobals(_callbacks: CompilerCallbacks, _options: CompilerOp nl = _nl; fk = _keyboard; kmnfile = _kmnfile; + FUnreachableKeys = []; + FCallFunctions = []; + FFix183_LadderLength = 100; // TODO: option } export function IsKeyboardVersion10OrLater(): boolean { diff --git a/developer/src/kmc-kmn/src/kmw-compiler/constants.ts b/developer/src/kmc-kmn/src/kmw-compiler/constants.ts new file mode 100644 index 0000000000..87a59e796c --- /dev/null +++ b/developer/src/kmc-kmn/src/kmw-compiler/constants.ts @@ -0,0 +1,71 @@ +export enum TRequiredKey { + K_LOPT, K_BKSP, K_ENTER +}; // I4447 + +export const + CRequiredKeys: TRequiredKey[] = [TRequiredKey.K_LOPT, TRequiredKey.K_BKSP, TRequiredKey.K_ENTER]; // I4447 + +// See also builder.js: specialCharacters; web/source/osk/oskKey.ts: specialCharacters +export const + CSpecialText10: string = '*Shift*\0*Enter*\0*Tab*\0*BkSp*\0*Menu*\0*Hide*\0*Alt*\0*Ctrl*\0*Caps*\0' + + '*ABC*\0*abc*\0*123*\0*Symbol*\0*Currency*\0*Shifted*\0*AltGr*\0*TabLeft*', + // these names were added in Keyman 14 + CSpecialText14: string = '*LTREnter*\0*LTRBkSp*\0*RTLEnter*\0*RTLBkSp*\0*ShiftLock*\0*ShiftedLock*\0*ZWNJ*\0*ZWNJiOS*\0*ZWNJAndroid*', + CSpecialText14ZWNJ: string = '*ZWNJ*\0*ZWNJiOS*\0*ZWNJAndroid*', + CSpecialText14Map: string[][] = [ + ['*LTREnter*', '*Enter*'], + ['*LTRBkSp*', '*BkSp*'], + ['*RTLEnter*', '*Enter*'], + ['*RTLBkSp*', '*BkSp*'], + ['*ShiftLock*', '*Shift*'], + ['*ShiftedLock*', '*Shifted*'], + ['*ZWNJ*', '<|>'], + ['*ZWNJiOS*', '<|>'], + ['*ZWNJAndroid*', '<|>'] + ]; + + +// These correspond to TSS_ values in kmx.ts +export const +KMXCodeNames: string[] = [ + '', + 'any', 'index', 'context', 'nul', 'use', 'return', 'beep', 'deadkey', + '', + 'extended', '', 'switch', 'key', 'clearcontext', 'call', + '', 'contextex', 'notany', + 'set', 'if', 'save', 'reset', // I3429 + 'if(&system)', 'set(&system)']; // I3430 // I3437 + + +export const + USEnglishUnshift: string = ' `' + '1234567890' + '-' + '=' + 'qwertyuiop' + '[' + ']' + '\\' + 'asdfghjkl' + ';' + '\'' + 'zxcvbnm' + ',' + '.' + '/', + USEnglishShift: string = 0xFF + '~' + '!@#$%^&*()' + '_' + '+' + 'QWERTYUIOP' + '{' + '}' + '|' + 'ASDFGHJKL' + ':' + '"' + 'ZXCVBNM' + '<' + '>' + '?', + USEnglishValues: string = 0x20 + 0xc0 + '1234567890' + 0xbd + 0xbb + 'QWERTYUIOP' + 0xdb + 0xdd + 0xdc + 'ASDFGHJKL' + 0xba + 0xde + 'ZXCVBNM' + 0xbc + 0xbe + 0xbf, + UnreachableKeyCodes: number[] = [ // I4141 + 0x00, // &H0 + 0x01, //VK_LBUTTON, // &H1 + 0x02, //VK_RBUTTON, // &H2 + 0x03, //VK_CANCEL, // &H3 + 0x04, //VK_MBUTTON, // &H4 + 0x05, // &H5 + 0x06, // &H6 + 0x07, // &H7 + 0x0A, // &HA + 0x0B, // &HB + 0x0E, // &HE + 0x0F, // &HF + 0x10, //VK_SHIFT, // &H10 + 0x11, //VK_CONTROL, // &H11 + 0x12, //VK_MENU, // &H12 + 0x13, //VK_PAUSE, // &H13 + 0x14, //VK_CAPITAL, // &H14 + 0x1B, //VK_ESCAPE, // &H1B + + 0x90, //VK_NUMLOCK, // &H90 + 0x91 //VK_SCROLL // &H91 + ]; + +/** + * The character set that we allow for identifiers for JavaScript + */ +export const SValidIdentifierCharSet = /[A-Za-z0-9_]/; diff --git a/developer/src/kmc-kmn/src/kmw-compiler/javascript-strings.ts b/developer/src/kmc-kmn/src/kmw-compiler/javascript-strings.ts index 798df1a0b1..23e0936db2 100644 --- a/developer/src/kmc-kmn/src/kmw-compiler/javascript-strings.ts +++ b/developer/src/kmc-kmn/src/kmw-compiler/javascript-strings.ts @@ -1,15 +1,11 @@ import { TSentinelRecord, GetSuppChar, ExpandSentinel, incxstr, xstrlen, xstrlen_printing } from "./util.js"; import { KMX } from "@keymanapp/common-types"; -import { callbacks, FMnemonic, FTabStop, IsKeyboardVersion10OrLater, IsKeyboardVersion14OrLater, nl, options } from "./compiler-globals.js"; +import { callbacks, FCallFunctions, FFix183_LadderLength, FMnemonic, FTabStop, FUnreachableKeys, IsKeyboardVersion10OrLater, IsKeyboardVersion14OrLater, nl, options } from "./compiler-globals.js"; import { KmwCompilerMessages } from "./messages.js"; -import { FFix183_LadderLength, FormatModifierAsBitflags, RuleIsExcludedByPlatform } from "./write-compiled-keyboard.js"; - -const SValidIdentifierCharSet = /[A-Za-z0-9_]/; - -// TODO: lifecycle -let FUnreachableKeys: KMX.KEY[] = []; -let FCallFunctions: string[] = []; +import { FormatModifierAsBitflags, RuleIsExcludedByPlatform } from "./write-compiled-keyboard.js"; +import { KMXCodeNames, SValidIdentifierCharSet, UnreachableKeyCodes, USEnglishShift, USEnglishUnshift, USEnglishValues } from "./constants.js"; +import { KMWVKeyNames, TKeymanWebTouchStandardKey, VKeyNames } from "./keymanweb-key-codes.js"; export function JavaScript_Name(i: number, pwszName: string, KeepNameForPersistentStorage: boolean = false): string { // I3659 let FChanged: boolean = false; @@ -235,34 +231,6 @@ export function JavaScript_Rules(keyboard: KMX.KEYBOARD, fMnemonic: boolean, fgp return result; } -const - USEnglishUnshift: string = ' `' + '1234567890' + '-' + '=' + 'qwertyuiop' + '[' + ']' + '\\' + 'asdfghjkl' + ';' + '\'' + 'zxcvbnm' + ',' + '.' + '/', - USEnglishShift: string = 0xFF + '~' + '!@#$%^&*()' + '_' + '+' + 'QWERTYUIOP' + '{' + '}' + '|' + 'ASDFGHJKL' + ':' + '"' + 'ZXCVBNM' + '<' + '>' + '?', - USEnglishValues: string = 0x20 + 0xc0 + '1234567890' + 0xbd + 0xbb + 'QWERTYUIOP' + 0xdb + 0xdd + 0xdc + 'ASDFGHJKL' + 0xba + 0xde + 'ZXCVBNM' + 0xbc + 0xbe + 0xbf, - UnreachableKeyCodes: number[] = [ // I4141 - 0x00, // &H0 - 0x01, //VK_LBUTTON, // &H1 - 0x02, //VK_RBUTTON, // &H2 - 0x03, //VK_CANCEL, // &H3 - 0x04, //VK_MBUTTON, // &H4 - 0x05, // &H5 - 0x06, // &H6 - 0x07, // &H7 - 0x0A, // &HA - 0x0B, // &HB - 0x0E, // &HE - 0x0F, // &HF - 0x10, //VK_SHIFT, // &H10 - 0x11, //VK_CONTROL, // &H11 - 0x12, //VK_MENU, // &H12 - 0x13, //VK_PAUSE, // &H13 - 0x14, //VK_CAPITAL, // &H14 - 0x1B, //VK_ESCAPE, // &H1B - - 0x90, //VK_NUMLOCK, // &H90 - 0x91 //VK_SCROLL // &H91 - ]; - export function JavaScript_Shift(fkp: KMX.KEY, FMnemonic: boolean): number { if (FMnemonic) { if (fkp.ShiftFlags & KMX.KMXFile.VIRTUALCHARKEY) { @@ -320,294 +288,6 @@ export function JavaScript_ShiftAsString(fkp: KMX.KEY, FMnemonic: boolean): stri return ' '+FormatModifierAsBitflags(JavaScript_Shift(fkp, FMnemonic)); } -export const VKeyNames = [ // from vkeys.h -// Key Codes -"K_?00", // &H0 -"K_LBUTTON", // &H1 -"K_RBUTTON", // &H2 -"K_CANCEL", // &H3 -"K_MBUTTON", // &H4 -"K_?05", // &H5 -"K_?06", // &H6 -"K_?07", // &H7 -"K_BKSP", // &H8 -"K_TAB", // &H9 -"K_?0A", // &HA -"K_?0B", // &HB -"K_KP5", // &HC -"K_ENTER", // &HD -"K_?0E", // &HE -"K_?0F", // &HF -"K_SHIFT", // &H10 -"K_CONTROL", // &H11 -"K_ALT", // &H12 -"K_PAUSE", // &H13 -"K_CAPS", // &H14 -"K_KANJI?15", // &H15 -"K_KANJI?16", // &H16 -"K_KANJI?17", // &H17 -"K_KANJI?18", // &H18 -"K_KANJI?19", // &H19 -"K_?1A", // &H1A -"K_ESC", // &H1B -"K_KANJI?1C", // &H1C -"K_KANJI?1D", // &H1D -"K_KANJI?1E", // &H1E -"K_KANJI?1F", // &H1F -"K_SPACE", // &H20 -"K_PGUP", // &H21 -"K_PGDN", // &H22 -"K_END", // &H23 -"K_HOME", // &H24 -"K_LEFT", // &H25 -"K_UP", // &H26 -"K_RIGHT", // &H27 -"K_DOWN", // &H28 -"K_SEL", // &H29 -"K_PRINT", // &H2A -"K_EXEC", // &H2B -"K_PRTSCN", // &H2C -"K_INS", // &H2D -"K_DEL", // &H2E -"K_HELP", // &H2F -"K_0", // &H30 -"K_1", // &H31 -"K_2", // &H32 -"K_3", // &H33 -"K_4", // &H34 -"K_5", // &H35 -"K_6", // &H36 -"K_7", // &H37 -"K_8", // &H38 -"K_9", // &H39 -"K_?3A", // &H3A -"K_?3B", // &H3B -"K_?3C", // &H3C -"K_?3D", // &H3D -"K_?3E", // &H3E -"K_?3F", // &H3F -"K_?40", // &H40 - -"K_A", // &H41 -"K_B", // &H42 -"K_C", // &H43 -"K_D", // &H44 -"K_E", // &H45 -"K_F", // &H46 -"K_G", // &H47 -"K_H", // &H48 -"K_I", // &H49 -"K_J", // &H4A -"K_K", // &H4B -"K_L", // &H4C -"K_M", // &H4D -"K_N", // &H4E -"K_O", // &H4F -"K_P", // &H50 -"K_Q", // &H51 -"K_R", // &H52 -"K_S", // &H53 -"K_T", // &H54 -"K_U", // &H55 -"K_V", // &H56 -"K_W", // &H57 -"K_X", // &H58 -"K_Y", // &H59 -"K_Z", // &H5A -"K_?5B", // &H5B -"K_?5C", // &H5C -"K_?5D", // &H5D -"K_?5E", // &H5E -"K_?5F", // &H5F -"K_NP0", // &H60 -"K_NP1", // &H61 -"K_NP2", // &H62 -"K_NP3", // &H63 -"K_NP4", // &H64 -"K_NP5", // &H65 -"K_NP6", // &H66 -"K_NP7", // &H67 -"K_NP8", // &H68 -"K_NP9", // &H69 -"K_NPSTAR", // &H6A -"K_NPPLUS", // &H6B -"K_SEPARATOR", // &H6C -"K_NPMINUS", // &H6D -"K_NPDOT", // &H6E -"K_NPSLASH", // &H6F -"K_F1", // &H70 -"K_F2", // &H71 -"K_F3", // &H72 -"K_F4", // &H73 -"K_F5", // &H74 -"K_F6", // &H75 -"K_F7", // &H76 -"K_F8", // &H77 -"K_F9", // &H78 -"K_F10", // &H79 -"K_F11", // &H7A -"K_F12", // &H7B -"K_F13", // &H7C -"K_F14", // &H7D -"K_F15", // &H7E -"K_F16", // &H7F -"K_F17", // &H80 -"K_F18", // &H81 -"K_F19", // &H82 -"K_F20", // &H83 -"K_F21", // &H84 -"K_F22", // &H85 -"K_F23", // &H86 -"K_F24", // &H87 - -"K_?88", // &H88 -"K_?89", // &H89 -"K_?8A", // &H8A -"K_?8B", // &H8B -"K_?8C", // &H8C -"K_?8D", // &H8D -"K_?8E", // &H8E -"K_?8F", // &H8F - -"K_NUMLOCK", // &H90 -"K_SCROLL", // &H91 - -"K_?92", // &H92 -"K_?93", // &H93 -"K_?94", // &H94 -"K_?95", // &H95 -"K_?96", // &H96 -"K_?97", // &H97 -"K_?98", // &H98 -"K_?99", // &H99 -"K_?9A", // &H9A -"K_?9B", // &H9B -"K_?9C", // &H9C -"K_?9D", // &H9D -"K_?9E", // &H9E -"K_?9F", // &H9F -"K_?A0", // &HA0 -"K_?A1", // &HA1 -"K_?A2", // &HA2 -"K_?A3", // &HA3 -"K_?A4", // &HA4 -"K_?A5", // &HA5 -"K_?A6", // &HA6 -"K_?A7", // &HA7 -"K_?A8", // &HA8 -"K_?A9", // &HA9 -"K_?AA", // &HAA -"K_?AB", // &HAB -"K_?AC", // &HAC -"K_?AD", // &HAD -"K_?AE", // &HAE -"K_?AF", // &HAF -"K_?B0", // &HB0 -"K_?B1", // &HB1 -"K_?B2", // &HB2 -"K_?B3", // &HB3 -"K_?B4", // &HB4 -"K_?B5", // &HB5 -"K_?B6", // &HB6 -"K_?B7", // &HB7 -"K_?B8", // &HB8 -"K_?B9", // &HB9 - -"K_COLON", // &HBA -"K_EQUAL", // &HBB -"K_COMMA", // &HBC -"K_HYPHEN", // &HBD -"K_PERIOD", // &HBE -"K_SLASH", // &HBF -"K_BKQUOTE", // &HC0 - -"K_?C1", // &HC1 -"K_?C2", // &HC2 -"K_?C3", // &HC3 -"K_?C4", // &HC4 -"K_?C5", // &HC5 -"K_?C6", // &HC6 -"K_?C7", // &HC7 -"K_?C8", // &HC8 -"K_?C9", // &HC9 -"K_?CA", // &HCA -"K_?CB", // &HCB -"K_?CC", // &HCC -"K_?CD", // &HCD -"K_?CE", // &HCE -"K_?CF", // &HCF -"K_?D0", // &HD0 -"K_?D1", // &HD1 -"K_?D2", // &HD2 -"K_?D3", // &HD3 -"K_?D4", // &HD4 -"K_?D5", // &HD5 -"K_?D6", // &HD6 -"K_?D7", // &HD7 -"K_?D8", // &HD8 -"K_?D9", // &HD9 -"K_?DA", // &HDA - -"K_LBRKT", // &HDB -"K_BKSLASH", // &HDC -"K_RBRKT", // &HDD -"K_QUOTE", // &HDE -"K_oDF", // &HDF -"K_oE0", // &HE0 -"K_oE1", // &HE1 -"K_oE2", // &HE2 -"K_oE3", // &HE3 -"K_oE4", // &HE4 - -"K_?E5", // &HE5 - -"K_oE6", // &HE6 - -"K_?E7", // &HE7 -"K_?E8", // &HE8 - -"K_oE9", // &HE9 -"K_oEA", // &HEA -"K_oEB", // &HEB -"K_oEC", // &HEC -"K_oED", // &HED -"K_oEE", // &HEE -"K_oEF", // &HEF -"K_oF0", // &HF0 -"K_oF1", // &HF1 -"K_oF2", // &HF2 -"K_oF3", // &HF3 -"K_oF4", // &HF4 -"K_oF5", // &HF5 - -"K_?F6", // &HF6 -"K_?F7", // &HF7 -"K_?F8", // &HF8 -"K_?F9", // &HF9 -"K_?FA", // &HFA -"K_?FB", // &HFB -"K_?FC", // &HFC -"K_?FD", // &HFD -"K_?FE", // &HFE -"K_?FF" // &HFF -]; - -const enum - TKeymanWebTouchStandardKey { - K_LOPT = 50001, - K_ROPT = 50002, - K_NUMERALS = 50003, - K_SYMBOLS = 50004, - K_CURRENCIES = 50005, - K_UPPER = 50006, - K_LOWER = 50007, - K_ALPHA = 50008, - K_SHIFTED = 50009, - K_ALTGR = 50010, - K_TABBACK = 50011, - K_TABFWD = 50012 - }; - function FormatKeyForErrorMessage(fkp: KMX.KEY, FMnemonic: boolean): string { function FormatShift(ShiftFlags: number): string { const @@ -736,16 +416,6 @@ function JavaScript_ContextLength(Context: string): number { return xstrlen_printing(Context); } -const - KMXCodeNames: string[] = [ - '', - 'any', 'index', 'context', 'nul', 'use', 'return', 'beep', 'deadkey', - '', - 'extended', '', 'switch', 'key', 'clearcontext', 'call', - '', 'contextex', 'notany', - 'set', 'if', 'save', 'reset', // I3429 - 'if(&system)', 'set(&system)']; // I3430 // I3437 - function GetCodeName(code: number): string { if (code >= 0 && code < KMXCodeNames.length && KMXCodeNames[code] != '') { return KMXCodeNames[code]; @@ -1273,270 +943,6 @@ export function zeroPadHex(n: number, len: number): string { return result; } -// TODO: move elsewhere -/// -/// Virtual key names used in KeymanWeb. Blanks indicate a -/// virtual key that is not recognised by KeymanWeb. -/// -const KMWVKeyNames: string[] = [ - '', - '', - '', - '', - '', - '', - '', - '', - 'K_BKSP', - 'K_TAB', - '', - '', - '', - 'K_ENTER', - '', - '', - 'K_SHIFT', - 'K_CONTROL', - 'K_ALT', - 'K_PAUSE', - 'K_CAPS', - '', - '', - '', - '', - '', - '', - 'K_ESC', - '', - '', - '', - '', - 'K_SPACE', - 'K_PGUP', - 'K_PGDN', - 'K_END', - 'K_HOME', - 'K_LEFT', - 'K_UP', - 'K_RIGHT', - 'K_DOWN', - 'K_SEL', - 'K_PRINT', - 'K_EXEC', - '', - 'K_INS', - 'K_DEL', - 'K_HELP', - 'K_0', - 'K_1', - 'K_2', - 'K_3', - 'K_4', - 'K_5', - 'K_6', - 'K_7', - 'K_8', - 'K_9', - '', - '', - '', - '', - '', - '', - '', - 'K_A', - 'K_B', - 'K_C', - 'K_D', - 'K_E', - 'K_F', - 'K_G', - 'K_H', - 'K_I', - 'K_J', - 'K_K', - 'K_L', - 'K_M', - 'K_N', - 'K_O', - 'K_P', - 'K_Q', - 'K_R', - 'K_S', - 'K_T', - 'K_U', - 'K_V', - 'K_W', - 'K_X', - 'K_Y', - 'K_Z', - '', - '', - '', - '', - '', - 'K_NP0', - 'K_NP1', - 'K_NP2', - 'K_NP3', - 'K_NP4', - 'K_NP5', - 'K_NP6', - 'K_NP7', - 'K_NP8', - 'K_NP9', - 'K_NPSTAR', - 'K_NPPLUS', - 'K_SEPARATOR', - 'K_NPMINUS', - 'K_NPDOT', - 'K_NPSLASH', - 'K_F1', - 'K_F2', - 'K_F3', - 'K_F4', - 'K_F5', - 'K_F6', - 'K_F7', - 'K_F8', - 'K_F9', - 'K_F10', - 'K_F11', - 'K_F12', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - 'K_NUMLOCK', - 'K_SCROLL', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - 'K_LSHIFT', - 'K_RSHIFT', - 'K_LCONTROL', - 'K_RCONTROL', - 'K_LALT', - 'K_RALT', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - 'K_COLON', - 'K_EQUAL', - 'K_COMMA', - 'K_HYPHEN', - 'K_PERIOD', - 'K_SLASH', - 'K_BKQUOTE', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - 'K_LBRKT', - 'K_BKSLASH', - 'K_RBRKT', - 'K_QUOTE', - '', - '', - '', - 'K_oE2', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '' -]; - /** * Converts a key value into a constant * diff --git a/developer/src/kmc-kmn/src/kmw-compiler/keymanweb-key-codes.ts b/developer/src/kmc-kmn/src/kmw-compiler/keymanweb-key-codes.ts index 98e609d747..d248b5a5b3 100644 --- a/developer/src/kmc-kmn/src/kmw-compiler/keymanweb-key-codes.ts +++ b/developer/src/kmc-kmn/src/kmw-compiler/keymanweb-key-codes.ts @@ -268,4 +268,555 @@ export const 0x00, // L"K_?FD", // &HFD 0x00, // L"K_?FE", // &HFE 0x00 // L"K_?FF" // &HFF - ]; \ No newline at end of file + ]; + +/// +/// Virtual key names used in KeymanWeb. Blanks indicate a +/// virtual key that is not recognised by KeymanWeb. +/// +export const KMWVKeyNames: string[] = [ + '', + '', + '', + '', + '', + '', + '', + '', + 'K_BKSP', + 'K_TAB', + '', + '', + '', + 'K_ENTER', + '', + '', + 'K_SHIFT', + 'K_CONTROL', + 'K_ALT', + 'K_PAUSE', + 'K_CAPS', + '', + '', + '', + '', + '', + '', + 'K_ESC', + '', + '', + '', + '', + 'K_SPACE', + 'K_PGUP', + 'K_PGDN', + 'K_END', + 'K_HOME', + 'K_LEFT', + 'K_UP', + 'K_RIGHT', + 'K_DOWN', + 'K_SEL', + 'K_PRINT', + 'K_EXEC', + '', + 'K_INS', + 'K_DEL', + 'K_HELP', + 'K_0', + 'K_1', + 'K_2', + 'K_3', + 'K_4', + 'K_5', + 'K_6', + 'K_7', + 'K_8', + 'K_9', + '', + '', + '', + '', + '', + '', + '', + 'K_A', + 'K_B', + 'K_C', + 'K_D', + 'K_E', + 'K_F', + 'K_G', + 'K_H', + 'K_I', + 'K_J', + 'K_K', + 'K_L', + 'K_M', + 'K_N', + 'K_O', + 'K_P', + 'K_Q', + 'K_R', + 'K_S', + 'K_T', + 'K_U', + 'K_V', + 'K_W', + 'K_X', + 'K_Y', + 'K_Z', + '', + '', + '', + '', + '', + 'K_NP0', + 'K_NP1', + 'K_NP2', + 'K_NP3', + 'K_NP4', + 'K_NP5', + 'K_NP6', + 'K_NP7', + 'K_NP8', + 'K_NP9', + 'K_NPSTAR', + 'K_NPPLUS', + 'K_SEPARATOR', + 'K_NPMINUS', + 'K_NPDOT', + 'K_NPSLASH', + 'K_F1', + 'K_F2', + 'K_F3', + 'K_F4', + 'K_F5', + 'K_F6', + 'K_F7', + 'K_F8', + 'K_F9', + 'K_F10', + 'K_F11', + 'K_F12', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'K_NUMLOCK', + 'K_SCROLL', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'K_LSHIFT', + 'K_RSHIFT', + 'K_LCONTROL', + 'K_RCONTROL', + 'K_LALT', + 'K_RALT', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'K_COLON', + 'K_EQUAL', + 'K_COMMA', + 'K_HYPHEN', + 'K_PERIOD', + 'K_SLASH', + 'K_BKQUOTE', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'K_LBRKT', + 'K_BKSLASH', + 'K_RBRKT', + 'K_QUOTE', + '', + '', + '', + 'K_oE2', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '' +]; + +export const VKeyNames = [ // from vkeys.h +// Key Codes +"K_?00", // &H0 +"K_LBUTTON", // &H1 +"K_RBUTTON", // &H2 +"K_CANCEL", // &H3 +"K_MBUTTON", // &H4 +"K_?05", // &H5 +"K_?06", // &H6 +"K_?07", // &H7 +"K_BKSP", // &H8 +"K_TAB", // &H9 +"K_?0A", // &HA +"K_?0B", // &HB +"K_KP5", // &HC +"K_ENTER", // &HD +"K_?0E", // &HE +"K_?0F", // &HF +"K_SHIFT", // &H10 +"K_CONTROL", // &H11 +"K_ALT", // &H12 +"K_PAUSE", // &H13 +"K_CAPS", // &H14 +"K_KANJI?15", // &H15 +"K_KANJI?16", // &H16 +"K_KANJI?17", // &H17 +"K_KANJI?18", // &H18 +"K_KANJI?19", // &H19 +"K_?1A", // &H1A +"K_ESC", // &H1B +"K_KANJI?1C", // &H1C +"K_KANJI?1D", // &H1D +"K_KANJI?1E", // &H1E +"K_KANJI?1F", // &H1F +"K_SPACE", // &H20 +"K_PGUP", // &H21 +"K_PGDN", // &H22 +"K_END", // &H23 +"K_HOME", // &H24 +"K_LEFT", // &H25 +"K_UP", // &H26 +"K_RIGHT", // &H27 +"K_DOWN", // &H28 +"K_SEL", // &H29 +"K_PRINT", // &H2A +"K_EXEC", // &H2B +"K_PRTSCN", // &H2C +"K_INS", // &H2D +"K_DEL", // &H2E +"K_HELP", // &H2F +"K_0", // &H30 +"K_1", // &H31 +"K_2", // &H32 +"K_3", // &H33 +"K_4", // &H34 +"K_5", // &H35 +"K_6", // &H36 +"K_7", // &H37 +"K_8", // &H38 +"K_9", // &H39 +"K_?3A", // &H3A +"K_?3B", // &H3B +"K_?3C", // &H3C +"K_?3D", // &H3D +"K_?3E", // &H3E +"K_?3F", // &H3F +"K_?40", // &H40 + +"K_A", // &H41 +"K_B", // &H42 +"K_C", // &H43 +"K_D", // &H44 +"K_E", // &H45 +"K_F", // &H46 +"K_G", // &H47 +"K_H", // &H48 +"K_I", // &H49 +"K_J", // &H4A +"K_K", // &H4B +"K_L", // &H4C +"K_M", // &H4D +"K_N", // &H4E +"K_O", // &H4F +"K_P", // &H50 +"K_Q", // &H51 +"K_R", // &H52 +"K_S", // &H53 +"K_T", // &H54 +"K_U", // &H55 +"K_V", // &H56 +"K_W", // &H57 +"K_X", // &H58 +"K_Y", // &H59 +"K_Z", // &H5A +"K_?5B", // &H5B +"K_?5C", // &H5C +"K_?5D", // &H5D +"K_?5E", // &H5E +"K_?5F", // &H5F +"K_NP0", // &H60 +"K_NP1", // &H61 +"K_NP2", // &H62 +"K_NP3", // &H63 +"K_NP4", // &H64 +"K_NP5", // &H65 +"K_NP6", // &H66 +"K_NP7", // &H67 +"K_NP8", // &H68 +"K_NP9", // &H69 +"K_NPSTAR", // &H6A +"K_NPPLUS", // &H6B +"K_SEPARATOR", // &H6C +"K_NPMINUS", // &H6D +"K_NPDOT", // &H6E +"K_NPSLASH", // &H6F +"K_F1", // &H70 +"K_F2", // &H71 +"K_F3", // &H72 +"K_F4", // &H73 +"K_F5", // &H74 +"K_F6", // &H75 +"K_F7", // &H76 +"K_F8", // &H77 +"K_F9", // &H78 +"K_F10", // &H79 +"K_F11", // &H7A +"K_F12", // &H7B +"K_F13", // &H7C +"K_F14", // &H7D +"K_F15", // &H7E +"K_F16", // &H7F +"K_F17", // &H80 +"K_F18", // &H81 +"K_F19", // &H82 +"K_F20", // &H83 +"K_F21", // &H84 +"K_F22", // &H85 +"K_F23", // &H86 +"K_F24", // &H87 + +"K_?88", // &H88 +"K_?89", // &H89 +"K_?8A", // &H8A +"K_?8B", // &H8B +"K_?8C", // &H8C +"K_?8D", // &H8D +"K_?8E", // &H8E +"K_?8F", // &H8F + +"K_NUMLOCK", // &H90 +"K_SCROLL", // &H91 + +"K_?92", // &H92 +"K_?93", // &H93 +"K_?94", // &H94 +"K_?95", // &H95 +"K_?96", // &H96 +"K_?97", // &H97 +"K_?98", // &H98 +"K_?99", // &H99 +"K_?9A", // &H9A +"K_?9B", // &H9B +"K_?9C", // &H9C +"K_?9D", // &H9D +"K_?9E", // &H9E +"K_?9F", // &H9F +"K_?A0", // &HA0 +"K_?A1", // &HA1 +"K_?A2", // &HA2 +"K_?A3", // &HA3 +"K_?A4", // &HA4 +"K_?A5", // &HA5 +"K_?A6", // &HA6 +"K_?A7", // &HA7 +"K_?A8", // &HA8 +"K_?A9", // &HA9 +"K_?AA", // &HAA +"K_?AB", // &HAB +"K_?AC", // &HAC +"K_?AD", // &HAD +"K_?AE", // &HAE +"K_?AF", // &HAF +"K_?B0", // &HB0 +"K_?B1", // &HB1 +"K_?B2", // &HB2 +"K_?B3", // &HB3 +"K_?B4", // &HB4 +"K_?B5", // &HB5 +"K_?B6", // &HB6 +"K_?B7", // &HB7 +"K_?B8", // &HB8 +"K_?B9", // &HB9 + +"K_COLON", // &HBA +"K_EQUAL", // &HBB +"K_COMMA", // &HBC +"K_HYPHEN", // &HBD +"K_PERIOD", // &HBE +"K_SLASH", // &HBF +"K_BKQUOTE", // &HC0 + +"K_?C1", // &HC1 +"K_?C2", // &HC2 +"K_?C3", // &HC3 +"K_?C4", // &HC4 +"K_?C5", // &HC5 +"K_?C6", // &HC6 +"K_?C7", // &HC7 +"K_?C8", // &HC8 +"K_?C9", // &HC9 +"K_?CA", // &HCA +"K_?CB", // &HCB +"K_?CC", // &HCC +"K_?CD", // &HCD +"K_?CE", // &HCE +"K_?CF", // &HCF +"K_?D0", // &HD0 +"K_?D1", // &HD1 +"K_?D2", // &HD2 +"K_?D3", // &HD3 +"K_?D4", // &HD4 +"K_?D5", // &HD5 +"K_?D6", // &HD6 +"K_?D7", // &HD7 +"K_?D8", // &HD8 +"K_?D9", // &HD9 +"K_?DA", // &HDA + +"K_LBRKT", // &HDB +"K_BKSLASH", // &HDC +"K_RBRKT", // &HDD +"K_QUOTE", // &HDE +"K_oDF", // &HDF +"K_oE0", // &HE0 +"K_oE1", // &HE1 +"K_oE2", // &HE2 +"K_oE3", // &HE3 +"K_oE4", // &HE4 + +"K_?E5", // &HE5 + +"K_oE6", // &HE6 + +"K_?E7", // &HE7 +"K_?E8", // &HE8 + +"K_oE9", // &HE9 +"K_oEA", // &HEA +"K_oEB", // &HEB +"K_oEC", // &HEC +"K_oED", // &HED +"K_oEE", // &HEE +"K_oEF", // &HEF +"K_oF0", // &HF0 +"K_oF1", // &HF1 +"K_oF2", // &HF2 +"K_oF3", // &HF3 +"K_oF4", // &HF4 +"K_oF5", // &HF5 + +"K_?F6", // &HF6 +"K_?F7", // &HF7 +"K_?F8", // &HF8 +"K_?F9", // &HF9 +"K_?FA", // &HFA +"K_?FB", // &HFB +"K_?FC", // &HFC +"K_?FD", // &HFD +"K_?FE", // &HFE +"K_?FF" // &HFF +]; + +export const enum + TKeymanWebTouchStandardKey { + K_LOPT = 50001, + K_ROPT = 50002, + K_NUMERALS = 50003, + K_SYMBOLS = 50004, + K_CURRENCIES = 50005, + K_UPPER = 50006, + K_LOWER = 50007, + K_ALPHA = 50008, + K_SHIFTED = 50009, + K_ALTGR = 50010, + K_TABBACK = 50011, + K_TABFWD = 50012 + }; \ No newline at end of file diff --git a/developer/src/kmc-kmn/src/kmw-compiler/validate-layout-file.ts b/developer/src/kmc-kmn/src/kmw-compiler/validate-layout-file.ts index 4a142eda91..2784a97def 100644 --- a/developer/src/kmc-kmn/src/kmw-compiler/validate-layout-file.ts +++ b/developer/src/kmc-kmn/src/kmw-compiler/validate-layout-file.ts @@ -1,6 +1,8 @@ import { KMX, Osk, TouchLayout, TouchLayoutFileReader, TouchLayoutFileWriter } from "@keymanapp/common-types"; import { callbacks, IsKeyboardVersion14OrLater, IsKeyboardVersion15OrLater } from "./compiler-globals.js"; -import { JavaScript_Key, VKeyNames } from "./javascript-strings.js"; +import { JavaScript_Key } from "./javascript-strings.js"; +import { TRequiredKey, CRequiredKeys, CSpecialText10, CSpecialText14, CSpecialText14ZWNJ, CSpecialText14Map } from "./constants.js"; +import { VKeyNames } from "./keymanweb-key-codes.js"; interface VLFOutput { @@ -46,36 +48,6 @@ function KeyIdType(FId: string): TKeyIdType { // I4142 return TKeyIdType.Key_Invalid; } -enum TRequiredKey { K_LOPT, K_BKSP, K_ENTER }; // I4447 - -const - CRequiredKeys: TRequiredKey[] = [TRequiredKey.K_LOPT, TRequiredKey.K_BKSP, TRequiredKey.K_ENTER]; // I4447 - - // See also builder.js: specialCharacters; web/source/osk/oskKey.ts: specialCharacters -const - CSpecialText10: string = - '*Shift*\0*Enter*\0*Tab*\0*BkSp*\0*Menu*\0*Hide*\0*Alt*\0*Ctrl*\0*Caps*\0'+ - '*ABC*\0*abc*\0*123*\0*Symbol*\0*Currency*\0*Shifted*\0*AltGr*\0*TabLeft*', - - // these names were added in Keyman 14 - CSpecialText14: string = - '*LTREnter*\0*LTRBkSp*\0*RTLEnter*\0*RTLBkSp*\0*ShiftLock*\0*ShiftedLock*\0*ZWNJ*\0*ZWNJiOS*\0*ZWNJAndroid*', - CSpecialText14ZWNJ: string = - '*ZWNJ*\0*ZWNJiOS*\0*ZWNJAndroid*', - - CSpecialText14Map: string[][] = [ - ['*LTREnter*', '*Enter*'], - ['*LTRBkSp*', '*BkSp*'], - ['*RTLEnter*', '*Enter*'], - ['*RTLBkSp*', '*BkSp*'], - ['*ShiftLock*', '*Shift*'], - ['*ShiftedLock*', '*Shifted*'], - ['*ZWNJ*', '<|>'], - ['*ZWNJiOS*', '<|>'], - ['*ZWNJAndroid*', '<|>'] - ]; - -// TODO lifecycle function CheckKey(FPlatform: TouchLayout.TouchLayoutPlatform, FId: string, FText: string, FNextLayer: string, FKeyType: TouchLayout.TouchLayoutKeySp, diff --git a/developer/src/kmc-kmn/src/kmw-compiler/write-compiled-keyboard.ts b/developer/src/kmc-kmn/src/kmw-compiler/write-compiled-keyboard.ts index 1e2784438c..8872643b5d 100644 --- a/developer/src/kmc-kmn/src/kmw-compiler/write-compiled-keyboard.ts +++ b/developer/src/kmc-kmn/src/kmw-compiler/write-compiled-keyboard.ts @@ -1,13 +1,11 @@ import { KMX, CompilerOptions, CompilerCallbacks, KvkFileReader, VisualKeyboard, KmxFileReader, Osk } from "@keymanapp/common-types"; import { ExpandSentinel, incxstr, xstrlen } from "./util.js"; -import { options, nl, FTabStop, setupGlobals, IsKeyboardVersion10OrLater, callbacks } from "./compiler-globals.js"; +import { options, nl, FTabStop, setupGlobals, IsKeyboardVersion10OrLater, callbacks, FFix183_LadderLength } from "./compiler-globals.js"; import { JavaScript_ContextMatch, JavaScript_KeyAsString, JavaScript_Name, JavaScript_OutputString, JavaScript_Rules, JavaScript_Shift, JavaScript_ShiftAsString, JavaScript_Store, zeroPadHex } from './javascript-strings.js'; import { KmwCompilerMessages } from "./messages.js"; import { ValidateLayoutFile } from "./validate-layout-file.js"; import { VisualKeyboardFromFile } from "./visual-keyboard-compiler.js"; -export let FFix183_LadderLength: number = 100; // TODO: option - function requote(s: string): string { return "'" + s.replaceAll(/(['\\])/, "\\$1") + "'"; }