Merge branch 'epic/web-core' into auto/A19S22-merge-master-into-web-core

This commit is contained in:
Marc Durdin 2026-02-13 11:08:05 +07:00 committed by GitHub
commit ed63b70bb4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
814 changed files with 14969 additions and 5628 deletions

View file

@ -247,7 +247,7 @@ function deregisterModel(modelID) {
}
function enableSuggestions(model, suggestionType) {
// Set the options first so that KMW's ModelManager can properly handle model enablement states
// Set the options first so that KMW's ModelCache can properly handle model enablement states
// the moment we actually register the new model.
// Use console_debug
console_debug('enableSuggestions(model, maySuggest='+suggestionType+')');

View file

@ -23,7 +23,7 @@ JUNIT_RESULTS="##teamcity[importData type='junit' path='keyman\android\KMEA\app\
builder_describe "Builds Keyman Engine for Android." \
"@/web/src/app/webview" \
"@/web/src/engine/sentry-manager" \
"@/common/web/sentry-manager" \
"clean" \
"configure" \
"build" \
@ -81,7 +81,7 @@ if builder_start_action build:engine; then
cp "$KEYMAN_WEB_ROOT/build/app/resources/osk/kmwosk.css" "$ENGINE_ASSETS/kmwosk.css"
cp "$KEYMAN_WEB_ROOT/build/app/resources/osk/globe-hint.css" "$ENGINE_ASSETS/globe-hint.css"
cp "$KEYMAN_WEB_ROOT/build/app/resources/osk/keymanweb-osk.ttf" "$ENGINE_ASSETS/keymanweb-osk.ttf"
cp "$KEYMAN_ROOT/web/src/engine/sentry-manager/build/lib/index.js" "$ENGINE_ASSETS/keyman-sentry.js"
cp "$KEYMAN_ROOT/common/web/sentry-manager/build/lib/index.js" "$ENGINE_ASSETS/keyman-sentry.js"
echo "Copying es6-shim polyfill"
cp "$KEYMAN_ROOT/node_modules/es6-shim/es6-shim.min.js" "$ENGINE_ASSETS/es6-shim.min.js"

View file

@ -11,12 +11,20 @@
#if defined(__LP64__) || defined(_LP64)
/* 64-bit, g++ */
#define KMX_64BIT
#define KMX_REQUIRES_REALIGNMENT
#endif
#if defined(_WIN64) && !defined(USE_64)
/* 64-bit, Windows */
#define KMX_64BIT
#define KMX_REQUIRES_REALIGNMENT
#endif
#if defined(__EMSCRIPTEN__)
// Emscripten/WASM. Emscripten even though it uses 32-bit (and not 64-bit
// pointers like the 64-bit architectures above) requires 32-bit alignment
// for pointers which we don't always have in the KMX data from file
// (see #12844).
#define KMX_REQUIRES_REALIGNMENT
#endif
typedef uint32_t KMX_DWORD;

View file

@ -4,11 +4,13 @@ This folder contains a set of keyboards that are used by multiple projects to
verify behaviour, both for compilation, and for runtime tests.
The following projects are known to use these keyboards:
* core -- .kmn files only, compiled with kmc during tests
* developer/kmcmplib -- .kmn files, compiled for tests, and .kmx as reference
* linux -- .kmn files for test steps only, .kmx files
* web -- .kmn files for test steps, .kmx and .js files
The .kmx files were built with kmcomp, not kmc, in order to ensure that
The .kmx and .js files were built with kmcomp, not kmc, in order to ensure that
developer/kmcmplib gets a valid baseline reference.
Once kmc is stable, it is possible that we will be able to use the kmc npm
@ -16,9 +18,34 @@ module to build .kmx for all projects that need them.
## Build parameters
Keyboards were built with debug information and no compiler version embedded,
with kmcomp 16.0.138:
The keyboards can be built with:
```bat
for %d in (*.kmn) do kmcomp -no-compiler-version -d %d
```bash
./build.sh build
```
This builds the keyboards with debug information and no compiler version
embedded.
## Grouping of the test fixtures
Fixtures that test similar functionality are roughly grouped together.
There is some overlap between different groups, so this was done
mainly by test name.
| Name | Test group |
|----------|------------------------------------------|
| k_00xx_* | Tests that didn't fit in any other group |
| k_01xx_* | Basic rules |
| k_02xx_* | RALT |
| k_03xx_* | deadkeys |
| k_04xx_* | Using multiple groups |
| k_05xx_* | Options |
| k_06xx_* | System stores |
| k_07xx_* | Caps related tests |
| k_08xx_* | Context related |
## Description of file format
See [README.md](/core/tests/unit/kmx/README.md) in core for a description
of the file format.

View file

@ -9,324 +9,324 @@
</Options>
<Files>
<File>
<ID>id_k_000___null_keyboard</ID>
<Filename>k_000___null_keyboard.kmn</Filename>
<Filepath>k_000___null_keyboard.kmn</Filepath>
<ID>id_k_0000___null_keyboard</ID>
<Filename>k_0000___null_keyboard.kmn</Filename>
<Filepath>k_0000___null_keyboard.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_001___basic_input_unicodei</ID>
<Filename>k_001___basic_input_unicodei.kmn</Filename>
<Filepath>k_001___basic_input_unicodei.kmn</Filepath>
<ID>id_k_0100___basic_input_unicodei</ID>
<Filename>k_0100___basic_input_unicodei.kmn</Filename>
<Filepath>k_0100___basic_input_unicodei.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_002___basic_input_unicode</ID>
<Filename>k_002___basic_input_unicode.kmn</Filename>
<Filepath>k_002___basic_input_unicode.kmn</Filepath>
<ID>id_k_0101___basic_input_unicode</ID>
<Filename>k_0101___basic_input_unicode.kmn</Filename>
<Filepath>k_0101___basic_input_unicode.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_003___nul</ID>
<Filename>k_003___nul.kmn</Filename>
<Filepath>k_003___nul.kmn</Filepath>
<ID>id_k_0001___nul</ID>
<Filename>k_0001___nul.kmn</Filename>
<Filepath>k_0001___nul.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_004___basic_input__shift_2_</ID>
<Filename>k_004___basic_input__shift_2_.kmn</Filename>
<Filepath>k_004___basic_input__shift_2_.kmn</Filepath>
<ID>id_k_0102___basic_input__shift_2_</ID>
<Filename>k_0102___basic_input__shift_2_.kmn</Filename>
<Filepath>k_0102___basic_input__shift_2_.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_005___nul_with_initial_context</ID>
<Filename>k_005___nul_with_initial_context.kmn</Filename>
<Filepath>k_005___nul_with_initial_context.kmn</Filepath>
<ID>id_k_0002___nul_with_initial_context</ID>
<Filename>k_0002___nul_with_initial_context.kmn</Filename>
<Filepath>k_0002___nul_with_initial_context.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_006___vkey_input__shift_ctrl_</ID>
<Filename>k_006___vkey_input__shift_ctrl_.kmn</Filename>
<Filepath>k_006___vkey_input__shift_ctrl_.kmn</Filepath>
<ID>id_k_0103___vkey_input__shift_ctrl_</ID>
<Filename>k_0103___vkey_input__shift_ctrl_.kmn</Filename>
<Filepath>k_0103___vkey_input__shift_ctrl_.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_007___vkey_input__ctrl_alt_</ID>
<Filename>k_007___vkey_input__ctrl_alt_.kmn</Filename>
<Filepath>k_007___vkey_input__ctrl_alt_.kmn</Filepath>
<ID>id_k_0104___vkey_input__ctrl_alt_</ID>
<Filename>k_0104___vkey_input__ctrl_alt_.kmn</Filename>
<Filepath>k_0104___vkey_input__ctrl_alt_.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_008___vkey_input__ctrl_alt_2_</ID>
<Filename>k_008___vkey_input__ctrl_alt_2_.kmn</Filename>
<Filepath>k_008___vkey_input__ctrl_alt_2_.kmn</Filepath>
<ID>id_k_0105___vkey_input__ctrl_alt_2_</ID>
<Filename>k_0105___vkey_input__ctrl_alt_2_.kmn</Filename>
<Filepath>k_0105___vkey_input__ctrl_alt_2_.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_012___ralt</ID>
<Filename>k_012___ralt.kmn</Filename>
<Filepath>k_012___ralt.kmn</Filepath>
<ID>id_k_0200___ralt</ID>
<Filename>k_0200___ralt.kmn</Filename>
<Filepath>k_0200___ralt.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_013___deadkeys</ID>
<Filename>k_013___deadkeys.kmn</Filename>
<Filepath>k_013___deadkeys.kmn</Filepath>
<ID>id_k_0300___deadkeys</ID>
<Filename>k_0300___deadkeys.kmn</Filename>
<Filepath>k_0300___deadkeys.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_014___groups_and_virtual_keys</ID>
<Filename>k_014___groups_and_virtual_keys.kmn</Filename>
<Filepath>k_014___groups_and_virtual_keys.kmn</Filepath>
<ID>id_k_0400___groups_and_virtual_keys</ID>
<Filename>k_0400___groups_and_virtual_keys.kmn</Filename>
<Filepath>k_0400___groups_and_virtual_keys.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_015___ralt_2</ID>
<Filename>k_015___ralt_2.kmn</Filename>
<Filepath>k_015___ralt_2.kmn</Filepath>
<ID>id_k_0201___ralt_2</ID>
<Filename>k_0201___ralt_2.kmn</Filename>
<Filepath>k_0201___ralt_2.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_017___space_mnemonic_kbd</ID>
<Filename>k_017___space_mnemonic_kbd.kmn</Filename>
<Filepath>k_017___space_mnemonic_kbd.kmn</Filepath>
<ID>id_k_0004___space_mnemonic_kbd</ID>
<Filename>k_0004___space_mnemonic_kbd.kmn</Filename>
<Filepath>k_0004___space_mnemonic_kbd.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_018___nul_testing</ID>
<Filename>k_018___nul_testing.kmn</Filename>
<Filepath>k_018___nul_testing.kmn</Filepath>
<ID>id_k_0003___nul_testing</ID>
<Filename>k_0003___nul_testing.kmn</Filename>
<Filepath>k_0003___nul_testing.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_019___multiple_deadkeys</ID>
<Filename>k_019___multiple_deadkeys.kmn</Filename>
<Filepath>k_019___multiple_deadkeys.kmn</Filepath>
<ID>id_k_0301___multiple_deadkeys</ID>
<Filename>k_0301___multiple_deadkeys.kmn</Filename>
<Filepath>k_0301___multiple_deadkeys.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_020___deadkeys_and_backspace</ID>
<Filename>k_020___deadkeys_and_backspace.kmn</Filename>
<Filepath>k_020___deadkeys_and_backspace.kmn</Filepath>
<ID>id_k_0302___deadkeys_and_backspace</ID>
<Filename>k_0302___deadkeys_and_backspace.kmn</Filename>
<Filepath>k_0302___deadkeys_and_backspace.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_021___options</ID>
<Filename>k_021___options.kmn</Filename>
<Filepath>k_021___options.kmn</Filepath>
<ID>id_k_0500___options</ID>
<Filename>k_0500___options.kmn</Filename>
<Filepath>k_0500___options.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_022___options_with_preset</ID>
<Filename>k_022___options_with_preset.kmn</Filename>
<Filepath>k_022___options_with_preset.kmn</Filepath>
<ID>id_k_0501___options_with_preset</ID>
<Filename>k_0501___options_with_preset.kmn</Filename>
<Filepath>k_0501___options_with_preset.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_023___options_with_save</ID>
<Filename>k_023___options_with_save.kmn</Filename>
<Filepath>k_023___options_with_save.kmn</Filepath>
<ID>id_k_0502___options_with_save</ID>
<Filename>k_0502___options_with_save.kmn</Filename>
<Filepath>k_0502___options_with_save.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_024___options_with_save_and_preset</ID>
<Filename>k_024___options_with_save_and_preset.kmn</Filename>
<Filepath>k_024___options_with_save_and_preset.kmn</Filepath>
<ID>id_k_0503___options_with_save_and_preset</ID>
<Filename>k_0503___options_with_save_and_preset.kmn</Filename>
<Filepath>k_0503___options_with_save_and_preset.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_025___options_with_reset</ID>
<Filename>k_025___options_with_reset.kmn</Filename>
<Filepath>k_025___options_with_reset.kmn</Filepath>
<ID>id_k_0504___options_with_reset</ID>
<Filename>k_0504___options_with_reset.kmn</Filename>
<Filepath>k_0504___options_with_reset.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_026___system_stores</ID>
<Filename>k_026___system_stores.kmn</Filename>
<Filepath>k_026___system_stores.kmn</Filepath>
<ID>id_k_0600___system_stores</ID>
<Filename>k_0600___system_stores.kmn</Filename>
<Filepath>k_0600___system_stores.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_027___system_stores_2</ID>
<Filename>k_027___system_stores_2.kmn</Filename>
<Filepath>k_027___system_stores_2.kmn</Filepath>
<ID>id_k_0601___system_stores_2</ID>
<Filename>k_0601___system_stores_2.kmn</Filename>
<Filepath>k_0601___system_stores_2.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_028___smp</ID>
<Filename>k_028___smp.kmn</Filename>
<Filepath>k_028___smp.kmn</Filepath>
<ID>id_k_0106___smp</ID>
<Filename>k_0106___smp.kmn</Filename>
<Filepath>k_0106___smp.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_029___beep</ID>
<Filename>k_029___beep.kmn</Filename>
<Filepath>k_029___beep.kmn</Filepath>
<ID>id_k_0005___beep</ID>
<Filename>k_0005___beep.kmn</Filename>
<Filepath>k_0005___beep.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_030___multiple_groups</ID>
<Filename>k_030___multiple_groups.kmn</Filename>
<Filepath>k_030___multiple_groups.kmn</Filepath>
<ID>id_k_0401___multiple_groups</ID>
<Filename>k_0401___multiple_groups.kmn</Filename>
<Filepath>k_0401___multiple_groups.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_031___caps_lock</ID>
<Filename>k_031___caps_lock.kmn</Filename>
<Filepath>k_031___caps_lock.kmn</Filepath>
<ID>id_k_0700___caps_lock</ID>
<Filename>k_0700___caps_lock.kmn</Filename>
<Filepath>k_0700___caps_lock.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_032___caps_control</ID>
<Filename>k_032___caps_control.kmn</Filename>
<Filepath>k_032___caps_control.kmn</Filepath>
<ID>id_k_0701___caps_control</ID>
<Filename>k_0701___caps_control.kmn</Filename>
<Filepath>k_0701___caps_control.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_033___caps_always_off</ID>
<Filename>k_033___caps_always_off.kmn</Filename>
<Filepath>k_033___caps_always_off.kmn</Filepath>
<ID>id_k_0702___caps_always_off</ID>
<Filename>k_0702___caps_always_off.kmn</Filename>
<Filepath>k_0702___caps_always_off.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_034___options_double_set_reset</ID>
<Filename>k_034___options_double_set_reset.kmn</Filename>
<Filepath>k_034___options_double_set_reset.kmn</Filepath>
<ID>id_k_0505___options_double_set_reset</ID>
<Filename>k_0505___options_double_set_reset.kmn</Filename>
<Filepath>k_0505___options_double_set_reset.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_035___options_double_set_staged</ID>
<Filename>k_035___options_double_set_staged.kmn</Filename>
<Filepath>k_035___options_double_set_staged.kmn</Filepath>
<ID>id_k_0506___options_double_set_staged</ID>
<Filename>k_0506___options_double_set_staged.kmn</Filename>
<Filepath>k_0506___options_double_set_staged.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_036___options___double_reset_staged</ID>
<Filename>k_036___options___double_reset_staged.kmn</Filename>
<Filepath>k_036___options___double_reset_staged.kmn</Filepath>
<ID>id_k_0507___options___double_reset_staged</ID>
<Filename>k_0507___options___double_reset_staged.kmn</Filename>
<Filepath>k_0507___options___double_reset_staged.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_037___options___double_reset</ID>
<Filename>k_037___options___double_reset.kmn</Filename>
<Filepath>k_037___options___double_reset.kmn</Filepath>
<ID>id_k_0508___options___double_reset</ID>
<Filename>k_0508___options___double_reset.kmn</Filename>
<Filepath>k_0508___options___double_reset.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_038___punctkeys</ID>
<Filename>k_038___punctkeys.kmn</Filename>
<Filepath>k_038___punctkeys.kmn</Filepath>
<ID>id_k_0107___punctkeys</ID>
<Filename>k_0107___punctkeys.kmn</Filename>
<Filepath>k_0107___punctkeys.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_039___generic_ctrlalt</ID>
<Filename>k_039___generic_ctrlalt.kmn</Filename>
<Filepath>k_039___generic_ctrlalt.kmn</Filepath>
<ID>id_k_0203___generic_ctrlalt</ID>
<Filename>k_0203___generic_ctrlalt.kmn</Filename>
<Filepath>k_0203___generic_ctrlalt.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_040___long_context</ID>
<Filename>k_040___long_context.kmn</Filename>
<Filepath>k_040___long_context.kmn</Filepath>
<ID>id_k_0800___long_context</ID>
<Filename>k_0800___long_context.kmn</Filename>
<Filepath>k_0800___long_context.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_041___long_context_and_deadkeys</ID>
<Filename>k_041___long_context_and_deadkeys.kmn</Filename>
<Filepath>k_041___long_context_and_deadkeys.kmn</Filepath>
<ID>id_k_0801___long_context_and_deadkeys</ID>
<Filename>k_0801___long_context_and_deadkeys.kmn</Filename>
<Filepath>k_0801___long_context_and_deadkeys.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_042___long_context_and_split_deadkeys</ID>
<Filename>k_042___long_context_and_split_deadkeys.kmn</Filename>
<Filepath>k_042___long_context_and_split_deadkeys.kmn</Filepath>
<ID>id_k_0802___long_context_and_split_deadkeys</ID>
<Filename>k_0802___long_context_and_split_deadkeys.kmn</Filename>
<Filepath>k_0802___long_context_and_split_deadkeys.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_043___output_and_keystroke</ID>
<Filename>k_043___output_and_keystroke.kmn</Filename>
<Filepath>k_043___output_and_keystroke.kmn</Filepath>
<ID>id_k_0402___output_and_keystroke</ID>
<Filename>k_0402___output_and_keystroke.kmn</Filename>
<Filepath>k_0402___output_and_keystroke.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_044___if_and_context</ID>
<Filename>k_044___if_and_context.kmn</Filename>
<Filepath>k_044___if_and_context.kmn</Filepath>
<ID>id_k_0803___if_and_context</ID>
<Filename>k_0803___if_and_context.kmn</Filename>
<Filepath>k_0803___if_and_context.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_045___deadkey_and_context</ID>
<Filename>k_045___deadkey_and_context.kmn</Filename>
<Filepath>k_045___deadkey_and_context.kmn</Filepath>
<ID>id_k_0804___deadkey_and_context</ID>
<Filename>k_0804___deadkey_and_context.kmn</Filename>
<Filepath>k_0804___deadkey_and_context.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_046___deadkey_and_contextex</ID>
<Filename>k_046___deadkey_and_contextex.kmn</Filename>
<Filepath>k_046___deadkey_and_contextex.kmn</Filepath>
<ID>id_k_0805___deadkey_and_contextex</ID>
<Filename>k_0805___deadkey_and_contextex.kmn</Filename>
<Filepath>k_0805___deadkey_and_contextex.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_047___caps_always_off_initially_on</ID>
<Filename>k_047___caps_always_off_initially_on.kmn</Filename>
<Filepath>k_047___caps_always_off_initially_on.kmn</Filepath>
<ID>id_k_0703___caps_always_off_initially_on</ID>
<Filename>k_0703___caps_always_off_initially_on.kmn</Filename>
<Filepath>k_0703___caps_always_off_initially_on.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_048___modifier_keys_keep_context</ID>
<Filename>k_048___modifier_keys_keep_context.kmn</Filename>
<Filepath>k_048___modifier_keys_keep_context.kmn</Filepath>
<ID>id_k_0806___modifier_keys_keep_context</ID>
<Filename>k_0806___modifier_keys_keep_context.kmn</Filename>
<Filepath>k_0806___modifier_keys_keep_context.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>
<File>
<ID>id_k_049___enter_invalidates_context</ID>
<Filename>k_049___enter_invalidates_context.kmn</Filename>
<Filepath>k_049___enter_invalidates_context.kmn</Filepath>
<ID>id_k_0807___enter_invalidates_context</ID>
<Filename>k_0807___enter_invalidates_context.kmn</Filename>
<Filepath>k_0807___enter_invalidates_context.kmn</Filepath>
<FileVersion>1.0</FileVersion>
<FileType>.kmn</FileType>
</File>

View file

@ -17,7 +17,7 @@ builder_parse "$@"
builder_describe_outputs \
configure kmcomp/kmcomp.exe \
build k_000___null_keyboard.kmx
build k_0000___null_keyboard.kmx
do_configure() {
mkdir -p kmcomp
@ -25,9 +25,15 @@ do_configure() {
}
do_build() {
local name
local name jsname
for name in *.kmn; do
./kmcomp/kmcomp.exe -no-compiler-version -d "$name"
jsname="$(basename "${name%.kmn}").js"
./kmcomp/kmcomp.exe -no-compiler-version -d "${name}"
if [[ "${name}" != "k_0812___nul_and_contextex.kmn" ]]; then
# k_0812___nul_and_contextex.kmn fails to compile because contextex
# is not currently supported in context() match, so we skip it
./kmcomp/kmcomp.exe -no-compiler-version -d "${name}" "${jsname}"
fi
done
}

View file

@ -0,0 +1,28 @@
KeymanWeb.KR(new Keyboard_k_0000___null_keyboard());
function Keyboard_k_0000___null_keyboard()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0000___null_keyboard";
this.KN="0000 - null keyboard";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '000 - null keyboard'
store(&NAME) '0000 - null keyboard'
c Description: Tests null keyboard
c keys: [K_A][RALT K_B][SHIFT K_C]
c expected: aC

View file

@ -0,0 +1,42 @@
KeymanWeb.KR(new Keyboard_k_0001___nul());
function Keyboard_k_0001___nul()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0001___nul";
this.KN="0001 - nul";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0x41)) {
if(k.KN(0,t)){
r=m=1; // Line 13
k.KO(0,t,"b");
}
else if(k.KCM(1,t,"b",1)){
r=m=1; // Line 14
k.KO(1,t,"c");
}
else if(1){
r=m=1; // Line 15
k.KO(0,t,"d");
}
}
return r;
};
}

View file

@ -1,8 +1,8 @@
store(&NAME) '003 - nul'
store(&NAME) '0001 - nul'
c Description: Tests nul context
c keys: [K_A][K_A][K_A]
c expected: cd
c context:
c context:
store(&version) '6.0'

Binary file not shown.

View file

@ -0,0 +1,42 @@
KeymanWeb.KR(new Keyboard_k_0002___nul_with_initial_context());
function Keyboard_k_0002___nul_with_initial_context()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0002___nul_with_initial_context";
this.KN="0002 - nul with initial context";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0x41)) {
if(k.KN(0,t)){
r=m=1; // Line 13
k.KO(0,t,"b");
}
else if(k.KCM(1,t,"b",1)){
r=m=1; // Line 14
k.KO(1,t,"c");
}
else if(1){
r=m=1; // Line 15
k.KO(0,t,"d");
}
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '005 - nul with initial context'
store(&NAME) '0002 - nul with initial context'
c Description: Tests nul context with an initial context supplied
c keys: [K_A][K_A]
c expected: xdd

View file

@ -0,0 +1,34 @@
KeymanWeb.KR(new Keyboard_k_0003___nul_testing());
function Keyboard_k_0003___nul_testing()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0003___nul_testing";
this.KN="0003 - nul testing";
this.KMINVER="9.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0x41)) {
if(k.KN(0,t)){
r=m=1; // Line 12
k.KO(0,t,"OK");
}
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '018 - nul testing'
store(&NAME) '0003 - nul testing'
c Description: Tests the processing of nul in LHS of rules
c keys: [K_A][K_A]
c expected: OKa

View file

@ -0,0 +1,46 @@
KeymanWeb.KR(new Keyboard_k_0004___space_mnemonic_kbd());
function Keyboard_k_0004___space_mnemonic_kbd()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0004___space_mnemonic_kbd";
this.KN="0004 - space mnemonic kbd";
this.KMINVER="9.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=1;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.g_main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0x20)) {
if(k.KCM(2,t,"ab",2)){
r=m=1; // Line 14
k.KO(2,t,"X");
}
}
else if(k.KKM(e, 0x4000, 0x64)) {
if(k.KCM(2,t,"c ",2)){
r=m=1; // Line 15
k.KO(2,t,"Y");
}
}
else if(k.KKM(e, 0x4000, 0x65)) {
if(k.KCM(2,t," d",2)){
r=m=1; // Line 16
k.KO(2,t,"Z");
}
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '017 - space mnemonic kbd'
store(&NAME) '0004 - space mnemonic kbd'
c Description: Tests Space handling in mnemonic keyboards (failed with Win 98)
c keys: [K_A][K_B][K_SPACE][K_C][K_SPACE][K_D][K_SPACE][K_D][K_E]
c expected: XYZ

View file

@ -0,0 +1,40 @@
if(typeof keyman === 'undefined') {
console.log('Keyboard requires KeymanWeb 10.0 or later');
if(typeof tavultesoft !== 'undefined') tavultesoft.keymanweb.util.alert("This keyboard requires KeymanWeb 10.0 or later");
} else {
KeymanWeb.KR(new Keyboard_k_0005___beep());
}
function Keyboard_k_0005___beep()
{
var modCodes = keyman.osk.modifierCodes;
var keyCodes = keyman.osk.keyCodes;
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0005___beep";
this.KN="0005 - beep";
this.KMINVER="10.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0 /* 0x0000 */;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, modCodes.VIRTUAL_KEY /* 0x4000 */, keyCodes.K_1 /* 0x31 */)) {
if(1){
r=m=1; // Line 13
k.KDC(0,t);
k.KB(t);
}
}
return r;
};
}

View file

@ -1,8 +1,8 @@
store(&NAME) '029 - beep'
store(&NAME) '0005 - beep'
c Description: Tests beep
c keys: [K_1]
c expected: \b
c context:
c context:
store(&version) '10.0'

Binary file not shown.

View file

@ -0,0 +1,52 @@
KeymanWeb.KR(new Keyboard_k_0100___basic_input_unicodei());
function Keyboard_k_0100___basic_input_unicodei()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0100___basic_input_unicodei";
this.KN="0100 - basic input UnicodeI";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0010;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4010, 0x41)) {
if(1){
r=m=1; // Line 13
k.KO(0,t,"a");
}
}
else if(k.KKM(e, 0x4010, 0x42)) {
if(1){
r=m=1; // Line 14
k.KO(0,t,"b");
}
}
else if(k.KKM(e, 0x4010, 0x43)) {
if(1){
r=m=1; // Line 15
k.KO(0,t,"c");
}
}
else if(k.KKM(e, 0x4010, 0x46)) {
if(k.KCM(2,t,"DE",2)){
r=m=1; // Line 17
k.KO(2,t,"def");
}
}
return r;
};
}

View file

@ -1,8 +1,8 @@
store(&NAME) '001 - basic input UnicodeI'
store(&NAME) '0100 - basic input UnicodeI'
c Description: Tests basic input with simple context rules, ANSI characters used only
c keys: [SHIFT K_A][SHIFT K_B][SHIFT K_C][SHIFT K_SPACE][SHIFT K_D][SHIFT K_E][SHIFT K_F]
c expected: abc def
c context:
c context:
store(&version) '6.0'

View file

@ -0,0 +1,52 @@
KeymanWeb.KR(new Keyboard_k_0101___basic_input_unicode());
function Keyboard_k_0101___basic_input_unicode()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0101___basic_input_unicode";
this.KN="0101 - basic input Unicode";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0010;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4010, 0x41)) {
if(1){
r=m=1; // Line 13
k.KO(0,t,"ก");
}
}
else if(k.KKM(e, 0x4010, 0x42)) {
if(1){
r=m=1; // Line 14
k.KO(0,t,"ข");
}
}
else if(k.KKM(e, 0x4010, 0x43)) {
if(1){
r=m=1; // Line 15
k.KO(0,t,"ฃ");
}
}
else if(k.KKM(e, 0x4010, 0x46)) {
if(k.KCM(2,t,"DE",2)){
r=m=1; // Line 17
k.KO(2,t,"คฅฆ");
}
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '002 - basic input Unicode'
store(&NAME) '0101 - basic input Unicode'
c Description: Tests basic input with simple context rules (Unicode)
c keys: [SHIFT K_A][SHIFT K_B][SHIFT K_C][SHIFT K_SPACE][SHIFT K_D][SHIFT K_E][SHIFT K_F]
c expected: \u0E01\u0E02\u0E03\u0020\u0E04\u0E05\u0E06

View file

@ -0,0 +1,52 @@
KeymanWeb.KR(new Keyboard_k_0102___basic_input__shift_2_());
function Keyboard_k_0102___basic_input__shift_2_()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0102___basic_input__shift_2_";
this.KN="0102 - basic input (shift 2)";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0010;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4010, 0x41)) {
if(1){
r=m=1; // Line 13
k.KO(0,t,"ก");
}
}
else if(k.KKM(e, 0x4010, 0x42)) {
if(1){
r=m=1; // Line 14
k.KO(0,t,"ข");
}
}
else if(k.KKM(e, 0x4010, 0x43)) {
if(1){
r=m=1; // Line 15
k.KO(0,t,"ฃ");
}
}
else if(k.KKM(e, 0x4010, 0x46)) {
if(k.KCM(2,t,"DE",2)){
r=m=1; // Line 17
k.KO(2,t,"คฅฆ");
}
}
return r;
};
}

View file

@ -1,13 +1,13 @@
store(&NAME) '004 - basic input (shift 2)'
store(&NAME) '0102 - basic input (shift 2)'
c Description: Tests basic vkey input with shift only (Unicode)
c keys: [SHIFT K_A][SHIFT K_B][SHIFT K_C][SHIFT K_SPACE][SHIFT K_D][SHIFT K_E][SHIFT K_F]
c expected: \u0E01\u0E02\u0E03\u0020\u0E04\u0E05\u0E06
c context:
c context:
store(&version) '6.0'
begin Unicode > use(Main)
group(Main) using keys
+ [SHIFT K_A] > U+0E01

View file

@ -0,0 +1,52 @@
KeymanWeb.KR(new Keyboard_k_0103___vkey_input__shift_ctrl_());
function Keyboard_k_0103___vkey_input__shift_ctrl_()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0103___vkey_input__shift_ctrl_";
this.KN="0103 - vkey input (shift ctrl)";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0030;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4030, 0x41)) {
if(1){
r=m=1; // Line 13
k.KO(0,t,"ก");
}
}
else if(k.KKM(e, 0x4010, 0x42)) {
if(1){
r=m=1; // Line 14
k.KO(0,t,"ข");
}
}
else if(k.KKM(e, 0x4030, 0x43)) {
if(1){
r=m=1; // Line 15
k.KO(0,t,"ฃ");
}
}
else if(k.KKM(e, 0x4010, 0x46)) {
if(k.KCM(2,t,"DE",2)){
r=m=1; // Line 17
k.KO(2,t,"คฅฆ");
}
}
return r;
};
}

View file

@ -1,13 +1,13 @@
store(&NAME) '006 - vkey input (shift ctrl)'
store(&NAME) '0103 - vkey input (shift ctrl)'
c Description: Tests basic vkey input with shift and control (Unicode)
c keys: [LCTRL SHIFT K_A][SHIFT K_B][RCTRL SHIFT K_C][K_SPACE][SHIFT K_D][SHIFT K_E][SHIFT K_F]
c expected: \u0E01\u0E02\u0E03\u0020\u0E04\u0E05\u0E06
c context:
c context:
store(&version) '6.0'
begin Unicode > use(Main)
group(Main) using keys
+ [SHIFT CTRL K_A] > U+0E01

View file

@ -0,0 +1,52 @@
KeymanWeb.KR(new Keyboard_k_0104___vkey_input__ctrl_alt_());
function Keyboard_k_0104___vkey_input__ctrl_alt_()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0104___vkey_input__ctrl_alt_";
this.KN="0104 - vkey input (ctrl alt)";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0060;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4060, 0x41)) {
if(1){
r=m=1; // Line 13
k.KO(0,t,"ก");
}
}
else if(k.KKM(e, 0x4000, 0x42)) {
if(1){
r=m=1; // Line 14
k.KO(0,t,"ข");
}
}
else if(k.KKM(e, 0x4060, 0x43)) {
if(1){
r=m=1; // Line 15
k.KO(0,t,"ฃ");
}
}
else if(k.KKM(e, 0x4060, 0x46)) {
if(k.KCM(2,t,"de",2)){
r=m=1; // Line 17
k.KO(2,t,"คฅฆ");
}
}
return r;
};
}

View file

@ -1,15 +1,15 @@
store(&NAME) '007 - vkey input (ctrl alt)'
store(&NAME) '0104 - vkey input (ctrl alt)'
c Description: Tests basic vkey input with control and alt (Unicode)
c keys: [LCTRL LALT K_A][K_B][RCTRL RALT K_C][K_SPACE][K_D][K_E][LCTRL LALT K_F]
c expected: \u0E01\u0E02\u0E03\u0020\u0E04\u0E05\u0E06
c context:
c context:
store(&version) '6.0'
begin Unicode > use(Main)
group(Main) using keys
+ [CTRL ALT K_A] > U+0E01
+ [K_B] > U+0E02
+ [CTRL ALT K_C] > U+0E03

View file

@ -0,0 +1,40 @@
KeymanWeb.KR(new Keyboard_k_0105___vkey_input__ctrl_alt_2_());
function Keyboard_k_0105___vkey_input__ctrl_alt_2_()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0105___vkey_input__ctrl_alt_2_";
this.KN="0105 - vkey input (ctrl alt 2)";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0060;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4060, 0x41)) {
if(1){
r=m=1; // Line 14
k.KO(0,t,"ก");
}
}
else if(k.KKM(e, 0x4060, 0x43)) {
if(1){
r=m=1; // Line 15
k.KO(0,t,"ฃ");
}
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '008 - vkey input (ctrl alt 2)'
store(&NAME) '0105 - vkey input (ctrl alt 2)'
c Description: Tests basic vkey input with control and alt (Unicode)
c keys: [LCTRL LALT K_A][LCTRL LALT K_B][LCTRL LALT K_C]
c expected: \u0E01\u0E03

View file

@ -0,0 +1,80 @@
if(typeof keyman === 'undefined') {
console.log('Keyboard requires KeymanWeb 10.0 or later');
if(typeof tavultesoft !== 'undefined') tavultesoft.keymanweb.util.alert("This keyboard requires KeymanWeb 10.0 or later");
} else {
KeymanWeb.KR(new Keyboard_k_0106___smp());
}
function Keyboard_k_0106___smp()
{
var modCodes = keyman.osk.modifierCodes;
var keyCodes = keyman.osk.keyCodes;
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0106___smp";
this.KN="0106 - smp";
this.KMINVER="10.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0 /* 0x0000 */;
this.KS=1;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, modCodes.VIRTUAL_KEY /* 0x4000 */, keyCodes.K_1 /* 0x31 */)) {
if(1){
r=m=1; // Line 15
k.KDC(0,t);
k.KO(-1,t,"🙂");
}
}
else if(k.KKM(e, modCodes.VIRTUAL_KEY /* 0x4000 */, keyCodes.K_2 /* 0x32 */)) {
if(k.KFCM(1,t,['🙂'])){
r=m=1; // Line 16
k.KDC(1,t);
k.KO(-1,t,"🙂hi😀");
}
}
else if(k.KKM(e, modCodes.VIRTUAL_KEY /* 0x4000 */, keyCodes.K_3 /* 0x33 */)) {
if(k.KFCM(1,t,['😀'])){
r=m=1; // Line 17
k.KDC(1,t);
k.KO(-1,t,"x");
}
}
else if(k.KKM(e, modCodes.VIRTUAL_KEY /* 0x4000 */, keyCodes.K_4 /* 0x34 */)) {
if(k.KFCM(4,t,['🙂','h','i','x'])){
r=m=1; // Line 18
k.KDC(4,t);
k.KO(-1,t,"😁y");
}
}
else if(k.KKM(e, modCodes.VIRTUAL_KEY /* 0x4000 */, keyCodes.K_5 /* 0x35 */)) {
if(1){
r=m=1; // Line 22
k.KDC(0,t);
k.KO(-1,t,"𐌳");
r=this.g_second_1(t,e);
m=2;
}
}
return r;
};
this.g_second_1=function(t,e) {
var k=KeymanWeb,r=1,m=0;
if(k.KFCM(1,t,['𐌳'])){
m=1; // Line 26
k.KDC(1,t);
k.KO(-1,t,"x");
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '028 - smp'
store(&NAME) '0106 - smp'
c Description: Tests SMP characters; see #4361 [1-4], #5561 [5]
c keys: [K_1][K_2][K_3][K_4][K_5]
c expected: \U0001F601yx

Binary file not shown.

View file

@ -0,0 +1,100 @@
KeymanWeb.KR(new Keyboard_k_0107___punctkeys());
function Keyboard_k_0107___punctkeys()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0107___punctkeys";
this.KN="0107 - punctkeys";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0xE2)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 24
k.KO(1,t,"p");
}
}
else if(k.KKM(e, 0x4000, 0xDE)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 23
k.KO(1,t,"o");
}
}
else if(k.KKM(e, 0x4000, 0xBC)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 15
k.KO(1,t,"g");
}
}
else if(k.KKM(e, 0x4000, 0xBD)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 16
k.KO(1,t,"h");
}
}
else if(k.KKM(e, 0x4000, 0xBE)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 17
k.KO(1,t,"i");
}
}
else if(k.KKM(e, 0x4000, 0xBF)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 18
k.KO(1,t,"j");
}
}
else if(k.KKM(e, 0x4000, 0xBA)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 13
k.KO(1,t,"e");
}
}
else if(k.KKM(e, 0x4000, 0xBB)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 14
k.KO(1,t,"f");
}
}
else if(k.KKM(e, 0x4000, 0xDB)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 20
k.KO(1,t,"l");
}
}
else if(k.KKM(e, 0x4000, 0xDC)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 21
k.KO(1,t,"m");
}
}
else if(k.KKM(e, 0x4000, 0xDD)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 22
k.KO(1,t,"n");
}
}
else if(k.KKM(e, 0x4000, 0xC0)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 19
k.KO(1,t,"k");
}
}
return r;
};
}

View file

@ -1,13 +1,13 @@
store(&NAME) '038 - punctkeys'
store(&NAME) '0107 - punctkeys'
c Description: Tests punctuation keys (Unicode)
c keys: [K_A][K_COLON][K_A][K_EQUAL][K_A][K_COMMA][K_A][K_HYPHEN][K_A][K_PERIOD][K_A][K_SLASH][K_A][K_BKQUOTE][K_A][K_LBRKT][K_A][K_BKSLASH][K_A][K_RBRKT][K_A][K_QUOTE][K_A][K_oE2]
c expected: efghijklmnop
c context:
c context:
store(&version) '6.0'
begin Unicode > use(Main)
group(Main) using keys
'a' + [K_COLON] > 'e'

Binary file not shown.

View file

@ -1,12 +0,0 @@
store(&NAME) '015 - ralt 2'
c Description: Tests Right Alt processing with non-US kbds.
c keys: [K_A][K_B][K_C][RALT K_A]
c expected: abcd
store(&VERSION) '9.0'
begin Unicode > use(main)
group(main) using keys
'c' + [RAlt K_A] > "cd"

View file

@ -0,0 +1,52 @@
KeymanWeb.KR(new Keyboard_k_0200___ralt());
function Keyboard_k_0200___ralt()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0200___ralt";
this.KN="0200 - ralt";
this.KMINVER="9.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0060;
this.KVS=[];
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.g_main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0x41)) {
if(1){
r=m=1; // Line 14
k.KO(0,t,"ז");
}
}
else if(k.KKM(e, 0x4000, 0x4F)) {
if(1){
r=m=1; // Line 15
k.KO(0,t,"ר");
}
}
else if(k.KKM(e, 0x4060, 0x41)) {
if(1){
r=m=1; // Line 16
k.KO(0,t,"b");
}
}
else if(k.KKM(e, 0x4060, 0x4F)) {
if(1){
r=m=1; // Line 17
k.KO(0,t,"c");
}
}
return r;
};
}

View file

@ -1,9 +1,9 @@
store(&NAME) '012 - ralt'
store(&NAME) '0200 - ralt'
c Description: Tests Right Alt processing: requires Ctrl+Alt simulation off.
c env.simulate_altgr: 0
c keys: [RALT K_A][RALT K_O][LCTRL LALT K_A][LCTRL LALT K_O]
c expected: \u05d6\u05e8\u0062\u0063
c context:
c context:
store(&VERSION) '9.0'
@ -11,7 +11,7 @@ begin Unicode > use(main)
group(main) using keys
+ [RAlt K_A] > U+05D6
+ [RAlt K_A] > U+05D6
+ [RAlt K_O] > U+05E8
+ [Ctrl Alt K_A] > "b"
+ [Ctrl Alt K_A] > "b"
+ [Ctrl Alt K_O] > "c"

Binary file not shown.

View file

@ -0,0 +1,34 @@
KeymanWeb.KR(new Keyboard_k_0201___ralt_2());
function Keyboard_k_0201___ralt_2()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0201___ralt_2";
this.KN="0201 - ralt 2";
this.KMINVER="9.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.g_main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0x41)) {
if(k.KCM(1,t,"c",1)){
r=m=1; // Line 13
k.KO(1,t,"cd");
}
}
return r;
};
}

View file

@ -0,0 +1,13 @@
store(&VERSION) '9.0'
store(&NAME) '0201 - ralt 2'
c Description: Tests Right Alt processing with non-US kbds.
c keys: [K_A][K_B][K_C][RALT K_A][K_A][K_B][K_C][K_A]
c expected: abcdabca
store(&TARGETS) 'any'
begin Unicode > use(main)
group(main) using keys
'c' + [RAlt K_A] > "cd"

Binary file not shown.

View file

@ -0,0 +1,34 @@
KeymanWeb.KR(new Keyboard_k_0202___alt());
function Keyboard_k_0202___alt()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0202___alt";
this.KN="0202 - alt";
this.KMINVER="9.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0040;
this.KVS=[];
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.g_main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4040, 0x41)) {
if(k.KCM(1,t,"c",1)){
r=m=1; // Line 13
k.KO(1,t,"cd");
}
}
return r;
};
}

View file

@ -0,0 +1,13 @@
store(&VERSION) '9.0'
store(&NAME) '0202 - alt'
c Description: Tests Alt processing with non-US kbds.
c keys: [K_A][K_B][K_C][RALT K_A][K_A][K_B][K_C][K_A]
c expected: abcdabca
store(&TARGETS) 'any'
begin Unicode > use(main)
group(main) using keys
'c' + [Alt K_A] > "cd"

Binary file not shown.

View file

@ -0,0 +1,40 @@
KeymanWeb.KR(new Keyboard_k_0203___generic_ctrlalt());
function Keyboard_k_0203___generic_ctrlalt()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0203___generic_ctrlalt";
this.KN="0203 - generic ctrlalt";
this.KMINVER="6.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0060;
this.KVS=[];
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.gs=function(t,e) {
return this.g_Main_0(t,e);
};
this.g_Main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4020, 0x42)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 13
k.KO(1,t,"b");
}
}
else if(k.KKM(e, 0x4040, 0x43)) {
if(k.KCM(1,t,"a",1)){
r=m=1; // Line 14
k.KO(1,t,"c");
}
}
return r;
};
}

View file

@ -1,8 +1,8 @@
store(&NAME) '039 - generic ctrlalt'
store(&NAME) '0203 - generic ctrlalt'
c Description: Tests generic alt and control (Unicode)
c keys: [K_A][K_A][LCTRL K_B][K_A][LALT K_C][K_A][RCTRL K_B][K_A][RALT K_C]
c expected: abcbc
c context:
c context:
store(&version) '6.0'

View file

@ -0,0 +1,40 @@
KeymanWeb.KR(new Keyboard_k_0300___deadkeys());
function Keyboard_k_0300___deadkeys()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0300___deadkeys";
this.KN="0300 - deadkeys";
this.KMINVER="9.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0010;
this.KVS=[];
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.g_main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4010, 0x36)) {
if(1){
r=m=1; // Line 13
k.KDO(0,t,0);
}
}
else if(k.KKM(e, 0x4000, 0x41)) {
if(k.KDM(0,t,0)){
r=m=1; // Line 15
k.KO(0,t,"â");
}
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '013 - deadkeys'
store(&NAME) '0300 - deadkeys'
c Description: Tests a simple deadkey rule in Unicode
c keys: [SHIFT K_6][K_A]
c expected: \u00E2

Binary file not shown.

View file

@ -0,0 +1,176 @@
KeymanWeb.KR(new Keyboard_k_0301___multiple_deadkeys());
function Keyboard_k_0301___multiple_deadkeys()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0301___multiple_deadkeys";
this.KN="0301 - multiple deadkeys";
this.KMINVER="9.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.g_main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0x31)) {
if(1){
r=m=1; // Line 22
k.KDO(0,t,0);
}
}
else if(k.KKM(e, 0x4000, 0x32)) {
if(1){
r=m=1; // Line 25
k.KO(0,t,"a");
k.KDO(-1,t,1);
}
}
else if(k.KKM(e, 0x4000, 0x33)) {
if(1){
r=m=1; // Line 28
k.KDO(0,t,2);
k.KO(-1,t,"a");
}
}
else if(k.KKM(e, 0x4000, 0x34)) {
if(1){
r=m=1; // Line 31
k.KDO(0,t,3);
k.KDO(-1,t,4);
}
}
else if(k.KKM(e, 0x4000, 0x35)) {
if(1){
r=m=1; // Line 34
k.KO(0,t,"a");
k.KDO(-1,t,5);
k.KDO(-1,t,6);
}
}
else if(k.KKM(e, 0x4000, 0x36)) {
if(1){
r=m=1; // Line 37
k.KO(0,t,"a");
k.KDO(-1,t,7);
k.KDO(-1,t,8);
k.KO(-1,t,"b");
}
}
else if(k.KKM(e, 0x4000, 0x37)) {
if(1){
r=m=1; // Line 40
k.KDO(0,t,9);
k.KDO(-1,t,10);
k.KO(-1,t,"a");
}
}
else if(k.KKM(e, 0x4000, 0x38)) {
if(1){
r=m=1; // Line 45
k.KDO(0,t,11);
k.KDO(-1,t,12);
k.KDO(-1,t,13);
}
}
else if(k.KKM(e, 0x4000, 0x39)) {
if(1){
r=m=1; // Line 56
k.KO(0,t,"{");
k.KDO(-1,t,14);
k.KDO(-1,t,15);
k.KO(-1,t,"}");
k.KDO(-1,t,16);
k.KDO(-1,t,17);
}
}
else if(k.KKM(e, 0x4000, 0x58)) {
if(k.KCM(2,t,"{",1)&&k.KDM(1,t,14)&&k.KDM(1,t,18)&&k.KCM(1,t,"}",1)&&k.KDM(0,t,19)&&k.KDM(0,t,20)){
r=m=1; // Line 59
k.KO(2,t,"9=OK");
}
else if(k.KCM(2,t,"a",1)&&k.KDM(1,t,7)&&k.KDM(1,t,8)&&k.KCM(1,t,"b",1)){
r=m=1; // Line 38
k.KO(2,t,"6=OK ");
}
else if(k.KDM(1,t,15)&&k.KCM(1,t,"}",1)&&k.KDM(0,t,16)&&k.KDM(0,t,17)){
r=m=1; // Line 58
k.KDO(1,t,18);
k.KO(-1,t,"}");
k.KDO(-1,t,19);
k.KDO(-1,t,20);
}
else if(k.KCM(1,t,"a",1)&&k.KDM(0,t,5)&&k.KDM(0,t,6)){
r=m=1; // Line 35
k.KO(1,t,"5=OK ");
}
else if(k.KDM(1,t,9)&&k.KDM(1,t,10)&&k.KCM(1,t,"a",1)){
r=m=1; // Line 41
k.KO(1,t,"7=OK ");
}
else if(k.KDM(0,t,11)&&k.KDM(0,t,12)&&k.KDM(0,t,13)){
r=m=1; // Line 46
k.KO(0,t,"8=OK ");
}
else if(k.KCM(1,t,"a",1)&&k.KDM(0,t,1)){
r=m=1; // Line 26
k.KO(1,t,"2=OK ");
}
else if(k.KDM(1,t,2)&&k.KCM(1,t,"a",1)){
r=m=1; // Line 29
k.KO(1,t,"3=OK ");
}
else if(k.KDM(0,t,3)&&k.KDM(0,t,4)){
r=m=1; // Line 32
k.KO(0,t,"4=OK ");
}
else if(k.KDM(1,t,9)&&k.KCM(1,t,"a",1)){
r=m=1; // Line 42
k.KO(1,t,"7=Fail1 ");
}
else if(k.KDM(1,t,10)&&k.KCM(1,t,"a",1)){
r=m=1; // Line 43
k.KO(1,t,"7=Fail2 ");
}
else if(k.KDM(0,t,11)&&k.KDM(0,t,12)){
r=m=1; // Line 50
k.KO(0,t,"8=Fail4 ");
}
else if(k.KDM(0,t,11)&&k.KDM(0,t,13)){
r=m=1; // Line 51
k.KO(0,t,"8=Fail5 ");
}
else if(k.KDM(0,t,12)&&k.KDM(0,t,13)){
r=m=1; // Line 52
k.KO(0,t,"8=Fail6 ");
}
else if(k.KDM(0,t,0)){
r=m=1; // Line 23
k.KO(0,t,"1=OK ");
}
else if(k.KDM(0,t,11)){
r=m=1; // Line 47
k.KO(0,t,"8=Fail1 ");
}
else if(k.KDM(0,t,12)){
r=m=1; // Line 48
k.KO(0,t,"8=Fail2 ");
}
else if(k.KDM(0,t,13)){
r=m=1; // Line 49
k.KO(0,t,"8=Fail3 ");
}
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '019 - multiple deadkeys'
store(&NAME) '0301 - multiple deadkeys'
c Description: Tests deadkey scenarios
c 1. One deadkey in context dk(1) + '1'
c 2. One char and one deadkey in context 'a' dk(2) + '2'

View file

@ -0,0 +1,93 @@
KeymanWeb.KR(new Keyboard_k_0302___deadkeys_and_backspace());
function Keyboard_k_0302___deadkeys_and_backspace()
{
this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;
this.KI="Keyboard_k_0302___deadkeys_and_backspace";
this.KN="0302- deadkeys and backspace";
this.KMINVER="9.0";
this.KV=null;
this.KDU=0;
this.KH='';
this.KM=0;
this.KBVER="1.0";
this.KMBM=0x0000;
this.KVS=[];
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.gs=function(t,e) {
return this.g_main_0(t,e);
};
this.g_main_0=function(t,e) {
var k=KeymanWeb,r=0,m=0;
if(k.KKM(e, 0x4000, 0x08)) {
if(k.KCM(2,t,"c",1)&&k.KDM(1,t,11)&&k.KCM(1,t,"d",1)){
r=m=1; // Line 32
k.KO(2,t," ok");
}
else if(k.KCM(2,t,"cd",2)){
r=m=1; // Line 31
k.KO(2,t," fail");
}
}
else if(k.KKM(e, 0x4000, 0x31)) {
if(1){
r=m=1; // Line 24
k.KDO(0,t,0);
}
}
else if(k.KKM(e, 0x4000, 0x32)) {
if(1){
r=m=1; // Line 25
k.KO(0,t,"a");
k.KDO(-1,t,1);
}
}
else if(k.KKM(e, 0x4000, 0x33)) {
if(1){
r=m=1; // Line 26
k.KDO(0,t,2);
k.KO(-1,t,"a");
}
}
else if(k.KKM(e, 0x4000, 0x34)) {
if(1){
r=m=1; // Line 27
k.KDO(0,t,3);
k.KDO(-1,t,4);
}
}
else if(k.KKM(e, 0x4000, 0x35)) {
if(1){
r=m=1; // Line 28
k.KO(0,t,"a");
k.KDO(-1,t,5);
k.KDO(-1,t,6);
k.KO(-1,t,"b");
}
}
else if(k.KKM(e, 0x4000, 0x36)) {
if(1){
r=m=1; // Line 29
k.KO(0,t,"a");
k.KDO(-1,t,7);
k.KDO(-1,t,8);
k.KO(-1,t,"b");
k.KDO(-1,t,9);
k.KDO(-1,t,10);
}
}
else if(k.KKM(e, 0x4000, 0x37)) {
if(1){
r=m=1; // Line 30
k.KO(0,t,"c");
k.KDO(-1,t,11);
k.KO(-1,t,"de");
}
}
return r;
};
}

View file

@ -1,4 +1,4 @@
store(&NAME) '020 - deadkeys and backspace'
store(&NAME) '0302- deadkeys and backspace'
c Description: Tests deadkey backspacing
c 1. One deadkey in context dk(1) + BKSP = nul
c 2. One char and one deadkey in context 'a' dk(2) + BKSP = nul

Some files were not shown because too many files have changed in this diff Show more