From 9e17f7f9c0f0bcb63865d9ef22ac515493c71571 Mon Sep 17 00:00:00 2001 From: Nnyny Date: Mon, 27 May 2024 15:39:41 +0700 Subject: [PATCH 001/119] Add context/options --- developer/src/tike/xml/help/contexthelp.xml | 149 ++++++++++++++++++++ 1 file changed, 149 insertions(+) diff --git a/developer/src/tike/xml/help/contexthelp.xml b/developer/src/tike/xml/help/contexthelp.xml index 3f071d11c39..b32c8d04ff1 100644 --- a/developer/src/tike/xml/help/contexthelp.xml +++ b/developer/src/tike/xml/help/contexthelp.xml @@ -387,6 +387,155 @@ +
+ +

The following options are configurable in TIKE in the General tab.

+
+ + +

+
+ + +

+
+ + +

Instead of opening a keyboard file in the Details tab, open directly into the Layout tab, Source pane.

+
+ + +

You can open any Keyman source file shown in the project in an external text editor by right-clicking + on the file and selecting "Open in External Editor". The files available for editing externally + are .kmn, .kps, and .kvks. This field configures which editor you wish to use to edit the files. + Note: if you need to pass command line parameters to the editor, you will need to wrap the command + in a batch file and reference the batch file here.

+
+ + +

You can open any Keyman source file shown in the project in an external text editor by right-clicking + on the file and selecting "Open in External Editor". The files available for editing externally + are .kmn, .kps, and .kvks. This field configures which editor you wish to use to edit the files. + Note: if you need to pass command line parameters to the editor, you will need to wrap the command + in a batch file and reference the batch file here.

+
+ + +

+
+ + +

+
+ + +

Configure your SMTP server settings for email functionality within Keyman Developer, + such as emailing debug URLs for the touch layout debugger.

+
+ + +

Configure the HTTP proxy settings for online functionality within Keyman Developer, + such as uploading files to Tavultesoft.

+
+ + +

Click Cancel to close the tab.

+
+ + +

Click OK to save changes.

+
+ + +

Sets whether to use the Tab character or spaces for indents.

+
+ + +

The indent size, measured in number of spaces.

+
+ + +

If checked, the quoted font size will be the same as the default font size.

+
+ + +

Sets the font for ordinary text in the editor.

+
+ + +

Sets the font for displaying comments text and strings in Keyman source files in single or double quotes.

+
+ + +

Sets the display theme and syntax highlighting options for the editor. A custom theme can be defined in a JSON file.

+
+ + +

Enables the Keyman 5-style Test window instead of the debugger.

+
+ + +

Breakpoints will fire when a rule has finished being processed also.

+
+ + +

Activates single-step mode after a breakpoint fires.

+
+ + +

Displays numeric indices of characters in stores

+
+ + +

When the debugger starts, rebuild a keyboard without prompting if the keyboard + has no debug symbols included.

+
+ + +

update is coming

+
+ + +

+
+ + +

The character beneath the cursor in the edit window will be highlighted in the + Character Map. This will intelligently parse the character data under the cursor so that + a character code (e.g. U+1234) will be highlighted correctly.

+
+ + +

Rebuilds the Unicode character database from source unicodedata.txt and blocks.txt. + These files can be downloaded from the Unicode website at http://www.unicode.org/ucd/. + This lets you update the character map with a newer version of Unicode. + Keyman Developer 10.0 was released with Unicode version 10.0 data.

+
+ + +

Rebuilds the Unicode character database from source unicodedata.txt and blocks.txt. + These files can be downloaded from the Unicode website at http://www.unicode.org/ucd/. + This lets you update the character map with a newer version of Unicode. + Keyman Developer 10.0 was released with Unicode version 10.0 data.

+
+ + +

You can customize the Keyman Developer server for testing the usability of your keyboard. + Features of the Keyman Developer server include: +

    +
  • Seamless integration with the IDE (Start, Stop, Live reload, Recompile...)
  • +
  • Port configuration
  • +
  • Allow testing cross devices
  • +
  • Wider range support for NGROK...
  • +
+

+
+ + +

Below Configure Server, untick the box, and it will quit displaying any local URLs for keyboard testing.

+
+
+

This dialog lets you check the virtual key code for any key combination (except Window reserved key combinations such as Alt + Tab). You can then insert the virtual key code into the last active edit window at the current cursor position.



From 8e0033072ffcce47c11c32e70deb9b8b23ec6d9e Mon Sep 17 00:00:00 2001 From: Nguonnyny Tan <123520338+Nnyny@users.noreply.github.com> Date: Tue, 28 May 2024 12:34:20 +0700 Subject: [PATCH 002/119] Update developer/src/tike/xml/help/contexthelp.xml Co-authored-by: Marc Durdin --- developer/src/tike/xml/help/contexthelp.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer/src/tike/xml/help/contexthelp.xml b/developer/src/tike/xml/help/contexthelp.xml index b32c8d04ff1..be466fdc2ce 100644 --- a/developer/src/tike/xml/help/contexthelp.xml +++ b/developer/src/tike/xml/help/contexthelp.xml @@ -439,7 +439,7 @@
-

Click Cancel to close the tab.

+

Click Cancel to close the dialog without saving changes.

From 73f8477b50b00d34f6b2340df9f6738d62b2537e Mon Sep 17 00:00:00 2001 From: Nguonnyny Tan <123520338+Nnyny@users.noreply.github.com> Date: Tue, 28 May 2024 12:34:35 +0700 Subject: [PATCH 003/119] Update developer/src/tike/xml/help/contexthelp.xml Co-authored-by: Marc Durdin --- developer/src/tike/xml/help/contexthelp.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer/src/tike/xml/help/contexthelp.xml b/developer/src/tike/xml/help/contexthelp.xml index be466fdc2ce..1d0f3aa7725 100644 --- a/developer/src/tike/xml/help/contexthelp.xml +++ b/developer/src/tike/xml/help/contexthelp.xml @@ -443,7 +443,7 @@ -

Click OK to save changes.

+

Click OK to save changes and close the dialog.

From 518a13a5910a549694e1bc14bd646c47e2173ae9 Mon Sep 17 00:00:00 2001 From: Nguonnyny Tan <123520338+Nnyny@users.noreply.github.com> Date: Tue, 28 May 2024 14:53:47 +0700 Subject: [PATCH 004/119] Update contexthelp.xml --- developer/src/tike/xml/help/contexthelp.xml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/developer/src/tike/xml/help/contexthelp.xml b/developer/src/tike/xml/help/contexthelp.xml index 1d0f3aa7725..700ef63a657 100644 --- a/developer/src/tike/xml/help/contexthelp.xml +++ b/developer/src/tike/xml/help/contexthelp.xml @@ -389,7 +389,7 @@ -

The following options are configurable in TIKE in the General tab.

+

The Options dialog display several tabs such as General, Editor, Debugger, Character Map and Server. You can configure the environment of Keyman Developer here.

@@ -492,7 +492,9 @@ -

update is coming

+

If you are debugging a keyboard, make a change to the keyboard, and recompile it, then the debugger needs to be + reset in order to get access to the new keyboard. Keyman Developer will normally prompt you to do this, but if you set + this option, then it will reset the debugger automatically instead.

@@ -516,7 +518,7 @@

Rebuilds the Unicode character database from source unicodedata.txt and blocks.txt. These files can be downloaded from the Unicode website at http://www.unicode.org/ucd/. This lets you update the character map with a newer version of Unicode. - Keyman Developer 10.0 was released with Unicode version 10.0 data.

+ Keyman Developer 17.0 was released with Unicode version 15.1 data.

@@ -550,4 +552,4 @@

To close the dialog, click the Close button or press Shift + Esc.

- \ No newline at end of file + From 6627d4e103019cd0d5c11567ea15fcba2ceb6293 Mon Sep 17 00:00:00 2001 From: Nguonnyny Tan <123520338+Nnyny@users.noreply.github.com> Date: Thu, 30 May 2024 12:19:21 +0700 Subject: [PATCH 005/119] chore: remove 'chkShowStartupDialog' and 'chkAllowMultipleInstances' --- developer/src/tike/xml/help/contexthelp.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/developer/src/tike/xml/help/contexthelp.xml b/developer/src/tike/xml/help/contexthelp.xml index 700ef63a657..4898f9a1c22 100644 --- a/developer/src/tike/xml/help/contexthelp.xml +++ b/developer/src/tike/xml/help/contexthelp.xml @@ -392,14 +392,6 @@

The Options dialog display several tabs such as General, Editor, Debugger, Character Map and Server. You can configure the environment of Keyman Developer here.

- -

-
- - -

-
-

Instead of opening a keyboard file in the Details tab, open directly into the Layout tab, Source pane.

From 90ec3313bdf17207de9614450e39b1ec203dcad7 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 22 Jul 2024 14:06:29 +0100 Subject: [PATCH 006/119] chore(developer): add initial context test cases in GetXStringImpl type c test --- .../kmcmplib/tests/gtest-compiler-test.cpp | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 569411557c9..50745a664be 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -900,6 +900,40 @@ TEST_F(CompilerTest, GetXStringImpl_type_o_test) { // EXPECT_EQ(0, u16cmp(tstr_outs_space_after_valid, tstr)); } +// tests strings starting with 'c' +TEST_F(CompilerTest, GetXStringImpl_type_c_test) { + KMX_WCHAR tstr[128]; + fileKeyboard.version = VERSION_80; + KMX_WCHAR str[LINESIZE]; + KMX_WCHAR output[GLOBAL_BUFSIZE]; + PKMX_WCHAR newp = nullptr; + + // are comments stripped before this point? + // if so, why the test on whitespace after 'c'? + + // CERR_InvalidToken + u16cpy(str, u"cde"); + EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // context, CERR_ContextInVirtualKeySection *** TODO *** + + // context, no offset, valid + u16cpy(str, u"context"); + EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_context_no_offset_valid[] = { UC_SENTINEL, CODE_CONTEXT, 0 }; + EXPECT_EQ(0, u16cmp(tstr_context_no_offset_valid, tstr)); + + //std::cerr << "start debug" << std::endl; + + // context, no close delimiter => NULL + u16cpy(str, u"context("); + //KMX_DWORD res = GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE); + //std::cerr << std::hex << "res: " << res << std::dec << std::endl; + EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + //std::cerr << "end debug" << std::endl; +} + // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) // KMX_DWORD process_platform(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) // KMX_DWORD process_if_synonym(KMX_DWORD dwSystemID, PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From 5349ab5c66ba1fb7b43d23f60f20061ee57b0070 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 22 Jul 2024 15:29:44 +0100 Subject: [PATCH 007/119] chore(developer): add six additional context test cases --- .../kmcmplib/tests/gtest-compiler-test.cpp | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 50745a664be..ba14047907c 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -903,7 +903,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_o_test) { // tests strings starting with 'c' TEST_F(CompilerTest, GetXStringImpl_type_c_test) { KMX_WCHAR tstr[128]; - fileKeyboard.version = VERSION_80; + fileKeyboard.version = VERSION_60; KMX_WCHAR str[LINESIZE]; KMX_WCHAR output[GLOBAL_BUFSIZE]; PKMX_WCHAR newp = nullptr; @@ -912,26 +912,64 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { // if so, why the test on whitespace after 'c'? // CERR_InvalidToken + fileKeyboard.version = VERSION_60; u16cpy(str, u"cde"); EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); // context, CERR_ContextInVirtualKeySection *** TODO *** // context, no offset, valid + fileKeyboard.version = VERSION_60; u16cpy(str, u"context"); EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_context_no_offset_valid[] = { UC_SENTINEL, CODE_CONTEXT, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_no_offset_valid, tstr)); - //std::cerr << "start debug" << std::endl; - - // context, no close delimiter => NULL + // context, CERR_InvalidToken, no close delimiter => NULL + fileKeyboard.version = VERSION_60; u16cpy(str, u"context("); - //KMX_DWORD res = GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE); - //std::cerr << std::hex << "res: " << res << std::dec << std::endl; EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - //std::cerr << "end debug" << std::endl; + // context, empty delimiters => empty string, valid + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context()"); + EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_context_empty_offset_valid[] = { UC_SENTINEL, CODE_CONTEXT, 0 }; + EXPECT_EQ(0, u16cmp(tstr_context_empty_offset_valid, tstr)); + + // context, space in delimiters ... investigate u16tok() ... issue #11814 + // fileKeyboard.version = VERSION_60; + // u16cpy(str, u"context( )"); + // EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // context, offset, valid + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context(1)"); + EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_context_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; + EXPECT_EQ(0, u16cmp(tstr_context_offset_valid, tstr)); + + // context, CERR_InvalidToke, offset < 1 + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context(0)"); + EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // context, large offset < 0xF000, valid + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context(61439)"); //0xF000 - 1 + EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_context_large_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 61439, 0 }; + EXPECT_EQ(0, u16cmp(tstr_context_large_offset_valid, tstr)); + + // context, too large offset == 0xF000, valid + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context(61440)"); //0xF000 + EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // context, CERR_60FeatureOnly_Contextn + fileKeyboard.version = VERSION_50; + u16cpy(str, u"context(1)"); + EXPECT_EQ(CERR_60FeatureOnly_Contextn, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From bd38faf8aaa1202e3690a5e0506894f7bbbe25fe Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 22 Jul 2024 15:37:29 +0100 Subject: [PATCH 008/119] chore(developer): add two test cases for spaces around context offset --- .../src/kmcmplib/tests/gtest-compiler-test.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index ba14047907c..6961c28b532 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -970,6 +970,20 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { fileKeyboard.version = VERSION_50; u16cpy(str, u"context(1)"); EXPECT_EQ(CERR_60FeatureOnly_Contextn, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // context, space before offset, valid + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context( 1)"); + EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_context_space_before_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; + EXPECT_EQ(0, u16cmp(tstr_context_space_before_offset_valid, tstr)); + + // context, space after offset, valid ... investigate GetDelimitedString() ... issue #11937 + // fileKeyboard.version = VERSION_60; + // u16cpy(str, u"context(1 )"); + // EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + // const KMX_WCHAR tstr_context_space_after_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; + // EXPECT_EQ(0, u16cmp(tstr_context_space_after_offset_valid, tstr)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From d1be0f21e8c5cda9b6f065d3a56cba8ced724ed2 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Wed, 24 Jul 2024 10:54:05 +0100 Subject: [PATCH 009/119] chore(developer): uncomment two test cases due to compiler fixes #11910, #11938, plus correct a test case comment --- .../kmcmplib/tests/gtest-compiler-test.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index cca30703376..8e9b410e3ad 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1183,10 +1183,10 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { const KMX_WCHAR tstr_context_empty_offset_valid[] = { UC_SENTINEL, CODE_CONTEXT, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_empty_offset_valid, tstr)); - // context, space in delimiters ... investigate u16tok() ... issue #11814 - // fileKeyboard.version = VERSION_60; - // u16cpy(str, u"context( )"); - // EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + // context, space in delimiters (see I11814, I11937, #11910, #11894, #11938) + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context( )"); + EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); // context, offset, valid fileKeyboard.version = VERSION_60; @@ -1207,7 +1207,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { const KMX_WCHAR tstr_context_large_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 61439, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_large_offset_valid, tstr)); - // context, too large offset == 0xF000, valid + // context, CERR_InvalidToken, too large offset == 0xF000 fileKeyboard.version = VERSION_60; u16cpy(str, u"context(61440)"); //0xF000 EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); @@ -1224,12 +1224,12 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { const KMX_WCHAR tstr_context_space_before_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_space_before_offset_valid, tstr)); - // context, space after offset, valid ... investigate GetDelimitedString() ... issue #11937 - // fileKeyboard.version = VERSION_60; - // u16cpy(str, u"context(1 )"); - // EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // const KMX_WCHAR tstr_context_space_after_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; - // EXPECT_EQ(0, u16cmp(tstr_context_space_after_offset_valid, tstr)); + // context, space after offset, valid (see I11937, #11938) + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context(1 )"); + EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_context_space_after_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; + EXPECT_EQ(0, u16cmp(tstr_context_space_after_offset_valid, tstr)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From bbcb2cc1a193fef7db059e58adb2b1501b0d6ccf Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 12 Aug 2024 10:07:41 +0100 Subject: [PATCH 010/119] chore(developer): correct return codes in GetXStringImpl_type_c following refactor --- .../kmcmplib/tests/gtest-compiler-test.cpp | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 1907ab75814..426220e376a 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1236,77 +1236,77 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { // are comments stripped before this point? // if so, why the test on whitespace after 'c'? - // CERR_InvalidToken + // KmnCompilerMessages::ERROR_InvalidToken fileKeyboard.version = VERSION_60; u16cpy(str, u"cde"); - EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // context, CERR_ContextInVirtualKeySection *** TODO *** + // context, KmnCompilerMessages::ERROR_ContextInVirtualKeySection *** TODO *** // context, no offset, valid fileKeyboard.version = VERSION_60; u16cpy(str, u"context"); - EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_context_no_offset_valid[] = { UC_SENTINEL, CODE_CONTEXT, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_no_offset_valid, tstr)); - // context, CERR_InvalidToken, no close delimiter => NULL + // context, KmnCompilerMessages::ERROR_InvalidToken, no close delimiter => NULL fileKeyboard.version = VERSION_60; u16cpy(str, u"context("); - EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); // context, empty delimiters => empty string, valid fileKeyboard.version = VERSION_60; u16cpy(str, u"context()"); - EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_context_empty_offset_valid[] = { UC_SENTINEL, CODE_CONTEXT, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_empty_offset_valid, tstr)); // context, space in delimiters (see I11814, I11937, #11910, #11894, #11938) fileKeyboard.version = VERSION_60; u16cpy(str, u"context( )"); - EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); // context, offset, valid fileKeyboard.version = VERSION_60; u16cpy(str, u"context(1)"); - EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_context_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_offset_valid, tstr)); // context, CERR_InvalidToke, offset < 1 fileKeyboard.version = VERSION_60; u16cpy(str, u"context(0)"); - EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); // context, large offset < 0xF000, valid fileKeyboard.version = VERSION_60; u16cpy(str, u"context(61439)"); //0xF000 - 1 - EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_context_large_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 61439, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_large_offset_valid, tstr)); - // context, CERR_InvalidToken, too large offset == 0xF000 + // context, KmnCompilerMessages::ERROR_InvalidToken, too large offset == 0xF000 fileKeyboard.version = VERSION_60; u16cpy(str, u"context(61440)"); //0xF000 - EXPECT_EQ(CERR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // context, CERR_60FeatureOnly_Contextn + // context, KmnCompilerMessages::ERROR_60FeatureOnly_Contextn fileKeyboard.version = VERSION_50; u16cpy(str, u"context(1)"); - EXPECT_EQ(CERR_60FeatureOnly_Contextn, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(KmnCompilerMessages::ERROR_60FeatureOnly_Contextn, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); // context, space before offset, valid fileKeyboard.version = VERSION_60; u16cpy(str, u"context( 1)"); - EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_context_space_before_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_space_before_offset_valid, tstr)); // context, space after offset, valid (see I11937, #11938) fileKeyboard.version = VERSION_60; u16cpy(str, u"context(1 )"); - EXPECT_EQ(CERR_None, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_context_space_after_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_space_after_offset_valid, tstr)); } From 700b77fb001bb306ee427c90109f7bbcf5979fa5 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 12 Aug 2024 11:58:54 +0100 Subject: [PATCH 011/119] chore(developer): rewrite ReportCompilerMessage test following refactor --- .../kmcmplib/tests/gtest-compiler-test.cpp | 82 +++++++++++-------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 426220e376a..1d5aafdd543 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -26,7 +26,9 @@ KMX_DWORD ProcessKeyLineImpl(PFILE_KEYBOARD fk, PKMX_WCHAR str, KMX_BOOL IsUnico namespace kmcmp { extern int nErrors; + extern int currentLine; extern int ErrChr; + extern std::string messageFilename; extern int BeginLine[4]; extern int CompileTarget; } @@ -49,7 +51,9 @@ class CompilerTest : public testing::Test { kmcmp::msgproc = msgproc_collect; msgproc_errors.clear(); kmcmp::nErrors = 0; + kmcmp::currentLine = 0; kmcmp::ErrChr = 0; + kmcmp::messageFilename = ""; kmcmp::BeginLine[BEGIN_ANSI] = -1; kmcmp::BeginLine[BEGIN_UNICODE] = -1; kmcmp::BeginLine[BEGIN_NEWCONTEXT] = -1; @@ -126,42 +130,48 @@ TEST_F(CompilerTest, wstrtostr_test) { EXPECT_EQ(0, strcmp("", wstrtostr((PKMX_WCHAR)u""))); }; -// TEST_F(CompilerTest, ReportCompilerMessage_test) { -// msgproc = msgproc_true_stub; -// kmcmp::ErrChr = 0; - -// // SevFatal -// EXPECT_EQ(0, kmcmp::nErrors); -// EXPECT_EQ(SevFatal, KmnCompilerMessages::FATAL_CannotCreateTempfile & SevFatal); -// EXPECT_TRUE(ReportCompilerMessage(KmnCompilerMessages::FATAL_CannotCreateTempfile)); -// EXPECT_EQ(1, kmcmp::nErrors); - -// // SevError -// EXPECT_EQ(SevError, KmnCompilerMessages::ERROR_InvalidLayoutLine & SevError); -// EXPECT_FALSE(ReportCompilerMessage(KmnCompilerMessages::ERROR_InvalidLayoutLine)); -// EXPECT_EQ(2, kmcmp::nErrors); - -// // Unknown -// const KMX_DWORD UNKNOWN_ERROR = 0x00004FFF; // top of range ERROR -// EXPECT_EQ(SevError, UNKNOWN_ERROR & SevError); -// EXPECT_FALSE(ReportCompilerMessage(UNKNOWN_ERROR)); -// sprintf(expected, "Unknown error %x", UNKNOWN_ERROR); -// EXPECT_EQ(3, kmcmp::nErrors); - -// // ErrChr -// const int ERROR_CHAR_INDEX = 42; -// kmcmp::ErrChr = ERROR_CHAR_INDEX ; -// EXPECT_EQ(SevError, KmnCompilerMessages::ERROR_InvalidLayoutLine & SevError); -// EXPECT_FALSE(ReportCompilerMessage(KmnCompilerMessages::ERROR_InvalidLayoutLine)); -// kmcmp::ErrChr = 0; -// EXPECT_EQ(4, kmcmp::nErrors); - -// // msgproc returns FALSE -// msgproc = msgproc_false_stub; -// EXPECT_EQ(SevError, KmnCompilerMessages::ERROR_InvalidLayoutLine & SevError); -// EXPECT_TRUE(ReportCompilerMessage(KmnCompilerMessages::ERROR_InvalidLayoutLine)); -// EXPECT_EQ(6, kmcmp::nErrors); -// }; +TEST_F(CompilerTest, ReportCompilerMessage_test) { + kmcmp::msgproc = msgproc_collect; + kmcmp::currentLine = 42; + std::vector params{"parameter"}; + kmcmp::messageFilename = "filename"; + kmcmp::ErrChr = 0; + + // SevFatal + EXPECT_EQ(0, kmcmp::nErrors); + EXPECT_EQ(SevFatal, KmnCompilerMessages::FATAL_CannotCreateTempfile & SevFatal); + ReportCompilerMessage(KmnCompilerMessages::FATAL_CannotCreateTempfile, params); + EXPECT_EQ(1, kmcmp::nErrors); + EXPECT_EQ(msgproc_errors[0].errorCode, KmnCompilerMessages::FATAL_CannotCreateTempfile); + EXPECT_EQ(msgproc_errors[0].lineNumber, kmcmp::currentLine+1); + EXPECT_EQ(msgproc_errors[0].columnNumber, kmcmp::ErrChr); + EXPECT_TRUE(msgproc_errors[0].filename == kmcmp::messageFilename); + EXPECT_TRUE(msgproc_errors[0].parameters == params); + + // SevError + EXPECT_EQ(SevError, KmnCompilerMessages::ERROR_InvalidLayoutLine & SevError); + ReportCompilerMessage(KmnCompilerMessages::ERROR_InvalidLayoutLine); + EXPECT_EQ(2, kmcmp::nErrors); + EXPECT_EQ(msgproc_errors[1].errorCode, KmnCompilerMessages::ERROR_InvalidLayoutLine); + + // SevWarn + EXPECT_EQ(SevWarn, KmnCompilerMessages::WARN_ReservedCharacter & SevWarn); + ReportCompilerMessage(KmnCompilerMessages::WARN_ReservedCharacter); + EXPECT_EQ(2, kmcmp::nErrors); + EXPECT_EQ(msgproc_errors[2].errorCode, KmnCompilerMessages::WARN_ReservedCharacter); + + // SevHint + EXPECT_EQ(SevHint, KmnCompilerMessages::HINT_NonUnicodeFile & SevHint); + ReportCompilerMessage(KmnCompilerMessages::HINT_NonUnicodeFile); + EXPECT_EQ(2, kmcmp::nErrors); + EXPECT_EQ(msgproc_errors[3].errorCode, KmnCompilerMessages::HINT_NonUnicodeFile); + + // SevInfo + EXPECT_EQ(SevInfo, KmnCompilerMessages::INFO_MinimumCoreEngineVersion & SevInfo); + ReportCompilerMessage(KmnCompilerMessages::INFO_MinimumCoreEngineVersion); + EXPECT_EQ(2, kmcmp::nErrors); + EXPECT_EQ(msgproc_errors[4].errorCode, KmnCompilerMessages::INFO_MinimumCoreEngineVersion); +}; TEST_F(CompilerTest, ProcessBeginLine_test) { KMX_WCHAR str[LINESIZE]; From 06faa718ccede6a5585ef46ce1ad05f3b0f346ee Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 19 Aug 2024 10:49:18 +0100 Subject: [PATCH 012/119] chore(developer): add clearcontext test case to GetXStringImpl_type_c test --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 60deb8e511a..0ad914ab0c1 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1319,6 +1319,13 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_context_space_after_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; EXPECT_EQ(0, u16cmp(tstr_context_space_after_offset_valid, tstr)); + + // clearcontext, valid + fileKeyboard.version = VERSION_60; + u16cpy(str, u"clearcontext"); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_clearcontext_valid[] = { UC_SENTINEL, CODE_CLEARCONTEXT, 0 }; + EXPECT_EQ(0, u16cmp(tstr_clearcontext_valid, tstr)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From d552e5773a4c32f47e9e40f9904bc47b486436c4 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 19 Aug 2024 12:35:52 +0100 Subject: [PATCH 013/119] chore(developer): add first test case for call in GetXStringImpl_type_c test --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 0ad914ab0c1..a391de77dc4 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1326,6 +1326,13 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_clearcontext_valid[] = { UC_SENTINEL, CODE_CLEARCONTEXT, 0 }; EXPECT_EQ(0, u16cmp(tstr_clearcontext_valid, tstr)); + + // call, KmnCompilerMessages::ERROR_501FeatureOnly_Call + fileKeyboard.version = VERSION_50; + u16cpy(str, u"call"); + EXPECT_EQ(KmnCompilerMessages::ERROR_501FeatureOnly_Call, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // context, KmnCompilerMessages::ERROR_CallInVirtualKeySection *** TODO *** } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From eaa654c49ded9d703b86a594208120652efb45e9 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 19 Aug 2024 15:36:23 +0100 Subject: [PATCH 014/119] chore(developer): add six call test cases to GetXStringImpl_type_c test, but with ERROR_StoreDoesNotExist cases commented out due to bug --- .../kmcmplib/tests/gtest-compiler-test.cpp | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index a391de77dc4..9b3964e03b9 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1242,6 +1242,13 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { KMX_WCHAR str[LINESIZE]; KMX_WCHAR output[GLOBAL_BUFSIZE]; PKMX_WCHAR newp = nullptr; + PFILE_STORE file_store = new FILE_STORE[100]; + fileKeyboard.cxStoreArray = 3u; + fileKeyboard.dpStoreArray = file_store; + file_store[1].fIsStore = TRUE; + u16cpy(file_store[0].szName, u"a"); + u16cpy(file_store[1].szName, u"b"); + u16cpy(file_store[2].szName, u"c"); // are comments stripped before this point? // if so, why the test on whitespace after 'c'? @@ -1333,6 +1340,36 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { EXPECT_EQ(KmnCompilerMessages::ERROR_501FeatureOnly_Call, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); // context, KmnCompilerMessages::ERROR_CallInVirtualKeySection *** TODO *** + + // call, no close delimiter => NULL + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call("); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, empty delimiters => empty string + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call()"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, space in delimiters (see I11814, I11937, #11910, #11894, #11938) + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call( )"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, KmnCompilerMessages::ERROR_StoreDoesNotExist + // fileKeyboard.version = VERSION_501; + // u16cpy(str, u"call(d)"); + // EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, KmnCompilerMessages::ERROR_StoreDoesNotExist, space before store + // fileKeyboard.version = VERSION_501; + // u16cpy(str, u"call( d)"); + // EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, KmnCompilerMessages::ERROR_StoreDoesNotExist, space after store + // fileKeyboard.version = VERSION_501; + // u16cpy(str, u"call(d )"); + // EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From 5fc7a267021cea21d3f6d47b2c938841daf91c9c Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Thu, 22 Aug 2024 15:26:59 +0100 Subject: [PATCH 015/119] chore(developer): remove test cases for call() in GetXStringImpl_type_c test moved to #12263 --- .../kmcmplib/tests/gtest-compiler-test.cpp | 44 ------------------- 1 file changed, 44 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 9b3964e03b9..0ad914ab0c1 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1242,13 +1242,6 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { KMX_WCHAR str[LINESIZE]; KMX_WCHAR output[GLOBAL_BUFSIZE]; PKMX_WCHAR newp = nullptr; - PFILE_STORE file_store = new FILE_STORE[100]; - fileKeyboard.cxStoreArray = 3u; - fileKeyboard.dpStoreArray = file_store; - file_store[1].fIsStore = TRUE; - u16cpy(file_store[0].szName, u"a"); - u16cpy(file_store[1].szName, u"b"); - u16cpy(file_store[2].szName, u"c"); // are comments stripped before this point? // if so, why the test on whitespace after 'c'? @@ -1333,43 +1326,6 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_clearcontext_valid[] = { UC_SENTINEL, CODE_CLEARCONTEXT, 0 }; EXPECT_EQ(0, u16cmp(tstr_clearcontext_valid, tstr)); - - // call, KmnCompilerMessages::ERROR_501FeatureOnly_Call - fileKeyboard.version = VERSION_50; - u16cpy(str, u"call"); - EXPECT_EQ(KmnCompilerMessages::ERROR_501FeatureOnly_Call, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // context, KmnCompilerMessages::ERROR_CallInVirtualKeySection *** TODO *** - - // call, no close delimiter => NULL - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call("); - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, empty delimiters => empty string - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call()"); - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, space in delimiters (see I11814, I11937, #11910, #11894, #11938) - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call( )"); - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, KmnCompilerMessages::ERROR_StoreDoesNotExist - // fileKeyboard.version = VERSION_501; - // u16cpy(str, u"call(d)"); - // EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, KmnCompilerMessages::ERROR_StoreDoesNotExist, space before store - // fileKeyboard.version = VERSION_501; - // u16cpy(str, u"call( d)"); - // EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, KmnCompilerMessages::ERROR_StoreDoesNotExist, space after store - // fileKeyboard.version = VERSION_501; - // u16cpy(str, u"call(d )"); - // EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From bd1d593a668f43fafa42fd16b12256d5be23a125 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Thu, 22 Aug 2024 17:22:53 +0100 Subject: [PATCH 016/119] chore(developer): add a valid context test case, and remove unnecessary local variables for two others in GetXStringImpl_type_c test --- .../src/kmcmplib/tests/gtest-compiler-test.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 0ad914ab0c1..ea8a134300e 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1306,19 +1306,24 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { u16cpy(str, u"context(1)"); EXPECT_EQ(KmnCompilerMessages::ERROR_60FeatureOnly_Contextn, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + // context, valid + fileKeyboard.version = VERSION_60; + u16cpy(str, u"context(1)"); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_context_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; + EXPECT_EQ(0, u16cmp(tstr_context_valid, tstr)); + // context, space before offset, valid fileKeyboard.version = VERSION_60; u16cpy(str, u"context( 1)"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_context_space_before_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; - EXPECT_EQ(0, u16cmp(tstr_context_space_before_offset_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_context_valid, tstr)); // context, space after offset, valid (see I11937, #11938) fileKeyboard.version = VERSION_60; u16cpy(str, u"context(1 )"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_context_space_after_offset_valid[] = { UC_SENTINEL, CODE_CONTEXTEX, 1, 0 }; - EXPECT_EQ(0, u16cmp(tstr_context_space_after_offset_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_context_valid, tstr)); // clearcontext, valid fileKeyboard.version = VERSION_60; From 242ccee4f26287741538afb5a0d0aadf457dc972 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Thu, 22 Aug 2024 17:25:22 +0100 Subject: [PATCH 017/119] chore(developer): remove unnecessary local variables in two outs test cases --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index ea8a134300e..3cae4cba331 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1224,15 +1224,13 @@ TEST_F(CompilerTest, GetXStringImpl_type_o_test) { file_store[1].dpString = (PKMX_WCHAR)u"abc"; u16cpy(str, u"outs( b)"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_outs_space_before_valid[] = { 'a', 'b', 'c', 0 }; - EXPECT_EQ(0, u16cmp(tstr_outs_space_before_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_outs_valid, tstr)); // outs, space after store, valid (see I11937, #11938) file_store[1].dpString = (PKMX_WCHAR)u"abc"; u16cpy(str, u"outs(b )"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_outs_space_after_valid[] = { 'a', 'b', 'c', 0 }; - EXPECT_EQ(0, u16cmp(tstr_outs_space_after_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_outs_valid, tstr)); } // tests strings starting with 'c' From 64193bd60460ba20606d836e71fa8d3364c101a4 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Thu, 22 Aug 2024 17:29:02 +0100 Subject: [PATCH 018/119] chore(developer): remove unnecessary local variables in three index test cases --- .../src/kmcmplib/tests/gtest-compiler-test.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 3cae4cba331..e5089396ad8 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1101,32 +1101,29 @@ TEST_F(CompilerTest, GetXStringImpl_type_i_test) { fileKeyboard.dpStoreArray = file_store; u16cpy(str, u"index(b,4)"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_index_comma_valid[] = { UC_SENTINEL, CODE_INDEX, 2, 4, 0 }; - EXPECT_EQ(0, u16cmp(tstr_index_comma_valid, tstr)); + const KMX_WCHAR tstr_index_valid[] = { UC_SENTINEL, CODE_INDEX, 2, 4, 0 }; + EXPECT_EQ(0, u16cmp(tstr_index_valid, tstr)); // index, space before store, comma, valid fileKeyboard.cxStoreArray = 3u; fileKeyboard.dpStoreArray = file_store; u16cpy(str, u"index( b,4)"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_index_initial_space_and_comma_valid[] = { UC_SENTINEL, CODE_INDEX, 2, 4, 0 }; - EXPECT_EQ(0, u16cmp(tstr_index_initial_space_and_comma_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_index_valid, tstr)); // index, comma and space, valid fileKeyboard.cxStoreArray = 3u; fileKeyboard.dpStoreArray = file_store; u16cpy(str, u"index(b, 4)"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_index_comma_and_space_valid[] = { UC_SENTINEL, CODE_INDEX, 2, 4, 0 }; - EXPECT_EQ(0, u16cmp(tstr_index_comma_and_space_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_index_valid, tstr)); // index, space, valid ... should not be valid (see issue #11833) u16cpy(str, u"index(b 4)"); fileKeyboard.cxStoreArray = 3u; fileKeyboard.dpStoreArray = file_store; EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_index_space_valid[] = { UC_SENTINEL, CODE_INDEX, 2, 4, 0 }; - EXPECT_EQ(0, u16cmp(tstr_index_space_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_index_valid, tstr)); // index, two-digit parameter, valid u16cpy(str, u"index(b,42)"); From f92b2e1fd61d865209924a9c5c672279d06d0325 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Thu, 22 Aug 2024 17:32:49 +0100 Subject: [PATCH 019/119] chore(developer): remove unnecesary local variables from two if test cases --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index e5089396ad8..80179ff4c2d 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1022,8 +1022,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_i_test) { option[1].fIsOption = TRUE; u16cpy(str, u"if(b =beep)"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_if_option_space_before_assign_valid[] = { UC_SENTINEL, CODE_IFOPT, 2, 2, 4, 0 }; - EXPECT_EQ(0, u16cmp(tstr_if_option_space_before_assign_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_if_option_valid, tstr)); // if, option, equal, space before rhs, valid fileKeyboard.version = VERSION_80; @@ -1032,8 +1031,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_i_test) { option[1].fIsOption = TRUE; u16cpy(str, u"if(b= beep)"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_if_option_space_before_rhs_valid[] = { UC_SENTINEL, CODE_IFOPT, 2, 2, 4, 0 }; - EXPECT_EQ(0, u16cmp(tstr_if_option_space_before_rhs_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_if_option_valid, tstr)); // if, option, equal, space after rhs, valid (see I11937, #11938) fileKeyboard.version = VERSION_80; @@ -1042,8 +1040,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_i_test) { option[1].fIsOption = TRUE; u16cpy(str, u"if(b=beep )"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_if_option_space_after_rhs_valid[] = { UC_SENTINEL, CODE_IFOPT, 2, 2, 4, 0 }; - EXPECT_EQ(0, u16cmp(tstr_if_option_space_after_rhs_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_if_option_valid, tstr)); delete[] option; PFILE_STORE file_store = new FILE_STORE[100]; From c1c4c63b468edd11e154dfae1f29faf557ccfb7b Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Thu, 22 Aug 2024 17:34:41 +0100 Subject: [PATCH 020/119] chore(developer): remove unnecesary local variables from two baselayout test cases --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 80179ff4c2d..8bdc0245196 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -912,8 +912,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_b_test) { fileKeyboard.dpStoreArray = nullptr; u16cpy(str, u"baselayout( beep)"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_baselayout_space_before_valid[] = { UC_SENTINEL, CODE_IFSYSTEMSTORE, TSS_BASELAYOUT+1, 2, 1, 0 }; - EXPECT_EQ(0, u16cmp(tstr_baselayout_space_before_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_baselayout_valid, tstr)); // baselayout, space after argument, valid (see I11937, #11938) fileKeyboard.version = VERSION_90; @@ -921,8 +920,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_b_test) { fileKeyboard.dpStoreArray = nullptr; u16cpy(str, u"baselayout(beep )"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_baselayout_space_after_valid[] = { UC_SENTINEL, CODE_IFSYSTEMSTORE, TSS_BASELAYOUT+1, 2, 1, 0 }; - EXPECT_EQ(0, u16cmp(tstr_baselayout_space_after_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_baselayout_valid, tstr)); } // tests strings starting with 'i' From 2de7c269505ab2684224b6af23b04c381b120ae7 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Thu, 22 Aug 2024 17:36:00 +0100 Subject: [PATCH 021/119] chore(developer): remove unnecesary local variables from two any test cases --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 8bdc0245196..3be157cee0f 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -837,15 +837,13 @@ TEST_F(CompilerTest, GetXStringImpl_type_a_test) { u16cpy(str, u"any( b)"); file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_any_space_before_valid[] = { UC_SENTINEL, CODE_ANY, 2, 0 }; - EXPECT_EQ(0, u16cmp(tstr_any_space_before_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_any_valid, tstr)); // space after store, valid (see I11937, #11938) u16cpy(str, u"any(b )"); file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_any_space_after_valid[] = { UC_SENTINEL, CODE_ANY, 2, 0 }; - EXPECT_EQ(0, u16cmp(tstr_any_space_after_valid, tstr)); + EXPECT_EQ(0, u16cmp(tstr_any_valid, tstr)); } // tests strings starting with 'b' From ec5a749484615bb8d8d2671d0afae8983b6c6c22 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 10:30:21 +0100 Subject: [PATCH 022/119] chore(developer): initial GetXStringImpl_type_n test --- .../src/kmcmplib/tests/gtest-compiler-test.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 3be157cee0f..5d3f552565c 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1321,6 +1321,23 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { EXPECT_EQ(0, u16cmp(tstr_clearcontext_valid, tstr)); } +// tests strings starting with 'n' +TEST_F(CompilerTest, GetXStringImpl_type_n_test) { + KMX_WCHAR tstr[128]; + fileKeyboard.version = VERSION_70; + KMX_WCHAR str[LINESIZE]; + KMX_WCHAR output[GLOBAL_BUFSIZE]; + PKMX_WCHAR newp = nullptr; + + // KmnCompilerMessages::ERROR_InvalidToken + fileKeyboard.version = VERSION_70; + u16cpy(str, u"nmo"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // context, KmnCompilerMessages::ERROR_AnyInVirtualKeySection *** TODO *** + +} + // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) // KMX_DWORD process_platform(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) // KMX_DWORD process_if_synonym(KMX_DWORD dwSystemID, PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From ef4a14bd488fa7bb649396d0ef7dee51c0e89833 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 10:53:09 +0100 Subject: [PATCH 023/119] chore(developer): add ten test cases for notany() to GetXStringImpl_type_n test --- .../kmcmplib/tests/gtest-compiler-test.cpp | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 5d3f552565c..389c3656cdf 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1328,14 +1328,73 @@ TEST_F(CompilerTest, GetXStringImpl_type_n_test) { KMX_WCHAR str[LINESIZE]; KMX_WCHAR output[GLOBAL_BUFSIZE]; PKMX_WCHAR newp = nullptr; + PFILE_STORE file_store = new FILE_STORE[100]; + fileKeyboard.cxStoreArray = 3u; + fileKeyboard.dpStoreArray = file_store; + u16cpy(file_store[0].szName, u"a"); + u16cpy(file_store[1].szName, u"b"); + u16cpy(file_store[2].szName, u"c"); // KmnCompilerMessages::ERROR_InvalidToken fileKeyboard.version = VERSION_70; u16cpy(str, u"nmo"); EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // context, KmnCompilerMessages::ERROR_AnyInVirtualKeySection *** TODO *** + // notany, KmnCompilerMessages::ERROR_60FeatureOnly_Contextn + fileKeyboard.version = VERSION_60; + u16cpy(str, u"notany"); + EXPECT_EQ(KmnCompilerMessages::ERROR_70FeatureOnly, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // notany, KmnCompilerMessages::ERROR_AnyInVirtualKeySection *** TODO *** + + // notany, no close delimiter => NULL + fileKeyboard.version = VERSION_70; + u16cpy(str, u"notany("); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidAny, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // notany, empty delimiters => empty string + fileKeyboard.version = VERSION_70; + u16cpy(str, u"notany()"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidAny, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // notany, space in delimiters (see I11814, I11937, #11910, #11894, #11938) + fileKeyboard.version = VERSION_70; + u16cpy(str, u"notany( )"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidAny, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // KmnCompilerMessages::ERROR_StoreDoesNotExist + fileKeyboard.version = VERSION_70; + u16cpy(str, u"notany(d)"); + EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // KmnCompilerMessages::ERROR_StoreDoesNotExist, space before store + fileKeyboard.version = VERSION_70; + u16cpy(str, u"notany( d)"); + EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // KmnCompilerMessages::ERROR_StoreDoesNotExist, space after store + fileKeyboard.version = VERSION_70; + u16cpy(str, u"notany(d )"); + EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // valid + u16cpy(str, u"notany(b)"); + file_store[1].dpString = (PKMX_WCHAR)u"abc"; + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_notany_valid[] = { UC_SENTINEL, CODE_NOTANY, 2, 0 }; + EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); + + // space before store, valid + u16cpy(str, u"notany( b)"); + file_store[1].dpString = (PKMX_WCHAR)u"abc"; + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); + // space after store, valid (see I11937, #11938) + u16cpy(str, u"notany(b )"); + file_store[1].dpString = (PKMX_WCHAR)u"abc"; + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From 8c79a04fce15eac6afd9cd62b2308b751ef57091 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 10:59:36 +0100 Subject: [PATCH 024/119] chore(developer): add test case for notany() with empty store --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 389c3656cdf..838e9c7ff7d 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1379,20 +1379,26 @@ TEST_F(CompilerTest, GetXStringImpl_type_n_test) { // valid u16cpy(str, u"notany(b)"); - file_store[1].dpString = (PKMX_WCHAR)u"abc"; + file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_notany_valid[] = { UC_SENTINEL, CODE_NOTANY, 2, 0 }; EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); + // valid, empy store + u16cpy(str, u"notany(b)"); + file_store[1].dpString = (PKMX_WCHAR)u""; // empty + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); + // space before store, valid u16cpy(str, u"notany( b)"); - file_store[1].dpString = (PKMX_WCHAR)u"abc"; + file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); // space after store, valid (see I11937, #11938) u16cpy(str, u"notany(b )"); - file_store[1].dpString = (PKMX_WCHAR)u"abc"; + file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); } From 437420d534cd71d0b3649b389849ff473ef20ed8 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 11:18:54 +0100 Subject: [PATCH 025/119] chore(developer): add test case for nul to GetXStringImpl_type_n test --- .../kmcmplib/tests/gtest-compiler-test.cpp | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 838e9c7ff7d..117498c7f1a 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1362,45 +1362,51 @@ TEST_F(CompilerTest, GetXStringImpl_type_n_test) { u16cpy(str, u"notany( )"); EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidAny, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // KmnCompilerMessages::ERROR_StoreDoesNotExist + // notany, KmnCompilerMessages::ERROR_StoreDoesNotExist fileKeyboard.version = VERSION_70; u16cpy(str, u"notany(d)"); EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // KmnCompilerMessages::ERROR_StoreDoesNotExist, space before store + // notany, KmnCompilerMessages::ERROR_StoreDoesNotExist, space before store fileKeyboard.version = VERSION_70; u16cpy(str, u"notany( d)"); EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // KmnCompilerMessages::ERROR_StoreDoesNotExist, space after store + // notany, KmnCompilerMessages::ERROR_StoreDoesNotExist, space after store fileKeyboard.version = VERSION_70; u16cpy(str, u"notany(d )"); EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // valid + // notany, valid u16cpy(str, u"notany(b)"); file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_notany_valid[] = { UC_SENTINEL, CODE_NOTANY, 2, 0 }; EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); - // valid, empy store + // notany, valid, empy store u16cpy(str, u"notany(b)"); file_store[1].dpString = (PKMX_WCHAR)u""; // empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); - // space before store, valid + // notany, space before store, valid u16cpy(str, u"notany( b)"); file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); - // space after store, valid (see I11937, #11938) + // notany, space after store, valid (see I11937, #11938) u16cpy(str, u"notany(b )"); file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); + + // null + u16cpy(str, u"nul"); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_null_valid[] = { UC_SENTINEL, CODE_NUL, 0 }; + EXPECT_EQ(0, u16cmp(tstr_null_valid, tstr)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From 8522c57b6a6df389ef139110d3f1270b047f5f3e Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 11:24:19 +0100 Subject: [PATCH 026/119] chore(developer): add versions where omitted from some notany() test cases --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 117498c7f1a..67d75aa4509 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1378,6 +1378,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_n_test) { EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); // notany, valid + fileKeyboard.version = VERSION_70; u16cpy(str, u"notany(b)"); file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); @@ -1385,24 +1386,28 @@ TEST_F(CompilerTest, GetXStringImpl_type_n_test) { EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); // notany, valid, empy store + fileKeyboard.version = VERSION_70; u16cpy(str, u"notany(b)"); file_store[1].dpString = (PKMX_WCHAR)u""; // empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); // notany, space before store, valid + fileKeyboard.version = VERSION_70; u16cpy(str, u"notany( b)"); file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); // notany, space after store, valid (see I11937, #11938) + fileKeyboard.version = VERSION_70; u16cpy(str, u"notany(b )"); file_store[1].dpString = (PKMX_WCHAR)u"abc"; // non-empty EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_notany_valid, tstr)); // null + fileKeyboard.version = VERSION_70; u16cpy(str, u"nul"); EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_null_valid[] = { UC_SENTINEL, CODE_NUL, 0 }; From 8dd236c70c0486607aa05dddeb7e62bfbfa6bf64 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 12:12:05 +0100 Subject: [PATCH 027/119] chore(developer): add initial four test cases for unicode in GetXStringImpl_type_u test --- .../kmcmplib/tests/gtest-compiler-test.cpp | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 67d75aa4509..07e2c16b038 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1414,6 +1414,34 @@ TEST_F(CompilerTest, GetXStringImpl_type_n_test) { EXPECT_EQ(0, u16cmp(tstr_null_valid, tstr)); } + +// tests strings starting with 'u' +TEST_F(CompilerTest, GetXStringImpl_type_u_test) { + KMX_WCHAR tstr[128]; + fileKeyboard.version = VERSION_70; + KMX_WCHAR str[LINESIZE]; + KMX_WCHAR output[GLOBAL_BUFSIZE]; + PKMX_WCHAR newp = nullptr; + + // KmnCompilerMessages::ERROR_InvalidToken + u16cpy(str, u"uvw"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidToken, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // unicode, n1 and n2, valid + u16cpy(str, u"u+10330"); // Gothic A + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_unicode_valid[] = { 0xD800, 0xDF30, 0 }; // see UTF32ToUTF16 + EXPECT_EQ(0, u16cmp(tstr_unicode_valid, tstr)); + + // unicode, ERROR_InvalidValue + u16cpy(str, u"u+10330z"); // Gothic A, unexpected character 'z' + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidValue, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // unicode, space after, valid + u16cpy(str, u"u+10330 "); // Gothic A + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); +} + // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) // KMX_DWORD process_platform(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) // KMX_DWORD process_if_synonym(KMX_DWORD dwSystemID, PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From 3cd34e260f566baeb9d0eadd4482eb3350c974f7 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 12:27:46 +0100 Subject: [PATCH 028/119] chore(developer): add ERROR_InvalidCharacter and n1 only test cases to unicode in GetXStringImpl_type_u test --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 07e2c16b038..66c657e2c8e 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1440,6 +1440,17 @@ TEST_F(CompilerTest, GetXStringImpl_type_u_test) { // unicode, space after, valid u16cpy(str, u"u+10330 "); // Gothic A EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(0, u16cmp(tstr_unicode_valid, tstr)); + + // unicode, KmnCompilerMessages::ERROR_InvalidCharacter + u16cpy(str, u"u+110000"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCharacter, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // unicode, n1 only, valid + u16cpy(str, u"u+0061"); // a + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_unicode_n1_only_valid[] = { 0x0061, 0 }; // see UTF32ToUTF16 + EXPECT_EQ(0, u16cmp(tstr_unicode_n1_only_valid, tstr)); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From cb9b2c545b3f82472e3d7a034d73729f14e12355 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 14:37:41 +0100 Subject: [PATCH 029/119] chore(developer): manual merging of the two GetXStringImpl_type_c tests --- .../kmcmplib/tests/gtest-compiler-test.cpp | 168 ++++++++---------- 1 file changed, 79 insertions(+), 89 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 3d92ffc8172..08b772107d3 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1230,6 +1230,14 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { KMX_WCHAR str[LINESIZE]; KMX_WCHAR output[GLOBAL_BUFSIZE]; PKMX_WCHAR newp = nullptr; + PFILE_STORE file_store = new FILE_STORE[100]; + fileKeyboard.cxStoreArray = 3u; + fileKeyboard.dpStoreArray = file_store; + file_store[1].fIsCall = TRUE; + file_store[1].dwSystemID = TSS_NONE; + u16cpy(file_store[0].szName, u"a"); + u16cpy(file_store[1].szName, u"b"); + u16cpy(file_store[2].szName, u"c"); // are comments stripped before this point? // if so, why the test on whitespace after 'c'? @@ -1319,6 +1327,77 @@ TEST_F(CompilerTest, GetXStringImpl_type_c_test) { EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); const KMX_WCHAR tstr_clearcontext_valid[] = { UC_SENTINEL, CODE_CLEARCONTEXT, 0 }; EXPECT_EQ(0, u16cmp(tstr_clearcontext_valid, tstr)); + + // call, KmnCompilerMessages::ERROR_501FeatureOnly_Call + fileKeyboard.version = VERSION_50; + u16cpy(str, u"call"); + EXPECT_EQ(KmnCompilerMessages::ERROR_501FeatureOnly_Call, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, KmnCompilerMessages::ERROR_CallInVirtualKeySection *** TODO *** + + // call, no close delimiter => NULL + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call("); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, empty delimiters => empty string + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call()"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, space in delimiters (see I11814, I11937, #11910, #11894, #11938) + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call( )"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, KmnCompilerMessages::ERROR_StoreDoesNotExist + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call(d)"); + EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, KmnCompilerMessages::ERROR_StoreDoesNotExist, space before store + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call( d)"); + EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, KmnCompilerMessages::ERROR_StoreDoesNotExist, space after store + fileKeyboard.version = VERSION_501; + u16cpy(str, u"call(d )"); + EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, KmnCompilerMessages::ERROR_InvalidCall + fileKeyboard.version = VERSION_501; + file_store[1].dpString = (PKMX_WCHAR)u"*"; // cause IsValidCallStore() to fail + u16cpy(str, u"call(b)"); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + + // call, valid + fileKeyboard.version = VERSION_501; + file_store[1].dpString = (PKMX_WCHAR)u"a.dll:A"; + file_store[1].dwSystemID = TSS_NONE; + u16cpy(str, u"call(b)"); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + const KMX_WCHAR tstr_call_valid[] = { UC_SENTINEL, CODE_CALL, 2, 0 }; + EXPECT_EQ(0, u16cmp(tstr_call_valid, tstr)); + EXPECT_EQ(TSS_CALLDEFINITION, file_store[1].dwSystemID); + + // call, space before store, valid + fileKeyboard.version = VERSION_501; + file_store[1].dpString = (PKMX_WCHAR)u"a.dll:A"; + file_store[1].dwSystemID = TSS_NONE; + u16cpy(str, u"call( b)"); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(0, u16cmp(tstr_call_valid, tstr)); + EXPECT_EQ(TSS_CALLDEFINITION, file_store[1].dwSystemID); + + // call, space after store, valid (see I11937, #11938) + fileKeyboard.version = VERSION_501; + file_store[1].dpString = (PKMX_WCHAR)u"a.dll:A"; + file_store[1].dwSystemID = TSS_NONE; + u16cpy(str, u"call(b )"); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(0, u16cmp(tstr_call_valid, tstr)); + EXPECT_EQ(TSS_CALLDEFINITION, file_store[1].dwSystemID); } // tests strings starting with 'n' @@ -1414,7 +1493,6 @@ TEST_F(CompilerTest, GetXStringImpl_type_n_test) { EXPECT_EQ(0, u16cmp(tstr_null_valid, tstr)); } - // tests strings starting with 'u' TEST_F(CompilerTest, GetXStringImpl_type_u_test) { KMX_WCHAR tstr[128]; @@ -1453,94 +1531,6 @@ TEST_F(CompilerTest, GetXStringImpl_type_u_test) { EXPECT_EQ(0, u16cmp(tstr_unicode_n1_only_valid, tstr)); } -// tests strings starting with 'c' -TEST_F(CompilerTest, GetXStringImpl_type_c_test) { - KMX_WCHAR tstr[128]; - fileKeyboard.version = VERSION_60; - KMX_WCHAR str[LINESIZE]; - KMX_WCHAR output[GLOBAL_BUFSIZE]; - PKMX_WCHAR newp = nullptr; - PFILE_STORE file_store = new FILE_STORE[100]; - fileKeyboard.cxStoreArray = 3u; - fileKeyboard.dpStoreArray = file_store; - file_store[1].fIsCall = TRUE; - file_store[1].dwSystemID = TSS_NONE; - u16cpy(file_store[0].szName, u"a"); - u16cpy(file_store[1].szName, u"b"); - u16cpy(file_store[2].szName, u"c"); - - // call, KmnCompilerMessages::ERROR_501FeatureOnly_Call - fileKeyboard.version = VERSION_50; - u16cpy(str, u"call"); - EXPECT_EQ(KmnCompilerMessages::ERROR_501FeatureOnly_Call, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, KmnCompilerMessages::ERROR_CallInVirtualKeySection *** TODO *** - - // call, no close delimiter => NULL - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call("); - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, empty delimiters => empty string - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call()"); - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, space in delimiters (see I11814, I11937, #11910, #11894, #11938) - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call( )"); - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, KmnCompilerMessages::ERROR_StoreDoesNotExist - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call(d)"); - EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, KmnCompilerMessages::ERROR_StoreDoesNotExist, space before store - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call( d)"); - EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, KmnCompilerMessages::ERROR_StoreDoesNotExist, space after store - fileKeyboard.version = VERSION_501; - u16cpy(str, u"call(d )"); - EXPECT_EQ(KmnCompilerMessages::ERROR_StoreDoesNotExist, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, KmnCompilerMessages::ERROR_InvalidCall - fileKeyboard.version = VERSION_501; - file_store[1].dpString = (PKMX_WCHAR)u"*"; // cause IsValidCallStore() to fail - u16cpy(str, u"call(b)"); - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCall, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - - // call, valid - fileKeyboard.version = VERSION_501; - file_store[1].dpString = (PKMX_WCHAR)u"a.dll:A"; - file_store[1].dwSystemID = TSS_NONE; - u16cpy(str, u"call(b)"); - EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - const KMX_WCHAR tstr_call_valid[] = { UC_SENTINEL, CODE_CALL, 2, 0 }; - EXPECT_EQ(0, u16cmp(tstr_call_valid, tstr)); - EXPECT_EQ(TSS_CALLDEFINITION, file_store[1].dwSystemID); - - // call, space before store, valid - fileKeyboard.version = VERSION_501; - file_store[1].dpString = (PKMX_WCHAR)u"a.dll:A"; - file_store[1].dwSystemID = TSS_NONE; - u16cpy(str, u"call( b)"); - EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - EXPECT_EQ(0, u16cmp(tstr_call_valid, tstr)); - EXPECT_EQ(TSS_CALLDEFINITION, file_store[1].dwSystemID); - - // call, space after store, valid (see I11937, #11938) - fileKeyboard.version = VERSION_501; - file_store[1].dpString = (PKMX_WCHAR)u"a.dll:A"; - file_store[1].dwSystemID = TSS_NONE; - u16cpy(str, u"call(b )"); - EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - EXPECT_EQ(0, u16cmp(tstr_call_valid, tstr)); - EXPECT_EQ(TSS_CALLDEFINITION, file_store[1].dwSystemID); -} - // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) // KMX_DWORD process_platform(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) // KMX_DWORD process_if_synonym(KMX_DWORD dwSystemID, PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From b6282457cdef837f09bff68b27d8e5685e157a3c Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 14:55:42 +0100 Subject: [PATCH 030/119] chore(developer): unicode group checks in GetXStringImpl_type_u test --- .../kmcmplib/tests/gtest-compiler-test.cpp | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 08b772107d3..99f45550d37 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1507,28 +1507,38 @@ TEST_F(CompilerTest, GetXStringImpl_type_u_test) { // unicode, n1 and n2, valid u16cpy(str, u"u+10330"); // Gothic A - EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, TRUE)); const KMX_WCHAR tstr_unicode_valid[] = { 0xD800, 0xDF30, 0 }; // see UTF32ToUTF16 EXPECT_EQ(0, u16cmp(tstr_unicode_valid, tstr)); + EXPECT_EQ(0, msgproc_errors.size()); // unicode, ERROR_InvalidValue u16cpy(str, u"u+10330z"); // Gothic A, unexpected character 'z' - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidValue, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidValue, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, TRUE)); // unicode, space after, valid u16cpy(str, u"u+10330 "); // Gothic A - EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, TRUE)); EXPECT_EQ(0, u16cmp(tstr_unicode_valid, tstr)); + EXPECT_EQ(0, msgproc_errors.size()); // unicode, KmnCompilerMessages::ERROR_InvalidCharacter u16cpy(str, u"u+110000"); - EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCharacter, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidCharacter, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, TRUE)); // unicode, n1 only, valid u16cpy(str, u"u+0061"); // a - EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, TRUE)); const KMX_WCHAR tstr_unicode_n1_only_valid[] = { 0x0061, 0 }; // see UTF32ToUTF16 EXPECT_EQ(0, u16cmp(tstr_unicode_n1_only_valid, tstr)); + EXPECT_EQ(0, msgproc_errors.size()); + + // unicode, n1 and n2, valid, KmnCompilerMessages::WARN_UnicodeInANSIGroup + u16cpy(str, u"u+10330"); // Gothic A + EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); + EXPECT_EQ(0, u16cmp(tstr_unicode_valid, tstr)); + EXPECT_EQ(1, msgproc_errors.size()); + EXPECT_EQ(KmnCompilerMessages::WARN_UnicodeInANSIGroup, msgproc_errors[0].errorCode); } // KMX_DWORD process_baselayout(PFILE_KEYBOARD fk, PKMX_WCHAR q, PKMX_WCHAR tstr, int *mx) From 2bd2697868180ced008cb54ad616a42a60a190cd Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 26 Aug 2024 15:04:01 +0100 Subject: [PATCH 031/119] chore(developer): correct order of paramaters in EXPECT_EQ to expected, actual in ReportCompilerMessage test --- .../src/kmcmplib/tests/gtest-compiler-test.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index 99f45550d37..fb3560c4723 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -142,9 +142,9 @@ TEST_F(CompilerTest, ReportCompilerMessage_test) { EXPECT_EQ(SevFatal, KmnCompilerMessages::FATAL_CannotCreateTempfile & SevFatal); ReportCompilerMessage(KmnCompilerMessages::FATAL_CannotCreateTempfile, params); EXPECT_EQ(1, kmcmp::nErrors); - EXPECT_EQ(msgproc_errors[0].errorCode, KmnCompilerMessages::FATAL_CannotCreateTempfile); - EXPECT_EQ(msgproc_errors[0].lineNumber, kmcmp::currentLine+1); - EXPECT_EQ(msgproc_errors[0].columnNumber, kmcmp::ErrChr); + EXPECT_EQ(KmnCompilerMessages::FATAL_CannotCreateTempfile, msgproc_errors[0].errorCode); + EXPECT_EQ(kmcmp::currentLine+1, msgproc_errors[0].lineNumber); + EXPECT_EQ(kmcmp::ErrChr, msgproc_errors[0].columnNumber); EXPECT_TRUE(msgproc_errors[0].filename == kmcmp::messageFilename); EXPECT_TRUE(msgproc_errors[0].parameters == params); @@ -152,25 +152,25 @@ TEST_F(CompilerTest, ReportCompilerMessage_test) { EXPECT_EQ(SevError, KmnCompilerMessages::ERROR_InvalidLayoutLine & SevError); ReportCompilerMessage(KmnCompilerMessages::ERROR_InvalidLayoutLine); EXPECT_EQ(2, kmcmp::nErrors); - EXPECT_EQ(msgproc_errors[1].errorCode, KmnCompilerMessages::ERROR_InvalidLayoutLine); + EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidLayoutLine, msgproc_errors[1].errorCode); // SevWarn EXPECT_EQ(SevWarn, KmnCompilerMessages::WARN_ReservedCharacter & SevWarn); ReportCompilerMessage(KmnCompilerMessages::WARN_ReservedCharacter); EXPECT_EQ(2, kmcmp::nErrors); - EXPECT_EQ(msgproc_errors[2].errorCode, KmnCompilerMessages::WARN_ReservedCharacter); + EXPECT_EQ(KmnCompilerMessages::WARN_ReservedCharacter, msgproc_errors[2].errorCode); // SevHint EXPECT_EQ(SevHint, KmnCompilerMessages::HINT_NonUnicodeFile & SevHint); ReportCompilerMessage(KmnCompilerMessages::HINT_NonUnicodeFile); EXPECT_EQ(2, kmcmp::nErrors); - EXPECT_EQ(msgproc_errors[3].errorCode, KmnCompilerMessages::HINT_NonUnicodeFile); + EXPECT_EQ(KmnCompilerMessages::HINT_NonUnicodeFile, msgproc_errors[3].errorCode); // SevInfo EXPECT_EQ(SevInfo, KmnCompilerMessages::INFO_MinimumCoreEngineVersion & SevInfo); ReportCompilerMessage(KmnCompilerMessages::INFO_MinimumCoreEngineVersion); EXPECT_EQ(2, kmcmp::nErrors); - EXPECT_EQ(msgproc_errors[4].errorCode, KmnCompilerMessages::INFO_MinimumCoreEngineVersion); + EXPECT_EQ(KmnCompilerMessages::INFO_MinimumCoreEngineVersion, msgproc_errors[4].errorCode); }; TEST_F(CompilerTest, ProcessBeginLine_test) { From 3ed83f8e3328a8514f0298ff9d098b32d6a44838 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Thu, 29 Aug 2024 19:24:33 +0100 Subject: [PATCH 032/119] chore(developer): clarify some comments in index() section of GetXStringImpl_type_i test --- developer/src/kmcmplib/tests/gtest-compiler-test.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp index fb3560c4723..ac89be13705 100644 --- a/developer/src/kmcmplib/tests/gtest-compiler-test.cpp +++ b/developer/src/kmcmplib/tests/gtest-compiler-test.cpp @@ -1118,7 +1118,7 @@ TEST_F(CompilerTest, GetXStringImpl_type_i_test) { EXPECT_EQ(STATUS_Success, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); EXPECT_EQ(0, u16cmp(tstr_index_valid, tstr)); - // index, two-digit parameter, valid + // index, two-digit offet, valid u16cpy(str, u"index(b,42)"); fileKeyboard.cxStoreArray = 3u; fileKeyboard.dpStoreArray = file_store; @@ -1126,25 +1126,25 @@ TEST_F(CompilerTest, GetXStringImpl_type_i_test) { const KMX_WCHAR tstr_index_two_digit_valid[] = { UC_SENTINEL, CODE_INDEX, 2, 42, 0 }; EXPECT_EQ(0, u16cmp(tstr_index_two_digit_valid, tstr)); - // index, comma, non-digit parameter, KmnCompilerMessages::ERROR_InvalidIndex + // index, comma, non-digit offet, KmnCompilerMessages::ERROR_InvalidIndex u16cpy(str, u"index(b,g)"); fileKeyboard.cxStoreArray = 3u; fileKeyboard.dpStoreArray = file_store; EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidIndex, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // index, comma, no parameter, KmnCompilerMessages::ERROR_InvalidIndex + // index, comma, no offet, KmnCompilerMessages::ERROR_InvalidIndex u16cpy(str, u"index(b,)"); fileKeyboard.cxStoreArray = 3u; fileKeyboard.dpStoreArray = file_store; EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidIndex, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // index, space and comma, no parameter, KmnCompilerMessages::ERROR_InvalidIndex + // index, space and comma, no offet, KmnCompilerMessages::ERROR_InvalidIndex u16cpy(str, u"index(b ,)"); fileKeyboard.cxStoreArray = 3u; fileKeyboard.dpStoreArray = file_store; EXPECT_EQ(KmnCompilerMessages::ERROR_InvalidIndex, GetXStringImpl(tstr, &fileKeyboard, str, u"", output, 80, 0, &newp, FALSE)); - // index, comma, no parameter but space, KmnCompilerMessages::ERROR_InvalidIndex + // index, comma, no offet but space, KmnCompilerMessages::ERROR_InvalidIndex u16cpy(str, u"index(b, )"); fileKeyboard.cxStoreArray = 3u; fileKeyboard.dpStoreArray = file_store; From 18e7a1e363a0fe6692a6e9880f4ee11ce05b168f Mon Sep 17 00:00:00 2001 From: Shawn Schantz Date: Tue, 3 Sep 2024 20:24:08 +0700 Subject: [PATCH 033/119] change(mac): remove Always show OSK option add simple flag to indicate whether OSK is shown --- .../Base.lproj/preferences.xib | 34 ++++++------------- .../KMConfigurationWindowController.m | 7 ---- .../Keyman4MacIM/KMInputController.m | 3 +- .../Keyman4MacIM/KMInputMethodAppDelegate.h | 1 - .../Keyman4MacIM/KMInputMethodAppDelegate.m | 23 +++++-------- .../Keyman4MacIM/KMSettingsRepository.h | 4 +-- .../Keyman4MacIM/KMSettingsRepository.m | 15 +++++--- 7 files changed, 34 insertions(+), 53 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib index c327ce4ad27..d5afcd00d5e 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib @@ -1,15 +1,14 @@ - + - - + + - @@ -79,7 +78,7 @@ - + - - - + - + YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMSAAGGoF8QD05T diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/KMConfigurationWindowController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/KMConfigurationWindowController.m index c99d6326657..f3a0c3501e5 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/KMConfigurationWindowController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/KMConfigurationWindowController.m @@ -14,7 +14,6 @@ @interface KMConfigurationWindowController () @property (nonatomic, weak) IBOutlet NSTableView *tableView; @property (nonatomic, weak) IBOutlet WebView *webView; -@property (nonatomic, weak) IBOutlet NSButton *alwaysShowOSKCheckBox; @property (nonatomic, weak) IBOutlet NSButton *useVerboseLoggingCheckBox; @property (nonatomic, weak) IBOutlet NSTextField *verboseLoggingInfo; @property (nonatomic, weak) IBOutlet NSButton *supportBack; @@ -70,7 +69,6 @@ - (void)windowDidLoad { NSURL *homeUrl = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html" subdirectory:@"Help"]; [self.webView.mainFrame loadRequest:[NSURLRequest requestWithURL:homeUrl]]; - [self.alwaysShowOSKCheckBox setState:(self.AppDelegate.alwaysShowOSK ? NSOnState : NSOffState)]; [self.useVerboseLoggingCheckBox setState:(self.AppDelegate.useVerboseLogging ? NSOnState : NSOffState)]; } @@ -439,11 +437,6 @@ - (IBAction)downloadAction:(id)sender { [self.AppDelegate.downloadKBWindow.window makeKeyAndOrderFront:nil]; } -- (IBAction)alwaysShowOSKCheckBoxAction:(id)sender { - NSButton *checkBox = (NSButton *)sender; - [self.AppDelegate setAlwaysShowOSK:(checkBox.state == NSOnState)]; -} - - (IBAction)useVerboseLoggingCheckBoxAction:(id)sender { NSButton *checkBox = (NSButton *)sender; BOOL verboseLoggingOn = checkBox.state == NSOnState; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m index f832abf27fd..2132a0da897 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m @@ -10,6 +10,7 @@ #import "KMInputMethodEventHandler.h" #import "KMOSVersion.h" #include /* For kVK_ constants. */ +#import "KMSettingsRepository.h" #import "KMLogs.h" @implementation KMInputController @@ -29,7 +30,7 @@ - (id)initWithServer:(IMKServer *)server delegate:(id)delegate client:(id)inputC if (self) { servers = [[NSMutableArray alloc] initWithCapacity:2]; self.AppDelegate.inputController = self; - if (self.AppDelegate.kvk != nil && self.AppDelegate.alwaysShowOSK) { + if ((self.AppDelegate.kvk != nil) && ([KMSettingsRepository.shared readShowOsk])) { [self.AppDelegate showOSK]; } } diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h index ce70724c3a5..ec07f142cb6 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h @@ -90,7 +90,6 @@ static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX = 0; @property (nonatomic, strong) NSString *downloadFilename; @property (nonatomic, strong) NSMutableData *receivedData; @property (nonatomic, assign) NSUInteger expectedBytes; -@property (nonatomic, assign) BOOL alwaysShowOSK; @property (nonatomic, assign) BOOL useVerboseLogging; @property (nonatomic, assign) BOOL useNullChar; @property (nonatomic, assign) BOOL debugMode; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index 78c6362de93..a064ab06cb8 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -58,7 +58,6 @@ @implementation KMInputMethodAppDelegate @synthesize selectedKeyboard = _selectedKeyboard; @synthesize activeKeyboards = _activeKeyboards; @synthesize contextBuffer = _contextBuffer; -@synthesize alwaysShowOSK = _alwaysShowOSK; id _lastServerWithOSKShowing = nil; @@ -245,7 +244,7 @@ -(void) wakeUpWith:(id)newServer { CGEventTapEnable(self.lowLevelEventTap, YES); } // See note in sleepFollowingDeactivationOfServer. - if (_kvk != nil && (_alwaysShowOSK || _lastServerWithOSKShowing == newServer)) { + if (_kvk != nil && (_lastServerWithOSKShowing == newServer) && (self.showOskOnActivation)) { [self showOSK]; } @@ -433,11 +432,6 @@ - (NSString *)oskWindowTitle { return [NSString stringWithFormat:@"%@ - Keyman", _keyboardName]; } -- (void)setAlwaysShowOSK:(BOOL)alwaysShowOSK { - _alwaysShowOSK = alwaysShowOSK; - [[KMSettingsRepository shared] writeAlwaysShowOsk:alwaysShowOSK]; -} - - (void)setUseVerboseLogging:(BOOL)useVerboseLogging { os_log_debug([KMLogs configLog], "Turning verbose logging %{public}@", useVerboseLogging ? @"on." : @"off."); _debugMode = useVerboseLogging; @@ -447,11 +441,6 @@ - (void)setUseVerboseLogging:(BOOL)useVerboseLogging { [[KMSettingsRepository shared] writeUseVerboseLogging:useVerboseLogging]; } -- (BOOL)alwaysShowOSK { - _alwaysShowOSK = [[KMSettingsRepository shared] readAlwaysShowOsk]; - return _alwaysShowOSK; -} - - (BOOL)useVerboseLogging { return [[KMSettingsRepository shared] readUseVerboseLogging]; } @@ -887,8 +876,6 @@ - (void)selectKeyboardFromMenu:(NSInteger)tag { [self setContextBuffer:nil]; [self setSelectedKeyboard:path]; [self applyPersistedOptions]; - if (kvk != nil && self.alwaysShowOSK) - [self showOSK]; } - (NSArray *)getKmxFilesInKeyboardsDirectory { @@ -955,6 +942,14 @@ - (void)registerConfigurationWindow:(NSWindowController *)window { _configWindow = window; } +- (BOOL)showOskOnActivation { + return [KMSettingsRepository.shared readShowOsk]; +} + +- (void)saveShowOskOnActivation: showOsk { + [KMSettingsRepository.shared writeShowOsk:showOsk]; +} + - (void)showOSK { [[self.oskWindow window] makeKeyAndOrderFront:nil]; [[self.oskWindow window] setLevel:NSStatusWindowLevel]; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h index 8d7b114f2b9..0b6fe3afc5a 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h @@ -24,8 +24,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)clearActiveKeyboards; - (NSDictionary *)readOptionsForSelectedKeyboard; - (void)writeOptionForSelectedKeyboard:(NSString *)key withValue:(NSString*)value; -- (BOOL)readAlwaysShowOsk; -- (void)writeAlwaysShowOsk:(BOOL)alwaysShowOsk; +- (BOOL)readShowOsk; +- (void)writeShowOsk:(BOOL)show; - (BOOL)readUseVerboseLogging; - (void)writeUseVerboseLogging:(BOOL)verboseLogging; @end diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m index bbd87a40ec6..f01aed4baff 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m @@ -14,7 +14,7 @@ NSString *const kActiveKeyboardsKey = @"KMActiveKeyboardsKey"; NSString *const kSelectedKeyboardKey = @"KMSelectedKeyboardKey"; NSString *const kPersistedOptionsKey = @"KMPersistedOptionsKey"; -NSString *const kAlwaysShowOSKKey = @"KMAlwaysShowOSKKey"; +NSString *const kShowOsk = @"KMShowOsk"; NSString *const kUseVerboseLogging = @"KMUseVerboseLogging"; /** @@ -25,6 +25,11 @@ * represents what it is saving. */ NSString *const kKMDeprecatedPersistedOptionsKey = @"KMSavedStoresKey"; +/** + * The following constant "KMAlwaysShowOSKKey" is left here for documentation + * but the related UI has been removed according to issue #12342 + */ +NSString *const kAlwaysShowOSKKey = @"KMAlwaysShowOSKKey"; NSString *const kObsoletePathComponent = @"/Documents/Keyman-Keyboards"; NSString *const kNewPathComponent = @"/Library/Application Support/keyman.inputmethod.Keyman/"; @@ -306,14 +311,14 @@ - (void)convertOptionsPathsForMigration { } } -- (BOOL)readAlwaysShowOsk { +- (BOOL)readShowOsk { NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; - return [userData boolForKey:kAlwaysShowOSKKey]; + return [userData boolForKey:kShowOsk]; } -- (void)writeAlwaysShowOsk:(BOOL)alwaysShowOsk { +- (void)writeShowOsk:(BOOL)show { NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; - [userData setBool:alwaysShowOsk forKey:kAlwaysShowOSKKey]; + [userData setBool:show forKey:kShowOsk]; } - (BOOL)readUseVerboseLogging { From a032f802309406eb0166d0bdb61340fefacec34b Mon Sep 17 00:00:00 2001 From: sgschantz Date: Wed, 4 Sep 2024 16:04:59 +0700 Subject: [PATCH 034/119] change(mac): read and write new osk window state persists state whenever user opens or closes OSK also records location and size Fixes: #12342 --- mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m | 9 +++++++-- .../Keyman4MacIM/KMInputMethodAppDelegate.m | 8 ++++++-- mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h | 4 ++-- mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m | 10 +++++----- .../OnScreenKeyboard/OSKWindowController.h | 2 +- .../OnScreenKeyboard/OSKWindowController.m | 10 ++++++++-- .../OnScreenKeyboard/OSKWindowController.xib | 4 ++-- 7 files changed, 31 insertions(+), 16 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m index 2132a0da897..07bbd6691a6 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m @@ -30,7 +30,8 @@ - (id)initWithServer:(IMKServer *)server delegate:(id)delegate client:(id)inputC if (self) { servers = [[NSMutableArray alloc] initWithCapacity:2]; self.AppDelegate.inputController = self; - if ((self.AppDelegate.kvk != nil) && ([KMSettingsRepository.shared readShowOsk])) { + if ((self.AppDelegate.kvk != nil) && ([KMSettingsRepository.shared readShowOskOnActivate])) { + os_log_debug([KMLogs oskLog], "initWithServer, readShowOskOnActivate= YES, showing OSK"); [self.AppDelegate showOSK]; } } @@ -66,7 +67,8 @@ - (void)activateServer:(id)sender { [self.AppDelegate wakeUpWith:sender]; [servers addObject:sender]; - + os_log_debug([KMLogs lifecycleLog], "activateServer, adding sender to servers array, sender: %{public}@", sender); + if (_eventHandler != nil) { [_eventHandler deactivate]; } @@ -87,6 +89,7 @@ - (void)deactivateServer:(id)sender { @synchronized(servers) { for (int i = 0; i < servers.count; i++) { if (servers[i] == sender) { + os_log_debug([KMLogs lifecycleLog], "deactivateServer, removing sender from servers array, sender: %{public}@", sender); [servers removeObjectAtIndex:i]; break; } @@ -166,6 +169,8 @@ - (void)menuAction:(id)sender { [self showConfigurationWindow:sender]; } else if (itag == OSK_MENUITEM_TAG) { + [KMSettingsRepository.shared writeShowOskOnActivate:YES]; + os_log_debug([KMLogs oskLog], "menuAction OSK_MENUITEM_TAG, updating settings writeShowOsk to YES"); [self.AppDelegate showOSK]; } else if (itag == ABOUT_MENUITEM_TAG) { diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index a064ab06cb8..6a36a1da092 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -244,7 +244,9 @@ -(void) wakeUpWith:(id)newServer { CGEventTapEnable(self.lowLevelEventTap, YES); } // See note in sleepFollowingDeactivationOfServer. - if (_kvk != nil && (_lastServerWithOSKShowing == newServer) && (self.showOskOnActivation)) { + if (_kvk != nil && (_lastServerWithOSKShowing == newServer) && + ([KMSettingsRepository.shared readShowOskOnActivate])) { + os_log_debug([KMLogs oskLog], "wakeUpWith, readShowOskOnActivate= YES, showing OSK"); [self showOSK]; } @@ -942,13 +944,15 @@ - (void)registerConfigurationWindow:(NSWindowController *)window { _configWindow = window; } +/* - (BOOL)showOskOnActivation { return [KMSettingsRepository.shared readShowOsk]; } -- (void)saveShowOskOnActivation: showOsk { +- (void)saveShowOskOnActivation: (BOOL)showOsk { [KMSettingsRepository.shared writeShowOsk:showOsk]; } +*/ - (void)showOSK { [[self.oskWindow window] makeKeyAndOrderFront:nil]; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h index 0b6fe3afc5a..7fdf3de0346 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h @@ -24,8 +24,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)clearActiveKeyboards; - (NSDictionary *)readOptionsForSelectedKeyboard; - (void)writeOptionForSelectedKeyboard:(NSString *)key withValue:(NSString*)value; -- (BOOL)readShowOsk; -- (void)writeShowOsk:(BOOL)show; +- (BOOL)readShowOskOnActivate; +- (void)writeShowOskOnActivate:(BOOL)show; - (BOOL)readUseVerboseLogging; - (void)writeUseVerboseLogging:(BOOL)verboseLogging; @end diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m index f01aed4baff..db59929eaec 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m @@ -14,7 +14,7 @@ NSString *const kActiveKeyboardsKey = @"KMActiveKeyboardsKey"; NSString *const kSelectedKeyboardKey = @"KMSelectedKeyboardKey"; NSString *const kPersistedOptionsKey = @"KMPersistedOptionsKey"; -NSString *const kShowOsk = @"KMShowOsk"; +NSString *const kShowOskOnActivate = @"KMShowOskOnActivate"; NSString *const kUseVerboseLogging = @"KMUseVerboseLogging"; /** @@ -311,14 +311,14 @@ - (void)convertOptionsPathsForMigration { } } -- (BOOL)readShowOsk { +- (BOOL)readShowOskOnActivate { NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; - return [userData boolForKey:kShowOsk]; + return [userData boolForKey:kShowOskOnActivate]; } -- (void)writeShowOsk:(BOOL)show { +- (void)writeShowOskOnActivate:(BOOL)show { NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; - [userData setBool:show forKey:kShowOsk]; + [userData setBool:show forKey:kShowOskOnActivate]; } - (BOOL)readUseVerboseLogging { diff --git a/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.h b/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.h index 4b98f633b85..fd3a953a858 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.h @@ -9,7 +9,7 @@ #import #import -@interface OSKWindowController : NSWindowController +@interface OSKWindowController : NSWindowController @property (nonatomic, weak) IBOutlet OSKView *oskView; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.m b/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.m index 30d30004c45..3dad2baf63d 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.m @@ -8,6 +8,7 @@ #import "OSKWindowController.h" #import "KMInputMethodAppDelegate.h" +#import "KMSettingsRepository.h" #import "KMLogs.h" @interface OSKWindowController () @@ -25,7 +26,7 @@ - (KMInputMethodAppDelegate *)AppDelegate { } - (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; + //[[NSNotificationCenter defaultCenter] removeObserver:self]; [self stopTimer]; } @@ -55,7 +56,7 @@ - (void)awakeFromNib { - (void)windowDidLoad { os_log_debug([KMLogs oskLog], "OSKWindowController windowDidLoad"); [super windowDidLoad]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:self.window]; + //[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:self.window]; [self.oskView setKvk:[self.AppDelegate kvk]]; [self startTimerWithTimeInterval:0.1]; // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. @@ -66,6 +67,11 @@ - (void)windowDidResize:(NSNotification *)notification { [self.oskView resizeOSKLayout]; } +- (void)windowWillClose:(NSNotification *)notification { + [KMSettingsRepository.shared writeShowOskOnActivate:NO]; + os_log_debug([KMLogs oskLog], "OSKWindowController windowWillClose, updating settings writeShowOsk to NO"); +} + - (void)helpAction:(id)sender { NSString *kvkPath = [self AppDelegate].kvk.filePath; if (!kvkPath) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.xib b/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.xib index 753a59365a9..b753e438028 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.xib +++ b/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.xib @@ -2,7 +2,7 @@ - + @@ -14,7 +14,7 @@ - + From 78fd4ee19b12f3329f0f5dffae08ae6209ca5ed8 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Fri, 6 Sep 2024 16:41:07 +0700 Subject: [PATCH 035/119] change(mac): renaming, use client map instead of servers array --- .../Keyman4MacIM/KMInputController.m | 141 ++++++++---------- .../Keyman4MacIM/KMInputMethodAppDelegate.h | 2 +- .../Keyman4MacIM/KMInputMethodAppDelegate.m | 5 +- 3 files changed, 63 insertions(+), 85 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m index 07bbd6691a6..252dcab21fa 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m @@ -12,27 +12,32 @@ #include /* For kVK_ constants. */ #import "KMSettingsRepository.h" #import "KMLogs.h" +#import "InputMethodKit/InputMethodKit.h" + @implementation KMInputController +const double inactivityTimeout = 0.7; KMInputMethodEventHandler* _eventHandler; -NSMutableArray *servers; +NSMutableDictionary *textInputClients; -- (KMInputMethodAppDelegate *)AppDelegate { +- (KMInputMethodAppDelegate *)appDelegate { return (KMInputMethodAppDelegate *)[NSApp delegate]; } - (id)initWithServer:(IMKServer *)server delegate:(id)delegate client:(id)inputClient { - os_log_debug([KMLogs lifecycleLog], "Initializing Keyman Input Method for server with bundleID: %{public}@", server.bundle.bundleIdentifier); - + NSRunningApplication *currApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; + NSString *clientAppId = [currApp bundleIdentifier]; + os_log_debug([KMLogs lifecycleLog], "initWithServer, active app: '%{public}@'", clientAppId); + self = [super initWithServer:server delegate:delegate client:inputClient]; if (self) { - servers = [[NSMutableArray alloc] initWithCapacity:2]; - self.AppDelegate.inputController = self; - if ((self.AppDelegate.kvk != nil) && ([KMSettingsRepository.shared readShowOskOnActivate])) { - os_log_debug([KMLogs oskLog], "initWithServer, readShowOskOnActivate= YES, showing OSK"); - [self.AppDelegate showOSK]; + textInputClients = [[NSMutableDictionary alloc] initWithCapacity:2]; + self.appDelegate.inputController = self; + if ((self.appDelegate.kvk != nil) && ([KMSettingsRepository.shared readShowOskOnActivate])) { + os_log_debug([KMLogs oskLog], " initWithServer, readShowOskOnActivate= YES, showing OSK"); + [self.appDelegate showOSK]; } } @@ -62,103 +67,75 @@ - (void)handleBackspace:(NSEvent *)event { } - (void)activateServer:(id)sender { - @synchronized(servers) { + @synchronized(textInputClients) { + os_log_debug([KMLogs lifecycleLog], "KMInputController activateServer, sender %{public}@", sender); [sender overrideKeyboardWithKeyboardNamed:@"com.apple.keylayout.US"]; - - [self.AppDelegate wakeUpWith:sender]; - [servers addObject:sender]; - os_log_debug([KMLogs lifecycleLog], "activateServer, adding sender to servers array, sender: %{public}@", sender); + NSRunningApplication *currentApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; + NSString *clientAppId = [currentApp bundleIdentifier]; + NSUInteger key = ((NSObject*)sender).hash; + NSString *keyString = [@(key) stringValue]; + //NSValue *key = [NSValue valueWithNonretainedObject:sender]; + os_log_debug([KMLogs lifecycleLog], " +++adding client application '%{public}@' to textInputClients map, derived key: %{public}@", clientAppId, keyString); + + [textInputClients setObject:clientAppId forKey:keyString]; + os_log_debug([KMLogs lifecycleLog], " textInputClients map: %{public}@", textInputClients.description); + + [self.appDelegate wakeUpWith:sender]; if (_eventHandler != nil) { [_eventHandler deactivate]; } - NSRunningApplication *currApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; - NSString *clientAppId = [currApp bundleIdentifier]; - os_log_debug([KMLogs lifecycleLog], "activateServer, new active app: '%{public}@'", clientAppId); - _eventHandler = [[KMInputMethodEventHandler alloc] initWithClient:clientAppId client:sender]; - } } - (void)deactivateServer:(id)sender { - if ([self.AppDelegate debugMode]) { - os_log_debug([KMLogs lifecycleLog], "deactivateServer, sender %{public}@", sender); - } - @synchronized(servers) { - for (int i = 0; i < servers.count; i++) { - if (servers[i] == sender) { - os_log_debug([KMLogs lifecycleLog], "deactivateServer, removing sender from servers array, sender: %{public}@", sender); - [servers removeObjectAtIndex:i]; - break; - } + os_log_debug([KMLogs lifecycleLog], "KMInputController deactivateServer, sender %{public}@", sender); + @synchronized(textInputClients) { + NSUInteger key = ((NSObject*)sender).hash; + NSString *keyString = [@(key) stringValue]; + //NSValue *key = [NSValue valueWithNonretainedObject:sender]; + NSString *clientAppId = [textInputClients objectForKey:keyString]; + + if (clientAppId) { + os_log_debug([KMLogs lifecycleLog], " ---removing client application '%{public}@' from textInputClients map, key: %{public}@", clientAppId, keyString); + [textInputClients removeObjectForKey:keyString]; + } else { + os_log_debug([KMLogs lifecycleLog], " key %{public}@ not found in textInputClients map", keyString); } - if (servers.count == 0) { - os_log_debug([KMLogs lifecycleLog], "No known active server for Keyman IM. Starting countdown to sleep..."); - [self performSelector:@selector(timerAction:) withObject:sender afterDelay:0.7]; + os_log_debug([KMLogs lifecycleLog], " textInputClients map: %{public}@", textInputClients.description); + if (textInputClients.count == 0) { + os_log_debug([KMLogs lifecycleLog], "no text input clients found in textInputClients map; delay for %f seconds and call sleepIfNoClients", inactivityTimeout); + [self performSelector:@selector(sleepIfNoClients:) withObject:sender afterDelay:inactivityTimeout]; } } } -- (void)timerAction:(id)lastServer { - @synchronized(servers) { - if (servers.count == 0) { +- (void)sleepIfNoClients:(id)lastClient { + @synchronized(textInputClients) { + if (textInputClients.count == 0) { + os_log_debug([KMLogs lifecycleLog], "sleepIfNoClients found no clients, time to sleep"); if (_eventHandler != nil) { [_eventHandler deactivate]; _eventHandler = nil; } - [self.AppDelegate sleepFollowingDeactivationOfServer:lastServer]; + [self.appDelegate sleepFollowingInactivityTimeout:lastClient]; + } else { + NSArray*keys=[textInputClients allKeys]; + NSObject *key = keys[0]; + NSString *clientAppId = [textInputClients objectForKey:key]; + os_log_debug([KMLogs lifecycleLog], "sleepIfNoClients found a newly activated client, clientAppId '%{public}@', key: %{public}@", clientAppId, key); } } } - -/* - - (NSDictionary *)modes:(id)sender { - if ([self.AppDelegate debugMode]) - os_log_debug([KMLogs lifecycleLog], "*** Modes ***"); - if (_kmModes == nil) { - NSDictionary *amhMode = [[NSDictionary alloc] initWithObjectsAndKeys:@"keyman.png", kTSInputModeAlternateMenuIconFileKey, - [NSNumber numberWithBool:YES], kTSInputModeDefaultStateKey, - [NSNumber numberWithBool:YES], kTSInputModeIsVisibleKey, - @"A", kTSInputModeKeyEquivalentKey, - [NSNumber numberWithInteger:4608], kTSInputModeKeyEquivalentModifiersKey, - [NSNumber numberWithBool:YES], kTSInputModeDefaultStateKey, - @"keyman.png", kTSInputModeMenuIconFileKey, - @"keyman.png", kTSInputModePaletteIconFileKey, - [NSNumber numberWithBool:YES], kTSInputModePrimaryInScriptKey, - @"smUnicodeScript", kTSInputModeScriptKey, - @"amh", @"TISIntendedLanguage", nil]; - - NSDictionary *hinMode = [[NSDictionary alloc] initWithObjectsAndKeys:@"keyman.png", kTSInputModeAlternateMenuIconFileKey, - [NSNumber numberWithBool:YES], kTSInputModeDefaultStateKey, - [NSNumber numberWithBool:YES], kTSInputModeIsVisibleKey, - @"H", kTSInputModeKeyEquivalentKey, - [NSNumber numberWithInteger:4608], kTSInputModeKeyEquivalentModifiersKey, - [NSNumber numberWithBool:YES], kTSInputModeDefaultStateKey, - @"keyman.png", kTSInputModeMenuIconFileKey, - @"keyman.png", kTSInputModePaletteIconFileKey, - [NSNumber numberWithBool:YES], kTSInputModePrimaryInScriptKey, - @"smUnicodeScript", kTSInputModeScriptKey, - @"hin", @"TISIntendedLanguage", nil]; - - NSDictionary *modeList = [[NSDictionary alloc] initWithObjectsAndKeys:amhMode, @"com.apple.inputmethod.amh", hinMode, @"com.apple.inputmethod.hin", nil]; - NSArray *modeOrder = [[NSArray alloc] initWithObjects:@"com.apple.inputmethod.amh", @"com.apple.inputmethod.hin", nil]; - _kmModes = [[NSDictionary alloc] initWithObjectsAndKeys:modeList, kTSInputModeListKey, - modeOrder, kTSVisibleInputModeOrderedArrayKey, nil]; - } - - return _kmModes; - } - */ - - (NSMenu *)menu { - return self.AppDelegate.menu; + return self.appDelegate.menu; } - (KMXFile *)kmx { - return self.AppDelegate.kmx; + return self.appDelegate.kmx; } - (void)menuAction:(id)sender { @@ -171,13 +148,13 @@ - (void)menuAction:(id)sender { else if (itag == OSK_MENUITEM_TAG) { [KMSettingsRepository.shared writeShowOskOnActivate:YES]; os_log_debug([KMLogs oskLog], "menuAction OSK_MENUITEM_TAG, updating settings writeShowOsk to YES"); - [self.AppDelegate showOSK]; + [self.appDelegate showOSK]; } else if (itag == ABOUT_MENUITEM_TAG) { - [self.AppDelegate showAboutWindow]; + [self.appDelegate showAboutWindow]; } else if (itag >= KEYMAN_FIRST_KEYBOARD_MENUITEM_TAG) { - [self.AppDelegate selectKeyboardFromMenu:itag]; + [self.appDelegate selectKeyboardFromMenu:itag]; } } @@ -189,7 +166,7 @@ - (void)showConfigurationWindow:(id)sender { if ([KMOSVersion Version_10_13_1] <= systemVersion && systemVersion <= [KMOSVersion Version_10_13_3]) // between 10.13.1 and 10.13.3 inclusive { os_log_info([KMLogs uiLog], "Input Menu: calling workaround instead of showPreferences (sys ver %x)", systemVersion); - [self.AppDelegate showConfigurationWindow]; // call our workaround + [self.appDelegate showConfigurationWindow]; // call our workaround } else { diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h index ec07f142cb6..aed9be9375e 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h @@ -101,7 +101,7 @@ static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX = 0; - (void)showOSK; - (void)showConfigurationWindow; - (void)selectKeyboardFromMenu:(NSInteger)tag; -- (void)sleepFollowingDeactivationOfServer:(id)lastServer; +- (void)sleepFollowingInactivityTimeout:(id)lastServer; - (void)wakeUpWith:(id)newServer; - (void)handleKeyEvent:(NSEvent *)event; - (BOOL)unzipFile:(NSString *)filePath; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index 6a36a1da092..ca3387a9ca6 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -221,7 +221,7 @@ + (KMInputMethodAppDelegate *)AppDelegate { return (KMInputMethodAppDelegate *)[NSApp delegate]; } --(void) sleepFollowingDeactivationOfServer:(id)lastServer { +-(void) sleepFollowingInactivityTimeout:(id)lastServer { os_log_debug([KMLogs lifecycleLog], "Keyman no longer active IM."); self.sleeping = YES; if ([self.oskWindow.window isVisible]) { @@ -238,12 +238,13 @@ -(void) sleepFollowingDeactivationOfServer:(id)lastServer { } -(void) wakeUpWith:(id)newServer { + os_log_debug([KMLogs oskLog], "wakeUpWith, newServer:%{public}@", newServer); self.sleeping = NO; if (self.lowLevelEventTap && !CGEventTapIsEnabled(self.lowLevelEventTap)) { os_log_debug([KMLogs lifecycleLog], "wakeUpWith, Keyman is now the active IM. Re-enabling event tap..."); CGEventTapEnable(self.lowLevelEventTap, YES); } - // See note in sleepFollowingDeactivationOfServer. + // See note in sleepFollowingInactivityTimeout. if (_kvk != nil && (_lastServerWithOSKShowing == newServer) && ([KMSettingsRepository.shared readShowOskOnActivate])) { os_log_debug([KMLogs oskLog], "wakeUpWith, readShowOskOnActivate= YES, showing OSK"); From b8cbf04ff7a030d4ca8c73af20854b2d6552578e Mon Sep 17 00:00:00 2001 From: sgschantz Date: Tue, 10 Sep 2024 16:06:33 +0700 Subject: [PATCH 036/119] change(mac): added KMInputMethodLifecycle clearly manages the state of the input method and notifies any observers of changes Fixes: #12342 --- .../Keyman4MacIM.xcodeproj/project.pbxproj | 6 + .../Keyman4MacIM/KMInputController.m | 88 ++---- .../Keyman4MacIM/KMInputMethodAppDelegate.h | 3 - .../Keyman4MacIM/KMInputMethodAppDelegate.m | 90 +++--- .../Keyman4MacIM/KMInputMethodLifecycle.h | 26 ++ .../Keyman4MacIM/KMInputMethodLifecycle.m | 262 ++++++++++++++++++ .../OnScreenKeyboard/OSKWindowController.m | 3 +- 7 files changed, 363 insertions(+), 115 deletions(-) create mode 100644 mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.h create mode 100644 mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m diff --git a/mac/Keyman4MacIM/Keyman4MacIM.xcodeproj/project.pbxproj b/mac/Keyman4MacIM/Keyman4MacIM.xcodeproj/project.pbxproj index 08e00b6c07a..57ce828e4a5 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM.xcodeproj/project.pbxproj +++ b/mac/Keyman4MacIM/Keyman4MacIM.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 293EA3E627140D8100545EED /* KMAboutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 293EA3E827140D8100545EED /* KMAboutWindowController.xib */; }; 293EA3EB27140DEC00545EED /* preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 293EA3ED27140DEC00545EED /* preferences.xib */; }; 293EA3F427181FDA00545EED /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 293EA3F627181FDA00545EED /* Localizable.strings */; }; + 296105232C8E91C7007BF6B7 /* KMInputMethodLifecycle.m in Sources */ = {isa = PBXBuildFile; fileRef = 296105222C8E91C7007BF6B7 /* KMInputMethodLifecycle.m */; }; 296FE2FC275DD21600F46898 /* KMPackageReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 296FE2FB275DD21600F46898 /* KMPackageReader.m */; }; 297A501728DF4D360074EB1B /* PrivacyWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 297A501228DF4D360074EB1B /* PrivacyWindowController.m */; }; 297A501828DF4D360074EB1B /* PrivacyWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 297A501328DF4D360074EB1B /* PrivacyWindowController.xib */; }; @@ -158,6 +159,8 @@ 293EA3EF27140DFA00545EED /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/preferences.strings; sourceTree = ""; }; 293EA3F02714158600545EED /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainMenu.strings; sourceTree = ""; }; 293EA3F527181FDA00545EED /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 296105212C8E91C7007BF6B7 /* KMInputMethodLifecycle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMInputMethodLifecycle.h; sourceTree = ""; }; + 296105222C8E91C7007BF6B7 /* KMInputMethodLifecycle.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMInputMethodLifecycle.m; sourceTree = ""; }; 296FE2FA275DD21600F46898 /* KMPackageReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMPackageReader.h; sourceTree = ""; }; 296FE2FB275DD21600F46898 /* KMPackageReader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMPackageReader.m; sourceTree = ""; }; 29781101297FB262007C886D /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/KMAboutWindowController.strings; sourceTree = ""; }; @@ -579,6 +582,8 @@ 98D6DA7D1A799FF400B09822 /* KMInputController.m */, 98A778C21A8C53BF00CF809D /* KMInputMethodAppDelegate.h */, 98A778C31A8C53BF00CF809D /* KMInputMethodAppDelegate.m */, + 296105212C8E91C7007BF6B7 /* KMInputMethodLifecycle.h */, + 296105222C8E91C7007BF6B7 /* KMInputMethodLifecycle.m */, E21799031FC5B74D00F2D66A /* KMInputMethodEventHandler.h */, E21799041FC5B7BC00F2D66A /* KMInputMethodEventHandler.m */, 298D09F62A1F4533006B9DFE /* TextApiCompliance.h */, @@ -993,6 +998,7 @@ 29B4A0D52BF7675A00682049 /* KMLogs.m in Sources */, 98BF924F1BF02DC20002126A /* KMBarView.m in Sources */, E240F599202DED740000067D /* KMPackage.m in Sources */, + 296105232C8E91C7007BF6B7 /* KMInputMethodLifecycle.m in Sources */, D861B03F2C5747F70003675E /* KMSettingsRepository.m in Sources */, 984B8F441AF1C3D900E096A8 /* OSKWindowController.m in Sources */, 9836B3711AE5F11D00780482 /* mztools.c in Sources */, diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m index 252dcab21fa..92495fd00ea 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m @@ -13,13 +13,12 @@ #import "KMSettingsRepository.h" #import "KMLogs.h" #import "InputMethodKit/InputMethodKit.h" +#import "KMInputMethodLifecycle.h" @implementation KMInputController -const double inactivityTimeout = 0.7; KMInputMethodEventHandler* _eventHandler; -NSMutableDictionary *textInputClients; - (KMInputMethodAppDelegate *)appDelegate { return (KMInputMethodAppDelegate *)[NSApp delegate]; @@ -33,14 +32,13 @@ - (id)initWithServer:(IMKServer *)server delegate:(id)delegate client:(id)inputC self = [super initWithServer:server delegate:delegate client:inputClient]; if (self) { - textInputClients = [[NSMutableDictionary alloc] initWithCapacity:2]; self.appDelegate.inputController = self; - if ((self.appDelegate.kvk != nil) && ([KMSettingsRepository.shared readShowOskOnActivate])) { - os_log_debug([KMLogs oskLog], " initWithServer, readShowOskOnActivate= YES, showing OSK"); - [self.appDelegate showOSK]; - } } + // register to receive notifications generated from KMInputMethodLifecycle + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodDeactivated:) name:kInputMethodDeactivatedNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodChangedClient:) name:kInputMethodClientChangeNotification object:nil]; + return self; } @@ -66,68 +64,32 @@ - (void)handleBackspace:(NSEvent *)event { } } -- (void)activateServer:(id)sender { - @synchronized(textInputClients) { - os_log_debug([KMLogs lifecycleLog], "KMInputController activateServer, sender %{public}@", sender); - [sender overrideKeyboardWithKeyboardNamed:@"com.apple.keylayout.US"]; - NSRunningApplication *currentApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; - NSString *clientAppId = [currentApp bundleIdentifier]; - NSUInteger key = ((NSObject*)sender).hash; - NSString *keyString = [@(key) stringValue]; - //NSValue *key = [NSValue valueWithNonretainedObject:sender]; - os_log_debug([KMLogs lifecycleLog], " +++adding client application '%{public}@' to textInputClients map, derived key: %{public}@", clientAppId, keyString); - - [textInputClients setObject:clientAppId forKey:keyString]; - os_log_debug([KMLogs lifecycleLog], " textInputClients map: %{public}@", textInputClients.description); - - [self.appDelegate wakeUpWith:sender]; - - if (_eventHandler != nil) { - [_eventHandler deactivate]; - } - - _eventHandler = [[KMInputMethodEventHandler alloc] initWithClient:clientAppId client:sender]; +- (void)inputMethodDeactivated:(NSNotification *)notification { + os_log_debug([KMLogs lifecycleLog], "***KMInputController inputMethodDeactivated, deactivating eventHandler"); + if (_eventHandler != nil) { + [_eventHandler deactivate]; } } -- (void)deactivateServer:(id)sender { - os_log_debug([KMLogs lifecycleLog], "KMInputController deactivateServer, sender %{public}@", sender); - @synchronized(textInputClients) { - NSUInteger key = ((NSObject*)sender).hash; - NSString *keyString = [@(key) stringValue]; - //NSValue *key = [NSValue valueWithNonretainedObject:sender]; - NSString *clientAppId = [textInputClients objectForKey:keyString]; - - if (clientAppId) { - os_log_debug([KMLogs lifecycleLog], " ---removing client application '%{public}@' from textInputClients map, key: %{public}@", clientAppId, keyString); - [textInputClients removeObjectForKey:keyString]; - } else { - os_log_debug([KMLogs lifecycleLog], " key %{public}@ not found in textInputClients map", keyString); - } - os_log_debug([KMLogs lifecycleLog], " textInputClients map: %{public}@", textInputClients.description); - if (textInputClients.count == 0) { - os_log_debug([KMLogs lifecycleLog], "no text input clients found in textInputClients map; delay for %f seconds and call sleepIfNoClients", inactivityTimeout); - [self performSelector:@selector(sleepIfNoClients:) withObject:sender afterDelay:inactivityTimeout]; - } +- (void)inputMethodChangedClient:(NSNotification *)notification { + os_log_debug([KMLogs lifecycleLog], "***KMInputController inputMethodChangedClient, deactivating old eventHandler and activating new one"); + if (_eventHandler != nil) { + [_eventHandler deactivate]; } + NSRunningApplication *currentApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; + NSString *clientAppId = [currentApp bundleIdentifier]; + // TODO: remove client argument + _eventHandler = [[KMInputMethodEventHandler alloc] initWithClient:clientAppId client:nil]; } -- (void)sleepIfNoClients:(id)lastClient { - @synchronized(textInputClients) { - if (textInputClients.count == 0) { - os_log_debug([KMLogs lifecycleLog], "sleepIfNoClients found no clients, time to sleep"); - if (_eventHandler != nil) { - [_eventHandler deactivate]; - _eventHandler = nil; - } - [self.appDelegate sleepFollowingInactivityTimeout:lastClient]; - } else { - NSArray*keys=[textInputClients allKeys]; - NSObject *key = keys[0]; - NSString *clientAppId = [textInputClients objectForKey:key]; - os_log_debug([KMLogs lifecycleLog], "sleepIfNoClients found a newly activated client, clientAppId '%{public}@', key: %{public}@", clientAppId, key); - } - } +- (void)activateServer:(id)sender { + [sender overrideKeyboardWithKeyboardNamed:@"com.apple.keylayout.US"]; + [KMInputMethodLifecycle.shared activateClient:sender]; +} + +- (void)deactivateServer:(id)sender { + [KMInputMethodLifecycle.shared deactivateClient:sender]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (NSMenu *)menu { diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h index aed9be9375e..7f6b2f3655b 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h @@ -73,7 +73,6 @@ static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX = 0; @property (nonatomic, assign) NSEventModifierFlags currentModifierFlags; @property (nonatomic, assign) CFMachPortRef lowLevelEventTap; @property (nonatomic, assign) CFRunLoopSourceRef runLoopEventSrc; -@property (nonatomic, assign) BOOL sleeping; @property (nonatomic, assign) BOOL contextChangedByLowLevelEvent; @property (nonatomic, strong) OSKWindowController *oskWindow; @property (nonatomic, strong) NSString *keyboardName; @@ -101,8 +100,6 @@ static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX = 0; - (void)showOSK; - (void)showConfigurationWindow; - (void)selectKeyboardFromMenu:(NSInteger)tag; -- (void)sleepFollowingInactivityTimeout:(id)lastServer; -- (void)wakeUpWith:(id)newServer; - (void)handleKeyEvent:(NSEvent *)event; - (BOOL)unzipFile:(NSString *)filePath; - (NSWindowController *)downloadKBWindow_; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index ca3387a9ca6..7392c3dc2ff 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -7,6 +7,7 @@ // #import "KMInputMethodAppDelegate.h" +#import "KMInputMethodLifecycle.h" #import "KMSettingsRepository.h" #import "KMDataRepository.h" #import "KMConfigurationWindowController.h" @@ -115,6 +116,45 @@ - (void)initCompletion { if (self.runLoopEventSrc && runLoop) { CFRunLoopAddSource(runLoop, self.runLoopEventSrc, kCFRunLoopDefaultMode); } + + // register to receive notifications generated from KMInputMethodLifecycle + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodActivated:) name:kInputMethodActivatedNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodDeactivated:) name:kInputMethodDeactivatedNotification object:nil]; + + // start Input Method lifecycle + [KMInputMethodLifecycle.shared startLifecycle]; +} + +/** + * When the input method is deactivated, hide the OSK and disable the low-level event tap + */ +- (void)inputMethodDeactivated:(NSNotification *)notification { + if ([self.oskWindow.window isVisible]) { + os_log_debug([KMLogs oskLog], "***KMInputMethodAppDelegate inputMethodDeactivated, hiding OSK"); + [self.oskWindow.window setIsVisible:NO]; + } else { + os_log_debug([KMLogs oskLog], "***KMInputMethodAppDelegate inputMethodDeactivated, OSK already hidden"); + } + + if (self.lowLevelEventTap) { + os_log_debug([KMLogs lifecycleLog], "***inputMethodDeactivated, disabling event tap"); + CGEventTapEnable(self.lowLevelEventTap, NO); + } +} + +/** + * When the input method is activated, show the OSK and enable the low-level event tap + */ +- (void)inputMethodActivated:(NSNotification *)notification { + if (self.lowLevelEventTap && !CGEventTapIsEnabled(self.lowLevelEventTap)) { + os_log_debug([KMLogs lifecycleLog], "***KMInputMethodAppDelegate inputMethodActivated, re-enabling event tap..."); + CGEventTapEnable(self.lowLevelEventTap, YES); + } + + if (_kvk != nil && ([KMInputMethodLifecycle.shared shouldShowOskOnActivate])) { + os_log_debug([KMLogs oskLog], "***KMInputMethodAppDelegate inputMethodActivated, showing OSK"); + [self showOSK]; + } } - (KeymanVersionInfo)versionInfo { @@ -221,46 +261,12 @@ + (KMInputMethodAppDelegate *)AppDelegate { return (KMInputMethodAppDelegate *)[NSApp delegate]; } --(void) sleepFollowingInactivityTimeout:(id)lastServer { - os_log_debug([KMLogs lifecycleLog], "Keyman no longer active IM."); - self.sleeping = YES; - if ([self.oskWindow.window isVisible]) { - os_log_debug([KMLogs oskLog], "sleepFollowingDeactivationOfServer, Hiding OSK."); - // Storing this ensures that if the deactivation is temporary, resulting from dropping down a menu, - // the OSK will re-display when that client application re-activates. - _lastServerWithOSKShowing = lastServer; - [self.oskWindow.window setIsVisible:NO]; - } - if (self.lowLevelEventTap) { - os_log_debug([KMLogs lifecycleLog], "sleepFollowingDeactivationOfServer, disabling event tap..."); - CGEventTapEnable(self.lowLevelEventTap, NO); - } -} - --(void) wakeUpWith:(id)newServer { - os_log_debug([KMLogs oskLog], "wakeUpWith, newServer:%{public}@", newServer); - self.sleeping = NO; - if (self.lowLevelEventTap && !CGEventTapIsEnabled(self.lowLevelEventTap)) { - os_log_debug([KMLogs lifecycleLog], "wakeUpWith, Keyman is now the active IM. Re-enabling event tap..."); - CGEventTapEnable(self.lowLevelEventTap, YES); - } - // See note in sleepFollowingInactivityTimeout. - if (_kvk != nil && (_lastServerWithOSKShowing == newServer) && - ([KMSettingsRepository.shared readShowOskOnActivate])) { - os_log_debug([KMLogs oskLog], "wakeUpWith, readShowOskOnActivate= YES, showing OSK"); - [self showOSK]; - } - - _lastServerWithOSKShowing = nil; -} - CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) { KMInputMethodAppDelegate *appDelegate = [KMInputMethodAppDelegate AppDelegate]; if (appDelegate != nil) { if (type == kCGEventTapDisabledByTimeout || type == kCGEventTapDisabledByUserInput) { - // kCGEventTapDisabledByUserInput most likely means we're "sleeping", in which case we want it to stay - // disabled until we get the wake-up call. - if (!appDelegate.sleeping) { + // kCGEventTapDisabledByUserInput most likely means we're "sleeping", in which case we want it to stay disabled until we get the wake-up call. + if ([KMInputMethodLifecycle.shared shouldEnableEventTap]) { // REVIEW: We might need to consider putting in some kind of counter/flag to ensure that the very next // event is not another disable so we don't end up in an endless cycle. os_log([KMLogs eventsLog], "Event tap disabled by %{public}@! Attempting to restart...", (type == kCGEventTapDisabledByTimeout ? @"timeout" : @"user")); @@ -703,7 +709,7 @@ - (void)prepareStorage { [KMDataRepository.shared createDataDirectoryIfNecessary]; if ([KMSettingsRepository.shared dataMigrationNeeded]) { - BOOL movedData = [KMDataRepository.shared migrateData]; + [KMDataRepository.shared migrateData]; [KMSettingsRepository.shared convertSettingsForMigration]; } @@ -945,16 +951,6 @@ - (void)registerConfigurationWindow:(NSWindowController *)window { _configWindow = window; } -/* -- (BOOL)showOskOnActivation { - return [KMSettingsRepository.shared readShowOsk]; -} - -- (void)saveShowOskOnActivation: (BOOL)showOsk { - [KMSettingsRepository.shared writeShowOsk:showOsk]; -} -*/ - - (void)showOSK { [[self.oskWindow window] makeKeyAndOrderFront:nil]; [[self.oskWindow window] setLevel:NSStatusWindowLevel]; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.h b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.h new file mode 100644 index 00000000000..c8a06ddba92 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.h @@ -0,0 +1,26 @@ +/* + * Keyman is copyright (C) SIL International. MIT License. + * + * Created by Shawn Schantz on 2024-09-09. + * + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +extern NSString *const kInputMethodActivatedNotification; +extern NSString *const kInputMethodDeactivatedNotification; +extern NSString *const kInputMethodClientChangeNotification; + +@interface KMInputMethodLifecycle : NSObject ++ (KMInputMethodLifecycle *)shared; +- (void)startLifecycle; +- (void)activateClient:(id)client; +- (void)deactivateClient:(id)client; +- (BOOL)shouldEnableEventTap; +- (BOOL)shouldShowOskOnActivate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m new file mode 100644 index 00000000000..3c07c6e2cd2 --- /dev/null +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m @@ -0,0 +1,262 @@ +/* + * Keyman is copyright (C) SIL International. MIT License. + * + * Created by Shawn Schantz on 2024-09-09. + * + * This class is responsible for determining the state of the Keyman input method. + * It is called from the KMInputController (a subclass of IMKInputController), and + * shares changes in the state of the input method by synchronously posting + * notifications to NSNotificationCenter. + */ + +/** + * This class is needed because there are no available APIs or notifications in macOS that + * an input method can use to determine whether it is currently active. An input method runs + * in the background as an application but only receives events from text input clients + * when it is the active input method. + * + * It is important for state of the input method to be known so that the On-screen keyboard can + * be appropriately shown or hidden and the low-level event tap can be stopped or started. + * + * The state of the input method is mostly determined by the calls that the OS makes to KMInputController. + * initWithServer is called when a new text input client is being used with Keyman + * activateServer is called to inform Keyman that the text input client is ready to send events + * deactivateServer is called when a client stops being used with Keyman + * + * Unfortunately, there is no way to distinguish between deactivate messages that result from + * 1) changing the text input client which is in use or + * 2) changing from Keyman to a different input method such as a system keyboard + * Because of this, we must set a timer after a deactivate to see if an activate follows it. + * If it does not, then we assume that the user has changed input methods and Keyman is inactive. + * + * Note that Keyman does not necessarily receive the deactivate before the activate, so + * that complicates the handling of these events. + * + * Additional complexity is encountered when receiving activate messages. After Keyman + * is deactivated, it can receive a pair of activate and deactivate messages in rapid succession. + * These are unexpected and may be generated by clicking on windows or selecting menus and + * may only be a few milliseconds apart. We want to ignore these false activate messages + * rather than showing the OSK and enabling the event tap and then immediately hiding and disabling. + * The false activate messages are detected by using a timer to ensure that when the + * state is Inactive, we only change to Active if we receive an activate message that is not followed + * immediately by a deactivate message. + */ + +#import "KMInputMethodLifecycle.h" +#import "KMLogs.h" +#import +#import "KMSettingsRepository.h" + +NSString *const kInputMethodActivatedNotification = @"kInputMethodActivatedNotification"; +NSString *const kInputMethodDeactivatedNotification = @"kInputMethodDeactivatedNotification"; +NSString *const kInputMethodClientChangeNotification = @"kInputMethodClientChangeNotification"; + +typedef enum { + Initialized, + Active, + Inactive +} LifecycleState; + +@interface KMInputMethodLifecycle() + +@property LifecycleState state; +@property NSMutableDictionary *textInputClients; +@end + +@implementation KMInputMethodLifecycle +const double inactivityTimeout = 0.5; +const double minimumActiveDuration = 0.5; + ++ (KMInputMethodLifecycle *)shared { + static KMInputMethodLifecycle *shared = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + shared = [[KMInputMethodLifecycle alloc] init]; + }); + + return shared; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _state = Initialized; + _textInputClients = [[NSMutableDictionary alloc] initWithCapacity:2]; + } + return self; +} + +/** + * called from Application Delgate during init + */ +- (void)startLifecycle { + _state = Initialized; +} + +/** + * called when IMKInputController receives an activateServer message + */ +- (void)activateClient:(id)client { + os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle activateClient, client: %{public}@", client); + @synchronized(_textInputClients) { + [self addActiveClient:client]; + } + + if (self.state == Initialized) { + /** + * If the input method is only Initialized, then change clients and activate immediately. + * No timer delay is needed because we can assume that we just started Keyman. + */ + [self changeClient]; + [self activateInputMethod]; + } else if (self.state == Inactive) { + /** + * Before activating the input method, wait and see if we receive an immediate deactivation. + * If not, then it is safe to assume that we should change the state to Active. + */ + os_log_debug([KMLogs lifecycleLog], "before activating the inactive input method, wait for %1.1f seconds and call activateInputMethodIfNoDeactivation", minimumActiveDuration); + [self performSelector:@selector(activateInputMethodIfNoDeactivation:) withObject:nil afterDelay:minimumActiveDuration]; + } else if (self.state == Active) { + /** + * If the input method was already active, then just send a notification to change clients + */ + [self changeClient]; + } +} + +/** + * called when IMKInputController receives a deactivateServer message + */ +- (void)deactivateClient:(id)client { + @synchronized(_textInputClients) { + os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle deactivateClient, client: %{public}@", client); + [self removeActiveClient: client]; + + /** + * If the input method is currently active, and we removed the last client, wait and see if another client is activated. + * If not, then it is time to deactivate the input method. + * + * No need to do this if we are not in Active state, as this may be a spurious deactivate call that just followed a spurious + * activate call. If that's the case, then it is likely happening during the delay before activateInputMethodIfNoDeactivation. + */ + + if ((self.state == Active) && (self.textInputClients.count == 0)) { + os_log_debug([KMLogs lifecycleLog], "no text input clients found in textInputClients map; delay for %1.1f seconds and call deactivateInputMethodIfNoClients", inactivityTimeout); + [self performSelector:@selector(deactivateInputMethodIfNoClients:) withObject:nil afterDelay:inactivityTimeout]; + } + } +} + +/** + * Executed after a delay: if no deactivation was received, then the input method is now Active + */ +- (void)activateInputMethodIfNoDeactivation:(id)lastClient { + @synchronized(_textInputClients) { + if (self.state == Inactive) { + if (self.textInputClients.count > 0) { + [self logClients:@"activateInputMethodIfNoDeactivation found an active client, time to activate the input method"]; + [self activateInputMethod]; + } else { + os_log_debug([KMLogs lifecycleLog], "activateInputMethodIfNoDeactivation found that the active client was removed, do not activate input method"); + } + } + } +} + +/** + * Add to the list of active clients. There are usually zero or one clients in the list, but could + * bet two when we are late receiving a deactivate message. + */ +- (void)addActiveClient:(id)client { + NSRunningApplication *currentApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; + NSString *clientAppId = [currentApp bundleIdentifier]; + NSString *keyString = [self keyForClient:client]; + os_log_debug([KMLogs lifecycleLog], " ++adding client application '%{public}@' to textInputClients map, derived key: %{public}@", clientAppId, keyString); + [self.textInputClients setObject:clientAppId forKey:keyString]; +} + +/** + * Create a key string from the hash of the client object to be used for storing in the textInputClients map + */ +- (NSString*) keyForClient:(id)client { + NSUInteger key = ((NSObject*)client).hash; + NSString *keyString = [@(key) stringValue]; + return keyString; +} + +/** + * Executed after a delay: if there are still no clients, then deactivate the input method + */ +- (void)deactivateInputMethodIfNoClients:(id)lastClient { + @synchronized(_textInputClients) { + if (self.textInputClients.count == 0) { + if (self.state == Active) { + os_log_debug([KMLogs lifecycleLog], "deactivateInputMethodIfNoClients found no clients, time to deactivate"); + [self deactivateInputMethod]; + } + } else { + [self logClients:@"deactivateInputMethodIfNoClients found a newly activated client, "]; + } + } +} + +/** + * Remove from the list of active clients. + */ +- (void)removeActiveClient:(id)client { + NSString *keyString = [self keyForClient:client]; + NSString *clientAppId = [self.textInputClients objectForKey:keyString]; + if (clientAppId) { + os_log_debug([KMLogs lifecycleLog], " --removing client application '%{public}@' from textInputClients map, key: %{public}@", clientAppId, keyString); + [self.textInputClients removeObjectForKey:keyString]; + } else { + os_log_debug([KMLogs lifecycleLog], " key %{public}@ not found in textInputClients map", keyString); + } +} + +/** + * Write the client list to the log. + */ +- (void) logClients: (NSString*)message { + os_log_debug([KMLogs lifecycleLog], "%{public}@ textInputClients map: %{public}@", message, self.textInputClients.description); +} + +/** + * Change state to Active and send notification. + */ +- (void)activateInputMethod { + _state = Active; + [[NSNotificationCenter defaultCenter] postNotificationName:kInputMethodActivatedNotification object:self]; +} + +/** + * Change state to Inactive and send notification. + */ +- (void)deactivateInputMethod { + _state = Inactive; + [[NSNotificationCenter defaultCenter] postNotificationName:kInputMethodDeactivatedNotification object:self]; +} + +/** + * does not change state, just fires notification so that InputController knows to change the event handler + */ +- (void)changeClient { + [[NSNotificationCenter defaultCenter] postNotificationName:kInputMethodClientChangeNotification object:self]; +} + +/** + * returns true if Initialized or Active + */ +- (BOOL)shouldEnableEventTap { + return ((self.state == Initialized) || (self.state == Active)); +} + +/** + * returns true if state is Initialized or Active and the Settings require us to show the OSK + */ +- (BOOL)shouldShowOskOnActivate { + return [KMSettingsRepository.shared readShowOskOnActivate] + && (self.state == Active); +} + +@end diff --git a/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.m b/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.m index 3dad2baf63d..33d7eda4062 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/OnScreenKeyboard/OSKWindowController.m @@ -8,6 +8,7 @@ #import "OSKWindowController.h" #import "KMInputMethodAppDelegate.h" +#import "KMInputMethodLifecycle.h" #import "KMSettingsRepository.h" #import "KMLogs.h" @@ -26,7 +27,6 @@ - (KMInputMethodAppDelegate *)AppDelegate { } - (void)dealloc { - //[[NSNotificationCenter defaultCenter] removeObserver:self]; [self stopTimer]; } @@ -56,7 +56,6 @@ - (void)awakeFromNib { - (void)windowDidLoad { os_log_debug([KMLogs oskLog], "OSKWindowController windowDidLoad"); [super windowDidLoad]; - //[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidResize:) name:NSWindowDidResizeNotification object:self.window]; [self.oskView setKvk:[self.AppDelegate kvk]]; [self startTimerWithTimeInterval:0.1]; // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. From b3651f0dfa832e973a4616521b589b124d6ff6bb Mon Sep 17 00:00:00 2001 From: sgschantz Date: Wed, 11 Sep 2024 11:03:47 +0700 Subject: [PATCH 037/119] change(mac): renamed property and cleaned up comments Fixes: #12342 --- .../Keyman4MacIM/KMInputMethodLifecycle.m | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m index 3c07c6e2cd2..0c7cfa4005c 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m @@ -15,6 +15,10 @@ * in the background as an application but only receives events from text input clients * when it is the active input method. * + * Without any simple way to determine whether the input method is active, it is considered + * to be in an Active state if it has an active text input client that does not immediately get + * a deactivate method after activating. + * * It is important for state of the input method to be known so that the On-screen keyboard can * be appropriately shown or hidden and the low-level event tap can be stopped or started. * @@ -32,8 +36,8 @@ * Note that Keyman does not necessarily receive the deactivate before the activate, so * that complicates the handling of these events. * - * Additional complexity is encountered when receiving activate messages. After Keyman - * is deactivated, it can receive a pair of activate and deactivate messages in rapid succession. + * Additional complexity is encountered when receiving activate messages. After the Keyman input method + * becomes inactive, it can receive a pair of activate and deactivate messages in rapid succession. * These are unexpected and may be generated by clicking on windows or selecting menus and * may only be a few milliseconds apart. We want to ignore these false activate messages * rather than showing the OSK and enabling the event tap and then immediately hiding and disabling. @@ -52,7 +56,7 @@ NSString *const kInputMethodClientChangeNotification = @"kInputMethodClientChangeNotification"; typedef enum { - Initialized, + Started, Active, Inactive } LifecycleState; @@ -60,7 +64,7 @@ @interface KMInputMethodLifecycle() @property LifecycleState state; -@property NSMutableDictionary *textInputClients; +@property NSMutableDictionary *activeTextInputClients; @end @implementation KMInputMethodLifecycle @@ -80,8 +84,8 @@ + (KMInputMethodLifecycle *)shared { - (instancetype)init { self = [super init]; if (self) { - _state = Initialized; - _textInputClients = [[NSMutableDictionary alloc] initWithCapacity:2]; + _state = Started; + _activeTextInputClients = [[NSMutableDictionary alloc] initWithCapacity:2]; } return self; } @@ -90,7 +94,7 @@ - (instancetype)init { * called from Application Delgate during init */ - (void)startLifecycle { - _state = Initialized; + _state = Started; } /** @@ -98,20 +102,21 @@ - (void)startLifecycle { */ - (void)activateClient:(id)client { os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle activateClient, client: %{public}@", client); - @synchronized(_textInputClients) { + @synchronized(_activeTextInputClients) { [self addActiveClient:client]; } - if (self.state == Initialized) { + if (self.state == Started) { /** - * If the input method is only Initialized, then change clients and activate immediately. - * No timer delay is needed because we can assume that we just started Keyman. + * If state is Started, then change clients and activate immediately. + * When Keyman is just starting, there does not appear to be any chance of receiving + * a pair of false activate/deactivate messages. */ [self changeClient]; [self activateInputMethod]; } else if (self.state == Inactive) { /** - * Before activating the input method, wait and see if we receive an immediate deactivation. + * Before activating the input method, wait and see if we receive an immediate deactivate call. * If not, then it is safe to assume that we should change the state to Active. */ os_log_debug([KMLogs lifecycleLog], "before activating the inactive input method, wait for %1.1f seconds and call activateInputMethodIfNoDeactivation", minimumActiveDuration); @@ -128,20 +133,21 @@ - (void)activateClient:(id)client { * called when IMKInputController receives a deactivateServer message */ - (void)deactivateClient:(id)client { - @synchronized(_textInputClients) { + @synchronized(_activeTextInputClients) { os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle deactivateClient, client: %{public}@", client); [self removeActiveClient: client]; /** - * If the input method is currently active, and we removed the last client, wait and see if another client is activated. + * If the input method is currently Active, and we removed the last client, wait and see if another client is activated. * If not, then it is time to deactivate the input method. * - * No need to do this if we are not in Active state, as this may be a spurious deactivate call that just followed a spurious - * activate call. If that's the case, then it is likely happening during the delay before activateInputMethodIfNoDeactivation. + * If the input method is currently Inactive, then we may be here during the delay before invoking + * activateInputMethodIfNoDeactivation. In that case there is nothing special to do here, simply removing the + * client */ - if ((self.state == Active) && (self.textInputClients.count == 0)) { - os_log_debug([KMLogs lifecycleLog], "no text input clients found in textInputClients map; delay for %1.1f seconds and call deactivateInputMethodIfNoClients", inactivityTimeout); + if ((self.state == Active) && (self.activeTextInputClients.count == 0)) { + os_log_debug([KMLogs lifecycleLog], "no text input clients found in activeTextInputClients map; delay for %1.1f seconds and call deactivateInputMethodIfNoClients", inactivityTimeout); [self performSelector:@selector(deactivateInputMethodIfNoClients:) withObject:nil afterDelay:inactivityTimeout]; } } @@ -151,9 +157,9 @@ - (void)deactivateClient:(id)client { * Executed after a delay: if no deactivation was received, then the input method is now Active */ - (void)activateInputMethodIfNoDeactivation:(id)lastClient { - @synchronized(_textInputClients) { + @synchronized(_activeTextInputClients) { if (self.state == Inactive) { - if (self.textInputClients.count > 0) { + if (self.activeTextInputClients.count > 0) { [self logClients:@"activateInputMethodIfNoDeactivation found an active client, time to activate the input method"]; [self activateInputMethod]; } else { @@ -171,12 +177,12 @@ - (void)addActiveClient:(id)client { NSRunningApplication *currentApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; NSString *clientAppId = [currentApp bundleIdentifier]; NSString *keyString = [self keyForClient:client]; - os_log_debug([KMLogs lifecycleLog], " ++adding client application '%{public}@' to textInputClients map, derived key: %{public}@", clientAppId, keyString); - [self.textInputClients setObject:clientAppId forKey:keyString]; + os_log_debug([KMLogs lifecycleLog], " ++adding client application '%{public}@' to activeTextInputClients map, derived key: %{public}@", clientAppId, keyString); + [self.activeTextInputClients setObject:clientAppId forKey:keyString]; } /** - * Create a key string from the hash of the client object to be used for storing in the textInputClients map + * Create a key string from the hash of the client object to be used for storing in the activeTextInputClients map */ - (NSString*) keyForClient:(id)client { NSUInteger key = ((NSObject*)client).hash; @@ -188,8 +194,8 @@ - (NSString*) keyForClient:(id)client { * Executed after a delay: if there are still no clients, then deactivate the input method */ - (void)deactivateInputMethodIfNoClients:(id)lastClient { - @synchronized(_textInputClients) { - if (self.textInputClients.count == 0) { + @synchronized(_activeTextInputClients) { + if (self.activeTextInputClients.count == 0) { if (self.state == Active) { os_log_debug([KMLogs lifecycleLog], "deactivateInputMethodIfNoClients found no clients, time to deactivate"); [self deactivateInputMethod]; @@ -205,12 +211,12 @@ - (void)deactivateInputMethodIfNoClients:(id)lastClient { */ - (void)removeActiveClient:(id)client { NSString *keyString = [self keyForClient:client]; - NSString *clientAppId = [self.textInputClients objectForKey:keyString]; + NSString *clientAppId = [self.activeTextInputClients objectForKey:keyString]; if (clientAppId) { - os_log_debug([KMLogs lifecycleLog], " --removing client application '%{public}@' from textInputClients map, key: %{public}@", clientAppId, keyString); - [self.textInputClients removeObjectForKey:keyString]; + os_log_debug([KMLogs lifecycleLog], " --removing client application '%{public}@' from activeTextInputClients map, key: %{public}@", clientAppId, keyString); + [self.activeTextInputClients removeObjectForKey:keyString]; } else { - os_log_debug([KMLogs lifecycleLog], " key %{public}@ not found in textInputClients map", keyString); + os_log_debug([KMLogs lifecycleLog], " key %{public}@ not found in activeTextInputClients map", keyString); } } @@ -218,7 +224,7 @@ - (void)removeActiveClient:(id)client { * Write the client list to the log. */ - (void) logClients: (NSString*)message { - os_log_debug([KMLogs lifecycleLog], "%{public}@ textInputClients map: %{public}@", message, self.textInputClients.description); + os_log_debug([KMLogs lifecycleLog], "%{public}@ activeTextInputClients map: %{public}@", message, self.activeTextInputClients.description); } /** @@ -245,14 +251,14 @@ - (void)changeClient { } /** - * returns true if Initialized or Active + * returns true if Started or Active */ - (BOOL)shouldEnableEventTap { - return ((self.state == Initialized) || (self.state == Active)); + return ((self.state == Started) || (self.state == Active)); } /** - * returns true if state is Initialized or Active and the Settings require us to show the OSK + * returns true if state is Active and the Settings require us to show the OSK */ - (BOOL)shouldShowOskOnActivate { return [KMSettingsRepository.shared readShowOskOnActivate] From 094aa985b275adfd2039abf2ad2127790043d1bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 07:18:39 +0000 Subject: [PATCH 038/119] chore(deps): bump express from 4.19.2 to 4.20.0 Bumps [express](https://github.com/expressjs/express) from 4.19.2 to 4.20.0. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.19.2...4.20.0) --- updated-dependencies: - dependency-name: express dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- developer/src/server/package.json | 2 +- package-lock.json | 322 +++++++++++++++++++++--------- 2 files changed, 226 insertions(+), 98 deletions(-) diff --git a/developer/src/server/package.json b/developer/src/server/package.json index f3be3425f2a..8619adceecc 100644 --- a/developer/src/server/package.json +++ b/developer/src/server/package.json @@ -12,7 +12,7 @@ "@keymanapp/developer-utils": "*", "@sentry/node": "^7.57.0", "chalk": "^4.1.2", - "express": "^4.19.2", + "express": "^4.20.0", "multer": "^1.4.5-lts.1", "ngrok": "^5.0.0-beta.2", "open": "^8.4.0", diff --git a/package-lock.json b/package-lock.json index f8e3d89043e..29adc383c05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1895,7 +1895,7 @@ "@keymanapp/developer-utils": "*", "@sentry/node": "^7.57.0", "chalk": "^4.1.2", - "express": "^4.19.2", + "express": "^4.20.0", "multer": "^1.4.5-lts.1", "ngrok": "^5.0.0-beta.2", "open": "^8.4.0", @@ -6009,9 +6009,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -6021,7 +6021,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -6033,7 +6033,8 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } @@ -6048,17 +6049,21 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "ee-first": "1.1.1" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 0.8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/brace-expansion": { @@ -6326,12 +6331,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7025,6 +7036,22 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "license": "MIT", @@ -7277,6 +7304,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", @@ -8466,36 +8512,36 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", + "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -8529,6 +8575,14 @@ "node": ">= 0.8" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -8546,21 +8600,18 @@ "node": ">= 0.8" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, + "node_modules/express/node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -8905,13 +8956,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9167,7 +9223,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -9219,6 +9274,7 @@ }, "node_modules/has": { "version": "1.0.3", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.1" @@ -9244,12 +9300,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9259,7 +9314,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -9297,7 +9351,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -10788,8 +10841,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "license": "MIT" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge2": { "version": "1.4.1", @@ -10820,6 +10877,17 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -11613,9 +11681,12 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11669,9 +11740,9 @@ "license": "MIT" }, "node_modules/on-finished": { - "version": "2.3.0", - "dev": true, - "license": "MIT", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -11986,8 +12057,9 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "license": "MIT" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/path-type": { "version": "4.0.0", @@ -12378,7 +12450,8 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { "node": ">= 0.6" } @@ -12754,9 +12827,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -12797,33 +12870,11 @@ "node": ">= 0.8" } }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -12841,9 +12892,9 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", + "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -12854,6 +12905,79 @@ "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-static/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-immediate-shim": { "version": "1.0.1", "license": "MIT", @@ -12909,13 +13033,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" From e4017a8c2846444e6988df087ab898ce7ea88fb6 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 12 Sep 2024 06:06:00 +0700 Subject: [PATCH 039/119] fix(developer): rewrite ldml visual keyboard compiler The visual keyboard compiler was never finished in 17.0. This rewrites it to: 1. Use the kmxplus data rather than reading from xml directly 2. Fill in `visualkeyboard.header.kbdname` 3. Support modifiers 4. Handle encoded characters like `\u{1234}` 5. Handle string variables like `${one}`* Additional unit tests have been added to verify the behavior of the visual keyboard compiler in more detail. TODO-LDML: string variables appear to have a secondary bug -- they seem to be returning the string 'undefined'. I have disabled the related tests and will examine this separately, and enable those tests once fixed. TODO-LDML: we should probably add a compiler warning + unit test for ``, because this pattern does not make sense: when using non-touch forms, the `` element should use `modifiers` attribute, and correspondingly, `modifiers` attribute should _not_ be used when `formId` is `touch`. Other fixes: 1. The LDML XML reader was relying on its input being a Node.js `Buffer` even though it was declared `Uint8Array`, as it implicitly used `Buffer.toString()` to do text conversion. (`Buffer` subclasses from `Uint8Array`). This breaks when using `Uint8Array` directly and means we had an implicit dependency on Node.js. See also #12331. 2. XML errors were not captured in the LDML XML reader. See also #12331. 3. The unused and unfinished touch-layout-compiler.ts and keymanweb-compiler.ts have been removed along with corresponding unit tests and fixtures. These are replaced by Core implementations; see #12291. Fixes: #12395 --- .../{common-events.ts => common-messages.ts} | 7 + developer/src/common/web/utils/src/index.ts | 2 +- .../ldml-keyboard/ldml-keyboard-xml-reader.ts | 33 ++- .../test/kmx/test-ldml-keyboard-xml-reader.ts | 2 +- developer/src/kmc-ldml/package.json | 4 +- .../src/kmc-ldml/src/compiler/compiler.ts | 10 +- .../src/compiler/keymanweb-compiler.ts | 114 --------- .../src/compiler/touch-layout-compiler.ts | 113 --------- .../src/compiler/visual-keyboard-compiler.ts | 112 ++++++--- .../src/kmc-ldml/test/fixtures/basic-kvk.txt | 6 +- .../kmc-ldml/test/fixtures/basic-no-debug.js | 1 - developer/src/kmc-ldml/test/fixtures/basic.js | 48 ---- .../src/kmc-ldml/test/fixtures/basic.txt | 6 +- .../src/kmc-ldml/test/fixtures/basic.xml | 4 +- developer/src/kmc-ldml/test/helpers/index.ts | 31 +-- .../kmc-ldml/test/test-keymanweb-compiler.ts | 50 ---- .../test/test-visual-keyboard-compiler-e2e.ts | 31 --- .../test/test-visual-keyboard-compiler.ts | 228 ++++++++++++++++++ package-lock.json | 19 ++ 19 files changed, 382 insertions(+), 439 deletions(-) rename developer/src/common/web/utils/src/{common-events.ts => common-messages.ts} (91%) delete mode 100644 developer/src/kmc-ldml/src/compiler/keymanweb-compiler.ts delete mode 100644 developer/src/kmc-ldml/src/compiler/touch-layout-compiler.ts delete mode 100644 developer/src/kmc-ldml/test/fixtures/basic-no-debug.js delete mode 100644 developer/src/kmc-ldml/test/fixtures/basic.js delete mode 100644 developer/src/kmc-ldml/test/test-keymanweb-compiler.ts delete mode 100644 developer/src/kmc-ldml/test/test-visual-keyboard-compiler-e2e.ts create mode 100644 developer/src/kmc-ldml/test/test-visual-keyboard-compiler.ts diff --git a/developer/src/common/web/utils/src/common-events.ts b/developer/src/common/web/utils/src/common-messages.ts similarity index 91% rename from developer/src/common/web/utils/src/common-events.ts rename to developer/src/common/web/utils/src/common-messages.ts index eee8a6c84ca..5b3fd7d5070 100644 --- a/developer/src/common/web/utils/src/common-events.ts +++ b/developer/src/common/web/utils/src/common-messages.ts @@ -1,3 +1,6 @@ +/* + * Keyman is copyright (C) SIL International. MIT License. + */ import { CompilerErrorNamespace, CompilerErrorSeverity, CompilerMessageDef as def, CompilerMessageSpec as m } from './compiler-interfaces.js'; import { constants } from '@keymanapp/ldml-keyboard-constants'; @@ -43,4 +46,8 @@ export class CommonTypesMessages { static Error_TestDataUnexpectedArray = (o: {subtag: string}) => m(this.ERROR_TestDataUnexpectedArray, `Problem reading test data: expected single ${def(o.subtag)} element, found multiple`); + + static ERROR_InvalidXml = SevError | 0x0008; + static Error_InvalidXml = (o:{e: any}) => + m(this.ERROR_InvalidXml, `The XML file could not be read: ${(o.e ?? '').toString()}`); }; diff --git a/developer/src/common/web/utils/src/index.ts b/developer/src/common/web/utils/src/index.ts index 0e462c7c056..7ee5c507b80 100644 --- a/developer/src/common/web/utils/src/index.ts +++ b/developer/src/common/web/utils/src/index.ts @@ -42,6 +42,6 @@ export { defaultCompilerOptions, CompilerBaseOptions, CompilerCallbacks, Compile } from './compiler-interfaces.js'; -export { CommonTypesMessages } from './common-events.js'; +export { CommonTypesMessages } from './common-messages.js'; export * as xml2js from './deps/xml2js/xml2js.js'; diff --git a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts index ddeaf719abd..d364c16d7dc 100644 --- a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts +++ b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts @@ -1,6 +1,11 @@ +/* + * Keyman is copyright (C) SIL International. MIT License. + * + * Reads a LDML XML keyboard file into JS object tree and resolves imports + */ import { SchemaValidators, util } from '@keymanapp/common-types'; import { xml2js } from '../../index.js'; -import { CommonTypesMessages } from '../../common-events.js'; +import { CommonTypesMessages } from '../../common-messages.js'; import { CompilerCallbacks } from '../../compiler-interfaces.js'; import { LDMLKeyboardXMLSourceFile, LKImport, ImportStatus } from './ldml-keyboard-xml.js'; import { constants } from '@keymanapp/ldml-keyboard-constants'; @@ -114,6 +119,7 @@ export class LDMLKeyboardXMLSourceFileReader { for (const sub of obj) { // retain the same subtag if (!this.boxImportsAndSpecials(sub, subtag)) { + // resolveImports has already logged a message return false; } } @@ -126,6 +132,7 @@ export class LDMLKeyboardXMLSourceFileReader { boxXmlArray(obj, key); // Now, resolve the import if (!this.resolveImports(obj, subtag)) { + // resolveImports has already logged a message return false; } // now delete the import array we so carefully constructed, the caller does not @@ -133,6 +140,7 @@ export class LDMLKeyboardXMLSourceFileReader { delete obj['import']; } else { if (!this.boxImportsAndSpecials(obj[key], key)) { + // resolveImports has already logged a message return false; } } @@ -152,6 +160,7 @@ export class LDMLKeyboardXMLSourceFileReader { // first, the explicit imports for (const asImport of ([...obj['import'] as LKImport[]].reverse())) { if (!this.resolveOneImport(obj, subtag, asImport)) { + // resolveOneImport has already logged a message return false; } } @@ -162,6 +171,7 @@ export class LDMLKeyboardXMLSourceFileReader { base: constants.cldr_import_base, path: constants.cldr_implied_keys_import }, true)) { + // resolveOneImport has already logged a message return false; } } else if (subtag === 'forms') { @@ -170,6 +180,7 @@ export class LDMLKeyboardXMLSourceFileReader { base: constants.cldr_import_base, path: constants.cldr_implied_forms_import }, true)) { + // resolveOneImport has already logged a message return false; } } @@ -267,7 +278,8 @@ export class LDMLKeyboardXMLSourceFileReader { // An alternative fix would be to pull xml2js directly from github // rather than using the version tagged on npmjs.com. }); - parser.parseString(file, (e: unknown, r: unknown) => { a = r as LDMLKeyboardXMLSourceFile }); // TODO-LDML: isn't 'e' the error? + const data = new TextDecoder().decode(file); + parser.parseString(data, (e: unknown, r: unknown) => { if(e) throw e; a = r as LDMLKeyboardXMLSourceFile }); // TODO-LDML: isn't 'e' the error? return a; })(); return source; @@ -279,14 +291,23 @@ export class LDMLKeyboardXMLSourceFileReader { */ public load(file: Uint8Array): LDMLKeyboardXMLSourceFile | null { if (!file) { + throw new Error(`file parameter must not be null`); + } + + let source: LDMLKeyboardXMLSourceFile = null; + try { + source = this.loadUnboxed(file); + } catch(e) { + this.callbacks.reportMessage(CommonTypesMessages.Error_InvalidXml({e})); return null; } - const source = this.loadUnboxed(file); - if(this.boxArrays(source)) { + + if (this.boxArrays(source)) { return source; - } else { - return null; } + + // boxArrays ... resolveImports has already logged a message + return null; } loadTestDataUnboxed(file: Uint8Array): any { diff --git a/developer/src/common/web/utils/test/kmx/test-ldml-keyboard-xml-reader.ts b/developer/src/common/web/utils/test/kmx/test-ldml-keyboard-xml-reader.ts index a79960c7ca2..17c35660245 100644 --- a/developer/src/common/web/utils/test/kmx/test-ldml-keyboard-xml-reader.ts +++ b/developer/src/common/web/utils/test/kmx/test-ldml-keyboard-xml-reader.ts @@ -1,7 +1,7 @@ import { LKKey, ImportStatus } from '../../src/types/ldml-keyboard/ldml-keyboard-xml.js'; import 'mocha'; import {assert} from 'chai'; -import { CommonTypesMessages } from '../../src/common-events.js'; +import { CommonTypesMessages } from '../../src/common-messages.js'; import { testReaderCases } from '../helpers/reader-callback-test.js'; import { Constants } from '@keymanapp/common-types'; diff --git a/developer/src/kmc-ldml/package.json b/developer/src/kmc-ldml/package.json index 6f65eaf0e0a..11d7c07b880 100644 --- a/developer/src/kmc-ldml/package.json +++ b/developer/src/kmc-ldml/package.json @@ -25,8 +25,8 @@ "url": "https://github.com/keymanapp/keyman/issues" }, "dependencies": { - "@keymanapp/keyman-version": "*", "@keymanapp/developer-utils": "*", + "@keymanapp/keyman-version": "*", "@keymanapp/kmc-kmn": "*", "@keymanapp/ldml-keyboard-constants": "*", "semver": "^7.5.4" @@ -34,11 +34,13 @@ "devDependencies": { "@keymanapp/developer-test-helpers": "*", "@keymanapp/resources-gosh": "*", + "@types/common-tags": "^1.8.4", "@types/mocha": "^5.2.7", "@types/node": "^20.4.1", "@types/semver": "^7.3.12", "c8": "^7.12.0", "chalk": "^2.4.2", + "common-tags": "^1.8.2", "mocha": "^8.4.0", "typescript": "^5.4.5" }, diff --git a/developer/src/kmc-ldml/src/compiler/compiler.ts b/developer/src/kmc-ldml/src/compiler/compiler.ts index 950534e69c8..5e2a9990d18 100644 --- a/developer/src/kmc-ldml/src/compiler/compiler.ts +++ b/developer/src/kmc-ldml/src/compiler/compiler.ts @@ -1,3 +1,8 @@ +/* + * Keyman is copyright (C) SIL International. MIT License. + * + * Compiles a LDML XML keyboard file into a Keyman KMXPlus file + */ import { KMXPlus, UnicodeSetParser, KvkFileWriter } from '@keymanapp/common-types'; import { CompilerCallbacks, KeymanCompiler, KeymanCompilerResult, KeymanCompilerArtifacts, @@ -137,6 +142,8 @@ export class LdmlKeyboardCompiler implements KeymanCompiler { return null; } + outputFilename = outputFilename ?? inputFilename.replace(/\.xml$/, '.kmx'); + // In order for the KMX file to be loaded by non-KMXPlus components, it is helpful // to duplicate some of the metadata KMXPlusMetadataCompiler.addKmxMetadata(kmx.kmxplus, kmx.keyboard, compilerOptions); @@ -146,7 +153,7 @@ export class LdmlKeyboardCompiler implements KeymanCompiler { const kmx_binary = builder.compile(); const vkcompiler = new LdmlKeyboardVisualKeyboardCompiler(this.callbacks); - const vk = vkcompiler.compile(source); + const vk = vkcompiler.compile(kmx.kmxplus, this.callbacks.path.basename(outputFilename, '.kmx')); const writer = new KvkFileWriter(); const kvk_binary = writer.write(vk); @@ -161,7 +168,6 @@ export class LdmlKeyboardCompiler implements KeymanCompiler { //KMW17.0: const encoder = new TextEncoder(); //KMW17.0: const kmw_binary = encoder.encode(kmw_string); - outputFilename = outputFilename ?? inputFilename.replace(/\.xml$/, '.kmx'); return { artifacts: { diff --git a/developer/src/kmc-ldml/src/compiler/keymanweb-compiler.ts b/developer/src/kmc-ldml/src/compiler/keymanweb-compiler.ts deleted file mode 100644 index 86402b6d45e..00000000000 --- a/developer/src/kmc-ldml/src/compiler/keymanweb-compiler.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { VisualKeyboard, KeymanFileTypes } from "@keymanapp/common-types"; -import { CompilerCallbacks, LDMLKeyboard, TouchLayoutFileWriter } from "@keymanapp/developer-utils"; -import { LdmlCompilerOptions } from "./ldml-compiler-options.js"; -import { TouchLayoutCompiler } from "./touch-layout-compiler.js"; -import { LdmlKeyboardVisualKeyboardCompiler } from "./visual-keyboard-compiler.js"; - -const MINIMUM_KMW_VERSION = '16.0'; - -export class LdmlKeyboardKeymanWebCompiler { - private readonly options: LdmlCompilerOptions; - private readonly nl: string; - private readonly tab: string; - constructor(private callbacks: CompilerCallbacks, options?: LdmlCompilerOptions) { - this.options = { ...options }; - this.nl = this.options.saveDebug ? "\n" : ''; - this.tab = this.options.saveDebug ? " " : ''; - } - - public compileVisualKeyboard(source: LDMLKeyboard.LDMLKeyboardXMLSourceFile) { - const nl = this.nl, tab = this.tab; - const vkc = new LdmlKeyboardVisualKeyboardCompiler(this.callbacks); - const vk: VisualKeyboard.VisualKeyboard = vkc.compile(source); - - let result = - `{F: ' 1em ${JSON.stringify(vk.header.unicodeFont.name)}', `+ - `K102: ${vk.header.flags & VisualKeyboard.VisualKeyboardHeaderFlags.kvkh102 ? 1 : 0}};${nl}` + // TODO-LDML: escape ' and " in font name correctly - `${tab}this.KV.KLS={${nl}` + - `${tab}${tab}TODO_LDML: ${vk.keys.length}${nl}` + - // TODO-LDML: fill in KLS - `${tab}}`; - - return result; - } - - public compileTouchLayout(source: LDMLKeyboard.LDMLKeyboardXMLSourceFile) { - const tlcompiler = new TouchLayoutCompiler(); - const layout = tlcompiler.compileToJavascript(source); - const writer = new TouchLayoutFileWriter({formatted: this.options.saveDebug}); - return writer.compile(layout); - } - - private cleanName(name: string): string { - let result = this.callbacks.path.basename(name, KeymanFileTypes.Source.LdmlKeyboard); - if(!result) { - throw new Error(`Invalid file name ${name}`); - } - - result = result.replaceAll(/[^a-z0-9]/g, '_'); - if(result.match(/^[0-9]/)) { - // Can't have a digit as initial - result = '_' + result; - } - return result; - } - - public compile(name: string, source: LDMLKeyboard.LDMLKeyboardXMLSourceFile): string { - const nl = this.nl, tab = this.tab; - - const sName = 'Keyboard_'+this.cleanName(name); - const displayUnderlying = true; // TODO-LDML - const modifierBitmask = 0; // TODO-LDML: define the modifiers used by this keyboard - const vkDictionary = ''; // TODO-LDML: vk dictionary for touch keys - const hasSupplementaryPlaneChars = false; // TODO-LDML - const isRTL = false; // TODO-LDML - - let result = - `if(typeof keyman === 'undefined') {${nl}` + - `${tab}console.error('Keyboard requires KeymanWeb ${MINIMUM_KMW_VERSION} or later');${nl}` + - `} else {${nl}` + - `${tab}KeymanWeb.KR(new ${sName}());${nl}` + - `}${nl}` + - `function ${sName}() {${nl}` + - // `${tab}${this.setupDebug()}${nl}` + ? we may use this for modifierBitmask in future - // `${tab}this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;${nl}` + ? we probably don't need this, it's for back-compat - `${tab}this.KI="${sName}";${nl}` + - `${tab}this.KN=${JSON.stringify(source.keyboard3.info.name)};${nl}` + - `${tab}this.KMINVER=${JSON.stringify(MINIMUM_KMW_VERSION)};${nl}` + - `${tab}this.KV=${this.compileVisualKeyboard(source)};${nl}` + - `${tab}this.KDU=${displayUnderlying ? '1' : '0'};${nl}` + - `${tab}this.KH="";${nl}` + // TODO-LDML: help text not supported - `${tab}this.KM=0;${nl}` + // TODO-LDML: mnemonic layout not supported for LDML keyboards - `${tab}this.KBVER=${JSON.stringify(source.keyboard3.version?.number || '0.0')};${nl}` + - `${tab}this.KMBM=${modifierBitmask};${nl}`; - - if(isRTL) { - result += `${tab}this.KRTL=1;${nl}`; - } - - if(hasSupplementaryPlaneChars) { - result += `${tab}this.KS=1;${nl}`; - } - - if(vkDictionary != '') { - result += `${tab}this.KVKD=${JSON.stringify(vkDictionary)};${nl}`; - } - - let layoutFile = this.compileTouchLayout(source); - if(layoutFile != '') { - result += `${tab}this.KVKL=${layoutFile};${nl}`; - } - // TODO-LDML: KCSS not supported - - // TODO-LDML: embed binary keyboard for loading into Core - - // A LDML keyboard has a no-op for its gs() (begin Unicode) function, - // because the functionality is embedded in Keyman Core - result += `${tab}this.gs=function(t,e){${nl}`+ - `${tab}${tab}return 0;${nl}`+ // TODO-LDML: we will start by embedding call into Keyman Core here - `${tab}};${nl}`; - - result += `}${nl}`; - return result; - } -} diff --git a/developer/src/kmc-ldml/src/compiler/touch-layout-compiler.ts b/developer/src/kmc-ldml/src/compiler/touch-layout-compiler.ts deleted file mode 100644 index a36ab9c0974..00000000000 --- a/developer/src/kmc-ldml/src/compiler/touch-layout-compiler.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { TouchLayout } from "@keymanapp/common-types"; -import { LDMLKeyboard } from "@keymanapp/developer-utils"; - -export class TouchLayoutCompiler { - public compileToJavascript(source: LDMLKeyboard.LDMLKeyboardXMLSourceFile): TouchLayout.TouchLayoutFile { - let result: TouchLayout.TouchLayoutFile = {}; - - // start with desktop to mimic vk emit - result.desktop = { - defaultHint: "none", // TODO-LDML this should be optional - layer: [] - }; - - for(let layers of source.keyboard3.layers) { - for(let layer of layers.layer) { - const resultLayer = this.compileHardwareLayer(source, result, layer); - result.desktop.layer.push(resultLayer); - } - } - return result; - } - - private compileHardwareLayer( - source: LDMLKeyboard.LDMLKeyboardXMLSourceFile, - file: TouchLayout.TouchLayoutFile, - layer: LDMLKeyboard.LKLayer - ) { - // TODO-LDML: consider consolidation with keys.ts? - - let fileLayer: TouchLayout.TouchLayoutLayer = { - id: this.translateLayerIdToTouchLayoutLayerId(layer.id, layer.modifiers), - row: [] - }; - - let y = -1; - - for(let row of layer.row) { - y++; - - let fileRow: TouchLayout.TouchLayoutRow = {id: y, key: []}; - fileLayer.row.push(fileRow); - - const keys = row.keys.split(' '); - for(let key of keys) { - const keydef = source.keyboard3.keys?.key?.find(x => x.id == key); - if(keydef) { - const fileKey: TouchLayout.TouchLayoutKey = { - id: this.translateKeyIdentifierToTouch(keydef.id) as TouchLayout.TouchLayoutKeyId, - text: keydef.output || '', - // TODO-LDML: additional properties - }; - fileRow.key.push(fileKey); - } else { - // TODO-LDML: consider logging missing keys - } - } - } - - return fileLayer; - } - - private translateLayerIdToTouchLayoutLayerId(id: string, modifier: string): string { - // Touch layout layers have a set of reserved names that correspond to - // hardware modifiers. We want to map these identifiers first before falling - // back to the layer ids - - // The set of recognized layer identifiers is: - // - // touch | LDML - // ---------------+------------- - // default | none - // shift | shift - // caps | caps - // rightalt | altR - // rightalt-shift | altR shift - // - const map = { - none: 'default', - shift: 'shift', - caps: 'caps', - altR: 'rightalt', - "altR shift": 'rightalt-shift' - }; - - // canonicalize modifier string, alphabetical - // TODO-LDML: need to support multiple here - if (modifier && modifier.indexOf(',') !== -1) { - throw Error(`Internal error: TODO-LDML: multiple modifiers ${modifier} not yet supported.`); - } - modifier = (modifier||'').split(/\b/).sort().join(' ').trim(); - - if(Object.hasOwn(map, modifier)) { - return (map as any)[modifier]; - } - - // TODO-LDML: Other layer names will be used unmodified, is this sufficient? - return id; - } - - private translateKeyIdentifierToTouch(id: string): string { - // Note: keys identifiers in kmx were traditionally case-insensitive, but we - // are going to use them as case-insensitive for LDML keyboards. The set of - // standard key identifiers a-z, A-Z, 0-9 will be used, where possible, and - // all other keys will be mapped to `T_key`. - - if(id.match(/^[0-9a-zA-Z]$/)) { - return 'K_'+id; - } - - // Not a standard key - return 'T_'+id; - } -} diff --git a/developer/src/kmc-ldml/src/compiler/visual-keyboard-compiler.ts b/developer/src/kmc-ldml/src/compiler/visual-keyboard-compiler.ts index 6d76bc403ea..7fda122dd37 100644 --- a/developer/src/kmc-ldml/src/compiler/visual-keyboard-compiler.ts +++ b/developer/src/kmc-ldml/src/compiler/visual-keyboard-compiler.ts @@ -1,6 +1,12 @@ -import { VisualKeyboard } from "@keymanapp/common-types"; -import { LDMLKeyboard, CompilerCallbacks } from "@keymanapp/developer-utils"; -import { KeysCompiler } from "./keys.js"; +/* + * Keyman is copyright (C) SIL International. MIT License. + * + * Export LDML data (https://www.unicode.org/reports/tr35/tr35-keyboards.html) + * to .kvk format. This is an interim solution until Keyman Core supports + * interrogation of the KMX+ data for OSK. + */ +import { ModifierKeyConstants, KMXPlus, VisualKeyboard } from "@keymanapp/common-types"; +import { CompilerCallbacks } from "@keymanapp/developer-utils"; import { LdmlCompilerMessages } from "./ldml-compiler-messages.js"; // This is a partial polyfill for findLast, so not polluting Array.prototype @@ -20,25 +26,37 @@ function findLast(arr: any, callback: any) { return undefined; } + +const LDML_MODIFIER_TO_KVK_MODIFIER = new Map(); +LDML_MODIFIER_TO_KVK_MODIFIER.set(ModifierKeyConstants.LCTRLFLAG, VisualKeyboard.VisualKeyboardShiftState.KVKS_LCTRL); +LDML_MODIFIER_TO_KVK_MODIFIER.set(ModifierKeyConstants.RCTRLFLAG, VisualKeyboard.VisualKeyboardShiftState.KVKS_RCTRL); +LDML_MODIFIER_TO_KVK_MODIFIER.set(ModifierKeyConstants.LALTFLAG, VisualKeyboard.VisualKeyboardShiftState.KVKS_LALT); +LDML_MODIFIER_TO_KVK_MODIFIER.set(ModifierKeyConstants.RALTFLAG, VisualKeyboard.VisualKeyboardShiftState.KVKS_RALT); +LDML_MODIFIER_TO_KVK_MODIFIER.set(ModifierKeyConstants.K_SHIFTFLAG, VisualKeyboard.VisualKeyboardShiftState.KVKS_SHIFT); +LDML_MODIFIER_TO_KVK_MODIFIER.set(ModifierKeyConstants.K_CTRLFLAG, VisualKeyboard.VisualKeyboardShiftState.KVKS_CTRL); +LDML_MODIFIER_TO_KVK_MODIFIER.set(ModifierKeyConstants.K_ALTFLAG, VisualKeyboard.VisualKeyboardShiftState.KVKS_ALT); + export class LdmlKeyboardVisualKeyboardCompiler { public constructor(private callbacks: CompilerCallbacks) { } - public compile(source: LDMLKeyboard.LDMLKeyboardXMLSourceFile): VisualKeyboard.VisualKeyboard { + public compile(source: KMXPlus.KMXPlusData, keyboardId: string): VisualKeyboard.VisualKeyboard { let result = new VisualKeyboard.VisualKeyboard(); /* TODO-LDML: consider VisualKeyboardHeaderFlags.kvkhUseUnderlying kvkhDisplayUnderlying kvkhAltGr kvkh102 */ result.header.flags = 0; result.header.version = 0x0600; - - /* TODO-LDML: consider associatedKeyboard: this _must_ be set to id (aka basename sans ext) of keyboard .kmx file */ - result.header.associatedKeyboard = ''; + result.header.associatedKeyboard = keyboardId; result.header.ansiFont = {...VisualKeyboard.DEFAULT_KVK_FONT}; result.header.unicodeFont = {...VisualKeyboard.DEFAULT_KVK_FONT}; - for(let layers of source.keyboard3.layers) { - const { formId } = layers; - for(let layer of layers.layer) { + for(let layersList of source.layr.lists) { + const formId = layersList.hardware.value; + if(formId == 'touch') { + continue; + } + + for(let layer of layersList.layers) { this.compileHardwareLayer(source, result, layer, formId); } } @@ -46,58 +64,74 @@ export class LdmlKeyboardVisualKeyboardCompiler { } private compileHardwareLayer( - source: LDMLKeyboard.LDMLKeyboardXMLSourceFile, + source: KMXPlus.KMXPlusData, vk: VisualKeyboard.VisualKeyboard, - layer: LDMLKeyboard.LKLayer, + layer: KMXPlus.LayrEntry, hardware: string, ) { - const layerId = layer.id; - if (hardware === 'touch') { - hardware = 'us'; // TODO-LDML: US Only. Do something different here? - } - const keymap = KeysCompiler.getKeymapFromForms(source.keyboard3?.forms?.form, hardware); - if (!keymap) { - this.callbacks.reportMessage( - LdmlCompilerMessages.Error_InvalidHardware({ formId: hardware }) - ); + const layerId = layer.id.value; + + hardware = 'us'; // TODO-LDML: US Only. We need to clean this up for other hardware forms + + const shift = this.translateLayerModifiersToVisualKeyboardShift(layer.mod); + if(shift === null) { + // Caps (num, scroll) is not a supported shift state in .kvk return; } - const shift = this.translateLayerIdToVisualKeyboardShift(layer.id); let y = -1; - for(let row of layer.row) { + for(let row of layer.rows) { y++; - - const keys = row.keys.split(' '); let x = -1; - for(let key of keys) { - const keyId = key; + for(let key of row.keys) { x++; - //@ts-ignore - let keydef = findLast(source.keyboard3.keys?.key, x => x.id == key); + const keydef: KMXPlus.KeysKeys = findLast(source.keys?.keys, (kd: KMXPlus.KeysKeys) => kd.id.value == key.value); + const kmap = source.keys.kmap.find(k => k.key == keydef.id.value && k.mod == layer.mod); + const text = this.getDisplayFromKey(keydef, source) ?? null; - if (!keydef) { + if (!keydef || !kmap || text === null) { this.callbacks.reportMessage( - LdmlCompilerMessages.Error_KeyNotFoundInKeyBag({ keyId, layer: layerId, row: y, col: x, form: hardware }) + LdmlCompilerMessages.Error_KeyNotFoundInKeyBag({ keyId: key.value, layer: layerId, row: y, col: x, form: hardware }) ); } else { vk.keys.push({ flags: VisualKeyboard.VisualKeyboardKeyFlags.kvkkUnicode, - shift: shift, - text: keydef.output, // TODO-LDML: displays - vkey: keymap[y][x], + shift, + text, + vkey: kmap.vkey }); } } } } - private translateLayerIdToVisualKeyboardShift(id: string) { - if(id == 'base') { - return 0; + private getDisplayFromKey(keydef: KMXPlus.KeysKeys, source: KMXPlus.KMXPlusData) { + const display = source.disp?.disps?.find(d => d.id.value == keydef.id.value || d.to.value == keydef.to.value); + return display?.display.value ?? keydef.to.value; + } + + private translateLayerModifiersToVisualKeyboardShift(modifiers: number): VisualKeyboard.VisualKeyboardShiftState { + + if(modifiers == 0) { + return VisualKeyboard.VisualKeyboardShiftState.KVKS_NORMAL; } - // TODO-LDML: other modifiers - return 0; + + if(modifiers & + (ModifierKeyConstants.CAPITALFLAG | ModifierKeyConstants.NUMLOCKFLAG | ModifierKeyConstants.SCROLLFLAG) + ) { + // Caps/Num/Scroll are not supported in .kvk, in combination or alone + return null; + } + + let shift: VisualKeyboard.VisualKeyboardShiftState = 0; + + for(const mod of LDML_MODIFIER_TO_KVK_MODIFIER.keys()) { + if(modifiers & mod) { + shift |= LDML_MODIFIER_TO_KVK_MODIFIER.get(mod); + } + } + + return shift; } } diff --git a/developer/src/kmc-ldml/test/fixtures/basic-kvk.txt b/developer/src/kmc-ldml/test/fixtures/basic-kvk.txt index 68666feacf3..da8f5e6011a 100644 --- a/developer/src/kmc-ldml/test/fixtures/basic-kvk.txt +++ b/developer/src/kmc-ldml/test/fixtures/basic-kvk.txt @@ -1,4 +1,6 @@ # +# Keyman is copyright (C) SIL International. MIT License. +# # basic-kvk.txt describes the expected output of running kmc against basic.xml to generate # a .kvk file. It is used in the end-to-end test test-visual-keyboard-compiler-e2e.ts. # @@ -10,8 +12,8 @@ block(kvkheader) 00 06 00 00 # version 0x0600 00 # flags block(associated_keyboard) - 01 00 # string len in UTF-16 code units incl zterm - 00 00 # '\0' + 06 00 # string len in UTF-16 code units incl zterm + 62 00 61 00 73 00 69 00 63 00 00 00 # 'basic\0' block(ansi_font) 06 00 # string len in UTF-16 code units incl zterm diff --git a/developer/src/kmc-ldml/test/fixtures/basic-no-debug.js b/developer/src/kmc-ldml/test/fixtures/basic-no-debug.js deleted file mode 100644 index 84168414cf8..00000000000 --- a/developer/src/kmc-ldml/test/fixtures/basic-no-debug.js +++ /dev/null @@ -1 +0,0 @@ -if(typeof keyman === 'undefined') {console.error('Keyboard requires KeymanWeb 16.0 or later');} else {KeymanWeb.KR(new Keyboard_basic());}function Keyboard_basic() {this.KI="Keyboard_basic";this.KN="TestKbd";this.KMINVER="16.0";this.KV={F: ' 1em "Arial"', K102: 0};this.KV.KLS={TODO_LDML: 2};this.KDU=1;this.KH="";this.KM=0;this.KBVER="1.0.0";this.KMBM=0;this.KVKL={"desktop":{"defaultHint":"none","layer":[{"id":"base","row":[{"id":"0","key":[{"id":"T_hmaqtugha","text":"ħ"},{"id":"T_that","text":"ថា"}]}]}],"displayUnderlying":false}};this.gs=function(t,e){return 0;};} diff --git a/developer/src/kmc-ldml/test/fixtures/basic.js b/developer/src/kmc-ldml/test/fixtures/basic.js deleted file mode 100644 index c74798cfac5..00000000000 --- a/developer/src/kmc-ldml/test/fixtures/basic.js +++ /dev/null @@ -1,48 +0,0 @@ -if(typeof keyman === 'undefined') { - console.error('Keyboard requires KeymanWeb 16.0 or later'); -} else { - KeymanWeb.KR(new Keyboard_basic()); -} -function Keyboard_basic() { - this.KI="Keyboard_basic"; - this.KN="TestKbd"; - this.KMINVER="16.0"; - this.KV={F: ' 1em "Arial"', K102: 0}; - this.KV.KLS={ - TODO_LDML: 2 - }; - this.KDU=1; - this.KH=""; - this.KM=0; - this.KBVER="1.0.0"; - this.KMBM=0; - this.KVKL={ - "desktop": { - "defaultHint": "none", - "layer": [ - { - "id": "base", - "row": [ - { - "id": "0", - "key": [ - { - "id": "T_hmaqtugha", - "text": "ħ" - }, - { - "id": "T_that", - "text": "ថា" - } - ] - } - ] - } - ], - "displayUnderlying": false - } -}; - this.gs=function(t,e){ - return 0; - }; -} diff --git a/developer/src/kmc-ldml/test/fixtures/basic.txt b/developer/src/kmc-ldml/test/fixtures/basic.txt index b471228a52c..6302a5eb276 100644 --- a/developer/src/kmc-ldml/test/fixtures/basic.txt +++ b/developer/src/kmc-ldml/test/fixtures/basic.txt @@ -1,4 +1,6 @@ # +# Keyman is copyright (C) SIL International. MIT License. +# # basic.txt describes the expected output of running kmc against basic.xml. It is used in # the end-to-end test test-compiler-e2e.ts. # @@ -402,7 +404,7 @@ block(layr) # struct COMP_KMXPLUS_LAYR { 01 00 00 00 # count 7B 00 00 00 # KMX_DWORD minDeviceWidth; // 123 # layers 0 - index(strNull,strBase,2) # KMXPLUS_STR id; + 00 00 00 00 # KMXPLUS_STR id; 00 00 00 00 # KMX_DWORD mod 00 00 00 00 # KMX_DWORD row index 01 00 00 00 # KMX_DWORD count @@ -502,7 +504,6 @@ block(strs) # struct COMP_KMXPLUS_STRS { diff(strs,strSet) sizeof(strSet,2) diff(strs,strSet2) sizeof(strSet2,2) diff(strs,strTranTo) sizeof(strTranTo,2) - diff(strs,strBase) sizeof(strBase,2) diff(strs,strElemBkspFrom2) sizeof(strElemBkspFrom2,2) diff(strs,strGapReserved) sizeof(strGapReserved,2) diff(strs,strHmaqtugha) sizeof(strHmaqtugha,2) @@ -538,7 +539,6 @@ block(strs) # struct COMP_KMXPLUS_STRS { #str #0A block(strSet2) 61 00 62 00 63 00 block(x) 00 00 # 'abc' block(strTranTo) 61 00 02 03 block(x) 00 00 # 'â' (U+0061 U+0302) - block(strBase) 62 00 61 00 73 00 65 00 block(x) 00 00 # 'base' block(strElemBkspFrom2) 65 00 block(x) 00 00 # 'e' block(strGapReserved) 67 00 61 00 70 00 20 00 28 00 72 00 65 00 73 00 65 00 72 00 76 00 65 00 64 00 29 00 block(x) 00 00 # 'gap (reserved)' block(strHmaqtugha) 68 00 6d 00 61 00 71 00 74 00 75 00 67 00 68 00 61 00 block(x) 00 00 # 'hmaqtugha' diff --git a/developer/src/kmc-ldml/test/fixtures/basic.xml b/developer/src/kmc-ldml/test/fixtures/basic.xml index c8565271ed1..168ee0ef9a0 100644 --- a/developer/src/kmc-ldml/test/fixtures/basic.xml +++ b/developer/src/kmc-ldml/test/fixtures/basic.xml @@ -1,4 +1,5 @@ + + diff --git a/developer/src/kmc-ldml/test/helpers/index.ts b/developer/src/kmc-ldml/test/helpers/index.ts index 0285088acc3..e1463e81169 100644 --- a/developer/src/kmc-ldml/test/helpers/index.ts +++ b/developer/src/kmc-ldml/test/helpers/index.ts @@ -1,17 +1,18 @@ -/** +/* + * Keyman is copyright (C) SIL International. MIT License. + * * Helpers and utilities for the Mocha tests. */ import 'mocha'; import * as path from 'path'; import { fileURLToPath } from 'url'; import { SectionCompiler, SectionCompilerNew } from '../../src/compiler/section-compiler.js'; -import { util, KMXPlus, UnicodeSetParser, VisualKeyboard } from '@keymanapp/common-types'; +import { util, KMXPlus, UnicodeSetParser } from '@keymanapp/common-types'; import { CompilerEvent, compilerEventFormat, CompilerCallbacks, LDMLKeyboardXMLSourceFileReader, LDMLKeyboardTestDataXMLSourceFile, LDMLKeyboard, } from "@keymanapp/developer-utils"; import { LdmlKeyboardCompiler } from '../../src/main.js'; // make sure main.js compiles import { assert } from 'chai'; import { KMXPlusMetadataCompiler } from '../../src/compiler/metadata-compiler.js'; import { LdmlCompilerOptions } from '../../src/compiler/ldml-compiler-options.js'; -import { LdmlKeyboardVisualKeyboardCompiler } from '../../src/compiler/visual-keyboard-compiler.js'; import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; import KMXPlusFile = KMXPlus.KMXPlusFile; @@ -21,7 +22,6 @@ import Section = KMXPlus.Section; import { ElemCompiler, ListCompiler, StrsCompiler } from '../../src/compiler/empty-compiler.js'; import { KmnCompiler } from '@keymanapp/kmc-kmn'; import { VarsCompiler } from '../../src/compiler/vars.js'; -// import Vars = KMXPlus.Vars; /** * Builds a path to the fixture with the given path components. @@ -48,7 +48,7 @@ beforeEach(function() { afterEach(function() { if (this.currentTest.state !== 'passed') { - compilerTestCallbacks.messages.forEach(message => console.log(message.message)); + compilerTestCallbacks.printMessages(); } }); @@ -161,28 +161,7 @@ export async function compileKeyboard(inputFilename: string, options: LdmlCompil return kmx; } -export async function compileVisualKeyboard(inputFilename: string, options: LdmlCompilerOptions): Promise { - const k = new LdmlKeyboardCompiler(); - assert.isTrue(await k.init(compilerTestCallbacks, options)); - const source = k.load(inputFilename); - checkMessages(); - assert.isNotNull(source, 'k.load should not have returned null'); - - const valid = await k.validate(source); - checkMessages(); - assert.isTrue(valid, 'k.validate should not have failed'); - - const vk = (new LdmlKeyboardVisualKeyboardCompiler(compilerTestCallbacks)).compile(source); - checkMessages(); - assert.isNotNull(vk, 'LdmlKeyboardVisualKeyboardCompiler.compile should not have returned null'); - - return vk; -} - export function checkMessages() { - if(compilerTestCallbacks.messages.length > 0) { - console.log(compilerTestCallbacks.messages); - } assert.isEmpty(compilerTestCallbacks.messages, compilerEventFormat(compilerTestCallbacks.messages)); } diff --git a/developer/src/kmc-ldml/test/test-keymanweb-compiler.ts b/developer/src/kmc-ldml/test/test-keymanweb-compiler.ts deleted file mode 100644 index 9a14b38c33d..00000000000 --- a/developer/src/kmc-ldml/test/test-keymanweb-compiler.ts +++ /dev/null @@ -1,50 +0,0 @@ -import 'mocha'; -import { assert } from 'chai'; -import { checkMessages, compilerTestCallbacks, compilerTestOptions, makePathToFixture } from './helpers/index.js'; -import { LdmlKeyboardKeymanWebCompiler } from '../src/compiler/keymanweb-compiler.js'; -import { LdmlKeyboardCompiler } from '../src/compiler/compiler.js'; -import * as fs from 'fs'; - -describe('LdmlKeyboardKeymanWebCompiler', function() { - - it('should build a .js file', async function() { - // Let's build basic.xml - // It should generate content identical to basic.js - const inputFilename = makePathToFixture('basic.xml'); - const outputFilename = makePathToFixture('basic.js'); - const outputFilenameNoDebug = makePathToFixture('basic-no-debug.js'); - - // Load input data; we'll use the LDML keyboard compiler loader to save us - // effort here - const k = new LdmlKeyboardCompiler(); - await k.init(compilerTestCallbacks, {...compilerTestOptions, saveDebug: true, shouldAddCompilerVersion: false}); - const source = k.load(inputFilename); - checkMessages(); - assert.isNotNull(source, 'k.load should not have returned null'); - - // Sanity check ... this is also checked in other tests - const valid = await k.validate(source); - checkMessages(); - assert.isTrue(valid, 'k.validate should not have failed'); - - // Actual test: compile to javascript - const jsCompiler = new LdmlKeyboardKeymanWebCompiler(compilerTestCallbacks, {...compilerTestOptions, saveDebug: true}); - const output = jsCompiler.compile('basic.xml', source); - assert.isNotNull(output); - - // Does the emitted js match? - const outputFixture = fs.readFileSync(outputFilename, 'utf-8').replaceAll(/\r\n/g, '\n'); - assert.strictEqual(output, outputFixture); - - // Second test: compile to javascript without debug formatting - const jsCompilerNoDebug = new LdmlKeyboardKeymanWebCompiler(compilerTestCallbacks, {...compilerTestOptions, saveDebug: false}); - const outputNoDebug = jsCompilerNoDebug.compile('basic.xml', source); - assert.isNotNull(outputNoDebug); - - // Does the emitted js match? The nodebug has no newline at end, but allow one in the fixture - const outputFixtureNoDebug = fs.readFileSync(outputFilenameNoDebug, 'utf-8').replaceAll(/\r\n/g, '\n').trim(); - assert.strictEqual(outputNoDebug, outputFixtureNoDebug); - - // TODO(lowpri): consider using Typescript parser to generate AST for further validation - }); -}); diff --git a/developer/src/kmc-ldml/test/test-visual-keyboard-compiler-e2e.ts b/developer/src/kmc-ldml/test/test-visual-keyboard-compiler-e2e.ts deleted file mode 100644 index df0aea03918..00000000000 --- a/developer/src/kmc-ldml/test/test-visual-keyboard-compiler-e2e.ts +++ /dev/null @@ -1,31 +0,0 @@ -import 'mocha'; -import {assert} from 'chai'; -import hextobin from '@keymanapp/hextobin'; -import { KvkFileWriter } from '@keymanapp/common-types'; -import {checkMessages, compilerTestOptions, compileVisualKeyboard, makePathToFixture} from './helpers/index.js'; - -describe('visual-keyboard-compiler', function() { - this.slow(500); // 0.5 sec -- json schema validation takes a while - - it('should build fixtures', async function() { - // Let's build basic.xml - // It should match basic.kvk (built from basic-kvk.txt) - - const inputFilename = makePathToFixture('basic.xml'); - const binaryFilename = makePathToFixture('basic-kvk.txt'); - - // Compile the visual keyboard - const vk = await compileVisualKeyboard(inputFilename, {...compilerTestOptions, saveDebug: true, shouldAddCompilerVersion: false}); - assert.isNotNull(vk); - - // Use the builder to generate the binary output file - const writer = new KvkFileWriter(); - const code = writer.write(vk); - checkMessages(); - assert.isNotNull(code); - - // Compare output - let expected = await hextobin(binaryFilename, undefined, {silent:true}); - assert.deepEqual(code, expected); - }); -}); diff --git a/developer/src/kmc-ldml/test/test-visual-keyboard-compiler.ts b/developer/src/kmc-ldml/test/test-visual-keyboard-compiler.ts new file mode 100644 index 00000000000..5435e32286a --- /dev/null +++ b/developer/src/kmc-ldml/test/test-visual-keyboard-compiler.ts @@ -0,0 +1,228 @@ +/* + * Keyman is copyright (C) SIL International. MIT License. + */ +import 'mocha'; +import * as path from 'path'; +import {assert} from 'chai'; +import { stripIndent } from 'common-tags'; + +import { KvkFileWriter, VisualKeyboard } from '@keymanapp/common-types'; +import hextobin from '@keymanapp/hextobin'; + +import { checkMessages, compilerTestCallbacks, compilerTestOptions, makePathToFixture } from './helpers/index.js'; + +import { LdmlKeyboardVisualKeyboardCompiler } from '../src/compiler/visual-keyboard-compiler.js'; +import { LDMLKeyboardXMLSourceFileReader } from '@keymanapp/developer-utils'; +import { LdmlKeyboardCompiler } from '../src/main.js'; + +describe('visual-keyboard-compiler', function() { + this.slow(500); // 0.5 sec -- json schema validation takes a while + + it('should build fixtures', async function() { + // Let's build basic.xml + + // It should match basic.kvk (built from basic-kvk.txt) + const inputFilename = makePathToFixture('basic.xml'); + const binaryFilename = makePathToFixture('basic-kvk.txt'); + + // Compile the visual keyboard + const k = new LdmlKeyboardCompiler(); + assert.isTrue(await k.init(compilerTestCallbacks, {...compilerTestOptions, saveDebug: true, shouldAddCompilerVersion: false})); + const source = k.load(inputFilename); + checkMessages(); + assert.isNotNull(source, 'k.load should not have returned null'); + + const valid = await k.validate(source); + checkMessages(); + assert.isTrue(valid, 'k.validate should not have failed'); + + let kmx = await k.compile(source); + assert(kmx, 'k.compile should not have failed'); + + const vk = (new LdmlKeyboardVisualKeyboardCompiler(compilerTestCallbacks)).compile(kmx.kmxplus, path.basename(inputFilename, '.xml')); + checkMessages(); + assert.isNotNull(vk, 'LdmlKeyboardVisualKeyboardCompiler.compile should not have returned null'); + + // Use the builder to generate the binary output file + const writer = new KvkFileWriter(); + const code = writer.write(vk); + assert.isEmpty(compilerTestCallbacks.messages); + assert.isNotNull(code); + + // Compare output + let expected = await hextobin(binaryFilename, undefined, {silent:true}); + + assert.deepEqual(code, expected); + }); + + it('should support various modifiers', async function() { + const xml = stripIndent` + + + + + + + + + + + + + + + `; + + const vk = await loadVisualKeyboardFromXml(xml, 'test'); + + assert.equal(vk.keys.length, 5); + assert.equal(vk.keys[0].shift, VisualKeyboard.VisualKeyboardShiftState.KVKS_NORMAL); + assert.equal(vk.keys[1].shift, VisualKeyboard.VisualKeyboardShiftState.KVKS_SHIFT); + assert.equal(vk.keys[2].shift, VisualKeyboard.VisualKeyboardShiftState.KVKS_RALT); + assert.equal(vk.keys[3].shift, VisualKeyboard.VisualKeyboardShiftState.KVKS_RCTRL | VisualKeyboard.VisualKeyboardShiftState.KVKS_RALT); + assert.equal(vk.keys[4].shift, VisualKeyboard.VisualKeyboardShiftState.KVKS_SHIFT | VisualKeyboard.VisualKeyboardShiftState.KVKS_RALT); + }); + + it('should emit the correct associated keyboard id', async function() { + const xml = stripIndent` + + + + + + + + + + + `; + + const vk = await loadVisualKeyboardFromXml(xml, 'test'); + + assert.equal(vk.header.associatedKeyboard, 'test'); + }); + + it('should support ', async function() { + const xml = stripIndent` + + + + + + + + + + + + + + + + `; + + const vk = await loadVisualKeyboardFromXml(xml, 'test'); + + assert.equal(vk.keys.length, 2); + assert.equal(vk.keys[0].text, 'C'); + assert.equal(vk.keys[1].text, 'D'); + }); + + it('should correctly decode \\u{xxxx}', async function() { + const xml = stripIndent` + + + + + + + + + + + + + + + `; + + const vk = await loadVisualKeyboardFromXml(xml, 'test'); + + assert.equal(vk.keys.length, 2); + assert.equal(vk.keys[0].text, '\u{0e80}'); + assert.equal(vk.keys[1].text, '\u{0e81}'); + }); + + it.skip('should read string variables in key.output', async function() { + const xml = stripIndent` + + + + + + + + + + + + + + + `; + + const vk = await loadVisualKeyboardFromXml(xml, 'test'); + + assert.equal(vk.keys.length, 1); + assert.equal(vk.keys[0].text, '2'); + }); + + it.skip('should read string variables in display.display', async function() { + const xml = stripIndent` + + + + + + + + + + + + + + + + + + `; + + const vk = await loadVisualKeyboardFromXml(xml, 'test'); + + assert.equal(vk.keys.length, 1); + assert.equal(vk.keys[0].text, '2'); + }); +}); + +async function loadVisualKeyboardFromXml(xml: string, id: string) { + const data = new TextEncoder().encode(xml); + assert.isOk(data); + + const reader = new LDMLKeyboardXMLSourceFileReader(compilerTestOptions.readerOptions, compilerTestCallbacks); + const source = reader.load(data); + assert.isEmpty(compilerTestCallbacks.messages); + assert.isOk(source); + + const k = new LdmlKeyboardCompiler(); + assert.isTrue(await k.init(compilerTestCallbacks, compilerTestOptions)); + + const kmx = await k.compile(source); + assert(kmx, 'k.compile should not have failed'); + + const vk = (new LdmlKeyboardVisualKeyboardCompiler(compilerTestCallbacks)).compile(kmx.kmxplus, id); + assert.isEmpty(compilerTestCallbacks.messages); + assert.isOk(vk); + + return vk; +} diff --git a/package-lock.json b/package-lock.json index 29f478ef072..5172f5bdee7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1146,11 +1146,13 @@ "devDependencies": { "@keymanapp/developer-test-helpers": "*", "@keymanapp/resources-gosh": "*", + "@types/common-tags": "^1.8.4", "@types/mocha": "^5.2.7", "@types/node": "^20.4.1", "@types/semver": "^7.3.12", "c8": "^7.12.0", "chalk": "^2.4.2", + "common-tags": "^1.8.2", "mocha": "^8.4.0", "typescript": "^5.4.5" } @@ -4408,6 +4410,13 @@ "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", "dev": true }, + "node_modules/@types/common-tags": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.4.tgz", + "integrity": "sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/connect": { "version": "3.4.35", "dev": true, @@ -6771,6 +6780,16 @@ "node": ">=14" } }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/compress-brotli": { "version": "1.3.6", "license": "MIT", From b7810bdd2ec46c19e5d6eb8eb82fd9c94cd9dcbd Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 12 Sep 2024 09:18:06 +0700 Subject: [PATCH 040/119] fix(developer): check vars string usage before definition Validation of vars was not properly checking for forward references to string variables. This, coupled with a null vs undefined bug in subsequent use, meant that forward reference variables were ending up with a literal string value of 'undefined'. This also fixes the test for visual-keyboard-compiler, where the fixture was actually buggy and was the trigger for investigating this problem. Fixes: #12403 Relates-to: #12395 --- common/web/types/src/kmx/kmx-plus/kmx-plus.ts | 2 +- developer/src/kmc-ldml/src/compiler/vars.ts | 9 ++++++++- .../test/fixtures/sections/vars/fail-badref-7.xml | 15 +++++++++++++++ developer/src/kmc-ldml/test/test-vars.ts | 9 ++++++++- .../test/test-visual-keyboard-compiler.ts | 8 ++++---- 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 developer/src/kmc-ldml/test/fixtures/sections/vars/fail-badref-7.xml diff --git a/common/web/types/src/kmx/kmx-plus/kmx-plus.ts b/common/web/types/src/kmx/kmx-plus/kmx-plus.ts index 1d19cdd4d01..d5b999ddee9 100644 --- a/common/web/types/src/kmx/kmx-plus/kmx-plus.ts +++ b/common/web/types/src/kmx/kmx-plus/kmx-plus.ts @@ -291,7 +291,7 @@ export class Vars extends Section { }); } findStringVariableValue(id: string): string { - return Vars.findVariable(this.strings, id)?.value?.value; // Unwrap: Variable, StrsItem + return Vars.findVariable(this.strings, id)?.value?.value ?? null; // Unwrap: Variable, StrsItem } substituteSetRegex(str: string, sections: DependencySections): string { return str.replaceAll(VariableParser.SET_REFERENCE, (_entire, id) => { diff --git a/developer/src/kmc-ldml/src/compiler/vars.ts b/developer/src/kmc-ldml/src/compiler/vars.ts index fb9b2f75965..39bc9304af9 100644 --- a/developer/src/kmc-ldml/src/compiler/vars.ts +++ b/developer/src/kmc-ldml/src/compiler/vars.ts @@ -68,9 +68,16 @@ export class VarsCompiler extends SectionCompiler { // Strings for (const { id, value } of variables.string) { addId(id); - allStrings.add(id); const stringrefs = VariableParser.allStringReferences(value); + for(const ref of stringrefs) { + if(!allStrings.has(ref)) { + valid = false; + this.callbacks.reportMessage(LdmlCompilerMessages.Error_MissingStringVariable({id: ref})); + allStrings.add(ref); // avoids multiple reports of same missing variable + } + } st.string.add(SubstitutionUse.variable, stringrefs); + allStrings.add(id); } // Sets for (const { id, value } of variables.set) { diff --git a/developer/src/kmc-ldml/test/fixtures/sections/vars/fail-badref-7.xml b/developer/src/kmc-ldml/test/fixtures/sections/vars/fail-badref-7.xml new file mode 100644 index 00000000000..25e7c46a1d4 --- /dev/null +++ b/developer/src/kmc-ldml/test/fixtures/sections/vars/fail-badref-7.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/developer/src/kmc-ldml/test/test-vars.ts b/developer/src/kmc-ldml/test/test-vars.ts index 42b5d7df809..d513574ee8e 100644 --- a/developer/src/kmc-ldml/test/test-vars.ts +++ b/developer/src/kmc-ldml/test/test-vars.ts @@ -187,7 +187,14 @@ describe('vars', function () { LdmlCompilerMessages.Error_MissingStringVariable({id: 'missingStringInSet'}) ], }, - ], varsDependencies); + { + subpath: 'sections/vars/fail-badref-7.xml', + errors: [ + LdmlCompilerMessages.Error_MissingStringVariable({id: 'usedBeforeDefinition'}) + ], + strictErrors: true + }, +], varsDependencies); describe('should match some marker constants', () => { // neither of these live here, but, common/web/types does not import ldml-keyboard-constants otherwise. diff --git a/developer/src/kmc-ldml/test/test-visual-keyboard-compiler.ts b/developer/src/kmc-ldml/test/test-visual-keyboard-compiler.ts index 5435e32286a..8cf2234fd3f 100644 --- a/developer/src/kmc-ldml/test/test-visual-keyboard-compiler.ts +++ b/developer/src/kmc-ldml/test/test-visual-keyboard-compiler.ts @@ -153,7 +153,7 @@ describe('visual-keyboard-compiler', function() { assert.equal(vk.keys[1].text, '\u{0e81}'); }); - it.skip('should read string variables in key.output', async function() { + it('should read string variables in key.output', async function() { const xml = stripIndent` @@ -165,8 +165,8 @@ describe('visual-keyboard-compiler', function() { - + `; @@ -177,7 +177,7 @@ describe('visual-keyboard-compiler', function() { assert.equal(vk.keys[0].text, '2'); }); - it.skip('should read string variables in display.display', async function() { + it('should read string variables in display.display', async function() { const xml = stripIndent` @@ -192,8 +192,8 @@ describe('visual-keyboard-compiler', function() { - + `; From a99ca4f120cb157f4f6c09302d2a4adf5e3e89a4 Mon Sep 17 00:00:00 2001 From: Shawn Schantz Date: Thu, 12 Sep 2024 19:57:10 +0700 Subject: [PATCH 041/119] change(mac): overhauled logic for determining input method state uses Carbon APIs to determine current input source This, combined with text input client is used to determine whether Keyman is truly active or not. Removed all code executing on delays and immediately checks state and shows/hides OSK and enables/disables eventTap. --- .../Keyman4MacIM/KMInputController.m | 29 +- .../Keyman4MacIM/KMInputMethodLifecycle.h | 1 + .../Keyman4MacIM/KMInputMethodLifecycle.m | 266 ++++++++---------- 3 files changed, 135 insertions(+), 161 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m index 92495fd00ea..0e227de8bdb 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m @@ -1,10 +1,9 @@ -// -// KMInputController.m -// Keyman4MacIM -// -// Created by Serkan Kurt on 29/01/2015. -// Copyright (c) 2017 SIL International. All rights reserved. -// +/* + * Keyman is copyright (C) SIL International. MIT License. + * + * Created by Serkan Kurt on 2015-01-29. + * + */ #import "KMInputController.h" #import "KMInputMethodEventHandler.h" @@ -26,9 +25,7 @@ - (KMInputMethodAppDelegate *)appDelegate { - (id)initWithServer:(IMKServer *)server delegate:(id)delegate client:(id)inputClient { - NSRunningApplication *currApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; - NSString *clientAppId = [currApp bundleIdentifier]; - os_log_debug([KMLogs lifecycleLog], "initWithServer, active app: '%{public}@'", clientAppId); + os_log_debug([KMLogs lifecycleLog], "initWithServer, active app: '%{public}@'", [KMInputMethodLifecycle getClientApplicationId]); self = [super initWithServer:server delegate:delegate client:inputClient]; if (self) { @@ -64,6 +61,9 @@ - (void)handleBackspace:(NSEvent *)event { } } +/** + * The Keyman input method is deactivating because the user chose a different input method: notification from KMInputMethodLifecycle + */ - (void)inputMethodDeactivated:(NSNotification *)notification { os_log_debug([KMLogs lifecycleLog], "***KMInputController inputMethodDeactivated, deactivating eventHandler"); if (_eventHandler != nil) { @@ -71,15 +71,16 @@ - (void)inputMethodDeactivated:(NSNotification *)notification { } } +/** + * The user has switched to a different text input client: notification from KMInputMethodLifecycle + */ - (void)inputMethodChangedClient:(NSNotification *)notification { os_log_debug([KMLogs lifecycleLog], "***KMInputController inputMethodChangedClient, deactivating old eventHandler and activating new one"); if (_eventHandler != nil) { [_eventHandler deactivate]; } - NSRunningApplication *currentApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; - NSString *clientAppId = [currentApp bundleIdentifier]; - // TODO: remove client argument - _eventHandler = [[KMInputMethodEventHandler alloc] initWithClient:clientAppId client:nil]; + _eventHandler = [[KMInputMethodEventHandler alloc] initWithClient:[KMInputMethodLifecycle getClientApplicationId] client:self.client]; + } - (void)activateServer:(id)sender { diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.h b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.h index c8a06ddba92..62a3aac35d1 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.h @@ -15,6 +15,7 @@ extern NSString *const kInputMethodClientChangeNotification; @interface KMInputMethodLifecycle : NSObject + (KMInputMethodLifecycle *)shared; ++ (NSString*)getClientApplicationId; - (void)startLifecycle; - (void)activateClient:(id)client; - (void)deactivateClient:(id)client; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m index 0c7cfa4005c..bd5bd84270c 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m @@ -10,50 +10,37 @@ */ /** - * This class is needed because there are no available APIs or notifications in macOS that - * an input method can use to determine whether it is currently active. An input method runs - * in the background as an application but only receives events from text input clients - * when it is the active input method. + * This class is needed because many activateServer and deactivateServer messages sent from macOS + * to KMInputController, but they are not particularly reliable. Keyman receives some messages when it + * is not active and should not become active. It also receives messages when it is active, but there is no + * need to change state. For example, when a menu is clicked with Keyman active, macOS will send a + * deactivateServer message followed by an activateServer message when the menu is released. + * The messages may also arrive in an unexpected order. * - * Without any simple way to determine whether the input method is active, it is considered - * to be in an Active state if it has an active text input client that does not immediately get - * a deactivate method after activating. + * Instead of relying on the information conveyed in these messages, this class interprets them as a notification + * that the input method state may have changed. For the actual state of the input method, it gets the current + * input source using the Carbon APIs TISCopyCurrentKeyboardInputSource and TISGetInputSourceProperty. + * If the result is equal to "keyman.inputmethod.Keyman", then Keyman is the active input method. If, for + * example, the U.S. keyboard were selected, then the result would be "com.apple.keylayout.US". * - * It is important for state of the input method to be known so that the On-screen keyboard can - * be appropriately shown or hidden and the low-level event tap can be stopped or started. + * The state of the text input client is discovered using the NSRunningApplication frontmostApplication API. + * Knowing the current input method and the current text input client enables us to determine whether the + * state has actually changed and how to adjust to the new state. * - * The state of the input method is mostly determined by the calls that the OS makes to KMInputController. - * initWithServer is called when a new text input client is being used with Keyman - * activateServer is called to inform Keyman that the text input client is ready to send events - * deactivateServer is called when a client stops being used with Keyman - * - * Unfortunately, there is no way to distinguish between deactivate messages that result from - * 1) changing the text input client which is in use or - * 2) changing from Keyman to a different input method such as a system keyboard - * Because of this, we must set a timer after a deactivate to see if an activate follows it. - * If it does not, then we assume that the user has changed input methods and Keyman is inactive. - * - * Note that Keyman does not necessarily receive the deactivate before the activate, so - * that complicates the handling of these events. - * - * Additional complexity is encountered when receiving activate messages. After the Keyman input method - * becomes inactive, it can receive a pair of activate and deactivate messages in rapid succession. - * These are unexpected and may be generated by clicking on windows or selecting menus and - * may only be a few milliseconds apart. We want to ignore these false activate messages - * rather than showing the OSK and enabling the event tap and then immediately hiding and disabling. - * The false activate messages are detected by using a timer to ensure that when the - * state is Inactive, we only change to Active if we receive an activate message that is not followed - * immediately by a deactivate message. + * It is important for state to be known so that the On-screen keyboard can be appropriately shown or hidden + * and the low-level event tap can be stopped or started. */ #import "KMInputMethodLifecycle.h" #import "KMLogs.h" #import #import "KMSettingsRepository.h" +#import NSString *const kInputMethodActivatedNotification = @"kInputMethodActivatedNotification"; NSString *const kInputMethodDeactivatedNotification = @"kInputMethodDeactivatedNotification"; NSString *const kInputMethodClientChangeNotification = @"kInputMethodClientChangeNotification"; +NSString *const keymanInputMethodName = @"keyman.inputmethod.Keyman"; typedef enum { Started, @@ -61,15 +48,22 @@ Inactive } LifecycleState; +typedef enum { + None, + Activate, + Deactivate, + ChangeClients, +} TransitionType; + + @interface KMInputMethodLifecycle() -@property LifecycleState state; -@property NSMutableDictionary *activeTextInputClients; +@property LifecycleState lifecycleState; +@property NSString *inputSourceId; +@property NSString *clientApplicationId; @end @implementation KMInputMethodLifecycle -const double inactivityTimeout = 0.5; -const double minimumActiveDuration = 0.5; + (KMInputMethodLifecycle *)shared { static KMInputMethodLifecycle *shared = nil; @@ -84,8 +78,9 @@ + (KMInputMethodLifecycle *)shared { - (instancetype)init { self = [super init]; if (self) { - _state = Started; - _activeTextInputClients = [[NSMutableDictionary alloc] initWithCapacity:2]; + _lifecycleState = Started; + _inputSourceId = @""; + _clientApplicationId = @""; } return self; } @@ -94,175 +89,152 @@ - (instancetype)init { * called from Application Delgate during init */ - (void)startLifecycle { - _state = Started; + _lifecycleState = Started; } /** - * called when IMKInputController receives an activateServer message + * Use Carbon APIs to get the current input source or input method. Even though many Carbon APIs were deprecated and removed + * from the OS years ago, these and other low-level APIs are still supported (but apparently completely undocumented). */ -- (void)activateClient:(id)client { - os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle activateClient, client: %{public}@", client); - @synchronized(_activeTextInputClients) { - [self addActiveClient:client]; - } - - if (self.state == Started) { - /** - * If state is Started, then change clients and activate immediately. - * When Keyman is just starting, there does not appear to be any chance of receiving - * a pair of false activate/deactivate messages. - */ - [self changeClient]; - [self activateInputMethod]; - } else if (self.state == Inactive) { - /** - * Before activating the input method, wait and see if we receive an immediate deactivate call. - * If not, then it is safe to assume that we should change the state to Active. - */ - os_log_debug([KMLogs lifecycleLog], "before activating the inactive input method, wait for %1.1f seconds and call activateInputMethodIfNoDeactivation", minimumActiveDuration); - [self performSelector:@selector(activateInputMethodIfNoDeactivation:) withObject:nil afterDelay:minimumActiveDuration]; - } else if (self.state == Active) { - /** - * If the input method was already active, then just send a notification to change clients - */ - [self changeClient]; - } ++ (NSString*)getCurrentInputSourceId { + TISInputSourceRef inputSource = TISCopyCurrentKeyboardInputSource(); + NSString *inputSourceId = (__bridge NSString *)(TISGetInputSourceProperty(inputSource, kTISPropertyInputSourceID)); + return inputSourceId; } /** - * called when IMKInputController receives a deactivateServer message + * Get the bundle ID of the currently active text input client.. */ -- (void)deactivateClient:(id)client { - @synchronized(_activeTextInputClients) { - os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle deactivateClient, client: %{public}@", client); - [self removeActiveClient: client]; - - /** - * If the input method is currently Active, and we removed the last client, wait and see if another client is activated. - * If not, then it is time to deactivate the input method. - * - * If the input method is currently Inactive, then we may be here during the delay before invoking - * activateInputMethodIfNoDeactivation. In that case there is nothing special to do here, simply removing the - * client - */ - - if ((self.state == Active) && (self.activeTextInputClients.count == 0)) { - os_log_debug([KMLogs lifecycleLog], "no text input clients found in activeTextInputClients map; delay for %1.1f seconds and call deactivateInputMethodIfNoClients", inactivityTimeout); - [self performSelector:@selector(deactivateInputMethodIfNoClients:) withObject:nil afterDelay:inactivityTimeout]; - } - } ++ (NSString*)getClientApplicationId { + NSRunningApplication *currentApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; + NSString *clientAppId = [currentApp bundleIdentifier]; + return clientAppId; } /** - * Executed after a delay: if no deactivation was received, then the input method is now Active - */ -- (void)activateInputMethodIfNoDeactivation:(id)lastClient { - @synchronized(_activeTextInputClients) { - if (self.state == Inactive) { - if (self.activeTextInputClients.count > 0) { - [self logClients:@"activateInputMethodIfNoDeactivation found an active client, time to activate the input method"]; - [self activateInputMethod]; + * Based on the current lifecycleState and the input method state from the OS, determine how the state must transition. + */ +- (TransitionType)determineTransition:(NSString*)newInputSourceId withAppId:(NSString*)newClientAppId { + TransitionType transition = None; + BOOL inputSourceIsKeyman = [newInputSourceId isEqualTo:keymanInputMethodName]; + BOOL clientHasChanged = [self.clientApplicationId isNotEqualTo:newClientAppId]; + os_log_debug([KMLogs lifecycleLog], "determineTransition, current InputSourceId: %{public}@, new InputSourceId: %{public}@, current ClientAppId: %{public}@, new ClientAppId: %{public}@, inputSourceIsKeyman: %d, clientHasChanged: %d", self.inputSourceId, newInputSourceId, self.clientApplicationId, newClientAppId, inputSourceIsKeyman, clientHasChanged); + + switch (self.lifecycleState) { + case Started: + transition = Activate; + break; + case Active: + if (inputSourceIsKeyman) { + if (clientHasChanged) { + transition = ChangeClients; + } } else { - os_log_debug([KMLogs lifecycleLog], "activateInputMethodIfNoDeactivation found that the active client was removed, do not activate input method"); + transition = Deactivate; } - } + break; + case Inactive: + if (inputSourceIsKeyman) { + transition = Activate; + } + break; } + return transition; } /** - * Add to the list of active clients. There are usually zero or one clients in the list, but could - * bet two when we are late receiving a deactivate message. + * Update the input method state, consisting of the input source ID and the client application ID. */ -- (void)addActiveClient:(id)client { - NSRunningApplication *currentApp = [[NSWorkspace sharedWorkspace] frontmostApplication]; - NSString *clientAppId = [currentApp bundleIdentifier]; - NSString *keyString = [self keyForClient:client]; - os_log_debug([KMLogs lifecycleLog], " ++adding client application '%{public}@' to activeTextInputClients map, derived key: %{public}@", clientAppId, keyString); - [self.activeTextInputClients setObject:clientAppId forKey:keyString]; +- (void)saveNewInputMethodState:(NSString*)newInputSourceId withAppId:(NSString*)newClientAppId { + self.inputSourceId = newInputSourceId; + self.clientApplicationId = newClientAppId; } /** - * Create a key string from the hash of the client object to be used for storing in the activeTextInputClients map + * Called when IMKInputController receives an activateServer message */ -- (NSString*) keyForClient:(id)client { - NSUInteger key = ((NSObject*)client).hash; - NSString *keyString = [@(key) stringValue]; - return keyString; -} - -/** - * Executed after a delay: if there are still no clients, then deactivate the input method - */ -- (void)deactivateInputMethodIfNoClients:(id)lastClient { - @synchronized(_activeTextInputClients) { - if (self.activeTextInputClients.count == 0) { - if (self.state == Active) { - os_log_debug([KMLogs lifecycleLog], "deactivateInputMethodIfNoClients found no clients, time to deactivate"); - [self deactivateInputMethod]; - } - } else { - [self logClients:@"deactivateInputMethodIfNoClients found a newly activated client, "]; - } +- (void)performTransition:(id)client { + NSString *currentInputSource = [KMInputMethodLifecycle getCurrentInputSourceId]; + NSString *currentClientAppId = [KMInputMethodLifecycle getClientApplicationId]; + + TransitionType transition = [self determineTransition:currentInputSource withAppId:currentClientAppId]; + [self saveNewInputMethodState:currentInputSource withAppId:currentClientAppId]; + + switch(transition) { + case None: + os_log_info([KMLogs lifecycleLog], "performTransition: None, new InputSourceId: %{public}@, new application ID: %{public}@", currentInputSource, currentClientAppId); + break; + case Activate: + os_log_info([KMLogs lifecycleLog], "performTransition: Activate, new InputSourceId: %{public}@, new application ID: %{public}@", currentInputSource, currentClientAppId); + [self changeClient]; + [self activateInputMethod]; + break; + case Deactivate: + os_log_info([KMLogs lifecycleLog], "performTransition: Deactivate, new InputSourceId: %{public}@, new application ID: %{public}@", currentInputSource, currentClientAppId); + [self deactivateInputMethod]; + break; + case ChangeClients: + os_log_info([KMLogs lifecycleLog], "performTransition: ChangeClients, new InputSourceId: %{public}@, new application ID: %{public}@", currentInputSource, currentClientAppId); + [self changeClient]; + break; } } - + /** - * Remove from the list of active clients. + * Called when IMKInputController receives an activateServer message */ -- (void)removeActiveClient:(id)client { - NSString *keyString = [self keyForClient:client]; - NSString *clientAppId = [self.activeTextInputClients objectForKey:keyString]; - if (clientAppId) { - os_log_debug([KMLogs lifecycleLog], " --removing client application '%{public}@' from activeTextInputClients map, key: %{public}@", clientAppId, keyString); - [self.activeTextInputClients removeObjectForKey:keyString]; - } else { - os_log_debug([KMLogs lifecycleLog], " key %{public}@ not found in activeTextInputClients map", keyString); - } +- (void)activateClient:(id)client { + os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle activateClient"); + [self performTransition:client]; } /** - * Write the client list to the log. + * Called when IMKInputController receives an deactivateServer message */ -- (void) logClients: (NSString*)message { - os_log_debug([KMLogs lifecycleLog], "%{public}@ activeTextInputClients map: %{public}@", message, self.activeTextInputClients.description); +- (void)deactivateClient:(id)client { + os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle deactivateClient"); + [self performTransition:client]; } /** - * Change state to Active and send notification. + * Change lifecycleState to Active and send notification. */ - (void)activateInputMethod { - _state = Active; + os_log_debug([KMLogs lifecycleLog], "activateInputMethod"); + _lifecycleState = Active; [[NSNotificationCenter defaultCenter] postNotificationName:kInputMethodActivatedNotification object:self]; } /** - * Change state to Inactive and send notification. + * Change lifecycleState to Inactive and send notification. */ - (void)deactivateInputMethod { - _state = Inactive; + os_log_debug([KMLogs lifecycleLog], "deactivateInputMethod"); + _lifecycleState = Inactive; [[NSNotificationCenter defaultCenter] postNotificationName:kInputMethodDeactivatedNotification object:self]; } /** - * does not change state, just fires notification so that InputController knows to change the event handler + * Does not change lifecycleState, just fires notification so that InputController knows to change the event handler */ - (void)changeClient { + os_log_debug([KMLogs lifecycleLog], "changeClient"); [[NSNotificationCenter defaultCenter] postNotificationName:kInputMethodClientChangeNotification object:self]; } /** - * returns true if Started or Active + * Returns true if Started or Active */ - (BOOL)shouldEnableEventTap { - return ((self.state == Started) || (self.state == Active)); + return ((self.lifecycleState == Started) || (self.lifecycleState == Active)); } /** - * returns true if state is Active and the Settings require us to show the OSK + * Returns true if lifecycleState is Active and the Settings require us to show the OSK */ - (BOOL)shouldShowOskOnActivate { return [KMSettingsRepository.shared readShowOskOnActivate] - && (self.state == Active); + && (self.lifecycleState == Active); } @end From d664797359c38f737fe4c5351713d40730c22304 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Fri, 13 Sep 2024 13:53:08 +0700 Subject: [PATCH 042/119] change(mac): attempt to fix sequoia failure to deactivate --- .../Keyman4MacIM/KMInputMethodLifecycle.m | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m index bd5bd84270c..129765c1977 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m @@ -41,6 +41,7 @@ NSString *const kInputMethodDeactivatedNotification = @"kInputMethodDeactivatedNotification"; NSString *const kInputMethodClientChangeNotification = @"kInputMethodClientChangeNotification"; NSString *const keymanInputMethodName = @"keyman.inputmethod.Keyman"; +const double postDeactivateDelay = 0.5; typedef enum { Started, @@ -151,7 +152,7 @@ - (void)saveNewInputMethodState:(NSString*)newInputSourceId withAppId:(NSString* } /** - * Called when IMKInputController receives an activateServer message + * Called when IMKInputController receives an activateServer or a deactivateServer message */ - (void)performTransition:(id)client { NSString *currentInputSource = [KMInputMethodLifecycle getCurrentInputSourceId]; @@ -194,6 +195,21 @@ - (void)activateClient:(id)client { - (void)deactivateClient:(id)client { os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle deactivateClient"); [self performTransition:client]; + + /** + * Called when IMKInputController receives an deactivateServer message + */ + if (@available(macOS 10.14, *)) { + os_log_debug([KMLogs lifecycleLog], "performing additional version check for Sonoma+"); + [self performSelector:@selector(checkForDelayedDeactivation:) withObject:client afterDelay:postDeactivateDelay]; + } + + +} + +- (void)checkForDeactivation:(id)client { + os_log_debug([KMLogs lifecycleLog], "checkForDelayedDeactivation"); + [self performTransition:client]; } /** From 4ec6144c647a360e94e3e1cd90d5043fcc9e750d Mon Sep 17 00:00:00 2001 From: sgschantz Date: Fri, 13 Sep 2024 14:53:16 +0700 Subject: [PATCH 043/119] change(mac): added delays before inputmethod state transition --- .../Keyman4MacIM/KMInputMethodLifecycle.m | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m index 129765c1977..194ced26e6c 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodLifecycle.m @@ -41,7 +41,7 @@ NSString *const kInputMethodDeactivatedNotification = @"kInputMethodDeactivatedNotification"; NSString *const kInputMethodClientChangeNotification = @"kInputMethodClientChangeNotification"; NSString *const keymanInputMethodName = @"keyman.inputmethod.Keyman"; -const double postDeactivateDelay = 0.5; +const double transitionDelay = 0.2; typedef enum { Started, @@ -186,7 +186,8 @@ - (void)performTransition:(id)client { */ - (void)activateClient:(id)client { os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle activateClient"); - [self performTransition:client]; + + [self performSelector:@selector(performTransitionAfterDelay:) withObject:client afterDelay:transitionDelay]; } /** @@ -194,21 +195,12 @@ - (void)activateClient:(id)client { */ - (void)deactivateClient:(id)client { os_log_debug([KMLogs lifecycleLog], "KMInputMethodLifecycle deactivateClient"); - [self performTransition:client]; - - /** - * Called when IMKInputController receives an deactivateServer message - */ - if (@available(macOS 10.14, *)) { - os_log_debug([KMLogs lifecycleLog], "performing additional version check for Sonoma+"); - [self performSelector:@selector(checkForDelayedDeactivation:) withObject:client afterDelay:postDeactivateDelay]; - } - + [self performSelector:@selector(performTransitionAfterDelay:) withObject:client afterDelay:transitionDelay]; } -- (void)checkForDeactivation:(id)client { - os_log_debug([KMLogs lifecycleLog], "checkForDelayedDeactivation"); +- (void)performTransitionAfterDelay:(id)client { + os_log_debug([KMLogs lifecycleLog], "performTransitionAfterDelay: calling performTransition"); [self performTransition:client]; } From f84cb89bd38cbd03b07988a193723b065d76f734 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Fri, 13 Sep 2024 14:02:52 -0400 Subject: [PATCH 044/119] auto: increment master version to 18.0.112 --- HISTORY.md | 6 ++++++ VERSION.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 5a962d00123..daa73787280 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,11 @@ # Keyman Version History +## 18.0.111 alpha 2024-09-13 + +* chore(common): Update crowdin strings for Italian (#12408) +* fix(common): correct offsets in KMX+ spec (#12350) +* fix(android): Add gating to setLongpressDelay() (#12410) + ## 18.0.110 alpha 2024-09-12 * chore(common): Update to Unicode 16.0 (#12393) diff --git a/VERSION.md b/VERSION.md index 5cf92dc732c..5df89fcfe12 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.111 \ No newline at end of file +18.0.112 \ No newline at end of file From ce1898a7096e1094bdb3503df82b8685dce8504a Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Sat, 14 Sep 2024 14:02:25 -0400 Subject: [PATCH 045/119] auto: increment master version to 18.0.113 --- HISTORY.md | 4 ++++ VERSION.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index daa73787280..42405d333fa 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,9 @@ # Keyman Version History +## 18.0.112 alpha 2024-09-14 + +* chore(deps): bump express from 4.19.2 to 4.20.0 (#12396) + ## 18.0.111 alpha 2024-09-13 * chore(common): Update crowdin strings for Italian (#12408) diff --git a/VERSION.md b/VERSION.md index 5df89fcfe12..1f080798dc3 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.112 \ No newline at end of file +18.0.113 \ No newline at end of file From 1ec1f0e1e8547303a68b144b54f9e0d17f95343b Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 16 Sep 2024 06:13:46 +0700 Subject: [PATCH 046/119] refactor(common): move help into common prod/docs/help folders Step 1 -- move all product help into docs/help folders. Next, will update corresponding scripts. Relates-to: #12347 --- android/{ => docs}/help/about/history.md | 0 android/{ => docs}/help/about/index.md | 0 android/{ => docs}/help/about/privacy.md | 0 .../{ => docs}/help/about/system-requirements.md | 0 android/{ => docs}/help/about/welcome.md | 0 android/{ => docs}/help/about/whatsnew.md | 0 .../help/android_images/adjust-height.png | Bin .../{ => docs}/help/android_images/backspace-ap.png | Bin .../{ => docs}/help/android_images/backspace-at.png | Bin .../{ => docs}/help/android_images/blank-osk.png | Bin .../{ => docs}/help/android_images/browser-a.png | Bin .../confirm-english-dictionary-delete-ap.png | Bin .../help/android_images/confirm-khmer-delete-ap.png | Bin android/{ => docs}/help/android_images/delete-a.png | Bin .../help/android_images/dist-file-browser-ap.png | Bin .../help/android_images/dist-file-browser-at.png | Bin .../help/android_images/dist-install1-ap.png | Bin .../help/android_images/dist-install1-at.png | Bin .../android_images/dist-storage-permission-ap.png | Bin .../android_images/dist-storage-permission-at.png | Bin .../help/android_images/dist-url-screen-ap.png | Bin .../help/android_images/dist-url-screen-at.png | Bin .../help/android_images/dl-success-ap.png | Bin .../help/android_images/english-dictionaries-ap.png | Bin .../android_images/english-dictionary-info-ap.png | Bin .../help/android_images/english-settings-ap.png | Bin .../{ => docs}/help/android_images/font-size-a.png | Bin .../help/android_images/get-started-a.png | Bin android/{ => docs}/help/android_images/globe-ap.png | Bin android/{ => docs}/help/android_images/globe-at.png | Bin .../help/android_images/hide-keyboard-ap.png | Bin .../help/android_images/hide-keyboard-at.png | Bin .../help/android_images/ic_cloud_download.png | Bin .../help/android_images/ic_content_add.png | Bin .../{ => docs}/help/android_images/ic_timelapse.png | Bin .../help/android_images/ic_translate_a.png | Bin .../{ => docs}/help/android_images/info-a-gray.png | Bin android/{ => docs}/help/android_images/info-a.png | Bin .../keyman-storage-permission-34b.png | Bin .../android_images/keyman-storage-permission-ap.png | Bin .../android_images/keyman-storage-permission-at.png | Bin .../help/android_images/khmer-downloading-a.png | Bin .../help/android_images/khmer-install-a.png | Bin .../help/android_images/khmer-readme-a.png | Bin .../help/android_images/khmer-search-a.png | Bin .../help/android_images/khmer-settings-ap.png | Bin .../help/android_images/khmer-welcome-a.png | Bin .../help/android_images/longpress-slider.png | Bin .../{ => docs}/help/android_images/menu-icon-a.png | Bin .../help/android_images/other-input-methods.png | Bin android/{ => docs}/help/android_images/plus-a.png | Bin .../help/android_images/reset-to-default.png | Bin .../{ => docs}/help/android_images/return-ap.png | Bin .../{ => docs}/help/android_images/return-at.png | Bin android/{ => docs}/help/android_images/return.png | Bin .../help/android_images/select_language.png | Bin .../settings-2-installed-languages-ap.png | Bin .../{ => docs}/help/android_images/settings-a.png | Bin .../settings-download-dictionary-background-ap.png | Bin .../settings-download-str-dictionary-ap.png | Bin .../help/android_images/settings-khmer-info-ap.png | Bin .../help/android_images/settings-language-ap.png | Bin .../help/android_images/settings-languages-ap.png | Bin .../help/android_images/settings-screen-ap.png | Bin .../settings-screen-install-keyboard-dictionary.png | Bin .../android_images/settings-str-dictionary-ap.png | Bin .../android_images/settings-str-settings-ap.png | Bin .../help/android_images/settings-suggestions-ap.png | Bin .../settings-two-installed-languages-ap.png | Bin .../{ => docs}/help/android_images/settings1-ap.png | Bin .../{ => docs}/help/android_images/settings1-at.png | Bin .../{ => docs}/help/android_images/settings2-ap.png | Bin .../{ => docs}/help/android_images/settings2-at.png | Bin .../{ => docs}/help/android_images/settings3-ap.png | Bin .../{ => docs}/help/android_images/settings3-at.png | Bin .../{ => docs}/help/android_images/settings4-ap.png | Bin .../{ => docs}/help/android_images/settings4-at.png | Bin .../{ => docs}/help/android_images/settings5-ap.png | Bin .../{ => docs}/help/android_images/settings5-at.png | Bin .../{ => docs}/help/android_images/settings6-ap.png | Bin .../{ => docs}/help/android_images/settings6-at.png | Bin .../{ => docs}/help/android_images/settings7-ap.png | Bin .../{ => docs}/help/android_images/settings7-at.png | Bin android/{ => docs}/help/android_images/share-a.png | Bin android/{ => docs}/help/android_images/shift-ap.png | Bin android/{ => docs}/help/android_images/shift-at.png | Bin .../help/android_images/spacebar-caption-ap.png | Bin .../help/android_images/themed-banner.png | Bin .../help/android_images/touch-hold-ap.png | Bin .../help/android_images/touch-hold-at.png | Bin .../uninstall-dictionary-notification-ap.png | Bin .../android_images/uninstall-notification-ap.png | Bin .../android_images/uninstall-notification-at.png | Bin android/{ => docs}/help/android_images/video.png | Bin .../help/basic/config/adjust-keyboard-height.md | 0 .../help/basic/config/adjust-longpress-delay.md | 0 android/{ => docs}/help/basic/config/index.md | 0 .../basic/config/install-keyboard-or-dictionary.md | 0 .../help/basic/config/spacebar-caption.md | 0 android/{ => docs}/help/basic/index.md | 0 .../help/basic/installing-custom-packages.md | 0 .../help/basic/installing-dictionaries.md | 0 .../help/basic/switching-between-keyboards.md | 0 .../help/basic/uninstalling-dictionaries.md | 0 .../{ => docs}/help/basic/uninstalling-keyboards.md | 0 android/{ => docs}/help/basic/using-the-banner.md | 0 android/{ => docs}/help/context/gestures.md | 0 android/{ => docs}/help/context/index.md | 0 android/{ => docs}/help/context/menu-phone.md | 0 android/{ => docs}/help/context/menu-tablet.md | 0 android/{ => docs}/help/index.md | 0 .../help/start/enabling-system-keyboard.md | 0 android/{ => docs}/help/start/index.md | 0 .../{ => docs}/help/start/installing-keyboards.md | 0 .../troubleshooting/grant-storage-permission.md | 0 android/{ => docs}/help/troubleshooting/index.md | 0 .../{ => docs}/help/troubleshooting/integrating.md | 0 .../help/troubleshooting/keyboard-help.md | 0 ios/{ => docs}/help/about/history.md | 0 ios/{ => docs}/help/about/index.md | 0 ios/{ => docs}/help/about/system-requirements.md | 0 ios/{ => docs}/help/about/welcome.md | 0 ios/{ => docs}/help/about/whatsnew.md | 0 ios/{ => docs}/help/basic/config/index.md | 0 .../help/basic/config/spacebar-caption.md | 0 ios/{ => docs}/help/basic/index.md | 0 .../installing-custom-keyboards-dictionaries.md | 0 ios/{ => docs}/help/basic/keyboard-usage.md | 0 ios/{ => docs}/help/basic/language-settings.md | 0 ios/{ => docs}/help/basic/sharing-keyboards.md | 0 .../help/basic/switching-between-keyboards.md | 0 ios/{ => docs}/help/basic/uninstalling-keyboards.md | 0 ios/{ => docs}/help/basic/using-keyman-browser.md | 0 ios/{ => docs}/help/basic/using-the-banner.md | 0 ios/{ => docs}/help/context/index.md | 0 ios/{ => docs}/help/index.md | 0 .../help/ios_images/add-keyboard-file-i.png | Bin ios/{ => docs}/help/ios_images/add-keyboard-i.png | Bin ios/{ => docs}/help/ios_images/add-keyboard-i2.png | Bin ios/{ => docs}/help/ios_images/add-keyboard-i3.png | Bin ios/{ => docs}/help/ios_images/backspace.png | Bin ios/{ => docs}/help/ios_images/browser-icon.png | Bin ios/{ => docs}/help/ios_images/confirm-dl.png | Bin .../help/ios_images/delete-keyboard-i.png | Bin .../help/ios_images/delete-keyboard-i2.png | Bin ios/{ => docs}/help/ios_images/delete.png | Bin ios/{ => docs}/help/ios_images/dictionary-list.png | Bin .../help/ios_images/dictionary-select.png | Bin ios/{ => docs}/help/ios_images/dist-install1-i.png | Bin ios/{ => docs}/help/ios_images/dist-kmp-open-i.png | Bin .../help/ios_images/dist-kmp-success-i.png | Bin .../help/ios_images/dist-url-screen-i.png | Bin ios/{ => docs}/help/ios_images/dist-welcome-i.png | Bin ios/{ => docs}/help/ios_images/dl-success.png | Bin ios/{ => docs}/help/ios_images/down-flick-i.gif | Bin ios/{ => docs}/help/ios_images/file-share-1i.png | Bin ios/{ => docs}/help/ios_images/file-share-2i.png | Bin ios/{ => docs}/help/ios_images/find-new.png | Bin ios/{ => docs}/help/ios_images/font-dl1.png | Bin ios/{ => docs}/help/ios_images/font-dl2.png | Bin ios/{ => docs}/help/ios_images/font-dl3.png | Bin ios/{ => docs}/help/ios_images/font-dl4.png | Bin ios/{ => docs}/help/ios_images/font-dl5.png | Bin ios/{ => docs}/help/ios_images/font-size.png | Bin ios/{ => docs}/help/ios_images/get-started.png | Bin ios/{ => docs}/help/ios_images/globe.png | Bin ios/{ => docs}/help/ios_images/hide-keyboard.png | Bin ios/{ => docs}/help/ios_images/in-app-picker-i.png | Bin ios/{ => docs}/help/ios_images/info.png | Bin ios/{ => docs}/help/ios_images/key-submenu.png | Bin .../help/ios_images/keyboard-search-1.png | Bin .../help/ios_images/keyboard-search-2.png | Bin .../help/ios_images/keyboard-search-3.png | Bin .../help/ios_images/keyboard-search-4.png | Bin .../help/ios_images/keyboard-search-5.png | Bin ios/{ => docs}/help/ios_images/keyman-settings.png | Bin ios/{ => docs}/help/ios_images/keyman-settings2.png | Bin ios/{ => docs}/help/ios_images/keyman-settings3.png | Bin ios/{ => docs}/help/ios_images/keyman-settings4.png | Bin ios/{ => docs}/help/ios_images/keyman-settings5.png | Bin ios/{ => docs}/help/ios_images/keyman-settings6.png | Bin .../help/ios_images/language-settings.png | Bin ios/{ => docs}/help/ios_images/menu-icon.png | Bin .../help/ios_images/package-install-1.png | Bin .../help/ios_images/package-install-2.png | Bin .../help/ios_images/package-install-3.png | Bin .../help/ios_images/package-install-4.png | Bin .../help/ios_images/package-install-5.png | Bin ios/{ => docs}/help/ios_images/qr-code-share-1i.png | Bin ios/{ => docs}/help/ios_images/qr-code-share-2i.png | Bin ios/{ => docs}/help/ios_images/qr-code-share-3i.png | Bin ios/{ => docs}/help/ios_images/qr-code-share-4i.png | Bin ios/{ => docs}/help/ios_images/return.png | Bin ios/{ => docs}/help/ios_images/settings-screen.png | Bin .../help/ios_images/settings-suggestions-i.png | Bin ios/{ => docs}/help/ios_images/share.png | Bin ios/{ => docs}/help/ios_images/shift.png | Bin ios/{ => docs}/help/ios_images/spacebar-caption.png | Bin .../help/ios_images/system-keyboard-cal.png | Bin ios/{ => docs}/help/ios_images/system-picker-i.png | Bin .../help/ios_images/system-wide-setting.png | Bin ios/{ => docs}/help/ios_images/themed-banner.png | Bin ios/{ => docs}/help/ios_images/touch-hold.png | Bin .../help/ios_images/uninstall-delete-i.png | Bin ios/{ => docs}/help/ios_images/uninstall-list-i.png | Bin ios/{ => docs}/help/ios_images/video.png | Bin ios/{ => docs}/help/start/index.md | 0 ios/{ => docs}/help/start/installing-packages.md | 0 .../help/start/installing-system-keyboard.md | 0 .../help/start/searching-for-keyboards.md | 0 ios/{ => docs}/help/troubleshooting/index.md | 0 .../help/troubleshooting/installing-fonts.md | 0 ios/{ => docs}/help/troubleshooting/integrating.md | 0 linux/{ => docs}/help/about/history.md | 0 linux/{ => docs}/help/about/index.md | 0 linux/{ => docs}/help/about/welcome.md | 0 linux/{ => docs}/help/about/whatsnew.md | 0 linux/{ => docs}/help/common/index.md | 0 linux/{ => docs}/help/index.md | 0 .../linux_images/add-input-source-khmer-angkor.png | Bin .../help/linux_images/add-input-source-khmer.png | Bin .../help/linux_images/add-input-source.png | Bin .../help/linux_images/download-khmer-angkor.png | Bin .../help/linux_images/km-config-khmer-angkor.png | Bin linux/{ => docs}/help/linux_images/km-config.png | Bin .../help/linux_images/mobile viewport.png | Bin linux/{ => docs}/help/linux_images/onboard.png | Bin .../linux_images/package-khmer-angkor-welcome.png | Bin .../help/linux_images/region-and-language.png | Bin .../linux_images/region-language-khmer-angkor.png | Bin .../help/linux_images/search-khmer-angkor.png | Bin linux/{ => docs}/help/linux_images/video.png | Bin linux/{ => docs}/help/reference/index.md | 0 linux/{ => docs}/help/start/index.md | 0 linux/{ => docs}/help/start/installing-keyboard.md | 0 mac/{ => docs}/help/about/history.md | 0 mac/{ => docs}/help/about/index.md | 0 mac/{ => docs}/help/about/requirements.md | 0 mac/{ => docs}/help/about/welcome.md | 0 mac/{ => docs}/help/about/whatsnew.md | 0 mac/{ => docs}/help/basic/config/index.md | 0 mac/{ => docs}/help/basic/config/keyboards.md | 0 mac/{ => docs}/help/basic/config/options.md | 0 mac/{ => docs}/help/basic/config/support.md | 0 mac/{ => docs}/help/basic/index.md | 0 mac/{ => docs}/help/common/adware.md | 0 mac/{ => docs}/help/common/bug.md | 0 mac/{ => docs}/help/common/free.md | 0 mac/{ => docs}/help/common/index.md | 0 mac/{ => docs}/help/common/keyboards.md | 0 mac/{ => docs}/help/common/os.md | 0 mac/{ => docs}/help/common/osk.md | 0 mac/{ => docs}/help/common/requirements.md | 0 mac/{ => docs}/help/common/support.md | 0 mac/{ => docs}/help/index.md | 0 mac/{ => docs}/help/mac_images/add.png | Bin mac/{ => docs}/help/mac_images/add_keyman.png | Bin mac/{ => docs}/help/mac_images/apple_menu.png | Bin mac/{ => docs}/help/mac_images/go_to_folder.png | Bin mac/{ => docs}/help/mac_images/help_button.png | Bin mac/{ => docs}/help/mac_images/icon-fonts.png | Bin mac/{ => docs}/help/mac_images/icon-help.png | Bin mac/{ => docs}/help/mac_images/icon-intro.png | Bin mac/{ => docs}/help/mac_images/icon-keyman.png | Bin mac/{ => docs}/help/mac_images/icon-osk.png | Bin mac/{ => docs}/help/mac_images/icon-unicode.png | Bin .../help/mac_images/information_button.png | Bin mac/{ => docs}/help/mac_images/input_menu.png | Bin mac/{ => docs}/help/mac_images/keyboards_menu.png | Bin mac/{ => docs}/help/mac_images/keyman_config.png | Bin mac/{ => docs}/help/mac_images/keyman_install.png | Bin .../help/mac_images/keyman_menu_config.png | Bin mac/{ => docs}/help/mac_images/menu_bar.png | Bin mac/{ => docs}/help/mac_images/menu_bar_keyman.png | Bin mac/{ => docs}/help/mac_images/osk_amharic.png | Bin .../help/mac_images/privacy_accessibility.png | Bin .../help/mac_images/privacy_files_and_folders.png | Bin .../help/mac_images/privacy_input_monitoring.png | Bin .../mac_images/privacy_input_monitoring_locked.png | Bin mac/{ => docs}/help/mac_images/remove.png | Bin mac/{ => docs}/help/mac_images/remove_button.png | Bin mac/{ => docs}/help/mac_images/remove_keyman.png | Bin .../help/mac_images/system_preferences.png | Bin mac/{ => docs}/help/mac_images/video.png | Bin mac/{ => docs}/help/start/index.md | 0 mac/{ => docs}/help/start/install-keyboard.md | 0 mac/{ => docs}/help/start/install-keyman.md | 0 mac/{ => docs}/help/start/tutorial.md | 0 .../help/troubleshooting/configure-security.md | 0 mac/{ => docs}/help/troubleshooting/index.md | 0 .../help/troubleshooting/uninstall-keyman.md | 0 windows/{src/desktop => docs}/help/Kmhelp.css | 0 windows/{src/desktop => docs}/help/about/credits.md | 0 windows/{src/desktop => docs}/help/about/history.md | 0 windows/{src/desktop => docs}/help/about/index.md | 0 windows/{src/desktop => docs}/help/about/license.md | 0 .../desktop => docs}/help/about/requirements.md | 0 windows/{src/desktop => docs}/help/about/welcome.md | 0 .../{src/desktop => docs}/help/about/whatsnew.md | 0 .../{src/desktop => docs}/help/advanced/index.md | 0 .../desktop => docs}/help/advanced/locale_edit.md | 0 .../desktop => docs}/help/advanced/proxy_config.md | 0 .../desktop => docs}/help/basic/config/hotkeys.md | 0 .../desktop => docs}/help/basic/config/index.md | 0 .../help/basic/config/keep-in-touch.md | 0 .../desktop => docs}/help/basic/config/keyboards.md | 0 .../desktop => docs}/help/basic/config/options.md | 0 .../desktop => docs}/help/basic/config/support.md | 0 .../help/basic/enable-or-disable-keyboard.md | 0 windows/{src/desktop => docs}/help/basic/help.md | 0 windows/{src/desktop => docs}/help/basic/index.md | 0 .../help/basic/language-switcher.md | 0 .../help/basic/make-taskbar-icon-visible.md | 0 .../help/basic/new-ways-to-use-keyman.md | 0 .../desktop => docs}/help/basic/select-keyboard.md | 0 .../{src/desktop => docs}/help/basic/text-editor.md | 0 .../help/basic/toolbox/character-map.md | 0 .../help/basic/toolbox/font-helper.md | 0 .../desktop => docs}/help/basic/toolbox/index.md | 0 .../{src/desktop => docs}/help/basic/toolbox/osk.md | 0 .../{src/desktop => docs}/help/basic/tray-menu.md | 0 .../help/basic/uninstall-keyboard.md | 0 .../{src/desktop => docs}/help/basic/uninstall.md | 0 windows/{src/desktop => docs}/help/basic/update.md | 0 windows/{src/desktop => docs}/help/common/adware.md | 0 windows/{src/desktop => docs}/help/common/bug.md | 0 .../desktop => docs}/help/common/compatibility.md | 0 windows/{src/desktop => docs}/help/common/free.md | 0 windows/{src/desktop => docs}/help/common/index.md | 0 windows/{src/desktop => docs}/help/common/linux.md | 0 windows/{src/desktop => docs}/help/common/mac.md | 0 .../desktop => docs}/help/common/old_version.md | 0 windows/{src/desktop => docs}/help/common/os.md | 0 windows/{src/desktop => docs}/help/common/osk.md | 0 .../desktop => docs}/help/common/requirements.md | 0 .../{src/desktop => docs}/help/common/support.md | 0 .../{src/desktop => docs}/help/common/unicode.md | 0 .../desktop => docs}/help/context/base-keyboard.md | 0 .../desktop => docs}/help/context/change-hotkey.md | 0 .../help/context/configuration-hotkeys.md | 0 .../help/context/configuration-keepintouch.md | 0 .../help/context/configuration-keyboards.md | 0 .../help/context/configuration-options.md | 0 .../help/context/configuration-support.md | 0 .../help/context/download-keyboard.md | 0 windows/{src/desktop => docs}/help/context/index.md | 0 .../help/context/install-keyboard-language.md | 0 .../help/context/install-keyboard.md | 0 .../{src/desktop => docs}/help/context/keyman.md | 0 .../desktop => docs}/help/context/online-update.md | 0 .../help/context/proxy-configuration.md | 0 .../{src/desktop => docs}/help/context/splash.md | 0 .../desktop => docs}/help/context/text-editor.md | 0 .../help/context/toolbox-charactermap.md | 0 .../help/context/toolbox-fonthelper.md | 0 .../help/context/toolbox-onscreenkeyboard.md | 0 .../{src/desktop => docs}/help/context/tray-menu.md | 0 .../help/desktop_images/7-taskbar.png | Bin .../help/desktop_images/charmap-big.png | Bin .../help/desktop_images/charmap-button.png | Bin .../help/desktop_images/charmap-filter.png | Bin .../help/desktop_images/charmap-filterdialog.png | Bin .../help/desktop_images/charmap-font.png | Bin .../help/desktop_images/charmap-goto.png | Bin .../help/desktop_images/charmap-insert.png | Bin .../help/desktop_images/charmap-options.png | Bin .../help/desktop_images/charmap-quality.png | Bin .../help/desktop_images/charmap.png | Bin .../help/desktop_images/config-locale.png | Bin .../help/desktop_images/download-keyboard-step0.png | Bin .../help/desktop_images/download-keyboard-step1.png | Bin .../help/desktop_images/download-keyboard-step2.png | Bin .../help/desktop_images/download-keyboard-step3.png | Bin .../help/desktop_images/download-keyboard-step4.png | Bin .../help/desktop_images/download-keyboard-step5.png | Bin .../help/desktop_images/download-keyboard-step6.png | Bin .../help/desktop_images/fonthelper.png | Bin .../help/desktop_images/help-dialog.png | Bin .../help/desktop_images/hotkeys-change.png | Bin .../help/desktop_images/icon-fonts.png | Bin .../help/desktop_images/icon-help.png | Bin .../help/desktop_images/icon-intro.png | Bin .../help/desktop_images/icon-introductory-help.png | Bin .../help/desktop_images/icon-keyman.png | Bin .../help/desktop_images/icon-osk.png | Bin .../help/desktop_images/icon-unicode.png | Bin .../help/desktop_images/icon-uninstall.png | Bin .../help/desktop_images/keyboard-share.png | Bin .../help/desktop_images/keyboards-downarrow.png | Bin .../help/desktop_images/km_install_anywhere_1.png | Bin .../help/desktop_images/km_install_anywhere_2.png | Bin .../help/desktop_images/km_install_anywhere_3.png | Bin .../help/desktop_images/km_non_app_store_1.png | Bin .../help/desktop_images/km_non_app_store_2.png | Bin .../help/desktop_images/lang-assoc-multi.png | Bin .../help/desktop_images/language-association.png | Bin .../help/desktop_images/language-bar.png | Bin .../help/desktop_images/languageswitcher-small.png | Bin .../help/desktop_images/languageswitcher.png | Bin .../desktop => docs}/help/desktop_images/menu.png | Bin .../help/desktop_images/menuicon-charmap.png | Bin .../help/desktop_images/menuicon-config.png | Bin .../help/desktop_images/menuicon-exit.png | Bin .../help/desktop_images/menuicon-fonthelper.png | Bin .../help/desktop_images/menuicon-help.png | Bin .../help/desktop_images/menuicon-osk.png | Bin .../help/desktop_images/menuicon-texteditor.png | Bin .../help/desktop_images/menuicon-usage.png | Bin .../help/desktop_images/options-advanced.png | Bin .../help/desktop_images/options-general.png | Bin .../help/desktop_images/options-hint.png | Bin .../help/desktop_images/options-osk.png | Bin .../help/desktop_images/options-startup.png | Bin .../help/desktop_images/osk-tibetan.png | Bin .../help/desktop_images/osk_keyboard.png | Bin .../help/desktop_images/proxy-config.png | Bin .../help/desktop_images/setup-click1.png | Bin .../help/desktop_images/setup-click2.png | Bin .../help/desktop_images/setup-click3.png | Bin .../help/desktop_images/start_tray.png | Bin .../help/desktop_images/tab-add-lang.png | Bin .../help/desktop_images/tab-add-popup.png | Bin .../help/desktop_images/tab-hotkeys.png | Bin .../help/desktop_images/tab-keyboards.png | Bin .../help/desktop_images/tab-layout-detail1.png | Bin .../help/desktop_images/tab-layout-detail2.png | Bin .../help/desktop_images/tab-layout-disable.png | Bin .../help/desktop_images/tab-layout-enable.png | Bin .../help/desktop_images/tab-layout-help.png | Bin .../help/desktop_images/tab-layout-share.png | Bin .../help/desktop_images/tab-layout.png | Bin .../help/desktop_images/tab-options.png | Bin .../help/desktop_images/tab-options2.png | Bin .../help/desktop_images/tab-support.png | Bin .../help/desktop_images/texteditor.png | Bin .../help/desktop_images/toolbox-options.png | Bin .../help/desktop_images/toolbox-toolbar.png | Bin .../help/desktop_images/toolboxicon-charmap.png | Bin .../help/desktop_images/toolboxicon-close.png | Bin .../help/desktop_images/toolboxicon-config.png | Bin .../help/desktop_images/toolboxicon-fonthelper.png | Bin .../help/desktop_images/toolboxicon-help.png | Bin .../help/desktop_images/toolboxicon-osk.png | Bin .../help/desktop_images/toolboxicon-usage.png | Bin .../desktop => docs}/help/desktop_images/video.png | Bin .../help/desktop_images/win10-taskbar1.png | Bin .../help/desktop_images/win10-taskbar2.png | Bin .../help/desktop_images/win10-taskbar3.png | Bin .../help/desktop_images/win11-taskbar1.png | Bin .../help/desktop_images/win11-taskbar2.png | Bin .../help/desktop_images/win11-uninstall.png | Bin .../desktop_images/win11_km_install_anywhere_1.png | Bin .../help/desktop_images/win8-taskbar1.png | Bin .../help/desktop_images/win8-taskbar2.png | Bin .../help/desktop_images/win8-taskbar3.png | Bin windows/{src/desktop => docs}/help/index.md | 0 .../{src/desktop => docs}/help/keymandesktop.hhp | 0 .../help/start/configure-computer.md | 0 .../desktop => docs}/help/start/configure_office.md | 0 .../help/start/download-and-install-keyboard.md | 0 .../help/start/download-and-install-keyman.md | 0 windows/{src/desktop => docs}/help/start/font.md | 0 .../{src/desktop => docs}/help/start/hotkey_set.md | 0 windows/{src/desktop => docs}/help/start/index.md | 0 windows/{src/desktop => docs}/help/start/locale.md | 0 windows/{src/desktop => docs}/help/start/rtl.md | 0 .../{src/desktop => docs}/help/start/tutorial.md | 0 .../help/troubleshooting/bootstrapper.md | 0 .../desktop => docs}/help/troubleshooting/excel.md | 0 .../desktop => docs}/help/troubleshooting/font.md | 0 .../desktop => docs}/help/troubleshooting/index.md | 0 .../troubleshooting/install-app-from-anywhere.md | 0 .../help/troubleshooting/securitysoftware.md | 0 .../desktop => docs}/help/troubleshooting/sigma.md | 0 474 files changed, 0 insertions(+), 0 deletions(-) rename android/{ => docs}/help/about/history.md (100%) rename android/{ => docs}/help/about/index.md (100%) rename android/{ => docs}/help/about/privacy.md (100%) rename android/{ => docs}/help/about/system-requirements.md (100%) rename android/{ => docs}/help/about/welcome.md (100%) rename android/{ => docs}/help/about/whatsnew.md (100%) rename android/{ => docs}/help/android_images/adjust-height.png (100%) rename android/{ => docs}/help/android_images/backspace-ap.png (100%) rename android/{ => docs}/help/android_images/backspace-at.png (100%) rename android/{ => docs}/help/android_images/blank-osk.png (100%) rename android/{ => docs}/help/android_images/browser-a.png (100%) rename android/{ => docs}/help/android_images/confirm-english-dictionary-delete-ap.png (100%) rename android/{ => docs}/help/android_images/confirm-khmer-delete-ap.png (100%) rename android/{ => docs}/help/android_images/delete-a.png (100%) rename android/{ => docs}/help/android_images/dist-file-browser-ap.png (100%) rename android/{ => docs}/help/android_images/dist-file-browser-at.png (100%) rename android/{ => docs}/help/android_images/dist-install1-ap.png (100%) rename android/{ => docs}/help/android_images/dist-install1-at.png (100%) rename android/{ => docs}/help/android_images/dist-storage-permission-ap.png (100%) rename android/{ => docs}/help/android_images/dist-storage-permission-at.png (100%) rename android/{ => docs}/help/android_images/dist-url-screen-ap.png (100%) rename android/{ => docs}/help/android_images/dist-url-screen-at.png (100%) rename android/{ => docs}/help/android_images/dl-success-ap.png (100%) rename android/{ => docs}/help/android_images/english-dictionaries-ap.png (100%) rename android/{ => docs}/help/android_images/english-dictionary-info-ap.png (100%) rename android/{ => docs}/help/android_images/english-settings-ap.png (100%) rename android/{ => docs}/help/android_images/font-size-a.png (100%) rename android/{ => docs}/help/android_images/get-started-a.png (100%) rename android/{ => docs}/help/android_images/globe-ap.png (100%) rename android/{ => docs}/help/android_images/globe-at.png (100%) rename android/{ => docs}/help/android_images/hide-keyboard-ap.png (100%) rename android/{ => docs}/help/android_images/hide-keyboard-at.png (100%) rename android/{ => docs}/help/android_images/ic_cloud_download.png (100%) rename android/{ => docs}/help/android_images/ic_content_add.png (100%) rename android/{ => docs}/help/android_images/ic_timelapse.png (100%) rename android/{ => docs}/help/android_images/ic_translate_a.png (100%) rename android/{ => docs}/help/android_images/info-a-gray.png (100%) rename android/{ => docs}/help/android_images/info-a.png (100%) rename android/{ => docs}/help/android_images/keyman-storage-permission-34b.png (100%) rename android/{ => docs}/help/android_images/keyman-storage-permission-ap.png (100%) rename android/{ => docs}/help/android_images/keyman-storage-permission-at.png (100%) rename android/{ => docs}/help/android_images/khmer-downloading-a.png (100%) rename android/{ => docs}/help/android_images/khmer-install-a.png (100%) rename android/{ => docs}/help/android_images/khmer-readme-a.png (100%) rename android/{ => docs}/help/android_images/khmer-search-a.png (100%) rename android/{ => docs}/help/android_images/khmer-settings-ap.png (100%) rename android/{ => docs}/help/android_images/khmer-welcome-a.png (100%) rename android/{ => docs}/help/android_images/longpress-slider.png (100%) rename android/{ => docs}/help/android_images/menu-icon-a.png (100%) rename android/{ => docs}/help/android_images/other-input-methods.png (100%) rename android/{ => docs}/help/android_images/plus-a.png (100%) rename android/{ => docs}/help/android_images/reset-to-default.png (100%) rename android/{ => docs}/help/android_images/return-ap.png (100%) rename android/{ => docs}/help/android_images/return-at.png (100%) rename android/{ => docs}/help/android_images/return.png (100%) rename android/{ => docs}/help/android_images/select_language.png (100%) rename android/{ => docs}/help/android_images/settings-2-installed-languages-ap.png (100%) rename android/{ => docs}/help/android_images/settings-a.png (100%) rename android/{ => docs}/help/android_images/settings-download-dictionary-background-ap.png (100%) rename android/{ => docs}/help/android_images/settings-download-str-dictionary-ap.png (100%) rename android/{ => docs}/help/android_images/settings-khmer-info-ap.png (100%) rename android/{ => docs}/help/android_images/settings-language-ap.png (100%) rename android/{ => docs}/help/android_images/settings-languages-ap.png (100%) rename android/{ => docs}/help/android_images/settings-screen-ap.png (100%) rename android/{ => docs}/help/android_images/settings-screen-install-keyboard-dictionary.png (100%) rename android/{ => docs}/help/android_images/settings-str-dictionary-ap.png (100%) rename android/{ => docs}/help/android_images/settings-str-settings-ap.png (100%) rename android/{ => docs}/help/android_images/settings-suggestions-ap.png (100%) rename android/{ => docs}/help/android_images/settings-two-installed-languages-ap.png (100%) rename android/{ => docs}/help/android_images/settings1-ap.png (100%) rename android/{ => docs}/help/android_images/settings1-at.png (100%) rename android/{ => docs}/help/android_images/settings2-ap.png (100%) rename android/{ => docs}/help/android_images/settings2-at.png (100%) rename android/{ => docs}/help/android_images/settings3-ap.png (100%) rename android/{ => docs}/help/android_images/settings3-at.png (100%) rename android/{ => docs}/help/android_images/settings4-ap.png (100%) rename android/{ => docs}/help/android_images/settings4-at.png (100%) rename android/{ => docs}/help/android_images/settings5-ap.png (100%) rename android/{ => docs}/help/android_images/settings5-at.png (100%) rename android/{ => docs}/help/android_images/settings6-ap.png (100%) rename android/{ => docs}/help/android_images/settings6-at.png (100%) rename android/{ => docs}/help/android_images/settings7-ap.png (100%) rename android/{ => docs}/help/android_images/settings7-at.png (100%) rename android/{ => docs}/help/android_images/share-a.png (100%) rename android/{ => docs}/help/android_images/shift-ap.png (100%) rename android/{ => docs}/help/android_images/shift-at.png (100%) rename android/{ => docs}/help/android_images/spacebar-caption-ap.png (100%) rename android/{ => docs}/help/android_images/themed-banner.png (100%) rename android/{ => docs}/help/android_images/touch-hold-ap.png (100%) rename android/{ => docs}/help/android_images/touch-hold-at.png (100%) rename android/{ => docs}/help/android_images/uninstall-dictionary-notification-ap.png (100%) rename android/{ => docs}/help/android_images/uninstall-notification-ap.png (100%) rename android/{ => docs}/help/android_images/uninstall-notification-at.png (100%) rename android/{ => docs}/help/android_images/video.png (100%) rename android/{ => docs}/help/basic/config/adjust-keyboard-height.md (100%) rename android/{ => docs}/help/basic/config/adjust-longpress-delay.md (100%) rename android/{ => docs}/help/basic/config/index.md (100%) rename android/{ => docs}/help/basic/config/install-keyboard-or-dictionary.md (100%) rename android/{ => docs}/help/basic/config/spacebar-caption.md (100%) rename android/{ => docs}/help/basic/index.md (100%) rename android/{ => docs}/help/basic/installing-custom-packages.md (100%) rename android/{ => docs}/help/basic/installing-dictionaries.md (100%) rename android/{ => docs}/help/basic/switching-between-keyboards.md (100%) rename android/{ => docs}/help/basic/uninstalling-dictionaries.md (100%) rename android/{ => docs}/help/basic/uninstalling-keyboards.md (100%) rename android/{ => docs}/help/basic/using-the-banner.md (100%) rename android/{ => docs}/help/context/gestures.md (100%) rename android/{ => docs}/help/context/index.md (100%) rename android/{ => docs}/help/context/menu-phone.md (100%) rename android/{ => docs}/help/context/menu-tablet.md (100%) rename android/{ => docs}/help/index.md (100%) rename android/{ => docs}/help/start/enabling-system-keyboard.md (100%) rename android/{ => docs}/help/start/index.md (100%) rename android/{ => docs}/help/start/installing-keyboards.md (100%) rename android/{ => docs}/help/troubleshooting/grant-storage-permission.md (100%) rename android/{ => docs}/help/troubleshooting/index.md (100%) rename android/{ => docs}/help/troubleshooting/integrating.md (100%) rename android/{ => docs}/help/troubleshooting/keyboard-help.md (100%) rename ios/{ => docs}/help/about/history.md (100%) rename ios/{ => docs}/help/about/index.md (100%) rename ios/{ => docs}/help/about/system-requirements.md (100%) rename ios/{ => docs}/help/about/welcome.md (100%) rename ios/{ => docs}/help/about/whatsnew.md (100%) rename ios/{ => docs}/help/basic/config/index.md (100%) rename ios/{ => docs}/help/basic/config/spacebar-caption.md (100%) rename ios/{ => docs}/help/basic/index.md (100%) rename ios/{ => docs}/help/basic/installing-custom-keyboards-dictionaries.md (100%) rename ios/{ => docs}/help/basic/keyboard-usage.md (100%) rename ios/{ => docs}/help/basic/language-settings.md (100%) rename ios/{ => docs}/help/basic/sharing-keyboards.md (100%) rename ios/{ => docs}/help/basic/switching-between-keyboards.md (100%) rename ios/{ => docs}/help/basic/uninstalling-keyboards.md (100%) rename ios/{ => docs}/help/basic/using-keyman-browser.md (100%) rename ios/{ => docs}/help/basic/using-the-banner.md (100%) rename ios/{ => docs}/help/context/index.md (100%) rename ios/{ => docs}/help/index.md (100%) rename ios/{ => docs}/help/ios_images/add-keyboard-file-i.png (100%) rename ios/{ => docs}/help/ios_images/add-keyboard-i.png (100%) rename ios/{ => docs}/help/ios_images/add-keyboard-i2.png (100%) rename ios/{ => docs}/help/ios_images/add-keyboard-i3.png (100%) rename ios/{ => docs}/help/ios_images/backspace.png (100%) rename ios/{ => docs}/help/ios_images/browser-icon.png (100%) rename ios/{ => docs}/help/ios_images/confirm-dl.png (100%) rename ios/{ => docs}/help/ios_images/delete-keyboard-i.png (100%) rename ios/{ => docs}/help/ios_images/delete-keyboard-i2.png (100%) rename ios/{ => docs}/help/ios_images/delete.png (100%) rename ios/{ => docs}/help/ios_images/dictionary-list.png (100%) rename ios/{ => docs}/help/ios_images/dictionary-select.png (100%) rename ios/{ => docs}/help/ios_images/dist-install1-i.png (100%) rename ios/{ => docs}/help/ios_images/dist-kmp-open-i.png (100%) rename ios/{ => docs}/help/ios_images/dist-kmp-success-i.png (100%) rename ios/{ => docs}/help/ios_images/dist-url-screen-i.png (100%) rename ios/{ => docs}/help/ios_images/dist-welcome-i.png (100%) rename ios/{ => docs}/help/ios_images/dl-success.png (100%) rename ios/{ => docs}/help/ios_images/down-flick-i.gif (100%) rename ios/{ => docs}/help/ios_images/file-share-1i.png (100%) rename ios/{ => docs}/help/ios_images/file-share-2i.png (100%) rename ios/{ => docs}/help/ios_images/find-new.png (100%) rename ios/{ => docs}/help/ios_images/font-dl1.png (100%) rename ios/{ => docs}/help/ios_images/font-dl2.png (100%) rename ios/{ => docs}/help/ios_images/font-dl3.png (100%) rename ios/{ => docs}/help/ios_images/font-dl4.png (100%) rename ios/{ => docs}/help/ios_images/font-dl5.png (100%) rename ios/{ => docs}/help/ios_images/font-size.png (100%) rename ios/{ => docs}/help/ios_images/get-started.png (100%) rename ios/{ => docs}/help/ios_images/globe.png (100%) rename ios/{ => docs}/help/ios_images/hide-keyboard.png (100%) rename ios/{ => docs}/help/ios_images/in-app-picker-i.png (100%) rename ios/{ => docs}/help/ios_images/info.png (100%) rename ios/{ => docs}/help/ios_images/key-submenu.png (100%) rename ios/{ => docs}/help/ios_images/keyboard-search-1.png (100%) rename ios/{ => docs}/help/ios_images/keyboard-search-2.png (100%) rename ios/{ => docs}/help/ios_images/keyboard-search-3.png (100%) rename ios/{ => docs}/help/ios_images/keyboard-search-4.png (100%) rename ios/{ => docs}/help/ios_images/keyboard-search-5.png (100%) rename ios/{ => docs}/help/ios_images/keyman-settings.png (100%) rename ios/{ => docs}/help/ios_images/keyman-settings2.png (100%) rename ios/{ => docs}/help/ios_images/keyman-settings3.png (100%) rename ios/{ => docs}/help/ios_images/keyman-settings4.png (100%) rename ios/{ => docs}/help/ios_images/keyman-settings5.png (100%) rename ios/{ => docs}/help/ios_images/keyman-settings6.png (100%) rename ios/{ => docs}/help/ios_images/language-settings.png (100%) rename ios/{ => docs}/help/ios_images/menu-icon.png (100%) rename ios/{ => docs}/help/ios_images/package-install-1.png (100%) rename ios/{ => docs}/help/ios_images/package-install-2.png (100%) rename ios/{ => docs}/help/ios_images/package-install-3.png (100%) rename ios/{ => docs}/help/ios_images/package-install-4.png (100%) rename ios/{ => docs}/help/ios_images/package-install-5.png (100%) rename ios/{ => docs}/help/ios_images/qr-code-share-1i.png (100%) rename ios/{ => docs}/help/ios_images/qr-code-share-2i.png (100%) rename ios/{ => docs}/help/ios_images/qr-code-share-3i.png (100%) rename ios/{ => docs}/help/ios_images/qr-code-share-4i.png (100%) rename ios/{ => docs}/help/ios_images/return.png (100%) rename ios/{ => docs}/help/ios_images/settings-screen.png (100%) rename ios/{ => docs}/help/ios_images/settings-suggestions-i.png (100%) rename ios/{ => docs}/help/ios_images/share.png (100%) rename ios/{ => docs}/help/ios_images/shift.png (100%) rename ios/{ => docs}/help/ios_images/spacebar-caption.png (100%) rename ios/{ => docs}/help/ios_images/system-keyboard-cal.png (100%) rename ios/{ => docs}/help/ios_images/system-picker-i.png (100%) rename ios/{ => docs}/help/ios_images/system-wide-setting.png (100%) rename ios/{ => docs}/help/ios_images/themed-banner.png (100%) rename ios/{ => docs}/help/ios_images/touch-hold.png (100%) rename ios/{ => docs}/help/ios_images/uninstall-delete-i.png (100%) rename ios/{ => docs}/help/ios_images/uninstall-list-i.png (100%) rename ios/{ => docs}/help/ios_images/video.png (100%) rename ios/{ => docs}/help/start/index.md (100%) rename ios/{ => docs}/help/start/installing-packages.md (100%) rename ios/{ => docs}/help/start/installing-system-keyboard.md (100%) rename ios/{ => docs}/help/start/searching-for-keyboards.md (100%) rename ios/{ => docs}/help/troubleshooting/index.md (100%) rename ios/{ => docs}/help/troubleshooting/installing-fonts.md (100%) rename ios/{ => docs}/help/troubleshooting/integrating.md (100%) rename linux/{ => docs}/help/about/history.md (100%) rename linux/{ => docs}/help/about/index.md (100%) rename linux/{ => docs}/help/about/welcome.md (100%) rename linux/{ => docs}/help/about/whatsnew.md (100%) rename linux/{ => docs}/help/common/index.md (100%) rename linux/{ => docs}/help/index.md (100%) rename linux/{ => docs}/help/linux_images/add-input-source-khmer-angkor.png (100%) rename linux/{ => docs}/help/linux_images/add-input-source-khmer.png (100%) rename linux/{ => docs}/help/linux_images/add-input-source.png (100%) rename linux/{ => docs}/help/linux_images/download-khmer-angkor.png (100%) rename linux/{ => docs}/help/linux_images/km-config-khmer-angkor.png (100%) rename linux/{ => docs}/help/linux_images/km-config.png (100%) rename linux/{ => docs}/help/linux_images/mobile viewport.png (100%) rename linux/{ => docs}/help/linux_images/onboard.png (100%) rename linux/{ => docs}/help/linux_images/package-khmer-angkor-welcome.png (100%) rename linux/{ => docs}/help/linux_images/region-and-language.png (100%) rename linux/{ => docs}/help/linux_images/region-language-khmer-angkor.png (100%) rename linux/{ => docs}/help/linux_images/search-khmer-angkor.png (100%) rename linux/{ => docs}/help/linux_images/video.png (100%) rename linux/{ => docs}/help/reference/index.md (100%) rename linux/{ => docs}/help/start/index.md (100%) rename linux/{ => docs}/help/start/installing-keyboard.md (100%) rename mac/{ => docs}/help/about/history.md (100%) rename mac/{ => docs}/help/about/index.md (100%) rename mac/{ => docs}/help/about/requirements.md (100%) rename mac/{ => docs}/help/about/welcome.md (100%) rename mac/{ => docs}/help/about/whatsnew.md (100%) rename mac/{ => docs}/help/basic/config/index.md (100%) rename mac/{ => docs}/help/basic/config/keyboards.md (100%) rename mac/{ => docs}/help/basic/config/options.md (100%) rename mac/{ => docs}/help/basic/config/support.md (100%) rename mac/{ => docs}/help/basic/index.md (100%) rename mac/{ => docs}/help/common/adware.md (100%) rename mac/{ => docs}/help/common/bug.md (100%) rename mac/{ => docs}/help/common/free.md (100%) rename mac/{ => docs}/help/common/index.md (100%) rename mac/{ => docs}/help/common/keyboards.md (100%) rename mac/{ => docs}/help/common/os.md (100%) rename mac/{ => docs}/help/common/osk.md (100%) rename mac/{ => docs}/help/common/requirements.md (100%) rename mac/{ => docs}/help/common/support.md (100%) rename mac/{ => docs}/help/index.md (100%) rename mac/{ => docs}/help/mac_images/add.png (100%) rename mac/{ => docs}/help/mac_images/add_keyman.png (100%) rename mac/{ => docs}/help/mac_images/apple_menu.png (100%) rename mac/{ => docs}/help/mac_images/go_to_folder.png (100%) rename mac/{ => docs}/help/mac_images/help_button.png (100%) rename mac/{ => docs}/help/mac_images/icon-fonts.png (100%) rename mac/{ => docs}/help/mac_images/icon-help.png (100%) rename mac/{ => docs}/help/mac_images/icon-intro.png (100%) rename mac/{ => docs}/help/mac_images/icon-keyman.png (100%) rename mac/{ => docs}/help/mac_images/icon-osk.png (100%) rename mac/{ => docs}/help/mac_images/icon-unicode.png (100%) rename mac/{ => docs}/help/mac_images/information_button.png (100%) rename mac/{ => docs}/help/mac_images/input_menu.png (100%) rename mac/{ => docs}/help/mac_images/keyboards_menu.png (100%) rename mac/{ => docs}/help/mac_images/keyman_config.png (100%) rename mac/{ => docs}/help/mac_images/keyman_install.png (100%) rename mac/{ => docs}/help/mac_images/keyman_menu_config.png (100%) rename mac/{ => docs}/help/mac_images/menu_bar.png (100%) rename mac/{ => docs}/help/mac_images/menu_bar_keyman.png (100%) rename mac/{ => docs}/help/mac_images/osk_amharic.png (100%) rename mac/{ => docs}/help/mac_images/privacy_accessibility.png (100%) rename mac/{ => docs}/help/mac_images/privacy_files_and_folders.png (100%) rename mac/{ => docs}/help/mac_images/privacy_input_monitoring.png (100%) rename mac/{ => docs}/help/mac_images/privacy_input_monitoring_locked.png (100%) rename mac/{ => docs}/help/mac_images/remove.png (100%) rename mac/{ => docs}/help/mac_images/remove_button.png (100%) rename mac/{ => docs}/help/mac_images/remove_keyman.png (100%) rename mac/{ => docs}/help/mac_images/system_preferences.png (100%) rename mac/{ => docs}/help/mac_images/video.png (100%) rename mac/{ => docs}/help/start/index.md (100%) rename mac/{ => docs}/help/start/install-keyboard.md (100%) rename mac/{ => docs}/help/start/install-keyman.md (100%) rename mac/{ => docs}/help/start/tutorial.md (100%) rename mac/{ => docs}/help/troubleshooting/configure-security.md (100%) rename mac/{ => docs}/help/troubleshooting/index.md (100%) rename mac/{ => docs}/help/troubleshooting/uninstall-keyman.md (100%) rename windows/{src/desktop => docs}/help/Kmhelp.css (100%) rename windows/{src/desktop => docs}/help/about/credits.md (100%) rename windows/{src/desktop => docs}/help/about/history.md (100%) rename windows/{src/desktop => docs}/help/about/index.md (100%) rename windows/{src/desktop => docs}/help/about/license.md (100%) rename windows/{src/desktop => docs}/help/about/requirements.md (100%) rename windows/{src/desktop => docs}/help/about/welcome.md (100%) rename windows/{src/desktop => docs}/help/about/whatsnew.md (100%) rename windows/{src/desktop => docs}/help/advanced/index.md (100%) rename windows/{src/desktop => docs}/help/advanced/locale_edit.md (100%) rename windows/{src/desktop => docs}/help/advanced/proxy_config.md (100%) rename windows/{src/desktop => docs}/help/basic/config/hotkeys.md (100%) rename windows/{src/desktop => docs}/help/basic/config/index.md (100%) rename windows/{src/desktop => docs}/help/basic/config/keep-in-touch.md (100%) rename windows/{src/desktop => docs}/help/basic/config/keyboards.md (100%) rename windows/{src/desktop => docs}/help/basic/config/options.md (100%) rename windows/{src/desktop => docs}/help/basic/config/support.md (100%) rename windows/{src/desktop => docs}/help/basic/enable-or-disable-keyboard.md (100%) rename windows/{src/desktop => docs}/help/basic/help.md (100%) rename windows/{src/desktop => docs}/help/basic/index.md (100%) rename windows/{src/desktop => docs}/help/basic/language-switcher.md (100%) rename windows/{src/desktop => docs}/help/basic/make-taskbar-icon-visible.md (100%) rename windows/{src/desktop => docs}/help/basic/new-ways-to-use-keyman.md (100%) rename windows/{src/desktop => docs}/help/basic/select-keyboard.md (100%) rename windows/{src/desktop => docs}/help/basic/text-editor.md (100%) rename windows/{src/desktop => docs}/help/basic/toolbox/character-map.md (100%) rename windows/{src/desktop => docs}/help/basic/toolbox/font-helper.md (100%) rename windows/{src/desktop => docs}/help/basic/toolbox/index.md (100%) rename windows/{src/desktop => docs}/help/basic/toolbox/osk.md (100%) rename windows/{src/desktop => docs}/help/basic/tray-menu.md (100%) rename windows/{src/desktop => docs}/help/basic/uninstall-keyboard.md (100%) rename windows/{src/desktop => docs}/help/basic/uninstall.md (100%) rename windows/{src/desktop => docs}/help/basic/update.md (100%) rename windows/{src/desktop => docs}/help/common/adware.md (100%) rename windows/{src/desktop => docs}/help/common/bug.md (100%) rename windows/{src/desktop => docs}/help/common/compatibility.md (100%) rename windows/{src/desktop => docs}/help/common/free.md (100%) rename windows/{src/desktop => docs}/help/common/index.md (100%) rename windows/{src/desktop => docs}/help/common/linux.md (100%) rename windows/{src/desktop => docs}/help/common/mac.md (100%) rename windows/{src/desktop => docs}/help/common/old_version.md (100%) rename windows/{src/desktop => docs}/help/common/os.md (100%) rename windows/{src/desktop => docs}/help/common/osk.md (100%) rename windows/{src/desktop => docs}/help/common/requirements.md (100%) rename windows/{src/desktop => docs}/help/common/support.md (100%) rename windows/{src/desktop => docs}/help/common/unicode.md (100%) rename windows/{src/desktop => docs}/help/context/base-keyboard.md (100%) rename windows/{src/desktop => docs}/help/context/change-hotkey.md (100%) rename windows/{src/desktop => docs}/help/context/configuration-hotkeys.md (100%) rename windows/{src/desktop => docs}/help/context/configuration-keepintouch.md (100%) rename windows/{src/desktop => docs}/help/context/configuration-keyboards.md (100%) rename windows/{src/desktop => docs}/help/context/configuration-options.md (100%) rename windows/{src/desktop => docs}/help/context/configuration-support.md (100%) rename windows/{src/desktop => docs}/help/context/download-keyboard.md (100%) rename windows/{src/desktop => docs}/help/context/index.md (100%) rename windows/{src/desktop => docs}/help/context/install-keyboard-language.md (100%) rename windows/{src/desktop => docs}/help/context/install-keyboard.md (100%) rename windows/{src/desktop => docs}/help/context/keyman.md (100%) rename windows/{src/desktop => docs}/help/context/online-update.md (100%) rename windows/{src/desktop => docs}/help/context/proxy-configuration.md (100%) rename windows/{src/desktop => docs}/help/context/splash.md (100%) rename windows/{src/desktop => docs}/help/context/text-editor.md (100%) rename windows/{src/desktop => docs}/help/context/toolbox-charactermap.md (100%) rename windows/{src/desktop => docs}/help/context/toolbox-fonthelper.md (100%) rename windows/{src/desktop => docs}/help/context/toolbox-onscreenkeyboard.md (100%) rename windows/{src/desktop => docs}/help/context/tray-menu.md (100%) rename windows/{src/desktop => docs}/help/desktop_images/7-taskbar.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-big.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-button.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-filter.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-filterdialog.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-font.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-goto.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-insert.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-options.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap-quality.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/charmap.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/config-locale.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/download-keyboard-step0.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/download-keyboard-step1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/download-keyboard-step2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/download-keyboard-step3.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/download-keyboard-step4.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/download-keyboard-step5.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/download-keyboard-step6.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/fonthelper.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/help-dialog.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/hotkeys-change.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/icon-fonts.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/icon-help.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/icon-intro.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/icon-introductory-help.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/icon-keyman.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/icon-osk.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/icon-unicode.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/icon-uninstall.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/keyboard-share.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/keyboards-downarrow.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/km_install_anywhere_1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/km_install_anywhere_2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/km_install_anywhere_3.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/km_non_app_store_1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/km_non_app_store_2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/lang-assoc-multi.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/language-association.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/language-bar.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/languageswitcher-small.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/languageswitcher.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menu.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menuicon-charmap.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menuicon-config.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menuicon-exit.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menuicon-fonthelper.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menuicon-help.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menuicon-osk.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menuicon-texteditor.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/menuicon-usage.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/options-advanced.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/options-general.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/options-hint.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/options-osk.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/options-startup.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/osk-tibetan.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/osk_keyboard.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/proxy-config.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/setup-click1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/setup-click2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/setup-click3.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/start_tray.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-add-lang.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-add-popup.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-hotkeys.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-keyboards.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-layout-detail1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-layout-detail2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-layout-disable.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-layout-enable.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-layout-help.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-layout-share.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-layout.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-options.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-options2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/tab-support.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/texteditor.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolbox-options.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolbox-toolbar.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolboxicon-charmap.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolboxicon-close.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolboxicon-config.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolboxicon-fonthelper.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolboxicon-help.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolboxicon-osk.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/toolboxicon-usage.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/video.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win10-taskbar1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win10-taskbar2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win10-taskbar3.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win11-taskbar1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win11-taskbar2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win11-uninstall.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win11_km_install_anywhere_1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win8-taskbar1.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win8-taskbar2.png (100%) rename windows/{src/desktop => docs}/help/desktop_images/win8-taskbar3.png (100%) rename windows/{src/desktop => docs}/help/index.md (100%) rename windows/{src/desktop => docs}/help/keymandesktop.hhp (100%) rename windows/{src/desktop => docs}/help/start/configure-computer.md (100%) rename windows/{src/desktop => docs}/help/start/configure_office.md (100%) rename windows/{src/desktop => docs}/help/start/download-and-install-keyboard.md (100%) rename windows/{src/desktop => docs}/help/start/download-and-install-keyman.md (100%) rename windows/{src/desktop => docs}/help/start/font.md (100%) rename windows/{src/desktop => docs}/help/start/hotkey_set.md (100%) rename windows/{src/desktop => docs}/help/start/index.md (100%) rename windows/{src/desktop => docs}/help/start/locale.md (100%) rename windows/{src/desktop => docs}/help/start/rtl.md (100%) rename windows/{src/desktop => docs}/help/start/tutorial.md (100%) rename windows/{src/desktop => docs}/help/troubleshooting/bootstrapper.md (100%) rename windows/{src/desktop => docs}/help/troubleshooting/excel.md (100%) rename windows/{src/desktop => docs}/help/troubleshooting/font.md (100%) rename windows/{src/desktop => docs}/help/troubleshooting/index.md (100%) rename windows/{src/desktop => docs}/help/troubleshooting/install-app-from-anywhere.md (100%) rename windows/{src/desktop => docs}/help/troubleshooting/securitysoftware.md (100%) rename windows/{src/desktop => docs}/help/troubleshooting/sigma.md (100%) diff --git a/android/help/about/history.md b/android/docs/help/about/history.md similarity index 100% rename from android/help/about/history.md rename to android/docs/help/about/history.md diff --git a/android/help/about/index.md b/android/docs/help/about/index.md similarity index 100% rename from android/help/about/index.md rename to android/docs/help/about/index.md diff --git a/android/help/about/privacy.md b/android/docs/help/about/privacy.md similarity index 100% rename from android/help/about/privacy.md rename to android/docs/help/about/privacy.md diff --git a/android/help/about/system-requirements.md b/android/docs/help/about/system-requirements.md similarity index 100% rename from android/help/about/system-requirements.md rename to android/docs/help/about/system-requirements.md diff --git a/android/help/about/welcome.md b/android/docs/help/about/welcome.md similarity index 100% rename from android/help/about/welcome.md rename to android/docs/help/about/welcome.md diff --git a/android/help/about/whatsnew.md b/android/docs/help/about/whatsnew.md similarity index 100% rename from android/help/about/whatsnew.md rename to android/docs/help/about/whatsnew.md diff --git a/android/help/android_images/adjust-height.png b/android/docs/help/android_images/adjust-height.png similarity index 100% rename from android/help/android_images/adjust-height.png rename to android/docs/help/android_images/adjust-height.png diff --git a/android/help/android_images/backspace-ap.png b/android/docs/help/android_images/backspace-ap.png similarity index 100% rename from android/help/android_images/backspace-ap.png rename to android/docs/help/android_images/backspace-ap.png diff --git a/android/help/android_images/backspace-at.png b/android/docs/help/android_images/backspace-at.png similarity index 100% rename from android/help/android_images/backspace-at.png rename to android/docs/help/android_images/backspace-at.png diff --git a/android/help/android_images/blank-osk.png b/android/docs/help/android_images/blank-osk.png similarity index 100% rename from android/help/android_images/blank-osk.png rename to android/docs/help/android_images/blank-osk.png diff --git a/android/help/android_images/browser-a.png b/android/docs/help/android_images/browser-a.png similarity index 100% rename from android/help/android_images/browser-a.png rename to android/docs/help/android_images/browser-a.png diff --git a/android/help/android_images/confirm-english-dictionary-delete-ap.png b/android/docs/help/android_images/confirm-english-dictionary-delete-ap.png similarity index 100% rename from android/help/android_images/confirm-english-dictionary-delete-ap.png rename to android/docs/help/android_images/confirm-english-dictionary-delete-ap.png diff --git a/android/help/android_images/confirm-khmer-delete-ap.png b/android/docs/help/android_images/confirm-khmer-delete-ap.png similarity index 100% rename from android/help/android_images/confirm-khmer-delete-ap.png rename to android/docs/help/android_images/confirm-khmer-delete-ap.png diff --git a/android/help/android_images/delete-a.png b/android/docs/help/android_images/delete-a.png similarity index 100% rename from android/help/android_images/delete-a.png rename to android/docs/help/android_images/delete-a.png diff --git a/android/help/android_images/dist-file-browser-ap.png b/android/docs/help/android_images/dist-file-browser-ap.png similarity index 100% rename from android/help/android_images/dist-file-browser-ap.png rename to android/docs/help/android_images/dist-file-browser-ap.png diff --git a/android/help/android_images/dist-file-browser-at.png b/android/docs/help/android_images/dist-file-browser-at.png similarity index 100% rename from android/help/android_images/dist-file-browser-at.png rename to android/docs/help/android_images/dist-file-browser-at.png diff --git a/android/help/android_images/dist-install1-ap.png b/android/docs/help/android_images/dist-install1-ap.png similarity index 100% rename from android/help/android_images/dist-install1-ap.png rename to android/docs/help/android_images/dist-install1-ap.png diff --git a/android/help/android_images/dist-install1-at.png b/android/docs/help/android_images/dist-install1-at.png similarity index 100% rename from android/help/android_images/dist-install1-at.png rename to android/docs/help/android_images/dist-install1-at.png diff --git a/android/help/android_images/dist-storage-permission-ap.png b/android/docs/help/android_images/dist-storage-permission-ap.png similarity index 100% rename from android/help/android_images/dist-storage-permission-ap.png rename to android/docs/help/android_images/dist-storage-permission-ap.png diff --git a/android/help/android_images/dist-storage-permission-at.png b/android/docs/help/android_images/dist-storage-permission-at.png similarity index 100% rename from android/help/android_images/dist-storage-permission-at.png rename to android/docs/help/android_images/dist-storage-permission-at.png diff --git a/android/help/android_images/dist-url-screen-ap.png b/android/docs/help/android_images/dist-url-screen-ap.png similarity index 100% rename from android/help/android_images/dist-url-screen-ap.png rename to android/docs/help/android_images/dist-url-screen-ap.png diff --git a/android/help/android_images/dist-url-screen-at.png b/android/docs/help/android_images/dist-url-screen-at.png similarity index 100% rename from android/help/android_images/dist-url-screen-at.png rename to android/docs/help/android_images/dist-url-screen-at.png diff --git a/android/help/android_images/dl-success-ap.png b/android/docs/help/android_images/dl-success-ap.png similarity index 100% rename from android/help/android_images/dl-success-ap.png rename to android/docs/help/android_images/dl-success-ap.png diff --git a/android/help/android_images/english-dictionaries-ap.png b/android/docs/help/android_images/english-dictionaries-ap.png similarity index 100% rename from android/help/android_images/english-dictionaries-ap.png rename to android/docs/help/android_images/english-dictionaries-ap.png diff --git a/android/help/android_images/english-dictionary-info-ap.png b/android/docs/help/android_images/english-dictionary-info-ap.png similarity index 100% rename from android/help/android_images/english-dictionary-info-ap.png rename to android/docs/help/android_images/english-dictionary-info-ap.png diff --git a/android/help/android_images/english-settings-ap.png b/android/docs/help/android_images/english-settings-ap.png similarity index 100% rename from android/help/android_images/english-settings-ap.png rename to android/docs/help/android_images/english-settings-ap.png diff --git a/android/help/android_images/font-size-a.png b/android/docs/help/android_images/font-size-a.png similarity index 100% rename from android/help/android_images/font-size-a.png rename to android/docs/help/android_images/font-size-a.png diff --git a/android/help/android_images/get-started-a.png b/android/docs/help/android_images/get-started-a.png similarity index 100% rename from android/help/android_images/get-started-a.png rename to android/docs/help/android_images/get-started-a.png diff --git a/android/help/android_images/globe-ap.png b/android/docs/help/android_images/globe-ap.png similarity index 100% rename from android/help/android_images/globe-ap.png rename to android/docs/help/android_images/globe-ap.png diff --git a/android/help/android_images/globe-at.png b/android/docs/help/android_images/globe-at.png similarity index 100% rename from android/help/android_images/globe-at.png rename to android/docs/help/android_images/globe-at.png diff --git a/android/help/android_images/hide-keyboard-ap.png b/android/docs/help/android_images/hide-keyboard-ap.png similarity index 100% rename from android/help/android_images/hide-keyboard-ap.png rename to android/docs/help/android_images/hide-keyboard-ap.png diff --git a/android/help/android_images/hide-keyboard-at.png b/android/docs/help/android_images/hide-keyboard-at.png similarity index 100% rename from android/help/android_images/hide-keyboard-at.png rename to android/docs/help/android_images/hide-keyboard-at.png diff --git a/android/help/android_images/ic_cloud_download.png b/android/docs/help/android_images/ic_cloud_download.png similarity index 100% rename from android/help/android_images/ic_cloud_download.png rename to android/docs/help/android_images/ic_cloud_download.png diff --git a/android/help/android_images/ic_content_add.png b/android/docs/help/android_images/ic_content_add.png similarity index 100% rename from android/help/android_images/ic_content_add.png rename to android/docs/help/android_images/ic_content_add.png diff --git a/android/help/android_images/ic_timelapse.png b/android/docs/help/android_images/ic_timelapse.png similarity index 100% rename from android/help/android_images/ic_timelapse.png rename to android/docs/help/android_images/ic_timelapse.png diff --git a/android/help/android_images/ic_translate_a.png b/android/docs/help/android_images/ic_translate_a.png similarity index 100% rename from android/help/android_images/ic_translate_a.png rename to android/docs/help/android_images/ic_translate_a.png diff --git a/android/help/android_images/info-a-gray.png b/android/docs/help/android_images/info-a-gray.png similarity index 100% rename from android/help/android_images/info-a-gray.png rename to android/docs/help/android_images/info-a-gray.png diff --git a/android/help/android_images/info-a.png b/android/docs/help/android_images/info-a.png similarity index 100% rename from android/help/android_images/info-a.png rename to android/docs/help/android_images/info-a.png diff --git a/android/help/android_images/keyman-storage-permission-34b.png b/android/docs/help/android_images/keyman-storage-permission-34b.png similarity index 100% rename from android/help/android_images/keyman-storage-permission-34b.png rename to android/docs/help/android_images/keyman-storage-permission-34b.png diff --git a/android/help/android_images/keyman-storage-permission-ap.png b/android/docs/help/android_images/keyman-storage-permission-ap.png similarity index 100% rename from android/help/android_images/keyman-storage-permission-ap.png rename to android/docs/help/android_images/keyman-storage-permission-ap.png diff --git a/android/help/android_images/keyman-storage-permission-at.png b/android/docs/help/android_images/keyman-storage-permission-at.png similarity index 100% rename from android/help/android_images/keyman-storage-permission-at.png rename to android/docs/help/android_images/keyman-storage-permission-at.png diff --git a/android/help/android_images/khmer-downloading-a.png b/android/docs/help/android_images/khmer-downloading-a.png similarity index 100% rename from android/help/android_images/khmer-downloading-a.png rename to android/docs/help/android_images/khmer-downloading-a.png diff --git a/android/help/android_images/khmer-install-a.png b/android/docs/help/android_images/khmer-install-a.png similarity index 100% rename from android/help/android_images/khmer-install-a.png rename to android/docs/help/android_images/khmer-install-a.png diff --git a/android/help/android_images/khmer-readme-a.png b/android/docs/help/android_images/khmer-readme-a.png similarity index 100% rename from android/help/android_images/khmer-readme-a.png rename to android/docs/help/android_images/khmer-readme-a.png diff --git a/android/help/android_images/khmer-search-a.png b/android/docs/help/android_images/khmer-search-a.png similarity index 100% rename from android/help/android_images/khmer-search-a.png rename to android/docs/help/android_images/khmer-search-a.png diff --git a/android/help/android_images/khmer-settings-ap.png b/android/docs/help/android_images/khmer-settings-ap.png similarity index 100% rename from android/help/android_images/khmer-settings-ap.png rename to android/docs/help/android_images/khmer-settings-ap.png diff --git a/android/help/android_images/khmer-welcome-a.png b/android/docs/help/android_images/khmer-welcome-a.png similarity index 100% rename from android/help/android_images/khmer-welcome-a.png rename to android/docs/help/android_images/khmer-welcome-a.png diff --git a/android/help/android_images/longpress-slider.png b/android/docs/help/android_images/longpress-slider.png similarity index 100% rename from android/help/android_images/longpress-slider.png rename to android/docs/help/android_images/longpress-slider.png diff --git a/android/help/android_images/menu-icon-a.png b/android/docs/help/android_images/menu-icon-a.png similarity index 100% rename from android/help/android_images/menu-icon-a.png rename to android/docs/help/android_images/menu-icon-a.png diff --git a/android/help/android_images/other-input-methods.png b/android/docs/help/android_images/other-input-methods.png similarity index 100% rename from android/help/android_images/other-input-methods.png rename to android/docs/help/android_images/other-input-methods.png diff --git a/android/help/android_images/plus-a.png b/android/docs/help/android_images/plus-a.png similarity index 100% rename from android/help/android_images/plus-a.png rename to android/docs/help/android_images/plus-a.png diff --git a/android/help/android_images/reset-to-default.png b/android/docs/help/android_images/reset-to-default.png similarity index 100% rename from android/help/android_images/reset-to-default.png rename to android/docs/help/android_images/reset-to-default.png diff --git a/android/help/android_images/return-ap.png b/android/docs/help/android_images/return-ap.png similarity index 100% rename from android/help/android_images/return-ap.png rename to android/docs/help/android_images/return-ap.png diff --git a/android/help/android_images/return-at.png b/android/docs/help/android_images/return-at.png similarity index 100% rename from android/help/android_images/return-at.png rename to android/docs/help/android_images/return-at.png diff --git a/android/help/android_images/return.png b/android/docs/help/android_images/return.png similarity index 100% rename from android/help/android_images/return.png rename to android/docs/help/android_images/return.png diff --git a/android/help/android_images/select_language.png b/android/docs/help/android_images/select_language.png similarity index 100% rename from android/help/android_images/select_language.png rename to android/docs/help/android_images/select_language.png diff --git a/android/help/android_images/settings-2-installed-languages-ap.png b/android/docs/help/android_images/settings-2-installed-languages-ap.png similarity index 100% rename from android/help/android_images/settings-2-installed-languages-ap.png rename to android/docs/help/android_images/settings-2-installed-languages-ap.png diff --git a/android/help/android_images/settings-a.png b/android/docs/help/android_images/settings-a.png similarity index 100% rename from android/help/android_images/settings-a.png rename to android/docs/help/android_images/settings-a.png diff --git a/android/help/android_images/settings-download-dictionary-background-ap.png b/android/docs/help/android_images/settings-download-dictionary-background-ap.png similarity index 100% rename from android/help/android_images/settings-download-dictionary-background-ap.png rename to android/docs/help/android_images/settings-download-dictionary-background-ap.png diff --git a/android/help/android_images/settings-download-str-dictionary-ap.png b/android/docs/help/android_images/settings-download-str-dictionary-ap.png similarity index 100% rename from android/help/android_images/settings-download-str-dictionary-ap.png rename to android/docs/help/android_images/settings-download-str-dictionary-ap.png diff --git a/android/help/android_images/settings-khmer-info-ap.png b/android/docs/help/android_images/settings-khmer-info-ap.png similarity index 100% rename from android/help/android_images/settings-khmer-info-ap.png rename to android/docs/help/android_images/settings-khmer-info-ap.png diff --git a/android/help/android_images/settings-language-ap.png b/android/docs/help/android_images/settings-language-ap.png similarity index 100% rename from android/help/android_images/settings-language-ap.png rename to android/docs/help/android_images/settings-language-ap.png diff --git a/android/help/android_images/settings-languages-ap.png b/android/docs/help/android_images/settings-languages-ap.png similarity index 100% rename from android/help/android_images/settings-languages-ap.png rename to android/docs/help/android_images/settings-languages-ap.png diff --git a/android/help/android_images/settings-screen-ap.png b/android/docs/help/android_images/settings-screen-ap.png similarity index 100% rename from android/help/android_images/settings-screen-ap.png rename to android/docs/help/android_images/settings-screen-ap.png diff --git a/android/help/android_images/settings-screen-install-keyboard-dictionary.png b/android/docs/help/android_images/settings-screen-install-keyboard-dictionary.png similarity index 100% rename from android/help/android_images/settings-screen-install-keyboard-dictionary.png rename to android/docs/help/android_images/settings-screen-install-keyboard-dictionary.png diff --git a/android/help/android_images/settings-str-dictionary-ap.png b/android/docs/help/android_images/settings-str-dictionary-ap.png similarity index 100% rename from android/help/android_images/settings-str-dictionary-ap.png rename to android/docs/help/android_images/settings-str-dictionary-ap.png diff --git a/android/help/android_images/settings-str-settings-ap.png b/android/docs/help/android_images/settings-str-settings-ap.png similarity index 100% rename from android/help/android_images/settings-str-settings-ap.png rename to android/docs/help/android_images/settings-str-settings-ap.png diff --git a/android/help/android_images/settings-suggestions-ap.png b/android/docs/help/android_images/settings-suggestions-ap.png similarity index 100% rename from android/help/android_images/settings-suggestions-ap.png rename to android/docs/help/android_images/settings-suggestions-ap.png diff --git a/android/help/android_images/settings-two-installed-languages-ap.png b/android/docs/help/android_images/settings-two-installed-languages-ap.png similarity index 100% rename from android/help/android_images/settings-two-installed-languages-ap.png rename to android/docs/help/android_images/settings-two-installed-languages-ap.png diff --git a/android/help/android_images/settings1-ap.png b/android/docs/help/android_images/settings1-ap.png similarity index 100% rename from android/help/android_images/settings1-ap.png rename to android/docs/help/android_images/settings1-ap.png diff --git a/android/help/android_images/settings1-at.png b/android/docs/help/android_images/settings1-at.png similarity index 100% rename from android/help/android_images/settings1-at.png rename to android/docs/help/android_images/settings1-at.png diff --git a/android/help/android_images/settings2-ap.png b/android/docs/help/android_images/settings2-ap.png similarity index 100% rename from android/help/android_images/settings2-ap.png rename to android/docs/help/android_images/settings2-ap.png diff --git a/android/help/android_images/settings2-at.png b/android/docs/help/android_images/settings2-at.png similarity index 100% rename from android/help/android_images/settings2-at.png rename to android/docs/help/android_images/settings2-at.png diff --git a/android/help/android_images/settings3-ap.png b/android/docs/help/android_images/settings3-ap.png similarity index 100% rename from android/help/android_images/settings3-ap.png rename to android/docs/help/android_images/settings3-ap.png diff --git a/android/help/android_images/settings3-at.png b/android/docs/help/android_images/settings3-at.png similarity index 100% rename from android/help/android_images/settings3-at.png rename to android/docs/help/android_images/settings3-at.png diff --git a/android/help/android_images/settings4-ap.png b/android/docs/help/android_images/settings4-ap.png similarity index 100% rename from android/help/android_images/settings4-ap.png rename to android/docs/help/android_images/settings4-ap.png diff --git a/android/help/android_images/settings4-at.png b/android/docs/help/android_images/settings4-at.png similarity index 100% rename from android/help/android_images/settings4-at.png rename to android/docs/help/android_images/settings4-at.png diff --git a/android/help/android_images/settings5-ap.png b/android/docs/help/android_images/settings5-ap.png similarity index 100% rename from android/help/android_images/settings5-ap.png rename to android/docs/help/android_images/settings5-ap.png diff --git a/android/help/android_images/settings5-at.png b/android/docs/help/android_images/settings5-at.png similarity index 100% rename from android/help/android_images/settings5-at.png rename to android/docs/help/android_images/settings5-at.png diff --git a/android/help/android_images/settings6-ap.png b/android/docs/help/android_images/settings6-ap.png similarity index 100% rename from android/help/android_images/settings6-ap.png rename to android/docs/help/android_images/settings6-ap.png diff --git a/android/help/android_images/settings6-at.png b/android/docs/help/android_images/settings6-at.png similarity index 100% rename from android/help/android_images/settings6-at.png rename to android/docs/help/android_images/settings6-at.png diff --git a/android/help/android_images/settings7-ap.png b/android/docs/help/android_images/settings7-ap.png similarity index 100% rename from android/help/android_images/settings7-ap.png rename to android/docs/help/android_images/settings7-ap.png diff --git a/android/help/android_images/settings7-at.png b/android/docs/help/android_images/settings7-at.png similarity index 100% rename from android/help/android_images/settings7-at.png rename to android/docs/help/android_images/settings7-at.png diff --git a/android/help/android_images/share-a.png b/android/docs/help/android_images/share-a.png similarity index 100% rename from android/help/android_images/share-a.png rename to android/docs/help/android_images/share-a.png diff --git a/android/help/android_images/shift-ap.png b/android/docs/help/android_images/shift-ap.png similarity index 100% rename from android/help/android_images/shift-ap.png rename to android/docs/help/android_images/shift-ap.png diff --git a/android/help/android_images/shift-at.png b/android/docs/help/android_images/shift-at.png similarity index 100% rename from android/help/android_images/shift-at.png rename to android/docs/help/android_images/shift-at.png diff --git a/android/help/android_images/spacebar-caption-ap.png b/android/docs/help/android_images/spacebar-caption-ap.png similarity index 100% rename from android/help/android_images/spacebar-caption-ap.png rename to android/docs/help/android_images/spacebar-caption-ap.png diff --git a/android/help/android_images/themed-banner.png b/android/docs/help/android_images/themed-banner.png similarity index 100% rename from android/help/android_images/themed-banner.png rename to android/docs/help/android_images/themed-banner.png diff --git a/android/help/android_images/touch-hold-ap.png b/android/docs/help/android_images/touch-hold-ap.png similarity index 100% rename from android/help/android_images/touch-hold-ap.png rename to android/docs/help/android_images/touch-hold-ap.png diff --git a/android/help/android_images/touch-hold-at.png b/android/docs/help/android_images/touch-hold-at.png similarity index 100% rename from android/help/android_images/touch-hold-at.png rename to android/docs/help/android_images/touch-hold-at.png diff --git a/android/help/android_images/uninstall-dictionary-notification-ap.png b/android/docs/help/android_images/uninstall-dictionary-notification-ap.png similarity index 100% rename from android/help/android_images/uninstall-dictionary-notification-ap.png rename to android/docs/help/android_images/uninstall-dictionary-notification-ap.png diff --git a/android/help/android_images/uninstall-notification-ap.png b/android/docs/help/android_images/uninstall-notification-ap.png similarity index 100% rename from android/help/android_images/uninstall-notification-ap.png rename to android/docs/help/android_images/uninstall-notification-ap.png diff --git a/android/help/android_images/uninstall-notification-at.png b/android/docs/help/android_images/uninstall-notification-at.png similarity index 100% rename from android/help/android_images/uninstall-notification-at.png rename to android/docs/help/android_images/uninstall-notification-at.png diff --git a/android/help/android_images/video.png b/android/docs/help/android_images/video.png similarity index 100% rename from android/help/android_images/video.png rename to android/docs/help/android_images/video.png diff --git a/android/help/basic/config/adjust-keyboard-height.md b/android/docs/help/basic/config/adjust-keyboard-height.md similarity index 100% rename from android/help/basic/config/adjust-keyboard-height.md rename to android/docs/help/basic/config/adjust-keyboard-height.md diff --git a/android/help/basic/config/adjust-longpress-delay.md b/android/docs/help/basic/config/adjust-longpress-delay.md similarity index 100% rename from android/help/basic/config/adjust-longpress-delay.md rename to android/docs/help/basic/config/adjust-longpress-delay.md diff --git a/android/help/basic/config/index.md b/android/docs/help/basic/config/index.md similarity index 100% rename from android/help/basic/config/index.md rename to android/docs/help/basic/config/index.md diff --git a/android/help/basic/config/install-keyboard-or-dictionary.md b/android/docs/help/basic/config/install-keyboard-or-dictionary.md similarity index 100% rename from android/help/basic/config/install-keyboard-or-dictionary.md rename to android/docs/help/basic/config/install-keyboard-or-dictionary.md diff --git a/android/help/basic/config/spacebar-caption.md b/android/docs/help/basic/config/spacebar-caption.md similarity index 100% rename from android/help/basic/config/spacebar-caption.md rename to android/docs/help/basic/config/spacebar-caption.md diff --git a/android/help/basic/index.md b/android/docs/help/basic/index.md similarity index 100% rename from android/help/basic/index.md rename to android/docs/help/basic/index.md diff --git a/android/help/basic/installing-custom-packages.md b/android/docs/help/basic/installing-custom-packages.md similarity index 100% rename from android/help/basic/installing-custom-packages.md rename to android/docs/help/basic/installing-custom-packages.md diff --git a/android/help/basic/installing-dictionaries.md b/android/docs/help/basic/installing-dictionaries.md similarity index 100% rename from android/help/basic/installing-dictionaries.md rename to android/docs/help/basic/installing-dictionaries.md diff --git a/android/help/basic/switching-between-keyboards.md b/android/docs/help/basic/switching-between-keyboards.md similarity index 100% rename from android/help/basic/switching-between-keyboards.md rename to android/docs/help/basic/switching-between-keyboards.md diff --git a/android/help/basic/uninstalling-dictionaries.md b/android/docs/help/basic/uninstalling-dictionaries.md similarity index 100% rename from android/help/basic/uninstalling-dictionaries.md rename to android/docs/help/basic/uninstalling-dictionaries.md diff --git a/android/help/basic/uninstalling-keyboards.md b/android/docs/help/basic/uninstalling-keyboards.md similarity index 100% rename from android/help/basic/uninstalling-keyboards.md rename to android/docs/help/basic/uninstalling-keyboards.md diff --git a/android/help/basic/using-the-banner.md b/android/docs/help/basic/using-the-banner.md similarity index 100% rename from android/help/basic/using-the-banner.md rename to android/docs/help/basic/using-the-banner.md diff --git a/android/help/context/gestures.md b/android/docs/help/context/gestures.md similarity index 100% rename from android/help/context/gestures.md rename to android/docs/help/context/gestures.md diff --git a/android/help/context/index.md b/android/docs/help/context/index.md similarity index 100% rename from android/help/context/index.md rename to android/docs/help/context/index.md diff --git a/android/help/context/menu-phone.md b/android/docs/help/context/menu-phone.md similarity index 100% rename from android/help/context/menu-phone.md rename to android/docs/help/context/menu-phone.md diff --git a/android/help/context/menu-tablet.md b/android/docs/help/context/menu-tablet.md similarity index 100% rename from android/help/context/menu-tablet.md rename to android/docs/help/context/menu-tablet.md diff --git a/android/help/index.md b/android/docs/help/index.md similarity index 100% rename from android/help/index.md rename to android/docs/help/index.md diff --git a/android/help/start/enabling-system-keyboard.md b/android/docs/help/start/enabling-system-keyboard.md similarity index 100% rename from android/help/start/enabling-system-keyboard.md rename to android/docs/help/start/enabling-system-keyboard.md diff --git a/android/help/start/index.md b/android/docs/help/start/index.md similarity index 100% rename from android/help/start/index.md rename to android/docs/help/start/index.md diff --git a/android/help/start/installing-keyboards.md b/android/docs/help/start/installing-keyboards.md similarity index 100% rename from android/help/start/installing-keyboards.md rename to android/docs/help/start/installing-keyboards.md diff --git a/android/help/troubleshooting/grant-storage-permission.md b/android/docs/help/troubleshooting/grant-storage-permission.md similarity index 100% rename from android/help/troubleshooting/grant-storage-permission.md rename to android/docs/help/troubleshooting/grant-storage-permission.md diff --git a/android/help/troubleshooting/index.md b/android/docs/help/troubleshooting/index.md similarity index 100% rename from android/help/troubleshooting/index.md rename to android/docs/help/troubleshooting/index.md diff --git a/android/help/troubleshooting/integrating.md b/android/docs/help/troubleshooting/integrating.md similarity index 100% rename from android/help/troubleshooting/integrating.md rename to android/docs/help/troubleshooting/integrating.md diff --git a/android/help/troubleshooting/keyboard-help.md b/android/docs/help/troubleshooting/keyboard-help.md similarity index 100% rename from android/help/troubleshooting/keyboard-help.md rename to android/docs/help/troubleshooting/keyboard-help.md diff --git a/ios/help/about/history.md b/ios/docs/help/about/history.md similarity index 100% rename from ios/help/about/history.md rename to ios/docs/help/about/history.md diff --git a/ios/help/about/index.md b/ios/docs/help/about/index.md similarity index 100% rename from ios/help/about/index.md rename to ios/docs/help/about/index.md diff --git a/ios/help/about/system-requirements.md b/ios/docs/help/about/system-requirements.md similarity index 100% rename from ios/help/about/system-requirements.md rename to ios/docs/help/about/system-requirements.md diff --git a/ios/help/about/welcome.md b/ios/docs/help/about/welcome.md similarity index 100% rename from ios/help/about/welcome.md rename to ios/docs/help/about/welcome.md diff --git a/ios/help/about/whatsnew.md b/ios/docs/help/about/whatsnew.md similarity index 100% rename from ios/help/about/whatsnew.md rename to ios/docs/help/about/whatsnew.md diff --git a/ios/help/basic/config/index.md b/ios/docs/help/basic/config/index.md similarity index 100% rename from ios/help/basic/config/index.md rename to ios/docs/help/basic/config/index.md diff --git a/ios/help/basic/config/spacebar-caption.md b/ios/docs/help/basic/config/spacebar-caption.md similarity index 100% rename from ios/help/basic/config/spacebar-caption.md rename to ios/docs/help/basic/config/spacebar-caption.md diff --git a/ios/help/basic/index.md b/ios/docs/help/basic/index.md similarity index 100% rename from ios/help/basic/index.md rename to ios/docs/help/basic/index.md diff --git a/ios/help/basic/installing-custom-keyboards-dictionaries.md b/ios/docs/help/basic/installing-custom-keyboards-dictionaries.md similarity index 100% rename from ios/help/basic/installing-custom-keyboards-dictionaries.md rename to ios/docs/help/basic/installing-custom-keyboards-dictionaries.md diff --git a/ios/help/basic/keyboard-usage.md b/ios/docs/help/basic/keyboard-usage.md similarity index 100% rename from ios/help/basic/keyboard-usage.md rename to ios/docs/help/basic/keyboard-usage.md diff --git a/ios/help/basic/language-settings.md b/ios/docs/help/basic/language-settings.md similarity index 100% rename from ios/help/basic/language-settings.md rename to ios/docs/help/basic/language-settings.md diff --git a/ios/help/basic/sharing-keyboards.md b/ios/docs/help/basic/sharing-keyboards.md similarity index 100% rename from ios/help/basic/sharing-keyboards.md rename to ios/docs/help/basic/sharing-keyboards.md diff --git a/ios/help/basic/switching-between-keyboards.md b/ios/docs/help/basic/switching-between-keyboards.md similarity index 100% rename from ios/help/basic/switching-between-keyboards.md rename to ios/docs/help/basic/switching-between-keyboards.md diff --git a/ios/help/basic/uninstalling-keyboards.md b/ios/docs/help/basic/uninstalling-keyboards.md similarity index 100% rename from ios/help/basic/uninstalling-keyboards.md rename to ios/docs/help/basic/uninstalling-keyboards.md diff --git a/ios/help/basic/using-keyman-browser.md b/ios/docs/help/basic/using-keyman-browser.md similarity index 100% rename from ios/help/basic/using-keyman-browser.md rename to ios/docs/help/basic/using-keyman-browser.md diff --git a/ios/help/basic/using-the-banner.md b/ios/docs/help/basic/using-the-banner.md similarity index 100% rename from ios/help/basic/using-the-banner.md rename to ios/docs/help/basic/using-the-banner.md diff --git a/ios/help/context/index.md b/ios/docs/help/context/index.md similarity index 100% rename from ios/help/context/index.md rename to ios/docs/help/context/index.md diff --git a/ios/help/index.md b/ios/docs/help/index.md similarity index 100% rename from ios/help/index.md rename to ios/docs/help/index.md diff --git a/ios/help/ios_images/add-keyboard-file-i.png b/ios/docs/help/ios_images/add-keyboard-file-i.png similarity index 100% rename from ios/help/ios_images/add-keyboard-file-i.png rename to ios/docs/help/ios_images/add-keyboard-file-i.png diff --git a/ios/help/ios_images/add-keyboard-i.png b/ios/docs/help/ios_images/add-keyboard-i.png similarity index 100% rename from ios/help/ios_images/add-keyboard-i.png rename to ios/docs/help/ios_images/add-keyboard-i.png diff --git a/ios/help/ios_images/add-keyboard-i2.png b/ios/docs/help/ios_images/add-keyboard-i2.png similarity index 100% rename from ios/help/ios_images/add-keyboard-i2.png rename to ios/docs/help/ios_images/add-keyboard-i2.png diff --git a/ios/help/ios_images/add-keyboard-i3.png b/ios/docs/help/ios_images/add-keyboard-i3.png similarity index 100% rename from ios/help/ios_images/add-keyboard-i3.png rename to ios/docs/help/ios_images/add-keyboard-i3.png diff --git a/ios/help/ios_images/backspace.png b/ios/docs/help/ios_images/backspace.png similarity index 100% rename from ios/help/ios_images/backspace.png rename to ios/docs/help/ios_images/backspace.png diff --git a/ios/help/ios_images/browser-icon.png b/ios/docs/help/ios_images/browser-icon.png similarity index 100% rename from ios/help/ios_images/browser-icon.png rename to ios/docs/help/ios_images/browser-icon.png diff --git a/ios/help/ios_images/confirm-dl.png b/ios/docs/help/ios_images/confirm-dl.png similarity index 100% rename from ios/help/ios_images/confirm-dl.png rename to ios/docs/help/ios_images/confirm-dl.png diff --git a/ios/help/ios_images/delete-keyboard-i.png b/ios/docs/help/ios_images/delete-keyboard-i.png similarity index 100% rename from ios/help/ios_images/delete-keyboard-i.png rename to ios/docs/help/ios_images/delete-keyboard-i.png diff --git a/ios/help/ios_images/delete-keyboard-i2.png b/ios/docs/help/ios_images/delete-keyboard-i2.png similarity index 100% rename from ios/help/ios_images/delete-keyboard-i2.png rename to ios/docs/help/ios_images/delete-keyboard-i2.png diff --git a/ios/help/ios_images/delete.png b/ios/docs/help/ios_images/delete.png similarity index 100% rename from ios/help/ios_images/delete.png rename to ios/docs/help/ios_images/delete.png diff --git a/ios/help/ios_images/dictionary-list.png b/ios/docs/help/ios_images/dictionary-list.png similarity index 100% rename from ios/help/ios_images/dictionary-list.png rename to ios/docs/help/ios_images/dictionary-list.png diff --git a/ios/help/ios_images/dictionary-select.png b/ios/docs/help/ios_images/dictionary-select.png similarity index 100% rename from ios/help/ios_images/dictionary-select.png rename to ios/docs/help/ios_images/dictionary-select.png diff --git a/ios/help/ios_images/dist-install1-i.png b/ios/docs/help/ios_images/dist-install1-i.png similarity index 100% rename from ios/help/ios_images/dist-install1-i.png rename to ios/docs/help/ios_images/dist-install1-i.png diff --git a/ios/help/ios_images/dist-kmp-open-i.png b/ios/docs/help/ios_images/dist-kmp-open-i.png similarity index 100% rename from ios/help/ios_images/dist-kmp-open-i.png rename to ios/docs/help/ios_images/dist-kmp-open-i.png diff --git a/ios/help/ios_images/dist-kmp-success-i.png b/ios/docs/help/ios_images/dist-kmp-success-i.png similarity index 100% rename from ios/help/ios_images/dist-kmp-success-i.png rename to ios/docs/help/ios_images/dist-kmp-success-i.png diff --git a/ios/help/ios_images/dist-url-screen-i.png b/ios/docs/help/ios_images/dist-url-screen-i.png similarity index 100% rename from ios/help/ios_images/dist-url-screen-i.png rename to ios/docs/help/ios_images/dist-url-screen-i.png diff --git a/ios/help/ios_images/dist-welcome-i.png b/ios/docs/help/ios_images/dist-welcome-i.png similarity index 100% rename from ios/help/ios_images/dist-welcome-i.png rename to ios/docs/help/ios_images/dist-welcome-i.png diff --git a/ios/help/ios_images/dl-success.png b/ios/docs/help/ios_images/dl-success.png similarity index 100% rename from ios/help/ios_images/dl-success.png rename to ios/docs/help/ios_images/dl-success.png diff --git a/ios/help/ios_images/down-flick-i.gif b/ios/docs/help/ios_images/down-flick-i.gif similarity index 100% rename from ios/help/ios_images/down-flick-i.gif rename to ios/docs/help/ios_images/down-flick-i.gif diff --git a/ios/help/ios_images/file-share-1i.png b/ios/docs/help/ios_images/file-share-1i.png similarity index 100% rename from ios/help/ios_images/file-share-1i.png rename to ios/docs/help/ios_images/file-share-1i.png diff --git a/ios/help/ios_images/file-share-2i.png b/ios/docs/help/ios_images/file-share-2i.png similarity index 100% rename from ios/help/ios_images/file-share-2i.png rename to ios/docs/help/ios_images/file-share-2i.png diff --git a/ios/help/ios_images/find-new.png b/ios/docs/help/ios_images/find-new.png similarity index 100% rename from ios/help/ios_images/find-new.png rename to ios/docs/help/ios_images/find-new.png diff --git a/ios/help/ios_images/font-dl1.png b/ios/docs/help/ios_images/font-dl1.png similarity index 100% rename from ios/help/ios_images/font-dl1.png rename to ios/docs/help/ios_images/font-dl1.png diff --git a/ios/help/ios_images/font-dl2.png b/ios/docs/help/ios_images/font-dl2.png similarity index 100% rename from ios/help/ios_images/font-dl2.png rename to ios/docs/help/ios_images/font-dl2.png diff --git a/ios/help/ios_images/font-dl3.png b/ios/docs/help/ios_images/font-dl3.png similarity index 100% rename from ios/help/ios_images/font-dl3.png rename to ios/docs/help/ios_images/font-dl3.png diff --git a/ios/help/ios_images/font-dl4.png b/ios/docs/help/ios_images/font-dl4.png similarity index 100% rename from ios/help/ios_images/font-dl4.png rename to ios/docs/help/ios_images/font-dl4.png diff --git a/ios/help/ios_images/font-dl5.png b/ios/docs/help/ios_images/font-dl5.png similarity index 100% rename from ios/help/ios_images/font-dl5.png rename to ios/docs/help/ios_images/font-dl5.png diff --git a/ios/help/ios_images/font-size.png b/ios/docs/help/ios_images/font-size.png similarity index 100% rename from ios/help/ios_images/font-size.png rename to ios/docs/help/ios_images/font-size.png diff --git a/ios/help/ios_images/get-started.png b/ios/docs/help/ios_images/get-started.png similarity index 100% rename from ios/help/ios_images/get-started.png rename to ios/docs/help/ios_images/get-started.png diff --git a/ios/help/ios_images/globe.png b/ios/docs/help/ios_images/globe.png similarity index 100% rename from ios/help/ios_images/globe.png rename to ios/docs/help/ios_images/globe.png diff --git a/ios/help/ios_images/hide-keyboard.png b/ios/docs/help/ios_images/hide-keyboard.png similarity index 100% rename from ios/help/ios_images/hide-keyboard.png rename to ios/docs/help/ios_images/hide-keyboard.png diff --git a/ios/help/ios_images/in-app-picker-i.png b/ios/docs/help/ios_images/in-app-picker-i.png similarity index 100% rename from ios/help/ios_images/in-app-picker-i.png rename to ios/docs/help/ios_images/in-app-picker-i.png diff --git a/ios/help/ios_images/info.png b/ios/docs/help/ios_images/info.png similarity index 100% rename from ios/help/ios_images/info.png rename to ios/docs/help/ios_images/info.png diff --git a/ios/help/ios_images/key-submenu.png b/ios/docs/help/ios_images/key-submenu.png similarity index 100% rename from ios/help/ios_images/key-submenu.png rename to ios/docs/help/ios_images/key-submenu.png diff --git a/ios/help/ios_images/keyboard-search-1.png b/ios/docs/help/ios_images/keyboard-search-1.png similarity index 100% rename from ios/help/ios_images/keyboard-search-1.png rename to ios/docs/help/ios_images/keyboard-search-1.png diff --git a/ios/help/ios_images/keyboard-search-2.png b/ios/docs/help/ios_images/keyboard-search-2.png similarity index 100% rename from ios/help/ios_images/keyboard-search-2.png rename to ios/docs/help/ios_images/keyboard-search-2.png diff --git a/ios/help/ios_images/keyboard-search-3.png b/ios/docs/help/ios_images/keyboard-search-3.png similarity index 100% rename from ios/help/ios_images/keyboard-search-3.png rename to ios/docs/help/ios_images/keyboard-search-3.png diff --git a/ios/help/ios_images/keyboard-search-4.png b/ios/docs/help/ios_images/keyboard-search-4.png similarity index 100% rename from ios/help/ios_images/keyboard-search-4.png rename to ios/docs/help/ios_images/keyboard-search-4.png diff --git a/ios/help/ios_images/keyboard-search-5.png b/ios/docs/help/ios_images/keyboard-search-5.png similarity index 100% rename from ios/help/ios_images/keyboard-search-5.png rename to ios/docs/help/ios_images/keyboard-search-5.png diff --git a/ios/help/ios_images/keyman-settings.png b/ios/docs/help/ios_images/keyman-settings.png similarity index 100% rename from ios/help/ios_images/keyman-settings.png rename to ios/docs/help/ios_images/keyman-settings.png diff --git a/ios/help/ios_images/keyman-settings2.png b/ios/docs/help/ios_images/keyman-settings2.png similarity index 100% rename from ios/help/ios_images/keyman-settings2.png rename to ios/docs/help/ios_images/keyman-settings2.png diff --git a/ios/help/ios_images/keyman-settings3.png b/ios/docs/help/ios_images/keyman-settings3.png similarity index 100% rename from ios/help/ios_images/keyman-settings3.png rename to ios/docs/help/ios_images/keyman-settings3.png diff --git a/ios/help/ios_images/keyman-settings4.png b/ios/docs/help/ios_images/keyman-settings4.png similarity index 100% rename from ios/help/ios_images/keyman-settings4.png rename to ios/docs/help/ios_images/keyman-settings4.png diff --git a/ios/help/ios_images/keyman-settings5.png b/ios/docs/help/ios_images/keyman-settings5.png similarity index 100% rename from ios/help/ios_images/keyman-settings5.png rename to ios/docs/help/ios_images/keyman-settings5.png diff --git a/ios/help/ios_images/keyman-settings6.png b/ios/docs/help/ios_images/keyman-settings6.png similarity index 100% rename from ios/help/ios_images/keyman-settings6.png rename to ios/docs/help/ios_images/keyman-settings6.png diff --git a/ios/help/ios_images/language-settings.png b/ios/docs/help/ios_images/language-settings.png similarity index 100% rename from ios/help/ios_images/language-settings.png rename to ios/docs/help/ios_images/language-settings.png diff --git a/ios/help/ios_images/menu-icon.png b/ios/docs/help/ios_images/menu-icon.png similarity index 100% rename from ios/help/ios_images/menu-icon.png rename to ios/docs/help/ios_images/menu-icon.png diff --git a/ios/help/ios_images/package-install-1.png b/ios/docs/help/ios_images/package-install-1.png similarity index 100% rename from ios/help/ios_images/package-install-1.png rename to ios/docs/help/ios_images/package-install-1.png diff --git a/ios/help/ios_images/package-install-2.png b/ios/docs/help/ios_images/package-install-2.png similarity index 100% rename from ios/help/ios_images/package-install-2.png rename to ios/docs/help/ios_images/package-install-2.png diff --git a/ios/help/ios_images/package-install-3.png b/ios/docs/help/ios_images/package-install-3.png similarity index 100% rename from ios/help/ios_images/package-install-3.png rename to ios/docs/help/ios_images/package-install-3.png diff --git a/ios/help/ios_images/package-install-4.png b/ios/docs/help/ios_images/package-install-4.png similarity index 100% rename from ios/help/ios_images/package-install-4.png rename to ios/docs/help/ios_images/package-install-4.png diff --git a/ios/help/ios_images/package-install-5.png b/ios/docs/help/ios_images/package-install-5.png similarity index 100% rename from ios/help/ios_images/package-install-5.png rename to ios/docs/help/ios_images/package-install-5.png diff --git a/ios/help/ios_images/qr-code-share-1i.png b/ios/docs/help/ios_images/qr-code-share-1i.png similarity index 100% rename from ios/help/ios_images/qr-code-share-1i.png rename to ios/docs/help/ios_images/qr-code-share-1i.png diff --git a/ios/help/ios_images/qr-code-share-2i.png b/ios/docs/help/ios_images/qr-code-share-2i.png similarity index 100% rename from ios/help/ios_images/qr-code-share-2i.png rename to ios/docs/help/ios_images/qr-code-share-2i.png diff --git a/ios/help/ios_images/qr-code-share-3i.png b/ios/docs/help/ios_images/qr-code-share-3i.png similarity index 100% rename from ios/help/ios_images/qr-code-share-3i.png rename to ios/docs/help/ios_images/qr-code-share-3i.png diff --git a/ios/help/ios_images/qr-code-share-4i.png b/ios/docs/help/ios_images/qr-code-share-4i.png similarity index 100% rename from ios/help/ios_images/qr-code-share-4i.png rename to ios/docs/help/ios_images/qr-code-share-4i.png diff --git a/ios/help/ios_images/return.png b/ios/docs/help/ios_images/return.png similarity index 100% rename from ios/help/ios_images/return.png rename to ios/docs/help/ios_images/return.png diff --git a/ios/help/ios_images/settings-screen.png b/ios/docs/help/ios_images/settings-screen.png similarity index 100% rename from ios/help/ios_images/settings-screen.png rename to ios/docs/help/ios_images/settings-screen.png diff --git a/ios/help/ios_images/settings-suggestions-i.png b/ios/docs/help/ios_images/settings-suggestions-i.png similarity index 100% rename from ios/help/ios_images/settings-suggestions-i.png rename to ios/docs/help/ios_images/settings-suggestions-i.png diff --git a/ios/help/ios_images/share.png b/ios/docs/help/ios_images/share.png similarity index 100% rename from ios/help/ios_images/share.png rename to ios/docs/help/ios_images/share.png diff --git a/ios/help/ios_images/shift.png b/ios/docs/help/ios_images/shift.png similarity index 100% rename from ios/help/ios_images/shift.png rename to ios/docs/help/ios_images/shift.png diff --git a/ios/help/ios_images/spacebar-caption.png b/ios/docs/help/ios_images/spacebar-caption.png similarity index 100% rename from ios/help/ios_images/spacebar-caption.png rename to ios/docs/help/ios_images/spacebar-caption.png diff --git a/ios/help/ios_images/system-keyboard-cal.png b/ios/docs/help/ios_images/system-keyboard-cal.png similarity index 100% rename from ios/help/ios_images/system-keyboard-cal.png rename to ios/docs/help/ios_images/system-keyboard-cal.png diff --git a/ios/help/ios_images/system-picker-i.png b/ios/docs/help/ios_images/system-picker-i.png similarity index 100% rename from ios/help/ios_images/system-picker-i.png rename to ios/docs/help/ios_images/system-picker-i.png diff --git a/ios/help/ios_images/system-wide-setting.png b/ios/docs/help/ios_images/system-wide-setting.png similarity index 100% rename from ios/help/ios_images/system-wide-setting.png rename to ios/docs/help/ios_images/system-wide-setting.png diff --git a/ios/help/ios_images/themed-banner.png b/ios/docs/help/ios_images/themed-banner.png similarity index 100% rename from ios/help/ios_images/themed-banner.png rename to ios/docs/help/ios_images/themed-banner.png diff --git a/ios/help/ios_images/touch-hold.png b/ios/docs/help/ios_images/touch-hold.png similarity index 100% rename from ios/help/ios_images/touch-hold.png rename to ios/docs/help/ios_images/touch-hold.png diff --git a/ios/help/ios_images/uninstall-delete-i.png b/ios/docs/help/ios_images/uninstall-delete-i.png similarity index 100% rename from ios/help/ios_images/uninstall-delete-i.png rename to ios/docs/help/ios_images/uninstall-delete-i.png diff --git a/ios/help/ios_images/uninstall-list-i.png b/ios/docs/help/ios_images/uninstall-list-i.png similarity index 100% rename from ios/help/ios_images/uninstall-list-i.png rename to ios/docs/help/ios_images/uninstall-list-i.png diff --git a/ios/help/ios_images/video.png b/ios/docs/help/ios_images/video.png similarity index 100% rename from ios/help/ios_images/video.png rename to ios/docs/help/ios_images/video.png diff --git a/ios/help/start/index.md b/ios/docs/help/start/index.md similarity index 100% rename from ios/help/start/index.md rename to ios/docs/help/start/index.md diff --git a/ios/help/start/installing-packages.md b/ios/docs/help/start/installing-packages.md similarity index 100% rename from ios/help/start/installing-packages.md rename to ios/docs/help/start/installing-packages.md diff --git a/ios/help/start/installing-system-keyboard.md b/ios/docs/help/start/installing-system-keyboard.md similarity index 100% rename from ios/help/start/installing-system-keyboard.md rename to ios/docs/help/start/installing-system-keyboard.md diff --git a/ios/help/start/searching-for-keyboards.md b/ios/docs/help/start/searching-for-keyboards.md similarity index 100% rename from ios/help/start/searching-for-keyboards.md rename to ios/docs/help/start/searching-for-keyboards.md diff --git a/ios/help/troubleshooting/index.md b/ios/docs/help/troubleshooting/index.md similarity index 100% rename from ios/help/troubleshooting/index.md rename to ios/docs/help/troubleshooting/index.md diff --git a/ios/help/troubleshooting/installing-fonts.md b/ios/docs/help/troubleshooting/installing-fonts.md similarity index 100% rename from ios/help/troubleshooting/installing-fonts.md rename to ios/docs/help/troubleshooting/installing-fonts.md diff --git a/ios/help/troubleshooting/integrating.md b/ios/docs/help/troubleshooting/integrating.md similarity index 100% rename from ios/help/troubleshooting/integrating.md rename to ios/docs/help/troubleshooting/integrating.md diff --git a/linux/help/about/history.md b/linux/docs/help/about/history.md similarity index 100% rename from linux/help/about/history.md rename to linux/docs/help/about/history.md diff --git a/linux/help/about/index.md b/linux/docs/help/about/index.md similarity index 100% rename from linux/help/about/index.md rename to linux/docs/help/about/index.md diff --git a/linux/help/about/welcome.md b/linux/docs/help/about/welcome.md similarity index 100% rename from linux/help/about/welcome.md rename to linux/docs/help/about/welcome.md diff --git a/linux/help/about/whatsnew.md b/linux/docs/help/about/whatsnew.md similarity index 100% rename from linux/help/about/whatsnew.md rename to linux/docs/help/about/whatsnew.md diff --git a/linux/help/common/index.md b/linux/docs/help/common/index.md similarity index 100% rename from linux/help/common/index.md rename to linux/docs/help/common/index.md diff --git a/linux/help/index.md b/linux/docs/help/index.md similarity index 100% rename from linux/help/index.md rename to linux/docs/help/index.md diff --git a/linux/help/linux_images/add-input-source-khmer-angkor.png b/linux/docs/help/linux_images/add-input-source-khmer-angkor.png similarity index 100% rename from linux/help/linux_images/add-input-source-khmer-angkor.png rename to linux/docs/help/linux_images/add-input-source-khmer-angkor.png diff --git a/linux/help/linux_images/add-input-source-khmer.png b/linux/docs/help/linux_images/add-input-source-khmer.png similarity index 100% rename from linux/help/linux_images/add-input-source-khmer.png rename to linux/docs/help/linux_images/add-input-source-khmer.png diff --git a/linux/help/linux_images/add-input-source.png b/linux/docs/help/linux_images/add-input-source.png similarity index 100% rename from linux/help/linux_images/add-input-source.png rename to linux/docs/help/linux_images/add-input-source.png diff --git a/linux/help/linux_images/download-khmer-angkor.png b/linux/docs/help/linux_images/download-khmer-angkor.png similarity index 100% rename from linux/help/linux_images/download-khmer-angkor.png rename to linux/docs/help/linux_images/download-khmer-angkor.png diff --git a/linux/help/linux_images/km-config-khmer-angkor.png b/linux/docs/help/linux_images/km-config-khmer-angkor.png similarity index 100% rename from linux/help/linux_images/km-config-khmer-angkor.png rename to linux/docs/help/linux_images/km-config-khmer-angkor.png diff --git a/linux/help/linux_images/km-config.png b/linux/docs/help/linux_images/km-config.png similarity index 100% rename from linux/help/linux_images/km-config.png rename to linux/docs/help/linux_images/km-config.png diff --git a/linux/help/linux_images/mobile viewport.png b/linux/docs/help/linux_images/mobile viewport.png similarity index 100% rename from linux/help/linux_images/mobile viewport.png rename to linux/docs/help/linux_images/mobile viewport.png diff --git a/linux/help/linux_images/onboard.png b/linux/docs/help/linux_images/onboard.png similarity index 100% rename from linux/help/linux_images/onboard.png rename to linux/docs/help/linux_images/onboard.png diff --git a/linux/help/linux_images/package-khmer-angkor-welcome.png b/linux/docs/help/linux_images/package-khmer-angkor-welcome.png similarity index 100% rename from linux/help/linux_images/package-khmer-angkor-welcome.png rename to linux/docs/help/linux_images/package-khmer-angkor-welcome.png diff --git a/linux/help/linux_images/region-and-language.png b/linux/docs/help/linux_images/region-and-language.png similarity index 100% rename from linux/help/linux_images/region-and-language.png rename to linux/docs/help/linux_images/region-and-language.png diff --git a/linux/help/linux_images/region-language-khmer-angkor.png b/linux/docs/help/linux_images/region-language-khmer-angkor.png similarity index 100% rename from linux/help/linux_images/region-language-khmer-angkor.png rename to linux/docs/help/linux_images/region-language-khmer-angkor.png diff --git a/linux/help/linux_images/search-khmer-angkor.png b/linux/docs/help/linux_images/search-khmer-angkor.png similarity index 100% rename from linux/help/linux_images/search-khmer-angkor.png rename to linux/docs/help/linux_images/search-khmer-angkor.png diff --git a/linux/help/linux_images/video.png b/linux/docs/help/linux_images/video.png similarity index 100% rename from linux/help/linux_images/video.png rename to linux/docs/help/linux_images/video.png diff --git a/linux/help/reference/index.md b/linux/docs/help/reference/index.md similarity index 100% rename from linux/help/reference/index.md rename to linux/docs/help/reference/index.md diff --git a/linux/help/start/index.md b/linux/docs/help/start/index.md similarity index 100% rename from linux/help/start/index.md rename to linux/docs/help/start/index.md diff --git a/linux/help/start/installing-keyboard.md b/linux/docs/help/start/installing-keyboard.md similarity index 100% rename from linux/help/start/installing-keyboard.md rename to linux/docs/help/start/installing-keyboard.md diff --git a/mac/help/about/history.md b/mac/docs/help/about/history.md similarity index 100% rename from mac/help/about/history.md rename to mac/docs/help/about/history.md diff --git a/mac/help/about/index.md b/mac/docs/help/about/index.md similarity index 100% rename from mac/help/about/index.md rename to mac/docs/help/about/index.md diff --git a/mac/help/about/requirements.md b/mac/docs/help/about/requirements.md similarity index 100% rename from mac/help/about/requirements.md rename to mac/docs/help/about/requirements.md diff --git a/mac/help/about/welcome.md b/mac/docs/help/about/welcome.md similarity index 100% rename from mac/help/about/welcome.md rename to mac/docs/help/about/welcome.md diff --git a/mac/help/about/whatsnew.md b/mac/docs/help/about/whatsnew.md similarity index 100% rename from mac/help/about/whatsnew.md rename to mac/docs/help/about/whatsnew.md diff --git a/mac/help/basic/config/index.md b/mac/docs/help/basic/config/index.md similarity index 100% rename from mac/help/basic/config/index.md rename to mac/docs/help/basic/config/index.md diff --git a/mac/help/basic/config/keyboards.md b/mac/docs/help/basic/config/keyboards.md similarity index 100% rename from mac/help/basic/config/keyboards.md rename to mac/docs/help/basic/config/keyboards.md diff --git a/mac/help/basic/config/options.md b/mac/docs/help/basic/config/options.md similarity index 100% rename from mac/help/basic/config/options.md rename to mac/docs/help/basic/config/options.md diff --git a/mac/help/basic/config/support.md b/mac/docs/help/basic/config/support.md similarity index 100% rename from mac/help/basic/config/support.md rename to mac/docs/help/basic/config/support.md diff --git a/mac/help/basic/index.md b/mac/docs/help/basic/index.md similarity index 100% rename from mac/help/basic/index.md rename to mac/docs/help/basic/index.md diff --git a/mac/help/common/adware.md b/mac/docs/help/common/adware.md similarity index 100% rename from mac/help/common/adware.md rename to mac/docs/help/common/adware.md diff --git a/mac/help/common/bug.md b/mac/docs/help/common/bug.md similarity index 100% rename from mac/help/common/bug.md rename to mac/docs/help/common/bug.md diff --git a/mac/help/common/free.md b/mac/docs/help/common/free.md similarity index 100% rename from mac/help/common/free.md rename to mac/docs/help/common/free.md diff --git a/mac/help/common/index.md b/mac/docs/help/common/index.md similarity index 100% rename from mac/help/common/index.md rename to mac/docs/help/common/index.md diff --git a/mac/help/common/keyboards.md b/mac/docs/help/common/keyboards.md similarity index 100% rename from mac/help/common/keyboards.md rename to mac/docs/help/common/keyboards.md diff --git a/mac/help/common/os.md b/mac/docs/help/common/os.md similarity index 100% rename from mac/help/common/os.md rename to mac/docs/help/common/os.md diff --git a/mac/help/common/osk.md b/mac/docs/help/common/osk.md similarity index 100% rename from mac/help/common/osk.md rename to mac/docs/help/common/osk.md diff --git a/mac/help/common/requirements.md b/mac/docs/help/common/requirements.md similarity index 100% rename from mac/help/common/requirements.md rename to mac/docs/help/common/requirements.md diff --git a/mac/help/common/support.md b/mac/docs/help/common/support.md similarity index 100% rename from mac/help/common/support.md rename to mac/docs/help/common/support.md diff --git a/mac/help/index.md b/mac/docs/help/index.md similarity index 100% rename from mac/help/index.md rename to mac/docs/help/index.md diff --git a/mac/help/mac_images/add.png b/mac/docs/help/mac_images/add.png similarity index 100% rename from mac/help/mac_images/add.png rename to mac/docs/help/mac_images/add.png diff --git a/mac/help/mac_images/add_keyman.png b/mac/docs/help/mac_images/add_keyman.png similarity index 100% rename from mac/help/mac_images/add_keyman.png rename to mac/docs/help/mac_images/add_keyman.png diff --git a/mac/help/mac_images/apple_menu.png b/mac/docs/help/mac_images/apple_menu.png similarity index 100% rename from mac/help/mac_images/apple_menu.png rename to mac/docs/help/mac_images/apple_menu.png diff --git a/mac/help/mac_images/go_to_folder.png b/mac/docs/help/mac_images/go_to_folder.png similarity index 100% rename from mac/help/mac_images/go_to_folder.png rename to mac/docs/help/mac_images/go_to_folder.png diff --git a/mac/help/mac_images/help_button.png b/mac/docs/help/mac_images/help_button.png similarity index 100% rename from mac/help/mac_images/help_button.png rename to mac/docs/help/mac_images/help_button.png diff --git a/mac/help/mac_images/icon-fonts.png b/mac/docs/help/mac_images/icon-fonts.png similarity index 100% rename from mac/help/mac_images/icon-fonts.png rename to mac/docs/help/mac_images/icon-fonts.png diff --git a/mac/help/mac_images/icon-help.png b/mac/docs/help/mac_images/icon-help.png similarity index 100% rename from mac/help/mac_images/icon-help.png rename to mac/docs/help/mac_images/icon-help.png diff --git a/mac/help/mac_images/icon-intro.png b/mac/docs/help/mac_images/icon-intro.png similarity index 100% rename from mac/help/mac_images/icon-intro.png rename to mac/docs/help/mac_images/icon-intro.png diff --git a/mac/help/mac_images/icon-keyman.png b/mac/docs/help/mac_images/icon-keyman.png similarity index 100% rename from mac/help/mac_images/icon-keyman.png rename to mac/docs/help/mac_images/icon-keyman.png diff --git a/mac/help/mac_images/icon-osk.png b/mac/docs/help/mac_images/icon-osk.png similarity index 100% rename from mac/help/mac_images/icon-osk.png rename to mac/docs/help/mac_images/icon-osk.png diff --git a/mac/help/mac_images/icon-unicode.png b/mac/docs/help/mac_images/icon-unicode.png similarity index 100% rename from mac/help/mac_images/icon-unicode.png rename to mac/docs/help/mac_images/icon-unicode.png diff --git a/mac/help/mac_images/information_button.png b/mac/docs/help/mac_images/information_button.png similarity index 100% rename from mac/help/mac_images/information_button.png rename to mac/docs/help/mac_images/information_button.png diff --git a/mac/help/mac_images/input_menu.png b/mac/docs/help/mac_images/input_menu.png similarity index 100% rename from mac/help/mac_images/input_menu.png rename to mac/docs/help/mac_images/input_menu.png diff --git a/mac/help/mac_images/keyboards_menu.png b/mac/docs/help/mac_images/keyboards_menu.png similarity index 100% rename from mac/help/mac_images/keyboards_menu.png rename to mac/docs/help/mac_images/keyboards_menu.png diff --git a/mac/help/mac_images/keyman_config.png b/mac/docs/help/mac_images/keyman_config.png similarity index 100% rename from mac/help/mac_images/keyman_config.png rename to mac/docs/help/mac_images/keyman_config.png diff --git a/mac/help/mac_images/keyman_install.png b/mac/docs/help/mac_images/keyman_install.png similarity index 100% rename from mac/help/mac_images/keyman_install.png rename to mac/docs/help/mac_images/keyman_install.png diff --git a/mac/help/mac_images/keyman_menu_config.png b/mac/docs/help/mac_images/keyman_menu_config.png similarity index 100% rename from mac/help/mac_images/keyman_menu_config.png rename to mac/docs/help/mac_images/keyman_menu_config.png diff --git a/mac/help/mac_images/menu_bar.png b/mac/docs/help/mac_images/menu_bar.png similarity index 100% rename from mac/help/mac_images/menu_bar.png rename to mac/docs/help/mac_images/menu_bar.png diff --git a/mac/help/mac_images/menu_bar_keyman.png b/mac/docs/help/mac_images/menu_bar_keyman.png similarity index 100% rename from mac/help/mac_images/menu_bar_keyman.png rename to mac/docs/help/mac_images/menu_bar_keyman.png diff --git a/mac/help/mac_images/osk_amharic.png b/mac/docs/help/mac_images/osk_amharic.png similarity index 100% rename from mac/help/mac_images/osk_amharic.png rename to mac/docs/help/mac_images/osk_amharic.png diff --git a/mac/help/mac_images/privacy_accessibility.png b/mac/docs/help/mac_images/privacy_accessibility.png similarity index 100% rename from mac/help/mac_images/privacy_accessibility.png rename to mac/docs/help/mac_images/privacy_accessibility.png diff --git a/mac/help/mac_images/privacy_files_and_folders.png b/mac/docs/help/mac_images/privacy_files_and_folders.png similarity index 100% rename from mac/help/mac_images/privacy_files_and_folders.png rename to mac/docs/help/mac_images/privacy_files_and_folders.png diff --git a/mac/help/mac_images/privacy_input_monitoring.png b/mac/docs/help/mac_images/privacy_input_monitoring.png similarity index 100% rename from mac/help/mac_images/privacy_input_monitoring.png rename to mac/docs/help/mac_images/privacy_input_monitoring.png diff --git a/mac/help/mac_images/privacy_input_monitoring_locked.png b/mac/docs/help/mac_images/privacy_input_monitoring_locked.png similarity index 100% rename from mac/help/mac_images/privacy_input_monitoring_locked.png rename to mac/docs/help/mac_images/privacy_input_monitoring_locked.png diff --git a/mac/help/mac_images/remove.png b/mac/docs/help/mac_images/remove.png similarity index 100% rename from mac/help/mac_images/remove.png rename to mac/docs/help/mac_images/remove.png diff --git a/mac/help/mac_images/remove_button.png b/mac/docs/help/mac_images/remove_button.png similarity index 100% rename from mac/help/mac_images/remove_button.png rename to mac/docs/help/mac_images/remove_button.png diff --git a/mac/help/mac_images/remove_keyman.png b/mac/docs/help/mac_images/remove_keyman.png similarity index 100% rename from mac/help/mac_images/remove_keyman.png rename to mac/docs/help/mac_images/remove_keyman.png diff --git a/mac/help/mac_images/system_preferences.png b/mac/docs/help/mac_images/system_preferences.png similarity index 100% rename from mac/help/mac_images/system_preferences.png rename to mac/docs/help/mac_images/system_preferences.png diff --git a/mac/help/mac_images/video.png b/mac/docs/help/mac_images/video.png similarity index 100% rename from mac/help/mac_images/video.png rename to mac/docs/help/mac_images/video.png diff --git a/mac/help/start/index.md b/mac/docs/help/start/index.md similarity index 100% rename from mac/help/start/index.md rename to mac/docs/help/start/index.md diff --git a/mac/help/start/install-keyboard.md b/mac/docs/help/start/install-keyboard.md similarity index 100% rename from mac/help/start/install-keyboard.md rename to mac/docs/help/start/install-keyboard.md diff --git a/mac/help/start/install-keyman.md b/mac/docs/help/start/install-keyman.md similarity index 100% rename from mac/help/start/install-keyman.md rename to mac/docs/help/start/install-keyman.md diff --git a/mac/help/start/tutorial.md b/mac/docs/help/start/tutorial.md similarity index 100% rename from mac/help/start/tutorial.md rename to mac/docs/help/start/tutorial.md diff --git a/mac/help/troubleshooting/configure-security.md b/mac/docs/help/troubleshooting/configure-security.md similarity index 100% rename from mac/help/troubleshooting/configure-security.md rename to mac/docs/help/troubleshooting/configure-security.md diff --git a/mac/help/troubleshooting/index.md b/mac/docs/help/troubleshooting/index.md similarity index 100% rename from mac/help/troubleshooting/index.md rename to mac/docs/help/troubleshooting/index.md diff --git a/mac/help/troubleshooting/uninstall-keyman.md b/mac/docs/help/troubleshooting/uninstall-keyman.md similarity index 100% rename from mac/help/troubleshooting/uninstall-keyman.md rename to mac/docs/help/troubleshooting/uninstall-keyman.md diff --git a/windows/src/desktop/help/Kmhelp.css b/windows/docs/help/Kmhelp.css similarity index 100% rename from windows/src/desktop/help/Kmhelp.css rename to windows/docs/help/Kmhelp.css diff --git a/windows/src/desktop/help/about/credits.md b/windows/docs/help/about/credits.md similarity index 100% rename from windows/src/desktop/help/about/credits.md rename to windows/docs/help/about/credits.md diff --git a/windows/src/desktop/help/about/history.md b/windows/docs/help/about/history.md similarity index 100% rename from windows/src/desktop/help/about/history.md rename to windows/docs/help/about/history.md diff --git a/windows/src/desktop/help/about/index.md b/windows/docs/help/about/index.md similarity index 100% rename from windows/src/desktop/help/about/index.md rename to windows/docs/help/about/index.md diff --git a/windows/src/desktop/help/about/license.md b/windows/docs/help/about/license.md similarity index 100% rename from windows/src/desktop/help/about/license.md rename to windows/docs/help/about/license.md diff --git a/windows/src/desktop/help/about/requirements.md b/windows/docs/help/about/requirements.md similarity index 100% rename from windows/src/desktop/help/about/requirements.md rename to windows/docs/help/about/requirements.md diff --git a/windows/src/desktop/help/about/welcome.md b/windows/docs/help/about/welcome.md similarity index 100% rename from windows/src/desktop/help/about/welcome.md rename to windows/docs/help/about/welcome.md diff --git a/windows/src/desktop/help/about/whatsnew.md b/windows/docs/help/about/whatsnew.md similarity index 100% rename from windows/src/desktop/help/about/whatsnew.md rename to windows/docs/help/about/whatsnew.md diff --git a/windows/src/desktop/help/advanced/index.md b/windows/docs/help/advanced/index.md similarity index 100% rename from windows/src/desktop/help/advanced/index.md rename to windows/docs/help/advanced/index.md diff --git a/windows/src/desktop/help/advanced/locale_edit.md b/windows/docs/help/advanced/locale_edit.md similarity index 100% rename from windows/src/desktop/help/advanced/locale_edit.md rename to windows/docs/help/advanced/locale_edit.md diff --git a/windows/src/desktop/help/advanced/proxy_config.md b/windows/docs/help/advanced/proxy_config.md similarity index 100% rename from windows/src/desktop/help/advanced/proxy_config.md rename to windows/docs/help/advanced/proxy_config.md diff --git a/windows/src/desktop/help/basic/config/hotkeys.md b/windows/docs/help/basic/config/hotkeys.md similarity index 100% rename from windows/src/desktop/help/basic/config/hotkeys.md rename to windows/docs/help/basic/config/hotkeys.md diff --git a/windows/src/desktop/help/basic/config/index.md b/windows/docs/help/basic/config/index.md similarity index 100% rename from windows/src/desktop/help/basic/config/index.md rename to windows/docs/help/basic/config/index.md diff --git a/windows/src/desktop/help/basic/config/keep-in-touch.md b/windows/docs/help/basic/config/keep-in-touch.md similarity index 100% rename from windows/src/desktop/help/basic/config/keep-in-touch.md rename to windows/docs/help/basic/config/keep-in-touch.md diff --git a/windows/src/desktop/help/basic/config/keyboards.md b/windows/docs/help/basic/config/keyboards.md similarity index 100% rename from windows/src/desktop/help/basic/config/keyboards.md rename to windows/docs/help/basic/config/keyboards.md diff --git a/windows/src/desktop/help/basic/config/options.md b/windows/docs/help/basic/config/options.md similarity index 100% rename from windows/src/desktop/help/basic/config/options.md rename to windows/docs/help/basic/config/options.md diff --git a/windows/src/desktop/help/basic/config/support.md b/windows/docs/help/basic/config/support.md similarity index 100% rename from windows/src/desktop/help/basic/config/support.md rename to windows/docs/help/basic/config/support.md diff --git a/windows/src/desktop/help/basic/enable-or-disable-keyboard.md b/windows/docs/help/basic/enable-or-disable-keyboard.md similarity index 100% rename from windows/src/desktop/help/basic/enable-or-disable-keyboard.md rename to windows/docs/help/basic/enable-or-disable-keyboard.md diff --git a/windows/src/desktop/help/basic/help.md b/windows/docs/help/basic/help.md similarity index 100% rename from windows/src/desktop/help/basic/help.md rename to windows/docs/help/basic/help.md diff --git a/windows/src/desktop/help/basic/index.md b/windows/docs/help/basic/index.md similarity index 100% rename from windows/src/desktop/help/basic/index.md rename to windows/docs/help/basic/index.md diff --git a/windows/src/desktop/help/basic/language-switcher.md b/windows/docs/help/basic/language-switcher.md similarity index 100% rename from windows/src/desktop/help/basic/language-switcher.md rename to windows/docs/help/basic/language-switcher.md diff --git a/windows/src/desktop/help/basic/make-taskbar-icon-visible.md b/windows/docs/help/basic/make-taskbar-icon-visible.md similarity index 100% rename from windows/src/desktop/help/basic/make-taskbar-icon-visible.md rename to windows/docs/help/basic/make-taskbar-icon-visible.md diff --git a/windows/src/desktop/help/basic/new-ways-to-use-keyman.md b/windows/docs/help/basic/new-ways-to-use-keyman.md similarity index 100% rename from windows/src/desktop/help/basic/new-ways-to-use-keyman.md rename to windows/docs/help/basic/new-ways-to-use-keyman.md diff --git a/windows/src/desktop/help/basic/select-keyboard.md b/windows/docs/help/basic/select-keyboard.md similarity index 100% rename from windows/src/desktop/help/basic/select-keyboard.md rename to windows/docs/help/basic/select-keyboard.md diff --git a/windows/src/desktop/help/basic/text-editor.md b/windows/docs/help/basic/text-editor.md similarity index 100% rename from windows/src/desktop/help/basic/text-editor.md rename to windows/docs/help/basic/text-editor.md diff --git a/windows/src/desktop/help/basic/toolbox/character-map.md b/windows/docs/help/basic/toolbox/character-map.md similarity index 100% rename from windows/src/desktop/help/basic/toolbox/character-map.md rename to windows/docs/help/basic/toolbox/character-map.md diff --git a/windows/src/desktop/help/basic/toolbox/font-helper.md b/windows/docs/help/basic/toolbox/font-helper.md similarity index 100% rename from windows/src/desktop/help/basic/toolbox/font-helper.md rename to windows/docs/help/basic/toolbox/font-helper.md diff --git a/windows/src/desktop/help/basic/toolbox/index.md b/windows/docs/help/basic/toolbox/index.md similarity index 100% rename from windows/src/desktop/help/basic/toolbox/index.md rename to windows/docs/help/basic/toolbox/index.md diff --git a/windows/src/desktop/help/basic/toolbox/osk.md b/windows/docs/help/basic/toolbox/osk.md similarity index 100% rename from windows/src/desktop/help/basic/toolbox/osk.md rename to windows/docs/help/basic/toolbox/osk.md diff --git a/windows/src/desktop/help/basic/tray-menu.md b/windows/docs/help/basic/tray-menu.md similarity index 100% rename from windows/src/desktop/help/basic/tray-menu.md rename to windows/docs/help/basic/tray-menu.md diff --git a/windows/src/desktop/help/basic/uninstall-keyboard.md b/windows/docs/help/basic/uninstall-keyboard.md similarity index 100% rename from windows/src/desktop/help/basic/uninstall-keyboard.md rename to windows/docs/help/basic/uninstall-keyboard.md diff --git a/windows/src/desktop/help/basic/uninstall.md b/windows/docs/help/basic/uninstall.md similarity index 100% rename from windows/src/desktop/help/basic/uninstall.md rename to windows/docs/help/basic/uninstall.md diff --git a/windows/src/desktop/help/basic/update.md b/windows/docs/help/basic/update.md similarity index 100% rename from windows/src/desktop/help/basic/update.md rename to windows/docs/help/basic/update.md diff --git a/windows/src/desktop/help/common/adware.md b/windows/docs/help/common/adware.md similarity index 100% rename from windows/src/desktop/help/common/adware.md rename to windows/docs/help/common/adware.md diff --git a/windows/src/desktop/help/common/bug.md b/windows/docs/help/common/bug.md similarity index 100% rename from windows/src/desktop/help/common/bug.md rename to windows/docs/help/common/bug.md diff --git a/windows/src/desktop/help/common/compatibility.md b/windows/docs/help/common/compatibility.md similarity index 100% rename from windows/src/desktop/help/common/compatibility.md rename to windows/docs/help/common/compatibility.md diff --git a/windows/src/desktop/help/common/free.md b/windows/docs/help/common/free.md similarity index 100% rename from windows/src/desktop/help/common/free.md rename to windows/docs/help/common/free.md diff --git a/windows/src/desktop/help/common/index.md b/windows/docs/help/common/index.md similarity index 100% rename from windows/src/desktop/help/common/index.md rename to windows/docs/help/common/index.md diff --git a/windows/src/desktop/help/common/linux.md b/windows/docs/help/common/linux.md similarity index 100% rename from windows/src/desktop/help/common/linux.md rename to windows/docs/help/common/linux.md diff --git a/windows/src/desktop/help/common/mac.md b/windows/docs/help/common/mac.md similarity index 100% rename from windows/src/desktop/help/common/mac.md rename to windows/docs/help/common/mac.md diff --git a/windows/src/desktop/help/common/old_version.md b/windows/docs/help/common/old_version.md similarity index 100% rename from windows/src/desktop/help/common/old_version.md rename to windows/docs/help/common/old_version.md diff --git a/windows/src/desktop/help/common/os.md b/windows/docs/help/common/os.md similarity index 100% rename from windows/src/desktop/help/common/os.md rename to windows/docs/help/common/os.md diff --git a/windows/src/desktop/help/common/osk.md b/windows/docs/help/common/osk.md similarity index 100% rename from windows/src/desktop/help/common/osk.md rename to windows/docs/help/common/osk.md diff --git a/windows/src/desktop/help/common/requirements.md b/windows/docs/help/common/requirements.md similarity index 100% rename from windows/src/desktop/help/common/requirements.md rename to windows/docs/help/common/requirements.md diff --git a/windows/src/desktop/help/common/support.md b/windows/docs/help/common/support.md similarity index 100% rename from windows/src/desktop/help/common/support.md rename to windows/docs/help/common/support.md diff --git a/windows/src/desktop/help/common/unicode.md b/windows/docs/help/common/unicode.md similarity index 100% rename from windows/src/desktop/help/common/unicode.md rename to windows/docs/help/common/unicode.md diff --git a/windows/src/desktop/help/context/base-keyboard.md b/windows/docs/help/context/base-keyboard.md similarity index 100% rename from windows/src/desktop/help/context/base-keyboard.md rename to windows/docs/help/context/base-keyboard.md diff --git a/windows/src/desktop/help/context/change-hotkey.md b/windows/docs/help/context/change-hotkey.md similarity index 100% rename from windows/src/desktop/help/context/change-hotkey.md rename to windows/docs/help/context/change-hotkey.md diff --git a/windows/src/desktop/help/context/configuration-hotkeys.md b/windows/docs/help/context/configuration-hotkeys.md similarity index 100% rename from windows/src/desktop/help/context/configuration-hotkeys.md rename to windows/docs/help/context/configuration-hotkeys.md diff --git a/windows/src/desktop/help/context/configuration-keepintouch.md b/windows/docs/help/context/configuration-keepintouch.md similarity index 100% rename from windows/src/desktop/help/context/configuration-keepintouch.md rename to windows/docs/help/context/configuration-keepintouch.md diff --git a/windows/src/desktop/help/context/configuration-keyboards.md b/windows/docs/help/context/configuration-keyboards.md similarity index 100% rename from windows/src/desktop/help/context/configuration-keyboards.md rename to windows/docs/help/context/configuration-keyboards.md diff --git a/windows/src/desktop/help/context/configuration-options.md b/windows/docs/help/context/configuration-options.md similarity index 100% rename from windows/src/desktop/help/context/configuration-options.md rename to windows/docs/help/context/configuration-options.md diff --git a/windows/src/desktop/help/context/configuration-support.md b/windows/docs/help/context/configuration-support.md similarity index 100% rename from windows/src/desktop/help/context/configuration-support.md rename to windows/docs/help/context/configuration-support.md diff --git a/windows/src/desktop/help/context/download-keyboard.md b/windows/docs/help/context/download-keyboard.md similarity index 100% rename from windows/src/desktop/help/context/download-keyboard.md rename to windows/docs/help/context/download-keyboard.md diff --git a/windows/src/desktop/help/context/index.md b/windows/docs/help/context/index.md similarity index 100% rename from windows/src/desktop/help/context/index.md rename to windows/docs/help/context/index.md diff --git a/windows/src/desktop/help/context/install-keyboard-language.md b/windows/docs/help/context/install-keyboard-language.md similarity index 100% rename from windows/src/desktop/help/context/install-keyboard-language.md rename to windows/docs/help/context/install-keyboard-language.md diff --git a/windows/src/desktop/help/context/install-keyboard.md b/windows/docs/help/context/install-keyboard.md similarity index 100% rename from windows/src/desktop/help/context/install-keyboard.md rename to windows/docs/help/context/install-keyboard.md diff --git a/windows/src/desktop/help/context/keyman.md b/windows/docs/help/context/keyman.md similarity index 100% rename from windows/src/desktop/help/context/keyman.md rename to windows/docs/help/context/keyman.md diff --git a/windows/src/desktop/help/context/online-update.md b/windows/docs/help/context/online-update.md similarity index 100% rename from windows/src/desktop/help/context/online-update.md rename to windows/docs/help/context/online-update.md diff --git a/windows/src/desktop/help/context/proxy-configuration.md b/windows/docs/help/context/proxy-configuration.md similarity index 100% rename from windows/src/desktop/help/context/proxy-configuration.md rename to windows/docs/help/context/proxy-configuration.md diff --git a/windows/src/desktop/help/context/splash.md b/windows/docs/help/context/splash.md similarity index 100% rename from windows/src/desktop/help/context/splash.md rename to windows/docs/help/context/splash.md diff --git a/windows/src/desktop/help/context/text-editor.md b/windows/docs/help/context/text-editor.md similarity index 100% rename from windows/src/desktop/help/context/text-editor.md rename to windows/docs/help/context/text-editor.md diff --git a/windows/src/desktop/help/context/toolbox-charactermap.md b/windows/docs/help/context/toolbox-charactermap.md similarity index 100% rename from windows/src/desktop/help/context/toolbox-charactermap.md rename to windows/docs/help/context/toolbox-charactermap.md diff --git a/windows/src/desktop/help/context/toolbox-fonthelper.md b/windows/docs/help/context/toolbox-fonthelper.md similarity index 100% rename from windows/src/desktop/help/context/toolbox-fonthelper.md rename to windows/docs/help/context/toolbox-fonthelper.md diff --git a/windows/src/desktop/help/context/toolbox-onscreenkeyboard.md b/windows/docs/help/context/toolbox-onscreenkeyboard.md similarity index 100% rename from windows/src/desktop/help/context/toolbox-onscreenkeyboard.md rename to windows/docs/help/context/toolbox-onscreenkeyboard.md diff --git a/windows/src/desktop/help/context/tray-menu.md b/windows/docs/help/context/tray-menu.md similarity index 100% rename from windows/src/desktop/help/context/tray-menu.md rename to windows/docs/help/context/tray-menu.md diff --git a/windows/src/desktop/help/desktop_images/7-taskbar.png b/windows/docs/help/desktop_images/7-taskbar.png similarity index 100% rename from windows/src/desktop/help/desktop_images/7-taskbar.png rename to windows/docs/help/desktop_images/7-taskbar.png diff --git a/windows/src/desktop/help/desktop_images/charmap-big.png b/windows/docs/help/desktop_images/charmap-big.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-big.png rename to windows/docs/help/desktop_images/charmap-big.png diff --git a/windows/src/desktop/help/desktop_images/charmap-button.png b/windows/docs/help/desktop_images/charmap-button.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-button.png rename to windows/docs/help/desktop_images/charmap-button.png diff --git a/windows/src/desktop/help/desktop_images/charmap-filter.png b/windows/docs/help/desktop_images/charmap-filter.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-filter.png rename to windows/docs/help/desktop_images/charmap-filter.png diff --git a/windows/src/desktop/help/desktop_images/charmap-filterdialog.png b/windows/docs/help/desktop_images/charmap-filterdialog.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-filterdialog.png rename to windows/docs/help/desktop_images/charmap-filterdialog.png diff --git a/windows/src/desktop/help/desktop_images/charmap-font.png b/windows/docs/help/desktop_images/charmap-font.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-font.png rename to windows/docs/help/desktop_images/charmap-font.png diff --git a/windows/src/desktop/help/desktop_images/charmap-goto.png b/windows/docs/help/desktop_images/charmap-goto.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-goto.png rename to windows/docs/help/desktop_images/charmap-goto.png diff --git a/windows/src/desktop/help/desktop_images/charmap-insert.png b/windows/docs/help/desktop_images/charmap-insert.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-insert.png rename to windows/docs/help/desktop_images/charmap-insert.png diff --git a/windows/src/desktop/help/desktop_images/charmap-options.png b/windows/docs/help/desktop_images/charmap-options.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-options.png rename to windows/docs/help/desktop_images/charmap-options.png diff --git a/windows/src/desktop/help/desktop_images/charmap-quality.png b/windows/docs/help/desktop_images/charmap-quality.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap-quality.png rename to windows/docs/help/desktop_images/charmap-quality.png diff --git a/windows/src/desktop/help/desktop_images/charmap.png b/windows/docs/help/desktop_images/charmap.png similarity index 100% rename from windows/src/desktop/help/desktop_images/charmap.png rename to windows/docs/help/desktop_images/charmap.png diff --git a/windows/src/desktop/help/desktop_images/config-locale.png b/windows/docs/help/desktop_images/config-locale.png similarity index 100% rename from windows/src/desktop/help/desktop_images/config-locale.png rename to windows/docs/help/desktop_images/config-locale.png diff --git a/windows/src/desktop/help/desktop_images/download-keyboard-step0.png b/windows/docs/help/desktop_images/download-keyboard-step0.png similarity index 100% rename from windows/src/desktop/help/desktop_images/download-keyboard-step0.png rename to windows/docs/help/desktop_images/download-keyboard-step0.png diff --git a/windows/src/desktop/help/desktop_images/download-keyboard-step1.png b/windows/docs/help/desktop_images/download-keyboard-step1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/download-keyboard-step1.png rename to windows/docs/help/desktop_images/download-keyboard-step1.png diff --git a/windows/src/desktop/help/desktop_images/download-keyboard-step2.png b/windows/docs/help/desktop_images/download-keyboard-step2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/download-keyboard-step2.png rename to windows/docs/help/desktop_images/download-keyboard-step2.png diff --git a/windows/src/desktop/help/desktop_images/download-keyboard-step3.png b/windows/docs/help/desktop_images/download-keyboard-step3.png similarity index 100% rename from windows/src/desktop/help/desktop_images/download-keyboard-step3.png rename to windows/docs/help/desktop_images/download-keyboard-step3.png diff --git a/windows/src/desktop/help/desktop_images/download-keyboard-step4.png b/windows/docs/help/desktop_images/download-keyboard-step4.png similarity index 100% rename from windows/src/desktop/help/desktop_images/download-keyboard-step4.png rename to windows/docs/help/desktop_images/download-keyboard-step4.png diff --git a/windows/src/desktop/help/desktop_images/download-keyboard-step5.png b/windows/docs/help/desktop_images/download-keyboard-step5.png similarity index 100% rename from windows/src/desktop/help/desktop_images/download-keyboard-step5.png rename to windows/docs/help/desktop_images/download-keyboard-step5.png diff --git a/windows/src/desktop/help/desktop_images/download-keyboard-step6.png b/windows/docs/help/desktop_images/download-keyboard-step6.png similarity index 100% rename from windows/src/desktop/help/desktop_images/download-keyboard-step6.png rename to windows/docs/help/desktop_images/download-keyboard-step6.png diff --git a/windows/src/desktop/help/desktop_images/fonthelper.png b/windows/docs/help/desktop_images/fonthelper.png similarity index 100% rename from windows/src/desktop/help/desktop_images/fonthelper.png rename to windows/docs/help/desktop_images/fonthelper.png diff --git a/windows/src/desktop/help/desktop_images/help-dialog.png b/windows/docs/help/desktop_images/help-dialog.png similarity index 100% rename from windows/src/desktop/help/desktop_images/help-dialog.png rename to windows/docs/help/desktop_images/help-dialog.png diff --git a/windows/src/desktop/help/desktop_images/hotkeys-change.png b/windows/docs/help/desktop_images/hotkeys-change.png similarity index 100% rename from windows/src/desktop/help/desktop_images/hotkeys-change.png rename to windows/docs/help/desktop_images/hotkeys-change.png diff --git a/windows/src/desktop/help/desktop_images/icon-fonts.png b/windows/docs/help/desktop_images/icon-fonts.png similarity index 100% rename from windows/src/desktop/help/desktop_images/icon-fonts.png rename to windows/docs/help/desktop_images/icon-fonts.png diff --git a/windows/src/desktop/help/desktop_images/icon-help.png b/windows/docs/help/desktop_images/icon-help.png similarity index 100% rename from windows/src/desktop/help/desktop_images/icon-help.png rename to windows/docs/help/desktop_images/icon-help.png diff --git a/windows/src/desktop/help/desktop_images/icon-intro.png b/windows/docs/help/desktop_images/icon-intro.png similarity index 100% rename from windows/src/desktop/help/desktop_images/icon-intro.png rename to windows/docs/help/desktop_images/icon-intro.png diff --git a/windows/src/desktop/help/desktop_images/icon-introductory-help.png b/windows/docs/help/desktop_images/icon-introductory-help.png similarity index 100% rename from windows/src/desktop/help/desktop_images/icon-introductory-help.png rename to windows/docs/help/desktop_images/icon-introductory-help.png diff --git a/windows/src/desktop/help/desktop_images/icon-keyman.png b/windows/docs/help/desktop_images/icon-keyman.png similarity index 100% rename from windows/src/desktop/help/desktop_images/icon-keyman.png rename to windows/docs/help/desktop_images/icon-keyman.png diff --git a/windows/src/desktop/help/desktop_images/icon-osk.png b/windows/docs/help/desktop_images/icon-osk.png similarity index 100% rename from windows/src/desktop/help/desktop_images/icon-osk.png rename to windows/docs/help/desktop_images/icon-osk.png diff --git a/windows/src/desktop/help/desktop_images/icon-unicode.png b/windows/docs/help/desktop_images/icon-unicode.png similarity index 100% rename from windows/src/desktop/help/desktop_images/icon-unicode.png rename to windows/docs/help/desktop_images/icon-unicode.png diff --git a/windows/src/desktop/help/desktop_images/icon-uninstall.png b/windows/docs/help/desktop_images/icon-uninstall.png similarity index 100% rename from windows/src/desktop/help/desktop_images/icon-uninstall.png rename to windows/docs/help/desktop_images/icon-uninstall.png diff --git a/windows/src/desktop/help/desktop_images/keyboard-share.png b/windows/docs/help/desktop_images/keyboard-share.png similarity index 100% rename from windows/src/desktop/help/desktop_images/keyboard-share.png rename to windows/docs/help/desktop_images/keyboard-share.png diff --git a/windows/src/desktop/help/desktop_images/keyboards-downarrow.png b/windows/docs/help/desktop_images/keyboards-downarrow.png similarity index 100% rename from windows/src/desktop/help/desktop_images/keyboards-downarrow.png rename to windows/docs/help/desktop_images/keyboards-downarrow.png diff --git a/windows/src/desktop/help/desktop_images/km_install_anywhere_1.png b/windows/docs/help/desktop_images/km_install_anywhere_1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/km_install_anywhere_1.png rename to windows/docs/help/desktop_images/km_install_anywhere_1.png diff --git a/windows/src/desktop/help/desktop_images/km_install_anywhere_2.png b/windows/docs/help/desktop_images/km_install_anywhere_2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/km_install_anywhere_2.png rename to windows/docs/help/desktop_images/km_install_anywhere_2.png diff --git a/windows/src/desktop/help/desktop_images/km_install_anywhere_3.png b/windows/docs/help/desktop_images/km_install_anywhere_3.png similarity index 100% rename from windows/src/desktop/help/desktop_images/km_install_anywhere_3.png rename to windows/docs/help/desktop_images/km_install_anywhere_3.png diff --git a/windows/src/desktop/help/desktop_images/km_non_app_store_1.png b/windows/docs/help/desktop_images/km_non_app_store_1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/km_non_app_store_1.png rename to windows/docs/help/desktop_images/km_non_app_store_1.png diff --git a/windows/src/desktop/help/desktop_images/km_non_app_store_2.png b/windows/docs/help/desktop_images/km_non_app_store_2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/km_non_app_store_2.png rename to windows/docs/help/desktop_images/km_non_app_store_2.png diff --git a/windows/src/desktop/help/desktop_images/lang-assoc-multi.png b/windows/docs/help/desktop_images/lang-assoc-multi.png similarity index 100% rename from windows/src/desktop/help/desktop_images/lang-assoc-multi.png rename to windows/docs/help/desktop_images/lang-assoc-multi.png diff --git a/windows/src/desktop/help/desktop_images/language-association.png b/windows/docs/help/desktop_images/language-association.png similarity index 100% rename from windows/src/desktop/help/desktop_images/language-association.png rename to windows/docs/help/desktop_images/language-association.png diff --git a/windows/src/desktop/help/desktop_images/language-bar.png b/windows/docs/help/desktop_images/language-bar.png similarity index 100% rename from windows/src/desktop/help/desktop_images/language-bar.png rename to windows/docs/help/desktop_images/language-bar.png diff --git a/windows/src/desktop/help/desktop_images/languageswitcher-small.png b/windows/docs/help/desktop_images/languageswitcher-small.png similarity index 100% rename from windows/src/desktop/help/desktop_images/languageswitcher-small.png rename to windows/docs/help/desktop_images/languageswitcher-small.png diff --git a/windows/src/desktop/help/desktop_images/languageswitcher.png b/windows/docs/help/desktop_images/languageswitcher.png similarity index 100% rename from windows/src/desktop/help/desktop_images/languageswitcher.png rename to windows/docs/help/desktop_images/languageswitcher.png diff --git a/windows/src/desktop/help/desktop_images/menu.png b/windows/docs/help/desktop_images/menu.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menu.png rename to windows/docs/help/desktop_images/menu.png diff --git a/windows/src/desktop/help/desktop_images/menuicon-charmap.png b/windows/docs/help/desktop_images/menuicon-charmap.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menuicon-charmap.png rename to windows/docs/help/desktop_images/menuicon-charmap.png diff --git a/windows/src/desktop/help/desktop_images/menuicon-config.png b/windows/docs/help/desktop_images/menuicon-config.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menuicon-config.png rename to windows/docs/help/desktop_images/menuicon-config.png diff --git a/windows/src/desktop/help/desktop_images/menuicon-exit.png b/windows/docs/help/desktop_images/menuicon-exit.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menuicon-exit.png rename to windows/docs/help/desktop_images/menuicon-exit.png diff --git a/windows/src/desktop/help/desktop_images/menuicon-fonthelper.png b/windows/docs/help/desktop_images/menuicon-fonthelper.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menuicon-fonthelper.png rename to windows/docs/help/desktop_images/menuicon-fonthelper.png diff --git a/windows/src/desktop/help/desktop_images/menuicon-help.png b/windows/docs/help/desktop_images/menuicon-help.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menuicon-help.png rename to windows/docs/help/desktop_images/menuicon-help.png diff --git a/windows/src/desktop/help/desktop_images/menuicon-osk.png b/windows/docs/help/desktop_images/menuicon-osk.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menuicon-osk.png rename to windows/docs/help/desktop_images/menuicon-osk.png diff --git a/windows/src/desktop/help/desktop_images/menuicon-texteditor.png b/windows/docs/help/desktop_images/menuicon-texteditor.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menuicon-texteditor.png rename to windows/docs/help/desktop_images/menuicon-texteditor.png diff --git a/windows/src/desktop/help/desktop_images/menuicon-usage.png b/windows/docs/help/desktop_images/menuicon-usage.png similarity index 100% rename from windows/src/desktop/help/desktop_images/menuicon-usage.png rename to windows/docs/help/desktop_images/menuicon-usage.png diff --git a/windows/src/desktop/help/desktop_images/options-advanced.png b/windows/docs/help/desktop_images/options-advanced.png similarity index 100% rename from windows/src/desktop/help/desktop_images/options-advanced.png rename to windows/docs/help/desktop_images/options-advanced.png diff --git a/windows/src/desktop/help/desktop_images/options-general.png b/windows/docs/help/desktop_images/options-general.png similarity index 100% rename from windows/src/desktop/help/desktop_images/options-general.png rename to windows/docs/help/desktop_images/options-general.png diff --git a/windows/src/desktop/help/desktop_images/options-hint.png b/windows/docs/help/desktop_images/options-hint.png similarity index 100% rename from windows/src/desktop/help/desktop_images/options-hint.png rename to windows/docs/help/desktop_images/options-hint.png diff --git a/windows/src/desktop/help/desktop_images/options-osk.png b/windows/docs/help/desktop_images/options-osk.png similarity index 100% rename from windows/src/desktop/help/desktop_images/options-osk.png rename to windows/docs/help/desktop_images/options-osk.png diff --git a/windows/src/desktop/help/desktop_images/options-startup.png b/windows/docs/help/desktop_images/options-startup.png similarity index 100% rename from windows/src/desktop/help/desktop_images/options-startup.png rename to windows/docs/help/desktop_images/options-startup.png diff --git a/windows/src/desktop/help/desktop_images/osk-tibetan.png b/windows/docs/help/desktop_images/osk-tibetan.png similarity index 100% rename from windows/src/desktop/help/desktop_images/osk-tibetan.png rename to windows/docs/help/desktop_images/osk-tibetan.png diff --git a/windows/src/desktop/help/desktop_images/osk_keyboard.png b/windows/docs/help/desktop_images/osk_keyboard.png similarity index 100% rename from windows/src/desktop/help/desktop_images/osk_keyboard.png rename to windows/docs/help/desktop_images/osk_keyboard.png diff --git a/windows/src/desktop/help/desktop_images/proxy-config.png b/windows/docs/help/desktop_images/proxy-config.png similarity index 100% rename from windows/src/desktop/help/desktop_images/proxy-config.png rename to windows/docs/help/desktop_images/proxy-config.png diff --git a/windows/src/desktop/help/desktop_images/setup-click1.png b/windows/docs/help/desktop_images/setup-click1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/setup-click1.png rename to windows/docs/help/desktop_images/setup-click1.png diff --git a/windows/src/desktop/help/desktop_images/setup-click2.png b/windows/docs/help/desktop_images/setup-click2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/setup-click2.png rename to windows/docs/help/desktop_images/setup-click2.png diff --git a/windows/src/desktop/help/desktop_images/setup-click3.png b/windows/docs/help/desktop_images/setup-click3.png similarity index 100% rename from windows/src/desktop/help/desktop_images/setup-click3.png rename to windows/docs/help/desktop_images/setup-click3.png diff --git a/windows/src/desktop/help/desktop_images/start_tray.png b/windows/docs/help/desktop_images/start_tray.png similarity index 100% rename from windows/src/desktop/help/desktop_images/start_tray.png rename to windows/docs/help/desktop_images/start_tray.png diff --git a/windows/src/desktop/help/desktop_images/tab-add-lang.png b/windows/docs/help/desktop_images/tab-add-lang.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-add-lang.png rename to windows/docs/help/desktop_images/tab-add-lang.png diff --git a/windows/src/desktop/help/desktop_images/tab-add-popup.png b/windows/docs/help/desktop_images/tab-add-popup.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-add-popup.png rename to windows/docs/help/desktop_images/tab-add-popup.png diff --git a/windows/src/desktop/help/desktop_images/tab-hotkeys.png b/windows/docs/help/desktop_images/tab-hotkeys.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-hotkeys.png rename to windows/docs/help/desktop_images/tab-hotkeys.png diff --git a/windows/src/desktop/help/desktop_images/tab-keyboards.png b/windows/docs/help/desktop_images/tab-keyboards.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-keyboards.png rename to windows/docs/help/desktop_images/tab-keyboards.png diff --git a/windows/src/desktop/help/desktop_images/tab-layout-detail1.png b/windows/docs/help/desktop_images/tab-layout-detail1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-layout-detail1.png rename to windows/docs/help/desktop_images/tab-layout-detail1.png diff --git a/windows/src/desktop/help/desktop_images/tab-layout-detail2.png b/windows/docs/help/desktop_images/tab-layout-detail2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-layout-detail2.png rename to windows/docs/help/desktop_images/tab-layout-detail2.png diff --git a/windows/src/desktop/help/desktop_images/tab-layout-disable.png b/windows/docs/help/desktop_images/tab-layout-disable.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-layout-disable.png rename to windows/docs/help/desktop_images/tab-layout-disable.png diff --git a/windows/src/desktop/help/desktop_images/tab-layout-enable.png b/windows/docs/help/desktop_images/tab-layout-enable.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-layout-enable.png rename to windows/docs/help/desktop_images/tab-layout-enable.png diff --git a/windows/src/desktop/help/desktop_images/tab-layout-help.png b/windows/docs/help/desktop_images/tab-layout-help.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-layout-help.png rename to windows/docs/help/desktop_images/tab-layout-help.png diff --git a/windows/src/desktop/help/desktop_images/tab-layout-share.png b/windows/docs/help/desktop_images/tab-layout-share.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-layout-share.png rename to windows/docs/help/desktop_images/tab-layout-share.png diff --git a/windows/src/desktop/help/desktop_images/tab-layout.png b/windows/docs/help/desktop_images/tab-layout.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-layout.png rename to windows/docs/help/desktop_images/tab-layout.png diff --git a/windows/src/desktop/help/desktop_images/tab-options.png b/windows/docs/help/desktop_images/tab-options.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-options.png rename to windows/docs/help/desktop_images/tab-options.png diff --git a/windows/src/desktop/help/desktop_images/tab-options2.png b/windows/docs/help/desktop_images/tab-options2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-options2.png rename to windows/docs/help/desktop_images/tab-options2.png diff --git a/windows/src/desktop/help/desktop_images/tab-support.png b/windows/docs/help/desktop_images/tab-support.png similarity index 100% rename from windows/src/desktop/help/desktop_images/tab-support.png rename to windows/docs/help/desktop_images/tab-support.png diff --git a/windows/src/desktop/help/desktop_images/texteditor.png b/windows/docs/help/desktop_images/texteditor.png similarity index 100% rename from windows/src/desktop/help/desktop_images/texteditor.png rename to windows/docs/help/desktop_images/texteditor.png diff --git a/windows/src/desktop/help/desktop_images/toolbox-options.png b/windows/docs/help/desktop_images/toolbox-options.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolbox-options.png rename to windows/docs/help/desktop_images/toolbox-options.png diff --git a/windows/src/desktop/help/desktop_images/toolbox-toolbar.png b/windows/docs/help/desktop_images/toolbox-toolbar.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolbox-toolbar.png rename to windows/docs/help/desktop_images/toolbox-toolbar.png diff --git a/windows/src/desktop/help/desktop_images/toolboxicon-charmap.png b/windows/docs/help/desktop_images/toolboxicon-charmap.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolboxicon-charmap.png rename to windows/docs/help/desktop_images/toolboxicon-charmap.png diff --git a/windows/src/desktop/help/desktop_images/toolboxicon-close.png b/windows/docs/help/desktop_images/toolboxicon-close.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolboxicon-close.png rename to windows/docs/help/desktop_images/toolboxicon-close.png diff --git a/windows/src/desktop/help/desktop_images/toolboxicon-config.png b/windows/docs/help/desktop_images/toolboxicon-config.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolboxicon-config.png rename to windows/docs/help/desktop_images/toolboxicon-config.png diff --git a/windows/src/desktop/help/desktop_images/toolboxicon-fonthelper.png b/windows/docs/help/desktop_images/toolboxicon-fonthelper.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolboxicon-fonthelper.png rename to windows/docs/help/desktop_images/toolboxicon-fonthelper.png diff --git a/windows/src/desktop/help/desktop_images/toolboxicon-help.png b/windows/docs/help/desktop_images/toolboxicon-help.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolboxicon-help.png rename to windows/docs/help/desktop_images/toolboxicon-help.png diff --git a/windows/src/desktop/help/desktop_images/toolboxicon-osk.png b/windows/docs/help/desktop_images/toolboxicon-osk.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolboxicon-osk.png rename to windows/docs/help/desktop_images/toolboxicon-osk.png diff --git a/windows/src/desktop/help/desktop_images/toolboxicon-usage.png b/windows/docs/help/desktop_images/toolboxicon-usage.png similarity index 100% rename from windows/src/desktop/help/desktop_images/toolboxicon-usage.png rename to windows/docs/help/desktop_images/toolboxicon-usage.png diff --git a/windows/src/desktop/help/desktop_images/video.png b/windows/docs/help/desktop_images/video.png similarity index 100% rename from windows/src/desktop/help/desktop_images/video.png rename to windows/docs/help/desktop_images/video.png diff --git a/windows/src/desktop/help/desktop_images/win10-taskbar1.png b/windows/docs/help/desktop_images/win10-taskbar1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win10-taskbar1.png rename to windows/docs/help/desktop_images/win10-taskbar1.png diff --git a/windows/src/desktop/help/desktop_images/win10-taskbar2.png b/windows/docs/help/desktop_images/win10-taskbar2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win10-taskbar2.png rename to windows/docs/help/desktop_images/win10-taskbar2.png diff --git a/windows/src/desktop/help/desktop_images/win10-taskbar3.png b/windows/docs/help/desktop_images/win10-taskbar3.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win10-taskbar3.png rename to windows/docs/help/desktop_images/win10-taskbar3.png diff --git a/windows/src/desktop/help/desktop_images/win11-taskbar1.png b/windows/docs/help/desktop_images/win11-taskbar1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win11-taskbar1.png rename to windows/docs/help/desktop_images/win11-taskbar1.png diff --git a/windows/src/desktop/help/desktop_images/win11-taskbar2.png b/windows/docs/help/desktop_images/win11-taskbar2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win11-taskbar2.png rename to windows/docs/help/desktop_images/win11-taskbar2.png diff --git a/windows/src/desktop/help/desktop_images/win11-uninstall.png b/windows/docs/help/desktop_images/win11-uninstall.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win11-uninstall.png rename to windows/docs/help/desktop_images/win11-uninstall.png diff --git a/windows/src/desktop/help/desktop_images/win11_km_install_anywhere_1.png b/windows/docs/help/desktop_images/win11_km_install_anywhere_1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win11_km_install_anywhere_1.png rename to windows/docs/help/desktop_images/win11_km_install_anywhere_1.png diff --git a/windows/src/desktop/help/desktop_images/win8-taskbar1.png b/windows/docs/help/desktop_images/win8-taskbar1.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win8-taskbar1.png rename to windows/docs/help/desktop_images/win8-taskbar1.png diff --git a/windows/src/desktop/help/desktop_images/win8-taskbar2.png b/windows/docs/help/desktop_images/win8-taskbar2.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win8-taskbar2.png rename to windows/docs/help/desktop_images/win8-taskbar2.png diff --git a/windows/src/desktop/help/desktop_images/win8-taskbar3.png b/windows/docs/help/desktop_images/win8-taskbar3.png similarity index 100% rename from windows/src/desktop/help/desktop_images/win8-taskbar3.png rename to windows/docs/help/desktop_images/win8-taskbar3.png diff --git a/windows/src/desktop/help/index.md b/windows/docs/help/index.md similarity index 100% rename from windows/src/desktop/help/index.md rename to windows/docs/help/index.md diff --git a/windows/src/desktop/help/keymandesktop.hhp b/windows/docs/help/keymandesktop.hhp similarity index 100% rename from windows/src/desktop/help/keymandesktop.hhp rename to windows/docs/help/keymandesktop.hhp diff --git a/windows/src/desktop/help/start/configure-computer.md b/windows/docs/help/start/configure-computer.md similarity index 100% rename from windows/src/desktop/help/start/configure-computer.md rename to windows/docs/help/start/configure-computer.md diff --git a/windows/src/desktop/help/start/configure_office.md b/windows/docs/help/start/configure_office.md similarity index 100% rename from windows/src/desktop/help/start/configure_office.md rename to windows/docs/help/start/configure_office.md diff --git a/windows/src/desktop/help/start/download-and-install-keyboard.md b/windows/docs/help/start/download-and-install-keyboard.md similarity index 100% rename from windows/src/desktop/help/start/download-and-install-keyboard.md rename to windows/docs/help/start/download-and-install-keyboard.md diff --git a/windows/src/desktop/help/start/download-and-install-keyman.md b/windows/docs/help/start/download-and-install-keyman.md similarity index 100% rename from windows/src/desktop/help/start/download-and-install-keyman.md rename to windows/docs/help/start/download-and-install-keyman.md diff --git a/windows/src/desktop/help/start/font.md b/windows/docs/help/start/font.md similarity index 100% rename from windows/src/desktop/help/start/font.md rename to windows/docs/help/start/font.md diff --git a/windows/src/desktop/help/start/hotkey_set.md b/windows/docs/help/start/hotkey_set.md similarity index 100% rename from windows/src/desktop/help/start/hotkey_set.md rename to windows/docs/help/start/hotkey_set.md diff --git a/windows/src/desktop/help/start/index.md b/windows/docs/help/start/index.md similarity index 100% rename from windows/src/desktop/help/start/index.md rename to windows/docs/help/start/index.md diff --git a/windows/src/desktop/help/start/locale.md b/windows/docs/help/start/locale.md similarity index 100% rename from windows/src/desktop/help/start/locale.md rename to windows/docs/help/start/locale.md diff --git a/windows/src/desktop/help/start/rtl.md b/windows/docs/help/start/rtl.md similarity index 100% rename from windows/src/desktop/help/start/rtl.md rename to windows/docs/help/start/rtl.md diff --git a/windows/src/desktop/help/start/tutorial.md b/windows/docs/help/start/tutorial.md similarity index 100% rename from windows/src/desktop/help/start/tutorial.md rename to windows/docs/help/start/tutorial.md diff --git a/windows/src/desktop/help/troubleshooting/bootstrapper.md b/windows/docs/help/troubleshooting/bootstrapper.md similarity index 100% rename from windows/src/desktop/help/troubleshooting/bootstrapper.md rename to windows/docs/help/troubleshooting/bootstrapper.md diff --git a/windows/src/desktop/help/troubleshooting/excel.md b/windows/docs/help/troubleshooting/excel.md similarity index 100% rename from windows/src/desktop/help/troubleshooting/excel.md rename to windows/docs/help/troubleshooting/excel.md diff --git a/windows/src/desktop/help/troubleshooting/font.md b/windows/docs/help/troubleshooting/font.md similarity index 100% rename from windows/src/desktop/help/troubleshooting/font.md rename to windows/docs/help/troubleshooting/font.md diff --git a/windows/src/desktop/help/troubleshooting/index.md b/windows/docs/help/troubleshooting/index.md similarity index 100% rename from windows/src/desktop/help/troubleshooting/index.md rename to windows/docs/help/troubleshooting/index.md diff --git a/windows/src/desktop/help/troubleshooting/install-app-from-anywhere.md b/windows/docs/help/troubleshooting/install-app-from-anywhere.md similarity index 100% rename from windows/src/desktop/help/troubleshooting/install-app-from-anywhere.md rename to windows/docs/help/troubleshooting/install-app-from-anywhere.md diff --git a/windows/src/desktop/help/troubleshooting/securitysoftware.md b/windows/docs/help/troubleshooting/securitysoftware.md similarity index 100% rename from windows/src/desktop/help/troubleshooting/securitysoftware.md rename to windows/docs/help/troubleshooting/securitysoftware.md diff --git a/windows/src/desktop/help/troubleshooting/sigma.md b/windows/docs/help/troubleshooting/sigma.md similarity index 100% rename from windows/src/desktop/help/troubleshooting/sigma.md rename to windows/docs/help/troubleshooting/sigma.md From 0e5fbb225d74659628625a45f1789ff40c67494a Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 16 Sep 2024 06:19:14 +0700 Subject: [PATCH 047/119] refactor(common): fixup help path script references Relates-to: #12347 --- android/KMAPro/build-play-store-notes.inc.sh | 4 +- docs/minimum-versions.md | 10 ++-- docs/minimum-versions.md.in | 10 ++-- linux/keyman-config/build-help.sh | 14 ++--- linux/keyman-config/build.sh | 2 +- linux/scripts/dist.sh | 2 +- resources/build/build-help.inc.sh | 8 +-- resources/build/help-keyman-com.sh | 8 +-- windows/src/desktop/help/build.sh | 11 +++- windows/src/desktop/help/help.sln | 62 -------------------- 10 files changed, 37 insertions(+), 94 deletions(-) delete mode 100644 windows/src/desktop/help/help.sln diff --git a/android/KMAPro/build-play-store-notes.inc.sh b/android/KMAPro/build-play-store-notes.inc.sh index 04fa8764179..56b9a92326e 100755 --- a/android/KMAPro/build-play-store-notes.inc.sh +++ b/android/KMAPro/build-play-store-notes.inc.sh @@ -24,7 +24,7 @@ function generateReleaseNotes() { # Pad release notes if whatsnew.md doesn't have any line items # Play Store release notes have a limit of 500 characters local DEFAULT_RELEASE_NOTE="* Additional bug fixes and improvements" - local FILTERED_LINES=$( grep '^\s*\*.*$' "$KEYMAN_ROOT/android/help/about/whatsnew.md" || [[ $? == 1 ]] ) # Continue if grep has no matches + local FILTERED_LINES=$( grep '^\s*\*.*$' "$KEYMAN_ROOT/android/docs/help/about/whatsnew.md" || [[ $? == 1 ]] ) # Continue if grep has no matches if [ -z "$FILTERED_LINES" ]; then FILTERED_LINES="$DEFAULT_RELEASE_NOTE" builder_warn "Warning: whatsnew.md empty so using default release note: '$FILTERED_LINES'" @@ -32,7 +32,7 @@ function generateReleaseNotes() { # Change IFS to new line local old_IFS="${IFS}" - IFS=$'\n' + IFS=$'\n' for line in $FILTERED_LINES do local CHARS_IN_RELEASE_NOTES=$( wc -m < "$PLAY_RELEASE_NOTES" ) diff --git a/docs/minimum-versions.md b/docs/minimum-versions.md index cce04050500..c0b034dde0a 100644 --- a/docs/minimum-versions.md +++ b/docs/minimum-versions.md @@ -10,23 +10,23 @@ Target Operating System and Platform Versions ### Keyman for Windows -Helpfile: [os.md](../../windows/src/desktop/help/common/os.md) +Helpfile: [os.md](../../windows/docs/help/common/os.md) ### Keyman for macOS -Helpfile: [requirements.md](../../mac/help/about/requirements.md) +Helpfile: [requirements.md](../../mac/docs/help/about/requirements.md) ### Keyman for Linux -Helpfile: [common/index.md](../../linux/help/common/index.md#q-what-linux-distros-will-keyman-work-with) +Helpfile: [common/index.md](../../linux/docs/help/common/index.md#q-what-linux-distros-will-keyman-work-with) ### Keyman iPhone and iPad -Helpfile: [system-requirements.md](../../ios/help/about/system-requirements.md) +Helpfile: [system-requirements.md](../../ios/docs/help/about/system-requirements.md) ### Keyman for Android -Helpfile: [system-requirements.md](../../android/help/about/system-requirements.md) +Helpfile: [system-requirements.md](../../android/docs/help/about/system-requirements.md) ---- diff --git a/docs/minimum-versions.md.in b/docs/minimum-versions.md.in index 42d04b59870..35fa2adde30 100644 --- a/docs/minimum-versions.md.in +++ b/docs/minimum-versions.md.in @@ -10,23 +10,23 @@ Target Operating System and Platform Versions ### Keyman for Windows -Helpfile: [os.md](../../windows/src/desktop/help/common/os.md) +Helpfile: [os.md](../../windows/docs/help/common/os.md) ### Keyman for macOS -Helpfile: [requirements.md](../../mac/help/about/requirements.md) +Helpfile: [requirements.md](../../mac/docs/help/about/requirements.md) ### Keyman for Linux -Helpfile: [common/index.md](../../linux/help/common/index.md#q-what-linux-distros-will-keyman-work-with) +Helpfile: [common/index.md](../../linux/docs/help/common/index.md#q-what-linux-distros-will-keyman-work-with) ### Keyman iPhone and iPad -Helpfile: [system-requirements.md](../../ios/help/about/system-requirements.md) +Helpfile: [system-requirements.md](../../ios/docs/help/about/system-requirements.md) ### Keyman for Android -Helpfile: [system-requirements.md](../../android/help/about/system-requirements.md) +Helpfile: [system-requirements.md](../../android/docs/help/about/system-requirements.md) ---- diff --git a/linux/keyman-config/build-help.sh b/linux/keyman-config/build-help.sh index e05b8d284e4..3bc959cc6c4 100755 --- a/linux/keyman-config/build-help.sh +++ b/linux/keyman-config/build-help.sh @@ -72,11 +72,11 @@ fi if [ -n "$generate_help" ]; then echo "Generating markdown help pages..." - mkdir -p ../help/reference - buildtools/help2md ./km-package-get -o ../help/reference/km-package-get.md -n "Download a Keyman keyboard package" -I maninc/km-package-get.inc - buildtools/help2md ./km-package-install -o ../help/reference/km-package-install.md -n "Install a Keyman keyboard package" -I maninc/km-package-install.inc - buildtools/help2md ./km-config -o ../help/reference/km-config.md -n "Launches Keyman Configuration for installing and showing information about Keyman keyboards" -I maninc/km-config.inc - buildtools/help2md ./km-kvk2ldml -o ../help/reference/km-kvk2ldml.md -n "Convert a Keyman on-screen keyboard file to LDML" -I maninc/km-kvk2ldml.inc - buildtools/help2md ./km-package-list-installed -o ../help/reference/km-package-list-installed.md -n "List installed Keyman keyboard packages" -I maninc/km-package-list-installed.inc - buildtools/help2md ./km-package-uninstall -o ../help/reference/km-package-uninstall.md -n "Uninstall a Keyman keyboard package" -I maninc/km-package-uninstall.inc + mkdir -p ../docs/help/reference + buildtools/help2md ./km-package-get -o ../docs/help/reference/km-package-get.md -n "Download a Keyman keyboard package" -I maninc/km-package-get.inc + buildtools/help2md ./km-package-install -o ../docs/help/reference/km-package-install.md -n "Install a Keyman keyboard package" -I maninc/km-package-install.inc + buildtools/help2md ./km-config -o ../docs/help/reference/km-config.md -n "Launches Keyman Configuration for installing and showing information about Keyman keyboards" -I maninc/km-config.inc + buildtools/help2md ./km-kvk2ldml -o ../docs/help/reference/km-kvk2ldml.md -n "Convert a Keyman on-screen keyboard file to LDML" -I maninc/km-kvk2ldml.inc + buildtools/help2md ./km-package-list-installed -o ../docs/help/reference/km-package-list-installed.md -n "List installed Keyman keyboard packages" -I maninc/km-package-list-installed.inc + buildtools/help2md ./km-package-uninstall -o ../docs/help/reference/km-package-uninstall.md -n "Uninstall a Keyman keyboard package" -I maninc/km-package-uninstall.inc fi diff --git a/linux/keyman-config/build.sh b/linux/keyman-config/build.sh index 3346a7defaa..9296f80d059 100755 --- a/linux/keyman-config/build.sh +++ b/linux/keyman-config/build.sh @@ -28,7 +28,7 @@ builder_describe_outputs \ clean_action() { rm -rf dist make_deb build ./*.egg-info keyman_config/version.py find . \( -name __pycache__ -o -name keyman-config.mo \) -exec rm -rf {} + - rm -rf ../help/reference/km-*.md + rm -rf ../docs/help/reference/km-*.md # Don't delete this file during a package build because they are # part of the source package. We can't generate it during a package diff --git a/linux/scripts/dist.sh b/linux/scripts/dist.sh index 6ef0be7d8bb..1c730f8f4b9 100755 --- a/linux/scripts/dist.sh +++ b/linux/scripts/dist.sh @@ -57,7 +57,7 @@ dpkg-source --tar-ignore=*~ \ --tar-ignore=linux/keyman-config/keyman_config/version.py \ --tar-ignore=linux/keyman-config/buildtools/build-langtags.py \ --tar-ignore=__pycache__ \ - --tar-ignore=linux/help \ + --tar-ignore=linux/docs/help \ --tar-ignore=mac \ --tar-ignore=node_modules \ --tar-ignore=oem \ diff --git a/resources/build/build-help.inc.sh b/resources/build/build-help.inc.sh index f5770fe885e..364f3f1bcd0 100644 --- a/resources/build/build-help.inc.sh +++ b/resources/build/build-help.inc.sh @@ -36,7 +36,7 @@ function _build_help_build() { local CSS="$KEYMAN_ROOT/resources/build/offline-help-style-spec.txt" local PLATFORM="$1" - cd "$KEYMAN_ROOT/$PLATFORM/help" + cd "$KEYMAN_ROOT/$PLATFORM/docs/help" local MD=`find . -name "*.md"` local DESTHTM="$KEYMAN_ROOT/$PLATFORM/$2" @@ -53,9 +53,9 @@ function _build_help_build() { # # Copy Images # - cd "$KEYMAN_ROOT/$PLATFORM/help/" + cd "$KEYMAN_ROOT/$PLATFORM/docs/help/" mkdir -p "$DESTHTM/${PLATFORM}_images" - cp $KEYMAN_ROOT/$PLATFORM/help/${PLATFORM}_images/* "$DESTHTM/${PLATFORM}_images/" + cp $KEYMAN_ROOT/$PLATFORM/docs/help/${PLATFORM}_images/* "$DESTHTM/${PLATFORM}_images/" } # @@ -74,7 +74,7 @@ function _build_help_build() { # # ### Description # -# Expects to find .md source under $KEYMAN_ROOT/$platform/help/, and +# Expects to find .md source under $KEYMAN_ROOT/$platform/docs/help/, and # will write the output .html to $KEYMAN_ROOT/$platform/$output_path. # function build_help_html() { diff --git a/resources/build/help-keyman-com.sh b/resources/build/help-keyman-com.sh index 6160816443d..98723f0667b 100755 --- a/resources/build/help-keyman-com.sh +++ b/resources/build/help-keyman-com.sh @@ -74,19 +74,19 @@ function upload { function upload_keyman_help { case $platform in android) - upload android/help products/android/$VERSION_RELEASE + upload android/docs/help products/android/$VERSION_RELEASE ;; ios) - upload ios/help products/iphone-and-ipad/$VERSION_RELEASE + upload ios/docs/help products/iphone-and-ipad/$VERSION_RELEASE ;; linux) pushd "$KEYMAN_ROOT/linux/keyman-config" > /dev/null ./build.sh build popd > /dev/null - upload linux/help products/linux/$VERSION_RELEASE + upload linux/docs/help products/linux/$VERSION_RELEASE ;; mac) - upload mac/help products/mac/$VERSION_RELEASE + upload mac/docs/help products/mac/$VERSION_RELEASE ;; windows) # Note: `/windows/src/desktop/help/build.sh web` must be run first diff --git a/windows/src/desktop/help/build.sh b/windows/src/desktop/help/build.sh index d8331b345e2..807f7047abe 100755 --- a/windows/src/desktop/help/build.sh +++ b/windows/src/desktop/help/build.sh @@ -25,6 +25,11 @@ builder_describe_outputs \ #------------------------------------------------------------------------------------------------------------------- +# All content is stored in windows/docs/help + +HELP_SOURCE_PATH="$KEYMAN_ROOT/windows/docs/help" +cd "$HELP_SOURCE_PATH" + MD=`find -name "*.md"` DESTCHM="$KEYMAN_ROOT/windows/bin/help/desktop" DESTWEB="$KEYMAN_ROOT/windows/bin/help/md/desktop" @@ -121,7 +126,7 @@ function do_build_chm() { # mkdir -p "$DESTCHM/desktop_images" - cp "$THIS_SCRIPT_PATH/desktop_images"/* "$DESTCHM/desktop_images/" + cp "$HELP_SOURCE_PATH/desktop_images"/* "$DESTCHM/desktop_images/" # # Prepare TOC and HHP files @@ -129,7 +134,7 @@ function do_build_chm() { pushd "$DESTCHM" > /dev/null - cp "$THIS_SCRIPT_PATH/keymandesktop.hhp" "$DESTCHM/keymandesktop.hhp" + cp "$HELP_SOURCE_PATH/keymandesktop.hhp" "$DESTCHM/keymandesktop.hhp" find -name '*.htm' >> "$DESTCHM/keymandesktop.hhp" build_hhc_header @@ -163,7 +168,7 @@ function do_build_web() { done mkdir -p "$DESTWEB/desktop_images" - cp "$THIS_SCRIPT_PATH/desktop_images"/* "$DESTWEB/desktop_images/" + cp "$HELP_SOURCE_PATH/desktop_images"/* "$DESTWEB/desktop_images/" } builder_run_action clean:chm do_clean_chm diff --git a/windows/src/desktop/help/help.sln b/windows/src/desktop/help/help.sln deleted file mode 100644 index c5e8fa36be8..00000000000 --- a/windows/src/desktop/help/help.sln +++ /dev/null @@ -1,62 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{61F7EA69-424D-41F9-B734-1EF0661A564C}" - ProjectSection(SolutionItems) = preProject - chm.xsl = chm.xsl - home.xml = home.xml - index.xml = index.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "context", "context", "{803201BB-4DA1-4A4C-9D6D-BA6BC19BF9EA}" - ProjectSection(SolutionItems) = preProject - context\activate.xml = context\activate.xml - context\charactermap.xml = context\charactermap.xml - context\configuration_addins.xml = context\configuration_addins.xml - context\configuration_hotkeys.xml = context\configuration_hotkeys.xml - context\configuration_keyboards.xml = context\configuration_keyboards.xml - context\configuration_languages.xml = context\configuration_languages.xml - context\configuration_options.xml = context\configuration_options.xml - context\configuration_support.xml = context\configuration_support.xml - context\keyman.xml = context\keyman.xml - context\manualactivate.xml = context\manualactivate.xml - context\onscreenkeyboard.xml = context\onscreenkeyboard.xml - context\selectlanguage.xml = context\selectlanguage.xml - context\splash.xml = context\splash.xml - context\traymenu.xml = context\traymenu.xml - context\welcome.xml = context\welcome.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "guide", "guide", "{773446EB-3B8A-4D7A-848E-A6A643A0F78A}" - ProjectSection(SolutionItems) = preProject - guide\changehotkey.xml = guide\changehotkey.xml - guide\install.xml = guide\install.xml - guide\install_keyboard.xml = guide\install_keyboard.xml - guide\keyboard_uninstall.xml = guide\keyboard_uninstall.xml - guide\keyboard_unload.xml = guide\keyboard_unload.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "main", "main", "{2C8697CC-0686-48E5-AFB5-E836E96D4FAD}" - ProjectSection(SolutionItems) = preProject - main\license.xml = main\license.xml - main\purchase.xml = main\purchase.xml - main\welcome.xml = main\welcome.xml - main\whatsnew.xml = main\whatsnew.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "ref", "{D17860DB-EFA1-444B-BE05-5889A338F552}" - ProjectSection(SolutionItems) = preProject - ref\systemshadowkeyboards.xml = ref\systemshadowkeyboards.xml - EndProjectSection -EndProject -Global - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {803201BB-4DA1-4A4C-9D6D-BA6BC19BF9EA} = {61F7EA69-424D-41F9-B734-1EF0661A564C} - {773446EB-3B8A-4D7A-848E-A6A643A0F78A} = {61F7EA69-424D-41F9-B734-1EF0661A564C} - {2C8697CC-0686-48E5-AFB5-E836E96D4FAD} = {61F7EA69-424D-41F9-B734-1EF0661A564C} - {D17860DB-EFA1-444B-BE05-5889A338F552} = {61F7EA69-424D-41F9-B734-1EF0661A564C} - EndGlobalSection -EndGlobal From b751336c13560b56e3d1fb1f1b8a41695a0cf02a Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 16 Sep 2024 08:46:24 +0700 Subject: [PATCH 048/119] refactor(developer): copy dev 17.0 help into repo 1. Copy help.keyman.com/developer/17.0/* into /developer/docs/help 2. Update references to 18.0 where appropriate 3. Copy all referenced images from /cdn/dev into /developer/docs/help/images and update links in documentation Next commit: add deployment to help-keyman-com.sh. Note: simplest way to test links at this point is to use the help.keyman.com auto deploy and wait for the PR on help.keyman.com to be validated; we could look at an internal link validation tool that verifies markdown links? Relates-to: #12347 --- developer/docs/help/context/about-tike.md | 8 + developer/docs/help/context/character-map.md | 136 +++ developer/docs/help/context/debug.md | 165 ++++ .../help/context/edit-language-example.md | 44 + developer/docs/help/context/editor.md | 23 + developer/docs/help/context/images/banner.png | Bin 0 -> 3979 bytes .../help/context/images/character-grid.png | Bin 0 -> 2313 bytes developer/docs/help/context/images/config.png | Bin 0 -> 18610 bytes .../docs/help/context/images/device-menu.png | Bin 0 -> 12996 bytes .../help/context/images/hamburger-menu.png | Bin 0 -> 19545 bytes .../help/context/images/keyboard-menu.png | Bin 0 -> 12017 bytes .../context/images/lexical-model-test.png | Bin 0 -> 82376 bytes .../docs/help/context/images/model-menu.png | Bin 0 -> 5224 bytes .../context/images/on-screen-keyboard.png | Bin 0 -> 38893 bytes .../help/context/images/server-iphone.png | Bin 0 -> 83389 bytes .../docs/help/context/images/status-bar.png | Bin 0 -> 1776 bytes .../docs/help/context/images/taskbar-menu.png | Bin 0 -> 1902 bytes .../docs/help/context/images/taskbar.png | Bin 0 -> 15323 bytes .../docs/help/context/images/text-area.png | Bin 0 -> 3303 bytes developer/docs/help/context/index.md | 59 ++ developer/docs/help/context/key-test.md | 21 + .../docs/help/context/keyboard-editor.md | 632 +++++++++++++ .../docs/help/context/keyman-developer.md | 5 + developer/docs/help/context/kmc.md | 5 + developer/docs/help/context/kmcomp.md | 7 + developer/docs/help/context/kmconvert.md | 125 +++ developer/docs/help/context/kmlmc.md | 5 + developer/docs/help/context/kmlmi.md | 5 + developer/docs/help/context/kmlmp.md | 5 + developer/docs/help/context/ldml-debug.md | 25 + developer/docs/help/context/ldml-editor.md | 18 + developer/docs/help/context/messages.md | 18 + developer/docs/help/context/model-editor.md | 185 ++++ .../context/new-ldml-project-parameters.md | 63 ++ .../help/context/new-lm-project-parameters.md | 39 + .../help/context/new-project-parameters.md | 59 ++ developer/docs/help/context/new-project.md | 24 + developer/docs/help/context/new.md | 34 + developer/docs/help/context/options.md | 166 ++++ developer/docs/help/context/package-editor.md | 194 ++++ developer/docs/help/context/project.md | 36 + .../docs/help/context/select-web-fonts.md | 17 + developer/docs/help/context/server.md | 398 ++++++++ developer/docs/help/guides/command-line.md | 9 + .../advanced-keyboard-development-example.md | 236 +++++ ...ard-layout-for-amharic-the-nitty-gritty.md | 754 ++++++++++++++++ ...ing-a-touch-keyboard-layout-for-amharic.md | 124 +++ .../docs/help/guides/develop/imx/imxdll.md | 115 +++ .../docs/help/guides/develop/imx/imxlib.md | 208 +++++ .../docs/help/guides/develop/imx/index.md | 101 +++ developer/docs/help/guides/develop/imx/web.md | 4 + .../docs/help/guides/develop/imx/web/index.md | 5 + developer/docs/help/guides/develop/index.md | 19 + .../develop/touch-keyboard-tutorial/index.md | 54 ++ .../making-touch-keyboard.md | 361 ++++++++ .../help/guides/develop/tutorial/index.md | 56 ++ .../help/guides/develop/tutorial/step-1.md | 71 ++ .../help/guides/develop/tutorial/step-2.md | 53 ++ .../help/guides/develop/tutorial/step-3.md | 99 ++ .../help/guides/develop/tutorial/step-4.md | 102 +++ .../help/guides/develop/tutorial/step-5.md | 76 ++ .../help/guides/develop/tutorial/step-6.md | 116 +++ .../help/guides/develop/tutorial/step-7.md | 52 ++ .../help/guides/develop/tutorial/step-8.md | 78 ++ .../help/guides/develop/tutorial/step-9.md | 66 ++ .../docs/help/guides/distribute/index.md | 10 + .../guides/distribute/install-kmp-android.md | 78 ++ .../help/guides/distribute/install-kmp-ios.md | 53 ++ .../docs/help/guides/distribute/packages.md | 131 +++ .../help/guides/distribute/tutorial/index.md | 36 + .../help/guides/distribute/tutorial/step-1.md | 35 + .../help/guides/distribute/tutorial/step-2.md | 127 +++ .../help/guides/distribute/tutorial/step-3.md | 31 + .../help/guides/distribute/tutorial/step-4.md | 63 ++ .../help/guides/distribute/tutorial/step-5.md | 49 + .../help/guides/distribute/tutorial/step-6.md | 68 ++ developer/docs/help/guides/index.md | 13 + developer/docs/help/guides/intro.md | 43 + .../guides/lexical-models/advanced/index.md | 19 + .../advanced/model-definition-file.md | 102 +++ .../lexical-models/advanced/punctuation.md | 73 ++ .../advanced/search-term-to-key.md | 93 ++ .../advanced/unicode-breaker-extension.md | 539 +++++++++++ .../lexical-models/advanced/word-breaker.md | 218 +++++ .../guides/lexical-models/distribute/index.md | 6 + .../lexical-models/distribute/packages.md | 70 ++ .../distribute/tutorial/index.md | 32 + .../distribute/tutorial/step-1.md | 15 + .../distribute/tutorial/step-2.md | 72 ++ .../distribute/tutorial/step-3.md | 51 ++ .../distribute/tutorial/step-4.md | 55 ++ .../distribute/tutorial/step-5.md | 55 ++ .../docs/help/guides/lexical-models/index.md | 22 + .../help/guides/lexical-models/intro/index.md | 162 ++++ .../guides/lexical-models/tutorial/index.md | 29 + .../guides/lexical-models/tutorial/step-1.md | 22 + .../guides/lexical-models/tutorial/step-2.md | 115 +++ .../guides/lexical-models/tutorial/step-3.md | 143 +++ .../guides/lexical-models/tutorial/step-4.md | 34 + developer/docs/help/guides/test/index.md | 10 + .../guides/test/keyboard-touch-and-desktop.md | 151 ++++ .../test/keyboard-touch-mobile-emulator.md | 61 ++ .../docs/help/guides/test/lexical-model.md | 67 ++ .../help/images/app/dist-file-browser-ap.png | Bin 0 -> 15648 bytes .../docs/help/images/app/dist-install1-ap.png | Bin 0 -> 31248 bytes .../docs/help/images/app/dist-install1-i.png | Bin 0 -> 25155 bytes .../docs/help/images/app/dist-kmp-open-i.png | Bin 0 -> 20076 bytes .../help/images/app/dist-kmp-success-i.png | Bin 0 -> 19311 bytes .../images/app/dist-storage-permission-ap.png | Bin 0 -> 41020 bytes .../help/images/app/dist-url-screen-ap.png | Bin 0 -> 9196 bytes .../help/images/app/dist-url-screen-i.png | Bin 0 -> 7954 bytes .../docs/help/images/app/dist-welcome-ap.png | Bin 0 -> 74988 bytes .../docs/help/images/app/dist-welcome-i.png | Bin 0 -> 49395 bytes .../help/images/app/settings-language-ap.png | Bin 0 -> 7778 bytes developer/docs/help/images/ipa.gif | Bin 0 -> 2552 bytes .../help/images/lm/developer-open-tsv.png | Bin 0 -> 49948 bytes developer/docs/help/images/lm/edited-tsv.png | Bin 0 -> 14578 bytes developer/docs/help/images/lm/overview.svg | 1 + .../help/images/lm/sencoten-sheets-full.png | Bin 0 -> 100381 bytes .../images/lm/sencoten-sheets-save-as.png | Bin 0 -> 65884 bytes .../docs/help/images/lm/template-tsv.png | Bin 0 -> 11659 bytes developer/docs/help/images/lm/test-model.png | Bin 0 -> 49235 bytes .../images/lm/tutorial_distribute_model_3.png | Bin 0 -> 29009 bytes .../lm/tutorial_distribute_model_3_files.png | Bin 0 -> 27625 bytes .../lm/tutorial_distribute_model_compile.png | Bin 0 -> 33025 bytes .../lm/tutorial_distribute_model_details.png | Bin 0 -> 26282 bytes .../help/images/lm/whatis-correct-thr.png | Bin 0 -> 29381 bytes .../docs/help/images/lm/whatis-incompr.png | Bin 0 -> 31432 bytes developer/docs/help/images/lm/whatis-naiv.png | Bin 0 -> 29594 bytes .../docs/help/images/lm/whatis-on-my-w.png | Bin 0 -> 30178 bytes .../help/images/simpleTouchKeyboard_1.png | Bin 0 -> 13399 bytes .../help/images/simpleTouchKeyboard_10.png | Bin 0 -> 297164 bytes .../help/images/simpleTouchKeyboard_11.png | Bin 0 -> 217137 bytes .../help/images/simpleTouchKeyboard_12-2.png | Bin 0 -> 129390 bytes .../help/images/simpleTouchKeyboard_12.png | Bin 0 -> 241556 bytes .../help/images/simpleTouchKeyboard_13.png | Bin 0 -> 96691 bytes .../help/images/simpleTouchKeyboard_14.png | Bin 0 -> 211211 bytes .../help/images/simpleTouchKeyboard_15.png | Bin 0 -> 54586 bytes .../help/images/simpleTouchKeyboard_15b.png | Bin 0 -> 7196 bytes .../help/images/simpleTouchKeyboard_16.png | Bin 0 -> 67473 bytes .../help/images/simpleTouchKeyboard_16b.png | Bin 0 -> 64752 bytes .../help/images/simpleTouchKeyboard_17.png | Bin 0 -> 97479 bytes .../help/images/simpleTouchKeyboard_18.png | Bin 0 -> 83541 bytes .../help/images/simpleTouchKeyboard_19.png | Bin 0 -> 38673 bytes .../help/images/simpleTouchKeyboard_2.png | Bin 0 -> 20733 bytes .../help/images/simpleTouchKeyboard_20.png | Bin 0 -> 20651 bytes .../help/images/simpleTouchKeyboard_3.png | Bin 0 -> 38962 bytes .../help/images/simpleTouchKeyboard_36.png | Bin 0 -> 20380 bytes .../help/images/simpleTouchKeyboard_4.png | Bin 0 -> 41946 bytes .../help/images/simpleTouchKeyboard_5.png | Bin 0 -> 6817 bytes .../help/images/simpleTouchKeyboard_6.png | Bin 0 -> 197634 bytes .../help/images/simpleTouchKeyboard_7.png | Bin 0 -> 13264 bytes .../help/images/simpleTouchKeyboard_8.png | Bin 0 -> 91700 bytes .../help/images/simpleTouchKeyboard_9.png | Bin 0 -> 102533 bytes .../docs/help/images/testing/chrome1.png | Bin 0 -> 27520 bytes .../docs/help/images/testing/chrome2.png | Bin 0 -> 74666 bytes .../docs/help/images/testing/chrome3.png | Bin 0 -> 47402 bytes .../docs/help/images/testing/chrome4.png | Bin 0 -> 52621 bytes .../testing/frame/android-debug-host.png | Bin 0 -> 70079 bytes .../testing/frame/android-debug-keyboard.png | Bin 0 -> 91297 bytes .../frame/android-enter-debug-host.png | Bin 0 -> 89047 bytes .../frame/installing-native-keyboard-1.png | Bin 0 -> 119365 bytes .../frame/installing-native-keyboard-2.png | Bin 0 -> 101037 bytes .../images/testing/startdebugging-kd10.png | Bin 0 -> 10588 bytes .../testing/touch-editor-build-800wi.png | Bin 0 -> 78904 bytes .../images/testing/touch-editor-build.png | Bin 0 -> 47127 bytes .../testing/touch-editor-khmer-800wi.png | Bin 0 -> 135432 bytes .../images/testing/touch-editor-khmer.png | Bin 0 -> 115414 bytes .../help/images/touch_amharic_keyboard.png | Bin 0 -> 119753 bytes .../help/images/touch_amharic_keyboard_2.png | Bin 0 -> 73768 bytes .../help/images/touch_amharic_keyboard_3.png | Bin 0 -> 65167 bytes .../help/images/touch_amharic_keyboard_4.png | Bin 0 -> 41213 bytes .../help/images/touch_amharic_keyboard_5.png | Bin 0 -> 21983 bytes .../help/images/touch_amharic_keyboard_6.png | Bin 0 -> 34517 bytes .../help/images/touch_amharic_keyboard_7.png | Bin 0 -> 18648 bytes .../help/images/touch_amharic_keyboard_8.png | Bin 0 -> 34827 bytes .../help/images/touch_amharic_keyboard_9.png | Bin 0 -> 56642 bytes .../images/tutorial_distribute_keyboard_3.png | Bin 0 -> 33457 bytes .../tutorial_distribute_keyboard_3_files.png | Bin 0 -> 126609 bytes .../tutorial_distribute_keyboard_compile.png | Bin 0 -> 169452 bytes .../tutorial_distribute_keyboard_details.png | Bin 0 -> 121565 bytes ...tutorial_distribute_keyboard_shortcuts.png | Bin 0 -> 117754 bytes .../help/images/tutorial_keyboard_qfrench.gif | Bin 0 -> 122 bytes .../images/tutorial_package_includesdocs.gif | Bin 0 -> 1088 bytes .../images/tutorial_package_includesfonts.gif | Bin 0 -> 1186 bytes .../images/tutorial_package_includesosk.gif | Bin 0 -> 1325 bytes .../tutorial_package_includeswelcome.gif | Bin 0 -> 1197 bytes developer/docs/help/images/ui/BuildTab.png | Bin 0 -> 158949 bytes developer/docs/help/images/ui/Debug_Menu.png | Bin 0 -> 33717 bytes .../docs/help/images/ui/Debug_Toolbar.png | Bin 0 -> 7373 bytes .../images/ui/LongPress_Flicks_Multitaps.png | Bin 0 -> 113363 bytes developer/docs/help/images/ui/NGROK_Phone.png | Bin 0 -> 44729 bytes .../docs/help/images/ui/OnScreenKeyboard.png | Bin 0 -> 183834 bytes .../help/images/ui/TouchLayout_Design.png | Bin 0 -> 381797 bytes .../help/images/ui/TouchLayout_Design_2.png | Bin 0 -> 401643 bytes .../docs/help/images/ui/frmAboutTike.png | Bin 0 -> 18340 bytes .../help/images/ui/frmCharacterMapFilter.png | Bin 0 -> 10979 bytes .../help/images/ui/frmCharacterMapNew.png | Bin 0 -> 65908 bytes developer/docs/help/images/ui/frmDebug.png | Bin 0 -> 2276 bytes .../help/images/ui/frmEditLanguageExample.png | Bin 0 -> 4283 bytes developer/docs/help/images/ui/frmKeyTest.png | Bin 0 -> 23395 bytes .../ui/frmKeymanWizard_Debug_CallStack.png | Bin 0 -> 64815 bytes .../ui/frmKeymanWizard_Debug_Deadkeys.png | Bin 0 -> 44651 bytes .../ui/frmKeymanWizard_Debug_Elements.png | Bin 0 -> 66930 bytes .../frmKeymanWizard_Debug_RegressionTest.png | Bin 0 -> 47805 bytes .../images/ui/frmKeymanWizard_Debug_State.png | Bin 0 -> 57275 bytes .../images/ui/frmKeymanWizard_Details.png | Bin 0 -> 35130 bytes .../help/images/ui/frmKeymanWizard_Icon.png | Bin 0 -> 34699 bytes .../images/ui/frmKeymanWizard_Layout_Code.png | Bin 0 -> 47580 bytes .../ui/frmKeymanWizard_Layout_Design.png | Bin 0 -> 44740 bytes .../help/images/ui/frmKeymanWizard_New.png | Bin 0 -> 35341 bytes .../ui/frmKeymanWizard_TouchLayout_Code.png | Bin 0 -> 35788 bytes .../ui/frmKeyman_Developer_Server_Options.png | Bin 0 -> 18644 bytes .../docs/help/images/ui/frmLDMLEditor.png | Bin 0 -> 28000 bytes .../help/images/ui/frmList_Local_URLs.png | Bin 0 -> 29335 bytes developer/docs/help/images/ui/frmMessages.png | Bin 0 -> 10675 bytes .../help/images/ui/frmModelEditor_Build.png | Bin 0 -> 301760 bytes .../help/images/ui/frmModelEditor_Details.png | Bin 0 -> 125431 bytes .../help/images/ui/frmModelEditor_Source.png | Bin 0 -> 34094 bytes .../ui/frmModelEditor_Wordlist_Code.png | Bin 0 -> 39276 bytes .../ui/frmModelEditor_Wordlist_Design.png | Bin 0 -> 33679 bytes .../docs/help/images/ui/frmModelsCompile.png | Bin 0 -> 194706 bytes .../docs/help/images/ui/frmNGROK_Config.png | Bin 0 -> 30282 bytes .../docs/help/images/ui/frmNGROK_Server_1.png | Bin 0 -> 55620 bytes .../docs/help/images/ui/frmNGROK_Server_2.png | Bin 0 -> 69635 bytes developer/docs/help/images/ui/frmNew.png | Bin 0 -> 11823 bytes .../docs/help/images/ui/frmNewLMProject.png | Bin 0 -> 6059 bytes .../images/ui/frmNewLMProjectParameters.png | Bin 0 -> 108043 bytes .../ui/frmNewLMProjectSelectLanguage.png | Bin 0 -> 4785 bytes .../docs/help/images/ui/frmNewProject.png | Bin 0 -> 44467 bytes .../images/ui/frmNewProjectParameters.png | Bin 0 -> 13733 bytes .../images/ui/frmOptions_CharacterMap.png | Bin 0 -> 36103 bytes .../help/images/ui/frmOptions_Debugger.png | Bin 0 -> 43410 bytes .../docs/help/images/ui/frmOptions_Editor.png | Bin 0 -> 40019 bytes .../help/images/ui/frmOptions_General.png | Bin 0 -> 61916 bytes .../docs/help/images/ui/frmOptions_Server.png | Bin 0 -> 22102 bytes .../help/images/ui/frmPackageEditor_Build.png | Bin 0 -> 40847 bytes .../images/ui/frmPackageEditor_Details.png | Bin 0 -> 43925 bytes .../ui/frmPackageEditor_EditExample.png | Bin 0 -> 5854 bytes .../frmPackageEditor_EditRelatedPackage.png | Bin 0 -> 3717 bytes .../help/images/ui/frmPackageEditor_Files.png | Bin 0 -> 39719 bytes .../images/ui/frmPackageEditor_Keyboards.png | Bin 0 -> 36938 bytes .../ui/frmPackageEditor_SelectWebFonts.png | Bin 0 -> 5546 bytes .../ui/frmPackageEditor_Select_BCP_47_Tag.png | Bin 0 -> 6337 bytes .../images/ui/frmPackageEditor_Shortcuts.png | Bin 0 -> 26260 bytes .../images/ui/frmPackageEditor_Source.png | Bin 0 -> 35870 bytes .../images/ui/frmProject_Distribution.png | Bin 0 -> 65962 bytes .../help/images/ui/frmProject_Keyboards.png | Bin 0 -> 71980 bytes .../help/images/ui/frmProject_Packaging.png | Bin 0 -> 57158 bytes .../help/images/ui/frmProject_Welcome.png | Bin 0 -> 66245 bytes developer/docs/help/images/ui/obj.gif | Bin 0 -> 80 bytes developer/docs/help/index.md | 38 + developer/docs/help/main/credits.md | 7 + developer/docs/help/main/index.md | 9 + developer/docs/help/main/license.md | 26 + developer/docs/help/reference/api/index.md | 18 + ...ze.analyzeoskcharacteruse._constructor_.md | 21 + ...-analyze.analyzeoskcharacteruse.analyze.md | 28 + ...mc-analyze.analyzeoskcharacteruse.clear.md | 17 + ...alyze.analyzeoskcharacteruse.getstrings.md | 34 + .../api/kmc-analyze.analyzeoskcharacteruse.md | 28 + ...yzeoskcharacteruseoptions.includecounts.md | 13 + ...c-analyze.analyzeoskcharacteruseoptions.md | 22 + ...e.analyzeoskcharacteruseoptions.puabase.md | 13 + ...skcharacteruseoptions.stripdottedcircle.md | 13 + ...lyze.analyzeoskrewritepua._constructor_.md | 20 + ...mc-analyze.analyzeoskrewritepua.analyze.md | 27 + .../kmc-analyze.analyzeoskrewritepua.clear.md | 17 + .../kmc-analyze.analyzeoskrewritepua.data.md | 15 + .../api/kmc-analyze.analyzeoskrewritepua.md | 33 + .../docs/help/reference/api/kmc-analyze.md | 21 + ...info.keyboardinfocompiler._constructor_.md | 13 + ...keyboard-info.keyboardinfocompiler.init.md | 27 + .../kmc-keyboard-info.keyboardinfocompiler.md | 29 + ...-keyboard-info.keyboardinfocompiler.run.md | 29 + ...eyboard-info.keyboardinfocompiler.write.md | 28 + ...oardinfocompilerartifacts.keyboard_info.md | 13 + ...oard-info.keyboardinfocompilerartifacts.md | 21 + ...yboard-info.keyboardinfocompileroptions.md | 21 + ...nfo.keyboardinfocompileroptions.sources.md | 13 + ...fo.keyboardinfocompilerresult.artifacts.md | 13 + ...eyboard-info.keyboardinfocompilerresult.md | 21 + ...-info.keyboardinfosources.forpublishing.md | 13 + ...ard-info.keyboardinfosources.jsfilename.md | 13 + ...rd-info.keyboardinfosources.kmpfilename.md | 13 + ...rd-info.keyboardinfosources.kpsfilename.md | 13 + ...info.keyboardinfosources.lastcommitdate.md | 13 + .../kmc-keyboard-info.keyboardinfosources.md | 25 + ...ard-info.keyboardinfosources.sourcepath.md | 13 + .../help/reference/api/kmc-keyboard-info.md | 21 + .../api/kmc-kmn.kmncompiler._constructor_.md | 13 + .../reference/api/kmc-kmn.kmncompiler.init.md | 27 + .../help/reference/api/kmc-kmn.kmncompiler.md | 30 + .../reference/api/kmc-kmn.kmncompiler.run.md | 27 + .../kmc-kmn.kmncompiler.verifyinitialized.md | 19 + .../api/kmc-kmn.kmncompiler.write.md | 28 + .../api/kmc-kmn.kmncompilerartifacts.js.md | 13 + .../api/kmc-kmn.kmncompilerartifacts.kmx.md | 13 + .../api/kmc-kmn.kmncompilerartifacts.kvk.md | 13 + .../api/kmc-kmn.kmncompilerartifacts.md | 23 + .../api/kmc-kmn.kmncompileroptions.md | 15 + .../kmc-kmn.kmncompilerresult.artifacts.md | 13 + .../kmc-kmn.kmncompilerresult.displaymap.md | 13 + .../api/kmc-kmn.kmncompilerresult.extra.md | 13 + .../api/kmc-kmn.kmncompilerresult.md | 23 + developer/docs/help/reference/api/kmc-kmn.md | 28 + .../docs/help/reference/api/kmc-kmn.osk.md | 28 + .../reference/api/kmc-kmn.osk.parsemapping.md | 22 + .../help/reference/api/kmc-kmn.osk.puamap.md | 13 + .../api/kmc-kmn.osk.remaptouchlayout.md | 23 + .../api/kmc-kmn.osk.remapvisualkeyboard.md | 23 + .../reference/api/kmc-kmn.osk.stringref.md | 19 + .../api/kmc-kmn.osk.stringref.str.md | 11 + .../api/kmc-kmn.osk.stringref.usages.md | 11 + .../api/kmc-kmn.osk.stringrefusage.count.md | 11 + .../kmc-kmn.osk.stringrefusage.filename.md | 11 + .../api/kmc-kmn.osk.stringrefusage.md | 19 + .../reference/api/kmc-kmn.osk.stringresult.md | 23 + .../api/kmc-kmn.osk.stringresult.pua.md | 13 + .../api/kmc-kmn.osk.stringresult.str.md | 13 + .../api/kmc-kmn.osk.stringresult.unicode.md | 13 + .../api/kmc-kmn.osk.stringresult.usages.md | 13 + .../api/kmc-ldml.ldmlcompileroptions.md | 21 + ...-ldml.ldmlcompileroptions.readeroptions.md | 13 + .../api/kmc-ldml.ldmlkeyboardcompiler.init.md | 27 + .../api/kmc-ldml.ldmlkeyboardcompiler.md | 23 + .../api/kmc-ldml.ldmlkeyboardcompiler.run.md | 27 + .../kmc-ldml.ldmlkeyboardcompiler.write.md | 28 + developer/docs/help/reference/api/kmc-ldml.md | 18 + .../docs/help/reference/api/kmc-model-info.md | 21 + ...el-info.modelinfocompiler._constructor_.md | 13 + .../kmc-model-info.modelinfocompiler.init.md | 27 + .../api/kmc-model-info.modelinfocompiler.md | 29 + .../kmc-model-info.modelinfocompiler.run.md | 29 + .../kmc-model-info.modelinfocompiler.write.md | 28 + ...c-model-info.modelinfocompilerartifacts.md | 21 + ...o.modelinfocompilerartifacts.model_info.md | 13 + ...kmc-model-info.modelinfocompileroptions.md | 21 + ...l-info.modelinfocompileroptions.sources.md | 13 + ...-info.modelinfocompilerresult.artifacts.md | 13 + .../kmc-model-info.modelinfocompilerresult.md | 21 + ...del-info.modelinfosources.forpublishing.md | 13 + ...model-info.modelinfosources.kmpfilename.md | 13 + ...model-info.modelinfosources.kmpjsondata.md | 13 + ...model-info.modelinfosources.kpsfilename.md | 13 + ...el-info.modelinfosources.lastcommitdate.md | 13 + .../api/kmc-model-info.modelinfosources.md | 27 + ...mc-model-info.modelinfosources.model_id.md | 13 + ...del-info.modelinfosources.modelfilename.md | 13 + ...-model-info.modelinfosources.sourcepath.md | 13 + .../api/kmc-model.casedwordformtokeyspec.md | 13 + .../kmc-model.lexicalmodelcompiler.init.md | 27 + .../api/kmc-model.lexicalmodelcompiler.md | 23 + .../api/kmc-model.lexicalmodelcompiler.run.md | 27 + .../kmc-model.lexicalmodelcompiler.write.md | 28 + ...-model.lexicalmodelcompilerartifacts.js.md | 13 + ...kmc-model.lexicalmodelcompilerartifacts.md | 21 + ...el.lexicalmodelcompilerresult.artifacts.md | 13 + .../kmc-model.lexicalmodelcompilerresult.md | 21 + ...mc-model.lexicalmodelsource.applycasing.md | 15 + ...l.lexicalmodelsource.languageusescasing.md | 13 + .../api/kmc-model.lexicalmodelsource.md | 27 + ...mc-model.lexicalmodelsource.punctuation.md | 13 + .../kmc-model.lexicalmodelsource.rootclass.md | 13 + ...odel.lexicalmodelsource.searchtermtokey.md | 13 + .../kmc-model.lexicalmodelsource.sources.md | 11 + ...mc-model.lexicalmodelsource.wordbreaker.md | 15 + .../docs/help/reference/api/kmc-model.md | 30 + .../api/kmc-model.simplewordbreakerspec.md | 15 + .../api/kmc-model.simplewordformtokeyspec.md | 13 + .../kmc-model.wordbreakerspec.joinwordsat.md | 17 + .../api/kmc-model.wordbreakerspec.md | 26 + ....wordbreakerspec.overridescriptdefaults.md | 15 + .../api/kmc-model.wordbreakerspec.use.md | 11 + .../api/kmc-model.wordformtokeyspec.md | 15 + .../api/kmc-package.kmpcompiler.init.md | 27 + .../reference/api/kmc-package.kmpcompiler.md | 29 + .../kmc-package.kmpcompiler.normalizepath.md | 11 + .../api/kmc-package.kmpcompiler.run.md | 27 + .../api/kmc-package.kmpcompiler.write.md | 28 + .../kmc-package.kmpcompilerartifacts.kmp.md | 13 + .../api/kmc-package.kmpcompilerartifacts.md | 21 + .../api/kmc-package.kmpcompileroptions.md | 15 + ...kmc-package.kmpcompilerresult.artifacts.md | 13 + .../api/kmc-package.kmpcompilerresult.md | 21 + .../docs/help/reference/api/kmc-package.md | 25 + ...ge.windowspackageinstallercompiler.init.md | 27 + ...package.windowspackageinstallercompiler.md | 23 + ...age.windowspackageinstallercompiler.run.md | 27 + ...e.windowspackageinstallercompiler.write.md | 28 + ...wspackageinstallercompilerartifacts.exe.md | 13 + ...indowspackageinstallercompilerartifacts.md | 21 + ....windowspackageinstallercompileroptions.md | 21 + ...packageinstallercompileroptions.sources.md | 13 + ...ackageinstallercompilerresult.artifacts.md | 13 + ...e.windowspackageinstallercompilerresult.md | 21 + ....windowspackageinstallersources.appname.md | 11 + ...packageinstallersources.licensefilename.md | 11 + ...-package.windowspackageinstallersources.md | 26 + ...dowspackageinstallersources.msifilename.md | 11 + ...ackageinstallersources.setupexefilename.md | 11 + ...wspackageinstallersources.startdisabled.md | 11 + ...installersources.startwithconfiguration.md | 11 + ...kageinstallersources.titleimagefilename.md | 11 + developer/docs/help/reference/bcp-47.md | 113 +++ .../docs/help/reference/editor-themes.md | 46 + developer/docs/help/reference/errors/index.md | 4 + developer/docs/help/reference/file-layout.md | 131 +++ .../docs/help/reference/file-types/ico.md | 20 + .../docs/help/reference/file-types/index.md | 45 + .../file-types/keyman-touch-layout.md | 847 ++++++++++++++++++ .../docs/help/reference/file-types/kmn.md | 21 + .../docs/help/reference/file-types/kmp.md | 37 + .../docs/help/reference/file-types/kmx.md | 26 + .../docs/help/reference/file-types/kpj.md | 17 + .../docs/help/reference/file-types/kps.md | 27 + .../docs/help/reference/file-types/kvk.md | 21 + .../docs/help/reference/file-types/kvks.md | 18 + .../help/reference/file-types/metadata.md | 294 ++++++ .../help/reference/file-types/model-js.md | 23 + .../help/reference/file-types/model-ts.md | 210 +++++ .../docs/help/reference/file-types/tsv.md | 60 ++ .../docs/help/reference/file-types/ttf.md | 22 + .../docs/help/reference/file-types/xml.md | 18 + developer/docs/help/reference/index.md | 13 + .../docs/help/reference/kmc/api/index.md | 43 + .../help/reference/kmc/cli/get-started.md | 164 ++++ .../docs/help/reference/kmc/cli/index.md | 7 + .../reference/kmc/cli/kmcomp-migration.md | 125 +++ .../help/reference/kmc/cli/messages/index.md | 6 + .../docs/help/reference/kmc/cli/reference.md | 324 +++++++ developer/docs/help/reference/kmc/index.md | 15 + .../common-types.commontypesmessages.md | 13 + .../docs/help/reference/messages/index.md | 14 + .../docs/help/reference/messages/km00001.md | 11 + .../docs/help/reference/messages/km00002.md | 11 + .../docs/help/reference/messages/km00003.md | 11 + .../docs/help/reference/messages/km00004.md | 11 + .../docs/help/reference/messages/km00005.md | 11 + .../docs/help/reference/messages/km00006.md | 11 + .../docs/help/reference/messages/km00007.md | 11 + .../docs/help/reference/messages/km00008.md | 11 + .../docs/help/reference/messages/km00009.md | 11 + .../docs/help/reference/messages/km0000a.md | 11 + .../docs/help/reference/messages/km0000b.md | 11 + .../docs/help/reference/messages/km0000d.md | 11 + .../docs/help/reference/messages/km0000e.md | 11 + .../docs/help/reference/messages/km00010.md | 11 + .../docs/help/reference/messages/km00011.md | 11 + .../docs/help/reference/messages/km00012.md | 11 + .../docs/help/reference/messages/km00013.md | 11 + .../docs/help/reference/messages/km00014.md | 11 + .../docs/help/reference/messages/km00015.md | 11 + .../docs/help/reference/messages/km00016.md | 11 + .../docs/help/reference/messages/km00018.md | 11 + .../docs/help/reference/messages/km00019.md | 11 + .../docs/help/reference/messages/km0001a.md | 11 + .../docs/help/reference/messages/km0001b.md | 11 + .../docs/help/reference/messages/km0001c.md | 11 + .../docs/help/reference/messages/km0001d.md | 11 + .../docs/help/reference/messages/km0001e.md | 11 + .../docs/help/reference/messages/km0001f.md | 11 + .../docs/help/reference/messages/km00020.md | 11 + .../docs/help/reference/messages/km00021.md | 11 + .../docs/help/reference/messages/km00022.md | 11 + .../docs/help/reference/messages/km00023.md | 11 + .../docs/help/reference/messages/km00024.md | 11 + .../docs/help/reference/messages/km00025.md | 11 + .../docs/help/reference/messages/km00026.md | 11 + .../docs/help/reference/messages/km00027.md | 11 + .../docs/help/reference/messages/km00028.md | 11 + .../docs/help/reference/messages/km00030.md | 11 + .../docs/help/reference/messages/km00f00.md | 11 + .../docs/help/reference/messages/km00f01.md | 11 + .../docs/help/reference/messages/km00f02.md | 11 + .../docs/help/reference/messages/km00f03.md | 11 + .../docs/help/reference/messages/km00f04.md | 11 + .../docs/help/reference/messages/km01001.md | 11 + .../docs/help/reference/messages/km01002.md | 11 + .../docs/help/reference/messages/km01003.md | 11 + .../docs/help/reference/messages/km01004.md | 11 + .../docs/help/reference/messages/km01005.md | 11 + .../docs/help/reference/messages/km01006.md | 11 + .../docs/help/reference/messages/km01007.md | 11 + .../docs/help/reference/messages/km02001.md | 11 + .../docs/help/reference/messages/km02002.md | 11 + .../docs/help/reference/messages/km02004.md | 11 + .../docs/help/reference/messages/km02005.md | 11 + .../docs/help/reference/messages/km02007.md | 11 + .../docs/help/reference/messages/km02008.md | 11 + .../docs/help/reference/messages/km02009.md | 11 + .../docs/help/reference/messages/km0200a.md | 11 + .../docs/help/reference/messages/km0200b.md | 11 + .../docs/help/reference/messages/km0200c.md | 11 + .../docs/help/reference/messages/km0200d.md | 11 + .../docs/help/reference/messages/km0200e.md | 11 + .../docs/help/reference/messages/km0200f.md | 11 + .../docs/help/reference/messages/km02010.md | 11 + .../docs/help/reference/messages/km02011.md | 11 + .../docs/help/reference/messages/km02012.md | 11 + .../docs/help/reference/messages/km02013.md | 11 + .../docs/help/reference/messages/km02014.md | 11 + .../docs/help/reference/messages/km02015.md | 11 + .../docs/help/reference/messages/km02016.md | 11 + .../docs/help/reference/messages/km02017.md | 11 + .../docs/help/reference/messages/km02018.md | 11 + .../docs/help/reference/messages/km02019.md | 11 + .../docs/help/reference/messages/km0201a.md | 11 + .../docs/help/reference/messages/km0201b.md | 11 + .../docs/help/reference/messages/km0201c.md | 11 + .../docs/help/reference/messages/km0201d.md | 11 + .../docs/help/reference/messages/km0201e.md | 11 + .../docs/help/reference/messages/km0201f.md | 11 + .../docs/help/reference/messages/km02020.md | 11 + .../docs/help/reference/messages/km02021.md | 11 + .../docs/help/reference/messages/km02022.md | 11 + .../docs/help/reference/messages/km02024.md | 11 + .../docs/help/reference/messages/km02025.md | 11 + .../docs/help/reference/messages/km02026.md | 11 + .../docs/help/reference/messages/km02027.md | 11 + .../docs/help/reference/messages/km02028.md | 11 + .../docs/help/reference/messages/km02029.md | 11 + .../docs/help/reference/messages/km0202a.md | 11 + .../docs/help/reference/messages/km0202b.md | 11 + .../docs/help/reference/messages/km0202c.md | 11 + .../docs/help/reference/messages/km0202d.md | 11 + .../docs/help/reference/messages/km0202e.md | 11 + .../docs/help/reference/messages/km0202f.md | 11 + .../docs/help/reference/messages/km02030.md | 11 + .../docs/help/reference/messages/km02031.md | 11 + .../docs/help/reference/messages/km02032.md | 11 + .../docs/help/reference/messages/km02033.md | 11 + .../docs/help/reference/messages/km02034.md | 11 + .../docs/help/reference/messages/km02035.md | 11 + .../docs/help/reference/messages/km02036.md | 11 + .../docs/help/reference/messages/km02037.md | 11 + .../docs/help/reference/messages/km02038.md | 11 + .../docs/help/reference/messages/km02039.md | 11 + .../docs/help/reference/messages/km0203a.md | 11 + .../docs/help/reference/messages/km0203b.md | 11 + .../docs/help/reference/messages/km0203c.md | 11 + .../docs/help/reference/messages/km0203d.md | 11 + .../docs/help/reference/messages/km0203e.md | 11 + .../docs/help/reference/messages/km0203f.md | 11 + .../docs/help/reference/messages/km02040.md | 11 + .../docs/help/reference/messages/km02044.md | 11 + .../docs/help/reference/messages/km02045.md | 11 + .../docs/help/reference/messages/km02046.md | 11 + .../docs/help/reference/messages/km02047.md | 11 + .../docs/help/reference/messages/km02048.md | 11 + .../docs/help/reference/messages/km02049.md | 11 + .../docs/help/reference/messages/km0204a.md | 11 + .../docs/help/reference/messages/km0204b.md | 11 + .../docs/help/reference/messages/km0204c.md | 11 + .../docs/help/reference/messages/km0204d.md | 11 + .../docs/help/reference/messages/km0204e.md | 11 + .../docs/help/reference/messages/km0204f.md | 11 + .../docs/help/reference/messages/km02050.md | 11 + .../docs/help/reference/messages/km02051.md | 11 + .../docs/help/reference/messages/km02052.md | 11 + .../docs/help/reference/messages/km02053.md | 11 + .../docs/help/reference/messages/km02054.md | 11 + .../docs/help/reference/messages/km02055.md | 11 + .../docs/help/reference/messages/km02056.md | 11 + .../docs/help/reference/messages/km02057.md | 11 + .../docs/help/reference/messages/km02058.md | 11 + .../docs/help/reference/messages/km02059.md | 11 + .../docs/help/reference/messages/km0205a.md | 11 + .../docs/help/reference/messages/km0205b.md | 11 + .../docs/help/reference/messages/km0205c.md | 11 + .../docs/help/reference/messages/km0205d.md | 11 + .../docs/help/reference/messages/km0205e.md | 11 + .../docs/help/reference/messages/km0205f.md | 11 + .../docs/help/reference/messages/km02060.md | 11 + .../docs/help/reference/messages/km02061.md | 11 + .../docs/help/reference/messages/km02062.md | 11 + .../docs/help/reference/messages/km02063.md | 11 + .../docs/help/reference/messages/km02064.md | 11 + .../docs/help/reference/messages/km02065.md | 11 + .../docs/help/reference/messages/km02066.md | 11 + .../docs/help/reference/messages/km02067.md | 11 + .../docs/help/reference/messages/km02068.md | 11 + .../docs/help/reference/messages/km02069.md | 11 + .../docs/help/reference/messages/km0206a.md | 11 + .../docs/help/reference/messages/km0206b.md | 11 + .../docs/help/reference/messages/km0206c.md | 11 + .../docs/help/reference/messages/km0206d.md | 11 + .../docs/help/reference/messages/km0206e.md | 11 + .../docs/help/reference/messages/km0206f.md | 11 + .../docs/help/reference/messages/km02070.md | 11 + .../docs/help/reference/messages/km02071.md | 11 + .../docs/help/reference/messages/km02072.md | 11 + .../docs/help/reference/messages/km02073.md | 11 + .../docs/help/reference/messages/km02074.md | 11 + .../docs/help/reference/messages/km02075.md | 11 + .../docs/help/reference/messages/km02076.md | 11 + .../docs/help/reference/messages/km02077.md | 11 + .../docs/help/reference/messages/km02078.md | 11 + .../docs/help/reference/messages/km02079.md | 11 + .../docs/help/reference/messages/km02080.md | 11 + .../docs/help/reference/messages/km02081.md | 11 + .../docs/help/reference/messages/km02082.md | 11 + .../docs/help/reference/messages/km02083.md | 11 + .../docs/help/reference/messages/km02084.md | 11 + .../docs/help/reference/messages/km02085.md | 11 + .../docs/help/reference/messages/km02086.md | 11 + .../docs/help/reference/messages/km02087.md | 11 + .../docs/help/reference/messages/km02088.md | 11 + .../docs/help/reference/messages/km02089.md | 11 + .../docs/help/reference/messages/km0208a.md | 11 + .../docs/help/reference/messages/km0208b.md | 11 + .../docs/help/reference/messages/km0208c.md | 11 + .../docs/help/reference/messages/km0208d.md | 11 + .../docs/help/reference/messages/km0208e.md | 11 + .../docs/help/reference/messages/km0208f.md | 11 + .../docs/help/reference/messages/km02090.md | 11 + .../docs/help/reference/messages/km02091.md | 11 + .../docs/help/reference/messages/km02092.md | 11 + .../docs/help/reference/messages/km02093.md | 11 + .../docs/help/reference/messages/km02094.md | 11 + .../docs/help/reference/messages/km02095.md | 11 + .../docs/help/reference/messages/km02098.md | 11 + .../docs/help/reference/messages/km02099.md | 11 + .../docs/help/reference/messages/km0209a.md | 11 + .../docs/help/reference/messages/km0209c.md | 11 + .../docs/help/reference/messages/km0209d.md | 11 + .../docs/help/reference/messages/km0209e.md | 11 + .../docs/help/reference/messages/km0209f.md | 11 + .../docs/help/reference/messages/km020a2.md | 11 + .../docs/help/reference/messages/km020a3.md | 11 + .../docs/help/reference/messages/km020a4.md | 11 + .../docs/help/reference/messages/km020a5.md | 11 + .../docs/help/reference/messages/km020a6.md | 11 + .../docs/help/reference/messages/km020a8.md | 11 + .../docs/help/reference/messages/km020a9.md | 11 + .../docs/help/reference/messages/km020aa.md | 11 + .../docs/help/reference/messages/km020ab.md | 11 + .../docs/help/reference/messages/km020ac.md | 11 + .../docs/help/reference/messages/km020ad.md | 11 + .../docs/help/reference/messages/km020ae.md | 11 + .../docs/help/reference/messages/km020af.md | 11 + .../docs/help/reference/messages/km020c0.md | 11 + .../docs/help/reference/messages/km020c1.md | 11 + .../docs/help/reference/messages/km02900.md | 13 + .../docs/help/reference/messages/km02901.md | 13 + .../docs/help/reference/messages/km02903.md | 13 + .../docs/help/reference/messages/km02904.md | 13 + .../docs/help/reference/messages/km02905.md | 16 + .../docs/help/reference/messages/km02906.md | 16 + .../docs/help/reference/messages/km02907.md | 14 + .../docs/help/reference/messages/km02908.md | 15 + .../docs/help/reference/messages/km02909.md | 14 + .../docs/help/reference/messages/km0290a.md | 15 + .../docs/help/reference/messages/km0290b.md | 15 + .../docs/help/reference/messages/km0290c.md | 12 + .../docs/help/reference/messages/km03001.md | 11 + .../docs/help/reference/messages/km03002.md | 11 + .../docs/help/reference/messages/km03003.md | 11 + .../docs/help/reference/messages/km03004.md | 11 + .../docs/help/reference/messages/km03005.md | 11 + .../docs/help/reference/messages/km03006.md | 11 + .../docs/help/reference/messages/km03007.md | 11 + .../docs/help/reference/messages/km03008.md | 11 + .../docs/help/reference/messages/km03009.md | 11 + .../docs/help/reference/messages/km0300a.md | 11 + .../docs/help/reference/messages/km04001.md | 11 + .../docs/help/reference/messages/km04002.md | 11 + .../docs/help/reference/messages/km04003.md | 11 + .../docs/help/reference/messages/km04004.md | 11 + .../docs/help/reference/messages/km04005.md | 11 + .../docs/help/reference/messages/km04006.md | 11 + .../docs/help/reference/messages/km04007.md | 11 + .../docs/help/reference/messages/km04008.md | 11 + .../docs/help/reference/messages/km04009.md | 11 + .../docs/help/reference/messages/km0400a.md | 11 + .../docs/help/reference/messages/km0400b.md | 11 + .../docs/help/reference/messages/km0400c.md | 11 + .../docs/help/reference/messages/km0400d.md | 11 + .../docs/help/reference/messages/km0400e.md | 11 + .../docs/help/reference/messages/km0400f.md | 11 + .../docs/help/reference/messages/km04010.md | 11 + .../docs/help/reference/messages/km04011.md | 11 + .../docs/help/reference/messages/km04012.md | 11 + .../docs/help/reference/messages/km04014.md | 11 + .../docs/help/reference/messages/km04015.md | 11 + .../docs/help/reference/messages/km04016.md | 11 + .../docs/help/reference/messages/km04017.md | 11 + .../docs/help/reference/messages/km04018.md | 11 + .../docs/help/reference/messages/km04019.md | 11 + .../docs/help/reference/messages/km0401a.md | 11 + .../docs/help/reference/messages/km0401b.md | 11 + .../docs/help/reference/messages/km0401c.md | 11 + .../docs/help/reference/messages/km0401d.md | 11 + .../docs/help/reference/messages/km0401e.md | 11 + .../docs/help/reference/messages/km0401f.md | 11 + .../docs/help/reference/messages/km04020.md | 11 + .../docs/help/reference/messages/km04021.md | 11 + .../docs/help/reference/messages/km05001.md | 11 + .../docs/help/reference/messages/km05002.md | 11 + .../docs/help/reference/messages/km05003.md | 11 + .../docs/help/reference/messages/km05004.md | 11 + .../docs/help/reference/messages/km05005.md | 11 + .../docs/help/reference/messages/km05006.md | 11 + .../docs/help/reference/messages/km05007.md | 11 + .../docs/help/reference/messages/km05008.md | 11 + .../docs/help/reference/messages/km05009.md | 11 + .../docs/help/reference/messages/km0500a.md | 11 + .../docs/help/reference/messages/km0500b.md | 11 + .../docs/help/reference/messages/km0500c.md | 11 + .../docs/help/reference/messages/km0500d.md | 11 + .../docs/help/reference/messages/km0500e.md | 11 + .../docs/help/reference/messages/km0500f.md | 11 + .../docs/help/reference/messages/km05010.md | 11 + .../docs/help/reference/messages/km05011.md | 11 + .../docs/help/reference/messages/km05012.md | 11 + .../docs/help/reference/messages/km05013.md | 11 + .../docs/help/reference/messages/km05014.md | 11 + .../docs/help/reference/messages/km05015.md | 11 + .../docs/help/reference/messages/km05016.md | 11 + .../docs/help/reference/messages/km05017.md | 11 + .../docs/help/reference/messages/km05018.md | 11 + .../docs/help/reference/messages/km05019.md | 11 + .../docs/help/reference/messages/km0501a.md | 11 + .../docs/help/reference/messages/km0501b.md | 11 + .../docs/help/reference/messages/km0501c.md | 11 + .../docs/help/reference/messages/km0501d.md | 11 + .../docs/help/reference/messages/km0501e.md | 11 + .../docs/help/reference/messages/km06001.md | 13 + .../docs/help/reference/messages/km06002.md | 11 + .../docs/help/reference/messages/km07001.md | 11 + .../docs/help/reference/messages/km07002.md | 11 + .../docs/help/reference/messages/km07003.md | 11 + .../docs/help/reference/messages/km07004.md | 11 + .../docs/help/reference/messages/km07005.md | 11 + .../docs/help/reference/messages/km08001.md | 11 + .../docs/help/reference/messages/km08002.md | 11 + .../docs/help/reference/messages/km08003.md | 11 + .../docs/help/reference/messages/km08004.md | 11 + .../docs/help/reference/messages/km08005.md | 11 + .../docs/help/reference/messages/km08006.md | 11 + .../docs/help/reference/messages/km08007.md | 11 + .../docs/help/reference/messages/km08008.md | 11 + .../docs/help/reference/messages/km08009.md | 11 + .../docs/help/reference/messages/km0800a.md | 11 + .../docs/help/reference/messages/km09001.md | 11 + .../docs/help/reference/messages/km09002.md | 11 + .../docs/help/reference/messages/km09005.md | 11 + .../docs/help/reference/messages/km09006.md | 11 + .../docs/help/reference/messages/km09007.md | 11 + .../docs/help/reference/messages/km09008.md | 11 + .../docs/help/reference/messages/km09009.md | 11 + .../docs/help/reference/messages/km0900a.md | 11 + .../docs/help/reference/messages/km0900e.md | 11 + .../docs/help/reference/messages/km0900f.md | 11 + .../docs/help/reference/messages/km09010.md | 11 + .../messages/kmc-analyze.analyzermessages.md | 8 + ...board-info.keyboardinfocompilermessages.md | 17 + .../messages/kmc-kmn.kmncompilermessages.md | 177 ++++ .../messages/kmc-kmn.kmwcompilermessages.md | 11 + .../messages/kmc-ldml.compilermessages.md | 49 + ...mc-model-info.modelinfocompilermessages.md | 16 + .../kmc-model.modelcompilermessages.md | 16 + .../messages/kmc-package.compilermessages.md | 38 + .../messages/kmc.infrastructuremessages.md | 36 + developer/docs/help/reference/tools/index.md | 7 + developer/docs/help/reference/tools/setup.md | 17 + .../docs/help/reference/user-settings.md | 28 + developer/docs/help/whats-new.md | 43 + 768 files changed, 17865 insertions(+) create mode 100644 developer/docs/help/context/about-tike.md create mode 100644 developer/docs/help/context/character-map.md create mode 100644 developer/docs/help/context/debug.md create mode 100644 developer/docs/help/context/edit-language-example.md create mode 100644 developer/docs/help/context/editor.md create mode 100644 developer/docs/help/context/images/banner.png create mode 100644 developer/docs/help/context/images/character-grid.png create mode 100644 developer/docs/help/context/images/config.png create mode 100644 developer/docs/help/context/images/device-menu.png create mode 100644 developer/docs/help/context/images/hamburger-menu.png create mode 100644 developer/docs/help/context/images/keyboard-menu.png create mode 100644 developer/docs/help/context/images/lexical-model-test.png create mode 100644 developer/docs/help/context/images/model-menu.png create mode 100644 developer/docs/help/context/images/on-screen-keyboard.png create mode 100644 developer/docs/help/context/images/server-iphone.png create mode 100644 developer/docs/help/context/images/status-bar.png create mode 100644 developer/docs/help/context/images/taskbar-menu.png create mode 100644 developer/docs/help/context/images/taskbar.png create mode 100644 developer/docs/help/context/images/text-area.png create mode 100644 developer/docs/help/context/index.md create mode 100644 developer/docs/help/context/key-test.md create mode 100644 developer/docs/help/context/keyboard-editor.md create mode 100644 developer/docs/help/context/keyman-developer.md create mode 100644 developer/docs/help/context/kmc.md create mode 100644 developer/docs/help/context/kmcomp.md create mode 100644 developer/docs/help/context/kmconvert.md create mode 100644 developer/docs/help/context/kmlmc.md create mode 100644 developer/docs/help/context/kmlmi.md create mode 100644 developer/docs/help/context/kmlmp.md create mode 100644 developer/docs/help/context/ldml-debug.md create mode 100644 developer/docs/help/context/ldml-editor.md create mode 100644 developer/docs/help/context/messages.md create mode 100644 developer/docs/help/context/model-editor.md create mode 100644 developer/docs/help/context/new-ldml-project-parameters.md create mode 100644 developer/docs/help/context/new-lm-project-parameters.md create mode 100644 developer/docs/help/context/new-project-parameters.md create mode 100644 developer/docs/help/context/new-project.md create mode 100644 developer/docs/help/context/new.md create mode 100644 developer/docs/help/context/options.md create mode 100644 developer/docs/help/context/package-editor.md create mode 100644 developer/docs/help/context/project.md create mode 100644 developer/docs/help/context/select-web-fonts.md create mode 100644 developer/docs/help/context/server.md create mode 100644 developer/docs/help/guides/command-line.md create mode 100644 developer/docs/help/guides/develop/advanced-keyboard-development-example.md create mode 100644 developer/docs/help/guides/develop/creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty.md create mode 100644 developer/docs/help/guides/develop/creating-a-touch-keyboard-layout-for-amharic.md create mode 100644 developer/docs/help/guides/develop/imx/imxdll.md create mode 100644 developer/docs/help/guides/develop/imx/imxlib.md create mode 100644 developer/docs/help/guides/develop/imx/index.md create mode 100644 developer/docs/help/guides/develop/imx/web.md create mode 100644 developer/docs/help/guides/develop/imx/web/index.md create mode 100644 developer/docs/help/guides/develop/index.md create mode 100644 developer/docs/help/guides/develop/touch-keyboard-tutorial/index.md create mode 100644 developer/docs/help/guides/develop/touch-keyboard-tutorial/making-touch-keyboard.md create mode 100644 developer/docs/help/guides/develop/tutorial/index.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-1.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-2.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-3.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-4.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-5.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-6.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-7.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-8.md create mode 100644 developer/docs/help/guides/develop/tutorial/step-9.md create mode 100644 developer/docs/help/guides/distribute/index.md create mode 100644 developer/docs/help/guides/distribute/install-kmp-android.md create mode 100644 developer/docs/help/guides/distribute/install-kmp-ios.md create mode 100644 developer/docs/help/guides/distribute/packages.md create mode 100644 developer/docs/help/guides/distribute/tutorial/index.md create mode 100644 developer/docs/help/guides/distribute/tutorial/step-1.md create mode 100644 developer/docs/help/guides/distribute/tutorial/step-2.md create mode 100644 developer/docs/help/guides/distribute/tutorial/step-3.md create mode 100644 developer/docs/help/guides/distribute/tutorial/step-4.md create mode 100644 developer/docs/help/guides/distribute/tutorial/step-5.md create mode 100644 developer/docs/help/guides/distribute/tutorial/step-6.md create mode 100644 developer/docs/help/guides/index.md create mode 100644 developer/docs/help/guides/intro.md create mode 100644 developer/docs/help/guides/lexical-models/advanced/index.md create mode 100644 developer/docs/help/guides/lexical-models/advanced/model-definition-file.md create mode 100644 developer/docs/help/guides/lexical-models/advanced/punctuation.md create mode 100644 developer/docs/help/guides/lexical-models/advanced/search-term-to-key.md create mode 100644 developer/docs/help/guides/lexical-models/advanced/unicode-breaker-extension.md create mode 100644 developer/docs/help/guides/lexical-models/advanced/word-breaker.md create mode 100644 developer/docs/help/guides/lexical-models/distribute/index.md create mode 100644 developer/docs/help/guides/lexical-models/distribute/packages.md create mode 100644 developer/docs/help/guides/lexical-models/distribute/tutorial/index.md create mode 100644 developer/docs/help/guides/lexical-models/distribute/tutorial/step-1.md create mode 100644 developer/docs/help/guides/lexical-models/distribute/tutorial/step-2.md create mode 100644 developer/docs/help/guides/lexical-models/distribute/tutorial/step-3.md create mode 100644 developer/docs/help/guides/lexical-models/distribute/tutorial/step-4.md create mode 100644 developer/docs/help/guides/lexical-models/distribute/tutorial/step-5.md create mode 100644 developer/docs/help/guides/lexical-models/index.md create mode 100644 developer/docs/help/guides/lexical-models/intro/index.md create mode 100644 developer/docs/help/guides/lexical-models/tutorial/index.md create mode 100644 developer/docs/help/guides/lexical-models/tutorial/step-1.md create mode 100644 developer/docs/help/guides/lexical-models/tutorial/step-2.md create mode 100644 developer/docs/help/guides/lexical-models/tutorial/step-3.md create mode 100644 developer/docs/help/guides/lexical-models/tutorial/step-4.md create mode 100644 developer/docs/help/guides/test/index.md create mode 100644 developer/docs/help/guides/test/keyboard-touch-and-desktop.md create mode 100644 developer/docs/help/guides/test/keyboard-touch-mobile-emulator.md create mode 100644 developer/docs/help/guides/test/lexical-model.md create mode 100644 developer/docs/help/images/app/dist-file-browser-ap.png create mode 100644 developer/docs/help/images/app/dist-install1-ap.png create mode 100644 developer/docs/help/images/app/dist-install1-i.png create mode 100644 developer/docs/help/images/app/dist-kmp-open-i.png create mode 100644 developer/docs/help/images/app/dist-kmp-success-i.png create mode 100644 developer/docs/help/images/app/dist-storage-permission-ap.png create mode 100644 developer/docs/help/images/app/dist-url-screen-ap.png create mode 100644 developer/docs/help/images/app/dist-url-screen-i.png create mode 100644 developer/docs/help/images/app/dist-welcome-ap.png create mode 100644 developer/docs/help/images/app/dist-welcome-i.png create mode 100644 developer/docs/help/images/app/settings-language-ap.png create mode 100644 developer/docs/help/images/ipa.gif create mode 100644 developer/docs/help/images/lm/developer-open-tsv.png create mode 100644 developer/docs/help/images/lm/edited-tsv.png create mode 100644 developer/docs/help/images/lm/overview.svg create mode 100644 developer/docs/help/images/lm/sencoten-sheets-full.png create mode 100644 developer/docs/help/images/lm/sencoten-sheets-save-as.png create mode 100644 developer/docs/help/images/lm/template-tsv.png create mode 100644 developer/docs/help/images/lm/test-model.png create mode 100644 developer/docs/help/images/lm/tutorial_distribute_model_3.png create mode 100644 developer/docs/help/images/lm/tutorial_distribute_model_3_files.png create mode 100644 developer/docs/help/images/lm/tutorial_distribute_model_compile.png create mode 100644 developer/docs/help/images/lm/tutorial_distribute_model_details.png create mode 100644 developer/docs/help/images/lm/whatis-correct-thr.png create mode 100644 developer/docs/help/images/lm/whatis-incompr.png create mode 100644 developer/docs/help/images/lm/whatis-naiv.png create mode 100644 developer/docs/help/images/lm/whatis-on-my-w.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_1.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_10.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_11.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_12-2.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_12.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_13.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_14.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_15.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_15b.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_16.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_16b.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_17.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_18.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_19.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_2.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_20.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_3.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_36.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_4.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_5.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_6.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_7.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_8.png create mode 100644 developer/docs/help/images/simpleTouchKeyboard_9.png create mode 100644 developer/docs/help/images/testing/chrome1.png create mode 100644 developer/docs/help/images/testing/chrome2.png create mode 100644 developer/docs/help/images/testing/chrome3.png create mode 100644 developer/docs/help/images/testing/chrome4.png create mode 100644 developer/docs/help/images/testing/frame/android-debug-host.png create mode 100644 developer/docs/help/images/testing/frame/android-debug-keyboard.png create mode 100644 developer/docs/help/images/testing/frame/android-enter-debug-host.png create mode 100644 developer/docs/help/images/testing/frame/installing-native-keyboard-1.png create mode 100644 developer/docs/help/images/testing/frame/installing-native-keyboard-2.png create mode 100644 developer/docs/help/images/testing/startdebugging-kd10.png create mode 100644 developer/docs/help/images/testing/touch-editor-build-800wi.png create mode 100644 developer/docs/help/images/testing/touch-editor-build.png create mode 100644 developer/docs/help/images/testing/touch-editor-khmer-800wi.png create mode 100644 developer/docs/help/images/testing/touch-editor-khmer.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard_2.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard_3.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard_4.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard_5.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard_6.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard_7.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard_8.png create mode 100644 developer/docs/help/images/touch_amharic_keyboard_9.png create mode 100644 developer/docs/help/images/tutorial_distribute_keyboard_3.png create mode 100644 developer/docs/help/images/tutorial_distribute_keyboard_3_files.png create mode 100644 developer/docs/help/images/tutorial_distribute_keyboard_compile.png create mode 100644 developer/docs/help/images/tutorial_distribute_keyboard_details.png create mode 100644 developer/docs/help/images/tutorial_distribute_keyboard_shortcuts.png create mode 100644 developer/docs/help/images/tutorial_keyboard_qfrench.gif create mode 100644 developer/docs/help/images/tutorial_package_includesdocs.gif create mode 100644 developer/docs/help/images/tutorial_package_includesfonts.gif create mode 100644 developer/docs/help/images/tutorial_package_includesosk.gif create mode 100644 developer/docs/help/images/tutorial_package_includeswelcome.gif create mode 100644 developer/docs/help/images/ui/BuildTab.png create mode 100644 developer/docs/help/images/ui/Debug_Menu.png create mode 100644 developer/docs/help/images/ui/Debug_Toolbar.png create mode 100644 developer/docs/help/images/ui/LongPress_Flicks_Multitaps.png create mode 100644 developer/docs/help/images/ui/NGROK_Phone.png create mode 100644 developer/docs/help/images/ui/OnScreenKeyboard.png create mode 100644 developer/docs/help/images/ui/TouchLayout_Design.png create mode 100644 developer/docs/help/images/ui/TouchLayout_Design_2.png create mode 100644 developer/docs/help/images/ui/frmAboutTike.png create mode 100644 developer/docs/help/images/ui/frmCharacterMapFilter.png create mode 100644 developer/docs/help/images/ui/frmCharacterMapNew.png create mode 100644 developer/docs/help/images/ui/frmDebug.png create mode 100644 developer/docs/help/images/ui/frmEditLanguageExample.png create mode 100644 developer/docs/help/images/ui/frmKeyTest.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Debug_CallStack.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Debug_Deadkeys.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Debug_Elements.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Debug_RegressionTest.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Debug_State.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Details.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Icon.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Layout_Code.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_Layout_Design.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_New.png create mode 100644 developer/docs/help/images/ui/frmKeymanWizard_TouchLayout_Code.png create mode 100644 developer/docs/help/images/ui/frmKeyman_Developer_Server_Options.png create mode 100644 developer/docs/help/images/ui/frmLDMLEditor.png create mode 100644 developer/docs/help/images/ui/frmList_Local_URLs.png create mode 100644 developer/docs/help/images/ui/frmMessages.png create mode 100644 developer/docs/help/images/ui/frmModelEditor_Build.png create mode 100644 developer/docs/help/images/ui/frmModelEditor_Details.png create mode 100644 developer/docs/help/images/ui/frmModelEditor_Source.png create mode 100644 developer/docs/help/images/ui/frmModelEditor_Wordlist_Code.png create mode 100644 developer/docs/help/images/ui/frmModelEditor_Wordlist_Design.png create mode 100644 developer/docs/help/images/ui/frmModelsCompile.png create mode 100644 developer/docs/help/images/ui/frmNGROK_Config.png create mode 100644 developer/docs/help/images/ui/frmNGROK_Server_1.png create mode 100644 developer/docs/help/images/ui/frmNGROK_Server_2.png create mode 100644 developer/docs/help/images/ui/frmNew.png create mode 100644 developer/docs/help/images/ui/frmNewLMProject.png create mode 100644 developer/docs/help/images/ui/frmNewLMProjectParameters.png create mode 100644 developer/docs/help/images/ui/frmNewLMProjectSelectLanguage.png create mode 100644 developer/docs/help/images/ui/frmNewProject.png create mode 100644 developer/docs/help/images/ui/frmNewProjectParameters.png create mode 100644 developer/docs/help/images/ui/frmOptions_CharacterMap.png create mode 100644 developer/docs/help/images/ui/frmOptions_Debugger.png create mode 100644 developer/docs/help/images/ui/frmOptions_Editor.png create mode 100644 developer/docs/help/images/ui/frmOptions_General.png create mode 100644 developer/docs/help/images/ui/frmOptions_Server.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_Build.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_Details.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_EditExample.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_EditRelatedPackage.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_Files.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_Keyboards.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_SelectWebFonts.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_Select_BCP_47_Tag.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_Shortcuts.png create mode 100644 developer/docs/help/images/ui/frmPackageEditor_Source.png create mode 100644 developer/docs/help/images/ui/frmProject_Distribution.png create mode 100644 developer/docs/help/images/ui/frmProject_Keyboards.png create mode 100644 developer/docs/help/images/ui/frmProject_Packaging.png create mode 100644 developer/docs/help/images/ui/frmProject_Welcome.png create mode 100644 developer/docs/help/images/ui/obj.gif create mode 100644 developer/docs/help/index.md create mode 100644 developer/docs/help/main/credits.md create mode 100644 developer/docs/help/main/index.md create mode 100644 developer/docs/help/main/license.md create mode 100644 developer/docs/help/reference/api/index.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruse._constructor_.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruse.analyze.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruse.clear.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruse.getstrings.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruse.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruseoptions.includecounts.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruseoptions.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruseoptions.puabase.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskcharacteruseoptions.stripdottedcircle.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskrewritepua._constructor_.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskrewritepua.analyze.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskrewritepua.clear.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskrewritepua.data.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.analyzeoskrewritepua.md create mode 100644 developer/docs/help/reference/api/kmc-analyze.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompiler._constructor_.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompiler.init.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompiler.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompiler.run.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompiler.write.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompilerartifacts.keyboard_info.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompilerartifacts.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompileroptions.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompileroptions.sources.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompilerresult.artifacts.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfocompilerresult.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfosources.forpublishing.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfosources.jsfilename.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfosources.kmpfilename.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfosources.kpsfilename.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfosources.lastcommitdate.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfosources.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.keyboardinfosources.sourcepath.md create mode 100644 developer/docs/help/reference/api/kmc-keyboard-info.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompiler._constructor_.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompiler.init.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompiler.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompiler.run.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompiler.verifyinitialized.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompiler.write.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompilerartifacts.js.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompilerartifacts.kmx.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompilerartifacts.kvk.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompilerartifacts.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompileroptions.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompilerresult.artifacts.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompilerresult.displaymap.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompilerresult.extra.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.kmncompilerresult.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.parsemapping.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.puamap.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.remaptouchlayout.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.remapvisualkeyboard.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringref.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringref.str.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringref.usages.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringrefusage.count.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringrefusage.filename.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringrefusage.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringresult.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringresult.pua.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringresult.str.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringresult.unicode.md create mode 100644 developer/docs/help/reference/api/kmc-kmn.osk.stringresult.usages.md create mode 100644 developer/docs/help/reference/api/kmc-ldml.ldmlcompileroptions.md create mode 100644 developer/docs/help/reference/api/kmc-ldml.ldmlcompileroptions.readeroptions.md create mode 100644 developer/docs/help/reference/api/kmc-ldml.ldmlkeyboardcompiler.init.md create mode 100644 developer/docs/help/reference/api/kmc-ldml.ldmlkeyboardcompiler.md create mode 100644 developer/docs/help/reference/api/kmc-ldml.ldmlkeyboardcompiler.run.md create mode 100644 developer/docs/help/reference/api/kmc-ldml.ldmlkeyboardcompiler.write.md create mode 100644 developer/docs/help/reference/api/kmc-ldml.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompiler._constructor_.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompiler.init.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompiler.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompiler.run.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompiler.write.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompilerartifacts.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompilerartifacts.model_info.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompileroptions.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompileroptions.sources.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompilerresult.artifacts.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfocompilerresult.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.forpublishing.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.kmpfilename.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.kmpjsondata.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.kpsfilename.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.lastcommitdate.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.model_id.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.modelfilename.md create mode 100644 developer/docs/help/reference/api/kmc-model-info.modelinfosources.sourcepath.md create mode 100644 developer/docs/help/reference/api/kmc-model.casedwordformtokeyspec.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelcompiler.init.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelcompiler.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelcompiler.run.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelcompiler.write.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelcompilerartifacts.js.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelcompilerartifacts.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelcompilerresult.artifacts.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelcompilerresult.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelsource.applycasing.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelsource.languageusescasing.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelsource.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelsource.punctuation.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelsource.rootclass.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelsource.searchtermtokey.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelsource.sources.md create mode 100644 developer/docs/help/reference/api/kmc-model.lexicalmodelsource.wordbreaker.md create mode 100644 developer/docs/help/reference/api/kmc-model.md create mode 100644 developer/docs/help/reference/api/kmc-model.simplewordbreakerspec.md create mode 100644 developer/docs/help/reference/api/kmc-model.simplewordformtokeyspec.md create mode 100644 developer/docs/help/reference/api/kmc-model.wordbreakerspec.joinwordsat.md create mode 100644 developer/docs/help/reference/api/kmc-model.wordbreakerspec.md create mode 100644 developer/docs/help/reference/api/kmc-model.wordbreakerspec.overridescriptdefaults.md create mode 100644 developer/docs/help/reference/api/kmc-model.wordbreakerspec.use.md create mode 100644 developer/docs/help/reference/api/kmc-model.wordformtokeyspec.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompiler.init.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompiler.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompiler.normalizepath.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompiler.run.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompiler.write.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompilerartifacts.kmp.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompilerartifacts.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompileroptions.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompilerresult.artifacts.md create mode 100644 developer/docs/help/reference/api/kmc-package.kmpcompilerresult.md create mode 100644 developer/docs/help/reference/api/kmc-package.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompiler.init.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompiler.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompiler.run.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompiler.write.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompilerartifacts.exe.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompilerartifacts.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompileroptions.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompileroptions.sources.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompilerresult.artifacts.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallercompilerresult.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallersources.appname.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallersources.licensefilename.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallersources.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallersources.msifilename.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallersources.setupexefilename.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallersources.startdisabled.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallersources.startwithconfiguration.md create mode 100644 developer/docs/help/reference/api/kmc-package.windowspackageinstallersources.titleimagefilename.md create mode 100644 developer/docs/help/reference/bcp-47.md create mode 100644 developer/docs/help/reference/editor-themes.md create mode 100644 developer/docs/help/reference/errors/index.md create mode 100644 developer/docs/help/reference/file-layout.md create mode 100644 developer/docs/help/reference/file-types/ico.md create mode 100644 developer/docs/help/reference/file-types/index.md create mode 100644 developer/docs/help/reference/file-types/keyman-touch-layout.md create mode 100644 developer/docs/help/reference/file-types/kmn.md create mode 100644 developer/docs/help/reference/file-types/kmp.md create mode 100644 developer/docs/help/reference/file-types/kmx.md create mode 100644 developer/docs/help/reference/file-types/kpj.md create mode 100644 developer/docs/help/reference/file-types/kps.md create mode 100644 developer/docs/help/reference/file-types/kvk.md create mode 100644 developer/docs/help/reference/file-types/kvks.md create mode 100644 developer/docs/help/reference/file-types/metadata.md create mode 100644 developer/docs/help/reference/file-types/model-js.md create mode 100644 developer/docs/help/reference/file-types/model-ts.md create mode 100644 developer/docs/help/reference/file-types/tsv.md create mode 100644 developer/docs/help/reference/file-types/ttf.md create mode 100644 developer/docs/help/reference/file-types/xml.md create mode 100644 developer/docs/help/reference/index.md create mode 100644 developer/docs/help/reference/kmc/api/index.md create mode 100644 developer/docs/help/reference/kmc/cli/get-started.md create mode 100644 developer/docs/help/reference/kmc/cli/index.md create mode 100644 developer/docs/help/reference/kmc/cli/kmcomp-migration.md create mode 100644 developer/docs/help/reference/kmc/cli/messages/index.md create mode 100644 developer/docs/help/reference/kmc/cli/reference.md create mode 100644 developer/docs/help/reference/kmc/index.md create mode 100644 developer/docs/help/reference/messages/common-types.commontypesmessages.md create mode 100644 developer/docs/help/reference/messages/index.md create mode 100644 developer/docs/help/reference/messages/km00001.md create mode 100644 developer/docs/help/reference/messages/km00002.md create mode 100644 developer/docs/help/reference/messages/km00003.md create mode 100644 developer/docs/help/reference/messages/km00004.md create mode 100644 developer/docs/help/reference/messages/km00005.md create mode 100644 developer/docs/help/reference/messages/km00006.md create mode 100644 developer/docs/help/reference/messages/km00007.md create mode 100644 developer/docs/help/reference/messages/km00008.md create mode 100644 developer/docs/help/reference/messages/km00009.md create mode 100644 developer/docs/help/reference/messages/km0000a.md create mode 100644 developer/docs/help/reference/messages/km0000b.md create mode 100644 developer/docs/help/reference/messages/km0000d.md create mode 100644 developer/docs/help/reference/messages/km0000e.md create mode 100644 developer/docs/help/reference/messages/km00010.md create mode 100644 developer/docs/help/reference/messages/km00011.md create mode 100644 developer/docs/help/reference/messages/km00012.md create mode 100644 developer/docs/help/reference/messages/km00013.md create mode 100644 developer/docs/help/reference/messages/km00014.md create mode 100644 developer/docs/help/reference/messages/km00015.md create mode 100644 developer/docs/help/reference/messages/km00016.md create mode 100644 developer/docs/help/reference/messages/km00018.md create mode 100644 developer/docs/help/reference/messages/km00019.md create mode 100644 developer/docs/help/reference/messages/km0001a.md create mode 100644 developer/docs/help/reference/messages/km0001b.md create mode 100644 developer/docs/help/reference/messages/km0001c.md create mode 100644 developer/docs/help/reference/messages/km0001d.md create mode 100644 developer/docs/help/reference/messages/km0001e.md create mode 100644 developer/docs/help/reference/messages/km0001f.md create mode 100644 developer/docs/help/reference/messages/km00020.md create mode 100644 developer/docs/help/reference/messages/km00021.md create mode 100644 developer/docs/help/reference/messages/km00022.md create mode 100644 developer/docs/help/reference/messages/km00023.md create mode 100644 developer/docs/help/reference/messages/km00024.md create mode 100644 developer/docs/help/reference/messages/km00025.md create mode 100644 developer/docs/help/reference/messages/km00026.md create mode 100644 developer/docs/help/reference/messages/km00027.md create mode 100644 developer/docs/help/reference/messages/km00028.md create mode 100644 developer/docs/help/reference/messages/km00030.md create mode 100644 developer/docs/help/reference/messages/km00f00.md create mode 100644 developer/docs/help/reference/messages/km00f01.md create mode 100644 developer/docs/help/reference/messages/km00f02.md create mode 100644 developer/docs/help/reference/messages/km00f03.md create mode 100644 developer/docs/help/reference/messages/km00f04.md create mode 100644 developer/docs/help/reference/messages/km01001.md create mode 100644 developer/docs/help/reference/messages/km01002.md create mode 100644 developer/docs/help/reference/messages/km01003.md create mode 100644 developer/docs/help/reference/messages/km01004.md create mode 100644 developer/docs/help/reference/messages/km01005.md create mode 100644 developer/docs/help/reference/messages/km01006.md create mode 100644 developer/docs/help/reference/messages/km01007.md create mode 100644 developer/docs/help/reference/messages/km02001.md create mode 100644 developer/docs/help/reference/messages/km02002.md create mode 100644 developer/docs/help/reference/messages/km02004.md create mode 100644 developer/docs/help/reference/messages/km02005.md create mode 100644 developer/docs/help/reference/messages/km02007.md create mode 100644 developer/docs/help/reference/messages/km02008.md create mode 100644 developer/docs/help/reference/messages/km02009.md create mode 100644 developer/docs/help/reference/messages/km0200a.md create mode 100644 developer/docs/help/reference/messages/km0200b.md create mode 100644 developer/docs/help/reference/messages/km0200c.md create mode 100644 developer/docs/help/reference/messages/km0200d.md create mode 100644 developer/docs/help/reference/messages/km0200e.md create mode 100644 developer/docs/help/reference/messages/km0200f.md create mode 100644 developer/docs/help/reference/messages/km02010.md create mode 100644 developer/docs/help/reference/messages/km02011.md create mode 100644 developer/docs/help/reference/messages/km02012.md create mode 100644 developer/docs/help/reference/messages/km02013.md create mode 100644 developer/docs/help/reference/messages/km02014.md create mode 100644 developer/docs/help/reference/messages/km02015.md create mode 100644 developer/docs/help/reference/messages/km02016.md create mode 100644 developer/docs/help/reference/messages/km02017.md create mode 100644 developer/docs/help/reference/messages/km02018.md create mode 100644 developer/docs/help/reference/messages/km02019.md create mode 100644 developer/docs/help/reference/messages/km0201a.md create mode 100644 developer/docs/help/reference/messages/km0201b.md create mode 100644 developer/docs/help/reference/messages/km0201c.md create mode 100644 developer/docs/help/reference/messages/km0201d.md create mode 100644 developer/docs/help/reference/messages/km0201e.md create mode 100644 developer/docs/help/reference/messages/km0201f.md create mode 100644 developer/docs/help/reference/messages/km02020.md create mode 100644 developer/docs/help/reference/messages/km02021.md create mode 100644 developer/docs/help/reference/messages/km02022.md create mode 100644 developer/docs/help/reference/messages/km02024.md create mode 100644 developer/docs/help/reference/messages/km02025.md create mode 100644 developer/docs/help/reference/messages/km02026.md create mode 100644 developer/docs/help/reference/messages/km02027.md create mode 100644 developer/docs/help/reference/messages/km02028.md create mode 100644 developer/docs/help/reference/messages/km02029.md create mode 100644 developer/docs/help/reference/messages/km0202a.md create mode 100644 developer/docs/help/reference/messages/km0202b.md create mode 100644 developer/docs/help/reference/messages/km0202c.md create mode 100644 developer/docs/help/reference/messages/km0202d.md create mode 100644 developer/docs/help/reference/messages/km0202e.md create mode 100644 developer/docs/help/reference/messages/km0202f.md create mode 100644 developer/docs/help/reference/messages/km02030.md create mode 100644 developer/docs/help/reference/messages/km02031.md create mode 100644 developer/docs/help/reference/messages/km02032.md create mode 100644 developer/docs/help/reference/messages/km02033.md create mode 100644 developer/docs/help/reference/messages/km02034.md create mode 100644 developer/docs/help/reference/messages/km02035.md create mode 100644 developer/docs/help/reference/messages/km02036.md create mode 100644 developer/docs/help/reference/messages/km02037.md create mode 100644 developer/docs/help/reference/messages/km02038.md create mode 100644 developer/docs/help/reference/messages/km02039.md create mode 100644 developer/docs/help/reference/messages/km0203a.md create mode 100644 developer/docs/help/reference/messages/km0203b.md create mode 100644 developer/docs/help/reference/messages/km0203c.md create mode 100644 developer/docs/help/reference/messages/km0203d.md create mode 100644 developer/docs/help/reference/messages/km0203e.md create mode 100644 developer/docs/help/reference/messages/km0203f.md create mode 100644 developer/docs/help/reference/messages/km02040.md create mode 100644 developer/docs/help/reference/messages/km02044.md create mode 100644 developer/docs/help/reference/messages/km02045.md create mode 100644 developer/docs/help/reference/messages/km02046.md create mode 100644 developer/docs/help/reference/messages/km02047.md create mode 100644 developer/docs/help/reference/messages/km02048.md create mode 100644 developer/docs/help/reference/messages/km02049.md create mode 100644 developer/docs/help/reference/messages/km0204a.md create mode 100644 developer/docs/help/reference/messages/km0204b.md create mode 100644 developer/docs/help/reference/messages/km0204c.md create mode 100644 developer/docs/help/reference/messages/km0204d.md create mode 100644 developer/docs/help/reference/messages/km0204e.md create mode 100644 developer/docs/help/reference/messages/km0204f.md create mode 100644 developer/docs/help/reference/messages/km02050.md create mode 100644 developer/docs/help/reference/messages/km02051.md create mode 100644 developer/docs/help/reference/messages/km02052.md create mode 100644 developer/docs/help/reference/messages/km02053.md create mode 100644 developer/docs/help/reference/messages/km02054.md create mode 100644 developer/docs/help/reference/messages/km02055.md create mode 100644 developer/docs/help/reference/messages/km02056.md create mode 100644 developer/docs/help/reference/messages/km02057.md create mode 100644 developer/docs/help/reference/messages/km02058.md create mode 100644 developer/docs/help/reference/messages/km02059.md create mode 100644 developer/docs/help/reference/messages/km0205a.md create mode 100644 developer/docs/help/reference/messages/km0205b.md create mode 100644 developer/docs/help/reference/messages/km0205c.md create mode 100644 developer/docs/help/reference/messages/km0205d.md create mode 100644 developer/docs/help/reference/messages/km0205e.md create mode 100644 developer/docs/help/reference/messages/km0205f.md create mode 100644 developer/docs/help/reference/messages/km02060.md create mode 100644 developer/docs/help/reference/messages/km02061.md create mode 100644 developer/docs/help/reference/messages/km02062.md create mode 100644 developer/docs/help/reference/messages/km02063.md create mode 100644 developer/docs/help/reference/messages/km02064.md create mode 100644 developer/docs/help/reference/messages/km02065.md create mode 100644 developer/docs/help/reference/messages/km02066.md create mode 100644 developer/docs/help/reference/messages/km02067.md create mode 100644 developer/docs/help/reference/messages/km02068.md create mode 100644 developer/docs/help/reference/messages/km02069.md create mode 100644 developer/docs/help/reference/messages/km0206a.md create mode 100644 developer/docs/help/reference/messages/km0206b.md create mode 100644 developer/docs/help/reference/messages/km0206c.md create mode 100644 developer/docs/help/reference/messages/km0206d.md create mode 100644 developer/docs/help/reference/messages/km0206e.md create mode 100644 developer/docs/help/reference/messages/km0206f.md create mode 100644 developer/docs/help/reference/messages/km02070.md create mode 100644 developer/docs/help/reference/messages/km02071.md create mode 100644 developer/docs/help/reference/messages/km02072.md create mode 100644 developer/docs/help/reference/messages/km02073.md create mode 100644 developer/docs/help/reference/messages/km02074.md create mode 100644 developer/docs/help/reference/messages/km02075.md create mode 100644 developer/docs/help/reference/messages/km02076.md create mode 100644 developer/docs/help/reference/messages/km02077.md create mode 100644 developer/docs/help/reference/messages/km02078.md create mode 100644 developer/docs/help/reference/messages/km02079.md create mode 100644 developer/docs/help/reference/messages/km02080.md create mode 100644 developer/docs/help/reference/messages/km02081.md create mode 100644 developer/docs/help/reference/messages/km02082.md create mode 100644 developer/docs/help/reference/messages/km02083.md create mode 100644 developer/docs/help/reference/messages/km02084.md create mode 100644 developer/docs/help/reference/messages/km02085.md create mode 100644 developer/docs/help/reference/messages/km02086.md create mode 100644 developer/docs/help/reference/messages/km02087.md create mode 100644 developer/docs/help/reference/messages/km02088.md create mode 100644 developer/docs/help/reference/messages/km02089.md create mode 100644 developer/docs/help/reference/messages/km0208a.md create mode 100644 developer/docs/help/reference/messages/km0208b.md create mode 100644 developer/docs/help/reference/messages/km0208c.md create mode 100644 developer/docs/help/reference/messages/km0208d.md create mode 100644 developer/docs/help/reference/messages/km0208e.md create mode 100644 developer/docs/help/reference/messages/km0208f.md create mode 100644 developer/docs/help/reference/messages/km02090.md create mode 100644 developer/docs/help/reference/messages/km02091.md create mode 100644 developer/docs/help/reference/messages/km02092.md create mode 100644 developer/docs/help/reference/messages/km02093.md create mode 100644 developer/docs/help/reference/messages/km02094.md create mode 100644 developer/docs/help/reference/messages/km02095.md create mode 100644 developer/docs/help/reference/messages/km02098.md create mode 100644 developer/docs/help/reference/messages/km02099.md create mode 100644 developer/docs/help/reference/messages/km0209a.md create mode 100644 developer/docs/help/reference/messages/km0209c.md create mode 100644 developer/docs/help/reference/messages/km0209d.md create mode 100644 developer/docs/help/reference/messages/km0209e.md create mode 100644 developer/docs/help/reference/messages/km0209f.md create mode 100644 developer/docs/help/reference/messages/km020a2.md create mode 100644 developer/docs/help/reference/messages/km020a3.md create mode 100644 developer/docs/help/reference/messages/km020a4.md create mode 100644 developer/docs/help/reference/messages/km020a5.md create mode 100644 developer/docs/help/reference/messages/km020a6.md create mode 100644 developer/docs/help/reference/messages/km020a8.md create mode 100644 developer/docs/help/reference/messages/km020a9.md create mode 100644 developer/docs/help/reference/messages/km020aa.md create mode 100644 developer/docs/help/reference/messages/km020ab.md create mode 100644 developer/docs/help/reference/messages/km020ac.md create mode 100644 developer/docs/help/reference/messages/km020ad.md create mode 100644 developer/docs/help/reference/messages/km020ae.md create mode 100644 developer/docs/help/reference/messages/km020af.md create mode 100644 developer/docs/help/reference/messages/km020c0.md create mode 100644 developer/docs/help/reference/messages/km020c1.md create mode 100644 developer/docs/help/reference/messages/km02900.md create mode 100644 developer/docs/help/reference/messages/km02901.md create mode 100644 developer/docs/help/reference/messages/km02903.md create mode 100644 developer/docs/help/reference/messages/km02904.md create mode 100644 developer/docs/help/reference/messages/km02905.md create mode 100644 developer/docs/help/reference/messages/km02906.md create mode 100644 developer/docs/help/reference/messages/km02907.md create mode 100644 developer/docs/help/reference/messages/km02908.md create mode 100644 developer/docs/help/reference/messages/km02909.md create mode 100644 developer/docs/help/reference/messages/km0290a.md create mode 100644 developer/docs/help/reference/messages/km0290b.md create mode 100644 developer/docs/help/reference/messages/km0290c.md create mode 100644 developer/docs/help/reference/messages/km03001.md create mode 100644 developer/docs/help/reference/messages/km03002.md create mode 100644 developer/docs/help/reference/messages/km03003.md create mode 100644 developer/docs/help/reference/messages/km03004.md create mode 100644 developer/docs/help/reference/messages/km03005.md create mode 100644 developer/docs/help/reference/messages/km03006.md create mode 100644 developer/docs/help/reference/messages/km03007.md create mode 100644 developer/docs/help/reference/messages/km03008.md create mode 100644 developer/docs/help/reference/messages/km03009.md create mode 100644 developer/docs/help/reference/messages/km0300a.md create mode 100644 developer/docs/help/reference/messages/km04001.md create mode 100644 developer/docs/help/reference/messages/km04002.md create mode 100644 developer/docs/help/reference/messages/km04003.md create mode 100644 developer/docs/help/reference/messages/km04004.md create mode 100644 developer/docs/help/reference/messages/km04005.md create mode 100644 developer/docs/help/reference/messages/km04006.md create mode 100644 developer/docs/help/reference/messages/km04007.md create mode 100644 developer/docs/help/reference/messages/km04008.md create mode 100644 developer/docs/help/reference/messages/km04009.md create mode 100644 developer/docs/help/reference/messages/km0400a.md create mode 100644 developer/docs/help/reference/messages/km0400b.md create mode 100644 developer/docs/help/reference/messages/km0400c.md create mode 100644 developer/docs/help/reference/messages/km0400d.md create mode 100644 developer/docs/help/reference/messages/km0400e.md create mode 100644 developer/docs/help/reference/messages/km0400f.md create mode 100644 developer/docs/help/reference/messages/km04010.md create mode 100644 developer/docs/help/reference/messages/km04011.md create mode 100644 developer/docs/help/reference/messages/km04012.md create mode 100644 developer/docs/help/reference/messages/km04014.md create mode 100644 developer/docs/help/reference/messages/km04015.md create mode 100644 developer/docs/help/reference/messages/km04016.md create mode 100644 developer/docs/help/reference/messages/km04017.md create mode 100644 developer/docs/help/reference/messages/km04018.md create mode 100644 developer/docs/help/reference/messages/km04019.md create mode 100644 developer/docs/help/reference/messages/km0401a.md create mode 100644 developer/docs/help/reference/messages/km0401b.md create mode 100644 developer/docs/help/reference/messages/km0401c.md create mode 100644 developer/docs/help/reference/messages/km0401d.md create mode 100644 developer/docs/help/reference/messages/km0401e.md create mode 100644 developer/docs/help/reference/messages/km0401f.md create mode 100644 developer/docs/help/reference/messages/km04020.md create mode 100644 developer/docs/help/reference/messages/km04021.md create mode 100644 developer/docs/help/reference/messages/km05001.md create mode 100644 developer/docs/help/reference/messages/km05002.md create mode 100644 developer/docs/help/reference/messages/km05003.md create mode 100644 developer/docs/help/reference/messages/km05004.md create mode 100644 developer/docs/help/reference/messages/km05005.md create mode 100644 developer/docs/help/reference/messages/km05006.md create mode 100644 developer/docs/help/reference/messages/km05007.md create mode 100644 developer/docs/help/reference/messages/km05008.md create mode 100644 developer/docs/help/reference/messages/km05009.md create mode 100644 developer/docs/help/reference/messages/km0500a.md create mode 100644 developer/docs/help/reference/messages/km0500b.md create mode 100644 developer/docs/help/reference/messages/km0500c.md create mode 100644 developer/docs/help/reference/messages/km0500d.md create mode 100644 developer/docs/help/reference/messages/km0500e.md create mode 100644 developer/docs/help/reference/messages/km0500f.md create mode 100644 developer/docs/help/reference/messages/km05010.md create mode 100644 developer/docs/help/reference/messages/km05011.md create mode 100644 developer/docs/help/reference/messages/km05012.md create mode 100644 developer/docs/help/reference/messages/km05013.md create mode 100644 developer/docs/help/reference/messages/km05014.md create mode 100644 developer/docs/help/reference/messages/km05015.md create mode 100644 developer/docs/help/reference/messages/km05016.md create mode 100644 developer/docs/help/reference/messages/km05017.md create mode 100644 developer/docs/help/reference/messages/km05018.md create mode 100644 developer/docs/help/reference/messages/km05019.md create mode 100644 developer/docs/help/reference/messages/km0501a.md create mode 100644 developer/docs/help/reference/messages/km0501b.md create mode 100644 developer/docs/help/reference/messages/km0501c.md create mode 100644 developer/docs/help/reference/messages/km0501d.md create mode 100644 developer/docs/help/reference/messages/km0501e.md create mode 100644 developer/docs/help/reference/messages/km06001.md create mode 100644 developer/docs/help/reference/messages/km06002.md create mode 100644 developer/docs/help/reference/messages/km07001.md create mode 100644 developer/docs/help/reference/messages/km07002.md create mode 100644 developer/docs/help/reference/messages/km07003.md create mode 100644 developer/docs/help/reference/messages/km07004.md create mode 100644 developer/docs/help/reference/messages/km07005.md create mode 100644 developer/docs/help/reference/messages/km08001.md create mode 100644 developer/docs/help/reference/messages/km08002.md create mode 100644 developer/docs/help/reference/messages/km08003.md create mode 100644 developer/docs/help/reference/messages/km08004.md create mode 100644 developer/docs/help/reference/messages/km08005.md create mode 100644 developer/docs/help/reference/messages/km08006.md create mode 100644 developer/docs/help/reference/messages/km08007.md create mode 100644 developer/docs/help/reference/messages/km08008.md create mode 100644 developer/docs/help/reference/messages/km08009.md create mode 100644 developer/docs/help/reference/messages/km0800a.md create mode 100644 developer/docs/help/reference/messages/km09001.md create mode 100644 developer/docs/help/reference/messages/km09002.md create mode 100644 developer/docs/help/reference/messages/km09005.md create mode 100644 developer/docs/help/reference/messages/km09006.md create mode 100644 developer/docs/help/reference/messages/km09007.md create mode 100644 developer/docs/help/reference/messages/km09008.md create mode 100644 developer/docs/help/reference/messages/km09009.md create mode 100644 developer/docs/help/reference/messages/km0900a.md create mode 100644 developer/docs/help/reference/messages/km0900e.md create mode 100644 developer/docs/help/reference/messages/km0900f.md create mode 100644 developer/docs/help/reference/messages/km09010.md create mode 100644 developer/docs/help/reference/messages/kmc-analyze.analyzermessages.md create mode 100644 developer/docs/help/reference/messages/kmc-keyboard-info.keyboardinfocompilermessages.md create mode 100644 developer/docs/help/reference/messages/kmc-kmn.kmncompilermessages.md create mode 100644 developer/docs/help/reference/messages/kmc-kmn.kmwcompilermessages.md create mode 100644 developer/docs/help/reference/messages/kmc-ldml.compilermessages.md create mode 100644 developer/docs/help/reference/messages/kmc-model-info.modelinfocompilermessages.md create mode 100644 developer/docs/help/reference/messages/kmc-model.modelcompilermessages.md create mode 100644 developer/docs/help/reference/messages/kmc-package.compilermessages.md create mode 100644 developer/docs/help/reference/messages/kmc.infrastructuremessages.md create mode 100644 developer/docs/help/reference/tools/index.md create mode 100644 developer/docs/help/reference/tools/setup.md create mode 100644 developer/docs/help/reference/user-settings.md create mode 100644 developer/docs/help/whats-new.md diff --git a/developer/docs/help/context/about-tike.md b/developer/docs/help/context/about-tike.md new file mode 100644 index 00000000000..550a5d7410f --- /dev/null +++ b/developer/docs/help/context/about-tike.md @@ -0,0 +1,8 @@ +--- +title: About Dialog +--- + +![About dialog](../images/ui/frmAboutTike.png) + +The About dialog displays copyright and registration information for +Keyman Developer, and has a link to the Keyman website. \ No newline at end of file diff --git a/developer/docs/help/context/character-map.md b/developer/docs/help/context/character-map.md new file mode 100644 index 00000000000..d300455a2b4 --- /dev/null +++ b/developer/docs/help/context/character-map.md @@ -0,0 +1,136 @@ +--- +title: Using the Character Map +--- + +![Character Map tool](../images/ui/frmCharacterMapNew.png) + +To display the Character Map: + +- Press Ctrl + Shift + c +- Select **View** → **Character Map** + +The Character Map will appear by default docked to the right hand side +of the IDE but can be undocked or re-docked on any side of the window. + +### Using the Character Map + +To insert a character: +1. Position the text cursor where you want to insert the character +2. Locate the desired character in the Character Map and insert it by: + - selecting the character and pressing the Enter key, or + - double-clicking on the character, or + - right-clicking on the character and selecting Insert Character. + + > ### Note + If the Insert Mode is set to Code or Name, pressing Enter or + double-clicking on the character will insert the Unicode code or + name of the character, not the character itself. These options are + most useful when writing or editing keyboard source files (.KMN). + +### Insert Modes + +There are three insert modes: Code, Character and Name: + +- Code: inserts the character's Unicode code +- Character: inserts the character itself +- Name: inserts the character's Unicode name + +To change the insert mode: + +1. Right-click on the Character Map. +2. Highlight the Insert Mode submenu. +3. Choose the desired mode from the Insert Mode submenu. + +### Character Map Options + +When you right click on the Character Map, the following menu options +are displayed: + +Insert Character +: Inserts the selected character at the cursor position in your + document. + +Filter... +: Displays the Filter dialog box. See [Filtering](#toc-filtering) below. + +Goto... +: Displays the Goto dialog box. See Using [Goto](#toc-goto) below. + +Font... +: Allows you to choose a different font for viewing the Character Map.
+ Note: This does not affect the font being used in your document! + +Insert Mode +: Allows you to select the character insert mode you want. See [Insert + Modes](#toc-insert-modes) above. + +Display Quality +: Allows you to select a different font display quality for the + Character Map. The options are:
+ - Plain: no font smoothing + - Antialiased: uses the Windows standard font smoothing + - ClearType: uses the Windows ClearType font smoothing method + +### Characters and Fonts + +When a character is not available in the selected font, the Character +Map will fall back to **Code2000**, **Code2001**, **Code2002**, **Arial Unicode MS** and +**Lucida Sans Unicode** fonts. If the character is not found in these +fallback fonts, the Character Map will use font linking to attempt to +find a character from other fonts installed on the system, and as a last +resort, will show a square box if no suitable font can be found. + +If a character is not displayed from other than the selected font, it +will be shown in blue instead of black. + +### Filtering + +![Character Map Filter dialog](../images/ui/frmCharacterMapFilter.png) + +The Character Map can be filtered by Unicode character name or character +range. Filters can be entered in the Filter By field at the bottom of +the Character Map; a quick reference user interface dialog to help you +edit the filter is available by clicking the \[...\] button. + +When no filter is applied, the Character Map will show all characters +from the Unicode 8.0 standard. + +All filter strings are case insensitive. Character names use the letters +`A-Z`, numerals `0-9`, and punctuation underscore (`_`) and hyphen +(`-`). + +Spaces between words in the filter are represented either by underscore +(`_`) or space (` `) and can be used interchangeably. + +A filter can be for a range or on the Unicode Character Name. + +The filter format for a range is: `[U+]XXXX-[U+]YYYY`, where `U+` is +optional, `XXXX` is the starting Unicode value and `YYYY` is the +finishing Unicode value. + +The filtering options for Unicode Character Names are: + +### Examples + +| | | +|--------------------------|-------------------------| +| Filter | Result | +| `LATIN CAPITAL LETTER A` | Finds all Latin capital A variations | +| `LATIN * LETTER A` | finds all Latin capital and lower case A variations | +| `LATIN * LETTER [AEIOU]` | finds all Latin A,E,I,O or U vowel combinations | +| `LAO` | finds all characters with names starting in "LAO" in the current font | +| `YI_` | finds all characters with names starting in "YI " - you must use `_` (underscore) and not `( )` space at the end of a search string.
Note that without the `_`, this search also matches YIN_YANG. | +| `LATIN * LETTER A$` | finds only "a" and "A" | +| `1000-119F` | finds all characters between U+1000 and U+119F (inclusive) - the Myanmar alphabet in this case | + +### Goto + +The Goto tool can be used to move directly to a specific Unicode +character or value. + +1. Right click on a character and select Goto. The **Enter Unicode character value or name** dialog box will be displayed. +2. Enter the Unicode character value - e.g. `006B` or `U+006B` OR enter the start of the character name, e.g. `LAO_LETTER` will go + to **LAO_LETTER_KO**, being the first character that matches. You + can substitute spaces for underscores if you prefer. +3. Click OK. The character map will attempt to move to the character you specified. diff --git a/developer/docs/help/context/debug.md b/developer/docs/help/context/debug.md new file mode 100644 index 00000000000..07c3bb9e143 --- /dev/null +++ b/developer/docs/help/context/debug.md @@ -0,0 +1,165 @@ +--- +title: Debug Window +--- + +![Debug window - Debug State](../images/ui/frmKeymanWizard_Debug_State.png) + +The debug window is shown at the bottom of the keyboard editor when +debugging the keyboard. There are several user interface areas: The +debugger input window, the debugger status window, a debugger toolbar +(usually docked under the menu), and the status bar will show the +current debugger status. + +## Debugger input window + +![Debug window - Debug State](../images/ui/frmDebug.png) + +The debugger input window is used for typing input to test the keyboard. +In the top half of this window, input you type while testing your +keyboard will be displayed, exactly the same as in use, with one +exception: deadkeys will be shown visually with an +![OBJ](../images//ui/obj.gif) symbol. + +The lower half of the window shows a grid of the characters to the +virtual left of the insertion point, or the selected characters if you +make a selection. Deadkeys will be identified in the grid. The grid will +show characters in right-to-left scripts in backing store order, from +left to right. If there are more characters in your text than can fit on +the screen, then only those that fit will be shown in the grid. + +## Debug controls + +The debug menu and debug toolbar control the debugger. + +![Debug toolbar](../images/ui/Debug_Toolbar.png) + +![Debug menu](../images/ui/Debug_Menu.png) + +Set/Clear breakpoint +: A breakpoint can be put on a line of code to ask Keyman Developer to + stop and show what is happening in the keyboard layout when that + line is reached. Typically, you would put a breakpoint on a + particular rule, so you could debug an unexpected behaviour on that + rule. + +Start Debugging +: Starts the debugger + +Stop Debugger +: Stops the current debug session + +Single Step Mode +: When this option is active, you will step through every group and + rule that your keyboard applies when a keystroke is pressed. The + Step Forward and Run controls are only relevant in Single Step Mode. + +Step Forward +: Move to the next step in your keyboard code. + +Run +: Stop processing the current keystroke event in single step mode + (unless a breakpoint is hit). The next keystroke event will drop + into single step mode again. + +Pause +: Use the Pause button or press Shift + Esc to pause the debugger. When + the debugger is paused, it will not accept any input, and ordinary shortcut keys (Shift + F5, Alt + Tab, etc.) will function as usual. Press Pause again to resume debugging. + + + +## Debug State box + +The debug state box shows the internal state of the keyboard +interpreter. + +### State + +![Debug window - Debug State](../images/ui/frmKeymanWizard_Debug_State.png) + +This window shows the current keystroke state, and the sequence of +keystrokes that were typed to arrive at this state. Clearing the text in +the debug window will also clear the keystroke log; as will pressing the +Restart button. + +The Restart button is disabled while stepping through an event. + +### Elements + +![Debug window - Debug Elements](../images/ui/frmKeymanWizard_Debug_Elements.png) + +This shows the elements that make up rule currently being processed: the +context, the key, and also what the output will be. If the rule uses +stores, the contents of the store will be shown in the right-hand +column, with the matched letter in red. + +### Call Stack + +![Debug window - Debug Call stack](../images/ui/frmKeymanWizard_Debug_CallStack.png) + +Here all the lines that have been processed to this point are shown in a +list. You can double-click on any entry in the list to display the line +in the keyboard source. + +### Deadkeys + +![Debug window - Debug Deadkeys](../images/ui/frmKeymanWizard_Debug_Deadkeys.png) + +This lists all the deadkeys that are currently in the context. You can +select one from the list to see it highlighted in the debug input box. +This information can also be seen in the character grid in the lower +half of the debugger input window. + +### Regression Testing + +![Debug window - Debug Regression Test](../images/ui/frmKeymanWizard_Debug_RegressionTest.png) + +The idea in regression testing is to record a sequence of keystrokes and +the output the keyboard produced, in order to test for the same +behaviour when you make changes to the keyboard. + +Use Start Log/Stop Log to record the input and output. You can then use +Start Test to run the test again, or go the Options menu to clear the log, +or save or load a test, or use the batch mode to run several tests in a +row. + +If the output produced while running a test is different to that stored +when recording it, Keyman will halt the test on the line where the +failure occurred, and activate Single Step mode. + +### Status bar + +The input status is shown in the second pane of the status bar. It can +show one of the following messages: + +Ready for input +: The debugger is waiting for more input + +Focused for input +: The debugger is waiting for more input, and the Debug Input window + is active + +Paused +: The debugger is paused + +Receiving events +: The debugger is processing input + +Debugging +: The debugger is active during Single Step mode or after a breakpoint + +## Test mode + +Enter test mode by clicking the **Test Mode** +button on the debugger toolbar. + +The test mode lets you test your keyboard without the debugger being +active. This lets you test functionality that is not available within +the debugger - primarily [IMX code](../guides/develop/imx/). + +Once in test mode, no debugger controls are available. + +You can see the character codes for the current or selected characters +in the status bar, which can be useful when debugging your keyboard. diff --git a/developer/docs/help/context/edit-language-example.md b/developer/docs/help/context/edit-language-example.md new file mode 100644 index 00000000000..0a2307bf027 --- /dev/null +++ b/developer/docs/help/context/edit-language-example.md @@ -0,0 +1,44 @@ +--- +title: Add/Edit Language Example Dialog +--- + +![Add/Edit Language Example dialog](../images/ui/frmEditLanguageExample.png) + +This dialog allows you to create or edit example key sequences to demonstrate +how to use your keyboard. Examples should be relatively short -- one to five +words is ideal, but if possible, should demonstrate sequences that may be hard +for users to discover on their own. + +These language examples can be seen live, for example, on +[keymanweb.com](https://keymanweb.com). + +## Language tag + +Enter the BCP 47 language tag that this example corresponds to. It should be a +language tag that is listed in the package file. + +## Key sequence + +This is a space separated list of keys. For spacebar, use `space`. For modifier +key combinations, use the modifier key(s) followed by `+` and the key that they +are pressed together with, e.g. `right-alt+shift+A`. + +* modifiers indicated with "+" +* spacebar is "space" +* plus key is "shift+=" or "plus" on US English (all other punctuation as per + key cap). +* Hardware modifiers are: "shift", "ctrl", "alt", "left-ctrl", "right-ctrl", + "left-alt", "right-alt" +* Key caps should generally be their character for desktop (Latin script case + insensitive), or the actual key cap for touch +* Caps Lock should be indicated with "caps-on", "caps-off" + +## Expected text + +Here, put the actual output generated by the key sequence. + +## Note + +You may include a translation of the text or another note that highlights an +aspect of how the text is typed. + diff --git a/developer/docs/help/context/editor.md b/developer/docs/help/context/editor.md new file mode 100644 index 00000000000..79e98806c5c --- /dev/null +++ b/developer/docs/help/context/editor.md @@ -0,0 +1,23 @@ +--- +title: Editor Window +--- + +Editor windows in Keyman Developer supports standard Windows editing +keystrokes. Many file formats, including .kmn, .kps, .xml, .html, .js +and .json, support syntax highlighting. The text editor in Keyman uses +the Monaco component from Visual Studio Code, so all the functionality +available in that editor is also available here. + +## Special Functionality + +Aside from standard Windows keys, the following keystrokes are defined +for the editor: + +| Keystroke | Action | +|----------------|---------------| +| Ctrl + Shift + M | Toggle Message Window visibility | +| Ctrl + Shift + C | Open Character Map | +| Ctrl + Shift + I | Toggle Character Identifier visibility | +| Ctrl + F | Find text | +| Ctrl + H | Replace text | +| Ctrl + Shift + U | Convert the selection to/from characters to code values| \ No newline at end of file diff --git a/developer/docs/help/context/images/banner.png b/developer/docs/help/context/images/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..b141413e345256b8c6b2a715dc60907d658ac6f4 GIT binary patch literal 3979 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 Uab7FU+YiC$mZ^T#P3Nfp0l03s5&!@I literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/character-grid.png b/developer/docs/help/context/images/character-grid.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe78ceca3345166193cd26791fef8078250642e GIT binary patch literal 2313 zcmZvdeK?c*AII-`T1UB)iqaWY#^t%o$-xqnDU(K#M)J^{mQ;o@@-!`J`<>qplW9tX zGnSEL$<>rlk%x&orO?R3W|BPQA-aF}&iUi~@%!D^b>H95_xt(Y@9XpVd_S-2%km)} z)Y8<~1OPyb;DJ910BRs?JFZiOzv;VqGJAgGH)Atg!BEFm4k&gfJK zCg5!pdYwWbWRrM8bP^m7ySe!*oxW&kxf(_masw%oo$L$@TR>(DSZ3S~Nf=8)3KXKr zuqG_UrYEt(;Ea+eTpm09621s7!cSC>fLH(kTa+*2MN~yN03dk;ysKYA@aMuv`uhXg zS0YqwuWw`ielOa$ug=ay^r?&(8`;Z0-}}80f?m*0$J6@r;{R}%Mn-;|7-ei|X=-n*s;u=^PxU!v1Oq5JJ5ypZ#C-gEw!!U$jUXO z3|w_;Uoy&l)J$4}fno5B%*jPZe47B2^| zKn?<>#sG0aIHZ_+{an_vt#npp7x6_i*m;Lcdz(2Ivnyz zvF}*Q%^|oLgC)VpMw_fZn36-+qBXv$WP!TKl_m3G=awF2GzAva6#iI$;|abU2`w-q zH~M;Rnp=BWWApHfTP|p-jRj6Nmomq4{3b@4eyO=TAF;i^5o>h2&DizRbzQcM$tvx0G5o1K+p3tYC_m+)4*)1(qB?aJ51kr1iF_p9eKswk zsW;v7xWCf-S|Oc{V1j{`7;8}HsH+FEimS6QI<(4zI-Bh*F(w0Pd#o{h9e)it?-GAx zN9n}dS19q)$Zv~uL($}GbN1v=s{dvFEaw*^HKTRmEeMEd-lOojh#Y{-&esRi5n^p zUa6c6U3!ojyLn>|0syz7+Tyl$-NGcd`!`&$h`LC+GkQ3tZAY1LJ8zP4s&gC@aP>x6 z#j@q8M11^i!o0wVz*lXk9%1BmF4=pEkK{}{bMoZWJ%zlFHedM|Ayd@4DPWyxPNVnq zlvn&Rg-DBh;CYYJ78iEE>hONTe2LF?C0x~@Zd7Xa`!9vi($Z{6{VL1C&-zZm@!9d^ zoM}q@J*O1R)}qfTe6$_Gi|uqO@#PLP+kCx$*}LRMv5oIAX;Go^CIv1#?$#$*j4gEJ z9OJjtKapkRBTa*P`nIdf`D}fTDPi%QZmwx^WVLwGWSHV%_2H9`&d}4mU?RuXrT8-3 zI2ANxW1b+~oV;TCs5Ek8ww&=iS`c(6?s53b$#Y*ToxDcTM2=ps#>}q7)`nLI%y8ir z`%HIEa&57@hlqHPc4$}KzO$6KVdXmu#RfOpn@8(oFcgB!G4&#qLP_a0ZP32JxwaQL zuPr8!kf-yH{cuvE=#28=#n?dK4gKn{wU4mU=pwvpRg*8h*5~jD4cP#`)7=yBP)r&l z{ETYjPL6v{Iiskt)SWGR<5q}Q3HwFeYb`~7Oi>IT%l1C9;hlfDiw?pYx$qwc4xT^G5#t5pzO3Cbnwx+?o}U@}oA_qw2=07QtjOVd#iM zhKnsw*z_jd@>^fftrzlV2+5+T(#D)8+2$mEv~=Taq4y4-;l5q`_jY9kWhKmiTbg+2 zJf7L>K2GpM4rF^%PM3{mr0HkN{r_C5wLRIV`nsVb7^w*VQWOw<3FqdeBf8?`UjL1! zo{QJK)l&cBsc}q(gQxA99u_DpeUD0LN5;E!p{+QhgX#G~j_NA!}pLxunV literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/config.png b/developer/docs/help/context/images/config.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8a37103158f012c39db7a21c1a5a8b9483423a GIT binary patch literal 18610 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/device-menu.png b/developer/docs/help/context/images/device-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..0c50b2e59af0a0983112854e201c1f1dd1f757d9 GIT binary patch literal 12996 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

w~B4Ihey z$d#Ag%RHIVMt9!cTm6SYDl*lJrdj=r`DrOL?!DgULS)9 z?u1FOG!i?sMOdmUP>eAukj$c<{Zz36iO2INVvQMM zVk96h(QD$*>9e#EiThw_R|@4cj3k+7P%qb$QcwHwu6e%ob9mg~$X*VfO3O`;qLH&; zfmy38mg?oo2Z5TX%~1bU&hwo~2v;_Ktuk$HukvHw+dmILG3tHHwv5n7^Tw_BMC|*J zNy_Q)Pi}OqyYWz*%CfkxID>|;L#Va^QhGv9T=7G_;*BJ?#L{zZA~{f%e9e|KqH?@V zA5^B2irJ-m`adORv#%db!tBO20Ht{fH_3=v`9afFD?LL-WjAuC&R7%DfcaW)E&mKS zVJ76u{dzwpS=ekqSz2MBnDvt$s5(%&!-MHKwKZIY_iDpBNcCrrq4Cw7w?xvYb9BZl0Z$+ZharulWgSJ{!F;2+*R_7uEhbX%)#TYGaShzKE^j^ELl5i5e+L3Qml{pQ9VO@76W&_{}AtCo9uu{%X7H?EZ)6E{P&+8#g-RcjPoe8)te+vl1G zfejS$Iinn0kgyhr)iij;5D{Z5W&ZR7nVZs=zKygS&0*74yv%PVTa%JdtD7jB;)zZP zvH%4ZJwPTvyzr(t9C?(iV6&Lewh2*C9OHF8@9yQt0BnuX2;+=6Mc6wUsUzmv)w$;lHe-q;#lQNzPu`7FyoUPlFl&?%O6B=M%(io*1~pF zcB)lItcU$jV-4724r_dn$%wHjtPv*ob$xo=dYw#{bqLwA7C>oeQ;r?|8q0W9 zafPR5zua+lR=3B&V&BJ52%n1*JsyWT6wRE+_jRt_kDq83tEIJ3>_BlNn>^K-tn#`L z>AC%>z&3rd3R{J+MBrUZ6xS#4PQ4F5ygWtHt)ruYiTd~b83XI2R!d`4h9=7)s1xA4#AKh1PVx{+0A_WOsWZ=H})C z)$@GBPuE(xs`Xlf$HqR#SH`Zlx*nh@<}nP_J+p0{p0d~;tDO_S250d(?i|fmv^ej= z*>US$WSMslrd6#ftFZtSdfRz@+WQ74Q0>>&8k1s}>?2;g4K8u34O-XsJanNhPqRkK zD7=IYQMFA+sXBef1R5U-E@HFm0fW1k8rLU}piG(7CR;jN_df7_qAM!Gt%KKXW9!nz zD;USW0+kXs*gc3TYHq%&ie5b64L4O2s3{iLUYYy{AOh{1R0d&48cOFZkrfw#c0v!vuuGU9|sC4 z%}zqap4q4S$!@{)>u9Bgs3b}&P?7hez%ufUe{M^D(6iiuD#uLku-oSQZk8gQ(O8Nd zn~#llUvN*M^}nIM$yz_$@fH4tmm%K>5A)*R-E_`9`Bn>9aobXnKRt|=eEY`qiD3r{ zER44GZ1_q_D01o`5lf@>W*9ga$_39(9ylK_n+*+ydM0;$6KE$BSMz%R=Lv+Yq#~eN I+$i|p0Q&C##sB~S literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/hamburger-menu.png b/developer/docs/help/context/images/hamburger-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..d014314192a3a99e3663ffdb8a765a04766d744b GIT binary patch literal 19545 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/keyboard-menu.png b/developer/docs/help/context/images/keyboard-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..cb15d6d34693e0e14e90e63ba33989dc068f831c GIT binary patch literal 12017 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/lexical-model-test.png b/developer/docs/help/context/images/lexical-model-test.png new file mode 100644 index 0000000000000000000000000000000000000000..4b434fc568fdda271cd73f4ed6ade260863d4379 GIT binary patch literal 82376 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 O&kGr4=}JkXp#K5&%Y?xI literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/model-menu.png b/developer/docs/help/context/images/model-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..4572b234f6a0b8dcca914cc6a0ee7199d1c30f06 GIT binary patch literal 5224 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 aY*cGeTXb#F_utz=EHxD^Ww@fn+kXL?rVaT3 literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/on-screen-keyboard.png b/developer/docs/help/context/images/on-screen-keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..4aaf2aef5209f9dd7f7c7e304905df20178676af GIT binary patch literal 38893 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%0Ai)L_FY%chk+Z7(e? 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 Z{|A^Pob#t;7m@$~002ovPDHLkV1fh1g);yE literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/server-iphone.png b/developer/docs/help/context/images/server-iphone.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ce6589034b2738e989b01de144f0d26b5ad8dc GIT binary patch literal 83389 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 Ny0Vs170fd1{{UyaF;xHn literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/status-bar.png b/developer/docs/help/context/images/status-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..7439322aab5386130d7c5e74a3230867d67d7795 GIT binary patch literal 1776 zcmVPx#1ZP1_K>z@;j|==^1poj6tx!xlbu;NRch>+9?4>gxFT`2PO> z`T6;PfPl}>&reTJ4h{|+92^xD6(ArW@9*!xz`&4@kN^MxaBy%?P*5;1Fh4&(I5;>M z7#J!lDxaU9KtMqM|Ldt^DPgSZzrVi@CODs_tGmF(wYRvnwY8?ErY?2~OD88M|ICUZC1onR>3)^78Vwwzk5^%^gc` z8yg!BZHNH8@&}Z?>a1rWB`G0etm^;&Gcz;U(v!^0%)H2<$jidkqL_oR)aK^q6IyN; zMpQvTLAklPH#ax`=d58RXX4`G+S=Oa=;+ha)9LByh0On9tk3`d&xIu^Atj2<=d58R zDb37^2b8=Gcb3in|EcHC*x1+bIEVI_)TV`m{_XScVvudlD8qob**sm+Os z^Yil?GddYOM}>*c4Gj%uW@c7aR#Q_`h0M>@)zuYIe*;X18gR4#SDOk=f*&6rFg`*p zNl`CEN-Qia4-XG7FE4LzZ%Ii>VTsRQUtb3Y2MP)b`uh6p?CgS6#0UTY010qNS#tmY z4#NNd4#NS*Z>VGd00hiQL_t(|UhSOwf74VLhr2H90&Fm>n&NC1ROW4Sm2Ns^9jn4n z*@Uu4XE!GzQ;-RAk$L5!;1&L6-uFExX&QSu9Ye_SeLf?3bIwVANZzOCLYo8t00000 z00000001$fBiU&I03t?bvO_CeWm{Kwj}8FleojTB1dJn*3WoKW%V%Kh60$LN&7dCG)1ACrIF}t6B zM)uF{L0@Bn-JeeH?c0@3KbO)apf$!e4?Z7eP*r5ILpA${V{@+ZP(}hDdHqR7^_uhxi4KTO)@R8XnM?d)RFl;u!NqwYjKBkUm zVY3lp^ITzm&bOJFA(Jy%+Q8dJ#;~X63x)Z5HYZ9a55VU7w9z*& zxSzNS3#ZDoam%L`YWn7Uagp|U83tvtpJt22#mW+GxB->&lqWx)FZ!lZ8CT|(KU-0) zxb-+aBkyYTk@oT#Wpia|k&=nhg9@lvkG)GL zzoZo61mjeSZo)hiZP@IdbywZ9yjgWA4%$3JH#Uoa0c+B-%Cwm*2W*yGDmRz!w{)+fC*Ro8IZ~60!Z(;JWu1}( zc}y(6cQt-wYAbCbi*NI!I)=?=G`6|2M0qC3L?xoG%Ci-Uq%Yt!ROu5t+Uc9!)m8O# z4Gsc*^Lg=2Bo5e2H&=w^Wk?EDf=FQ*m$6`a9y)HRubDnOt zRMxRsT@5zJ8|j;gIwNhSnaz?)@uUr#<-evbtgWqGkSH+H&heDEfzAGyCt$N*S+$uT z6OYxstEtm?3!CGJq0N#>)jZ?W^V`Ibc5VK4czF1tM8Q=s7O;WMvXYg!bS7xCwBS`S z-{#T^m3XUQqO)2BqjMr}v&+L7vbpy=0ydjrPhFm8t~9q zy!JhFeSLlXx0yfLE`3I`>ZI+TDYT{juZC6vI$lENReY52s z)gCq*(PT}V@oko=G#~gjODe^4+H7ufVsN4sE%Rm)6n=}~qz*Da{rt@It z8+wya$9)|D03ycy@H=?%23`Q7NS!zE;_dhVM3Q=M#|Hoa00000002OUMB)LreS}3g SRN|We0000w3Y-x+t|8LTWuZMo)CMKL2C)I zCT3KkXjO++)!3C%w3y5^=2z2B=uoQWYtH%gkKdfR=e&FGyZ3WH=iPViJ1>pw=Af#q ztqcHwsw0U&1pqlD=!fn23e+Eo?r6}+MN%DXfyP0dMR22V9`A|=fTnDfPfQ57=aXG% z#Qy$%nN0Tn{d<{!3C1w&A=$RKZ2_i0HpIpN7%(jR+hb!e%2WFRdd z*w$bcgbNrpI_)5#(j}5tBmk&&Z7(?l%IO*aC{i5>cv`IQ5}gx0je%tvO{L8q+xdN( zM~!cRa6pf-`s(x6ShNMuN9Aef>)vb5jL$-;EBKvJa0?(GS6bVvFo8rx9E2x|6{}+& z??|UB5Y1DNn)qB!c`wnBNc1YOOMLrCy3$`-TDjMGR4Bh#+%APDo^XezK5MY&M|E^6 z$WSJOLyBV@_lTfW$@ng9DIK1nYXstyNmPC$z(aFp40_5d)SduRDrXYl-ti% zG7>*#`P~^;bXMnkpHX=d*`#{9=lMBLYtwXEfQL^8(Q0PRHMPW22cavNfUCnp-^=6vM}Fw$#^Xo&Lp4 z91*#(SyB>Hcz$#yL{w5yW)Xnvm7zb zj-2Y20xW7l`RRank?+Iggw^hB`UcC*nl|g2L(CPh7`=8(Cyns{}Ud5A}FTo0QHt<=!DkS7}TPdPaW$Vj=~)nubhR&!AHr$KKIvP$xCe?8O<{mqYdsYp`-E_NR)HH@|*g;&VAdLV`T zs~^e@0vXp5+eB?wMI{HhNIPGgctWb~%*adZaWlrk!0B42T*?2xIU`HD_|igs2LW#z z@MZkS5^yxt;cXyVLNUN`FMbYONZNuG5!HV-=Vs$aj7}c14{Irss+03mq6SozKTOD* zJfBuEC_S{H{t}tSbyP^&%6Y>%?B}wws0f+$KJdi0LSr&XK^0v>(ofwz_ZlamJm%}; zBk5OM280lFKB*aDU^R7_%xS%Cnb#iE%V&}KfY|kZlenCVv@eW$`YqMKBt8wDo^&fb z0kfJVgs9pzFF~tF(K-gX?adv8>igBXRc+npihWe_fDGkba6Rcp z>upt&xKVZw(*ehR)xh5GCo4c|uix*eg6`csfT>0iE!$Dp+fwLA2``9c%)2}}vXj?& z-@H%KI3BBpUB?GeuFU-Vv0C9%tJw}5PombpV0w8Z+sxy4)Jd-`rP-gyI5TBS{LDep zj%ly2G7$-Q3FUd|^|Nu@W^D7xaK+HFKpP^g%k_l!uN;5t^!iW3*|gta*v1+X4!fDx zTf;s=%!s+Nu4iZ$VqbId>>8ICw`%P^Yxeur+`WosCv=~h$oGzuSvcvjS>0=y*8(>~ zbeTig3^snU)ABIql;Oz7GGQ_AZeY*`5+?o4!n)Pl&$?>Gy&n;g|DHbBZGPC%nqB+vX*Z?#H;o(cq<7(_`uHKutK7+xa?5>^wVKwYL`;5#=F~%B`W1Q%a=YmpqsEr z=WiPJk!XxjG z&Drpile8D-J>1~ptT7Dj=bN>RQ++WUJ-E$L%NdhnMv)rH$+e5~#N-N0x3f6dUA&IF zdc7sT%4~P0%bR#s{`ltK_Lxy3^ literal 0 HcmV?d00001 diff --git a/developer/docs/help/context/images/taskbar.png b/developer/docs/help/context/images/taskbar.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4611fe2e3ed7ba110de92497bcbb02aacbc59c GIT binary patch literal 15323 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 + Tab). You can then +insert the virtual key code into the last active edit window at the +current cursor position. + +Press +Ctrl / Shift / Alt +and the key you wish to discover. You can see the virtual key codes for +left and right Ctrl / Alt combinations by checking the "Distinguish between left and right ctrl/alt" checkbox. + +To close the dialog, click the Close button or press +Shift + Esc. + +Press Shift + Enter to insert the current virtual key code into your source at the insertion point. \ No newline at end of file diff --git a/developer/docs/help/context/keyboard-editor.md b/developer/docs/help/context/keyboard-editor.md new file mode 100644 index 00000000000..ef43a9b4e87 --- /dev/null +++ b/developer/docs/help/context/keyboard-editor.md @@ -0,0 +1,632 @@ +--- +title: Keyboard Editor +--- + +The keyboard editor is the heart of Keyman Developer. This window allows +you to edit all aspects of a keyboard layout, from the visual layout of +the keyboard, to logic rules, to touch interactions, and more. + +The editor is divided into multiple tabs. Initially, only three tabs +will be visible: Details, Layout, and Build. A keyboard can have +multiple source files, which are all managed within this one editor. + +The following image shows the first tab of the editor, the Details tab, +for a brand new keyboard, with those three initial tabs. + +![Keyboard Editor - New file, Details tab](../images/ui/frmKeymanWizard_New.png) + +> ### Note +Users of earlier versions of Keyman Developer may initially have trouble +finding tabs such as the Icon tab or the On-Screen tab, as they are not +initially visible. The Features grid on the Details tab allows you to +add these extra features into the keyboard. + +## Keyboard component files + +A keyboard contains multiple source files. The following table lists the +file types and which tabs are used to edit them. The filenames shown are +defaults and can be modified, by editing the corresponding line in the +source file (and renaming the file). However, where possible the default +names should be used. + +| File type | Tabs | Feature | Store name | Description | +|-------------------|-----------------|--------------------|----------------------|------------------------| +| `file.kmn` | Details, Layout | | The primary keyboard source file. Required. | | +| `file.kvks` | On-Screen | Desktop On-Screen Keyboard | [`&visualkeyboard`](/developer/language/reference/visualkeyboard) | The visual presentation of the keyboard for desktop computers. | +| `file.ico`, `file.bmp` | Icon | Icon | [`&bitmap`](/developer/language/reference/bitmap) | An icon that represents the keyboard in the user interface on desktop computers. | +| `file.keyman-touch-layout` | Touch Layout | Touch-Optimised Keyboard | [`&layoutfile`](/developer/language/reference/layoutfile) | The touch layout visual description file | +| `file-code.js` | Embedded JS | Embedded Javascript | [`&kmw_embedjs`](/developer/language/reference/kmw_embedjs) | Additional Javascript code for [IMX](../guides/develop/imx) functionality | +| `file.css` | Embedded CSS | Embedded CSS | [`&kmw_embedcss`](/developer/language/reference/kmw_embedcss) | Additional CSS stylesheet for custom touch and web layout styling | +| `file-help.htm` | Web Help | Web Help | [`&kmw_helpfile`](/developer/language/reference/kmw_helpfile) | HTML file that replaces the On Screen Keyboard on desktop web layouts | +| `file-codes.txt` | Include Codes | Include Codes | [`&includecodes`](/developer/language/reference/includecodes) | Code dictionary for use with [named constants](/developer/language/guide/constants) | + +Three tabs include both visual and code editors: the Layout, Touch +Layout and JSON Metadata tabs. Changes to one view will be immediately +reflected in the other view. The code in the Layout tab is important +because that reflects both the Details and the Layout tab. + +## Details tab + +![Keyboard Editor - Details tab](../images/ui/frmKeymanWizard_Details.png) + +The Details tab grows as you add more options to a keyboard. The fields +here are: + +Name +: The name of the keyboard, corresponding to the [`&name` store](/developer/language/reference/name). + +Targets +: The intended target devices and operating systems, corresponding to + the [`&targets` store](/developer/language/reference/targets). + Changing the targets will hide or show parts of the Details and + Compile tabs. If no targets are selected, Keyman Developer will + treat the keyboard as a Windows-only keyboard, for backward + compatibility reasons. + +Copyright +: Enter the details of the copyright owner for the keyboard. + [`©right` store](/developer/language/reference/copyright). + +Message +: Enter a message that will be shown at install time for the keyboard + (on Windows, macOS). [`&message` store](/developer/language/reference/message). + +Keyboard is right-to-left +: Check this box to indicate that the keyboard is a right-to-left + keyboard, for web and touch layouts. [`&kmw_rtl` store](/developer/language/reference/kmw_rtl). + +Web Help Text +: A single line of text, with basic HTML allowed, shown at the bottom + of the desktop web On Screen Keyboard. [`&kmw_helptext` store](/developer/language/reference/kmw_helptext). + +Keyboard version +: The version of the keyboard. Read the reference documentation for + [`&keyboardversion` store](/developer/language/reference/keyboardversion) to understand + the legal values for this field. This is not the same as the + [`&version` store](/developer/language/reference/version), which + controls the Keyman (and Keyman Developer) version for which a + keyboard is designed. + +Comments +: This field corresponds to the first lines of comments in the + keyboard source, and is visible only to the keyboard designer. + +Features +: The Features grid controls which additional file components are + included in the keyboard, as listed in the Component Files section + above. Each of the features relates to a system store. Adding a + feature will add an extra tab to the editor, and add the + corresponding store to the keyboard source. Removing a feature will + not delete the component file, but will just remove the store from + the keyboard source. + +## Layout tab + +![Keyboard Editor - Layout tab, Design view](../images/ui/frmKeymanWizard_Layout_Design.png) + +The Layout tab gives you a simple interface to quickly create a keyboard +using a visual representation of a desktop/laptop computer keyboard. You +can drag and drop characters from the character map to create keyboard +layouts. You cannot access most of Keyman's more powerful features from +the Layout Design view, but it will be useful to get you started on your +design. + +Each key can have zero or more characters assigned to it. Each key can +be assigned a different set of characters for each shift state. You can +change the shift state by clicking on the Shift, Ctrl, and Alt keys. + +There are two ways to assign characters to the keys: + +- Click on a key, and then type the character's code into the Unicode + Character Value(s) field, or the type/paste the character itself + into the Output character(s) field. +- Select the character from the Character Map and drag and drop it + onto the appropriate key. This will set the key to output that + character. + +> ### Hint + To add the character to a key with existing characters, hold +Ctrl while dropping it onto the key. + + +> ### Note + Any key that does not have a character assigned to it will output what the selected Windows layout specifies. + +Distinguish between left and right Ctrl/Alt +: A Keyman keyboard can treat left and right Ctrl and Alt identically, + or it can distinguish between them. The Design view allows one or + the other mode (in Code view, you can use both interchangeably). + +Display 102nd Key (as on European keyboards) +: European keyboards have one extra key that is not on US keyboards. + This key is positioned to the right of the left shift key. Some + other keyboards have additional keys; these are not shown on the + layout designer. If you have a European layout selected as your + Windows layout, the 102nd key will always be visible in the + designer. When a European layout is selected as your Windows layout, + the shape of the Enter key will also change to take two rows, and + the backslash key will move down one row, but not otherwise change + in behaviour. + +You can press and release Ctrl to select +another key on the keyboard using your keyboard. + +
+ +![Keyboard Editor - Layout tab, Code view](../images/ui/frmKeymanWizard_Layout_Code.png) + +The Code view shows the source code of the keyboard file. This is where +all the information in the Details and Layout tab is stored, and +additional logic and complex keyboard layouts will be edited entirely in +the Code view. + +See the [Editor topic](editor) for more information on how to use the +editor shown within this view. + +## On-Screen tab + +![Keyboard Editor - On-Screen tab](../images/ui/OnScreenKeyboard.png) + +This tab allows you to edit the visual representation of your keyboard +layout. The content on this tab is stored in the .kvks file associated +with your keyboard. The visual representation is used only in desktop +and desktop web; however if no touch layout is defined, this layout will +be synthesized into a touch layout automatically. + +An On-Screen keyboard is optional but in most keyboards is recommended. +The On-Screen keyboard may not always match the actual layout +identically, because you may choose to hide some of the details of +encoding from the interface presented to the user. The user can also +choose to print the layout. + +This keyboard layout can also be printed or included in HTML or other +documentation. The editor allows you to export the file to HTML, PNG or +BMP formats. + +Fill from layout +: Compiles the keyboard file, and processes each possible keystroke in + the keyboard file to automatically generate an On-Screen Keyboard + that matches the layout. This can be used to effectively + pre-populate the On-Screen Keyboard and reduces the complexity of + designing it from scratch. + +Import +: Imports an On-Screen Keyboard from an XML file. + +Export +: Exports the On-Screen Keyboard to an XML file. + +Text +: The key cap for the selected key + +Bitmap +: A bitmap that is displayed on the selected key (not recommended, as + it will not scale cleanly) + +Display underlying layout characters +: If checked, then the base or underlying layout will show in small + letters at the top left of each key cap. This can be helpful to + provide users with a guide as to the position of each key on the + keyboard, especially for non-Latin scripts. + +Distinguish between left and right Ctrl/Alt +: If checked, treats the left and right Ctrl/Alt as separate layers + +Display 102nd Key (as on European keyboards) +: European keyboards have one extra key that is not on US keyboards. + This key is positioned to the right of the left shift key. Some + other keyboards have additional keys; these are not shown on the + layout designer. If you have a European layout selected as your + Windows layout, the 102nd key will always be visible in the + designer; ensure you select this checkbox if you want the 102nd key + to always be visible to end users of the layout, irrespective of + their selected base layout. When a European layout is selected as + your Windows layout, the shape of the Enter key will also change to + take two rows, and the backslash key will move down one row, but not + otherwise change in behaviour. + +Auto-fill underlying layout +: When the Fill from layout button is clicked, if this option is + checked, then keys without corresponding rules in the Layout will be + filled with the base layout character. + +## Touch Layout tab + +![Keyboard Editor - Touch Layout tab, Design view](../images/ui/TouchLayout_Design.png) + +The Touch Layout tab is used to create the visible representation of the +keyboard layout for touch devices. It works similarly to the On Screen +Keyboard Editor conceptually, but has a number of additional features +specific to touch. Keys on the touch layout trigger rules within the +normal Keyman keyboard; if no rule is defined for a given key, it will +be given output if it has a standard code beginning with `K_`, or if it +is a Unicode value code, starting with `U_`. + +Follow this +[guide](../guides/develop/touch-keyboard-tutorial/making-touch-keyboard) +for learning how to create a Touch Layout keyboard. + +In Design view, the editor can show a number of different device types, +including iPhone and iPad, in different orientations, to allow you to +visualize the keyboard layout before you load it onto a device. The +following image shows all aspects of the touch design view. + +![Keyboard Editor - Touch Layout tab, Design view closeup](../images/ui/TouchLayout_Design_2.png) + +### Left sidebar controls + +Template... +: The Template button allows you to choose a standard layout of keys + from a predefined set. These layouts move the standard set of keys + around and between layers to reduce the number of keys on each + layer, optimising for mobile phone or other sizes. When Keyman + Developer switches to a new template, it will transfer key + definitions to the new layout as far as possible, but if keys on the + current layout are not in the new template, their definitions will + be lost. Therefore, selecting an appropriate template early in the + development process is suggested. + +Import from On Screen +: If you have an existing On-Screen Keyboard for your keyboard layout, + importing the design from the On-Screen Keyboard can reduce the + development time considerably. Once you have imported, you will + probably want to select a new template to transform the + desktop-oriented design to a tablet or phone design automatically. + +View Controls +: This selector allows you to choose the simulated view of the + keyboard, either landscape or portrait, for a number of devices. The + presented keyboard may not be 100% identical to the final layout as + seen on the device, but this allows you to get a feel for the design + before testing. + +Platform +: The platform controls allow you to select and add or remove platform + support for a given layout. If a platform is not defined, then + Keyman Engine will transform the layout from another platform + automatically, so you don't necessarily need to define layouts for + each platform. If the 'Display underlying' checkbox is checked, then + the base or underlying layout will show in small letters at the top + left of each key cap. This can be helpful to provide users with a + guide as to the position of each key on the keyboard, especially for + non-Latin scripts. + +Layer +: Each layout for each platform is made up of one or more layers of + keys. Each layer can have a default shift state associated with it, + which allows keys to trigger specific rules in the Layout code. + +### Keyboard area + +On the right of the sidebar is the keyboard design area. This shows a device with +a presentation of the key layout. Within the key layout, you can click +on any key to edit it. There are a number of controls: + +Red circle with an X +: This button to the top right of the key will delete the key from the + row; if it is the last key on the row, the entire row will be + deleted. + +Green arrow with a + +: These buttons will insert a key to the left or right, or a single + key on a new row above or below the selected key. Adding extra keys + scales the entire keyboard. + +Dragging the right hand side of the key +: Dragging the right hand side of the key will resize the key; + resizing the key will rescale the entire keyboard so it still fits + within the device screen. + +Metrics +: The metrics displayed on the right hand side of the keyboard show + the virtual width of each row of the keyboard, and the number of + keys. For small devices, 10 keys is the maximum recommended number + in a row; each key has a standard width of 100. While each row can + be a different length, the last key in the row will be stretched to + balance the final design; 'spacer' keys can be used to leave a + visual gap on the right hand side of the keyboard. You should aim to + make each row the same total width for consistent results. + +### Right sidebar controls + +Next to the keyboard area is another control bar for editing details of +the selected key. + +Keycap Value +: Assign a type to a key. This is to specifies which keys are Text, AltGr, Shift, Menu, TabLeft, ZWSp and more. + +Text +: You can drop characters from Character Map directly into the key cap + edit box, or type directly. + +Text Unicode +: Clicking on a text unicode will focus the unicode edit box + instead of the text edit box. + +Hint and Hint Unicode +: Add any Unicode to indicate the presence of long-press keys for that key, and the hint will be visible in the top right corner of the key. + +Key Type +: The general appearance of each key is determined by the key type, + which is selected (in Keyman Developer 10) from a drop-down list: + + | Key Type | Description | + |----------------------|----------------------------| + | Default (normal) key | A standard letter or character key on the keyboard | + | Special (shift) key | The grey control type keys, layer shifts, Enter, Backspace, etc. | + | Special (Active) | A variation on the Special keys, which shows a highlight, typically used to indicate that a shift key for example is down. | + | Dead-key | While this key type has no difference in function to default keys, it will have a different style to indicate that it is different; the logic in the keyboard source may well be a deadkey, for example. | + | Blank | This type of key cannot be selected in use and shows as a blank key. | + | Spacer | Leaves a space in the keyboard at the point it is inserted, in the background colour of the keyboard area. | + +Modifier +: Determines the state that Keyman Engine will receive from the + key stroke, such as Default, Right-Alt, Shift, Right-Alt Shift, or Caps. This makes it simpler to design a single keyboard that works across both desktop and mobile interfaces. + +ID +: Each key must be given an identifying ID which is unique to + the key layer. ID by and large correspond to the virtual key + codes used when creating a keyboard program for a desktop keyboard, + and should start with `K_`, for keys mapped to standard Keyman + virtual key names, e.g. `K_HYPHEN`, and `T_` or `U_` for + user-defined names, e.g. `T_ZZZ`. + If keyboard rules exist matching the key code in context, then the output from the key will be + determined by the processing of those rules. It is usually best to + include explicit rules to manage the output from each key, but if no + rules matching the key code are included in the keyboard program, + and the key code matches the pattern `U_xxxx[_yyyy...]` + (where `xxxx` and `yyyy` are 4 to 6-digit hex strings), then the + Unicode characters `U+xxxx` and `U+yyyy` will be output. As of + Keyman 15, you can use more than one Unicode character value in the + id (earlier versions permitted only one). The ID is always + required, and a default code will usually be generated automatically + by Keyman Developer. + + - `K_xxxx` is used for a standard Keyman for Windows's key name, e.g. + `K_W`, `K_ENTER`. You cannot make up your own `K_xxxx` names. + Many of the `K_` ids have overloaded output behaviour, for + instance, if no rule is matched for `K_W`, Keyman will output + 'w' when it is touched. The standard key names are listed in + [Virtual Keys and Virtual Character Keys](/developer/language/guide/virtual-keys). Typically, + you would use only the "common" virtual ID. + - `T_xxxx` is used for any user defined names, e.g. `T_SCHWA`. + If you wanted to use it, `T_ENTER` would also be valid. If no + rule matches it, the key will have no output behaviour. + - `U_####[_####]` is used as a shortcut for a key that + will output those Unicode values, if no rule matches it. This is + similar to the overloaded behaviour for `K_` ids. Thus `####` + must be valid Unicode characters. E.g. `U_0259` would generate a + schwa if no rule matches. It is still valid to have a rule such + as `+ [U_0259] > ...` + +Padding Left +: Padding to the left of each key can be adjusted, and specified as a + percentage of the default key width (100). If not specified, a + standard padding of 15% of the key width is used between adjacent + keys. + +Width +: The layout is scaled to fit the widest row of keys in the device + width, assuming a default key width of 100 units. Keys that are to + be wider or narrower than the default width should have width + specified as a percentage of the default width. For any key row that + is narrower than the widest row, the width of the last key in the + row will be automatically increased to align the right hand side of + the key with the key with the right edge of the keyboard. However, + where this is not wanted, a "spacer" key can be inserted to leave a + visible space instead. As shown in the above layouts, where the + spacer key appears on the designer screen as a narrow key, but will + not be visible in actual use. + +Next layer +: The virtual keys `K_SHIFT`, `K_CONTROL`, `K_MENU`, etc. are normally + used to switch to another key layer, which is implied by the ID. The left and right variants of those ID, and also + additional layer-switching keys mentioned above (`K_NUMERALS`, + `K_SYMBOLS`, `K_CURRENCIES`, `K_ALTGR`) can also be used to + automatically switch to the appropriate key layer instead of + outputting a character. However, it is sometimes useful for a key to + output a character first, then switch to a new layer, for example, + switching back to the default keyboard layer after a punctuation key + on a secondary layer had been used. Specifying the `nextlayer` for a + key allows a different key layer to be selected automatically + following the output of the key. Of course, that can be manually + overridden by switching to a different layer if preferred. + +Drag and drop +: Keys can be moved around the keyboard by dragging them with the + mouse; a ghost landing box will appear beneath the key when it can + be dropped. If the key is dropped in an invalid area, no action will + occur. + +Double-click +: Double clicking on a key with a "Next Layer" defined will switch to + that layer. + +### Middle bar controls + +#### Long-press keys area + +The keys in the long press area cannot be resized but the controls +otherwise work the same as in the main keyboard area. The keys cannot be +dragged between the main keyboard area and the long press area. The bar +below the long press area contains the corresponding controls for the +long press keys. + +![Keyboard Editor - Touch Layout tab, Code view](../images/ui/frmKeymanWizard_TouchLayout_Code.png) + +The Code view allows you to edit the JSON source of the touch layout +file. This makes certain operations simpler, such as batched rearranging +of keys, or using another text editor to make bulk changes. The Code +view uses the standard [editor](editor). + +The format of the layout file is described in [Creating a touch keyboard layout guide](../guides/develop/creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty). + +#### Long-press, Flicks, and Multitaps controls + +Underneath the keyboard area is the Long-press, Flicks, and Multitaps controls. + +![Long-press, Flicks, and Multitaps layout](../images/ui/LongPress_Flicks_Multitaps.png) + +Red circle with an X +: This button to the top right of the key will delete the key from the + row; if it is the last key on the row, the entire row will be + deleted. + +Green arrow with a + *(Applies to Long-press and Multitaps)* +: These buttons will insert a key to the left or right, or a single + key on a new row above or below the selected key. Adding extra keys + scales the entire keyboard. + +Drag and drop *(Applies to Long-press and Multitaps)* +: Keys can be moved around the keyboard by dragging them with the + mouse; a ghost landing box will appear beneath the key when it can + be dropped. If the key is dropped in an invalid area, no action will + occur. + +#### Right sidebar controls + +Next to the three controls is another control bar for editing details of +the selected key for different Gesture Type. The only difference between this control and the [keyboard right sidebar](#toc-right-sidebar-controls) controls is: +* Include Gesture Type box and Default selection check box. +* **No** Hint, Hint Unicode, Padding Left, and Width. + +## Icon tab + +![Keyboard Editor - Icon tab](../images/ui/frmKeymanWizard_Icon.png) + +The icon tab allows you to edit the icon associated with the keyboard. An external icon editor will allow you to create more sophisticated icons with alpha transparency and multiple resolutions, but this will cover the standard 16x16 256 colour icon, which is all that many keyboards require. The controls at the top left are: + +Pencil +: Freehand drawing with the selected colour; use right mouse button + for secondary colour. + +Line +: Draw a straight line + +Open box +: Draw an outline box + +Filled box +: Draw a filled box in current colour + +Open circle +: Draw an outline circle or ellipse + +Filled circle +: Draw a filled circle or ellipse in the current colour + +Fill +: Fill from the current point all contiguous pixels of the same colour + +Text +: Use this tool to add a letter or letters to the icon. Click in the + lower left of the icon area and a window opens where you can type + the text you want. You can also change the quality of the font as + well as the font properties by clicking on the Change button. Note + that to change the color of the font, you need to change the color + setting in the font properties window. + +The icon can be exported or imported to/from various other formats. The +transparent colour is the top left colour in the grid with an X in the +box. The icon can be rotated in any direction with the arrow controls +below the toolbox; this will not lose data from the icon but will +instead rotate the edge moving off the grid to the other side of the +grid. + +## Embedded JS tab + +This tab allows you to edit JavaScript code in the file referenced by +the [`&kmw_embedjs`](/developer/language/reference/kmw_embedjs) store, +implementing [IMX functionality](../guides/develop/imx) of the keyboard. + +## Embedded CSS tab + +This tab allows you to edit the Cascading Style Sheet rules in the file +referenced by the +[`&kmw_embedcss`](/developer/language/reference/kmw_embedcss) store for +the keyboard. + +## Web Help tab + +This tab allows you to add a custom HTML snippet to replace the desktop +on screen keyboard, for example useful if the keyboard uses sequences of +keys to produce characters. + +## Include Codes tab + +This tab allows you to edit the [named constants](/developer/language/guide/constants) for the keyboard. + +## Build tab + +![Keyboard Editor - Build tab](../images/ui/BuildTab.png) + +A set of common controls is across the top of this tab: + +Compile Keyboard +: You can compile the keyboard for testing and installation by + clicking the Compile button, or + selecting Keyboard, Compile Keyboard. This will compile the keyboard + for all the selected Targets from the Details tab. + +Start Debugging +: To test your keyboard within Keyman Developer, press F5 to start the + [debugger](debug), or press the Start Debugging button. This is + suitable for testing desktop layouts. + +Open source, build, and project folder +: Opens the folder which contains the keyboard source, build, and project files. + + + +### Windows, macOS, and Linux Targets + +If your keyboard is designed to target Windows and macOS, then the +following buttons will also be visible: + +Install +: Installs the keyboard for use with Keyman Desktop on your computer + +Uninstall +: Uninstalls the keyboard from Keyman Desktop if previously installed + + + +### Web and Mobile Targets + +If your keyboard is designed to target KeymanWeb, mobile or tablet +devices, the following controls will also be visible: + +Test Keyboard on Web +: Starts the Keyman Developer Web Server for the current keyboard. This will list the various IP addresses and hostnames that Keyman Developer is listening on + +Configure... +: Pressing this allows the [Options](./options) dialog to pop-up. + +Open in browser +: Starts your default browser with the selected address to allow + testing of the keyboard directly + +Send to email +: Sends the list of web addresses as an email so that you can more + easily open the test site on your mobile device, or share with + someone else on your network. + +Copy link +: Once the IP addresses are shown, feel free to copy any one of the links. + +To test on other platforms, open one of the debug host addresses listed +on your device. Your device will need to be on the same network as the +Keyman Developer computer. + +You can test within the web browser on your device, or in the native app +if you have it installed: just click the Install button on the debugger +web page. + +The Send to email function makes it easier to open the addresses on your +mobile device without having to enter them manually. + +Learn more about [testing on the web and mobile devices](../guides/test/). \ No newline at end of file diff --git a/developer/docs/help/context/keyman-developer.md b/developer/docs/help/context/keyman-developer.md new file mode 100644 index 00000000000..38544801847 --- /dev/null +++ b/developer/docs/help/context/keyman-developer.md @@ -0,0 +1,5 @@ +--- +title: Keyman Developer Main Window +--- + +- [Project Window](project) \ No newline at end of file diff --git a/developer/docs/help/context/kmc.md b/developer/docs/help/context/kmc.md new file mode 100644 index 00000000000..088b04ca0d3 --- /dev/null +++ b/developer/docs/help/context/kmc.md @@ -0,0 +1,5 @@ +--- +title: kmc Command Line Compiler Toolset +--- + +* [kmc documentation](../reference/kmc) \ No newline at end of file diff --git a/developer/docs/help/context/kmcomp.md b/developer/docs/help/context/kmcomp.md new file mode 100644 index 00000000000..0a4b382bbce --- /dev/null +++ b/developer/docs/help/context/kmcomp.md @@ -0,0 +1,7 @@ +--- +title: kmcomp - Command Line Compiler (deprecated) +--- + +kmcomp has been replaced by [kmc](../reference/kmc). + +* [Migrate from kmcomp to kmc](../reference/kmc/cli/kmcomp-migration) \ No newline at end of file diff --git a/developer/docs/help/context/kmconvert.md b/developer/docs/help/context/kmconvert.md new file mode 100644 index 00000000000..d620841473d --- /dev/null +++ b/developer/docs/help/context/kmconvert.md @@ -0,0 +1,125 @@ +--- +title: KMConvert Command Line Keyboard Conversion Utility +--- + +KMConvert generates keyboards and models from templates, and converts keyboard +layouts between different formats. + +The [New Project dialog](new-project) in Keyman Developer provides a graphical +version of the functionality in KMConvert. + +In a default installation of Keyman Developer on Windows, it is located in +`%ProgramFiles(x86)%\Keyman\Keyman Developer`, and should be on your `PATH`. +KMConvert will generate a full Keyman template project from the imported layout +or data, in a new folder named with the ID of the keyboard. It will not +overwrite an existing folder. + +The following parameters are available: + +```shell +kmconvert import-windows -klid [additional-options] +kmconvert template -id [additional-options] +kmconvert lexical-model -id-author -id-language -id-uniq [additional-options] +``` + +### Available conversion modes + +The conversion mode must be specified as the first parameter. + +`import-windows` +: Imports a Windows keyboard into a new Keyman keyboard project. The `-klid` +parameter is required. This mode only functions on Windows platforms. + +`template` +: Creates a blank keyboard project in the repository template format. The `-id` +parameter is required. + +`lexical-model` +: Creates a wordlist lexical model project in the repository template format. +The `-id-author`, `-id-language`, and `-id-uniq` parameters are required. + +### General parameters + +`-author ` +: Name of author of the keyboard or model, no default. + +`-copyright ` +: Copyright string for the keyboard or model, defaults to `Copyright (C)`, + used everywhere except license file. + +`-full-copyright ` +: Longer copyright string for the keyboard or model, defaults to + `Copyright (C) yyyy`, used in license file. + +`-languages ` +: Space-separated list of BCP 47 tags, e.g. `en-US tpi-PG` + +`-name ` +: Name of the keyboard or model, e.g. `My First Keyboard`, `%s Basic`. Format +strings are only valid in `import-windows` mode; `%s` will be replaced with the +friendly English name of the imported keyboard. + +`-nologo` +: Don't show the program description and copyright banner + +`-o ` +: The target folder to write the keyboard project into, defaults to `.\` + +`-version ` +: Version number of the keyboard or model, defaults to `1.0` + +### `template` and `import-windows` parameters + +`-id ` +: The id of the keyboard to create. Required for `template`, optional for +`import-windows`, not valid for `-lexical-model`. In `import-windows` mode, you +can use a format string with the placeholder `%s` which will be replaced with +the source filename, e.g. `kbdus`. If not specified, then the source filename +will form the id of the generated keyboard. + +`-targets ` +: Space-separated list of [targets](/developer/language/reference/targets), e.g. +`linux windows phone` + +### `import-windows` parameters + +`-klid ` +: The KLID of the keyboard to import, per LoadKeyboardLayout. This must be an +eight digit hex identifier, such as `00000409` for English (US), kbdus.dll. This +parameter is only valid for `import-windows` conversion mode. + +### Lexical model parameters + +`-id-author ` +: Identifier for author of model + +`-id-language ` +: Single BCP 47 tag identifying primary language of model + +`-id-uniq ` +: Unique name for the model + +Note: model identifiers are constructed from parameters: +`..` + +The values for `-id-author` and `-id-uniq` must be valid tokens: lower case a-z, 0-9, and underscore. These should also start with a letter or underscore. + +### Examples + +Create a lexical model for Tok Pisin: + +```shell +kmconvert lexical-model -id-author james -id-language tpi-PG -id-uniq tokpisin -name "Tok Pisin" -languages tpi-PG +``` + +Create a keyboard for Javanese from a template: + +```shell +kmconvert template -id sample -author "James Example" -name "My Javanese Keyboard" -copyright "Copyright (C) James Example" -full-copyright "Copyright (C) 2021 James Example" -languages jv-java +``` + +Create a new keyboard based on the Windows German keyboard: + +```shell +kmconvert import-windows -klid 00000407 -id german_plus -name "German Plus" -copyright "Copyright (C) James Example" -full-copyright "Copyright (C) 2021 James Example" -author "James Example" +``` diff --git a/developer/docs/help/context/kmlmc.md b/developer/docs/help/context/kmlmc.md new file mode 100644 index 00000000000..33edf500f5c --- /dev/null +++ b/developer/docs/help/context/kmlmc.md @@ -0,0 +1,5 @@ +--- +title: kmlmc - Command Line Lexical Model Compiler (deprecated) +--- + +kmlmc has been replaced by [kmc](../reference/kmc). diff --git a/developer/docs/help/context/kmlmi.md b/developer/docs/help/context/kmlmi.md new file mode 100644 index 00000000000..dc47cbbc39a --- /dev/null +++ b/developer/docs/help/context/kmlmi.md @@ -0,0 +1,5 @@ +--- +title: kmlmi - Command Line Lexical Model model_info Compiler (deprecated) +--- + +kmlmi has been replaced by [kmc](../reference/kmc). diff --git a/developer/docs/help/context/kmlmp.md b/developer/docs/help/context/kmlmp.md new file mode 100644 index 00000000000..3442d8f1424 --- /dev/null +++ b/developer/docs/help/context/kmlmp.md @@ -0,0 +1,5 @@ +--- +title: kmlmp - Command Line Lexical Model Package Compiler (deprecated) +--- + +kmlmp has been replaced by [kmc](../reference/kmc). diff --git a/developer/docs/help/context/ldml-debug.md b/developer/docs/help/context/ldml-debug.md new file mode 100644 index 00000000000..e3eb2f717be --- /dev/null +++ b/developer/docs/help/context/ldml-debug.md @@ -0,0 +1,25 @@ +--- +title: LDML Keyboard Debug Window +--- + +The LDML keyboard debug window is shown at the bottom of an LDML keyboard editor +when testing the keyboard. In version 17.0, the LDML keyboard debug window is +a simple test window, without support for interactive debugging, unlike the +Keyman keyboard debug window. + +## Debugger input window + +![Debug window - Debug State](../images/ui/frmDebug.png) + +The debugger input window is used for typing input to test the keyboard. +In the top half of this window, input you type while testing your +keyboard will be displayed, exactly the same as in use, with one +exception: deadkeys will be shown visually with an +![OBJ](../images//ui/obj.gif) symbol. + +The lower half of the window shows a grid of the characters to the virtual left +of the insertion point, or the selected characters if you make a selection. +Markers will be identified in the grid, but only by numeric value in version +17.0. The grid will show characters in right-to-left scripts in backing store +order, from left to right. If there are more characters in your text than can +fit on the screen, then only those that fit will be shown in the grid. \ No newline at end of file diff --git a/developer/docs/help/context/ldml-editor.md b/developer/docs/help/context/ldml-editor.md new file mode 100644 index 00000000000..94eb3ecc45e --- /dev/null +++ b/developer/docs/help/context/ldml-editor.md @@ -0,0 +1,18 @@ +--- +title: LDML Keyboard Editor Window +--- + +![Keyboard Editor - New file, Details tab](../images/ui/frmLDMLEditor.png) + +The LDML Keyboard file format is new in Keyman Developer 17. It is an +XML file, and follows the specification at https://www.unicode.org/reports/tr35/tr35-keyboards.html + +The LDML editor in this release is very basic, supporting syntax highlighting +and basic editing, but specific support for the keyboard3 format is scheduled +for release in version 18.0. + +LDML keyboards can be tested by pressing F5. This opens the [LDML Debug window](ldml-debug). + +The text editor supports standard Windows editing keystrokes. It uses the Monaco +component from Visual Studio Code, so much of the functionality available in +that editor is also available here. diff --git a/developer/docs/help/context/messages.md b/developer/docs/help/context/messages.md new file mode 100644 index 00000000000..9c9ad133359 --- /dev/null +++ b/developer/docs/help/context/messages.md @@ -0,0 +1,18 @@ +--- +title: Message Window +--- + +![Message window](../images/ui/frmMessages.png) + +The message window appears at the bottom of the screen, or floating in a toolbar window. It contains a list of error and warning messages returned from a compilation session. + +You can double click or press Enter to select a +line corresponding to an error in the window. To open and close the +window, press Ctrl+Shift+M. +You can save the messages listed in the window, or clear them, through +the context menu available by clicking the right mouse button in the +window (or pressing the Context Menu key). + +You can undock and dock the window by dragging its title bar. + +The hotkeys for moving to next and previous messages in the list are F4 and Shift+F4, respectively. diff --git a/developer/docs/help/context/model-editor.md b/developer/docs/help/context/model-editor.md new file mode 100644 index 00000000000..2366eaeba9a --- /dev/null +++ b/developer/docs/help/context/model-editor.md @@ -0,0 +1,185 @@ +--- +title: Lexical Model Editor +--- + +The lexical model editor allows you to create and maintain lexical +models for predictive text. + +## Lexical model component files + +A lexical model can have multiple source files, all of which can be +managed in this one editor. The source files currently supported by the +editor are: + +| File type | Tabs | Description | +|-------------------|-----------------|-------------| +| `file.model.ts` | Details, Source | The primary lexical model source file, a TypeScript module. | +| `wordlist.tsv` | wordlist.tsv | One or more wordlists, UTF-8 format tab-separated value files. These files are referenced in the .model.ts source file. | + +## Details tab + +The following image shows the first tab of the editor, the Details tab. +Changes made to this tab are reflected immediately in the Source tab. + +![Model Editor - Details tab](../images/ui/frmModelEditor_Details.png) + +The fields here have corresponding definitions in the [.model.ts source file](../reference/file-types/model-ts), which can be seen in the +**Source** tab: + +Format +: The implementation of the lexical model. This can be either + **Wordlist** (`trie-1.0`), or **Custom** (`custom-1.0`). Corresponds + to the `format` property in the [.model.ts source file](../reference/file-types/model-ts). + +Word breaker +: What method is used to separate words in text. This can be one of + `default`, `ascii`, or `custom`. Corresponds to the `wordBreaker` + property in the [.model.ts source file](../reference/file-types/model-ts). + +Insert after word +: Many languages insert a space after a word. Some languages, like Thai or Khmer, do not use spaces. To suppress the space, you may set insertAfterWord to the empty string: + + ```keyman + punctuation: { + insertAfterWord: "", + }, + ``` + +[Read more](../guides/lexical-models/advanced/punctuation#toc-customizing-insertafterword) + +Quotation marks +: These are the quotation marks that surround the "keep" suggestion when it's displayed in the suggestion banner. [Read about Quotation marks here](../guides/lexical-models/advanced/punctuation#toc-customizing-quotesforkeepsuggestion). + +Right-to-left script +: Check this box to indicate that the lexical-model is for a right-to-left script. + +Language uses casing +: Tick this box for uppercase, capitalize, or any casing in the predicted word. + +Comments +: This field corresponds to the first lines of comments in the model + source, and is visible only to the model designer. + +Wordlists +: The Wordlists grid controls which additional wordlist files are + referenced by the model. Adding a wordlist file will add an extra + tab to the editor, and add the corresponding reference to the + lexical model source. Removing a wordlist will not delete the + component file, but will just remove the reference from the lexical + model source. Corresponds to the `sources` property in the + [.model.ts source file](../reference/file-types/model-ts). + +> ### Note +If the [.model.ts](../reference/file-types/model-ts) file cannot +be parsed by the model editor, the field shown here will be read only +and you will need to make changes only in the **Source** tab. This can +happen if the .model.ts contains more complex code. + +## Wordlist tabs + +Each [wordlist file](../reference/file-types/tsv) referenced in the +Wordlists grid is given its own tab. Wordlist tabs have two views: +Design, and Code. Changes to one view are reflected immedaitely in the +other view. [Learn more about wordlists](../guides/lexical-models/tutorial/step-3). + +Wordlist files should be stored in UTF-8 encoding (preferably without +BOM), and tab-separated format. Some applications, such as Microsoft +Excel, are unable to export in this format, so the compiler will also +accept UTF-16 encoded files, but this encoding is not recommended as it +is more difficult to manage in version control systems such as Git, +which is the system used by the Keyman Cloud lexical model repository. + +![Model Editor - Wordlist tab - Design view](../images/ui/frmModelEditor_Wordlist_Design.png) + +Every line of the tab-separated format file is shown here, and can be +edited directly. For most wordlists, it will be more effective to use an +external dictionary tool, such as SIL Fieldworks or SIL PrimerPrep to +generate the wordlist from a text corpus, and use this tab just to +preview the contents of the file. + +The **Sort by frequency** button has no effect on the functioning of the +wordlist, but can help you, the editor, by showing more common words +earlier in the list. + +![Model Editor - Wordlist tab - Code view](../images/ui/frmModelEditor_Wordlist_Code.png) + +> ### Note +The wordlist Code editor will accept the Tab key to insert a Tab +character. In other code editors in Keyman Developer, the Tab key +inserts spaces. + +## Source tab + +![Model Editor - Source tab](../images/ui/frmModelEditor_Source.png) + +This tab shows the source view of the model, written in the Typescript +programming language. The format of this file is documented in the +[Lexical Model File Format Reference](../reference/file-types/model-ts). + +## Build tab + +![Model Editor - Build tab](../images/ui/frmModelEditor_Build.png) + +A set of common controls is across the top of this tab: + +Compile Model +: You can compile the model for testing and installation by clicking + the **Compile Model** button, or + selecting Model, Compile Model. This will compile the model into a + single Javascript file, named as shown in the **Target filename** + field. + +Open source, build, and project folder +: Opens the folder which contains the model source, build, and project files. + + + +### Test Lexical Model in Web Browser + +Before distributing the lexical model, you can test it in a web browser. +[Learn more about testing lexical models](../guides/test/lexical-model). + +Keyboard for testing +: Allows you to select a compiled keyboard to provide input for + testing the lexical model. You can also choose to start testing a + keyboard directly from the keyboard source file and it will then be + available for use when testing the lexical model, until you restart + Keyman Developer. The keyboard must be a .js format keyboard with a + touch keyboard. + +Test Lexical Model +: Starts the Keyman Developer Web Server for the current lexical + model. This will list the various IP addresses and hostnames that Keyman Developer + is listening on + +Configure... +: Pressing this allows the [Options](./options) dialog to pop-up. + +Open in browser +: Starts your default browser with the selected address to allow + testing of the model directly + +Send to email... +: Sends the list of web addresses as an email so that you can more + easily open the test site on your mobile device, or share with + someone else on your network. + +Copy link +: Once the IP addresses are shown, feel free to copy any one of the links. + +To test on other platforms, open one of the debug host addresses listed +on your device. Your device will need to be on the same network as the +Keyman Developer computer. + +There is also a QR code which you can scan with your mobile device +camera to automatically load the selected site in the list of debug web +addresses. This is the quickest way to start testing on your mobile +device. + +The Send to email function is another way to open the addresses on your +mobile device without having to enter them manually. + +Learn more about [testing on the web and mobile devices](../guides/test/lexical-model). \ No newline at end of file diff --git a/developer/docs/help/context/new-ldml-project-parameters.md b/developer/docs/help/context/new-ldml-project-parameters.md new file mode 100644 index 00000000000..c1bf7cabb6c --- /dev/null +++ b/developer/docs/help/context/new-ldml-project-parameters.md @@ -0,0 +1,63 @@ +--- +title: New LDML Keyboard Project Parameters Dialog +--- + +Allows you to quickly fill in common parameters for a new LDML keyboard project, adding keyboard, package, documentation and metadata files, following the [file layout](/developer/keyboards/) used in the [Keyman keyboards repository](https://github.com/keymanapp/keyboards). + +Projects can also be created from the command line with [KMConvert](kmconvert). + +![Keyboard Editor - New file, Details tab](../images/ui/frmNewLDMLProjectParameters.png) + +### Parameters + +Keyboard Name + +: **Required.** The descriptive name of the keyboard. This will be set in the + ` + +Proxy Settings... +: Configure the HTTP proxy settings for online functionality within + Keyman Developer, such as uploading files to Tavultesoft. + +SMTP Settings... +: Configure your SMTP server settings for email functionality within + Keyman Developer, such as emailing debug URLs for the touch layout + debugger. + +## Editor tab + +![Options dialog - Editor tab](../images/ui/frmOptions_Editor.png) + +Use tab character +: Sets whether to use the Tab character or spaces for indents. + +Indent size +: The indent size, measured in number of spaces. + +Link quoted font size to primary font size +: If checked, the quoted font size will be the same as the default + font size. + +Default font +: Sets the font for ordinary text in the editor. + +Quoted font +: Sets the font for displaying comments text and strings in Keyman + source files in single or double quotes. + +Editor theme +: Sets the display theme and syntax highlighting options for the + editor. A [custom theme](../reference/editor-themes) can be defined + in a JSON file. + +## Debugger tab + +![Options dialog - Debugger tab](../images/ui/frmOptions_Debugger.png) + +Enable test window (from version 5.0) +: Enables the Keyman 5-style Test window instead of the debugger. + +Breakpoints fire also when exiting line +: Breakpoints will fire when a rule has finished being processed also. + +Turn on single step after breakpoint +: Activates single-step mode after a breakpoint fires. + +Show matched character offsets in stores +: Displays numeric indices of characters in stores + +Automatically recompile if no debug information available +: When the debugger starts, rebuild a keyboard without prompting if + the keyboard has no debug symbols included. + +Automatically reset debugger before recompiling +: If you are debugging a keyboard, make a change to the keyboard, and recompile it, + then the debugger needs to be reset in order to get access to the new keyboard. + Keyman Developer will normally prompt you to do this, but if you set this option, + then it will reset the debugger automatically instead. + +## Character Map tab + +![Options dialog - Character Map tab](../images/ui/frmOptions_CharacterMap.png) + +Find character under cursor automatically +: The character beneath the cursor in the edit window will be + highlighted in the Character Map. This will intelligently parse the + character data under the cursor so that a character code (e.g. + U+1234) will be highlighted correctly. + +Disable database lookups +: Disables looking characters up in the database. + +Update database +: Rebuilds the Unicode character database from source unicodedata.txt + and blocks.txt. These files can be downloaded from the Unicode + website at + [http://www.unicode.org/ucd/](http://www.unicode.org/ucd/). + This lets you update the character map with a newer version of Unicode. + Keyman Developer 17.0 was released with Unicode version 15.1 data. + +## Server tab + +![Options dialog - Server tab](../images/ui/frmOptions_Server.png) + +There are two configurations in the Keyman Developer Server section: +1. Configure Server... +2. List local URLs for Server + +Configure Server... + +: After clicking the button, a new window will pop-up + + ![Keyman Developer Server Options dialog](../images/ui/frmKeyman_Developer_Server_Options.png) + + You can customize the Keyman Developer server for testing the usability of your keyboard. Features of the Keyman Developer server include: + + * Seamless integration with the IDE (Start, Stop, Live reload, Recompile...) + * Port configuration + * Allow testing cross devices + * Wider range support for NGROK... + + [Find out more](https://github.com/keymanapp/keyman/pull/6073) + + Understanding the three tick boxes will enhance the usability of Keyman Developer: + - **Leave Server running after closing IDE**: allows keyboard testing on local URLs after closing Keyman Developer. + - **Use ngrok to provide public url for web debugger**: configure NGROK as instructed, once it looks something like this: + ![Keyman Developer NGROK](../images/ui/frmNGROK_Config.png) + + Please restart the machine, and the URL (*link ending in .ngrok-free.app*) will appear in the specified locations: + ![Keyman Developer NGROK URL 1](../images/ui/frmNGROK_Server_1.png) + ![Keyman Developer NGROK URL 2](../images/ui/frmNGROK_Server_2.png) + + Now, freely share it across multiple devices using the link or QR code. + ![Keyboard Test on Mobile](../images/ui/NGROK_Phone.png) + + - **Show server console window on start**: once ticked, Keyman Developer's server console will appear as an independent window as a node application with the default message: + `Starting Keyman Developer Server 17.0.290-beta, listening on port 8008.` + +List local URLs for Server +: Below Configure Server, untick the box, and it will quit displaying any local URLs for keyboard testing. + ![Keyman Developer Server Options dialog](../images/ui/frmList_Local_URLs.png) + +Explore more: [Keyman Developer Server](server#toc-configuring-keyman-developer-server) diff --git a/developer/docs/help/context/package-editor.md b/developer/docs/help/context/package-editor.md new file mode 100644 index 00000000000..38026732bc7 --- /dev/null +++ b/developer/docs/help/context/package-editor.md @@ -0,0 +1,194 @@ +--- +title: Package Editor +--- + +The Package Editor allows you to edit a .kps package source file, which will be +compiled into a .kmp package file. These files contain a set of keyboards, +documentation, fonts, and other related files, which make distribution and +installation of a keyboard in Keyman simple. + +## Files tab + +![Package Editor - Files tab](../images/ui/frmPackageEditor_Files.png) + +Use the Add... button to select the files to be included in the package, such +as .kmx and .js keyboard files, documentation, and related fonts; but you can +include any type of file here as well. + +If you add another .kmp package file, it will also be installed when this +package is installed, but will be managed separately and uninstalled separately. + +## Keyboards tab + +![Package Editor - Keyboards tab](../images/ui/frmPackageEditor_Keyboards.png) + +The Keyboards tab shows you some status information of keyboards you've added to +the package. There are also optional font dropdowns and a required "Languages" +section. The fields on the tab are: + +**Description** + +: The keyboard name (`&name` system store). + +**Files** + +: This shows the associated keyboard files (.kmx and .js files) + +**Version** + +: The keyboard version (`&keyboardversion` system store). + +**Is right-to-left** + +: Currently, this is only applicable to Android, iOS and Web (that is, .js + format) keyboards. This reflects the checkbox in the [Details tab](./keyboard-editor#details-fields) of the Keyboard editor. + +> ### Note + **Is right-to-left** will only be true if the following occur: + * "Keyboard is right-to-left" is checked in the Keyboard editor + * The compiled .js keyboard is added to the package + +**Keyboard font** + +: When font files are added to the package, this dropdown tells the Keyman apps + which font to use when rendering the On Screen Keyboard touch keyboard. + Optional. + +**Display font** + +: When font files are added to the package, this dropdown tells the Keyman apps + for iOS and Android which font to use in edit fields. It only applies within + the Keyman app and apps that support this functionality. Optional. + +**Web fonts** + +: It is possible now to specify additional font filenames that will be made + available to KeymanWeb, for example, providing fonts in WOFF or WOFF2 formats. + [More on web fonts](select-web-fonts) + +**Languages** + +: Because the language information in the .kmn source is deprecated, the + "Languages" section is required. Each language listed here is a [BCP 47 language tag](../reference/bcp-47). Use the **Add** button to + bring up the "Select BCP 47 Tag" dialog. When Keyman installs the keyboard + package, it will associate the keyboard with the language(s) you select here. + Required. + + ![Package Editor - Select BCP 47 Tag dialog](../images/ui/frmPackageEditor_Select_BCP_47_Tag.png) + +**Examples** + +: Examples allow you to provide short keystroke sequences to type sample text + with your keyboard. This can be the easiest way for a new user to start using + your keyboard, and is particularly helpful when your keyboard makes use of + keying sequences that may not be immediately obvious. + + As the keying examples may vary by language, you should include the BCP 47 tag + for each example, plus a short description (in English) of what the text is + about. + + The key sequence must list each key combination, separated by space. The + actual text for each key is reasonably arbitrary, to allow you to provide + examples for touch keyboards as well as desktop keyboards. There are three + special kinds of key strings: + * Modifier keys may be specified with the `+` character, e.g. `shift+e` or `right-alt+k`. Use lower case keys. The suggested standard modifiers are: `shift`, `ctrl`, `alt`, `left-alt`, `right-alt`, `left-ctrl`, `right-ctrl`, and `option` (mac). + * The space key itself may be specified with `space`. + * To avoid confusion with modifier keys, the + key can be specified with `plus`. + + For example, the key sequence x, j, m, Shift+e, r may be specified as `x j m shift+e r` or `x j m E r`. + + ![Package Editor - Edit Example dialog](../images/ui/frmPackageEditor_EditExample.png) + +## Details tab + +![Package Editor - Details tab](../images/ui/frmPackageEditor_Details.png) + +Enter the name of the package into the Package Name field; this will be +automatically filled from the name of the first keyboard you add to the package. + +Select a HTML readme file if you have one to include in the package; this will +be displayed before the package is installed as information about the package. + +Version numbers should be in the form `major.minor[.patch]`. Patch is optional +but is helpful for small bug fix releases. Each of the sections of the version +should be an integer. Keyman Desktop does integer comparisons on the version +number components, so, for example, version 2.04 is regarded as newer than +version 2.1. Alphabetic or date formats should be avoided as the installer for +the keyboard cannot determine which version is older reliably. + +You can also tick the checkbox labelled "Package version follows keyboard +version" to have the package version automatically track the keyboard version. + +The Copyright indicates the overall copyright of the package and all its +contents. + +Fill in the individual or organisation who authored the package in the Author +field, and a contact email address into the E-mail address field. These fields +are optional. + +A web site is encouraged and should be filled in the web site field, including +the initial "http://" or "https://". + +A package can optionally include a 140x250 JPEG or PNG image file to be shown +during installation. This image file must be added to the Files list in step 1, +then selected from the list here. + +### Related packages + +If a keyboard package is intended to replace an existing keyboard, or if there +are related packages, then the identifiers for these packages should be listed +here. + +There are two types of package relationships: + +* Deprecation: if the package replaces an existing package, ensure that you + select the 'Deprecated' check box. This information will be used on the Keyman + website, both to help users select the most recent version of a keyboard, and + also to offer upgrades to new packages for existing users of the package. + +* Related: if the 'Deprecated' check box is not selected, then this the + relationship information is used to provide links to the related packages on + the Keyman website. For example, you may create two keyboards for the same + language with different keying orders; then it would be appropriate to + cross-reference them with this field. + +![Package Editor - Edit Related Packages dialog](../images/ui/frmPackageEditor_EditRelatedPackage.png) + +## Shortcuts tab + +![Package Editor - Shortcuts tab](../images/ui/frmPackageEditor_Shortcuts.png) + +You can optionally have the package create a Start Menu folder, and populate it +with shortcuts to the files in the package, and optionally also a shortcut for +uninstallation. + +To add an entry, click New, and set the description, and choose a program or +document to load. + +An uninstall shortcut is no longer recommended; uninstall should be managed by +the user in Keyman Configuration. + +## Source tab + +![Package Editor - Source tab](../images/ui/frmPackageEditor_Source.png) + +The source of the .kps file in XML format. All details from previous tabs can be +seen in the Source tab, and changes in either the Source tab or the other tabs +will be reflected immediately in the other. + +## Compile tab + +![Package Editor - Compile tab](../images/ui/frmPackageEditor_Build.png) + +The final step is building the package. You must save the package file before +building, then choose Compile Package to build the package file. You can then +test the package to verify that it will install correctly with the Install +Package button. + +Once you are satisfied with your package, you should consider submitting the +keyboard to the [Keyman Cloud Keyboards Repository](/developer/keyboards/). + +## Package Installers + +As of Keyman Developer 17, bundled executable package installers for Keyman for +Windows can be created using [kmc](kmc), but cannot be created within the IDE. \ No newline at end of file diff --git a/developer/docs/help/context/project.md b/developer/docs/help/context/project.md new file mode 100644 index 00000000000..84bfb38722c --- /dev/null +++ b/developer/docs/help/context/project.md @@ -0,0 +1,36 @@ +--- +title: Project Window +--- + +The Project allows you to manage all the files that you are working on in Keyman Developer, and guides you on the steps to creating a keyboard solution. Changes to the project are automatically saved. + +You can open the Project window by pressing Ctrl+Shift+P, or selecting View, Project. + +## Welcome + +![Project window - Welcome tab](../images/ui/frmProject_Welcome.png) + + +This tab lists all the files that you have recently worked on. + +## Keyboards + +![Project window - Keyboards tab](../images/ui/frmProject_Keyboards.png) + + +This tab lists all the keyboard source files in your project. + +## Packaging + +![Project window - Packaging tab](../images/ui/frmProject_Packaging.png) + + +This tab lists all the package source files in your project. + +## Distribution + +![Project window - Distribution tab](../images/ui/frmProject_Distribution.png) + + +This tab lists all other files in your project, such as the +[.keyboard_info file used for uploading to the Keyboards repository](/developer/keyboards/). \ No newline at end of file diff --git a/developer/docs/help/context/select-web-fonts.md b/developer/docs/help/context/select-web-fonts.md new file mode 100644 index 00000000000..f03d437faf0 --- /dev/null +++ b/developer/docs/help/context/select-web-fonts.md @@ -0,0 +1,17 @@ +--- +title: Package Editor - Select Web Fonts +--- + +The Select Web Fonts dialog allows you to choose additional fonts that will be +made available as suggested fonts for KeymanWeb. These fonts should be included +in the package. + +Even though the fonts are included in the package, KeymanWeb will source the +fonts from its own infrastructure, so they will need to be shared in the Keyman +content delivery network repository +[s.keyman.com](https://github.com/keymanapp/s.keyman.com). + +Separate fonts can be specified for the On-Screen Keyboard and the recommended +Display font. + +![Select Web Fonts dialog](../images/ui/frmPackageEditor_SelectWebFonts.png) \ No newline at end of file diff --git a/developer/docs/help/context/server.md b/developer/docs/help/context/server.md new file mode 100644 index 00000000000..0a04d425d32 --- /dev/null +++ b/developer/docs/help/context/server.md @@ -0,0 +1,398 @@ +--- +title: Keyman Developer Server +--- + +# Introduction + +Keyman Developer Server provides a web-based front-end for testing and sharing +keyboards, lexical models and packages. + +The primary benefits of Keyman Developer Server are: + +* Test keyboards in a browser on your computer, including simulation of mobile + devices and touch keyboards +* Test lexical models in a browser on your computer +* Test keyboards, lexical models and packages on mobile devices +* Share keyboards, lexical models and packages to mobile devices and other users + +Keyman Developer Server was added in Keyman Developer 15, and replaces the old web +Test feature. + +![](images/server-iphone.png) + +# Installation and Startup + +## Windows + +Keyman Developer Server is always installed as a part of Keyman Developer. + +When you start Keyman Developer, Keyman Developer Server will start in the +background. + +> **Note:** The first time Keyman Developer Server starts, you may be presented +with a warning from your firewall or security software about Node.js Javascript +Runtime running from the Keyman Developer folder. This is the Keyman Developer +Server host process, and you should choose to allow Keyman Developer Server to +communicate at least on your local private network, or as your circumstances +dictate. + +By default, Keyman Developer Server will run when Keyman Developer is running, +and will shutdown when Keyman Developer is closed. However, you can also +configure Keyman Developer Server to stay running even after Keyman Developer is +closed. + +An icon will be displayed in the system notification area in the Taskbar +(it may be hidden in the expansion area): + +![](images/taskbar.png) + +Clicking on the icon opens a menu: + +![](images/taskbar-menu.png) + +The following menu items are available: + +**Open `http://localhost:8008` in browser** + +: Loads Keyman Developer Server home page in your default browser + +**Show console**, **Hide console** + +: Controls the visibility of the Node console for Keyman Developer Server. You + would only need to view the Node console if you were diagnosing issues with + Keyman Developer Server + +**Exit Keyman Developer Server** + +: Shuts down the Server. The Server can be restarted by closing and re-opening + Keyman Developer. + +## Linux and macOS + +Keyman Developer Server is included in the kmcomp.zip standalone distribution. +It requires nodeJS 16.0 or later, which should be installed according to your +platform's instructions. + +On macOS, if you use Homebrew, you can install nodeJS in Terminal: + +```shell +brew install node +``` + +You can download the latest kmcomp.zip with the following commands: + +```shell +mkdir kmcomp +cd kmcomp +curl -L https://keyman.com/go/download/kmcomp -o kmcomp.zip +unzip kmcomp.zip +``` + +To start the server, from the kmcomp folder you created earlier, run the +following command: + +```shell +cd server +npm run prod +``` + +You can stop the server at any time by pressing Ctrl+C +in the Terminal / shell. + +# Using Keyman Developer Server + +## Testing a Keyman keyboard in Keyman Developer Server + +In Keyman Developer, open a keyboard project, and load the keyboard .kmn file. +In the Build tab, click **Compile keyboard**, then click **Test keyboard on +web**. Finally, click **Open in browser** to access the keyboard in your +local Keyman Developer Server instance. + +You will be presented with the default page for Server. + +You will need to select your keyboard from the **Keyboard** menu. The keyboard will +be presented and you can test it either by typing using your hardware keyboard, +or interacting with the On-Screen Keyboard. + +![](images/server-iphone.png) + +When you make changes to your keyboard and recompile, the keyboard will be +reloaded instantly. There is no need to click the **Test keyboard on web** +button again. + +Keyman Developer Server remembers the ten most recent keyboards that you have +been testing, even after exiting and restarting. This makes it easier to switch +between projects in Keyman Developer. + +## Testing a lexical model in Keyman Developer Server + +In Keyman Developer, open a lexical model project, and load the model .model.ts +file. In the Build tab, click **Compile model**, then click **Test lexical +model**. Finally, click **Open in browser** to access the model in your local +Keyman Developer Server instance. + +You will be presented with the default page for Server. + +You will need to select a keyboard that works with the model from the +**Keyboard** menu, and also the model you have just started testing from the +**Model** menu. You will have the best results if you select a mobile device to +test the model. + +![](images/lexical-model-test.png) + +When you make changes to your model and recompile, the model will be reloaded +instantly. There is no need to click the **Test lexical model** button again. + +Keyman Developer Server remembers the ten most recent lexical models that you +have been testing, even after exiting and restarting. + +## Sharing a package to test from Keyman Developer + +In Keyman Developer, open either a keyboard or a lexical mdoel project, and load +the .kps file. In the Build tab, click **Compile package**, then click **Test +package on web**. Finally, click **Open in browser** to access the package in +your local Keyman Developer Server instance. + +The package will be available for install from the hamburger menu at the top +left of the banner. This is most useful when you access Server from another +device, as you can then easily install the package into Keyman on that device +without having to worry about copying files around manually. + +![](images/hamburger-menu.png) + +Keyman Developer Server remembers the ten most recent packages that you have +been testing, even after exiting and restarting. + +## Keyman Developer Server interface + +![](images/server-iphone.png) + +This describes the various elements of the Keyman Developer Server web interface. + +### Banner + +![](images/banner.png) + +On desktop devices, the top banner of Server includes four menus. On a mobile +device, the Device menu will not be visible, as the keyboard view will always be +the touch keyboard view at the bottom of the screen. + +### Status Bar + +![](images/status-bar.png) + +Below the banner, you will find a smaller status bar showing the currently +selected keyboard, model, and device. + +### Character Grid + +![](images/character-grid.png) + +Under this is a character preview grid, which shows you the underlying Unicode +values of the characters in your text area. This character grid also shows the +current cursor position and highlighted text, so you can easily correlate the +shaped characters with their underlying representation in Unicode. + +The example image above shows a Khmer keyboard with a sample string saying +"Khmer Language". Observe how the character preview grid shows the unshaped +underlying characters, how the order of characters stored in the text content +may differ from the presentation, and how diacritics and joined marks are +indicated with dotted circles. + +### Text Area + +![](images/text-area.png) + +The text area is immediately below this. You can enter text into this text area +using your hardware keyboard or using the On-Screen Keyboard. + +### On-Screen Keyboard + +![](images/on-screen-keyboard.png) + +The On-Screen Keyboard, shown directly below, is fully interactive, including +support for longpress and other gestures on touch, using your mouse on a +desktop device. The layout of the On Screen Keyboard and the device frame are +controlled from the **Device** menu. + +### Hamburger menu (three horizontal lines) + +![](images/hamburger-menu.png) + +**Download and install Keyman** + +: This is a shortcut to install Keyman for the current device. It detects + the type of device you are viewing this page on, and provides a direct + link to the install, whether that be a Windows executable, a Play Store + link, an App Store link or other method. + +**List of packages** + +: A list of up to ten most recent packages that you have been testing in + Keyman Developer. This will open the package in Keyman on the device, which + is most useful when testing on a mobile device or sharing the package to + other computers. + +**Upload file...** + +: Allows you to manually upload any compiled .js keyboard, compiled .model.js + lexical model, compiled .kmp file, or .ttf font to be available for testing. + This will be most useful when running Server on macOS or Linux, where + integration with the Keyman Developer IDE is not available. + + You can also drag and drop these same files onto the page. + +**Help...** + +: Opens this help site. + +**About Keyman Developer Server** + +: Provides information about the version of Keyman Developer Server. + +### Keyboard menu + +![](images/keyboard-menu.png) + +Lists up to ten keyboards that you have been testing most recently from Keyman +Developer. Select a keyboard to start testing it. + +If you select **(system keyboard)**, this disables testing of Keyman keyboards. + +### Model menu + +![](images/model-menu.png) + +Lists up to ten lexical models that you have been testing most recently from +Keyman Developer. Select a model to start testing it. Note that the +model/keyboard correlation is controlled by you within this view -- language +association is not available in Keyman Developer Server. + +While the desktop keyboard views will show predictions if a model is enabled, +this is not currently fully supported outside of Keyman Developer Server. You +will have better results selecting a touch device in the Device menu for testing +lexical models. + +If you select **(no model)**, this hides the predictions banner. + +### Device menu + +![](images/device-menu.png) + +This function is available only from desktop / laptop computers. On mobile +phones and tablets, the Device menu is hidden and only the device's default +Keyman keyboard form factor is available. + +When available, this allows you to simulate use of the devices shown, letting +you test the keyboard and/or model as you would see it and use it on that +device. The device selected changes the presentation of the keyboard, and is +reflected in the [`platform()` statement](/developer/language/reference/platform) +context as well. + +The devices listed are representative of the various types of platforms that +Keyman supports, to allow testing on each of the available form factors. + +## Making your Keyman Developer Server instance globally available with ngrok + +One of the fiddliest parts of testing keyboards and models with mobile devices +is transferring the files to your phone or tablet. Keyman Developer Server will +make files available on your local network for access, but it can be difficult +to configure firewalls and network settings successfully. + +To simplify testing, Keyman Developer Server integrates with a free tool called +[ngrok](https://ngrok.com) that provides a public URL to your instance of Keyman +Developer Server. This URL is dynamic and can change over time, and is only +available while Keyman Developer Server is running. This URL can be accessed +from any mobile device that is online, whether or not it is on your local +network. This means you can also quickly share keyboards, packages, and models +with other users, with a minimum of difficulty. + +**Warning:** While the ngrok service is running, your computer will be sharing +your Keyman Developer Server instance to anyone in the world. The Server +instance has read-only access to the keyboards that you have loaded into it, but +you may wish to turn ngrok support on only when you need it. + +ngrok does need a little bit of configuration. These steps will take you through +the process on Windows; on macOS and Linux, you will need to download and +configure ngrok manually. + +1. In Keyman Developer, open **Tools | Options**, select **Server** tab, and + click **Configure Server...**. You should be presented with a window similar + to this: + + ![](images/config.png) + +2. Tick the box **Use ngrok to provide public url for Server** +3. If ngrok is available, a version number will be shown to the right of the + **Download or update ngrok** button. Otherwise, click this button to download + the latest version. +4. You'll need a free ngrok account, so click the **Create free ngrok + account...** button to open the ngrok website, and follow the steps there + to finish the account creation process. +5. After creating the account, you should be presented with an authentication + token. You can also access this by clicking the **Get token** link in the + Keyman Developer Server Options dialog box. Paste this token into the + **Authentication token** edit box. +6. Select the most appropriate region for your location, to minimize the latency + (delay) when using the ngrok service. +7. Click **OK** to save changes, and start the ngrok service within Keyman + Developer Server. + +Once ngrok is configured, you should see an additional **Server** menu item in +Keyman Developer's **Tools** menu, with three items: + +**Open `https://some-url.ngrok.io` in browser** + +: Opens the public URL to your current Keyman Developer Server instance in the + default browser on your computer. + +**Copy URL to clipboard** + +: Copies the public URL to the clipboard so you can share it via email, instant + message, or other medium. + +**Configure...** + +: Opens the Keyman Developer Server Options dialog box. + +# Configuring Keyman Developer Server + +Keyman Developer Server has a number of configuration options. On Windows, using +Keyman Developer is the easiest way to manage these options. Open **Tools | +Options**, select **Server** tab, and click **Configure Server...**. + +![](images/config.png) + +## Configuration Files + +The configuration file `config.json` is stored in the following locations: +* Windows: `%appdata%\Keyman\Keyman Developer\Server\config.json` +* Linux: `~/.local/share/Keyman/Keyman Developer/Server/config.json` +* macOS: `~/Library/Preferences/Keyman/Keyman Developer/Server/config.json` + +## Configuration settings + +The value in parentheses is the name of the setting in `config.json`, where present. + +* **Default port** (`port`): specifies the port that Server listens on (http). + Defaults to `8008`. +* **Leave Server running after closing IDE**. This is off by default. If set, + Keyman Developer Server will start with Keyman Developer, and run until the + Windows session is finished by logging off or shutting down the computer. Keyman + Developer Server can be manually closed from the system notification area icon. +* **ngrok Settings** + * **Use ngrok to provide public url for Server** (`useNgrok`): Defaults to `false`. + Set to `true` if you want to enable use of ngrok tunnels. + * **Authentication token** (`ngrokToken`): the token provided by ngrok for setting + up a tunnel. + * **Region** (`ngrokRegion`): select the region in which you are located in order + to minimize latency through the tunnel. +* **Show Server console window on start**. This is off by default, and would only + normally be used for diagnostics or development of Keyman Developer itself. + +# Related Topics + +* [Keyboard Editor](keyboard-editor) +* [Model Editor](model-editor) +* [Package Editor](package-editor) +* [Options](options) diff --git a/developer/docs/help/guides/command-line.md b/developer/docs/help/guides/command-line.md new file mode 100644 index 00000000000..f4820281ce4 --- /dev/null +++ b/developer/docs/help/guides/command-line.md @@ -0,0 +1,9 @@ +--- +title: Keyman Developer command line tools guide +--- + +Keyman Developer has a set of command line tools for creating keyboards and +models. For more details see: + +* [`kmc` -- the Keyman command line compiler](../reference/kmc/) + diff --git a/developer/docs/help/guides/develop/advanced-keyboard-development-example.md b/developer/docs/help/guides/develop/advanced-keyboard-development-example.md new file mode 100644 index 00000000000..204d031a6a1 --- /dev/null +++ b/developer/docs/help/guides/develop/advanced-keyboard-development-example.md @@ -0,0 +1,236 @@ +--- +title: Advanced Keyboard Development Example +--- + +## Introduction + +Whenever you want to do much more in a keyboard than simple character +substitution, you will generally need to make use of advanced features +such as **stores**, **deadkeys**, and **multiple groups**. The [tutorial](tutorial) +has already shown some basic usage of stores and deadkeys, but has not +covered other possibilities of their use. In this topic we will examine +a keyboard that demonstrates some other uses of stores and deadkeys, and +introduces the use of multiple groups for complex processing. + +We recommend that you read the topics on +[groups](/developer/language/guide/groups), +[stores](/developer/language/guide/stores), and +[deadkeys](/developer/language/reference/deadkey) before continuing. + +The keyboard we will examine is **IPAMenu.kmn** (found in the Keyman +Developer Samples folder), which contains the beginnings of a menu-based +keyboard for using the International Phonetic Alphabet (IPA). You will +need a Unicode font with IPA characters (such as **Gentium**) to +properly use this keyboard, but you should be able to follow the code +even without. For more information about the IPA, see [The International +Phonetic +Association](https://www.internationalphoneticassociation.org/). + +Most of the IPA glyphs are derived from glyphs in the Latin alphabet, +used to represent differing sounds used in language. Because of this, it +seemed reasonable to place all glyphs derived from "a" on the "a" key, +and so on. We have implemented a few of the vowel symbols in this keyboard: + +![](../../images/ipa.gif) + + +## Overview of the Keyboard + +The basic operation of the keyboard is the displaying of a menu when a +key is pressed, followed by the output of a single character when the +user makes a selection from that menu with a number key. + +The first thing to notice is the organisation of most of the input and +output into stores: + +```keyman +store( choices ) '1234567890' +store( a_menu ) '[1æ 2a 3ɑ 4ɐ 5ʌ 6ɒ]' +store( e_menu ) '[1ɛ 2ɜ 3ə 4e 5ɘ 6ɚ 7ɝ 8ɞ]' +store( o_menu ) '[1o 2ø 3ɔ]' +store( a_chars ) 'æaɑɐʌɒ' dk(a_err) dk(a_err) dk(a_err) dk(a_err) +store( e_chars ) 'ɛɜəeɘɚɝɞ' dk(e_err) dk(e_err) +store( o_chars ) 'oøɔ' dk(o_err) dk(o_err) dk(o_err) dk(o_err) dk(o_err) dk(o_err) dk(o_err) +``` + +An important point to notice is the use of deadkeys in these stores: +we'll explain their purpose here later. + +The next thing that stands out is that the file has six separate groups, +four of which handle keystrokes and two which manipulate context only: + +```keyman +group( first ) + +group( main ) using keys + +group( final ) + +group( a_group ) using keys + +group( e_group ) using keys + +group( o_group ) using keys +``` + +## Full source + +The full keyboard source is shown below. Refer to this when following +the description after. + +```keyman +c IPAMenu.kmn +c +c Copyright ©2002 Tavultesoft. +c +c Demonstrates simple use of multiple groups to create a menu-based +c system for entering IPA characters, based on an example created +c by Peter E. Hauer's. +c +c A font with the IPA unicode characters defined must be used with this +c keyboard, for example, Code2000 or Lucida Sans Unicode +c +c Note that the stores pertaining to each letter could be placed in the +c group for that letter; the location of stores in the keyboard source +c has no effect on the final keyboard. + +Version 6.0 +Name "IPA Menu Example" + +c This keyboard should be independent of the user's +c system keyboard layout +store(&MnemonicLayout) '1' + +c ******************************************************************* +begin Unicode > use( first ) + +c keys used to choose menu items +store( choices ) '1234567890' + +c menu stores +store( a_menu ) '[1æ 2a 3ɑ 4ɐ 5ʌ 6ɒ]' +store( e_menu ) '[1ɛ 2ɜ 3ə 4e 5ɘ 6ɚ 7ɝ 8ɞ]' +store( o_menu ) '[1o 2ø 3ɔ]' +c add more menu stores here + +c character choice stores - error deadkeys are used to pad +c out the stores so they are the same length as the choices store +store( a_chars ) 'æaɑɐʌɒ' dk(a_err) dk(a_err) dk(a_err) dk(a_err) +store( e_chars ) 'ɛɜəeɘɚɝɞ' dk(e_err) dk(e_err) +store( o_chars ) 'oøɔ' dk(o_err) dk(o_err) dk(o_err) dk(o_err) dk(o_err) dk(o_err) dk(o_err) +c add more char stores here + +c ******************************************************************* +c first matches a menu in the context or passes processing to main +group( first ) + c match a menu on the context + outs(a_menu) > use(a_group) + outs(e_menu) > use(e_group) + outs(o_menu) > use(o_group) + c add more menus here + + c no menu was in the context, so process keys normally + nomatch > use(main) + +c ******************************************************************* +c main outputs the menus, and handles any other normal key processing +group( main ) using keys + c output a menu if appropriate + + 'a' > outs(a_menu) + + 'e' > outs(e_menu) + + 'o' > outs(o_menu) + c add more menu keys here + +c ******************************************************************* +c final matches error markers and finishes processing +group( final ) + dk(a_err) > beep outs(a_menu) + dk(e_err) > beep outs(e_menu) + dk(o_err) > beep outs(o_menu) + c add more error-marker handlers here + +c ******************************************************************* +c a_group handles the menu for a +group( a_group ) using keys + + any(choices) > index(a_chars, 1) use( final ) c output chosen character + + [K_BKSP] > nul c delete menu + nomatch > dk(a_err) use( final ) c invalid choice - error + +c ******************************************************************* +c e_group handles the menu for e +group( e_group ) using keys + + any(choices) > index(e_chars, 1) use( final ) c output chosen character + + [K_BKSP] > nul c delete menu + nomatch > dk(e_err) use( final ) c invalid choice - error + +c ******************************************************************* +c o_group handles the menu for o +group( o_group ) using keys + + any(choices) > index(o_chars, 1) use( final ) c output chosen character + + [K_BKSP] > nul c delete menu + nomatch > dk(o_err) use( final ) c invalid choice - error + +c add more menu groups here + +c End of file +``` + +## Primary Operation of the Keyboard + +When a key is pressed, execution begins at the group indicated by the +`begin` statement, in this case the `first` group. Because this group +does not specify `using keys`, it is limited to context manipulation +only: the output of this rule is dependent only on what came before the +current keystroke, and becomes the context for any further groups that +are called from this one. + +Let's suppose the a key has been pressed with no context. The `first` group will have nothing to match on, so the +`nomatch` rule fires and passes control to the `main` group. Here the +"a" key is matched, and the `a_menu` store is output, displaying the +menu of a-like characters. + +Now the user is presented with a menu of options to choose from. Suppose +he types 1 Once again the `first` group gains +control first, but this time matches the first rule, with the `a_menu` +string on the context, so control is passed to the `a_menu` group to +handle the keystroke. + +Here the 1 is matched as an entry in the `choices` store, and the corresponding character in the +`a_chars` store - in this case "æ" - is output. Finally, control goes +from here to the `final` group, which fails to match anything in the +context (which now includes the output from the previous group). + +## Error Handling + +One issue this keyboard has to deal with is if the user tries to select +an option that's not in the menu - when this happens, it should beep and +remain at the menu, so the user can try again. Also, if the user wants +to dismiss the menu, we should allow the use of Backspace to delete it - +this is simply done with a rule matching `[K_BKSP]` and outputting +`nul`. + +There are two rules which handle the user selecting a nonexistent +option: if the current menu has fewer than 10 entries, the user can +press a number key indicating a menu entry that is not there - this +situation will be matched by the `any(choices)` rule. The other occasion +is if the user presses any other key which is not valid for selecting a +menu option. This is handled by the `nomatch` rule in the group. For +both these cases we want the output to be the same: a `beep`, and remain +at the menu. To do this we will use deadkeys as error flags, one for +each menu. By padding the `a_char`, `e_char` and `o_char` stores to 10 +characters with these deadkeys, the output for this first situation will +be the error flag. Similarly, we can output these deadkeys in the +`nomatch` rules, to mark an error. + +The actual error handling is now done with the `final` group, which +matches the error flags on the output and outputs the `beep` and the +appropriate menu again. + +## Conclusion + +Although this example went nowhere near the limits of what can be done +with multiple groups, it gave a demonstration of some of the ways +multiple groups can be made to interact for more powerful processing. +You should now have some understanding of the use of advanced features +in Keyman Developer, and be able to begin using them to improve your +keyboards. \ No newline at end of file diff --git a/developer/docs/help/guides/develop/creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty.md b/developer/docs/help/guides/develop/creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty.md new file mode 100644 index 00000000000..21bf08df14b --- /dev/null +++ b/developer/docs/help/guides/develop/creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty.md @@ -0,0 +1,754 @@ +--- +title: Creating a Touch Keyboard Layout Part 2 +--- + +

+ +This article will continue the guide to creating a touch keyboard layout. In +particular, we'll look in more detail at how keys are arranged, just what can be +specified for each key, and lastly, how this all looks in the JSON code used to +define the long press layout. + +## Key and Key Layer Organization + +There are two issues that are immediately apparent when considering key layout +on touch devices. + +First, on smaller touch devices, such as phones, if we try to display the same +arrangement of keys that is used for a typical desktop keyboard, the keys are so +small that it is difficult to reliably select the wanted key. If used in +'portrait' view, key widths are too narrow for our 'fat fingers': + +![](../../images/touch_amharic_keyboard_4.png) + +Or if in 'landscape' view, key heights are too small: + +![](../../images/touch_amharic_keyboard_5.png) + +The situation is improved markedly if we limit the number of keys per row to ten +and have no more than four key rows: + +![](../../images/touch_amharic_keyboard_6.png) + +and, in landscape view: + +![](../../images/touch_amharic_keyboard_7.png) + +So which keys can be eliminated, and which keys must be on the base (default) +layer? This brings us to the second point. When using phones and other touch +layout devices rather than desktop keyboards, text entry is most often +single-handed, which makes it best to avoid using the 'shift' layer for entering +normal text. Secondary keyboard layers will, of course, still be usually needed +for uppercase, numerals and symbols, but will be used much less frequently. + +Most desktop keyboards (for European languages, at least) are already laid out +with no more than ten letter (or digit) keys per row, with the remaining keys +being used for accented letters, punctuation and other non-letter input. So the +obvious choice is to move non-letter keys (and accented letters) either to a +secondary key layer, or to long press ('pop-up') keys. The GFF Amharic desktop +keyboard is fortunately also arranged with only ten letters per key row (other +keys being used for punctuation, etc.), as the many different characters in the +Amharic 'abugida' are generated by multi-letter sequences rather than being +displayed on separate keys. The Geez script does not have both upper-case and +lower-case forms, so those initial consonants that require use of the 'shift' +layer on the desktop keyboard have been added to the corresponding base-layer +key as long press keys: + +![](../../images/touch_amharic_keyboard_8.png) + +Arrangement of punctuation and other non-letter keys is more flexible as mobile +users are generally familiar with using long press keys or a secondary key layer +for finding and entering digits and special characters. However, some +punctuation characters are used so frequently that they need to be on the base +layer. For the GFF Amharic keyboard, the most frequently used punctuation +characters can be output from the base layer using standard or long press keys. +The Geez word space character, in particular, is so frequently used that it was +considered useful to add it to the bottom key, adjacent to the space bar, as is +sometimes done for other scripts, such as Japanese, on desktop (physical) +keyboards. + +## Arranging keys with the layout editor + +The Keyman Developer layout editor really makes it quite easy to try different +key layouts and choose what is best for your keyboard. The image below +highlights just how, for any selected key, using the clickable icons circled, a +key row can be added above (1) or below (2), a key added before (3) or after +(4), the selected key deleted (5), and how an array of long press keys +(sometimes called "subkeys") can be added (6). + +![](../../images/touch_amharic_keyboard_9.png) + +## Key properties + +For each visual key, the appearance and behaviour is determined by a number of +properties: + +### Key code + +Each key must be given an identifying key code which is unique to the key layer. +Key codes by and large correspond to the virtual key codes used when creating a +keyboard program for a desktop keyboard, and should start with `K_`, for keys +mapped to standard Keyman virtual key names, e.g. `K_HYPHEN`, and `T_` or `U_` +for user-defined names, e.g. `T_ZZZ`. If keyboard rules exist matching the key +code in context, then the output from the key will be determined by the +processing of those rules. It is usually best to include explicit rules to +manage the output from each key, but if no rules matching the key code are +included in the keyboard program, and the key code matches the pattern +`U_xxxx[_yyyy...]` (where `xxxx` and +`yyyy` are 4 to 6-digit hex strings), then the Unicode characters +`U+xxxx` and `U+yyyy` will be output. As of Keyman 15, you +can use more than one Unicode character value in the id (earlier versions +permitted only one). The key code is always required, and a default code will +usually be generated automatically by Keyman Developer. + +- `K_xxxx` is used for a standard Keyman Desktop key name, e.g. + `K_W`, `K_ENTER`. You cannot make up your own `K_xxxx` names. + Many of the `K_` ids have overloaded output behaviour, for instance, if no + rule is matched for `K_W`, Keyman will output 'w' when it is touched. The + standard key names are listed in [Virtual Keys and Virtual Character + Keys](/developer/language/guide/virtual-keys "Virtual Keys and Virtual +Character Keys"). Typically, you would use only the "common" virtual key + codes. + +- `T_xxxx` is used for any user defined names, e.g. `T_SCHWA`. If you wanted + to use it, `T_ENTER` would also be valid. If no rule matches it, the key + will have no output behaviour. + +- `U_####[_####]` is used as a shortcut for a key that will output those + Unicode values, if no rule matches it. This is similar to the overloaded + behaviour for `K_` ids. Thus `####` must be valid Unicode characters. E.g. + `U_0259` would generate a schwa if no rule matches. It is still valid to + have a rule such as `+ [U_0259] > ...` + +As noted above, some `K_xxxx` codes emit characters, if no rule is defined. +There are also some codes which have special functions: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentifierMeaning
`K_ENTER`Submit a form, or add a new line (multi-line); the key action may vary depending on the situation.
`K_BKSP`Delete back a single character. This key, if held down, will repeat. It is the only key code which triggers + repeat behavior.
`K_LOPT`Open the language menu (aka Globe key).
`K_ROPT`Hide the on screen keyboard.
`K_TAB`, `K_TABBACK`, `K_TABFWD`Move to next or previous element in a form. Note that these key functions are normally + implemented outside the touch layout, so should not typically be used. `K_TAB` will go to previous + element if used with the `shift` modifier.
+ +Any key can be used to switch keyboard layers (see +[`nextlayer`](#toc-nextlayer)), but the following layer-switching key codes have +been added for switching to some commonly used secondary layers. Note that these +keys have no specific meaning; you must still set the `nextlayer` property on +the key. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentifierMeaning
`K_NUMERALS`Switch to a numeric layer
`K_SYMBOLS`Switch to a symbol layer
`K_CURRENCIES`Switch to a currency layer
`K_SHIFTED`Switch to a shift layer
`K_ALTGR`Switch to a right-alt layer (desktop compatibility)
+ +### Key text + +The key text is simply the character (or characters) that you want to appear on +the key cap. This will usually be the same as the characters generated when the +key is touched, unless contextual rules are used to generate output according to +a multi-key sequence, as will be true for the GFF Amharic keyboard. Unicode +characters can be specified either as a string using a target font or using the +standard hex notation `\uxxxx`. This may be sometimes more convenient, for +example, for characters from an uninstalled font, or for diacritic characters +that do not render well alone. + +A number of special text labels are recognized as identifying special purpose +keys, such as Shift, Backspace, Enter, etc., for which icons are more +appropriately used than a text label. A special font including these icons is +included with Keyman and automatically embedded and used in any web page using +Keyman. The list of icons in the font will probably be extended in future, but +for now the following special labels are recognized: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Text StringKey CapKey Purpose
`*Shift*`Select Shift layer (inactive). Use on the Shift key to indicate that it switches to the shift layer.
`*Shifted*`Select Shift layer (active). Use on the Shift key on the shift layer to switch back to the default layer.
`*ShiftLock*`Switch to Caps layer (inactive). Not commonly used; generally double-tap on Shift key is used to access the + caps layer.
`*ShiftedLock*`Switch to Caps layer (active). Use on the Shift key on the caps layer to switch back to the default layer. +
`*Enter*` or Return or Enter key (shape determined by writing system direction)
`*LTREnter*`Return or Enter key (left-to-right script shape)
`*RTLEnter*`Return or Enter key (right-to-left script shape)
`*BkSp*` or Backspace key (shape determined by writing system direction)
`*LTRBkSp*`Backspace key (left-to-right script shape)
`*RTLBkSp*`Backspace key (right-to-left script shape)
`*Menu*`Globe key; display the language menu. Use on the `K_LOPT` key.
`*Hide*`Hide the on screen keyboard. Use on the `K_ROPT` key.
`*ABC*`Select alphabetic layer (Uppercase)
`*abc*`Select alphabetic layer (Lowercase)
`*123*`Select the numeric layer
`*Symbol*`Select the symbol layer
`*Currency*`Select the currency symbol layer
`*ZWNJ*` (iOS) or  (Android)Zero Width Non Joiner (shape determined by current platform)
`*ZWNJiOS*`Zero Width Non Joiner (iOS style shape)
`*ZWNJAndroid*`Zero Width Non Joiner (Android style shape)
`*ZWNJGeneric*`Zero Width Non Joiner (not platform-specific)
`*Sp*`Regular space
`*NBSp*`No-Break Space
`*NarNBSp*`Narrow No-Break Space
`*EnQ*`En Quad
`*EmQ*`Em Quad
`*EnSp*`En Space
`*EmSp*`Em Space
`*PunctSp*`Punctuation Space
`*ThSp*`Thin Space
`*HSp*`Hair Space
`*ZWSp*`Zero Width Space
`*ZWJ*`Zero Width Joiner
`*WJ*`Word Joiner
`*CGJ*`Combining Grapheme Joiner
`*LTRM*`Left-to-right Mark
`*RTLM*`Right-to-left Mark
`*SH*`Soft Hyphen
`*HTab*`Horizontal Tabulation
+ +The following additional symbols are also available, but intended for working +with legacy desktop layouts, and not recommended for general use: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Text StringKey CapKey Purpose
`*Tab*`Move to next input element in tab order
`*TabLeft*`Move to previous input element in tab order
`*Caps*`Select caps layer (legacy)
`*AltGr*`Select AltGr (Right-Alt) layer (desktop layout compatibility)
`*Alt*`Select Alt layer (desktop layout compatibility)
`*Ctrl*`Select Ctrl layer (desktop layout compatibility)
`*LAlt*`Select Left-Alt layer (desktop layout compatibility)
`*RAlt*`Select Right-Alt layer (desktop layout compatibility)
`*LCtrl*`Select Left-Ctrl layer (desktop layout compatibility)
`*RCtrl*`Select Right-Ctrl layer (desktop layout compatibility)
`*LAltCtrl*`Select Left-Alt-Ctrl layer (desktop layout compatibility)
`*RAltCtrl*`Select Right-Alt-Ctrl layer (desktop layout compatibility)
`*LAltCtrlShift*`Select Left-Alt-Ctrl-Shift layer (desktop layout compatibility)
`*RAltCtrlShift*`Select Right-Alt-Ctrl-Shift layer (desktop layout compatibility)
`*AltShift*`Select Alt-Shift layer (desktop layout compatibility)
`*CtrlShift*`Select Ctrl-Shift layer (desktop layout compatibility)
`*AltCtrlShift*`Select Alt-Ctrl-Shift layer (desktop layout compatibility)
`*LAltShift*`Select Left-Alt-Shift layer (desktop layout compatibility)
`*RAltShift*`Select Right-Alt-Shift layer (desktop layout compatibility)
`*LCtrlShift*`Select Left-Ctrl-Shift layer (desktop layout compatibility)
`*RCtrlShift*`Select Right-Ctrl-Shift layer (desktop layout compatibility)
+ +### Key type + +The general appearance of each key is determined by the key type, which is +selected (in Keyman Developer) from a drop-down list. While generally behavior +is not impacted by the key type, Spacer keys cannot be selected. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key TypeValueMeaning
Default`0`Any normal key that emits a character
Special`1`The frame keys such as Shift, Enter, BkSp.
Special (active)`2`A frame key which is currently active, such as the Shift key on the shift layer.
Deadkey`8`Does not impact behavior, but colors the key differently to indicate it has a special function, such as a + desktop-style deadkey.
Blank`9`A blank key, which may be used to maintain a layout shape. Usually colored differently. Does not impact + behavior.
Spacer`10`Does not render the key, but leaves a same-sized gap in its place. The key cannot be selected.
+ +The colour, shading and borders of each key type is actually set by a style +sheet which can be customized by the page developer. + +### font-family + +If a different font is required for a particular key text, the `font-family` +name can be specified. The font used to display icons for the special keys (as +mentioned above) does not need to be specified, as it will be automatically +applied to a key that uses any of the special key text labels. + +### font-size + +If a particular key cap text requires a different font size from the default for +the layout, it should be specified in em units. This can be helpful if a the key +text is either an unusually large character or, alternatively, a word or string +of several characters that would not normally fit on the key. + +### width + +The layout is scaled to fit the widest row of keys in the device width, assuming +a default key width of 100 units. Keys that are to be wider or narrower than the +default width should have width specified as a percentage of the default width. +For any key row that is narrower than the widest row, the width of the last key +in the row will be automatically increased to align the right hand side of the +key with the key with the right edge of the keyboard. However, where this is not +wanted, a "spacer" key can be inserted to leave a visible space instead. As +shown in the above layouts, where the spacer key appears on the designer screen +as a narrow key, but will not be visible in actual use. + +### pad + +Padding to the left of each key can be adjusted, and specified as a percentage +of the default key width. If not specified, a standard padding of 5% of the key +width is used between adjacent keys. + +### layer + +To simplify correspondence with desktop keyboards and avoid the need for using a +separate keyboard mapping program, touch layout keys can specify a desktop +keyboard layer that the keystroke should be interpreted as coming from. Layer +names of `shift`, `ctrl`, `alt`, `ctrlshift`, `altshift`, `ctrlalt` and +`ctrlaltshift` can be used to simulate use of the appropriate modifier keys when +processing rules. + +### nextlayer + +The virtual keys `K_SHIFT`, `K_CONTROL`, `K_MENU`, etc. are normally used to +switch to another key layer, which is implied by the key code. The left and +right variants of those key codes, and also additional layer-switching keys +mentioned above (`K_NUMERALS`, `K_SYMBOLS`, `K_CURRENCIES`, `K_ALTGR`) can also +be used to automatically switch to the appropriate key layer instead of +outputting a character. However, it is sometimes useful for a key to output a +character first, then switch to a new layer, for example, switching back to the +default keyboard layer after a punctuation key on a secondary layer had been +used. Specifying the `nextlayer` for a key allows a different key layer to be +selected automatically following the output of the key. Of course, that can be +manually overridden by switching to a different layer if preferred. + +Another way the `nextlayer` property can be used is for a non-standard layer +switching key. So, for example, for the GFF Amharic keyboard phone layout, +switching back to the base layer uses a `T_ALPHA` key code, in which `nextlayer` +is set as default. In this case, it is also necessary to add a rule to the +keyboard program: + +```keyman ++ [T_ALPHA] > nul +``` + +to ensure that the key's scan code is ignored by the keyboard mapping. + +When a key in a touch layout definition includes a **Next Layer** control, this +takes precedence over setting layer via the +[`layer`](/developer/language/reference/layer) store (as the **Next Layer** +control is applied once the rule has finished processing). + +### subkey + +Arrays of longpress 'subkeys' or pop-up keys can be defined for any key, and +will appear momentarily after the key is touched if not immediately released. +This provides a major advantage over physical desktop keyboards in that many +more keys can be made available from a single layer, without cluttering up the +basic appearance of the layout. For the GFF Amharic keyboard, we have already +noted how such subkey arrays are used to manage the extra keys that, on the +desktop keyboard, would appear in the shift layer. But they are also used to +provide another way to enter the two different types of each syllable-initial +vowels (glottal or pharyngeal), as a visual alternative to pressing the key +twice. + +The same properties that are defined for standard keys can also be specified for +each subkey except that the width of each key in a subkey array will always be +the same as the width of the key that causes the subkeys to be shown, and key +spacing always uses the default padding value. + +The GFF Amharic keyboard, like many others, is mnemonic, so it is useful to also +display the standard key cap letter that would appear on the key of a desktop +keyboard. This is enabled globally in the On-Screen layout editor and applies to +both the On-Screen keyboard and touch layouts. + +## Representing (and editing) the visual layout with JSON code + +In case you are wondering, 'Why do I need to know that?', the reason is that, +just as with keyboard mapping code, it is sometimes easier to edit a text +specification than to use the GUI layout design tool. Keyman Developer switches +seamlessly between the visual layout tool and the code editor, unless, of +course, careless editing of the code results in invalid JSON syntax! + +The GFF Amharic phone layout code starts as: + +```javascript + { + "phone": { + "font": "Tahoma", + "layer": [{ + "id": "default", + "row": [{ + "id": 1, + "key": [{ + "id": "K_Q", + "text": "ቅ", + "pad": "0" + }, { + "id": "K_W", + "text": "ው" + }, + + . . . +``` + +As long as standard JSON syntax is remembered - nested braces {…}, quoted +strings "…" for both element names and values, element or object arrays in +square brackets […], and no trailing comma after the last element in an array - +it is quite easy to understand a layout, which will usually comprise a list of +two separate JSON objects for tablet and phone. + +Now you're ready to create a great touch layout for your own Keyman keyboard! + +Other articles on developing touch layouts: + +- [Creating a touch keyboard layout for Amharic - part 1](creating-a-touch-keyboard-layout-for-amharic) +- [How to test your keyboard layout — touch and desktop](../test/keyboard-touch-and-desktop) + +You can distribute your keyboard to other users by following the instructions in +this article: + +- [Distribute keyboards to Keyman applications](../distribute/packages) diff --git a/developer/docs/help/guides/develop/creating-a-touch-keyboard-layout-for-amharic.md b/developer/docs/help/guides/develop/creating-a-touch-keyboard-layout-for-amharic.md new file mode 100644 index 00000000000..3dc96dfc950 --- /dev/null +++ b/developer/docs/help/guides/develop/creating-a-touch-keyboard-layout-for-amharic.md @@ -0,0 +1,124 @@ +--- +title: Creating a Touch Keyboard Layout Part 1 +--- + +This article describes the approach taken and some of the issues encountered when adapting the existing GFF‑AMH‑7 Amharic keyboard for easier use on phone and tablet touch screen devices. + +A widely used Keyman Desktop phonetic keyboard for Amharic (developed by Geez Frontier Foundation) was also compiled and made available for use with KeymanWeb. When used with web browsers on desktop computers, the behaviour of the keyboard was identical to use with Keyman Desktop, but use of the same Amharic keyboard on smart phones or other touch screen devices revealed a number of weaknesses in the layout. + +### Background + +The desktop layout has a default layer and a shift layer which are fairly similar: + +![](../../images/touch_amharic_keyboard.png) + + +Several keycaps have more than one Geez script letter, indicating that pressing the key twice changes the character output. Geez script is better understood as an Abugida, rather than an alphabet, since each consonant-vowel syllable is a modification of the original letter rather than having separate letters for consonant and vowel. So when entering Amharic, the form of a consonant changes from the default syllable form to the appropriate syllable character for the consonant and vowel pressed. However, as each vowel can also occur in stand-alone syllables as either pharyngeal or glottal forms, the two separate syllables for each vowel are shown on the "a", "e", "i", "o" and "u" keys. + +But what about the extra characters on the "s" and "h" keys? Amharic (like most Semitic languages) is rich in fricative sounds, and Geez has four separate, distinct phonemes that are roughly similar to the English +"s", and three similar to "h". The desktop layout handles this by using +repeated keystrokes in combination with shift to select the alternate +consonants (before typing the appropriate vowel). That works for a +desktop keyboard, but not for a touch screen device, for which it is +often impractical to hold a shift key while touching another key. + +Small format touch-screen devices such as phones have a further +difficulty in that if they display the full number of key rows and keys +in each row that appear in the desktop layout, the keys are too small +for convenient use. + +On the other hand, touch screen devices offer one very significant +advantage over layouts based on a physical keyboard - it is quite easy +to configure dynamic touch screen layouts to display contextually +appropriate character alternates in separate key windows as each key is +touched. + +### Design goals + +With the above background, the following design goals were set for +developing a touch screen layout for Amharic: +- Maintain the same basic phonetic layout functionality that users are familiar with. +- Instead of having "default" and "shift" layers, design the layout so that all alphabetic text and frequently used punctuation can be entered from a single layer, moving less commonly used punctuation and symbols to the second "symbol" layer. +- Use a dynamic window rather than the shift key to select the initial "s" or "h" consonant for a syllable. +- Use a separate key (adjacent to the space bar) for the Ethiopic word-space character, instead of requiring shift + space to be pressed. +- For tablet devices, increase key size slightly by removing most non-letter keys from each row, moving them either to dynamic ("pop-up") key windows, or to the symbol layer. +- For phones and other small-format devices, further increase the key size by not displaying the digits in the default (alphabetic) layer, and moving many of the less commonly used characters to dynamic windows, reducing the number of key rows by one for each layer. + +### Implementation + +Achieving the design goals required making a number of decisions for +each format (tablet and phone), in particular: + +- Which keys can be removed from the default layer? +- Which keys can be removed from the symbol layer? +- Which "pop-up" keys should be grouped with each base character? + +Keyman Developer 17's Touch Layout editor greatly simplifies the process +of developing the JSON layout file that specifies the touch layout for +each device, making it easy to move keys around, create pop-up key +arrays, and adjust key widths, labels and other parameters. While the +graphical interface does not allow moving entire key rows between layers +or device types, that is easily managed using the code window. + +To keep a keyboard compatible with the desktop version, it is important +to use the same key identifiers and "shift states". So, no matter +whether a particular character occurs in a visible row or in a pop-up +array, it should usually use the same code as on the original desktop +layout keyboard. + +Where a key did not occur in the original layout and does not correspond +to a desktop layout key, identifiers will usually be something like +T\_<name> where <name> will typically be a Unicode character +name, or an obvious contraction of it. Note that this is just a rule of +thumb and key identifiers can be anything that makes sense. Such keys +are distinct from the K\_<name> identifiers that are associated +with physical keys, and should normally have a mapping rule added +explicitly to the mapping program. If no rule is added, output will +default to the keycap text, but this is not recommended. + +All key "rotations" - pressing the same key repeatedly to select from +alternate output characters - in the original desktop keyboard program +are still supported, but have been supplemented by pop-up key arrays, +allowing a user to visually select the wanted character instead of +stepping through alternates. Similarly, Ethiopian numerals can be +selected from a pop-up key array attached to each numeral key, as well +as being output by pressing the single quote key before a digit key. + +The final tablet default keyboard layer, as displayed in the Touch +Layout editor in the previous release of Keyman Developer 10, now appears +as: + +![](../../images/touch_amharic_keyboard_2.png) + +Here the editor is shown with the "s" key selected, displaying the +pop-up key array with the four different Geez characters that can be +produced, each of which will combine as necessary with any subsequently +typed vowel. + +For the small format (e.g. iPhone) layout, the two keyboard layers are: + +![](../../images/touch_amharic_keyboard_3.png) + +For these layouts, the row length has been reduced to the minimum number +of ten keys, moving backspace to another row. The numerals only appear +on the second layer, as is usual with phone layouts. All less-frequently +used keys are now available only in pop-up key windows. + +### Summary + +With these principles guiding all the changes made, the Amharic keyboard +now adapts to various device form factors, making use of device-specific +usability factors, while retaining the same conceptual input model as +the original keyboard. This means that users can use the keyboard layout +on different devices with a minimum of difficulty. These methods should +be applicable to other keyboard layouts. + +Other articles on developing touch layouts: + +- [Creating a touch keyboard layout for Amharic - the nitty gritty](creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty) +- [How to test your keyboard layout — touch and desktop](../test/keyboard-touch-and-desktop) + +You can distribute your keyboard to other users by following the +instructions in this article: + +- [Distribute keyboards to Keyman applications](../distribute/packages) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/imx/imxdll.md b/developer/docs/help/guides/develop/imx/imxdll.md new file mode 100644 index 00000000000..8d4fe029bcd --- /dev/null +++ b/developer/docs/help/guides/develop/imx/imxdll.md @@ -0,0 +1,115 @@ +--- +title: DLL Exports +--- + +The DLL is called from Keyman with `LoadLibrary()`. All functions are +then found with `GetProcAddress()`. You must ensure that the function +exports do not have ordinals encoded in the names. The best way to +accomplish this in C/C++ is to use a .def file. + +## DLL group function exports + +The function declaration for the DLL group function is: + +```c +BOOL WINAPI KeyEvent(HWND hwndFocus, WORD KeyStroke, WCHAR KeyChar, DWORD ShiftFlags); +``` + +Note that `KeyEvent()` is a placeholder for any name that you wish to +use. You can have multiple exports for Keyman use in a single DLL. + +| | | +|------------|-------| +| hwndFocus | The currently focused window. You will probably never have a need to use this. | +| KeyStroke | The virtual key code for the current key. | +| KeyChar | The character code for the current key (based on US English layout).
This will be `0` if _KeyStroke_ does not generate a character (e.g. function keys). | +| ShiftFlags |The shift state for the current key. The following shift states are possible:
(see the table below) | + +| Flag | Value | Description | +|--------------|----------|----------------------------------------| +| LCTRLFLAG | `0x0001` | Left Control Flag | +| RCTRLFLAG | `0x0002` | Right Control Flag | +| LALTFLAG | `0x0005` | Left Alt Flag | +| RALTFLAG | `0x0008` | Right Alt Flag | +| K_SHIFTFLAG | `0x0010` | Shift flag | +| K_CTRLFLAG | `0x0020` | Ctrl flag (unused here; see l/r flags) | +| K_ALTFLAG | `0x0040` | Alt flag (unused here; see l/r flags) | +| CAPITALFLAG | `0x0100` | Caps lock on | +| NUMLOCKFLAG | `0x0400` | Num lock on | +| SCROLLFLAG | `0x1000` | Scroll lock on | +| ISVIRTUALKEY | `0x4000` | It is a Virtual Key Sequence | + +## Optional DLL Exports + +Keyman recognises a number of other exports, if they are defined in the +DLL. None of these are required. These functions will be called when a +keyboard that references the DLL is manipulated. They will not be called +for keyboards that do not reference the DLL. + +The following exports are available: + +### KeymanIMInit + +```c +BOOL WINAPI KeymanIMInit(PSTR keyboardname); +``` + +`KeymanIMInit()` is called once when the keyboard identified by +`keyboardname` is loaded for a given process. It is called for each +process in which the keyboard is loaded. + +### KeymanIMDestroy + +```c +BOOL WINAPI KeymanIMDestroy(PSTR keyboardname); +``` + +This is called once when the keyboard identified by `keyboardname` is +unloaded in a given process. It is called when the process exits +normally, or when Keyman refreshes its keyboard list after keyboards are +added or removed. If the keyboard is subsequently reloaded, +`KeymanIMInit()` will be called again. + +### KeymanIMActivate + +```c +BOOL WINAPI KeymanIMActivate(PSTR keyboardname); +``` + +This function is called whenever the user or a program activates the +keyboard. It is never called before `KeymanIMInit()` (unless +`KeymanIMInit()` is not exported). This is an appropriate place to +switch on permanently-visible IMC windows. `KeymanIMActivate()` can also +be called when switching processes and the target process has a related +keyboard already active. + +### KeymanIMDeactivate + +```c +BOOL WINAPI KeymanIMDeactivate(PSTR keyboardname); +``` + +This function is called when the user or a program switches off a +related keyboard. It is always called before `KeymanIMActivate()` for +the next keyboard. It will also be called when the user activates +another process, to give the DLL a chance to hide top-most IMC windows. + +### KeymanIMConfigure + +```c +BOOL WINAPI KeymanIMConfigure(PSTR keyboardname, HWND hwndParent); +``` + +`KeymanIMConfigure()` is called when the user clicks the Configure +button in Keyman Configuration to configure the DLL-specific +functionality for the keyboard. The appropriate behaviour is to display +a dialog box, and save the settings in the registry. + +This function is separate from all the other functions. It can be called +when there are no keyboards loaded, or even if Keyman itself is not +loaded. You should not attempt to call Keyman32.dll from this function. + +## See also + +- [DLL Interface for Keyman - Introduction](index) +- [The imlib.cpp library module](imxlib) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/imx/imxlib.md b/developer/docs/help/guides/develop/imx/imxlib.md new file mode 100644 index 00000000000..178ae0f3eff --- /dev/null +++ b/developer/docs/help/guides/develop/imx/imxlib.md @@ -0,0 +1,208 @@ +--- +title: The imlib.cpp library module +--- + +imlib.cpp, included in the development kit, contains a set of useful +functions for interfacing to Keyman. + +## PrepIM + +```c +BOOL PrepIM(void); +``` + +`PrepIM()` initialises the Keyman32 imports. You should not call any of +the Keyman imports without calling `PrepIM()` first. If `PrepIM()` +fails, you should exit without doing any processing. + +## IMDefWindowProc + +```c +BOOL IMDefWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult); +``` + +`IMDefWindowProc()` should be called from an IMC window procedure (see +section titled Input Method Composition windows). If it returns `TRUE` +you should return the value stored in `lResult` without any further +processing. `IMDefWindowProc()` mostly manages window activation and +movement. + +## Keyman Imports + +The DLL can call Keyman functions to interact with Keyman and the target +application. It should not attempt to directly control the application +as Keyman will be doing this. You should never call any of the functions +here from the `KeymanIMConfigure()` callback. + +You can use `PrepIM()`, declared in imlib.cpp to get access to the the +Keyman functions. When using imlib.cpp, the functions are declared as +pointers, so you need to dereference them to call them in C (e.g. for +KMGetContext, call `(*KMGetcontext)(buf,len);`) + +## KMGetContext + +```c +BOOL WINAPI KMGetContext(PWSTR buf, DWORD len); +``` + +`KMGetContext()` returns the last `len-1` UTF-16 codepoints of the +context stack. If there are not enough characters in the context stack, +it will return as many as it can. On success, the `buf` variable will be +null terminated. + +The context stack can contain a special code for deadkeys. See +`KMQueueAction()` for a way to output a deadkey. The code sequence for a +deadkey is (3 words): + +``` +UC_SENTINEL, CODE_DEADKEY, deadkeyID +``` + +`UC_SENTINEL` is `0xFFFF`; `CODE_DEADKEY` is `0x0008`; `deadkeyID` can +be any value from `0x0001` to `0xFFFE`. + +> ### Note +Changes in 8.0.333.0: a potential buffer overflow has been corrected. +The size of the buffer pointed to by `buf` should be `WCHAR[len+1]` +to allow for terminating null. Keyman now counts supplementary plane +characters as 2 UTF-16 codepoints rather than as a single codepoint. +Keyman no longer returns partial deadkey code sequences. + +## KMSetOutput + +```c +BOOL WINAPI KMSetOutput(PWSTR buf, DWORD backlen); +``` + +`KMSetOutput()` is a wrapper for `KMQueueAction()`. It simplifies the +process of deleting contextual characters and outputting a new string. +The results will not be output to the screen until the current function +returns. If called within the context of an IMC window, the results will +not be output to the screen until the window posts the +`wm_keymanim_close` message. + +`buf` is a pointer to a null-terminated string of characters to output. +`backlen` is the number of characters to backspace from the current +context before displaying `buf`. + +This function modifies the context returned from `KMGetContext()`, even +if the output is not yet on the screen. + +Internally, this function does the following: + +```c +while(backlen-- > 0) KMQueueAction(QIT_BACK, 0); +while(*buf) KMQueueAction(QIT_CHAR, *buf++); +``` + +## KMQueueAction + +```c +BOOL WINAPI KMQueueAction(int itemType, DWORD dwData); +``` + +`KMQueueAction()` lets you send any Keyman action to a target +application. This can be virtual keys, characters, shift keys up and +down, deadkeys, beeps, or backspaces (a special case of virtual keys). + +| | | +|------------------|----------------| +| itemType code | Description | +| `QIT_VKEYDOWN` | Simulate any key press on the keyboard; `dwData` is the virtual key code | +| `QIT_VKEYUP` | Simulate any key release on the keyboard; `dwData` is the virtual key code | +| `QIT_VSHIFTDOWN` | Simulate pressing a set of shift keys. `dwData` can be a combination of the following flags: `LCTRLFLAG, RCTRLFLAG, LALTFLAG, RALTFLAG, K_SHIFTFLAG, K_CTRLFLAG, K_ALTFLAG` | +| `QIT_VSHIFTUP` | Release the shift state, `dwData` is the same as the previous flags. | +| `QIT_CHAR` | `dwdata` is any `WCHAR`. | +| `QIT_DEADKEY` | `dwData` is any value from `0x0001` to `0xFFFE`. This can be matched in the context with `KMGetContext()`. | +| `QIT_BELL` | `dwData` should be zero (`0`). | +| `QIT_BACK` | `dwData` should be zero (`0`). | + +## KMHideIM + +```c +BOOL WINAPI KMHideIM(HWND hwndIM); +``` + +`KMHideIM()` hides the IMC window referred to by `hwndIM` and ensures +that Keyman processes input from the keyboard through the correct +method. You should call this rather than hiding the window manually with +`ShowWindow(hwnd, SW_HIDE);` or post the message `wm_keymanim_close` to +hide the window. + +## KMDisplayIM + +```c +BOOL WINAPI KMDisplayIM(HWND hwndIM, BOOL FCaptureAll); +``` + +`KMDisplayIM()` displays the IMC window referred to by `hwndIM`. It does +not do any movement of the window. If the `FCaptureAll` flag is set, all +keyboard input (character-generating keys only) will be redirected to +the IMC window until the message `wm_keymanim_close` is posted, +`KMHideIM()` is called, or `KMDisplayIM()` with `FCaptureAll` set to +`FALSE`. + +## KMGetKeyboardPath + +```c +BOOL WINAPI KMGetKeyboardPath(PSTR keyboardname, PWSTR dir, DWORD length); +``` + +This function returns the full path to the keyboard referred to by +`keyboardname`. The buffer `dir` should be 260 characters long. + +## KMGetActiveKeyboard + +```c +BOOL WINAPI KMGetActiveKeyboard(PSTR keyboardname, DWORD length); +``` + +This function can be called while processing to determine which is the +active keyboard. Alternatively, use the callbacks `KeymanIMActivate()` +and `KeymanIMDeactivate()`. + +## KMSendDebugString + +```c +BOOL WINAPI KMSendDebugString(PSTR str); +``` + +This function outputs the string `str` to the Keyman debug window or +debug log file (usually %USERPROFILE%\Desktop\keymanlog\system\*.log). + +## The Input Method Composition window + +The IMC window can be shown or hidden at any time that the associated +keyboard is active. This means that you can have an IMC window +permanently open or open at appropriate times. + +The keyboard IMSample included with Keyman is a good example of +manipulating the IMC display. + +The window should be created invisible, most probaly as a popup window. +The window can use `KMGetContext()`, `KMSetOutput()` at any time, but +output will not be put to the screen until it has posted (not sent) +`wm_keymanim_close` to itself. + +```c +PostMessage(hwnd, wm_keymanim_close, (WPARAM) FSuccess, (LPARAM) FActuallyClose); +``` + +Keyman will manage the window display, focus, and message loop. The +window procedure should set the position and size appropriately. + +Keyman will recognise this window and any child windows to be part of +the IM and will not attempt to process any input that goes through the +window. + +The IMC window must not take focus at any time. + +## Limitations + +- Clicks outside the window will cancel the IM and lose context. +- Switching applications will cancel the IM and lose context. + +## See also + +- [DLL Interface for Keyman - Introduction](index) +- [DLL Exports](imxdll) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/imx/index.md b/developer/docs/help/guides/develop/imx/index.md new file mode 100644 index 00000000000..6bc606b8f91 --- /dev/null +++ b/developer/docs/help/guides/develop/imx/index.md @@ -0,0 +1,101 @@ +--- +title: Input Method Extensions +--- + +Keyman's multiple group processing is powerful, but sometimes you need +to be able to do something a bit more complex, such as a dictionary +lookup. Keyman's DLL interface let you do this. You can call a function +in a DLL in the same way as you call another group. The function can +read the context, deadkeys and the current keystroke, and output +characters, deadkeys, virtual keys, beeps and other items. + +The DLL interface also allows you to create a popup Input Method +Composition (IMC) window. This window allows the user to select visually +the characters they are wishing to input. The window can be set to be +visible when the keyboard is active, or after an appropriate key +sequence. When the window is visible, it can be set to capture all +keyboard input, or be passive. + +## File locations + +The DLL should be placed in any of the following locations: + +- The same directory as the .kmx file (e.g. use a package to install it) +- The Keyman program directory (same place as keyman32.dll) +- Anywhere on the path (such as the Windows directory) + +The best option is the first, as you can then include the DLL in a +Keyman package for easy installation and uninstallation. + +Full x64 support for IMX DLLs was introduced in Keyman Desktop +8.0.333.0. An x64 version of the DLL may be included simply by giving it +the file extension .x64.dll, with the same base name as the x86 DLL. +Keyman will call the appropriate DLL. + +## General usage information + +DLL functions used in place of groups are called DLL group functions. + +All strings, apart from keyboard names, are passed as WCHAR, regardless +of whether the active window is a Unicode window or not. In Keyman 8 and +earlier, ANSI characters are represented as 16-bit WCHAR, with high bits +zeroed out. In Keyman 9, ANSI keyboards are translated to Unicode at +install time, through the CP-1252 code page. + +The DLL will be loaded for each process in which the keyboard is +activated. Remember that the DLL will not share memory between these +processes by default, so if you have large memory requirements, you +should use memory mapped files or possibly SHARDATA segments to minimize +the memory consumption. + +DLL group functions are called in a fairly time-critical environment. It +is important that you minimise the processing time in these functions. +It is essential that you avoid any window focus or activation – message +boxes are definitely out of the question. For debugging purposes, there +is a Keyman32.dll function exported for writing to the logfile (see the +section titled Keyman32 imports). + +DLLs can handle multiple keyboards at once. The keyboards are identified +by a name which is the filename of the keyboard, minus path and +extension. For example, given c:\keyman\imsample\imsample.kmx, the +keyboard name is imsample. These are the same names that Keyman uses +internally, for example in the registry and directory names. + +## Registry settings + +Parameters for the DLL can be stored in two locations in the registry. +They should always be stored under HKEY_CURRENT_USER, as the user will +not have permission to change machine-wide settings, and the settings +should not affect other users. The following locations are recommended: + +> HKEY_CURRENT_USER\Software\Tavultesoft\Keyman Engine\9.0\IMX\\[DLLName] + +> HKEY_CURRENT_USER\Software\Tavultesoft\Keyman Engine\9.0\Installed Keyboards\\[kbdname] + +The first key should be used for settings that pertain to any keyboard +associated with the DLL. The second key should be used for any +keyboard-specific settings. Values stored under the second key should be +prefixed with the name of the dll, so that they will not conflict with +Keyman or other dll values. + +## The .kmn interface + +Inside a .kmn file, you define the DLL group function interface as follows: + +```keyman +store(DLLFunction) "myfile.dll:KeyEvent" +``` + +You can use this anywhere where you would place the use statement +(except in the begin statement), with the call statement. For example, + +```keyman ++ 'a' > call(DLLFunction) +``` + +A single .kmn file can reference multiple DLL group functions, in a single or multiple DLLs. + +## See also + +- [DLL Exports](imxdll) +- [The imlib.cpp library module](imxlib) diff --git a/developer/docs/help/guides/develop/imx/web.md b/developer/docs/help/guides/develop/imx/web.md new file mode 100644 index 00000000000..fa98ba40321 --- /dev/null +++ b/developer/docs/help/guides/develop/imx/web.md @@ -0,0 +1,4 @@ +--- +title: IMX Interface for KeymanWeb +--- + \ No newline at end of file diff --git a/developer/docs/help/guides/develop/imx/web/index.md b/developer/docs/help/guides/develop/imx/web/index.md new file mode 100644 index 00000000000..9453c5a01de --- /dev/null +++ b/developer/docs/help/guides/develop/imx/web/index.md @@ -0,0 +1,5 @@ +--- +title: Guidelines for building IMX for KeymanWeb +--- + +* TODO: Write to fill requirements for .call_js, see call() statement for details. diff --git a/developer/docs/help/guides/develop/index.md b/developer/docs/help/guides/develop/index.md new file mode 100644 index 00000000000..8d8490c42c1 --- /dev/null +++ b/developer/docs/help/guides/develop/index.md @@ -0,0 +1,19 @@ +--- +title: Developing Keyboards +--- + +[Keyman keyboard tutorial](tutorial) + +[An advanced keyboard development example](advanced-keyboard-development-example) + +[Creating a simple touch keyboard layout](touch-keyboard-tutorial) + +[Creating a touch keyboard layout for Amharic - part 1](creating-a-touch-keyboard-layout-for-amharic) + +[Creating a touch keyboard layout for Amharic - part 2](creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty) + +[Input Method Extensions (IMX)](imx) + +------------------------------------------------------------------------ + +[Keyman Developer 16 Tutorial](https://lingtran.net/Keyman-Developer-16-Tutorial) (external on Lingtran.net) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/touch-keyboard-tutorial/index.md b/developer/docs/help/guides/develop/touch-keyboard-tutorial/index.md new file mode 100644 index 00000000000..bc7c8e792f2 --- /dev/null +++ b/developer/docs/help/guides/develop/touch-keyboard-tutorial/index.md @@ -0,0 +1,54 @@ +--- +title: Creating a Simple Touch keyboard +--- + +## Introduction and design + +If you have experience in designing Keyman keyboards for computers, the +interface for designing mobile keyboards looks very similar, but it +hides the reality of additional steps necessary for mobile keyboards. +This tutorial attempts to walk you through the process. + +The [Quick French tutorial](../tutorial/) shows how to create a simple +desktop keyboard for typing accented characters used in French and other +European languages. It is possible to create a touch screen format of +that keyboard, but it is probably unnecessary. The default keyboards for +both Android and iOS devices have a way to type these accented +characters. Press and hold on a vowel, and a popup menu will give you a +choice of accents to put on that letter. + +For this tutorial we will demonstrate something usable for the Fulfulde +language cluster spoken across many Sahelian countries of Africa. +Fulfulde is usually written using the Latin alphabet, but there are a +few characters added to the usual list of alphabetical characters. So +this is a useful example for any language wanting to add a few +characters to the standard Latin keyboard. Here are the characters we +are going to add, together with their Unicode values. + +| | | | | | | | | | +|-----|----------|-----|----------|-----|-----|----------|-----|----------| +| `ɓ` | `U+0253` | `Ɓ` | `U+0181` | | `ɗ` | `U+0257` | `Ɗ` | `U+018A` | +| `ŋ` | `U+014B` | `Ŋ` | `U+014A` | | `ƴ` | `U+01B4` | `Ƴ` | `U+01B3` | + +Here we will likely want to proceed differently than with the desktop +keyboard. The usual approach for a desktop keyboard is to create a +deadkey. The keyboards I have used for Fulfulde (going back to decades +ago) used the / key as the deadkey. +/b gave ɓ, +/d gave ɗ, and so on. + +It would be possible to use that desktop keyboard logic on touch +screens.  But your mobile device users will find these rules annoying. +Instead of two keys they would probably have to press four, since the +standard alphabetical keyboard on most touch devices does not have the +slash key. So they would have to press the key to switch to the numeric +keyboard, then press slash, then press the key to go back to the +alphabetical keyboard, then the letter. What touch screen users would +appreciate is something that uses the great feature of touch screens, +the long press or press and hold on a letter, to see analogous letters. +So we’ll set up a touch screen keyboard that lets you press and hold ‘d’ +to see the two hooked d characters, press and hold ‘b’ to see the hooked +b characters, and so on. + +[Next: Making, testing and distributing the touch +keyboard](making-touch-keyboard) diff --git a/developer/docs/help/guides/develop/touch-keyboard-tutorial/making-touch-keyboard.md b/developer/docs/help/guides/develop/touch-keyboard-tutorial/making-touch-keyboard.md new file mode 100644 index 00000000000..5039acb2624 --- /dev/null +++ b/developer/docs/help/guides/develop/touch-keyboard-tutorial/making-touch-keyboard.md @@ -0,0 +1,361 @@ +--- +title: Making a touchscreen keyboard +--- + +## Setting up your Keyman project + +This is a useful convention for keeping track of your files: + +1. Create a folder on your hard drive for all your Keyman developer + files +2. In that folder, create a folder for this project, named after the + language. Use all lowercase letters for compatibility with other + platforms. +3. Now create a project in Keyman Developer with the same name as the + new folder, and save it inside the new folder + +Now you will be able to use this project to organize and create any +files for desktop, mobile, web or other. It also facilitates uploading +the files to the Keyman website later on. + +## Add touch to an existing keyboard or create a new keyboard? + +You can add a mobile touchscreen keyboard to an existing desktop +keyboard, or you can create a new touchscreen keyboard from scratch. You +should be aware that there will be cross-over between mobile and desktop +keyboards. (In Keyman terms, "desktop" includes laptop computers or any +device with a physical keyboard). Your mobile device can have an +external keyboard, which will use the desktop Keyman keyboard. So the +Keyman strategy is to always bundle touch keyboards with desktop +keyboards to make them work on multiple platforms. + +If creating from scratch, you click the New icon in the Keyman Developer +toolbar (or select File > New from the menu), and specify the file +name for your keyboard. We recommend a name using only lowercase +letters, numbers and underscore. I’ll choose “mobile_fulfulde.kmn” . + +![choose new file +type](../../../images/simpleTouchKeyboard_1.png) + +## Adding the required metadata + +After creating the file, Keyman Developer will ask you to name the +keyboard. This name can include spaces and upper case letters if +desired. I’ll name this one “Fulfulde for Mobile”. + +![keyboard +metadata](../../../images/simpleTouchKeyboard_2.png) + +The first thing you need to do is to tell Keyman Developer this keyboard +will include some kind of mobile device.  You do this in the Targets +list just below the keyboard name. I’ll select “mobile ” in the list, +(towards the end). You see in the picture above that Keyman Developer +checked the “windows” box by default, I can uncheck that or leave it +checked if I am going to add a Windows keyboard to this set. + +![mobile target](../../../images/simpleTouchKeyboard_3.png ) + +This will include all mobile devices, both Android and iOS, both phones +and tablets. It is possible if needed to select Android only or iOS only +if needed, and to develop a different keyboard layout for tablets than +for phones, but for this example, with only a few characters needed to +be added to the default keyboards, there is no need for that kind of +complexity. + +(If you are adding a mobile layout to an existing keyboard file, you +would open that file in Keyman Developer, go to the Targets box and +check “mobile” or whatever mobile targets you wanted to specify, then +follow along from here). + +## Adding the touch optimized feature + +The next step is to add the touch-optimised feature to our keyboard +setup. If you scroll to the bottom of the details tab, there is the list +of features to add. I’ll click the Add button and choose “touch +optimised keyboard.” + +![touch-optimised](../../../images/simpleTouchKeyboard_4.png) + +Keyman developer asks me to choose one of three templates for the mobile +layout. + +![three templates](../../../images/simpleTouchKeyboard_5.png) + +The “template-latin” layout includes many accented characters, like the +default keyboards for Android and iOS do. The “template-basic” layout +has no extra characters, and the template-traditional has a few extra +characters (mostly punctuation symbols if you long-press period or full +stop). For this example, I’ll choose “template-basic” because accented +characters are not needed for Fulfulde. But if I knew that many eventual +users might want to be able to type French or other European languages +as well as Fulfulde, and wouldn’t like to have to switch the keyboard to +do so, I could choose “template-latin”. + +## Defining one or several touch layouts + +I select the template and click OK. Keyman Developer now adds a new tab +in the left column, the Touch Layout tab. + +![touch layout](../../../images/simpleTouchKeyboard_6.png) + +That is where we need to go now to add characters to our touch layout. +But before doing that, there is one important thing to take note of in +the touch layout. By default, Keyman Developer has created a layout for +phones and another layout for tablets. They all start out the same, but +as I add characters, I will have to make sure I add all the characters +to both layouts, or I’ll discover that my keyboard does not work for all +device sizes. + +In the image, you see in the Platform box that Keyman Developer is currently showing the +tablet layout. This box is where I’d choose which layout I’d design in. + +But I’m going to make this keyboard simple, and just have one layout for +both tablets and phones. So in the platform box, I am going to click +the “minus” button, to delete the tablet layout. When there is only one +mobile layout, Keyman Developer will compile that layout for all mobile +devices. (I could also have chosen to delete the phone layout and done +my layout design in the tablet layout). + +![platform list](../../../images/simpleTouchKeyboard_7.png) + +## Adding longpress characters + +Now I can start adding characters. I’ll click on the “y” key in the +layout, then I’ll look at the “longpress keys” area at the lower +left. + +![add longpress](../../../images/simpleTouchKeyboard_8.png) + +I click that, and Keyman Developer adds a new key below the keyboard +layout. + +![longpress added](../../../images/simpleTouchKeyboard_9.png) + +I'm going to use this key for the y with hook. I click inside it to make it active, then I’ll go look for my y +with hook character in the character map to the right. If I type “y +hook” in the search box, Keyman Developer shows the character I’m +looking for. + +![adding keycap](../../../images/simpleTouchKeyboard_10.png) + +If I double click on the lower case y with hook, that copies the character +to the keycap box of my new key. (I could also click and drag the character from the character map to the key). + +![keycap added](../../../images/simpleTouchKeyboard_11.png) + +## New key info + +There are several important pieces of information that got copied over. If we +look at the properties of the new key to the right, we see that this new key has +the “text” ƴ (what appears on the keycap), the “Unicode value” U+01B4 and the +“ID” U_01B4. All of these were copied from the character map. + +NOTE: If you copy one character from the character map to a new key, then +realize you copied the wrong character, dragging a second character may not +replace all the needed information into the key. If a key has a character in it +already, it works better to hold Ctrl as you drag the new character +into it. + +I could add the other three characters; hook b, hook d, and eng, as longpress +characters as well. I could select the regular letter I want to longpress, +click plus in the longpress keys area and copy the needed character. Here for +example is the b with hook: + +![keycap added](../../../images/simpleTouchKeyboard_12.png) + +After I have added my four lowercase characters as longpress keys, the keyboard +looks like this. Even when I don't have that letter selected, I can see which +keys have longpress keys by the dot beside the letter. + +![keycap added](../../../images/simpleTouchKeyboard_12-2.png) + +[See the Keyman Language guide on virtual keys](../../../../language/guide/virtual-keys#toc-virtual-keys-and-touch-layouts) + +## Adding uppercase characters + +I could do two different things for the upper case letters. I could add them as +longpress keys beside their lowercase equivalents, by pressing the plus key +again to add a second longpress character to each letter. + +This would mean users would not have to press Shift to be able to type the upper +case hook y. But since a user needs to press Shift for all the regular Latin +upper case letters, it might make more sense to put the uppercase letters into +the Shift layer. + +I can change to the shift layer by finding the layer box at lower left, and +choosing `shift` instead of `default`. + +![changing to shift layer](../../../images/simpleTouchKeyboard_13.png) + +Now I see the upper case letters on the keyboard, and I can add longpress +characters to these in the same way I did on the default layer. I click the +letter, then click `+` to add a key, then copy the character info from the +character map. Adding my upper case y hook to Y would look like this: + +![new key added to row](../../../images/simpleTouchKeyboard_14.png) + +(If I had clicked on the green triangle to the left of my first key, the +new key would be added to the left of that key). + +For this new key, I go through the same steps. I click in the empty box +on the new key, then double click the upper case y with hook in the +character map to put that in the keycap. I also change the code of this +new key to “U_01B3” + +![keycap and code added to new +key](../../../images/simpleTouchKeyboard_15.png) + +## Another option for upper case characters + +I might also add the upper case character to a longpress character on +the upper-case Y key, because some users will press the Shift key then +look for the letter to type. To do this, I change the layer at the top +of the tablet layout to "shift" from "default". + +![changing +layer](../../../images/simpleTouchKeyboard_15b.png) + +Now I click the Y key, and add a longpress character, then add the upper +case y with hook to the keycap and add the keycode as shown before. + +![key added to longpress +Y](../../../images/simpleTouchKeyboard_16b.png) + +You can design your keyboard either way, with the upper case characters +in the same longpress row as the lower case, or in a longpress row off +of the shift layer. The rest of this tutorial shows the upper case +characters in the same row as the lower case, but I don't mean to +present this as the best way. If you do put upper case characters in the +shift layer, you'll have to remember to change the layer back to +"default" when you want to add a lower case letter, then back to "shift" +when adding an upper case letter. You could put the upper case +characters in both places, if you think that best. + +Now I’ll add the two d hook characters as a longpress popup for the d +key. I click the d key in the layout, click “Add longpress popup”, add +the lower case hook d to the keycap and change the code to “U_0257”; +then click the plus sign to add a second key, add the upper case hook D +to the keycap and change its code to “U_018A”. The end result should +look like this: + +![longpress row on +d](../../../images/simpleTouchKeyboard_16.png) + +I’ll do the similar step to add two characters as a longpress popup for +“b” + +![longpress row on +b](../../../images/simpleTouchKeyboard_17.png) + +And two characters as a longpress popup for “n”. (Tip, to search for ŋ +in the character map, type “eng”). + +![longpress row on +n](../../../images/simpleTouchKeyboard_18.png) + +When no keys are selected in the keyboard layout, I can still see which +ones I have set up longpress popups for, because Keyman Developer shows +a faint gray line at the top right corner of the key. So you should have +a faint diagonal line on your y, d, b and n keys. + +![lines on longpress +keys](../../../images/simpleTouchKeyboard_19.png) + +## Replacing the Unicode and Code automatically + +1. Hold the Ctrl key while dragging and + dropping a character from the Character Map to the touch layout + editor, and it will replace the Code as well as the character. +2. Hold the Shift key while dropping, and it + will only add the character to the key. +3. Finally, hold + Ctrl+Shift, this + will add the character to the key AND update the Code to match the + full set of characters represented on the key. + +## Compiling your keyboard + +Now click Save to save your work, and compile the keyboard. (Keyboard +> Compile Keyboard, or press F7). Hopefully you’ll see it compiled +with no error messages: + +![successful +compile](../../../images/simpleTouchKeyboard_20.png) + +If you see a warning like: + +``` +Warning: line 0  warning 2092: Key " T_new_579" on layer "default", platform "phone", is a custom key but has no corresponding rule in the source. +``` + +This shows you forgot to enter the correct keycode for a new key you +added. Double check your longpress popup keys for one with a “T_new_NNN” +code, and add in the desired “U_NNNN” code. + +You might also see a message like + +``` +Error: line 0  error 405A: Key " U+0181" on "phone", layer "default" has an invalid identifier. +``` + +This shows you attempted to change the keycode but mistyped the code. +I’ve gotten this more than once, because I am used to typing `U+0181`to +refer to a Unicode value, but the correct syntax for a keycode in Keyman +Developer is `U_0181` + +# Testing your keyboard + +Other Keyman help pages describe how you can test your keyboard: + +- [On a virtual device in the Chrome web browser on your + computer](../../test/keyboard-touch-mobile-emulator) +- [On your own device accessing the keyboard over the + network](../../test/keyboard-touch-and-desktop) + +If your device cannot connect to your computer on the local network (for +instance if your computer is on a wired office network and your device +is on the wireless office network), the above technique for sharing may +not work. You can put your keyboard in a package and share it over the +Internet with your device, as described below. + +# Packaging and distributing your keyboard + +Another Keyman help file describes [how to build a package +file.](../../distribute/tutorial) + +## BCP 47 tags for Fulfulde + +[Step 3](../../distribute/tutorial/step-3) of the package building +tutorial describes adding the BCP 47 language tag to your package. When +I came to the step of adding a tag for Fulfulde, I had to do some +research. I naively thought "Fulfulde" was a clear enough label for the +language. It is not, since it is a language chain rather than one +language. The BCP 47 tag in many cases is the same as the [SIL +Ethnologue code](https://www.ethnologue.com), so that is where I had to +go to find the tags I needed. In the end I added four tags for four +Fulfulde languages: + +![BCP 47 tags](../../../images/simpleTouchKeyboard_36.png) + +I also added the script designator `Latn` for Latin script. This is +recommended for Windows, which sometimes fails to install the desktop +keyboard if there is not a script designator on the BCP 47 tag. We +recommend that you always put in the script tag unless there is a +specific reason not to. + +Some languages have only two letters in their BCP 47 tag. For instance, +the Hausa language has an Ethnologue code `hau` but the BCP 47 tag is +`ha`. Keyman Developer knows about this, and will change the tag to `ha` +if I put in the Ethnologue tag. + +# Next steps + +The two following articles on Amharic describe a more complex +touchscreen example where quite frequently two keys are pressed to get +one distinct character. (Amharic is a Abugida or syllabary script, where +one character can represent a consonant and following vowel). + +- [Creating a touch keyboard layout for Amharic - part + 1](../creating-a-touch-keyboard-layout-for-amharic) +- [Creating a touch keyboard layout for Amharic - part + 2](../creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/index.md b/developer/docs/help/guides/develop/tutorial/index.md new file mode 100644 index 00000000000..3642ddc1ed5 --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/index.md @@ -0,0 +1,56 @@ +--- +title: Keyboard Tutorial +--- + +[Step 1: Planning the Keyboard](step-1) + +[Step 2: Writing the Header](step-2) + +[Step 3: The Keyboard Header](step-3) + +[Step 4: The Keyboard Body](step-4) + +[Step 5: Rules with Context](step-5) + +[Step 6: Stores, 'any', and 'index'](step-6) + +[Step 7: Testing the Keyboard](step-7) + +[Step 8: Deadkeys](step-8) + +[Step 9: The Finished Keyboard](step-9) + +## Overview + +Welcome! In this tutorial, you will learn the basics of Keyman keyboards +and create a simple French keyboard which can be used with any physical +keyboard layout. + +The keyboard will use a basic English layout, and add some deadkeys to +define vowel diacritics and a few other characters. + +While this tutorial is based on a physical keyboard such as used on a +desktop or laptop computer, the principles of the keyboard language that +you will learn are applicable to developing touch layouts as well. + +This keyboard will use Unicode. Unicode is a character encoding standard +that supports most of the world's scripts, and includes support for +user-defined scripts. Unicode is the accepted standard for text encoding +in modern applications and operating systems. + +In Keyman Developer keyboard source files, Unicode characters are +specified with `U+xxxx`, where `xxxx` is a four-digit hexadecimal +number. + +At the bottom of each page in the tutorial, will be a link to both the +previous page and the next page. You can use these links to work your +way through the tutorial. You may also find links to reference +information, which you can select to learn more about a particular +aspect of creating Keyman keyboards. + +## Let's begin + +Let's get started! Move on to the next topic to begin the first step, +planning the keyboard. + +- [Continue with Step 1: Planning the Keyboard](step-1) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-1.md b/developer/docs/help/guides/develop/tutorial/step-1.md new file mode 100644 index 00000000000..642fa916bba --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-1.md @@ -0,0 +1,71 @@ +--- +title: Step 1: Planning the Keyboard +--- + +## Choosing the characters + +First of all, we need to decide which characters we want the keyboard to +produce. Next, we must find out the codes used to represent them, using +a program such as Character Map, or with the Character Map in Keyman +Developer (go to **View**, **Character Map**). + +French uses the same 26 letters as English, with some additions. As our +keyboard is based on English, we only need to work with these additional +letters. Note that for completeness, we will design our keyboard to +produce a few other accented vowels that are not used in French. Also, +we want our keyboard to include the angled quotes `«` and `»`. + +These characters, with both uppercase and lowercase forms, are listed in +the table below along with their Unicode codes. + +| | | | | | | | | | +|-----|----------|-----|----------|-----|-----|----------|-----|----------| +| `À` | `U+00C0` | `à` | `U+00E0` | | `Á` | `U+00C1` | `á` | `U+00E1` | +| `È` | `U+00C8` | `è` | `U+00E8` | | `É` | `U+00C9` | `é` | `U+00E9` | +| `Ì` | `U+00CC` | `ì` | `U+00EC` | | `Í` | `U+00CD` | `í` | `U+00ED` | +| `Ò` | `U+00D2` | `ò` | `U+00F2` | | `Ó` | `U+00D3` | `ó` | `U+00F3` | +| `Ù` | `U+00D9` | `ù` | `U+00F9` | | `Ú` | `U+00DA` | `ú` | `U+00FA` | +| `Â` | `U+00C2` | `â` | `U+00E2` | | `Ä` | `U+00C4` | `ä` | `U+00E4` | +| `Ê` | `U+00CA` | `ê` | `U+00EA` | | `Ë` | `U+00CB` | `ë` | `U+00EB` | +| `Î` | `U+00CE` | `î` | `U+00EE` | | `Ï` | `U+00CF` | `ï` | `U+00EF` | +| `Ô` | `U+00D4` | `ô` | `U+00F4` | | `Ö` | `U+00D6` | `ö` | `U+00F6` | +| `Û` | `U+00DB` | `û` | `U+00FB` | | `Ü` | `U+00DC` | `ü` | `U+00FC` | +| `Ý` | `U+00DD` | `ý` | `U+00FD` | | `Ç` | `U+00C7` | `ç` | `U+00E7` | +| `«` | `U+00AB` | `»` | `U+00BB` | | | | | | + +If you are not familiar with the hexadecimal (base-16) numbering system, +don't worry: you can use the Character Map in Keyman Developer to find +the character you want, and then drag-and-drop or copy-and-paste its +character code into your keyboard. + +Note that you must be careful to use the right character: The Unicode +standard has many characters with the same shape as another, but a +different meaning; an example of this is the Greek capital letter Sigma +(`U+03A3` Σ) and the mathematical summation symbol (`U+2211`, ∑). An application +supporting Unicode would treat these two characters differently. If in +doubt whether a character is the right one, you can look up the +reference tables at [www.unicode.org](http://www.unicode.org/). + +## Designing the layout + +After choosing the characters we want our keyboard to use, we must +decide how we want the user to be able to enter them. For some +languages, you might replace each letter on the English keyboard with a +letter from the language. In this case, however, most of the letters are +accented vowels, we will use two keystrokes for each: one for the +accent, and one for the vowel. + +| Character | Keystrokes | +|-------------|-------------------------------| +| `À, à, ...` | back-quote (`), then the vowel key. | +| `Á, á, ...` | quote ('), then the vowel key. | +| `Â, â, ...` | caret (^), then the vowel key. | +| `Ä, ä, ...` | double-quote ("), then the vowel key. | +| `Ç, ç` | quote ('), then lower- or uppercase C. | +| `«, »` | two less-than (<<) or greater-than (>>) symbols. | + +Now that we have decided which character to use and how the user can +enter them, we can start to write the keyboard. + +- [Continue with Step 2: Writing the Header](step-2) +- [Back to the Introduction](index) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-2.md b/developer/docs/help/guides/develop/tutorial/step-2.md new file mode 100644 index 00000000000..5867973fb39 --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-2.md @@ -0,0 +1,53 @@ +--- +title: Step 2: Writing the Header +--- + +## Overview of a keyboard file + +A keyboard file is divided into two sections: the **header** and the +**rules** section. The header section defines the name of the keyboard, +its bitmap, and other general settings. The rules are used to define how +the keyboard responds to keystrokes from the user, and are divided into +groups. We will start by writing the header. + +## The keyboard header + +The keyboard header is the first part of a keyboard; it consists of +statements that help Keyman identify the keyboard and set default +options for it. Each statement in the header must be on a separate line. +While there is no technical requirement to put header statements at the +start of a keyboard source file, keeping them there helps you identify +them easily, and keeps them consistent with keyboard programs other +people might write. + +We will begin to write the keyboard. If Keyman Developer is not already +running, start it now. Create a new keyboard file, navigate to the +**Layout** tab, and click on the **Code** tab at the bottom of the +screen to switch to the Code view. + +Type or paste the following code into the keyboard file. This is the +header of our keyboard file. + +```keyman +c Simplified French Keyboard for Keyman 9.0 +c +c This keyboard program uses a simplified set of keys +c for typing French, especially for those who don't know the +c standard French keyboard. +c +c NOTE: This keyboard was created from the Keyman keyboard +c programming tutorial. + +store(&Version) "9.0" c This keyboard is for use with Keyman 9.0 +store(&Name) "Quick French" +store(&Bitmap) "qfrench.ico" +store(&MnemonicLayout) "1" c This keyboard uses a mnemonic layout. + +begin Unicode > use(Main) +``` + +An explanation of the various parts of the header follows on the next +page. + +- [Continue with Step 3: The Keyboard Header](step-3) +- [Back to Step 1: Planning the Keyboard](step-1) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-3.md b/developer/docs/help/guides/develop/tutorial/step-3.md new file mode 100644 index 00000000000..81777aec6a0 --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-3.md @@ -0,0 +1,99 @@ +--- +title: Step 3: The Keyboard Header +--- + +## Comments + +```keyman +c Simplified French Keyboard for Keyman 9.0 +``` + +Most of the header in this example is made up of +[comments](/developer/language/guide/comments). A comment is used +to make notes about the keyboard, or to provide information on the +workings of the keyboard. The comments are readable by anyone looking at +the source code of the keyboard. + +A comment always starts with a lowercase `c`, followed by one or more +spaces, and continues to the end of the line. Keyman Developer will +ignore comments when compiling a keyboard. + +Comments can take up a whole line, or can start in the middle of the +line. The latter is useful for making short notes about individual +lines. As you can see we have used both kinds of comments in the header. + +## The `&Version` store + +```keyman +store(&Version) "9.0" c This keyboard is for use with Keyman 9.0 +``` + +The [`&Version` store](/developer/language/reference/version) +identifies the Keyman version for which this keyboard was written; this +keyboard is for use with Keyman 9.0. The `&Version` store is an optional +part of the keyboard header, but if present, it should be the first +store in the file. + +## The `&Name` store + +```keyman +store(&Name) "Quick French" +``` + +The [`&Name` store](/developer/language/reference/name) specifies +a descriptive name for the keyboard, which can be up to eighty +characters long. The name we have given to this keyboard is +`"Quick French"`. The `&Name` store is not required but is highly +recommended! + +## The `&Bitmap` store + +```keyman +store(&Bitmap) "qfrench.ico" +``` + +The optional [`&Bitmap` store](/developer/language/reference/bitmap) +tells Keyman which image to use for the keyboard's icon. The picture +should be in the standard Windows .ico format, and should contain at +least a single 16x16 pixel image. It can also contain higher resolution +images for high resolution "High DPI" displays. If you use a modern icon +editor, the icon can use alpha transparency. +For this keyboard we will be using the following bitmap: +![](../../../images/tutorial_keyboard_qfrench.gif); it is +found in the Keyman Developer folder, under +`Samples\Examples\qfrench.ico` - you should copy it into the same folder +in which you will save your keyboard. + +## The `&MnemonicLayout` store + +```keyman +store(&MnemonicLayout) "1" +``` + +The [`&MnemonicLayout` store](/developer/language/reference/mnemoniclayout) tells Keyman that +the layout is meant to conform to the user's keyboard layout; for +example, if the user presses the quote key ' on +their keyboard (whether they are using a US English, UK English, French, +German, Swedish, or other keyboard) it should work in the same way. The +opposite of this is a positional layout (which is the default if this +store omitted), which is intended for keyboards for which there is not +necessarily a correspondence between what is printed on the physical +keyboard and what is output when that key is pressed. + +## The `begin` statement + +```keyman +begin Unicode > use(Main) +``` + +The [`begin` statement](/developer/language/reference/begin) tells +Keyman which group of rules to process first when it receives a +keystroke. The use of multiple groups is an advanced feature, and +unnecessary for this tutorial, so we will use a single group, called +`Main`. The `begin` statement is required in every keyboard, and marks the +start of the keyboard body. The `begin` statement also tells Keyman +which encoding to use for the keyboard. Nearly all keyboards will use +`Unicode`, today. + +- [Continue with Step 4: The Keyboard Body](step-4) +- [Back to Step 2: Writing the Header](step-2) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-4.md b/developer/docs/help/guides/develop/tutorial/step-4.md new file mode 100644 index 00000000000..e8a861ae1cd --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-4.md @@ -0,0 +1,102 @@ +--- +title: Step 4: The Keyboard Body +--- + +The body of the keyboard is the most important part: it determines the +behaviour of the keyboard. The body consists of groups, which in turn +contain one or more rules which define the responses of the keyboard to +certain keystrokes. + +## Groups + +There are two types of groups: +* groups that process the keys pressed and the context. +* groups that process only the context. + +For simple keyboards, the latter type of group will not be required. A group begins +with a [`group` statement](/developer/language/reference/group), and +ends either at the start of another group, or at the end of the keyboard +file. + +We will only use one group in the Quick French keyboard, called `Main`. +We mark the start of it with the `group` statement below. Add this line +to the keyboard if it's not already there. + +```keyman +group(Main) using keys +``` + +The `using keys` clause tells Keyman that this group will process +keystrokes. + +## Basic Rules + +A rule tells Keyman the output to produce for a certain input. A rule +consists of three parts: the **context**, the **key**, and the +**output**. + +* The **context** specifies the conditions under which a rule will act. If +what is shown in the document to the left of the cursor matches the +context of a rule, the rule will be processed. +* The **key** specifies which keystroke the rule will act upon. +* The **output** determines the characters that are produced by a rule. +The output replaces the matched context in the document. + +## Simple rules + +The simplest rules in Keyman consist of just a key and output, as below. +(The examples in this section are just for illustration, and do not form +part of the Quick French keyboard). + +```keyman ++ "a" > "ä" +``` + +In this rule, the key is a, and the output is `"ä"`. A simple rule +begins with a plus sign, followed by the key, a greater-than symbol +(suggesting "becomes"), and finally the output. As you might guess, this +rule will change a lowercase a key typed by the +user into **ä**. + +The key and output can be written as a character in single or double +quotes (as above), or as its Unicode character code, or using a named +constant. The rule above could have also been written any of the +following ways, among others: + +```keyman ++ 'a' > 'ä' + ++ U+0061 > U+00E4 + +store(ADIERESIS) 'ä' ++ 'a' > $ADIERESIS +``` + +You can also write the key in one form and the context in another. + +## Rules with longer output + +The output of a rule is not limited to a single character. You could, +for example, write a rule such as the following: + +```keyman ++ "f" > "ph" +``` + +This would change any f keys typed into **ph**. +If the output of a rule consists of more than one character, you can +write the characters in different ways if necessary, with a space +separating each part. You can specify multiple characters in quotes, but +if you use the Unicode codes to write the characters, you must separate +each with a space: + +```keyman ++ "f" > U+0070 U+0068 + ++ "f" > U+0070 "h" +``` + +These rules are functionally identical to the one [further above](#toc-simple-rules). + +- [Continue with Step 5: Rules with Context](step-5) +- [Back to Step 3: The Keyboard Header](step-3) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-5.md b/developer/docs/help/guides/develop/tutorial/step-5.md new file mode 100644 index 00000000000..88a76bce340 --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-5.md @@ -0,0 +1,76 @@ +--- +title: Step 5: Rules with Context +--- + +## Rules with Context + +Very often we want a keyboard to produce different output based on more +than just the last keystroke. For example, in the Quick French keyboard, +we want the key e to produce one of è, é, +ë, ê, or just e, depending on what was typed immediately before +it. To do this we must make our rules look at the context. + +The context is the output from previous rules; that is, the characters +that are displayed on the screen. We can make a rule work with only +certain context by putting this before the plus sign in the rule: + +```keyman +"^" + "e" > "ê" +``` + +With this rule, whenever an e is typed, if it +was preceded by a caret (^), the output will be ê. It is important +to remember that the context consists of **output +from previous rules**, not the previous keystrokes. To emphasize +this point, consider the four rules below: + +```keyman ++ "a" > "b" ++ "b" > "c" +"b" + "c" > "d" +"c" + "d" > "e" +``` + +With these rules, typing b c would produce the +output `cc`, and not `d`, as you might initially expect. This is because +the key b is converted by the second rule into +the output `c`, while the third rule expects a context of b, and not +c; we would have to type a c to get `d`. + +However, if a key has no matching rule, the output will be the same as +the key: so the output `e` will be produced for either of the inputs c d (because c by itself has no rule), and b d. + +## Continuing the Quick French keyboard + +Now we know how to create context-dependent rules, we can continue +making the Quick French keyboard. Let's start with the rules for +acute-accented characters, using the ANSI codes from the table we +prepared earlier: + +```keyman +c lowercase characters with acute accent +"'" + "a" > U+00E1 +"'" + "e" > U+00E9 +"'" + "i" > U+00ED +"'" + "o" > U+00F3 +"'" + "u" > U+00FA +"'" + "y" > U+00FD + +c uppercase characters with acute accent +"'" + "A" > U+00C1 +"'" + "E" > U+00C9 +"'" + "I" > U+00CD +"'" + "O" > U+00D3 +"'" + "U" > U+00DA +"'" + "Y" > U+00DD +``` + +We can also create similar rules for the other thirty-odd accented +characters. + +As you can see, even for a simple keyboard like this we quickly end up +with a large number of rules, which makes for clumsiness. We can make +things simpler using stores, and the `any()` and `index()` statements. + +- [Continue with Step 6: Stores, `any()`, and `index()`](step-6) +- [Back to Step 4: The Keyboard Body](step-4) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-6.md b/developer/docs/help/guides/develop/tutorial/step-6.md new file mode 100644 index 00000000000..95ade8767c6 --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-6.md @@ -0,0 +1,116 @@ +--- +title: Step 6: Stores, any(), and index() +--- + +When we have many similar rules, as in the last example on the previous +page, we can group them together into one rule by using stores. A store +is a set of characters that are grouped under a single name. Stores are +used in rules with the [`any()`](/developer/language/reference/any) and +[`index()`](/developer/language/reference/index) statements. We create a +store with a [`store()` statement](/developer/language/reference/store): + +```keyman +store(vowels) "aeiou" +``` + +This creates a store called `vowels`, which contains the five lowercase +vowels. +> #### Note: +We could also have written the content of the store +using ANSI or Unicode character codes, in the same way as the output. + +The `any()` statement is used to match a character from a specific +store. For example, the following rule will replace any vowel with a +period, when used with the store above: + +```keyman ++ any(vowels) > "." +``` + +The `any()` statement can be used in the context or in the key part of a +rule. It cannot be used in the output. + +The second statement that is used with stores is the `index()` +statement. It is usually used in the output of a rule, and will output +the character from a particular store at the same position as the +character matched by a specified `any()` statement. This is best shown +with an example; this rule will convert all input to uppercase: + +```keyman +store(lowercase) "abcdefghijklmnopqrstuvwxyz" +store(uppercase) "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + ++ any(lowercase) > index(uppercase,1) +``` + +When a letter, such as j is typed, the `any()` +statement finds its position in the `lowercase` store; the `index()` +statement then gets this index from the `any()` statement, and outputs +the character at the same position in the `uppercase` store, in this +case `J`. + +The `index()` statement has two parts: the store from which it takes the +output character, and the offset of the `any()` statement that it gets +the character position from. This offset is found by counting the +characters and statements in the context and key parts of the rule up to +the `any()` statement. Again, a few examples may help to illustrate +this: + +```keyman +"a" + any(somestore) > index(otherstore,2) c The 'any' statement + c is character #2 +"ab" any(somestore) + "c" > index(otherstore,3) c The 'any' statement + c is character #3 + +c Here the 'index' statement references the second 'any' statement used, +c which is character #4 +U+0041 any(somestore) "B" + any(otherstore) > index(thirdstore,4) + +c You can have multiple 'index' statements in the output, which can +c reference the same or different 'any's +any(store1) + any(store2) > index(store1,2) index(store2,1) index(store3,2) +``` + +## Using stores in the Quick French keyboard + +We can now reduce the number of rules needed for the Quick French +keyboard by using stores. We will make five stores: one for the +unaccented vowels, and one each for vowels with acute accents, grave +accents, circumflexes, and diereses. For clarity, the `group()` +statement is repeated below: + +```keyman +group(Main) using keys + +store( plainvowels ) 'a' 'e' 'i' 'o' 'u' 'A' 'E' 'I' 'O' 'U' +store( acutevowels ) U+00E1 U+00E9 U+00ED U+00F3 U+00FA U+00C1 U+00C9 U+00CD U+00D3 U+00DA +store( gravevowels ) U+00E0 U+00E8 U+00EC U+00F2 U+00F9 U+00C0 U+00C8 U+00CC U+00D2 U+00D9 +store( circumvowels ) U+00E2 U+00EA U+00EE U+00F4 U+00FB U+00C2 U+00CA U+00CE U+00D4 U+00DB +store( dresisvowels ) U+00E4 U+00EB U+00EF U+00F6 U+00FC U+00C4 U+00CB U+00CF U+00D6 U+00DC + +"'" + any( plainvowels ) > index( acutevowels, 2 ) +"`" + any( plainvowels ) > index( gravevowels, 2 ) +"^" + any( plainvowels ) > index( circumvowels, 2 ) +'"' + any( plainvowels ) > index( dresisvowels, 2 ) +``` + +This is far clearer than the long list of rules that we used earlier. +Obviously we should add one or two more ordinary rules to produce uppercase +and lower-case ç, ý, and also the angled quotes « and ». Then we +will have almost finished the keyboard: + +```keyman +"'" + "y" > U+00FD c Acute-accented Y +"'" + "Y" > U+00DD + +"'" + "c" > U+00E7 c C-cedilla +"'" + "C" > U+00C7 + +"<" + "<" > U+00AB c Angled quotes +">" + ">" > U+00BB +``` + +All we need to do now is to test the keyboard. + +- [Continue with Step 7: Testing the Keyboard](step-7) +- [Back to Step 5: Rules with Context](step-5) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-7.md b/developer/docs/help/guides/develop/tutorial/step-7.md new file mode 100644 index 00000000000..2432bb76f4a --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-7.md @@ -0,0 +1,52 @@ +--- +title: Step 7: Testing the Keyboard +--- + +# Compiling the Keyboard + +Before we can test the keyboard, we must compile it. Choose +Keyboard, Compile +Keyboard or press F7 to compile the +keyboard. The Message window will display the results of the +compilation; if you have no typing errors, the keyboard should compile +successfully. + +If there are any mistakes, an error message will be displayed in the +Message window, which will tell you the line on which the error +occurred. + +## Compiling the Keyboard + +After compiling the keyboard successfully, we can start testing it. +Choose Debug, +Start Debugging or press +F5 to begin testing. The Keyboard debug window +will appear. + +Now we test that all the rules operate as expected. To test the rules, +we type the keystrokes that will give us the output; for example, we can +type a quote ' followed by one of +A, E, +I, O, +U, or Y to test the +uppercase acute-accented vowels. Similarly we can test the other +accents, and C-cedilla (`Ç`) and the angled quotes. If the rules are +correct, all this should work as we wanted. + +Testing the rules in isolation like this will show if the rules are +correct or not, but won't show other possible errors that might occur in +everyday usage of the keyboard. For example, look at what happens if you +type the following quote: + +> `'Alors Alice demande, "Où est mon chat ?"'` + +As you can see, it comes out incorrectly as: + +> `Álors Alice demande, Öù est mon chat ?"'` + +The problem occurs when we have a word in quotes that begins with a +vowel: the keyboard will convert it to an accented vowel. We will need +to come up with a solution to this problem. + +- [Continue with Step 8: Deadkeys](step-8) +- [Back to Step 6: Stores, `any()`, and `index()`](step-6) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-8.md b/developer/docs/help/guides/develop/tutorial/step-8.md new file mode 100644 index 00000000000..52f532ce76d --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-8.md @@ -0,0 +1,78 @@ +--- +title: Step 8: Deadkeys +--- + +## Solving the Problem + +Probably the easiest solution to the problem which we encountered on the +last page is to design the keyboard so that the user types a quote key +twice when they want to produce a quote, but once when they want to use +it as an accent. However, we cannot simply use the rule: + +```keyman +"'" + "'" > "'" +``` + +This will certainly produce a single quote after it's typed twice; +however it will still produce the same error, because the following +keystroke will continue to swallow the quote character from the context. +We need to distinguish between the output of this rule, when the user +wants a quote, and that of a single quote press, when the user wants to +place an accent on a vowel. To implement this behaviour, we use +[deadkeys](/developer/language/reference/deadkey). + +## Deadkeys + +A deadkey is like a character that is used in the context or output but +never appears on the screen. We use deadkeys like this: + +```keyman ++ "'" > deadkey(quote) + +c Handle acute accents +deadkey(quote) + any( plainvowels ) > index( acutevowels, 2 ) + +c Handle a single quote +deadkey(quote) + "'" > "'" +``` + +Note that for the sake of convenience, a deadkey can also be written in +a short form: + +```keyman +dk(quote) c This is identical to deadkey(quote) +``` + +Type the three rules above in place of the existing rule for acute +accents in the keyboard so far. If you test the keyboard now, you will +find that the error no longer occurs. This is because accented vowels +are only produced after the deadkey, and no deadkey is output if the +user types a quote key twice. + +But we've introduced another difference to the keyboard now: the quote +is no longer displayed before you type the vowel. This is because we are +converting the quote to a deadkey. If we prefer, we can still +distinguish between rules in the above manner and display the quote, if +we just add a quote before the deadkey, like this: + +```keyman ++ "'" > "'" dk(quote) + +c Handle acute accents +"'" dk(quote) + any( plainvowels ) > index( acutevowels, 3 ) + +c Handle a single quote +"'" dk(quote) + "'" > "'" +``` + +However, we will not use this technique for the Quick French keyboard. + +Now we can make changes so that all the other accents use deadkeys as +well, for consistency, and add rules to output the accent character by +typing the key twice. + +The Quick French keyboard is now complete. The full source is on the +next page. + +- [Continue with Step 9: The Finished Keyboard](step-9) +- [Back to Step 7: Testing the Keyboard](step-7) \ No newline at end of file diff --git a/developer/docs/help/guides/develop/tutorial/step-9.md b/developer/docs/help/guides/develop/tutorial/step-9.md new file mode 100644 index 00000000000..03e00a27870 --- /dev/null +++ b/developer/docs/help/guides/develop/tutorial/step-9.md @@ -0,0 +1,66 @@ +--- +title: Step 9: The Finished Keyboard +--- + +## The Quick French Keyboard + +Here is the completed keyboard: + +```keyman +c Simplified French Keyboard for Keyman 9.0 +c +c This keyboard program uses a simplified set of keys +c for typing French, especially for those who don't know the +c standard French keyboard. +c +c NOTE: This keyboard was created from the Keyman keyboard +c programming tutorial. + +store(&Version) "9.0" c This keyboard is for use with Keyman 9.0 +store(&Name) "Quick French" +store(&Bitmap) "qfrench.ico" +store(&MnemonicLayout) "1" c This keyboard uses a mnemonic layout. + +begin Unicode > use(Main) + +group( Main ) using keys + +c Store the upper and lowercase vowels with different accents +store( plainvowels ) 'a' 'e' 'i' 'o' 'u' 'A' 'E' 'I' 'O' 'U' +store( acutevowels ) U+00E1 U+00E9 U+00ED U+00F3 U+00FA U+00C1 U+00C9 U+00CD U+00D3 U+00DA +store( gravevowels ) U+00E0 U+00E8 U+00EC U+00F2 U+00F9 U+00C0 U+00C8 U+00CC U+00D2 U+00D9 +store( circumvowels ) U+00E2 U+00EA U+00EE U+00F4 U+00FB U+00C2 U+00CA U+00CE U+00D4 U+00DB +store( dresisvowels ) U+00E4 U+00EB U+00EF U+00F6 U+00FC U+00C4 U+00CB U+00CF U+00D6 U+00DC + +c Output deadkeys only for the accent keys pressed ++ "'" > dk(quote) c Quote for acute accent ++ "`" > dk(bkquote) c Backquote for grave accent ++ "^" > dk(caret) c Caret for circumflex ++ '"' > dk(dbquote) c Double-quote for dieresis + +c Rules for accented vowels +dk(quote) + any( plainvowels ) > index( acutevowels, 2 ) +dk(bkquote) + any( plainvowels ) > index( gravevowels, 2 ) +dk(caret) + any( plainvowels ) > index( circumvowels, 2 ) +dk(dbquote) + any( plainvowels ) > index( dresisvowels, 2 ) + +c Rules for other characters +dk(quote) + "y" > U+00FD c Acute-accented Y +dk(quote) + "Y" > U+00DD + +dk(quote) + "c" > U+00E7 c C-cedilla +dk(quote) + "C" > U+00C7 + +"<" + "<" > U+00AB c Angled quotes +">" + ">" > U+00BB + +c Rules for the accent character itself (type it twice) +dk(quote) + "'" > "'" c Quote +dk(bkquote) + "`" > "`" c Backquote +dk(caret) + "^" > "^" c Caret +dk(dbquote) + '"' > '"' c Double-quote + +c End of keyboard +``` + +- [Back to Step 8: Deadkeys](step-8) \ No newline at end of file diff --git a/developer/docs/help/guides/distribute/index.md b/developer/docs/help/guides/distribute/index.md new file mode 100644 index 00000000000..7b84bf472fd --- /dev/null +++ b/developer/docs/help/guides/distribute/index.md @@ -0,0 +1,10 @@ +--- +title: Distributing keyboards +--- + +- [Package development tutorial](tutorial) (Keyman Desktop, Keyman for macOS, Keyman for mobile apps) +- [Distribute keyboards to Keyman applications](packages) + +## See also + +- [Keyman Engine](/developer/engine/) \ No newline at end of file diff --git a/developer/docs/help/guides/distribute/install-kmp-android.md b/developer/docs/help/guides/distribute/install-kmp-android.md new file mode 100644 index 00000000000..bdba196c908 --- /dev/null +++ b/developer/docs/help/guides/distribute/install-kmp-android.md @@ -0,0 +1,78 @@ +--- +title: Installing Custom Keyboards to your Android Device +--- + +## Overview + +In [Keyman for Android 10.0](/products/android/10.0/), we added the ability to +easily download/share custom keyboards to your Android device. + +## Installing a custom keyboard + +To install a custom keyboard, you will need a link to download the +keyboard package. If you have already copied the kmp file onto the +Android device, skip to Step 2. + +If you want to build and dev your own keyboard, you will need some +technical skills for this, and can read our full step-by-step +instructional on how to do this [here](packages). + +Once you have a website or email with a link to the keyboard package, +follow these steps on your Android device to download and install the +keyboard package into the Keyman for Android application: + +## Step 1) Click the link to save your custom keyboard package file + +The link in this example is for Khmer Angkor keyboard. + +![](../../images/dist-url-screen-ap.png) + +## Step 2) Add Keyboard from Device + +Once the KMP file is on your device, you will need to browse to the KMP +file and select it. From the Keyman menu, select "Settings". From the +Keyman Settings menu, select "Add Keyboard from Device". + +![](../../images/settings-language-ap.png) + +The device will launch a file browser where you'll browse to the +directory of your KMP file. A common places to look is the "Downloads" +folder. + +![](../../images/dist-file-browser-ap.png) + +Selecting the KMP file should bring you to Step 3) + +## Step 3) Grant Keyman for Android access to storage (Android 6.0+ only) + +On Android 6.0 (Marshmallow) and higher, mobile apps need to request +permission to access storage. Keyman for Android needs access to read +storage for installing the KMP file. At the dialog, select "ALLOW". Once +authorized, Keyman for Android won't need to ask for storage permission +again, unless the user revokes or uninstalls the app. + +![](../../images/dist-storage-permission-ap.png) + +Older versions of Android grant Storage permissions at app installation +time, so those users can skip this step. + +## Step 4) Keyboard Package welcome screen + +Keyman for Android will parse the metadata in the package. If the +keyboard package includes a "welcome.htm" file, this will be displayed +at the confirmation to install the keyboard package + +![](../../images/dist-welcome-ap.png) + +If "welcome.htm" is not included, a generic page with the package ID and +package version will be shown. + +Click the left "Install" button to install the entire keyboard package + +## Step 5) The keyboard is successfully installed! + +All the keyboards in the package are installed as a group. In this +example, the package only has the "Khmer Angkor" keyboard, so it becomes +the active keyboard + +![](../../images/dist-install1-ap.png) \ No newline at end of file diff --git a/developer/docs/help/guides/distribute/install-kmp-ios.md b/developer/docs/help/guides/distribute/install-kmp-ios.md new file mode 100644 index 00000000000..de4d3a64cb5 --- /dev/null +++ b/developer/docs/help/guides/distribute/install-kmp-ios.md @@ -0,0 +1,53 @@ +--- +title: Installing Custom Keyboards to your iPhone or iPad +--- + +## Overview + +In version 10 of Keyman for iPhone and iPad, we added the ability to easily download custom keyboards to your iOS device. + +## Installing a custom keyboard + +To install a custom keyboard, you will first need a link to the keyboard +package on a website or in your email. + +If you want to build and dev your own keyboard, you will need some +technical skills for this, and can read our full step-by-step +instructional on how to do this [here](packages). + +Once you have a website or email with a link to the keyboard package, +follow these steps on your iPhone or iPad to download and install the +keyboard package into the Keyman for iPhone and iPad application: + +## Step 1) Click the link to your custom keyboard package file + +The link in this example is for GFF Amharic 7 keyboard. + +![](../../images/dist-url-screen-i.png) + +Safari will display an option to open the KMP file with Keyman + +![](../../images/dist-kmp-open-i.png) + +## Step 2) Click Open in "Keyman" + +Keyman for iPhone and iPad will parse the metadata in the package. If +the keyboard package includes a "welcome.htm" file, this will be +displayed at the confirmation to install the keyboard package + +![](../../images/dist-welcome-i.png) + +If "welcome.htm" is not included, a generic page with the package ID and +package version will be shown. + +## Step 3) Click the top right "Install" button + +The keyboard from the keyboard package is successfully installed! + +![](../../images/dist-kmp-success-i.png) + +All the keyboards in the package are installed as a group. In this +example, the package only has the "GFF Amharic 7" keyboard, so it +becomes the active keyboard + +![](../../images/dist-install1-i.png) diff --git a/developer/docs/help/guides/distribute/packages.md b/developer/docs/help/guides/distribute/packages.md new file mode 100644 index 00000000000..e3382220a30 --- /dev/null +++ b/developer/docs/help/guides/distribute/packages.md @@ -0,0 +1,131 @@ +--- +title: Distribute keyboards to Keyman Applications +--- + +## Overview + +Keyboard package files contain one or more keyboards, along with readme +files, fonts (if your keyboard requires a custom font), and any other +files you wish to include. You should create a package file to bundle +your keyboard with fonts and help into a simple, single file that is +easy for an end-user to install. + +Internally, as well as your own files, the package file will contain +metadata files "kmp.inf" and "kmp.json", which list the details Keyman +needs to install the package. The package file is a ZIP compatible +archive. + +> ### Tip +You can distribute keyboards and lexical models in package files, but +you can't include both in the same package file. + +#### Keyman Desktop + +Keyman Desktop can install package files, including installing fonts, +creating Start Menu shortcuts, and adding appropriate registry entries +for uninstallation. + +On Windows, the context menu for a package file has one additional +entry: "Install". + +#### Keyman for macOS + +Keyman for macOS can install package files with fonts and keyboards, and +shortcuts in the package will be available through the keyboard's entry +in Keyman Configuration. + +#### Keyman for Android and Keyman for iPhone and iPad + +Keyman mobile applications can install the same package files as Keyman +Desktop, as long as the package includes keyboards for touch layouts. + +## Package file contents + +A package can have a variety of different files contained within. The +following files and file types are recognized by the package installer: + +\*.kmx (Desktop and macOS only) +: Keyboard files. Each of these will be installed. Keyman + Configuration will not allow installation or uninstallation of a + single keyboard from a package. They will always be treated as a + group for installation and uninstallation. + +\*.kvk (Desktop and macOS only) +: On Screen Keyboard files, associated with each keyboard file. + +\*.js (mobile only) +: Touch layout Keyboard files. When Keyman mobile applications install + a keyboard package, all included keyboards will be installed as a + group. With Keyman Developer 10, the keyboard version information is + in kmp.json, and no longer within the JS file names. + +welcome.htm +: Introductory help for the keyboard, HTML format. This will normally + be displayed when the package is installed by the user, and is also + the entry point for help when accessed via Keyman's help system or + Keyman Configuration. + +readme.htm +: Displayed before a package is installed, together with brief + metadata about the package, to allow the user to determine if they + wish to continue installation of the package. + +kmp.inf (Legacy versions of Keyman) +: A Windows .ini format file that lists each of the files in the + package, together with metadata. + +kmp.json +: A JSON format file contains metadata for the keyboard package such + as package version, keyboard versions, and lists each of the files + in the package. For more explanation of the structure of the JSON + file, please read the + [metadata](../../reference/file-types/metadata) documentation. + +\*.ttf, \*.otf, \*.ttc +: Truetype font files that will be installed with the package, and + uninstalled when the package is removed. On mobile, these fonts will + be available only within the Keyman app and the on-screen-keyboard, + not in other apps. + +## Share the keyboard package file + +> ### Tip +Read [Step 2: Organizing the Keyboard Files](../../../keyboards/github/step-2) +to know which files to include or exclude in the keybord folder. + +Once the keyboard package .kmp file is created, you can share them via +external storage devices (USB drive, SD card, etc). You can also share +the package file via a cloud storage system (Google Drive, Dropbox or +similar service), then share the link to your device via text, note or +email. Alternatively, you can upload the .kmp file to a public facing +website. For this example, the keyboard package for Khmer Angkor is +being uploaded: + +1. khmer_angkor.kmp (the keyboard package .kmp file) + +## Putting the keyboard package on a website + +Once all the files have been uploaded, you will need to provide a link +to the keyboard package .kmp file for your device to download and +install. This can either be a link on a web page, or a link in an email. +In this tutorial, a very simple .html web page with a link to the +khmer_angkor.kmp file is created: + +``` markup + + + + + Custom Keyboard URL + + +``` + +The link must be in the format `http://` or `https://` + +Upload the web page to your public facing website. Once done, you can +install the keyboard package onto your mobile devices by following these +steps: + +- [Installing custom keyboards to your iPhone or iPad](install-kmp-ios) +- [Installing custom keyboards to your Android device](install-kmp-android) diff --git a/developer/docs/help/guides/distribute/tutorial/index.md b/developer/docs/help/guides/distribute/tutorial/index.md new file mode 100644 index 00000000000..ec57e57e100 --- /dev/null +++ b/developer/docs/help/guides/distribute/tutorial/index.md @@ -0,0 +1,36 @@ +--- +title: Package Tutorial +--- + +[Step 1: What do we include?](step-1) + +[Step 2: Creating Additional Files for the Package](step-2) + +[Step 3: Creating a package and adding files](step-3) + +[Step 4: Filling in package details](step-4) + +[Step 5: Shortcuts](step-5) + +[Step 6: Compiling, testing and distributing a Package](step-6) + +## Overview + +Welcome! In this tutorial, you will learn how to create a +[package](../../../reference/file-types/kmp). A package is a collection +of files, compressed into a single file, just like a ZIP file. It is +designed to make installation of keyboards, fonts and related +documentation straightforward for the end user. When done, the package +can be installed into Keyman Desktop through a simple dialog. Keyman for +mobile apps can also download and install keyboards through the keyboard +package. + +We will be creating a Khmer Angkor package. You can make your own +package based on the Quick French keyboard from the [keyboard tutorial](../../develop/tutorial). + +### Let's begin + +Let's get started! Move on to the next topic to begin the first step, +choosing what to include in the package. + +[Step 1: What do we include?](step-1) \ No newline at end of file diff --git a/developer/docs/help/guides/distribute/tutorial/step-1.md b/developer/docs/help/guides/distribute/tutorial/step-1.md new file mode 100644 index 00000000000..a18fce49ac9 --- /dev/null +++ b/developer/docs/help/guides/distribute/tutorial/step-1.md @@ -0,0 +1,35 @@ +--- +title: Step 1: What do we include? +--- + +What is the purpose of a package? To make installation of a keyboard, +fonts, documentation, and on screen keyboard as straightforward as +possible for the end user. + +We need to keep this goal in mind as we work on all the aspects of a +package. + +A good package will: + +1. Collect the keyboard and font files together for simple installation +2. Include Start Menu items for documentation + +A great package will also: + +1. Include a 'readme' visible before install. +2. Include a 'welcome.htm' file which is displayed after install. +3. Include an On Screen Keyboard if relevant. +4. Include documentation on use of the keyboard. + +Packages uploaded to the Tavultesoft website will get basic icon ratings +reflecting their ease of install/use: + +- ![](../../../images/tutorial_package_includesfonts.gif) includes fonts +- ![](../../../images/tutorial_package_includesdocs.gif) includes documentation +- ![](../../../images/tutorial_package_includesosk.gif) includes on screen keyboards +- ![](../../../images/tutorial_package_includeswelcome.gif) includes welcome.htm + +In general, the more icons that a package earns, the easier that end +users will find it to start using. + +[Step 2: Creating Additional Files for the Package](step-2) \ No newline at end of file diff --git a/developer/docs/help/guides/distribute/tutorial/step-2.md b/developer/docs/help/guides/distribute/tutorial/step-2.md new file mode 100644 index 00000000000..17dc613ba8d --- /dev/null +++ b/developer/docs/help/guides/distribute/tutorial/step-2.md @@ -0,0 +1,127 @@ +--- +title: Step 2: Creating Additional Files for the Package +--- + +You should create or select some additional files for a package. Below +are a list of the typical files that you would create for or include in +a package. + +readme.htm + +: A short description of the package, its use restrictions, and what + it includes. Try to keep the readme under 10 lines long. The readme + is displayed in the package install dialog and should be an html + file for optimal formatting. + + > ### Tip + As the package has not been installed at this stage, and you are using fonts that may not yet be available on the target device, you should use CSS @font-face declarations to ensure that the text is readable on all devices. + + Create the HTML file in any HTML editor. + + > ### Tip + If using Microsoft Word, choose HTML (clean) when saving to create a smaller file. + + Note, if your HTML editor puts images into a subfolder, you will need to edit the HTML source so that all files are in the same folder -- the package builder will not maintain subfolders. You can easily edit the HTML source in Keyman Developer. + + Also, if your welcome or readme files use embedded external images, stylesheets, javascript or other files, you will need to add these files to your package as well. + +welcome.htm + +: When including an introductory help file in your package, you must + name the file welcome.htm. This file will be detected during install + and displayed (in a window roughly two thirds of the user's screen + width) after the package install completes successfully. Make sure + that you design your HTML file so that it can be resized to fit the + user's screen - avoid extra wide tables or wide fixed width + elements. + + At this stage of the installation, fonts in the package have been installed, so you can include text that uses those fonts. + + Welcome.htm will also be accessible after installation from Keyman Configuration under the Package Options menu, and from the Keyboard Help item and On Screen Keyboard toolbar button. + + The intention of welcome.htm is to provide instructions on getting started with your keyboards. + + > ### Tip + Useful information to include in welcome.htm is: + - key sequences - especially for characters that may not be immediately obvious. + - names of fonts in the package. + - names of keyboards in the package. + - links to additional help on your website or more extensive documentation files in the package. + - a link to an official distribution site for your package (even + if it is the Keyman website) - so that users know where to find + the latest version of your package. + + You should avoid including instructions for the use of Keyman + itself - although a basic "click the Keyman icon and choose Quick + French" would be helpful. + + > ### Tip + If you want links to your website to open in the user's preferred + browser, preface the href link with `link:`, e.g. + `website` + The `link:` sceheme will open the referred file in the default + application - that is, a web browser for URLs and links, Notepad for + .txt files, Adobe Reader for PDFs. You can use `link:` to open any + of the files in the package, e.g. `link:docs.pdf` will open the file + docs.pdf in Adobe Reader or the default PDF reader on the system. + + To save you the effort of writing a welcome and readme file for the + Quick French example, we have placed some in the Samples/QFrench + folder. + + If you create documents in other formats, for example PDF or + printable documentation, you should link to that in the welcome.htm. + + > ### Tip + You can include multiple "welcome.htm" files for different languages + by appending a hyphen and the BCP 47 language code to the filename, + for example welcome-fr.htm for French. + +Fonts + +: A font is the single most important item to include with a keyboard + – if the characters of the language you are supporting are not in + fonts included with target operating systems. Installing fonts is + tedious, so make sure that your users don't have to locate and + install fonts themselves! + + .TTF, .OTF, and .TTC fonts will be installed by the package + installer, and uninstalled when the package is uninstalled. A list + of the fonts installed is displayed in the Install Package dialog. + +Keyboards + +: Add the .kmx compiled Keyman keyboards to the package. You can add + multiple keyboards to the package, but be judicious. + + > ### Tip + Don't forget to add the On Screen keyboard .KVK file associated with + your keyboard to the package. KVK files are not compiled into the + .KMX file -- although the .ICO/.BMP is. + + Add the .js compiled Keyman touch layout keyboards to the package. + +Documentation + +: The two preferred documentation formats are HTML and PDF. You should + avoid .DOC, .RTF, and other formats -- .DOC files in particular are + not recommended due to the possibility of macro viruses. + + Remember that HTML files can be displayed on any computer without + additional software. PDF files require Adobe Reader or a compatible + PDF viewer application. You may choose to include both and HTML + documentation - PDF documents often print better than HTML + documents, but HTML documentation is more accessible and translates + better to on-screen or web use. + + > ### Tip + If you use HTML, don't forget to also add all the included files + such as images and stylesheets! + +Splash Image +: The splash image is a 140x250 pixel image that is displayed when the + package is installed, at the left of the Package Install dialog. + Including a splash image makes your package look more professional + and polished, so a splash image is recommended! + +[Step 3: Creating a package and adding files](step-3) \ No newline at end of file diff --git a/developer/docs/help/guides/distribute/tutorial/step-3.md b/developer/docs/help/guides/distribute/tutorial/step-3.md new file mode 100644 index 00000000000..657f2cd02b5 --- /dev/null +++ b/developer/docs/help/guides/distribute/tutorial/step-3.md @@ -0,0 +1,31 @@ +--- +title: Step 3: Creating a package and adding files +--- + +We are finally ready to open up the Package Editor and create the new +package. + +- In the Project Window in Keyman Developer, click the **Packages** tab, and click **New Package...**. Enter the path and filename of the package you are creating. + +> ### Tip +This tutorial makes a package named `khmer_angkor.kps`, but you could call yours `qfrench.kps`. + +A package source file will have the extension .kps, and will be compiled in a file with extension .kmp. + +After you click OK, the Package Editor will open with the Files tab visible. + +![](../../../images/tutorial_distribute_keyboard_3_files.png) + +- In the Files tab, click **Add...** to add + all the files we discussed in the previous step to the package. You + can add multiple files at once, and from multiple folders. When the + package is compiled, all the files will be placed in the same folder + within the package. +- If your package includes .js touch layout keyboards, you can + associate fonts and languages in the Keyboards tab. A valid [BCP 47 language tag](../../../reference/bcp-47) must be set or the keyboard will not install on your mobile device. + +![](../../../images/tutorial_distribute_keyboard_3.png) + +You could stop here. This would be a completely valid package, but it would not be as good as it could be. So let's continue on to the next step, and fill in some descriptions of the package. + +[Step 4: Filling in package details](step-4) \ No newline at end of file diff --git a/developer/docs/help/guides/distribute/tutorial/step-4.md b/developer/docs/help/guides/distribute/tutorial/step-4.md new file mode 100644 index 00000000000..67c55fe66b8 --- /dev/null +++ b/developer/docs/help/guides/distribute/tutorial/step-4.md @@ -0,0 +1,63 @@ +--- +title: Step 4: Filling in package details +--- + +Click on the Details tab in the Package Editor. You should fill in as +many details as you can on this page. + +![](../../../images/tutorial_distribute_keyboard_details.png) + +Package Name + +: The Package Name will be displayed in the package install dialog, + and within Keyman Desktop Configuration, wherever the package is + referred to. + +Readme File + +: Select the readme file from the list of files you added in the + previous step. Remember that it should be a HTML file for optimum + clarity. + +Version + +: A version number for the package is important - it helps the your + users know that they are using the most recent update of your + package. The version format you should use is `1.0`. When making a + major change to your package or keyboards in your package, increment + the first part and set the second part to, e.g. `2.0`; when making a + bug fix or a minor update, increment the second part, e.g. `1.1`. + +Version numbers should be in the form `major.minor[.subversion]`. + Subversion is optional but is helpful for small bug fix releases. + Each of the sections of the version should be an integer. Keyman + Desktop does integer comparisons on the version numbers, so, for + example, version `2.01` is regarded as older than version `2.2`. + Alphabetic or date formats should be avoided as the installer for + the keyboard cannot determine which version is older reliably. + +Copyright + +: Enter copyright details for your package and keyboards. Keep this + reasonably short or it won't be clear for end users. + +Author + +: Enter your name or the name of your company. + +Email + +: Enter a contact email address where package users can contact you. + If you don't want to be contacted via email, leave this field empty + +Website + +: Enter the name of the website where you will have information about + this keyboard. If you want to host it on keyman.com, you could enter + `http://www.keyman.com/` + +Image file +: Select the splash image file that you created in Step 2 from the + list of files in your package. + +[Step 5: Shortcuts](step-5) diff --git a/developer/docs/help/guides/distribute/tutorial/step-5.md b/developer/docs/help/guides/distribute/tutorial/step-5.md new file mode 100644 index 00000000000..eb24d70f133 --- /dev/null +++ b/developer/docs/help/guides/distribute/tutorial/step-5.md @@ -0,0 +1,49 @@ +--- +title: Step 5: Shortcuts +--- + +Click on the Shortcuts tab in the Package Editor. + +![](../../../images/tutorial_distribute_keyboard_shortcuts.png) + +While it may be a good idea to include Start Menu shortcuts for your +package, on recent versions of Windows these are not very visible to end +users. This means that you should ensure that all instructions are +available through the **welcome.htm** file as well. The Start Menu +shortcuts were designed originally for Windows-based keyboard packages +and work slightly differently in macOS. + +You should consider adding the following items to the Start Menu: + +- Documentation shortcuts +- Welcome.htm shortcut + +> ### Note +While Keyman Developer 8.0 and earlier versions of the documentation +advised including an uninstall shortcut to the package, this is no +longer recommended. Users should uninstall your package from Keyman +Configuration. Adding an uninstall shortcut to the package adds +confusion to the Start Menu search on Windows, and is not compatible +with macOS keyboards. + +Click **New** to add a new shortcut to the +package. Enter a description for the shortcut, and select the program or +file to start from the Program list. Four predefined program entries +(Start Product), (Product Configuration), (Product Help) and (About +Product) will be translated into the appropriate shortcuts to start +Keyman Desktop tasks as described. + +> ### Note +In Keyman 6 and earlier, the predefined targets $KEYMAN\keyman.exe and +$KEYMAN\kmshell.exe were available. These are translated to (Start +Product) and (Product Configuration), respectively, in Keyman Desktop +7.0 and later versions. + + + +> ### Tip +Packages are not listed in the Control Panel Add/Remove Programs applet +with Keyman Desktop 7.0 and later versions. Packages can be uninstalled +through the Start Menu shortcut or from Keyman Desktop Configuration. + +[Step 6: Compiling, testing and distributing a Package](step-6) \ No newline at end of file diff --git a/developer/docs/help/guides/distribute/tutorial/step-6.md b/developer/docs/help/guides/distribute/tutorial/step-6.md new file mode 100644 index 00000000000..374584c3e1c --- /dev/null +++ b/developer/docs/help/guides/distribute/tutorial/step-6.md @@ -0,0 +1,68 @@ +--- +title: Step 6: Compiling, testing and distributing a Package +--- + +In the Package Editor, click on the **Compile** tab. + +![](../../../images/tutorial_distribute_keyboard_compile.png) + +Click **Compile Package** to compile the +package into a .kmp file. Compiling takes all the files listed for the +package, compresses them (using a .ZIP-compatible format) and adds the +package information, all into a single file. If any files are not +available, an error will be listed in the Messages window. + +After compiling, you can test the package installation in Keyman +Desktop, by clicking **Install Package**. You +should test that all the keyboards and fonts install successfully, that +the Readme and Welcome files are displayed during the install, and that +the documentation is accessible to the end user. Make sure that the On +Screen Keyboard installs with your keyboards, and that the shortcuts are +correctly listed and working in the Start Menu. + +> ### Advice +The distribution model for Keyman keyboards is changing. We now +recommend distributing source for keyboards through the [Keyman Cloud Keyboard Repository](/developer/keyboards/). The instructions here +remain, but the binary distribution model is deprecated. + +## Distributing a package on the Keyman Cloud Keyboard Repository + +Once you have tested the package to your satisfaction, it is time to +distribute it. We recommend uploading your keyboard package to the +[Keyman Cloud Keyboard Repository](/developer/keyboards/) + +## Distributing a package on your own website + +If you distribute a package on your own site, we have the following +recommendations: + +1. Ensure the MIME type on the web server or folder for .KMX and .KMP + files is set up to application/octet-stream. Without this, .KMP + files may be recognised as .ZIP files -- this is not helpful to the + end user as it will be opened in the wrong application. If you can't + make this change, consider hosting the keyboard package on the + Tavultesoft website to make things easier for your end user. +2. Avoid putting the .KMP file in an archive (e.g. .ZIP) or + self-expanding archive (.EXE) - this makes it harder for end users + to install. A .KMP file is already compressed (it is actually just a + ZIP archive file!) and you won't save much space by recompressing + it. +3. Include a link to the Keyman download page: + `http://keyman.com/desktop/` + +## Distributing a package by email + +Attaching the KMP file directly to an email may be blocked for security +reasons. As mentioned above, a KMP file is basically a ZIP file and +mobile keyboard data is in JavaScript, this is a combination that looks +suspicious to many email servers. You can upload it to a Google drive, +and email a link for downloading the file + +You may need to do some exploring to get your mobile device to load the +keyboard from the KMP file into Keyman. The device may not open the file +directly, claiming it is an unrecognized type. If you look for other +options to open the file, hopefully you can get it to Keyman. For +example, in iOS, I had to tap on the three dots to the right, then +choose "Open in" and then I could choose "Copy to Keyman." In Android, I +had to download the file to my device, then open the KMP file in a file +manager before I could install it in Keyman. \ No newline at end of file diff --git a/developer/docs/help/guides/index.md b/developer/docs/help/guides/index.md new file mode 100644 index 00000000000..55604780ad2 --- /dev/null +++ b/developer/docs/help/guides/index.md @@ -0,0 +1,13 @@ +--- +title: Keyman Developer Guides +--- + +Need help using Keyman Developer? You'll find everything you need here, including product documentation, frequently asked questions and tutorials. + +- [Introduction to Keyman Developer](intro) +- [Developing Keyman keyboards](develop/) +- [Testing Keyman keyboards](test/) +- [Distributing Keyman keyboards](distribute/) +- [Developing Keyman lexical models (for predictive text and autocorrect)](lexical-models/) +- [Distributing Keyman lexical models](lexical-models/distribute/) +- [Keyman Developer command line tools guide](command-line) \ No newline at end of file diff --git a/developer/docs/help/guides/intro.md b/developer/docs/help/guides/intro.md new file mode 100644 index 00000000000..fd72c898f91 --- /dev/null +++ b/developer/docs/help/guides/intro.md @@ -0,0 +1,43 @@ +--- +title: Introducing Keyman Developer +--- + +## Welcome to Keyman Developer + +Keyman Developer allows you to create your own keyboard layouts for use +on the Keyman platform. Keyman is a multi-platform input method solution +that runs on Windows, macOS, the web, mobile web, iOS and Android and +Linux. + +There are two core applications included in Keyman Developer: the Keyman +Developer IDE (formerly called TIKE), and the command line compiler kmc. + +[Watch a video](https://youtu.be/kwhgx_eX4Es) that highlights some of +the Keyman Developer features. + +## Keyman Developer IDE + +The Keyman Developer IDE is a complete environment for designing, +developing, testing, and packaging your keyboards for distribution. Some +of the major features of Keyman Developer IDE are: + +- Keyboard Editor, for creating keyboards visually for all platforms +- Touch Layout editor, for creating fluid touch layouts +- Package Editor, for creating a package of keyboard, fonts and files for distribution (used on all platforms except web) +- Lexical Model Editor, for creating predictive text models +- Integrated compiler, to compile keyboards, packages and models +- Fully interactive debugger for testing keyboards and models +- Character Map, which supports viewing Unicode fonts under all Windows versions +- On Screen Keyboard editor, for creating visual representations of keyboards +- Projects, for managing keyboard and lexical model development projects large and small + +Source files (except images!) are normally written in UTF-8 format, so +they can be opened with any text editor. However, the Keyman Developer +IDE provides much tooling to simplify editing each of the types of +files. The Keyman Developer IDE runs on Windows. + +## kmc, the command line compiler + + +kmc, the command-line compiler, is a comprehensive tool that lets you +compile keyboards, packages, models and projects from the command-line. diff --git a/developer/docs/help/guides/lexical-models/advanced/index.md b/developer/docs/help/guides/lexical-models/advanced/index.md new file mode 100644 index 00000000000..951df2fc48e --- /dev/null +++ b/developer/docs/help/guides/lexical-models/advanced/index.md @@ -0,0 +1,19 @@ +--- +title: Advanced Lexical Models Topics +--- + +> For the following topics, **knowledge of TypeScript or JavaScript is +required**. + +The Keyman lexical model engine is capable of much more sophisticated +lexical models than the one described in the [tutorial](../tutorial). To +make advanced models, you will need to modify the [model definition file](model-definition-file), also known as the [`.model.ts` file](../../../reference/file-types/model-ts). + +Once you understand how to change the model.ts file, you can attempt +these customizations to an existing wordlist project: + +[Changing the default punctuation](punctuation) + +[Creating a custom search key function](search-term-to-key) + +[Customizing the word breaker](word-breaker) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/advanced/model-definition-file.md b/developer/docs/help/guides/lexical-models/advanced/model-definition-file.md new file mode 100644 index 00000000000..97b207d8f32 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/advanced/model-definition-file.md @@ -0,0 +1,102 @@ +--- +title: The model definition file +--- + +This is a small [TypeScript](https://www.typescriptlang.org/) source +code file that tells us how to define our model. + +In the case of the **wordlist lexical models**, the model definition +file indicates where to find the [TSV source files](../../../reference/file-types/tsv), as well as gives us the option to tell the compiler a little bit more about our language’s spelling system or *orthography*. + +## The model definition template + +**Keyman Developer** provides a default model definition similar to the +following. If you want to create the file yourself, copy-paste the +following template, and save it as `model.ts`. Place this file in the +same folder as `wordlist.tsv`. + +```typescript +/* + sencoten 1.0 generated from template. + + This is a minimal lexical model source that uses a tab delimited wordlist. + See documentation online at https://help.keyman.com/developer/ for + additional parameters. +*/ + +const source: LexicalModelSource = { + format: 'trie-1.0', + wordBreaker: { + use: 'default', + }, + sources: ['wordlist.tsv'], +}; +export default source; +``` + +Let's step through this file, line-by-line. + +On the first line, we're declaring the source code of a new lexical +model. + +```typescript +const source: LexicalModelSource = { +``` + +On the second line, we're saying the lexical model will use the +`trie-1.0` format. The `trie` format creates a lexical model from one or +more word lists; the `trie` structures the lexical model such that it +can predict through thousands of words very quickly. + +```typescript + format: 'trie-1.0', +``` + +On lines 3–5, we're specifying the word breaking algorithm that we want +to use. Keyman supplies a default algorithm that conforms to the rules +expected for many languages. + +```typescript + wordBreaker: { + use: 'default', +}, +``` + +On the sixth line, we're telling the `trie` where to find our wordlist. + +```typescript + sources: ['wordlist.tsv'], +``` + +The seventh line marks the termination of the lexical model source code. +If we specify any customizations, they **must** be declared above this +line: + +```typescript +}; +``` + +The eighth line is necessary to allow external applications to read the +lexical model source code. + +```typescript +export default source; +``` + +## Customizing our lexical model + +The template, as described in the previous section, is a good starting +point, and may be all you need for your language. However, most language +require a few customizations. The `trie-1.0` wordlist model supports the +following customizations: + +[Punctuation](punctuation) +: How to define certain punctuation in your language. + +[Word breaker](word-breaker) +: How to determine when words start and end in the writing system. + +[Search term to key](search-term-to-key) +: How and when to ignore accents and letter case. + +To see all of the things possible in a model definition file, see the [`LexicalModelSource` interface](https://github.com/keymanapp/keyman/blob/stable-15.0/developer/js/source/lexical-model-compiler/lexical-model.ts#L95-L146). \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/advanced/punctuation.md b/developer/docs/help/guides/lexical-models/advanced/punctuation.md new file mode 100644 index 00000000000..a665f08e4d8 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/advanced/punctuation.md @@ -0,0 +1,73 @@ +--- +title: Punctuation +--- + +The lexical models use two different kinds of punctuation: + +- Quotation marks around the “keep” suggestion. +- What kind of space to insert after words, if any. + +Both of these can be customized by adding the punctuation to [model definition file](./model-definition-file). Here is a full example of a model definition file using default punctuation: + +```typescript +const source: LexicalModelSource = { + format: 'trie-1.0', + sources: ['wordlist.tsv'], + // CUSTOMIZE THIS: + punctuation: { + quotesForKeepSuggestion: { + open: "“", close: "”" + }, + insertAfterWord: " ", + }, + // other customizations go here: +}; + +export default source; +``` + +## Customizing `quotesForKeepSuggestion` + +These are the quotation marks that surrond the “keep” suggestion when +it's displayed in the suggestion bar. By defaut, the quotations used are +“smart” quotation marks used in English typography. Namely, the **open +quote** is `“` U+201C LEFT DOUBLE QUOTATION MARK, and the **close +quote** is `”` U+201D RIGHT DOUBLE QUOTATION MARK. + +Let's customize this to use `«` and `»` for the open and close quote, respectively. To do this, change the part labeled +`quotesForKeepSuggestion`: + +```typescript +punctuation: { + quotesForKeepSuggestion: { + open: "«", close: "»" + }, +}, +``` + +## Customizing `insertAfterWord` + +Many languages insert a space after a word. Some languages, like Thai or Khmer, do not use spaces. To suppress the space, you may set `insertAfterWord` to the empty string: + +```typescript +punctuation: { + insertAfterWord: "", +}, +``` + +You can even use an alternate spacing character, if required by your language: + +```typescript +punctuation: { + insertAfterWord: "\u200B", // U+200B ZERO WIDTH SPACE +}, +``` + +## See also + +[The TypeScript definition of +`LexicalModelPunctuation`](https://github.com/keymanapp/keyman/blob/4211b468949860b8fb4a4707710472ab9e33c581/common/lexical-model-types/index.d.ts#L328-L371) + +------------------------------------------------------------------------ + +[Return to “Advanced Lexical Model Topics”](./) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/advanced/search-term-to-key.md b/developer/docs/help/guides/lexical-models/advanced/search-term-to-key.md new file mode 100644 index 00000000000..086a9ca01cf --- /dev/null +++ b/developer/docs/help/guides/lexical-models/advanced/search-term-to-key.md @@ -0,0 +1,93 @@ +--- +title: Search term to key +--- + +To look up words quickly, the `trie` model creates a _search key_ +that takes the latest word (as determined by the +[word breaker](word-breaker)) and converts it into an internal form. The +purpose of this internal form is to make searching for a word work, as +expected, regardless of things such as **accents**, **diacritics**, +**letter case**, and minor **spelling variations**. The internal form is +called the _key_. Typically, the key is always in +lowercase, and lacks all accents and diacritics. For example, the key +for “naïve" is `naive` and the key for “Canada” is `canada`. + +The form of the word that is stored is “regularized” through the use of a _key function_, which you can define in TypeScript code. + +> ### Note: +This function runs both **on every word when the wordlist is compiled** and **on the input, whenever a suggestion is requested**. This way, whatever a user types is *matched* to something stored in the lexical model, without the user having to type things in a specific way. + +The key function takes a string which is the raw search term, and +returns a new string, being the “regularized” key. As an example, +consider the **default key function**; that is, the key function that is +used if you do not specify one: + +```typescript +searchTermToKey: function (term: string): string { + // Use this pattern to remove common diacritical marks (accents). + // See: https://www.compart.com/en/unicode/block/U+0300 + const COMBINING_DIACRITICAL_MARKS = /[\u0300-\u036f]/g; + + // Lowercase each letter in the string INDIVIDUALLY. + // Why individually? Some languages have context-sensitive lowercasing + // rules (e.g., Greek), which we would like to avoid. + // So we convert the string into an array of code points (Array.from(term)), + // convert each individual code point to lowercase (.map(c => c.toLowerCase())), + // and join the pieces back together again (.join('')) + let lowercasedTerm = Array.from(term).map(c => c.toLowerCase()).join(''); + + // Once it's lowercased, we convert it to NFKD normalization form + // This does many things, such as: + // + // - separating characters from their accents/diacritics + // e.g., "ï" -> "i" + "◌̈" + // - converting lookalike characters to a canonical ("regular") form + // e.g., ";" -> ";" (yes, those are two completely different characters!) + // - converting "compatible" characters to their canonical ("regular") form + // e.g., "𝔥𝔢𝔩𝔩𝔬" -> "hello" + let normalizedTerm = lowercasedTerm.normalize('NFKD'); + + // Now, using the pattern defined above, replace each accent and diacritic with the + // empty string. This effectively removes all accents and diacritics! + // + // e.g., "i" + "◌̈" -> "i" + let termWithoutDiacritics = normalizedTerm.replace(COMBINING_DIACRITICAL_MARKS, ''); + + // The resultant key is lowercased, and has no accents or diacritics. + return termWithoutDiacritics; +}, +``` + +This should be sufficient for most Latin-based writing systems. However, +there are cases, such as with SENĆOŦEN, where some characters do not +decompose into a base letter and a diacritic. In this case, it is +necessary to write your own key function. + +## Use in your model definition file + +To use this in your model definition file, provide a function as the `searchTermToKey` property of the lexical model source: + +```typescript +const source: LexicalModelSource = { + format: 'trie-1.0', + sources: ['wordlist.tsv'], + searchTermToKey: function (wordform: string): string { + // Your searchTermToKey function goes here! + let key = wordform.toLowerCase(); + return key; + }, + // other customizations go here: +}; + +export default source; +``` + +## Suggested customizations + +- For all writing systems, **normalize into NFKD** or **NFKC** form using `wordform = wordform.normalize('NFKD')`. +- For Latin-based scripts, **lowercase** the word, and **remove diacritics**. +- For scripts that use the U+200C zero-width joiner (ZWJ) and/or the U+200D zero-width non-joiner (ZWNJ) (e.g., Brahmic scripts), **remove the ZWJ or ZWNJ** from the **end** of the input with `wordform = wordform.replace(/[\u200C\u200D]+$/` + +------------------------------------------------------------------------ + +[Return to “Advanced Lexical Model Topics”](./) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/advanced/unicode-breaker-extension.md b/developer/docs/help/guides/lexical-models/advanced/unicode-breaker-extension.md new file mode 100644 index 00000000000..a9e4d3776cc --- /dev/null +++ b/developer/docs/help/guides/lexical-models/advanced/unicode-breaker-extension.md @@ -0,0 +1,539 @@ +--- +title: Customization and extension of the Unicode word breaker +--- + +> ### Note: +While this offers a great amount of flexibility and customization that may assist predictions for your language, note that this approach may get quite technical! + +As mentioned on the [main word breaker page](./word-breaker), +our currently-supported lexical models need to know what a word +is in running text. After all, it is quite difficult to look up a word in a +dictionary when unclear about what the start and end of that word even is. + +In languages using the Latin script—like, English, French, +and SENĆOŦEN—finding words is easy. Words are separated by spaces or +punctuation. The actual rules for where to find words can get quite tricky to +describe, but Keyman implements the [Unicode Standard Annex #29 §4.1 Default Word Boundary Specification](https://unicode.org/reports/tr29/#Word_Boundaries) which works well for most languages. + +This guide is about techniques that may be used to customize and extend +the behaviors of that specification to be better tailored to your language. +This is done by using similar patterns and structures to the rules found in +the specification itself. + +There are three ways - all of them optional - to extend and customize +the word-breaking rules themselves: + +* If you need to prevent splits in very specific scenarios and/or add splits in other specific scenarios, you may specify [context-based rules](#rules) to obtain the desired behavior. +* If certain characters are not handled appropriately for their role in + your language, you may [map characters](#map) to different + word-breaking character classes - including custom ones. This will + override the default property they are assigned by the default + implementation, with the new property applying for all word-breaking + rules. +* If the default word-breaking classes from the specification are + too general for certain aspects of your language, it is possible to + [define custom character classes](#define) for use in custom + rules. + +## A first example + +This example was designed to address the needs of a minority language in the country +of Cambodia. The majority language does not use spaces for wordbreaking, while the +minority language in question does use them. In addition, hyphens sometimes occur +within words. + +The word breaker function can be specified in the +[model definition file](./model-definition-file) as follows: + +```typescript +const source: LexicalModelSource = { + format: 'trie-1.0', + sources: ['wordlist.tsv'], + // CUSTOMIZE THIS: + wordBreaker: (text) => { + let customization = { + + /*** Definition of extra word-breaking rules ***/ + rules: [{ + match: (context) => { + if(context.propertyMatch(null, ["ALetter"], ["Hyphen"], ["ALetter"])) { + return true; + } else if(context.propertyMatch(["ALetter"], ["Hyphen"], ["ALetter"], null)) { + return true; + } else if(context.propertyMatch(null, ["ALetter"], ["Hyphen"], ["eot"])) { + return true; + } else { + return false; + } + }, + breakIfMatch: false + }], + + /*** Character class overrides for specific characters ***/ + propertyMapping: (char) => { + let hyphens = ['\u002d', '\u2010', '\u058a', '\u30a0']; + // treats Khmer consonants & independent vowels in the same manner + // as the basic latin-script based alphabet + if(char >= '\u1780' && char <= '\u17b3') { + return "ALetter"; + } else if(hyphens.includes(char)) { + return "Hyphen"; + } else { + // The other Khmer characters already have useful word-breaking + // property assignments. + return null; + } + }, + + /*** Declares any new, custom character classes to be recognized by the word-breaker ***/ + customProperties: ["Hyphen"] + }; + + /*** Connects all the pieces together for actual use ***/ + return wordBreakers['default'](text, customization); + }, + // ... +}; + +export default source; +``` + +This example's customization is designed to accomplish two goals: + +1. Unicode's wordbreaker does not map base Khmer consonants to any of the + [relevant wordbreaking character properties](https://unicode.org/reports/tr29/#Table_Word_Break_Property_Values), causing it to be treated as `"Other"`. + The minority language in question instead wishes for Latin-script-like word-breaking, + so mapping the consonants to the same property as Latin-script consonants allows + them to be treated similarly - in the manner they expect. + +2. By default, the wordbreaker will automatically insert word boundaries before + and after a hyphen. To allow mid-word hyphens, we need to remap them to + a different character property. + + While the specification itself mentions that we could + just map hyphens to `"MidLetter"`, this example opts to define + a custom-tailored property that ensures only hyphens are affected in order to add + a special, end-of-context rule that may be useful when typing - the rule above + referencing `"eot"`. + +More on the wordbreaking character properties will be covered later. + +## Custom word-breaking rules + +When defining additional rules for use in word-breaking, it is advisable to reference +the [rules of the Unicode Standard Annex #29 §4.1 Default Word Boundary Specification](https://unicode.org/reports/tr29/#Word_Boundary_Rules). + +Rules WB1 through WB4 of the specification will always apply first, before any +custom rules. Custom rules will then be applied in order of their definition within +the model, with them all being applied before the specification's rules labeled WB5 +and onward. + +Each rule should be of the following form: + +```typescript +{ + // A function that returns 'true' whenever the rule should apply + match: (context) => { + // ... + }, + // Whether to prevent (false) or to enforce (true) a boundary when the rule applies. + breakIfMatch: false +} +``` + +Toward this end, the `context` object received by match provides a function called +`propertyMatch` in order to define rules like those of the wordbreaker specification. +Let's take WB6 - "do not break letters across certain punctuation" - as an example. + +As written in the spec, WB6 reads **AHLetter x (MidLetter | MidNumLetQ) AHLetter**. + +This is simply a series of characters, up to two characters before and after a potential break point. To break that down: +- (implicit) **Any** -- accept any character in this position +- **AHLetter**: `ALetter` or `Hebrew_Letter` +- **x** - "do not break" +- (either) **MidLetter** or **MidNumLetQ**: one of `MidLetter`, `MidNumLet`, or `Single_Quote`. +- **AHLetter**: `ALetter` or `Hebrew_Letter` + +The expansions `MidNumLetQ` and `AHLetter` are defined at https://unicode.org/reports/tr29/#WB_Rule_Macros. + +If written as a custom rule, rule WB6 takes the following form. Note the use of the function `context.propertyMatch`, +which takes 4 parameters - two to match characters before and two to match characters after a potential boundary: + +```typescript +// Rule WB6 from the Unicode spec, as a custom rule: +{ + match: (context) => { + return context.propertyMatch(null, // no requirements set, so "Any" character may match + ["ALetter", "Hebrew_Letter"], + // x + ["MidLetter", "MidNumLet", "Single_Quote"], + ["ALetter", "Hebrew_Letter"]); + }, + breakIfMatch: false // do not break +} +``` + +Note that an empty array `[]` in any slot is not treated the same as `null` - +use of an empty `[]` will prevent the rule from matching. + +Almost all of the specification's rules are of this form. Again, up to two characters +before a potential boundary may be considered alongside up to two characters after +the potential boundary. + +### Word-breaking property names +The names used in each array must be defined in one of the following places: +* https://unicode.org/reports/tr29/#Table_Word_Break_Property_Values +* `customProperties` - your [declaration of any custom property types](#define) +* One of the special property types `"Other"`, `"sot"`, or `"eot"`: + * `Other`: a character without an associated word-breaking property value + * `sot`: "start of text" - a marker indicating the beginning of the string being word-broken + * `eot`: "end of text" - a marker indicating the end of the string being word-broken + +All rules use case-insensitive matching, so capitalization differences will not affect operation. + +### Rule-matching examples + +#### A successful rule application +As an example, when determining whether or not to break the English word `don't` when +applying WB6 as written above, this is what happens near the apostrophe: + +```typescript +{ + match: (context) => { + return context.propertyMatch(null, /* match any character */ // "o" - ALetter + ["ALetter", "Hebrew_Letter"], // "n" - ALetter + // x + ["MidLetter", "MidNumLet", "Single_Quote"], // "'" - Single_Quote + ["ALetter", "Hebrew_Letter"]); // "t" - ALetter + }, + breakIfMatch: false // do not wordbreak at any position where the rule matches. +} +``` + +The rule applies at the position between the `n` and the `'` of `don't`, telling the +word-breaker not to word-break if the rule matches at that location. + +#### An unsuccessful rule match + +Given the input `n't|` (where `|` is the caret), we can see that the rule will not match: +```typescript +{ + match: (context) => { + return context.propertyMatch(null, /* automatic match */ // "n" - ALetter + ["ALetter", "Hebrew_Letter"], // "'" - Single_Quote + // x + ["MidLetter", "MidNumLet", "Single_Quote"], // "t" - Single_Quote + ["ALetter", "Hebrew_Letter"]); // - eot + }, + breakIfMatch: false // do not break +} +``` + +The same rule does not apply between the `'` and the `t`, so it does not apply at this position in +the text. This is why the wordbreaking spec includes rule WB7 in addition to WB6 - some scenarios +require multiple context property-matching attempts. + +You may define any number of these rule objects in any order for use within the wordbreaker within +the `rules` array. + +> **Important note**: When no other rule successfully matches a potential word-boundary position, the spec's rule WB999 applies as a catch-all and will enforce a split. Preventing a word-break always requires a successfully-matching rule, though this is covered for most cases by the Unicode specification's ruleset. + +Defining custom rules is a powerful tool, but it is detailed work and may be somewhat tedious +to get right. Feel free to [ask for help at our Community Site](https://community.software.sil.org/c/keyman/19) for assistance. + +## Character property remapping + +Many writing systems in the world are shared by multiple languages, using most of the same +characters in common. However, sometimes there may be notable differences in how specific +languages wish to treat certain characters. In order to address these cases, we allow +overriding the "standard" word-breaking property that the Unicode specification gives the +character with one set by the lexical model. + +### Default character properties + +For reference, [this text file](https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/WordBreakProperty.txt) +provides the standard word-breaking properties for all characters. This is one of many +files Unicode provides publicly here: https://www.unicode.org/reports/tr41/#Props0. + +That text file contains many lines of the following form: + +``` +0041..005A ; ALetter # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +``` + +This says that `0041` through `005A` - or rather, `\u0041` (the code for 'A') through +`\u005A` (the code for 'Z') - are assigned word-breaking property `ALetter`. That +range covers 26 (`[26]`) characters. (For our purposes here, the `L&` part is +irrelevant.) + +As noted at the top of the file: + +``` +# All code points not explicitly listed for Word_Break +# have the value Other (XX). + +# @missing: 0000..10FFFF; Other +``` + +### Redefining character properties + +Of note from [our first example](#example): + +```typescript +/*** Character class overrides for specific characters ***/ +propertyMapping: (char) => { + // ... + // treats Khmer consonants & independent vowels in the same manner + // as the basic latin-script based alphabet + if(char >= '\u1780' && char <= '\u17b3') { + return "ALetter"; + } // ... +}, +``` + +If you search the [property definition text file](https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/WordBreakProperty.txt) +for `1780` or `17b3`, you will find neither. These correspond to many letters +from the Khmer character set - notably, the 'base' characters used in Khmer's +grapheme clusters. The other Khmer characters tend to attach at various positions +around these base characters. The majority language for the script - Khmer - +does not follow conventional word-breaking rules; most notably, they do not add +whitespace between each word. (There are other strategies that get utilized for +such scripts.) + +As breaks sometimes occur between the base characters while other times do not, +properties for these base characters were not explicitly defined and are thus +treated as class `Other`. +- As other Khmer characters tend to attach around the base characters, they do + have specified word-breaking properties - they `Extend` the grapheme cluster. +- Searching `17b4` in [the text file mentioned above](https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/WordBreakProperty.txt) will show the closest results to the characters under discussion. + +However, there are minority languages that prefer to use whitespaces between words, +meaning that there should never be wordbreaks applied directly between neighboring +characters for their words. In such cases, we can map them to a pre-existing property +with the desired behavior - `ALetter`. + +```typescript +if(char >= '\u1780' && char <= '\u17b3') { + return "ALetter"; // Maps Khmer-script base characters to ALetter + // to allow Latin-script-like word-breaking. +} +``` + +For another example of character property remapping, consider the use of hyphens with +words (and/or names) in some languages. Default word-breaking behavior will split +hyphenated words and names apart, but by changing the property of hyphens, it is +possible to disable this behavior. + +Noting [rule WB6](#WB6) and WB7, the `MidLetter` class is designed to prevent +word-breaks from occurring when its characters lie directly between letters - +hence the property name. Assigning hyphens to this class can provide the +desired behavior. + +```typescript +let hyphens = ['\u002d', '\u2010', '\u058a', '\u30a0']; +// ... +if(hyphens.includes(char)) { + return "MidLetter"; +} // ... +``` + +## Defining and using new word-breaking properties + +There may be some cases in which none of the default character word-breaking +properties provide the exact behavior that you're wanting, or perhaps you +want only specific characters from that class to match custom rules. For such +cases, wordbreaker customization also allows definition of new word-breaking +properties. + +For one example, note how word-breaking operations affect predictions when +typing new words: + +- `can'`, with the intent to type `can't` +- `full-`, with the intent to type `full-scale` + +For the first example above, while `'` (property `Single_Quote`) is included within +WB6 and WB7, those rules only apply _between letters_. If there is no letter +on the right-hand side, `can'` will be interpreted as `can` + `'` by the +word-breaking algorithm. Similarly, even when remapping `-` to the `MidLetter` +property, `full-` will be remapped to `full` + `-` before additional text +is typed. + +Of course, this problem does alleviate itself once another `ALetter`-property +letter is typed, but suppose we wanted a rule to prevent word-breaking for +the second example above. (After all, `can'` could be the end of a quoted +phrase in English - `'sure you can'` - in which case we might want the split +to occur.) + +Revisiting [an earlier example](#example) and simplifying a little bit: + +```typescript +/*** Definition of extra word-breaking rules ***/ +{ + rules: [{ + match: (context) => { + if(context.propertyMatch(null, ["ALetter"], ["Hyphen"], ["eot"])) { + return true; + } else { + /* ... */ + } else { + return false; + } + }, + breakIfMatch: false + }], + + /*** Character class overrides for specific characters ***/ + propertyMapping: (char) => { + let hyphens = ['\u002d', '\u2010', '\u058a', '\u30a0']; + if(hyphens.includes(char)) { + return "Hyphen"; + } else { + // Use the default properties for anything else. + return null; + } + }, + + /*** Declares any new, custom character classes to be recognized by the word-breaker ***/ + customProperties: ["Hyphen"] +} +``` + +Let's walk through what this simplification is trying to achieve: + +1. Hyphens are mapped to their own distinct word-breaking property. +2. The custom rule prevents wordbreaking between a letter and a hyphen at the end of text. + - It does not include any of the `MidLetter` characters. + +Matching the rule against the end of text suggests that what follows the `Hyphen` character +is the point of text insertion. For this example, assuming that a user has just typed +`full-`, there will be no word-break on the hyphen until either more input is received or +the user changes the site of text entry. + +**Important note**: You must declare any custom properties within the `customProperties` array. +If any are missing, the missing custom properties will fail to match against any word-breaking rule. +Make sure you don't misspell it anywhere in your customization code! + +### Default rules + custom properties + +There is one notable issue with this example, though - whenever you remap a character to +a new property, it is no longer considered to have its old property, and so it will no +longer match rules based on its default property. This is why the original example +included a couple of extra rules: + +```typescript +{ + match: (context) => { + // Extend WB6 - allow "Hyphen" in the same place as "MidLetter" + if(context.propertyMatch(null, ["ALetter"], ["Hyphen"], ["ALetter"])) { + return true; + // Extend WB7 - allow "Hyphen" in the same place as "MidLetter" + } else if(context.propertyMatch(["ALetter"], ["Hyphen"], ["ALetter"], null)) { + return true; + // The same rule from above. + } else if(context.propertyMatch(null, ["ALetter"], ["Hyphen"], ["eot"])) { + return true; + } else { + return false; + } + }, + breakIfMatch: false +} +``` + +By replicating [WB6](#WB6) and WB7's structure and allowing `Hyphen` to match in the same +position as `MidLetter` in the original rules, we can prevent word-breaking splits +after additional text has been typed after a `Hyphen`-property character. This does not +_replace_ the behavior of WB6 and WB7 - it merely _extends_ it to include the new property. + +### A more complex case + +A meatier example may be found as [the specification's hypothetical rule WB5a](https://unicode.org/reports/tr29/#WB999): + +> "Break between apostrophe and vowels (French, Italian)" +> +> WB5a: **Apostrophe ÷ Vowels**. + +The idea of this rule is to allow words such as the French `l'objectif` to be split +into the article - `l'` and its following word - `objectif` while preserving other +cases that should still be treated as single words, such as `aujourd'hui`. + +To simplify the code needed for customization here somewhat, we will use `Single_Quote` +in place of `Apostrophe`, as well as a few extra simplifications. The new `Vowels` +property offers enough complexity as it is. + +```typescript +let customization = { + rules: [ + // WB5 extension - ensure `AVowel` is handled like `ALetter`. + { + match: (context) => { + if(context.propertyMatch(null, ["ALetter", "AVowel"], ["ALetter", "AVowel"], null)) { + return true; + } else { + return false; + } + }, + breakIfMatch: false + }, + // Our main goal WB5a + { + match: (context) => { + if(context.propertyMatch(null, ["Single_Quote"], ["AVowel"], null)) { + return true; + } else { + return false; + } + }, + breakIfMatch: true + }, + // WB6, 7 extension - ensure `AVowel` is handled like `ALetter` + { + match: (context) => { + if(context.propertyMatch(null, + ["ALetter", "AVowel"], + ["MidLetter", "MidNumLet", "Single_Quote"], + ["ALetter", "AVowel"])) { + return true; + } else if(context.propertyMatch(["ALetter", "AVowel"], + ["MidLetter", "MidNumLet", "Single_Quote"], + ["ALetter", "AVowel"], + null)) { + return true; + } else { + return false; + } + }, + breakIfMatch: false + } + // Similar extensions to WB9, 10, 13a, and 13b would also be needed for robustness. + // Note: we have left "Hebrew_Letter" out of the WB5, 6, and 7 rewrites to help + // simplify this example. + ], + propertyMapping: (char) => { + const vowels = ['a', 'e', 'i', 'o', 'u']; + // French and Italian allow accented vowels; this will strip off the accent and + // leave us with the base vowel. + const baseChar = char.normalize('NFD').charAt(0); + if(vowels.includes(baseChar)) { + return "AVowel"; + } + + return null; + }, + customProperties: ["AVowel"] +} +``` + +Note that we have left out some of the rule extensions that would help cover certain +less-frequently encountered cases. These may matter to some parts of a +language community, especially for models targeting a majority language. +Computer programmers in particular tend to care about the un-extended +rules (WB9, 10, 13a, and 13b) more than most. + +Remember, remapping characters to a new word-breaking property prevents any default +rule from handling them unless you add custom rules to re-include them as their +new property. + +------ + +[Return to “Advanced Lexical Model Topics”](./) diff --git a/developer/docs/help/guides/lexical-models/advanced/word-breaker.md b/developer/docs/help/guides/lexical-models/advanced/word-breaker.md new file mode 100644 index 00000000000..f8f321327ac --- /dev/null +++ b/developer/docs/help/guides/lexical-models/advanced/word-breaker.md @@ -0,0 +1,218 @@ +--- +title: Word breaker +--- + +The `trie` family of lexical models needs to know what a word is in +running text. In languages using the Latin script—like, English, French, +and SENĆOŦEN—finding words is easy. Words are separated by spaces or +punctuation. The actual rules for where to find words can get quite +tricky to describe, but Keyman implements the [Unicode Standard Annex #29 §4.1 Default Word Boundary Specification](https://unicode.org/reports/tr29/#Word_Boundaries) +which works well for most languages. + +However, in languages written in other scripts — especially East Asian +scripts like Chinese, Japanese, Khmer, Lao, and Thai — there are no obvious break in between words. For these languages, there must be special rules for determining when words start and stop. This is what a _word breaker function_ is responsible for. It is a little bit of code that looks at some text to determine where the words are. + +You can customize the word breaker in three ways: +- If your language uses its writing system in an unconventional way (e.g., use spaces to separate words in Thai, Lao, Burmese, or Khmer), you can [override the script's default behaviour](#overrides) +- If the default word breaker creates **too many splits**, you can [choose which strings join words together](#join). +- If the default word breaker creates **not enough splits**, you must [create your own word breaker function](#custom). +- Alternatively, you may choose to [customize and extend the wordbreaker's behavior](./unicode-breaker-extension) by adding extra rules and changing how it treats specific characters. + +## Overriding script defaults + +The default word breaker makes assumptions about how each +_script_ (alphabet, syllabary, or writing system) +works. You can override the defaults by specifying the +`overrideScriptDefaults` option. + +There is currently only one override: + +`'break-words-at-spaces'` +: Only breaks words at spaces for scripts that otherwise do not use spaces in between words. + +### Break words at spaces + +This applies only to languages that borrow the **Burmese**, **Khmer**, +**Lao**, or **Thai** scripts. The majority languages for these scripts +do *not* use spaces in between words; hence, the default word breaker +will produce undesired results when breaking words in these scripts. +However, if your language is written in one of these scripts and *does* +use spaces in between words, then you can set +`overrideScriptDefaults: 'break-words-at-spaces',` to ensure word breaks +do not occur in the middle of words, but instead, at spaces. + +Your model definition file should look like this: + +```typescript +const source: LexicalModelSource = { + format: 'trie-1.0', + sources: ['wordlist.tsv'], + wordBreaker: { + use: 'default', // we want to use the default word breaker, BUT! + // Override the default for Burmese, Khmer, Lao, or Thai: + overrideScriptDefaults: 'break-words-at-spaces', + } +}; + +export default source; +``` + +## Customize joining rules + +The default word breaker is very liberal in what it considers is a word. + +For instance, the default word breaker will split words at hyphens. +Consider the following Plains Cree example; this is a single word: + +: amiskwaciy-wâskahikan + +However, the default word breaker will produce three words: `amiskwaciy`, `-`, and `wâskahikan`. + +To **join words at hyphens and any other punctuation**, provide the +`joinWordsAt` option in the [model definition file](./model-definition-file): + +```typescript +const source: LexicalModelSource = { + format: 'trie-1.0', + sources: ['wordlist.tsv'], + wordBreaker: { + use: 'default', // we want to use the default word breaker, BUT! + // CUSTOMIZE THIS: + joinWordsAt: ['-'], // join words that contain hyphens + } +}; + +export default source; +``` + +You can specify one or more strings to join words at: + +```typescript +const source: LexicalModelSource = { + format: 'trie-1.0', + sources: ['wordlist.tsv'], + wordBreaker: { + use: 'default', + // CUSTOMIZE THIS: + joinWordsAt: ['-', ':', '@'], // join words at hyphens, colons, at-signs + } +}; + +export default source; +``` + +## Writing a custom word breaker function + +> **Note**: +If your language uses spaces to denote word breaks, the +default word breaker is probably sufficient. Only customize this if you +know the default word breaker really does not work for your language! + +The word breaker function can be specified in the [model definition file](./model-definition-file) as follows: + +```typescript +const source: LexicalModelSource = { + format: 'trie-1.0', + sources: ['wordlist.tsv'], + // CUSTOMIZE THIS: + wordBreaker: { + use: function(text: string): Span[] { + // Return zero or more **spans** of text: + return []; + }, + }, + // other customizations go here: +}; + +export default source; +``` + +The function must return zero or more `Span` objects. The spans, +representing an indivisible span of text, must be in ascending order of +their start point, and they must be non-overlapping. + +### A `Span` object + +A _span_ is an indivisible piece of a sentence. +This is typically a word, but it can also be a series of spaces, an +emoji, or a series of punctuation characters. **A span that looks like a word is treated like a word in the `trie-1.0` model**. + +A `span` has the following properties: + +```typescript +{ + start: number; + end: number; + length: number; + text: string; +} +``` + +The `start` and `end` properties are indices into the original string at +which the span begins, and the index at which the *next* span begins. + +`length` is `end - start`. + +`text` is the actual text of the string contained within the span. + +## Example for English + +Here is a full example of word breaker function that returns an array of +spans in an ASCII (English) string. + +> **Note** +This is just an example—please +use the default word breaker for English text! + +```typescript +const source: LexicalModelSource = { + format: 'trie-1.0', + sources: ['wordlist.tsv'], + // EXAMPLE BEGINS HERE: + wordBreaker: function(text: string): Span[] { + // A span derived from a JavaScript RegExp match array: + class RegExpDerivedSpan implements Span { + readonly text: string; + readonly start: number; + + constructor(text: string, start: number) { + this.text = text; + this.start = start; + } + + get length(): number { + return this.text.length; + } + + get end(): number { + return this.start + this.text.length; + } + } + + let matchWord = /[A-Za-z0-9']+/g; + let words: Span[] = []; + let match: RegExpExecArray; + while ((match = matchWord.exec(phrase)) !== null) { + words.push(new RegExpDerivedSpan(match[0], match.index)); + } + + return words; + }, + // other customizations go here: +}; + +export default source; +``` + +## See also + +- [The TypeScript definition of `WordBreakingFunction` and +`Span`](https://github.com/keymanapp/keyman/blob/4211b468949860b8fb4a4707710472ab9e33c581/common/lexical-model-types/index.d.ts#L286-L323) + +- [Extension and customization of the Unicode word-breaker](./unicode-breaker-extension) + +- [The Unicode Standard Annex \#29 §4.1 Default Word Boundary Specification](https://unicode.org/reports/tr29/#Word_Boundaries) + +------------------------------------------------------------------------ + +[Return to “Advanced Lexical Model Topics”](./) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/distribute/index.md b/developer/docs/help/guides/lexical-models/distribute/index.md new file mode 100644 index 00000000000..42f3741af17 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/distribute/index.md @@ -0,0 +1,6 @@ +--- +title: Distributing lexical models +--- + +- [Lexical model package development tutorial](tutorial/) (Keyman for mobile apps) +- [Distribute lexical models to Keyman applications](packages) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/distribute/packages.md b/developer/docs/help/guides/lexical-models/distribute/packages.md new file mode 100644 index 00000000000..92e61650308 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/distribute/packages.md @@ -0,0 +1,70 @@ +--- +title: Distribute lexical models to Keyman Applications +--- + +## Overview + +Lexical model package files contain one lexical model, along with readme +files, and any other files you wish to include. You must create a +package file to bundle your lexical model and help documentation into a +simple, single file that is easy for an end-user to install. + +The package file is a ZIP compatible archive. + +> ### Tip +You can distribute keyboards and lexical models in package files, but +you can't include both in the same package file. + +#### Keyman for Android and Keyman for iPhone and iPad + +Keyman mobile applications can install the same lexical model package +files. + +## Package file contents + +A package can have a variety of different files contained within. The +following files and file types are recognized by the package installer: + +\*.model.js +: Lexical model file. When Keyman mobile applications install a + lexical model package, the included model will be installed and + associated with the specified languages. + +welcome.htm +: Introductory help for the lexical model, HTML format. This will + normally be displayed when the package is installed by the user, and + is also the entry point for help when accessed via Keyman's help + system or Keyman Configuration. + +## Step 1) Share the lexical model package file + +Once the lexical model package .kmp file is created, you can share them +via external storage devices (USB drive, SD card, etc). If that is not +an option, you can upload the .kmp file to a public facing website. For +this example, the lexical model package for SENĆOŦEN is being uploaded: + +1. nrc.str.sencoten.model.kmp (the lexical model package .kmp file) + +## Step 2) Create a link to the KMP file + +Once all the files have been uploaded, you will need to provide a link +to the lexical model package .kmp file for your device to download and +install. This can either be a link on a web page, or a link in an email. +In this tutorial, a very simple .html web page with a link to the +nrc.str.sencoten.kmp file is created: + +```html + + + + + Sencoten Lexical Model Package + + +``` + +The link must be in the format `http://` or `https://` + +Upload the web page to your public facing website. Once done, you can +install the lexical model package onto your mobile devices by +downloading the .kmp from your device's internet browser. \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/distribute/tutorial/index.md b/developer/docs/help/guides/lexical-models/distribute/tutorial/index.md new file mode 100644 index 00000000000..fe4e0d039ec --- /dev/null +++ b/developer/docs/help/guides/lexical-models/distribute/tutorial/index.md @@ -0,0 +1,32 @@ +--- +title: Lexical Model Package Tutorial +--- + +[Step 1: What do we include?](step-1) + +[Step 2: Editing .htm files for the Package](step-2) + +[Step 3: Checking a package and adding files](step-3) + +[Step 4: Filling in package details](step-4) + +[Step 5: Compiling, testing and distributing a Package](step-5) + +## Overview + +Welcome! In this tutorial, you will learn how to create a lexical model +[package](../../../../reference/file-types/kmp). A package is a +collection of files, compressed into a single file, just like a ZIP +file. It is designed to make installation of a lexical model +straightforward for the end user. When done, Keyman for mobile apps can +download and install lexical models through the package. + +We will be creating a package for the SENĆOŦEN lexical model that was +made in [Developing a lexical model from a word list](../../tutorial/). + +### Let's begin + +Let's get started! Move on to the next topic to begin the first step, +choosing what to include in the package. + +[Step 1: What do we include?](step-1) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/distribute/tutorial/step-1.md b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-1.md new file mode 100644 index 00000000000..d27970b9e43 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-1.md @@ -0,0 +1,15 @@ +--- +title: Step 1: What do we include? +--- + +What is the purpose of a lexical model package? To make installation of +a lexical model as straightforward as possible for the end user. We need +to keep this goal in mind as we work on all the aspects of a package. + +A great package will: + +1. Include one lexical model to install. +2. Include a 'readme.htm' file which describes why the user would install this package. +3. Include a 'welcome.htm' file which is displayed before/after install. + +[Step 2: Editing .htm files for the package](step-2) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/distribute/tutorial/step-2.md b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-2.md new file mode 100644 index 00000000000..10a560fd194 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-2.md @@ -0,0 +1,72 @@ +--- +title: Step 2: Editing .htm files for the package +--- + +When Keyman Developer created your lexical model project, it will have +created some of these files to go in the package. You will still need to +edit some of these templated files for the package. + +readme.htm + +: A short description of the package, its use restrictions, and what + it includes. Try to keep the readme under 10 lines long. The readme + should be an html file for optimal formatting. + + The intention of readme.htm is to describe why a user would want to + install the lexical model. + + Create the HTML file in any HTML editor. + + > ### Tip + If using Microsoft Word, choose HTML (clean) when saving to create a + smaller file. + + Note, if your HTML editor puts images into a subfolder, you will + need to edit the HTML source so that all files are in the same + folder -- the package builder will not maintain subfolders. You can + easily edit the HTML source in Keyman Developer. + + Also, if your welcome or readme files use embedded external images, + stylesheets, javascript or other files, you will need to add these + files to your package as well. + +welcome.htm + +: When including an introductory help file in your package, you must + keep the name of the file "welcome.htm". This file will be displayed + before the lexical model is installed. Make sure that you design + your HTML file so that it can be viewed on a mobile device - avoid + extra wide tables or wide fixed width elements. + + After package installation, the welcome.htm will also be accessible + from the lexical model info pages. + + The intention of welcome.htm is to provide instructions on getting + started with your lexical model. + + > ### Tip + Useful information to include in welcome.htm is: + - names of languages associated with the lexical model. + - name of the lexical model in the package. + - links to additional help on your website or more extensive + documentation files in the package. + - a link to an official distribution site for your package (even + if it is the Keyman website) - so that users know where to find + the latest version of your package. + + + + > ### Tip + If you want links to your website to open in the user's preferred + browser, preface the href link with `link:`, e.g. + `website` + The `link:` sceheme will open the referred file in the default + application - that is, a web browser for URLs and links, Notepad for + .txt files, Adobe Reader for PDFs. You can use `link:` to open any + of the files in the package, e.g. `link:docs.pdf` will open the file + docs.pdf in Adobe Reader or the default PDF reader on the system. + + If you create documents in other formats, for example PDF or + printable documentation, you should link to that in the welcome.htm. + +[Step 3: Checking a package and adding files](step-3) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/distribute/tutorial/step-3.md b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-3.md new file mode 100644 index 00000000000..9d1ea260002 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-3.md @@ -0,0 +1,51 @@ +--- +title: Step 3: Checking a package and adding files +--- + +We are finally ready to open up the Package Editor and check the package +contents. In the Project Window in Keyman Developer, click the +**Packaging** tab. + +> ### Tip +This tutorial makes a package named `nrc.str.sencoten.model.kps`, but +you should substitute the name with your own model. + +A lexical model package source file will have the extension .model.kps, +and will be compiled in a file with extension .kmp. + +## Files + +In the Package Editor, click on the **Files** +tab. + +![Lexical Model Package Files](../../../../images/lm/tutorial_distribute_model_3_files.png) + +Keyman Developer already included your lexical model, welcome.htm, and +readme.htm files in your package. In the Files tab, click +**Add** to add all the additional files we +discussed in the previous step to the package. For example, if your +welcome or readme files use embedded files, include them in your +package. You can add multiple files at once, and from multiple folders. +When the package is compiled, all the files will be placed in the same +folder within the package. + +While keyboards can also be distributed in packages, do not include them +in a lexical model package. + +## Lexical Models + +In the Package Editor, click on the **Lexical Models** tab. + +![Lexical Model Info](../../../../images/lm/tutorial_distribute_model_3.png) + +Language Tag + +: A valid BCP 47 language tag must be set or the lexical model will + not install on your mobile device. Update the list of languages you + want to associate with your lexical model. + +You could stop here. This would be a completely valid package, but it +would not be as good as it could be. So let's continue on to the next +step, and fill in some descriptions of the package. + +[Step 4: Filling in package details](step-4) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/distribute/tutorial/step-4.md b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-4.md new file mode 100644 index 00000000000..bae0be8c676 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-4.md @@ -0,0 +1,55 @@ +--- +title: Step 4: Filling in package details +--- + +In the Package Editor, click on the **Details** tab. You should fill in as many details as you can on this page. + +![](../../../../images/lm/tutorial_distribute_model_details.png) + +Package Name + +: The Package Name will be displayed in the package install dialog and + wherever the package is referred to. + +Model Version + +: Update the version (intial version can default to 1.0). A version + number for the model and package is important - it helps your users + know that they are using the most recent update of your package. The + version format you should use is `1.0`. + + When making a major change to your lexical model package, increment + the first part and set the second part to `0`, e.g. from `1.0` to + `2.0`. + + When making a bug fix or a minor update, increment the second part, + e.g. from `1.0` to `1.1`. + + Version numbers should be in the form `major.minor[.subversion]`. + Subversion is optional but is helpful for small bug fix releases. + Each of the sections of the version should be an integer. Keyman + does integer comparisons on the version numbers, so, for example, + version `2.01` is regarded as older than version `2.2`. Alphabetic + or date formats should be avoided as the installer for the model + cannot determine which version is older reliably. + +Copyright + +: Enter copyright details for your lexical model package. Keep this + reasonably short or it won't be clear for end users. + +Author + +: Enter your name or the name of your company. + +Email + +: Enter a contact email address where package users can contact you. + If you don't want to be contacted via email, leave this field empty + +Website + +: Enter the name of the website where you will have information about + this lexical model. + +[Step 5: Compiling, testing and distributing a Package](step-5) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/distribute/tutorial/step-5.md b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-5.md new file mode 100644 index 00000000000..ed873c69cab --- /dev/null +++ b/developer/docs/help/guides/lexical-models/distribute/tutorial/step-5.md @@ -0,0 +1,55 @@ +--- +title: Step 5: Compiling, testing and distributing a Package +--- + +In the Package Editor, click on the **Compile** tab. + +![](../../../../images/lm/tutorial_distribute_model_compile.png) + +Click **Compile Package** to compile the +package into a .kmp file. Compiling takes all the files listed for the +package, compresses them (using a .ZIP-compatible format) and adds the +package information, all into a single file. If any files are not +available, an error will be listed in the Messages window. + +After compiling, you can test the package installation in the mobile +Keyman apps. You should test that all the model installs successfully, +that the Welcome file is displayed during the install, and that the +documentation is accessible to the end user. + +## Distributing a package on the Keyman Cloud Lexical Model Repository + +Once you have tested the package to your satisfaction, it is time to +distribute it. We recommend submitting your lexical model package to the +[Keyman Lexical Models Repository](https://github.com/keymanapp/lexical-models) + +## Distributing a package on your own website + +If you distribute a package on your own site, we have the following +recommendations: + +1. Ensure the MIME type on the web server or folder for .KMP files is + set up to application/octet-stream. Without this, .KMP files may be + recognised as .ZIP files -- this is not helpful to the end user as + it will be opened in the wrong application. +2. Avoid putting the .KMP file in an archive (e.g. .ZIP) or + self-expanding archive (.EXE) - this makes it harder for end users + to install. A .KMP file is already compressed (it is actually just a + ZIP archive file!) and you won't save much space by recompressing + it. +3. Include a link to the Keyman download page: + `http://keyman.com/downloads/` + +## Distributing a package by email + +- Attaching the KMP file directly to an email may be blocked for security +reasons. As mentioned above, a KMP file is basically a ZIP file and +lexical model data is in JavaScript, this is a combination that looks +suspicious to many email servers. You can upload it to a Google drive, +and email a link for downloading the file + +## Installing the lexical model package + +- The same method for installing custom keyboard packages to mobile +devices can be used for installing lexical model packages. Refer to +these pages for [Keyman for iPhone and iPad](../../../distribute/install-kmp-ios) and [Keyman for Android](../../../distribute/install-kmp-android). \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/index.md b/developer/docs/help/guides/lexical-models/index.md new file mode 100644 index 00000000000..e913ce7007c --- /dev/null +++ b/developer/docs/help/guides/lexical-models/index.md @@ -0,0 +1,22 @@ +--- +title: Developing lexical models (dictionaries) +--- + +A **lexical model** (Keyman apps use the term +**dictionary**) is what powers **predictive text** +and **autocorrect** for a language. If you want your keyboard to predict +and correct words in your language, you must create a lexical model that +generates suggestions for your language. + +[What is a lexical model? Or: how do I add prediction and autocorrection +to my keyboard?](intro) + +[Tutorial: Developing a lexical model from a word list](tutorial) + +[Advanced lexical models topics](advanced) + +[Distribute a lexical model](distribute) + +## Reference + +[Wordlist TSV format](../../reference/file-types/tsv) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/intro/index.md b/developer/docs/help/guides/lexical-models/intro/index.md new file mode 100644 index 00000000000..314a571ea52 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/intro/index.md @@ -0,0 +1,162 @@ +--- +title: What is a lexical model? +--- + +
+ +![Smartphone keyboard displaying suggestions for the English phrase ”on my w-”](../../../images/lm/whatis-on-my-w.png) + +##### Predictive text for English. + +
+ +Many mobile phone keyboards enjoy **predictive text** for their +languages. + +Predictive text is the feature on your keyboard that displays a series +of _predictions_, typically above your keyboard, +that try to guess the word or words that you are typing next. For +example, if I start typing the English phrase “On my w”, your keyboard’s +predictive text feature will infer, using its knowledge of the English +language, that the word you are typing is most likely “way”, followed by +other, less likely suggestions, such as “whole”, or “website”. + +The same feature that provides predictive text can also suggest +_corrections_ to what you are typing. For +example, if I start typing “thr” on my English keyboard, my keyboard +will suggest that I meant to type “the” instead. This **autocorrect** +feature is powered by your keyboard’s knowledge of the current language. + +The way your keyboard knows how to suggest **predictions** and +**corrections** for your language is through its **lexical model**. + +
+ +![diagram of the context ”on my w” used as input to the lexical model; the results of the lexical model are a list of suggestions.](../../../images/lm/overview.svg) + +##### How the lexical model is involved in generating suggestions. + +
+ +## Why should I create a lexical model for my language? + +### Words are difficult to type + +
+ +![Typing “n-a-i-v” on a smartphone. The keyboard suggests “naïve” for this input.](../../../images/lm/whatis-naiv.png) + +##### Typing “naiv” on a smartphone with predictive text. + +
+ +Some words have many accents, diacritics, or similar-looking forms. This +is not very common in the English language, however, this is quite +common in other languages. Predictive text can recognize forms without +the correct diacritics, or recognize forms that are simpler to type than +the orthographically correct version. This allows the typist to type +words quickly, with minimum effort. + +For example, in English, I want to type “naïve”, however, my keyboard +does not have the ï key present on its main +layout. Sure, if I use a keyboard that I can press-and-hold the +i key, it may pop-up additional characters, +and I can probably find ï nestled there +among the other options. However, I have to go out of my way to type the +correct variant, whereas the incorrect variant will be perfectly +understood. In most cases, I choose the option that is more economical +to type–“naive”—rather than the “correct” option. + +However, a **lexical model** that understands the English language will +see the word “naive” does not exist, but a similarly typed variant +“naïve” does exist. Therefore, when I type “naive”, the lexical model +will suggest “naïve”, and I can select it and have the correctly spelled +version without having to long-press and select the correct “ï”. Even +better than that, I can choose the suggestion right after typing “naiv”, +as there are relatively view English words that start with the prefix of +“naiv-” + +### Words are long + +
+ +![The top suggestion shows “incomprehensible”](../../../images/lm/whatis-incompr.png) + +Typing “incompr” on an English keyboard. + +
+ +Sometimes, the words are very long, but can be typed in far fewer +keystrokes if predictive text is used. For example, if in English, I +want to write the word “incomprehensible” (a 16-letter word), a lexical +model for English can predict it from the prefix “incompr” and save 8 +keystrokes! + +English is not prone to extraordinarily long words; the average word +length in English is about 9 letters. However, languages that are fond +of compounding, such as German (e.g., +_scheinwerferreinigungsanlage_ is a 28-letter word +which means “headlight washers”), or _polysynthetic +languages_ in which one word can have the meaning of a complete +sentence in English, such as Mohawk (e.g., +_sahonwanhotónkwahse_ is a 20-letter word which +means “she +opened the door for him again”). For these languages, predictive +text can save even more keystrokes than in English. + +### People make mistakes + +
+ +![The first suggestion is to write the word “the” instead.](../../../images/lm/whatis-correct-thr.png) + +##### Typing “thr” on an English keyboard. + +
+ +When typing quickly on a small phone screen, mistakes are inevitable. +Say I try to write the word “the” on my phone. I press +t, then h, but +as I try to type e, I press a few +millimeters to the right of the intended key and press +r instead. With a lexical model, the +predictive text feature understands that in English, “thr” is not a +complete word in-and-of-itself; however, a word that is typed quite +similarly, “the”, is a very common word. Therefore, the lexical model +provides enough information to assume that the user intended to type +“the” instead of “thr”. Thus, one of its **suggestions** is the +**correction** of “the” in place of “thr”. + +However, the predictive text feature is not overly presumptuous; what if +the typist really did want to type “thr”? As a result, “thr” is +suggested as a _keep suggestion_. When the typist +selects the “keep” suggestion, whatever they had originally typed is +kept, even if the lexical model suggests what it thinks is a far more +likely correction. + +## What do I need to make my own lexical model? + +To make a lexical model, you need some information about your language. +At bare minimum, you need a list of words in your language. Keyman +Developer supports importing a word list as a spreadsheet of words in +your language that you wish to use for predictions and corrections. This +will create a _word list lexical model_. + +If you have such a list of words, you can continue to the +[tutorial](../tutorial) to create a word list lexical model for your +language! + +However, to make a more accurate lexical model, you will need an idea of +how to rank suggestions relative to each other. For this, you may extend +the simple word list with **counts**. Each word has a count of how often +it has been seen in a representative collection of texts in your +language. For example, I could download articles from the English +language Wikipedia, and count how often Wikipedia contributors have +typed “rule” versus how many times they have typed “rupturewort”. This +will help us understand how to rank these two suggestions given the +context of “ru”. + +You can extend your spreadsheet with counts (placed in the second +column) to make a more accurate—and thus more useful—lexical model. + +[Next: Developing a lexical model from a word list](../tutorial) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/tutorial/index.md b/developer/docs/help/guides/lexical-models/tutorial/index.md new file mode 100644 index 00000000000..d6887656b3f --- /dev/null +++ b/developer/docs/help/guides/lexical-models/tutorial/index.md @@ -0,0 +1,29 @@ +--- +title: Tutorial: Developing a lexical model from a word list +--- + +[Step 1: Prerequisites for building a lexical model](step-1) + +[Step 2: Creating a lexical model project](step-2) + +[Step 3: Get some language data](step-3) + +[Step 4: Compile the lexical model](step-4) + +## Overview + +In this tutorial, will learn how to create a **word list lexical +model**. If you are not sure what a lexical model is, or why you would +make one, read [“What is a lexical model?”](../intro) first, then come +back here to follow this tutorial. + +## Let's begin + +Let's get started! Move on to the next topic to begin the first step. + +At the bottom of each page in the tutorial, will be a link to the next +step. You can use these links to work your way through the tutorial. You +may also find links to reference information, which you can select to +learn more about a particular aspect of creating Keyman keyboards. + +[Step 1: Prerequisites for building a lexical model](step-1) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/tutorial/step-1.md b/developer/docs/help/guides/lexical-models/tutorial/step-1.md new file mode 100644 index 00000000000..9bd7f84c86f --- /dev/null +++ b/developer/docs/help/guides/lexical-models/tutorial/step-1.md @@ -0,0 +1,22 @@ +--- +title: Step 1: Prerequisites for building a lexical model +--- + +To prepare a lexical model based on a word list, we will need a few +things: + +- Install [Keyman Developer](https://keyman.com/developer) 12.0 or greater (Windows only) +- A list of words in your language, stored in an spreadsheet, in dictionary-making software or, other means. + +> ### Note +Currently, lexical models work better with languages that use regular +spaces as word boundaries. For complex scripts such as Khmer, Thai, Lao, +etc, a pre-processing is required before getting it to work, i.e. word +segmentation has to be determined and/or configured. See the advanced +topic on making a custom [word breaker](../advanced/word-breaker). +This will be addressed in a future +[feature](https://github.com/keymanapp/keyman/issues/5025). + +Now to create a lexical model project! + +[Step 2: Creating a lexical model project](step-2) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/tutorial/step-2.md b/developer/docs/help/guides/lexical-models/tutorial/step-2.md new file mode 100644 index 00000000000..bdfb063ae46 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/tutorial/step-2.md @@ -0,0 +1,115 @@ +--- +title: Step 2: Creating a lexical model project +--- + +## Create the new project + +Start Keyman Developer. On the “Welcome” screen, click on +**New Project...**. The “New Project” dialog +will appear. Select “Wordlist Lexical Model” and press +**OK**. + +
+ +![“New Project” dialog](../../../images/ui/frmNewLMProject.png) + +###### The “New Project” dialog, with “Wordlist Lexical Model” selected. + +
+ +## Provide required information + +
+ +![New LM Project Parameters](../../../images/ui/frmNewLMProjectParameters.png) + +###### The New Lexical Model dialog box. + +
+ +The “New Wordlist Lexical Model Project” dialog will appear. + +To make sharing your lexical model easier, a project needs the following +information: + +Author Name +: This is either your **full name** or the **organization** you're + creating a model for. In this example, I am creating a lexical model + on behalf of my organization, the National Research Council Canada, + so I write that as the author name. + +Model Name +: We recommend the name of the **language**, **dialect**, or + **community** that this model is intended for. The name must be + written in all the Latin letters or Arabic numerals. In this + example, we're creating a language model for SENĆOŦEN, so we use the + model name `Sencoten`. + +### Provide auxiliary information + +The following information is also required, but most users will use +**default values**. + +Copyright +: Who owns the rights to this model and its data? This field should + contain the word "Copyright", the copyright symbol "©", and the full name of the rights + owner. Do not put the year of copyright in this field (see Full Copyright). Typically, + you can use the automatically generated default value: *Copyright © **Your Full + Name or Your Organization***. + +Version +: If this is the first time you've created a lexical model for you + language, you should leave the version as **1.0**. Otherwise, your + version number must conform to the following rules: A version string + made of `major revision number`.`minor revision number`. + +## Determine your language's BCP 47 language tag + +Keyman needs to know how to link your model to the appropriate keyboard +layout, so that they can both work together. To do this, Keyman utilizes +[BCP 47](../../../reference/bcp-47) language tags. + +To add a language tag, click the **Add** +button to bring up the “Select BCP 47 Tag” dialog box. + +
+ +![Select BCP 47 Tag dialog](../../../images/ui/frmNewLMProjectSelectLanguage.png) + +###### The “Select BCP 47 Tag” dialog box for SENĆOŦEN. + +
+ +Enter the BCP 47 language tag that you have selected. [Learn more about BCP 47 language tags](../../../reference/bcp-47) + +Once you are finished adding the primary language, click +**OK** to return to the **New Lexical Model +Project dialog**. + +## The Model ID + +Keyman will create a **model ID** which is how +Keyman sorts and organizes different lexical models. If you choose to +share your model publicly, the model ID is vital for both people and +Keyman to identify and use your lexical model! + +Keyman automatically generates a model ID for you, given all the +information already filled out. If you're satisfied with the generated +model ID, you can [skip to the next step](#toc-double-check-the-information). + +In this example, my generated model ID is +`national_research_council_canada.str.sencoten`, derived from my +organization name, the name of the primary language, and my model name. +However, I find the “author ID” part of the generated model ID +excessively long. I changed the author ID to `nrc`, and the model ID +automatically changes to the much more manageable `nrc.str.sencoten`. + +## Double-check the information + +Verify that all of the information is correct. Once all of the required +information has been filled in and verified, click +**OK** to create the project. + +Once we have created the project, we can begin to prepare the data! + +[Step 3: Get some language data](step-3) diff --git a/developer/docs/help/guides/lexical-models/tutorial/step-3.md b/developer/docs/help/guides/lexical-models/tutorial/step-3.md new file mode 100644 index 00000000000..88d9af90aec --- /dev/null +++ b/developer/docs/help/guides/lexical-models/tutorial/step-3.md @@ -0,0 +1,143 @@ +--- +title: Step 3: Get some language data +--- + +To predict words in your language, a lexical model needs to know the +words in your language! + +Keyman Developer understands how to read words in a [TSV file](../../../reference/file-types/tsv). This kind of file can be saved +from a **spreadsheet** application like [Google Sheets](https://sheets.google.com/) or [Microsoft Excel](https://products.office.com/en/excel). Other users may also use +**language data management software** like [SIL FieldWorks Language +Explorer (FLEx)](https://software.sil.org/fieldworks/) to export an +appropriate **TSV** file. + +One simple way to create your TSV file is to use the **PrimerPrep** +tool: + +1. Install PrimerPrep (info at + ) +2. Run PrimerPrep (note that on the first run it often takes a couple + of minutes; subsequent starts are faster) +3. Click on the Add Text(s) button; select one or more plain text + (UTF-8) files in the language to analyze +4. The word list with frequency counts appears in the pane to the right +5. From the File menu, select Save Word List… and specify the file name + and location (a .tsv extension is recommended) + +> **For advanced users**: Ultimately, what Keyman Developer requires is a +tab-separated values (TSV) file in a specfic format described in the +[file types reference](../../../reference/file-types/tsv). Refer to this +reference file if you are coding your own exporter. + +## Example Wordlist + +I have words in my language of choice, SENĆOŦEN. Here is my list of +words, with the count of how many times I’ve seen the word: + +List of ten SENĆOŦEN words, with counts + + +| Word | Count | +|-------|-------| +| TŦE | 13644 | +| E | 9134 | +| SEN | 4816 | +| Ȼ | 3479 | +| SW̱ | 2621 | +| NIȽ | 2314 | +| U¸ | 2298 | +| I¸ | 1988 | +| ȻSE | 1925 | +| I | 1884 | + + +## Editing the .TSV in Keyman Developer + +If you plan to only edit a few entries for your wordlist, you can use +the TSV editor in Keyman Developer. The project template created a +wordlist named **wordlist.tsv** that we will now edit. + +In Keyman Developer project view, select the Models tab and click on +wordlist.tsv. + +
+ +![Open TSV file in Keyman Developer](../../../images/lm/developer-open-tsv.png) + +##### Open a .tsv file in Keyman Developer + +
+ +Keyman Developer already generated a few example words when it created +the template wordlist.tsv file. + +
+ +![Example wordlist.tsv generated by template](../../../images/lm/template-tsv.png) + +##### Template wordlist.tsv + +
+ +We will replace these entries with SENĆOŦEN words from our wordlist. For +each row, edit the "Word Form" and "Count". Counts are optional for each +word: that is, some words may specify counts in the second column, while +other words may leave the second column blank. To create a new entry at +the bottom, click "Add word...". When you are finished, you'll have a +wordlist that looks like this: + +
+ +![Editing wordlist.tsv in Keyman Developer](../../../images/lm/edited-tsv.png) + +##### Edited wordlist.tsv for SENĆOŦEN + +
+ +After saving your wordlist file, you can move on to Step 4. + +## Editing the .TSV in Google Sheets + +Alternatively, you may want to use a different spreadsheet tool for +editing large wordlists. I’ve entered this information into my +spreadsheet of choice, [Google Sheets](https://sheets.google.com/). I’ve +shared this spreadsheet publicly +[here](https://docs.google.com/spreadsheets/d/10zhIc439BCSSooL_-HeJ6TUHd-ovkiXYcIGe-pHDTSg/edit?usp=sharing). +The order of the columns matters: + +The first column (column A) **must** be the “words”. If provided, the +second column (column B) **must** be the “counts”. Counts are optional +for each word: that is, some words may specify counts in the second +column, while other words may leave the second column blank. The third +column (column C) is always ignored. You may use this column as a +comment. The spreadsheet can be as simple as a single column of all of +the words in the language, with each word being separated by a line +break. + +This is what my word list looks like in Google Sheets: + +
+ +![screenshot of the word list in Google Sheets](../../../images/lm/sencoten-sheets-full.png) + +##### The word list, as it appears in Google Sheets + +
+ +Now, we download the spreadsheet in the [required format](../../../reference/file-types/tsv). To do this, in Google +Sheets, select “File” » “Download as” » “Tab-separated values (.tsv, +current sheet)”. + +
+ +![screenshot of “Save as…” menu in Google Sheets, selecting ”TSV”](../../../images/lm/sencoten-sheets-save-as.png) + +##### Exporting the TSV file from Google Sheets + +
+ +I’ll save mine as **wordlist.tsv**. + +Now that we have our word list, let's compile our model! + +[Step 4: Compiling the lexical model](step-4) \ No newline at end of file diff --git a/developer/docs/help/guides/lexical-models/tutorial/step-4.md b/developer/docs/help/guides/lexical-models/tutorial/step-4.md new file mode 100644 index 00000000000..28867a3afc9 --- /dev/null +++ b/developer/docs/help/guides/lexical-models/tutorial/step-4.md @@ -0,0 +1,34 @@ +--- +title: Step 4: Compile the lexical model +--- + +Before use the lexical model, we must compile it. In this step, the +`.tsv` wordlist and [the model definition file](../advanced/model-definition-file) get +_compiled_ into a single `.model.js` file. This +file is the one that Keyman uses internally to generate suggestions. +Later on, we will bundle the `.model.js` file into a lexical model +package so that Keyman apps can install the lexical model. + +## Models tab + +In Keyman Developer project view, select the "Models" tab. + +
+ +
+ +Click on the **Build models** button to +compile the lexical model. The Message window will display the results +of the compilation. If you have no typing errors, the lexical model +should compile successfully. If successful, this will create a +`.model.js` file in a build subdirectory of the lexical model project +directory. + +## Next steps + +This concludes the lexical model tutorial. Here's what's next: + +- Now that the model is built, we are ready to [distribute our lexical model](../distribute/packages). +- (*For advanced users*) We can do some [advanced customization](../advanced/) by modifying the [model definition file](../advanced/model-definition-file). Advanced customizations + require a some comfort with modifying code! \ No newline at end of file diff --git a/developer/docs/help/guides/test/index.md b/developer/docs/help/guides/test/index.md new file mode 100644 index 00000000000..4dac01ec933 --- /dev/null +++ b/developer/docs/help/guides/test/index.md @@ -0,0 +1,10 @@ +--- +title: Testing keyboards +--- + +- [How to test your keyboard layout — touch and + desktop](keyboard-touch-and-desktop) + +# Testing lexical models + +- [How to test your lexical model](lexical-model) diff --git a/developer/docs/help/guides/test/keyboard-touch-and-desktop.md b/developer/docs/help/guides/test/keyboard-touch-and-desktop.md new file mode 100644 index 00000000000..c947cef1b71 --- /dev/null +++ b/developer/docs/help/guides/test/keyboard-touch-and-desktop.md @@ -0,0 +1,151 @@ +--- +title: How to test your keyboard layout — touch and desktop +--- + +Keyman Developer includes full touch layout editing tools. In the image +below I am editing a Khmer Angkor touch layout sample. + +[![Touch Editor - +Khmer](../../../images/testing/touch-editor-khmer-800wi.png "Touch Editor - Khmer")](../../../images/testing/touch-editor-khmer.png) + +Once you have created your keyboard layout, you need to test it. Your +keyboard layout may cover desktops as well as touch devices. The +**Build** tab of the keyboard editor gives you access to testing and +debugging commands for all platforms. + +[![Touch Editor - Build +tab](../../../images/testing/touch-editor-build-800wi.png "Touch Editor - Build tab")](../../../images/testing/touch-editor-build.png) + +Testing is easy on Windows: press the **Start Debugging** button on the +**Build** tab to test the rules in your keyboard layout with a [fully +interactive debugger](../../context/debug). This allows you to step +through complex rules, inspecting the contents of the stores referenced +in each rule, and examine the context, deadkey state and output at each +point. + +After validating your rules, you will want to test the [on screen +keyboard](../../context/keyboard-editor#toc-on-screen-tab) and how your +keyboard feels within other applications in Windows.  We recommend +[creating a package](../distribute/tutorial) in order to simplify the +installation of both the on screen keyboard and the keyboard (which are +stored as two separate files). Then click the **Install** button in +**Build** tab of the package wizard and you are done. + +## Preparing to test + +But how do you test your touch layout on your iPhone, iPad or Android +device? We've thought about this as well. Keyman Developer includes a +web server specifically for testing and installing keyboard layouts on +these devices. + +To start the web server and debugging session, on the **Build** tab of +your keyboard editor, click **Test Keyboard on web** (we may rename +these buttons in a later release to reflect the cross-platform targets +here). + +You may need to open up the host port on your local computer firewall; +most firewall software will prompt you at this point. The default port +that Keyman Developer uses is 8008. You can change this in the +**Tools**/**Options**/**Debugger** dialog if necessary. + +You will see a list of web addresses in the list box below the **Test +Keyboard on web** label. This lists all the computer and domain names +and IP addresses that Keyman Developer is listening on that we can find. +Why so many? Because of the variety of network setups, different users +will need to use different addresses; Keyman Developer leaves that up to +you! We call the list the **Debug Host List**. + +![KeymanWeb Debug +Host](../../../images/testing/startdebugging-kd10.png "KeymanWeb Debug Host") + +## Testing your web keyboard on your desktop + +You can test your desktop layout by selecting an address in the debug +host list and clicking **Open debugger in local browser**.  This will +load the KeymanWeb Debug Host page in your browser, and you should be +able to select your keyboard from the list and start using it. + +## Testing your keyboard on a touch device + +To start testing on your mobile device, your device needs to be on the +same network as your PC. Then open your web browser on the device. Which +browser? On iOS, use Safari.  On Android devices, we recommend using +Chrome. We don't recommend the Android Browser, because its capabilities +vary dramatically depending on the Android version and the brand of your +device. + +Then you will need to pick an address from the debug host list in Keyman +Developer that your device can find. An IP address on the same network +is almost always going to work, but you may find that a canonical domain +name works as well, if you are in an environment with a name server. The +localhost and 127.0.0.1 addresses are local to your PC -- so don't try +those. + +Enter the address into the URL bar on your browser; don't forget to type +the **:8008** port at the end of the address you choose (on most devices +you can skip the **http://** at the start): + +Alternatively, you can click the **Send addresses to email...** button. +It sends a list of the debug host addresses to an email address of your +choice, so you can then just click the link in your email on your target +device. + +![Enter the debug host +URL](../../../images/testing/frame/android-enter-debug-host.png "Enter the debug host URL") + +All going well, you should be presented with a page like this: + +![Viewing the debug host on +iPhone](../../../images/testing/frame/android-debug-host.png "Viewing the debug host on iPhone") + +If you get a Host Not Found error, try different addresses from the +**KeymanWeb Debug Host** list, check your computer's firewall settings, +and make sure that both devices are on the same network. + +Now you can instantly test your layout in KeymanWeb Touch, by clicking +in the blank edit box: the touch layout will appear. If you make changes +in Keyman Developer, just recompile (**Compile Keyboard** button, or +F7), and reload on the touch device -- you don't need to click the +**Test Keyboard on web** button again. + +![Testing a keyboard on +iPhone](../../../images/testing/frame/android-debug-keyboard.png "Testing a keyboard on iPhone") + +## Loading your keyboard into the native Keyman apps + +If you do not have Keyman currently installed on your target device, you +can click **Install Keyman for Android** or **Install Keyman for iOS** +to bring up the appropriate store for installing Keyman. + +Finally, you can also install your keyboard layout directly into Keyman +for Android or Keyman for iPhone and iPad by clicking the **Add keyboard +to Keyman for Android** button or **Add keyboard to Keyman for iOS** +button on the test page on your device. + +![Installing the keyboard into native +app](../../../images/testing/frame/installing-native-keyboard-1.png "Installing the keyboard into native app") + +![Installing the keyboard into native +app](../../../images/testing/frame/installing-native-keyboard-2.png "Installing the keyboard into native app") + +Now your keyboard layout is installed and available in the Keyman App, +and if you have the Keyman version with the system keyboard support +installed, across all apps. + +You can test multiple keyboards just by clicking **Test Keyboard on +web** in each keyboard editor. + +## Related articles + +Other articles on developing touch layouts: + +- [Creating a touch keyboard layout for Amharic - part + 1](../develop/creating-a-touch-keyboard-layout-for-amharic) +- [Creating a touch keyboard layout for Amharic - the nitty + gritty](../develop/creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty) + +You can distribute your keyboard to other users by following the +instructions in this article: + +- [Distribute keyboards to Keyman + applications](../distribute/packages) diff --git a/developer/docs/help/guides/test/keyboard-touch-mobile-emulator.md b/developer/docs/help/guides/test/keyboard-touch-mobile-emulator.md new file mode 100644 index 00000000000..62d14affc3f --- /dev/null +++ b/developer/docs/help/guides/test/keyboard-touch-mobile-emulator.md @@ -0,0 +1,61 @@ +--- +title: How to test your touch layout in the Google Chrome mobile emulator +--- + +This post builds on knowledge in another article about [testing Keyman +touch layouts](keyboard-touch-and-desktop). Now, we provide an +alternative test platform for your keyboards, running on your desktop +computer rather than your touch device. + +Google Chrome includes a mobile emulator for web pages, for various +devices including iPhones, iPads and Androids. Recent builds of +KeymanWeb work well with this emulator and this provides a quicker and +easier way, in many cases, to get a feel for the layout of your keyboard +and do rapid testing. + +It is still essential to test your layout on a real device as well as +the emulator: the feel of clicking on keys with a mouse is very +different, and gestures such as longpress menus will feel awkward on the +emulator. We use both native mobile and emulator testing when building +our layouts, switching between the two frequently. Some of the emulated +devices emulated may or not work as well a real device. + +## Test Process + +1. Start testing your keyboard with the [original steps on testing + touch keyboards](keyboard-touch-and-desktop). + ![](../../../images/testing/startdebugging-kd10.png "StartDebugging") +2. Open Chrome, navigate to the debug host page for your keyboard, and + press F12. + ![Chrome1](../../../images/testing/chrome1.png "Chrome1") +3. In the Developer Tools window, click the mobile icon: + ![Chrome2](../../../images/testing/chrome2.png "Chrome2") +4. Back in the debug host page, select the appropriate device from the + mobile emulation toolbar, then press F5 to reload and enable the + touch mode. Some recommended devices are iPad or iPad Pro for tablet + testing, and iPhone X or Nexus 6P for mobile testing. Do not select + "Responsive". + ![Chrome3](../../../images/testing/chrome3.png "Chrome3") +5. At this point, you should see a simulation of selected device's + screen, and KeymanWeb should be presenting its touch keyboard rather + than the desktop equivalent. You'll also see the mouse cursor has + turned into a fuzzy circle, to simulate a fingertip instead of a + precise arrow. + ![Chrome4"](../../../images/testing/chrome4.png "Chrome4") + +You can now test the keyboard layout and get an idea of how it will feel +on a real touch device. Rotation, or changing device types will require +a page load (F5) in order to render correctly. + +- [Creating a touch keyboard layout for Amharic - part + 1](../develop/creating-a-touch-keyboard-layout-for-amharic) +- [Creating a touch keyboard layout for Amharic - the nitty + gritty](../develop/creating-a-touch-keyboard-layout-for-amharic-the-nitty-gritty) +- [How to test your keyboard layout — touch and + desktop](keyboard-touch-and-desktop) + +You can distribute your keyboard to other users by following the +instructions in this article: + +- [Distribute keyboards to Keyman + applications](../distribute/packages) diff --git a/developer/docs/help/guides/test/lexical-model.md b/developer/docs/help/guides/test/lexical-model.md new file mode 100644 index 00000000000..e46d9a262dd --- /dev/null +++ b/developer/docs/help/guides/test/lexical-model.md @@ -0,0 +1,67 @@ +--- +title: How to test your lexical model +--- + +It is helpful to be familiar with processes for testing touch keyboards +before starting to test a lexical model. This tutorial builds on +knowledge found in the following two articles: + +- [Testing keyboard layouts on devices](keyboard-touch-and-desktop) + +## Test Process + +Lexical models are tested in Keyman Developer's web testing environment. +They can be loaded on any device that can access the testing web site, +in the same way as testing a keyboard layout. + +A lexical model must be tested in conjunction with a keyboard. The +keyboard provides the input, and the lexical model will present +suggestions based on that input. In normal use, a lexical model is +linked to a keyboard by the BCP 47 language code with which they are +both registered. However, within the debug environment, any lexical +model can be tested with any keyboard -- but of course an Arabic lexical +model will not provide useful suggestions with a Hindi keyboard, so you +still need a keyboard which will provide sensible input to the model. + +There are two ways to load a lexical model in the web-based test +environment: + +1. The first option is to start testing a keyboard as you would, in the + web test environment. The keyboard will remain available within the + web test environment until Keyman Developer is restarted, even if + you switch projects. +2. The second way is to specify a compiled .js keyboard file for the + lexical model test to load when you start testing, in the **Build** + tab of the Lexical Model Editor. This keyboard can be selected once + and remains saved in your project user settings for future tests. + +To start testing a lexical model, follow the steps below: + +1. Ensure the model is compiled by pressing F7 within the lexical model + editor, or pressing the **Compile Model** button within the + **Build** tab. +2. Prepare the associated keyboard for testing as you normally would, + and load it in the web test environment following the instructions + above. In the example below, I have selected the fv_sencoten + keyboard to use during my lexical model test (you may alternatively + choose to load the keyboard project and start testing from there). + ![](../../images/lm/test-model.png "model-test-page") +3. Choose the URL in the web addresses list as shown in the image + above. Keyman Developer lists all the addresses on your computer + that it can find; some will be addressable by other devices, where + as addresses such as 'localhost' or '127.0.0.1' are only visible on + the local computer. Typically, any other device must still be on the + same network, and you must make sure you allow Keyman Developer + through your local computer firewall for port 8008 (the default + debugging port). +4. Once you start testing, you can swap between models from the + **Models** menu in the test web page. As you type on the touch + keyboard, you should see suggestions change in the banner, and you + should be able to select the suggestions. You can also do the same + testing in a web browser on a mobile device. Note: you can point + your mobile device camera at the QRCode on screen to quickly load + the selected URL on your mobile device. + +In order to test the lexical model inside Keyman on a mobile device, you +will need to [prepare the model file for +distribution](../lexical-models/distribute). diff --git a/developer/docs/help/images/app/dist-file-browser-ap.png b/developer/docs/help/images/app/dist-file-browser-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..e0957ac4dfed929d470e992e1416502331b80d91 GIT binary patch literal 15648 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-install1-ap.png b/developer/docs/help/images/app/dist-install1-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..9150ea481a7e41bd69149e6f00f243f6d5a76e60 GIT binary patch literal 31248 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-install1-i.png b/developer/docs/help/images/app/dist-install1-i.png new file mode 100644 index 0000000000000000000000000000000000000000..e4632eafc93b5f6d132aa511fb117b97ea0d52dc GIT binary patch literal 25155 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 Js8TQw`X5F=bfy3R literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-kmp-open-i.png b/developer/docs/help/images/app/dist-kmp-open-i.png new file mode 100644 index 0000000000000000000000000000000000000000..a6220a3856262da802f2a1fe9b58b3eaec888695 GIT binary patch literal 20076 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-kmp-success-i.png b/developer/docs/help/images/app/dist-kmp-success-i.png new file mode 100644 index 0000000000000000000000000000000000000000..af1108946b9640232a059aa005816770cdaf6f2b GIT binary patch literal 19311 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 WVx7c&;Rf)KECx?kKbLh*2~7Z^G^qms literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-storage-permission-ap.png b/developer/docs/help/images/app/dist-storage-permission-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..0deb5cf41af09c0f33438ffebec1d41b01b11ff2 GIT binary patch literal 41020 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-url-screen-ap.png b/developer/docs/help/images/app/dist-url-screen-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..bf15950a5b17f64e8074caeafe4a74946c061e2a GIT binary patch literal 9196 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 CMYF~L literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-url-screen-i.png b/developer/docs/help/images/app/dist-url-screen-i.png new file mode 100644 index 0000000000000000000000000000000000000000..1c0029646756c875ada8b6cbb121d954a5a892ff GIT binary patch literal 7954 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 Y^m|N~eyH-lJ~jeCR#m1!$~5GE0M|t%A^-pY literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-welcome-ap.png b/developer/docs/help/images/app/dist-welcome-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..39dadf470d2c6dad8afdec9a8c37ec883c85773d GIT binary patch literal 74988 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�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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/dist-welcome-i.png b/developer/docs/help/images/app/dist-welcome-i.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa0cc725fc809e5a4d0b9db4b34757ea4f07c6d GIT binary patch literal 49395 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/app/settings-language-ap.png b/developer/docs/help/images/app/settings-language-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b2ac4c9d0c6fefc3f1f899c1485bae7eeec3d2 GIT binary patch literal 7778 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/developer-open-tsv.png b/developer/docs/help/images/lm/developer-open-tsv.png new file mode 100644 index 0000000000000000000000000000000000000000..4a13865b76b58c07796b94e9a0f92f023e04a896 GIT binary patch literal 49948 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/overview.svg b/developer/docs/help/images/lm/overview.svg new file mode 100644 index 00000000000..5259abfd5c3 --- /dev/null +++ b/developer/docs/help/images/lm/overview.svg @@ -0,0 +1 @@ +Lexical Modelknowledge of your languageand its spelling ruleson my wcontextway website “w”suggestions \ No newline at end of file diff --git a/developer/docs/help/images/lm/sencoten-sheets-full.png b/developer/docs/help/images/lm/sencoten-sheets-full.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac2d487ff62e1934ccd9d8ba420a09294a87391 GIT binary patch literal 100381 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�!~)6g3>JIo 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 V_gr|PMf55A!z$Y3XKcXWbAh((D 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/template-tsv.png b/developer/docs/help/images/lm/template-tsv.png new file mode 100644 index 0000000000000000000000000000000000000000..d480c29912a800c93d2440d344cffe28e31e2ea5 GIT binary patch literal 11659 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 WL_YQE2GR%AfXAvjDy0vfy!l_{%n4io literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/test-model.png b/developer/docs/help/images/lm/test-model.png new file mode 100644 index 0000000000000000000000000000000000000000..740bc648b0ca2ad5788c19bef2c8507ebfc8d8af GIT binary patch literal 49235 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/tutorial_distribute_model_3.png b/developer/docs/help/images/lm/tutorial_distribute_model_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2bc7bbad8c423540790cec9a261400e0ae1fb953 GIT binary patch literal 29009 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/tutorial_distribute_model_3_files.png b/developer/docs/help/images/lm/tutorial_distribute_model_3_files.png new file mode 100644 index 0000000000000000000000000000000000000000..417a9dd49e8f8ab79e3273814595535433a1fb0d GIT binary patch literal 27625 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/tutorial_distribute_model_details.png b/developer/docs/help/images/lm/tutorial_distribute_model_details.png new file mode 100644 index 0000000000000000000000000000000000000000..bf506cac906bebbb0f22a9c4dd8ece8ebd511d5f GIT binary patch literal 26282 zcmd43cUY5I*FKsVM^R}iDgs6vLlJ38Co~&`j)F94A}AuX zMQQ+nAT^XwLQ8Ugs?<8@h{kiGZXd#`n`weGbZ{qCv4XiqYq1c5-b z3i5Z=L7*d6AkgoN$A1St;Zo;T0RH;J?3T(c5U3!S`oQ=o@O}zkEOeu|6b_WC@uU^^oQrBYj3SF?@LcLZoXvCon|y( z8MTI(=v7AzUcI1OABfN1l61qB40(#Xp(8!Eq5I@4B@5u$a1LXSTqW9D8$DYco7gb~}g3i#s&I#{%JJ*bt2)t!eh1;sl6+jw+*5;b`cj5`ked)^oM2MF|0U|t@0;PLt& zA531rNcbF?y^16?;&Lx1zZ5ycXm^Koj0YI@w8;U>vO<0+vADU9ATi2pe3EhBU!5Rj z(0k&I4pwkza*dh{X&+s&mcY0y1PsXBhK?lOZ|RiUUoLVyg=$S%^;>E&F|zGIj)F<+ zN|Ev82DA$)G`N;LBePe9E?;}47LQn=_go{gk{9R^ctII5H+rwaX$(s90=GFK6+GUz zp3}TCGA7}nLNCWjNItvLUpU=O4SJ~?YLhLJxgb_@qA!3vQAcKF;~EhgG0H<8WO3Fm zd@&-G%Iw8)dVY-xCI`$(uS2>qweZbWiooQK-ZYtY2&2rN6&0&nd$7kIzOL{~OyM|m zn{`$7^jPG&zibt*`xxkD>w8t0e=@UnpnSp3Dy-IVgVS(7r9ZER(3wYEl=0Xa zpWLoUn;=2zHVRl>zirzf4*Jo%-WIIH71$)XWOApVtafHl53w9PK{Tv-3Mtj&j45{* z+ZZ$uh$n*&7;)aV5u9ozrG#d?4aP<(T)TZaRWA z6U|#BYdD-y-Rx*fkSg||?hWFr732-}S<#9=$+%b47{_l@@{Ga5pZE*}DrB1+wtUcU z`#dRr>u81R-IHW{96y;Km;UXGkw?45suYAZPnx7w|8+xVqa+Wrx0WL~C(Mdi?F=S$ zkvD@_J^JZMz5JwT1FaC|xAm8q8xu}*Dl2H6TbQcIzk0q&;w*H~NCF32$sCQ#n0$rT zhYO7IUUI@!zpJ}uU@)f7;eW2N$0$83F@cp+lvkq{Dm7A~T%lG~p76MKsq4W|n4rMb z2<=O))0af0t9$P}RQ?Tg{k?nH!lM9@yqVIbYL)`Cp)nMA73N7Y^2qu&V`M14aBP({ zIOMs&Vze9XYv{I3t|iWQPe9#BGr`p}4QZ2mQ~fskUq$OWb2HxVeYgkqt?N&LdN9PM9ztX?d- zT2mni>NK&JWt;V&qSkmW6};Gj!rtfe}5*Rlj0+Q803l44mOLhpW@%TrK{ zCtaO_x#+%ye%XqWN&Opi_OrEsSXfJQsHkeh zc_$82BM+5f-qB3F{P`soPL<(5KraJT(jaK7%%-MRlB+}V-V!4kfg6o6s@i_H?;W!= zx#g|qu}0`78I>Wvni*DY*jUMWQI1IAkD*g-qO!IkQFII|S0@r2YP!R2k70 zGht(J%ilpaOPBTZsP%+SR#ce9xZdZ8tmQlcRVQvK@sqx2$ZU>=PVRY|A@)+tq&FAQ zq>8wY915C^vk`*7p9Z}I-zbL^94)J#l*9Z+0SSqECv426LWnYwRPGd69{_;*BUld# z0A8JA;1eLw%P0RIJ;*u13?*u`_X^7bl<0I*Y?r1Pm8>#IoenZgue-5NH#dwM5^Zfz((jh?KgX{h8S_}@Sb5>q2FANiE-n)CYwtA2 zL!>T)Uhe7)qgaUX12qc7Wp&YOjItRIq()=$xz;>%k*-3CS;q|PFr5y1kGpryFgd~3 zfJuDM$wbZ$IL!~+W2ycCsI{VJFC#@?wDF`of)SL7PG4Uy^y4tL# zB{8qcZN4nm@Vtk(_8aJexiKu_fRMOYme}@@mdaDjpFlskXo;;mQ93zzs!+4Mc1L== zIBkNQFHh$!!{|7lgBkR=A`;d*-*j6jjJsZQc2;0B$()5Dhw0C;Sv}5=uOJ(ysMI#9kV8^ zXOdZ4WN?^!)??9&-#m3N%3_)bARM}2IZJ>LMJM|5ZG20JPs;2P9rd=hq((~DS8#+n zo!Q!5!z`oW&}G&)RP2@H6~}feCDk3TF1K?zgv9YDpKr6_G9S?3gg(WVjxlz#Grglr_PA4yT1sX6EFM#B$}EX&h;Rb2^5bFWvAecV_6+;{2$2^J2V|CjW^t z%^FU_esHex`5DdC5P!#j6~B&3ucp>Ts|xm6jXn+HgvcZP>_>wJiN?evaa1`7EEa4&Fm7I z_T6!lYyBUH9KvcQ2h!oH=~5v9qr`ns}4tIxycI7g85**yLRZ5 zm5>mXzVSpoiqS>n+h}qy>61ffBRs+K^#UguU4iqhkO_`s5?s0h9z? zsE77V#Qg!PChestMJ`*gfj$_FphSKH6#;{8vOa^=ep|Qz`sRoHm@~+Wf-~(#;G&tw%DLi|vY8A8M{EZXYuzZAP_J+S{3CvWNaQh<>tgW|!Rgjv9If zv}ZBjvikv|4FjB^gby$wsSmllOMu|&i1$s>v>&l-jVaa+5=4zyHQ9pZW?MyOIF;?L(apGAu8d8j;KU^Ht@U!45PG4eP(5|o9Z+fF|kjW4y8bEkr3Ycr}fY`$J zI82pKTQEqUNhKBHfWF*O##9H{Qj-`D_T=*zJ}O+*ixPRBK+PQ4i>d;$iI*g1Xkjog zNcmW4Zd{Iq(X%v(vXDFg1CDBXT={@|*lVjuvnWp#YWP5}%XDeu@e97){1n`QNq>OB zy`sCYQRLAWgU?!wmZiSZ;EH#A{aZJnb_Bp<^%#w!h-A-X?&kA$gM%e&kxO)Zh(*is zDOtFtK3g ztth#zC#}kMB66_Dr@mi+{H|gprn|(;Tk3)S#DN((7C$-dRzRJ3O!(gIGFnR!fnrEF zm~c5@tH3`QoPiiUstR$h% zLnJ_sh+8Z@+-Yxrp-j?ucKKS@NO;WnzybEsU?kXpfoTAhNH)tkFwwdHCMn5xsv$R{ zz-^KuZ(ZMVdFsrA9*>H`nP{Y&xppaadp-IDQ~=T~Lp~spND`B~suJ7SdmOW2;C>Y7 z`rSLQ?fb#+-^Z3X@cIMGEkBL?Qf{+F96qXYE~v1 zoVA1HcM3@O7CAl-2m#QBLfkF3>ZzVzq^ zutoG|3lWLMfs}KOf%SXvFD54U#Y$5R(ch3 za71|)&E|Te2fZ8pmII|`Nw)$_;B052LxN6o0r~4ZKTiI}=wvW_O2eXgt>6X2RP7gn z3F8B+8c661Wjf!Gtj$lsyHTIOBkAh{*TCXPO{joz8U${dntYiBqJF4h!09Et>XYjl ztvp}*qVGkZ%o|=@@^^c2EQBmU9gEaHWZD{X5@pXxU{H=den^ZI5OQrsI+~K}SVuYs zOY&uLfJ*KWYw4>#WJ>(L+$L-3(0K-&;e}jYN*xmM9QNnfes*{HuF4D-Gz5vcK^Z;N zgTjZyr@Bkh?$piln`UL5mwRb|=^7MXVA7$Murb~C1Exh`BnrKF7w^JWF8$D}&E0)e zm2ncS5b@)~fNTjnhri7}mL3W`vVkj1z8_3WJOc3IJ*ccC$U+PF4uD?>S}>Q9f*Ic4 z>d_y4>@5M378FU0!Ovh9BC!&V!BSNq&@vQiXTc^$I#o3vQ@0y~6F&xelm^^bZQ5&< z(69Nhi&e9IDN4y~pht9l$bs5Vsl6zPKp@)exSIm;i|JjvXExQ>P2Q8)btA7Kc7n-{ z1mA2_xFaoa@$YG&b}sF*KGO+?s$&R2!KhU-dT@DL7%`{hiK~|&Pv7ZwM6@vLJ_F7M z^m60_B(hB3G`&-5U`a8Z)KuMwl29j2z9g?6StYlYN#Py#)3)w3Ar5vLP2~n#6srIX z1$7()>n<{|u1C*axzmeke^!-a>S^Gl5MLfikI;*UxzvUQBBqzeLYQ=c^8h_H4@7pP zSo#>2=$l>@*F>am(Y2tb;s=^<)0?cjU+}%f6E$$>G+je-*Kw({ju^P6!1<}`%8SY$ zLazim7|ti;&zQ@x2~ORk%9LJ>I1iU&^L1G9bNg22dBAHEKDVAn-Kx{o#thut^*eCW zXY-oC-k&eEykLdDyO`m+Jh9It&v7)|Trif@Wo;G&j^d#W%zv+~R0(?ivmo?RaccMU z2hVW2#YlK}x@juz_7{=dP|g(sViAVktE?j<4wCXh=Qcw%1t1%CTHlvi+@fsa{Q~Kj ze%N0`v&5{7V6*Dl_bvRw+8|%IL;h z#LQA9pRTtrbXebFLv|kAjxP@;W7IB6t_9DI9O(SX)UNwOOEkb-i`-*;3p%H|=bd|^ zr31XM5AT291oJ5BcGIBSw1bvcl~)g-gCWrXf%`K~HU3oY0f+rrd!%IRf4IXo9l zkMEmkLVo`CSxp~-|Ln1-oh!N5B-*x-&MF{%kZU9V)b!BE5@sdTTXekdfZsYB&Wm-h zr7ikip~x4iNbe0M=v+K@yLmkAwX-2FBa=V!qVB=xElxEI>v;Lzr`6qUdXMh1b~LN| zU6Ol06)TEf<^`*@;g5UmK?!OH2PZ=!-_kVRiSy1QCh`-vs8?cN2gH&~X(A)D8ql2fAtg%Y5eTV3&^OIeNSKLEZRL>J+Mw7FCAevNg#S!4fnVQ9qfxmG5+hBRdF+ASKcs!N(w>Fc!rIV% zD3es|C{#U%(-gnhQol~Tg+3@mo4Od3zoRe+4$*QWPRW>tUUj<^WU*z1XM%D}Nth8G zm?;Fe=S@tJb_4eRQlVF*Qh6g>jfD@+A2Ih@fMx44&u#V*D9`=c#0+xR~$$A^Y5pOF|XXV zis4#7vkwK zYAES>K?e1HubcT$Qk{&h{+aH1sGepgkGQ`GJy*#Ka+_>rc43A_ZUOu3T<@sftZ-|{ zJOh4=f1=tE(UGW@gMnhaw{zOvT*iq~UHDTV5SviYe9LcIi!ITEstSr}m_%3aKi&mo zrhB!aI~+ysEs>rirHn`DPYZWy7LTu+JJopvclPi1ry`FhuUNR#qi_8P|pg6{7 zUHMnbB1U8uO23UA?<*CwLc0~mR26oAYbA2=>#s3>G^z z=d@m0A(Z0WXG{N*r3kFclinHT))Gi8*CcyS@WC_v&Xt5e?U^PfDYdarapa^Vc0>03 z@*K5oH8ZE|hpMb@r}9onRtC@dH=-XFJCsu|1Y#ggS&gZ*Zh!@beZSh3n=m=<=k@IO zG z+BfKZVBWmtDXL%aVq=~UTDx)H^Z7I3K{HI}pmo`nJpeGs)cf0%oWhZ%^e*gaX1oyq zQLhdSWm|o|#i6hcVh$Th5PgWjZ`28)A$Ko4~JQ1kzvAu2@+fsi_@fPq`jx~wUSnUld| zFxxs-515g=kFsr@N(k=J?{NdpRLq6J}j6CkjAr%!g+}K}gH&MkaXjrE4*nszAJj&Y^!JV^pDU_67_joTteP3CZHQN@rw?MW2t6s=W za`ris^!A-m+A)2YkL?8^)y11a@mAl(ZEdo>P#o0o!M0FZXNC=6Jln~$qVpY(~9?FGYsGz7zssaUp zUjEP`I2QEx7k~tmqE5Z9k!LG!lm0kVscFUKMfrq)L+AWf>@*`hx#P~r4=4IIKti4K z&+qycUjE^`KW`}+cH4mMeD$K2w%g6m(+6dK*UFZXcX{o2`QJZo_M&dG9J+ZIq2*5v zCxP)5A0V$pqU8W#@aDr_zUST`!#*WTZyNq~^Rf}sGB@MPYrlN|c7gZHm=@m&ZqRWo zx0lE4@ApzD&ggQmkCd~{t*fP{UNG$TxE%$(a)0vo^4Q*ds=PeveYa2Rf`RSS}`~vhHGv=z!8y5hlz=ZTJ3Edm8VzWO6ky+lX`?g#!?{r%p@A`#~ZC$pQE+4-e(mlX0<|f4Rvvv ze7*g(e^@=St@O;{%WFE2WyjvrNObntY>?JAJtOT||4xGbRe6H#UPGSI{!u23 z=dxPjm4Ti8qpi|}X6Vet>yTRFP`=z2`CSm-+5WBHH-gY-YU>zDJj4A zy?MN0%*dF~UGIdyzi~lU`zQxEid@QW%lp$_o8&)X=ew?9R`j-cz^P=)>Y2M zgjD_9MnsftFMCj^A3hAhU$ArES=?YU*(5*no~886CTwgE`6$+DulIs`YoWJA$X2Ve z_~2ivvLOe1ddsjtgxNc__dFE8z3Xc;QC5~fKZ3D-dc;TOPRVx22@h_yV~%Y^tk^@- z$S`e3qrOVDY>aYqLA+6-E1wi2Jm}eOKqQ;GWkMasI*kFrF;9-i;))B&CDa z!Per{Os581n(tOzL)+em(z;mP5=hEa^;#0HnY0|yB~*PUDp0B_UyO%wr|u4ur*G;HaZ6jicsg4^6JHPRcp-zFX+^BNV|^=I^YY1O4$|UmRPI=c=QP zQh-IQ(md5h!P#EAw`d>RZxgnGo1Vv>vq-uRgyS1T`9EjNCO%;%f;&z(9=i;nMIxl= z@?UyzbGwX+o*RG}>}%wMU&f_D*!Ks!i2U)$j^BVw{>L!$c7U;Z_mZ3LELhwFSXRFW z<&W%mUH#Zf=;R?Pj7(mV%)VL6w?XN`z~YUKD!v6FJL+4)6Q32wA;WgYD6HelEkKa# zNysoOlRiWi&0`AaEy=>38eCMPrW~avf0Vhu%nloZyB3o zjTjy4@wK!TEuvHmANc?)SXMw_ZZi1!`S}+nhnGzOUO^xnG3EnD@dMIQh>P>37*z90 z4H~&DN8wD~0$YlZz|%Ibq(A@~7)W%04du@ws|lW-xiu8`|Nc*4eZ3WVk|*}|&y{*m z8f6&4V(lkIQZxpWskZ2**1KroES5Pf5J)KrQgjohI)0}6-Wi2fppFJO7qXKeEK8V#2Hic3Sff(0eFw{#9R44^c#J zN_PAx1USFt2SBW(nx{a8*r_yjcE~JK|-E z+Q#p zbBMdN=VeM?b6wfTe1Q9!M&iZDIqG%dVZHlsZizvZtb$x;8qbbpuIq!VCfy>omd^?b z5A@#K!sN7fj;^>D6HcB}piB>3biFFz^>YbYZI!)0wHh$fz=@2G6X1&TYM`6a6n_HT z_51sfOqN-$B@yhxjqyl92=%dX4-8DD9|!*9Ro<73i6peDm@Y>-Gn8!MzVo zK<#+HM;YPnRK=$`EE9o`PtUiM{EbAZV<-XoC-j%JfNi%N1!w%gfw%WzwF|`(r}N;o7%N8 z3?Ee!Am@O)v2w)5sERt7n&@^7s)Kd0(ODI)Fe^B|jt zUZV8qyMj41!mzfyb|Y@J*hG!)iMr~@4KQG^hv;w(yr5oiwd~3lQ@+o!*C4so>T*vG zc2V7`WnHvwTR1nLsOx;3{nP<7of!_vaxvf?)lhdD`%JMU+qAhhrGUS`c-~;%$M|f7 zgBA5H!G-Ll~jq?WOc-<_tfA##T*j5Gtm z1wdAajbP-%iSxnrc>{MX+FD(Y%I&AQ9b5O9w@rv0c?f&Hl~Kq_yuTA3ZLYFKuzYwd z$juR+%yI&8ieu>r2)HTAA?U5Nh`P^`MO0y)J23L6r7};hUFYrnI-w}topnFNF0GN6 zt7KG|$MRE=M_4m+ZB2fy=zz+$R_U)jB zV=di1xru*$4(yHmZF$mTioBbOoe^avjkR{v2RD#6Ce#kvML9wXgU36L^`I0Re<`?YKo3D=d3$ctn*uJ01Q{D&a}{NE}`zAmq`yTnYj zmhZ?-z8|nKYzJ#2_oBuD`~FCC2m$@AEA$kPe;R=8_e!wZRXtKa0kMjRbgw3CBHnlK z960YKkf({k2W73v%O=10<&G4HiwrO_5E%IZ^6NbRd>VFyNpJRufn6Gi#FnbiU_v~J zg|hR>oo(`gQ|(-?srq(7%m{_X{O-v|Q1ntlhA_M*5OpvmPz)xH z9I(HgwP4RJ^uZ#5?dKJI4;O%`v2&v!km(zW;YF!BA}D-p;7b67^`ZC*1c_io8j^{2 zKiJkI$Cy5yYK9>WmJD6@djDfTz`b`L6fq#|a8|9&b)FlDaLS@RV|Do8c*#)ZHfcve zmYcBL#v;%=`X3P@Fyuhr?HhKfP%;E`-Qz#v!b5EY;NR}MG2{J9danZPYY$4ac2;IL zZnc7Y*LiiJ4n3z z%pk%jqdHf2^t#BO4Ouh0 zN~h4?5-9^Y(mnA!tf3k0j<@y5!dI{a!{#s<)3hDanQa|2qSnL3ooyKGgh-HiM~(K=-cj2{S`aVhVlr z{y6JSajdNo?ZnnA8IRprZ6n0iu0>?L`?sRJHrkq%37;^Hx*bv^hULA0>p@da&^T%1e1lKl{IgpS|fee zJxFisoHeF=!BhVnLTUIafK>R``IH+5c-jaTAMDagdWBsx6e@+_smy%8OP*&jxQfUa zhR^bj?-LFt52iT;1+q(&FpYbYxP#H|tq9ua1GRd9POF&jMd4?MESzO}Rd>-B9ja}1 z{JLweiSIlZMcFy5J0-+d+0GjH?y=Xd`E`2^g4>*E30Ak~L}1d?EXMUevX)j0pmt)B zVK!gEQn!;!@4i>TNhE78AkuL&dG|VY?!u+l>!+&t4Jr)}^d;b?I{i`$d@*8_TRiWW z?7p5udYi$P)>g*AUz4?=RGh7Xh+y-cpOEPh7hj!pUNgJ0A`|k~FGPr>ZCFgXY*C8xgZREd$*h zMe5(Qez%Q~p=02Yp^)x(Z?Gvw(g*$8xb{~M63PAyL;;mpFV}BT-IcT98be!QByyQG zUq${rkV~+EvK4}X-jp1u1p^HtQ{i;F>;S?(>rz$tt zeYM~;hqB=-N(zmt29l}T2!xOH`iS-nIj8DQiqX00ygvkxT|)7h9Rp4H?!}?R3?RkA zKE4kVA-z?YguGR4jdd^;i+L+is52wdV>AF~TJUrQdt%ub)F$AQ3Qc>@)&9=Wdyv(3 zb~ZMv*mDw#b8BDU=)M=16cql8WWLW$ywyL z8CUCHEVgnI^KL%}7VfyZ(DL}8!_C19Fl(cOcWrT%?A}aFQ$|Ec+2dc$$+8+kH9y}{ zc(j2A9L0X908Yu~JEt}7`;)@)_QnCEl%uy(}$R~X5)m3WX9Ye0-r>o{sLo! zs5YOCf~pzCSySM#Hw&Uyj#gqJXe{7u{(K@YP4%l9o0K4VIO|*JRWDvFj?eIZ=R##@q1O`fOx98aYA2So?{E0$)07lJLe zX3g3e8f9A>AKF-}472M_oz)oiYV0m+sDJ0D3gnDFw&f^wcYDt`jhfwIN^B95*A99| z{ljMzF1IMgfiGPw7lb(SX;<@7ox62qm971H|k+P`kmuqlz?2N=M1FC@Jv&;p6w_uq#i2T;he3Oer%c z-wMd*TLY#m&>Jb#kGg_R~0Gdp%pae2=W8g=Cb(x>Sj#Q;l z7_JA7Sb$5tN_dG}zK$0x&VoYmq38pww&$#N?VQwVh9lN{A2)f1f5o-kAqK}5xv4Ks zS0O_%%3pu9w_Apgo(eVCH>>&VV^K%{xW=u`x?P6xqa+Y1y|YQ8*eS(hQC5AvBp)R2 z0w&EGk)Gs00s`L|=N%uu+iBTe-_6dWb2vkcGgh>K^W|@cLaYDe_9)6J>}YxsWj8#E zvgQH15P6+;ojAEy`~E?D=9X2bxH1@~Xphf|oZeQ|u4EugA|m5?t<}22hr+ZqpB@;b zcextdmP_zPR@q*dFE8YQYJ>MYvIru_xyP*+z%QD&d>hG0JNk(@|EziyQAxc^88 zd2{xR6i%W+>wH?j#W*wKioT{E7sJ%VIZl=GbgQ$ns{cq5Zm|6QrIrsnwT4~Z)>jKZ+4?$pJLUW!NW+2NvgdkC zHuLJ7mC_S3*$eSBqg{jidGv|4r;S2THWlyO`C4meF(qGo?>|+vp4dLFCp-?{Fs;^| zD{LFKDDMraD_du8HDgp2p13>1cHQaUjx=~-@`|ID||NRoM}*3SXw1aCFa3XDF3Qt1|jwBZ6+8x;3PpL zKOoEPO+kh=yM@)Q>f$L<%ViI_HqG#?_M_}hTj%4cAEo|fb^Yf4;EY!1UHoi}s7+<+ z)s_V1MO{58Uj_a4SL34z5DA`ndC?@9`ar}Hh_Yhb8zp_?vx2T7m7md;am5{eo;7HDWwsyw^RVw>+aV|0zbMZo`|NX45+w2r&h!;eXrtqZ4mK4B z0EdqgwyEOypBEw;lc<&@DS^~@KPBqDCV^k7oz=r$vMhtFR;|{0pUyCi;wf!!x>9BV z0MX^3Vc(pIWV{p))Ldcj6n_3U3FHro6hM~(6C)nNqX6*8jw&`TOAX`xm2damE0uGb z1`1WqXYG=gr zZN*}B;U`s9v?8BXpF&AgEa?DL2EOJ&7&lYUae!|>0Qz=W%iEt?$n7(NezHe5VInUO z;y}M2ugz~S-G{YvT>zf*`Xo})VR0aUcN$ro!R(nE$GBU`6U+uuHiE&VZ?HR}MST9^ zl#?>x*v=TyoReAS9og#4LctVIUnzn2e)a*9@FQjn2Xm1*36HqJ8RQ98>V`~jaBCfb zQ{q4A=_CbsGRdvQM$}KDFEtZ;nm8#EPfmyg%dwx&U{W`TYq z(x6H3i2n-_n))qi=GBTcOb$jtmEEn0gOC8}JlsU6%J^Pl zH*@+zFNHR9`x?TUqg+}^Vb4A&svceF>_y%CkqL4PpkOeVudnZ3ZgQYR%kR1z0Z%L$ zgCFk*!igR0O>ldM1@9theAjR>y;?=-)qC7G3Bg3-jPXT-rJW^*!onDIp>TcfB^hh# z`>+Yu<>LKPLywuY(S^a)E!oqG^k<{)2Ytrhl{BJOm}D5Lw`>V`0rPiz44b-c$)MUO zNRZrqufkZ=>T_k{F8i2|=QZmqd&=C+3$MS8K|S{3r^O6cRllrQ-E;e>TySTWZm8KR zhB4At;?#LxcGa1jGRcqt))%L(32JQJ*LKq zFkY$pKo7qFyY!;DQQCF8??~^JzqgEqs+$YPOE{^9u2b+o!^~=-{Fuz0PB7D!zPNRC zaeD(_4Zpr*g^H4+Y1EM~ed+q~mz-CmDxOQfsoAXQHeZ^Kz9N>Wv99UCN$eSj%&?Pf z@E{x%yZ4P#SK4r23P5UDu@5=7+Jz=s)z(0sBxD#}2#VA{Cd4v~k_A^9U+{hn_cv+1 z&3mh?*!(t=HcMZ{=3C{Iv6ijiHzt2ec~(MQp6gQSu-0AwsqT9wmArw~*SC+l{Q23O zOwFijtucUF=q~Y~7e3G*?KEM?_OvG3XtHmyB=~vhJ_fQ;?KAh<(#`-|G4@<;KRsQ0wm}6hT*y( z9gYtjkq7V@%^T1&9zPPfXmglq|C#Q0`?~f_HjG_tx3rl?uGije+TY)Aynpev@kL&K zf;sRKLEDQnGDFrppGOG}x}l$qUBUyWx9nUBi*4JT+k$XT*7aWm@{cYkf}Mif3J!`a z?wspST(XTS9%`4o8NhM~l?=B!@cwPXO__X5xN{bj$DJm1Yne?F?mI(Mg95mzypkfFR- z?|NFRdFmLOxK*J`%9wIlXzyKUpY3D^^&r~~#@|utClc>4{C=xBvob}1KE8@^X)p4V2=O4DP>3toWSqc@<{(y%p#Ey}J}p?shnjf)s0`s zC`umiy`lkB7k;Vb{$#HLR*qkrhWY=N`zD3ta`=dV#lN|++_67kemXie!WOQjlf<#~aEMw_9 zC6mpPqa)&FHm`AVgBL7w*#V~KklTH40`q|wc`5uB0nP~0(bZm(=PXVJ=P~^Z6*iXS zJEg5^#n|ZS=`i}@=N{fT(N+wJb58nIU|s*;uS+NOH!APCiEyeGJDS3GpI-Yb>2rab zcKsu})2H6I8T|bw-4D7MC}UD8Oh2Lr*28km59X25VYACLs`;Nm0HvSpCj;@lvh@FA zfDWFi((~KS1klBTOKGh4=5`T4Lp5`DOe#k{ z&L5WMesHe$Enp|5I1yKX?wqp1m1{|2Ob!?^reH?Zrw|XBLLND=sOs+@&-b97``I8a zpeYQRfBCr>piAo6AKPEI*y9+fS8r^0e0HvWA;9v_WAGO{t0z$?EokP2{4 zs+m6&Kg@!?q+A49#Z=huZ{xDG^Wvr4wt)vxn~7qE8D@&s;vJYkc0YS3fJTF1HVJ$q zqfyxNu-Db@yZGIWIm-WYp^>I4b+Fa|L}I0n@BXx9ps2&SMS!rgrku5L7AVIl+ykc9 zf~w1FjP{-WJ1mC+A)I!ep~tizXEJjN7!U?RxK)F1;}*yR@2)k_D_M*Ro1pd|(F1Qx z7Tx;MngJv>!z{ImE1ycC>iG4hAeIn6d>S^1EeQjUD^5C_oSKYHHIO`CafFhuZ95@B zm#MbHEhc`HZ{_qnWz@-gGqdfH>?hgT8>)iW#W+Iey3s>ONvD-qoWPHPcn4jy3h2Gq zVI}Yf%ocYd!`_CycHiuUp`E8socO$U35y#m<2S6nYPNNq!y;L1tIP_kru)n-==RD> zp!Mv(J6B@BE;CKEek~hw-K;;=z_ei`wB+fLrGn0)G+Ct1hDI0 zO3y!Q8Bbw~N1wwM)e3-B)9a#nLxW@n0Jo|hTc|Ff{#u>Rs;V>ee;z8VDBusIwTtxG zDLle_DIDYE*A~SP8%%jZofQPpR#H0ttrZOPy8lZEnQ(-G z`nQJQ3KIc{_JSfHc5VqyM2)g<4};-JZk$p6NJ@)VKgG_*3}S+<{ln>xNj?7yeFuaYx*BAVXb%X z=<4yXy!p>kQ1L7>?8*RQtGh9Pkz!8(1{@*COh&IgP3|#j?k!_WxocHL8w#kgp^|SRgOK`J!kO#ctDb@fWJ>k>wK}y+E6?3xY^9UhLp1EHqh$x zALT4Nm_JKn9T9c~e~z5D)k}adtjC}h{pRaXVqL+dv)032Ly^f^Z;LBmluEDN>96H5 zH@FzQuN>k3A@GQpxc-^{YNrB}(s?leDh<3#F-L+ee}Sm$*SKm*s0VH&SygZXXMRpQ zdQK_3rP#IOoEN@wTlm({^ehMW;6%tj@%5xiQXypW#j;@q6~rldAN?$#2elqtu3dD_qRih4^; z;lEju$~3X1{PGM?(v=KTR>t3#1kf`i9KhXb`#B^|_#|Z)#z0i`&$hOt6AsD9BT)(y z9+Ga`%YdCUcQ@Z$3IA7+xdy!O_+I(>EosWk!2rNYL7|1*Wq1Gm>*>oaIb`7F&U2=6 z;9OzFf+<^MtSaG>O_B~hpf?Hg3_!En2+<^R50Ndu|?nrbPXl82ph*MN5e)mA>e z2Xmzi6OETRD6e-PvN-#rx#4K3Wqz%iJ9t9B^eb7tPhI87F=V5IENCfK=(WPR_X|p^x8K6j?95EJLy4)SL?{f z8h%||S3ILN>wf`U5_mya*rXq`C(+ld=WnK!KOl&`jdw<&a@Vlw?g2fsk4kpfezQvT z?F5>#shcwe6!%-xC{88F{gU9d^Ug+bOgjTRX#PbAKq_%9wX6>7)%ujRI%+1-D6 z++VZEUv=((J>bVn0iXX_rNe`J=YLaLJIud+7UJ+J4Gj$vPAkqBXy%U$xgx&O|w z54A(pu3fu!eV^jhvZU*qbL?sN4mcYW;&chq4BKx~XK<)A2Tq|Nmx3wp!(1mNEb)yIhqB&(hKj-ZEctECKml~erODMFWbsnW)g`Qus6U|)IM89s7#NNS8&$D6pIVMBa9tugU z>y{SvI-tWc!>6{{d8EmkU*s{V{`3#;-%oUU3uA72}D zuy12M1$POC2@%<9YMofbDWt<|{8_4Gdd!D;tFrEMRS*TdF9=HKTYK4zxR8xOQ7p%Y zDoZJpiE~vTt{S;Ye7=F{q6Fwl49k1+jqCW1s-8gvcdH=13qj9DONtd)0l5)Mj`BbZ znEOu`TTtYNidy|ZJMEQTCT@Sq2GAEJkw^}_hpQp8_A5UW;rcLurjx&nATin3oSG{W zF}<)Qw1BEpafTi}A^x>74S_IuV_%=$Y~OuH3&~Gu?UYX+-CBLc)YoLJoIvR0?Q_IpQvk>VY#UiJr6kHU|bQRU^9<6l42j*gDfzAHyvO=XBh z=pY^0Q#dWz&qgk4nf0W55kZoCxk8jFT&gR_N-s<6q&wOvGaODRUwir1foEoV(xFkxq0y zs|gco*ma?M>}wuaNcDU+9Jxe#BS|L5v0R}|yQdg7YP9mI6HNzr{SOZxk$T*avqSPV z$rw_67Nd5k@G&)uRwRK6b2S!t%K@-=IW2$?i>6*dw}o`fSTi1}p2?XI++} zdB~=Au!IuOilA1x>Amu{A~f8E6QP|f7dP8z zW))ps6RBYw_o+=Is|Qig3r@H>)^gtr(*|KiiLurjQiy2}W!Nj==x3v@|Vh~3_) zN@a`?WeKiDaq6~Hlddlc%$9f>^>8Lh`QhJ;f>`Zl|nm*J8$j+ykQj}K^D-FZN!gT ztRS3sV4~E_lo^(<&}#jY271UIBG8m^dr3kuM~x z+0*mWn(D!i9^stK&GmU^KGlUl@gft7P8s*EO{@<=gaR01V=^ zTb1rh*;W6*0_pzSY>h43tK-C<)Y;8t*sajC!2cYRvC82;Ti=B zhxUP@C+%ALWt!~Y_o8~eci+-2#>QyggYxd=s9F$xIl%G&J zIp!`QSQy(cbgZFIGs+Uu$K>-al{26m%bx{Pc$fb;UlSy2;WFZ2Zv^#kcP=G1`#pE_f%OP?}Qg)ihE z^Gn31WEP)bQw2r<)kQ4_`Vn8{jdk^w_pW`n#)gZ`(a=cMfMQFG&$C4&pg75m5i6c# z%i-0RD5EW00-mqnkAq`|+wB0X%&^?>twcdY}bvzZK^F!v_d zw^5`oxQBXQNuWP4BST2?X}^QN9AB3?eq3+KxZwb;^vYnf%Hi@oNt&J{$dWBJF)~{j z;{t`w7^AaHIgpr}J+6b(+4tyX1sX~K3j<~KY>dWNitUafPC1)BoU{HdfU;oXjv2Fg zlTQ`A(%CSWj4c3^8m*+f>lCx|?N<>Ll+O+=71&Ygn{D!8sTTo6>i%2GqAdf;^>CXE zA~^5-GhP`O7W|WnmCx)?u9CxA=@LG#m4qk_1*}Fq`2v@|8+{2h3sa%OnbUcSD^2HG zy%*(DXNf1$1zG0Yz03Ck(qo~|a7BHewxd}olrS$myJ1O=Dl!?UoE1VwIT28F>j`Pm zxi~y>?35;9E|!X(N8w)qvsFRFwwfS*Q@BqAC9AS{!S=Vw!m6Ro&rJXPB&qm4+u5N? zh$dekQ%O6ojR~&^IxO?B=Cdp}^cgVU5vs_VDWTRnT15rcj}MQ~qNDeI(->&eX&)al zA4YIq^lWwU2X#8#+Flm~IxY3~GNOs{iJ%&;CX(kNZe@l#Oc>?QK)XM*G)P-O>6kKt zM=xx?_oR?xUYts%vtF1$lJvybn=*s9WhHSh($#aExDBLsUklc?@%rX5m5`b8wVzyi zj6AWY(O3^te$R?JO|%h`k$*UpHrcz{y>FtdM_#dx2wew9+wDK zyN39o8p(Q61m0X_1`yMZ4~I$}GqZ3`k=;SLxUOjP_QMxbQJ@0T_%m@d7hs>EE+ZU` zSubZ!Ximbd9TyBCrtPCfH$qB~xe&%{v*t_6r5&-=*=;C=46`fpjdS_-ao?17e@J<* z;QHF1sqhS)bVRo@mf2H9{eW{!XcD?VZP@wlD)E1qlgzZw3Gd5hl8f!Yv2Jlf|2+rv zL$Z~BU!-gN5TGeB;UWOggo(k_Fh`ehi;C+3)HAyO$8+R|EL%uD>esUIZR8ZpY)$72;FEj_(c$c6WE*`LId*Ef{V`N5D0OgP@%! zZ660JH{FZ4CAW`By1@M1bq_F!glnj8*(D~S`T zcxTb-&yv2!sW_ZoWUJvA6%#6?QJ4_>$3+La`&nrG}4 z1o~`_ToYbXEwnRLt*AR=^XP9$CNx_ZA6-lNNjZ;AypSn=dwmY>rU$DO$BWk9n5dg3 zbd`0!`qq06a`esE0;7kImq6lE{#zXN&#Dts+??ZkJ3{Cl7std4weDj%HOc-xZnU_O zW4&)Pm||a;8xf)h&D3NgQ{H!yy!483oW1Qf%~wdOe14@4(P~c}{cndpJMWnT+%$*y zY^9ni8%=$qud@y)hdI1`@WisCF_!cp9TQ?0#pBm7ZhwX2!WpmHL@RWBtlPGjQ;v$| zDRvoWWZ)`#T1e_JPkJ=BRoTh9rk+abY3QQA9q^|vOd+2I1Bd}iM__(|n!u1(yi!Y~yR8B7Dl5POX6nL6gFDeYjop+7?XPio12A``5aUN;0Nn^!>e z2!97(UEN_;avrz%rcnE?u8%^nhBMScLmz{Hbq*?-nQhQhbrFk+~3t> zrc?ZG5$Gcw-lHM~TcM|y%w3yWXX^oSSJ0RalrvBCVM*afXV(v73#PojeG>U4Z&Ek< z-6*;Qo=3wt({Wnk?h+v2u>~wR+CvD?{$j=bO~cRmf;wf)s()JhKkJFcR8{Xi~@fw{KlN?pEx&tKqodgz=z>NKN@aPQjA-*lJ5*k z0*h*k9&CN9R7C2;lB3fq)fVVNOJSL+G#b~-XkNAWw%=rR^JV~J;Vz&1J0{c=!TQQD(%RrV$W?H>=LyM6D|jD zGv|3^UIOtAA6AOh^T0Y@3n04*B=YzbbFl;-z+f0TCV<7y0|Y;PT~z6{O;ykNGdnw= zvWZ^a?l+L1+~Rq>$nIW4*^H9hogVqH-RO=HUhL%DJ>h|kk;&t~b@`;;MHdHpe!f@d zOuJ%I`*5YWT*w79SFqocF`(RlRoeH9yYul@&$G!uop2Ei(9}Cy4vIeiTvAf?v9Gpg zeFFE2`v-1Gi)OY-q*<<|yo}T{OM$X$%SPV8%TLcaO_;fK7xwT)q8I0w@Wdn;tUVP+ z(GR$UG#W}ZpK#5*D{CfjEh0U@{z;Nf?g~QcL31i{e*xc8Yv#-Y9WEo^Jk0`+#JN#Hzh}a?dhn*i(UVT}4iCa-< zXez5cO(QgGvz^$ZenDyTM$!@9joy1dRN?BK8t|w_)m1Ai_WzdZY?gd|%L`JdQr%R= z35Azc)g}@h{OqH@v6F)}B+qPUFLRJ`ivP;k9BV)Grb2g1O_;aMYao5b7|om-s$>gF zyQ5Tpf-c$h<{}Uju6bGz_~}Zx4WfAfHxNl0`(p(#C&X-bzQ*|JLSnZo+n`Ico(B^@^&XM#y#RE}yYrXMl7`VYu9jh_Gj literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/whatis-correct-thr.png b/developer/docs/help/images/lm/whatis-correct-thr.png new file mode 100644 index 0000000000000000000000000000000000000000..28bf1fa82c1044205b1f93914fc4b25d075095d0 GIT binary patch literal 29381 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/whatis-incompr.png b/developer/docs/help/images/lm/whatis-incompr.png new file mode 100644 index 0000000000000000000000000000000000000000..02d680a7c61acda62dad007fdca36951b26a3e93 GIT binary patch literal 31432 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

W zjc=*}Hyc*!SuJY0@#~9Nb5yn{d!9w=-_Uftt^1RrC&CD)o`U8#Rap1!o(2&r#9$1v zMKeZv*&=^uL|xZHg3|V+#pAa;ADRn> z7QHs6kW$^ZFb%MWx1W$7ZSpY4Bw)Wah`fK&m*xG~O#z;pF*uGX@y=q)H!+|IMe%U@ zrvi`N2L+ZBb7=!6>JB=;W-l#jW1JiQv{=^pqN4ZlPt1p`Y9fV$Ti4lBeYsw2QaOY< z94blhZ8u7AE_#16-l^=k?gX#;E??#&%c$jO;>SLM-xl(V`nJ34Rh8)GPJwQ#ZBV<= zECD=iB`hO0t_as}f4_8Lux0f9M)QEy9G`J}?f}u12lMXjiq}>az2?SxDz3eV_$qD5dsTC!R4{D0>uJjZUyjSi~CU2yw_BTTK7wuM@OL!SlDwl#i zUC$QJ&H_^1D==p<7y}ab-aqh>5M#{K;4*9~{Zd-oMX8{@s(NnQVYk}Q(6Ig$N`GUM zK3Dy)!}969JyD~nx}}^Ak0D!iLxQ8Gd)Nn#_yB#`?HCY6A$)3n{>2Ez<%gW-QDOzAz80z{~U^4|F5$_vi@sJvl|HA3Yx|= z`yQ!kVagsXD*8P9$rOC_REiz(g?^3Am6NmnNZAka<#r|((JU_3!Hb3+bEE3wE3+up zq-PKAZU;?PYpAi)1zsng+_N4XS=;|Q<*q}g4BIxWPQH(6RRANpP0r+tkL}~EHoX40 zu}Rq2sb2L=Ei)v>sEL!D`Ot1qJ};Yaa!<9_#);bNpJVMQcaiWa1(7feaM&%#v6_A3 z&-$rEySv-J<>#F%mD~Co;``dBsy0Xsn8?35uWxNI5`6`yC=OTqL_?ikv6(s1#=A@% zq5A2Q;>hO-*39RFl||I`#5l0!kuIB%R^LX>8_ogKp1(g0kJXe$NBbPVK2;hwTEd;C zJ{{FNwqWwj&0nFCS$)CAm?OKt9_wqHB1LU3v7J2?94%*H0VCprg<4Y`wt0=movgU+ zPyVc;sd5P(-}778J9Q3lpLcC}yu_KhMgJ>s+N$k^_+`-MYzHv3J_mH%_1f7d8Q%V_ zGpzUi-n>o6m`^naU7&w+TEu}2W3&HxI{w`b-5#5j#s>PeY9;Lr3s`^s19MT=ENWe8 zd0*zH3mB2qPKb<0aUZFVLP5&QwncBY**xX;j-#%;%K)m={rSsae`TnmoA{i3|KrQ9 zKA7KDanbqw)AI!HFFljXv*hv(PmXd&9`luMj6Pwq{JoP`wr10QI@SGVN<}uzSm$d| zSYAznrISdQ3cfiaCZWir-H$)NCaV3zSZ?vyAY0NUEJUQ9oacyDPC)3pw18K8>W@`h zQTe>5K}Sx<@5&$9d9f&J70E`Bx|XSkge`ySrtxj{YHu6@{gk?wTbD!FM?A@2E|gQF Q|4*NWimq~%qV4nl150l`O8@`> literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/lm/whatis-naiv.png b/developer/docs/help/images/lm/whatis-naiv.png new file mode 100644 index 0000000000000000000000000000000000000000..e8061682337bcce81821d32bbcb3c74915c16482 GIT binary patch literal 29594 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/simpleTouchKeyboard_1.png b/developer/docs/help/images/simpleTouchKeyboard_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5610d6541c44473b50eda96b514606b1d59b18 GIT binary patch literal 13399 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%0A{u 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

rxr?`xUXv_3d!O1lhq`!e-wSF7w-rnA% z4VTyLoc85r2wG7~3l7AY!EUr1OZ)DoycO+8D&&RElih5D`#<&(z8|R&mN=Y>R*ZA| zi_qPTyiUiJdiC?BV)xyXzNz0KA(8N}1y{DhS})Poy2p2?qK}*;zSor1emk~89>Wif zIMNTeelIn!8`&iNqFMpL@mjBF%4-4$oHKjRN?bokyzr$Ec(>A(d&BowMIw)_hPHO< zT8pRcf?9^}I*VbXvPD7nPj`LbmA9=HG?Bg}zzha~GqOAy45k0Lzt?jan}O>&>*Zwh z#161dI7-m*1;;Al6(8t#g45k_r3@Z3-#6uJDoI7g{IK=809IB`%xv;KHtFhj$7el- zE`k;m@5Rn4%u`%A70(Z04~2C0B1qPX7$WG93v6a|Mp-o05%{7Nio>Wy#=|qOcy~EW zO3A_kneRo~3%+w-FpPlsK#4T}_@Do=x8?LJ(e}O)mx`A#__;6#&7VGf`i6Z2Yh#Yd zMn#712Ne?6`h^Qu*V$>KB}0(<CM$seD>dNo>fwdY-1zTgK_@oX}91mUM@g&}UV)!?QX z`G(VmV|MFtB6^``p7r%V_Iqz1LYsBb8}AXAy6-T5b-c3sEm!v)tkm^cq{)jw3bd7Y z$M?zk!AZBFZ5siE@gk4qI-%L1T(bY41#|kMlK94*Ci2Ah3Vs^C1UG$k{+0I4R{K{! zBoD|2T2D3OnkTJiKjwK?KZP#CmRA`lgn~2a3Y23n)CCzwD_;MC)p${Cj3HOfr*sLhdK`{j*Dq!%9y-#n+l4m;x{qR~9}r?d&c)k8ia& z9hNt~+3b!=PfrU=sjhW?O7;Z3wIl(DDau47q|=b_Kj^a=UYV_U&x2PQ&NK|g#G$h* zC^;}tSfsy{g#|qt8d@*yiZAy`X~p;GKhwUhfYtd;CnXv-pjlB|SL>p6WF23=@7|ju z3601t1@!4{5fvQ{!D7>g-2~YP4lHZ@2+&p;hFmQhnHY>%gD6cUMlkL0odjQzo_38o zCcBr`Z%R|8!;MTK98Ukl0`Q|Vl9YHeL-eE*_@>E=hvDm28WBGX%Qat`etHs|iqxUc zeycyz`5#ywe+@LEu9lAF#2)GX5P@aE*nc@WaXGY}D|{&|{E@WAZ9VmR#beo?_Uw?t zBtFh3v9-rnA&1f8tChq%(N3)*U$b=hcQ>Oq0CLy_0mxsnpE z8qfk1Rg?&~-ZPAi;axUmTa9?(5DVv4Gm8C-*B+wVf}otk+=Db65YBA93E*4~bYK3x zf&I|Gc^qLS+wvrMTSQCB{>gLW`EonAK6QJUI3VV6V_&I#hd7;l;K1v~BjxioaV%AG zbgrMU*WsdX)>A)SIzKJmUzqFLnOdS}nS!$CBSYjk9ee6_TFbJS4H7RnP$X5^NBZB} z7i`UUXvbO*kp|T9l{Ug2%J2AlMm&@SGp>UCr#;^VJwPVyl+!uJk)$Af68K{-n24z5 zVW7ft^dojfKXD$m*-CGWv%Dp126{)2q$6wRt)x*@?JlM)%PDUJupx~lrJl?bfGO|W z`z>HOzqlB%++g3g)fdyp$rlxbNtJJ7ZH;U2JZ$i9B*7Q#p8M;=K0Xzg=K&4P)FBSm zNp8yFkN*}RtE_U~Rv^JZ{`&WQ*qV|3BUpkbCgirF=e5Mvbgk z4SkWga?~v3@$vk7`%)!W{k!%@qypvKO~ddyAc;5!tTA zmrh4Zc{-lK$ktQzcSdG?k?7(1_aUX{g_NM;h*yaB9i~OrR3dM08+on|)9>bX_k2FGOcDd;a=4j6zwR#9%u+&$qhL`6_Q~ zTM8lmfBDL1%hr>|aa*#f#nv;l&buV9QQ*j~4;rw@JJ%Z)+$k*hM}1!te4oi9ai)kA z6-Ai*wh5>v0hNpn=q$(g%s9w{!L%}9jdvi-o~)=Jfca$*n{a4%YmbmdB|=g--TU|9 zXH6KPjPcSo3Alt00=fK~Y;uZWG6p75t!=7Gt)@IlbXNd}N@+c3{&vy)z7gec8jgh^ zfj;B7nUSGNfo`sS-&g}LUQ5Qmco;qK*+vT&9*+G}GTFf(d(=51jDelSo`l4bptdpq zQs&JTNwWS24=|BNgw=K{0g&vnL#En;77U(Fgo%Q!g7Ior2ULr#-^%&2)Vez01+(64 zJd`NO^)rI(6bO3tyT9W6EpKt3Je}X%Ov=p-ZiXGUfGxiN-UXYD(_m^^3U)-C=`cV?=jaT3Sk~{83&n{aEj1*~x4U z)otf!Iq2}KVMi{Xi$Gp?a9Xtfj8;SLU&PRqGDJCK>)e7IH+;E{f2L>u+^^nT*efe6 zd;4`Oi8p1PeBy6F%$OgBe{_(<2M$mt%eU zB)h0BDwRc44k;b&A(s3=$ZDIZ&ZfLdB7!i@*@oEBLQkH^w)k7};Iw(VducB4Q7eA4 zPmMe`(@DId{Z3?LG=cX4&cD90jdGOHV=Fa6qO&1fd*%l?EavnB;Brs3s~1s^`kg5I zSl6j!I~L7pSufN`Uw1q^!pC0{&Gfo`MeQMsdhGR|y%!9Tzh5E5cXmq2DJn)CcRK0o zn%bB4RF8XXMg9oJ9}oonPK(oZeNC~){vCY}16|Sg4U0wu_Q27(GglQJoJN<#m%X>> z%F38n?QH<;4t0blVab8)-!ByNaVh`$Z^sSe!h6WiS`Ll7GpeddT)Pkrd4%DHUOV>` zWrrl{{ZK+nMS`!N-V%F!-WKI*I6{o&4|4iq1-?*07}9O)IR5%11LMQ~`TIr&!UQ2* zs}}8;*w_eQ(uD={hujuJ=G8!wx9Fa41Yc07+ODa@YR9HOY@Dn>w(=905DP7~llG$` z`Ls*}9B6K|g>l4e;CJI=L+jl{u_(StxhwK0j0>UA<-=uH6ZkZ(P1-m})7mn*MYMP4 z5mIe*plFWaHDo46mDH5zh<$fOtJ9`bkY1xXVoN~E`jV$aB~Ib0vFLv?*wsG86>5Ps zkRHVxiOu!>hXN+Hywf#}Z+$7UWsDJlPGez#2=)UOAx#H8;y(UYkT==800<)%&`~x< zfJpBXk?(VNfo?-P+!APSd*y@9#!;SLI)4BYo=jc$-S%!BNy96_=Ped7-(x`2gN+@e zlwB6)R@Ql5=xN%Oe!Luw zTW}Dk@|3(3a{$go9so_Ya!wt46qi}J*!0J3_zFNvvqFN@*wrZQy&awq+;QS9teV{N zB1#(4ZRf?)&s{Is#Np|=ul5WmSB2S2e#5Hq9KTSV_Oz*nG!e~0)&8d8%5G(JjfCH) zCfjPP!ML7xGLKguFS(QhFmlAMUKxvVA#YbUqoH$R$ZyX(ZeyE}fBif$CfB&U74fbN`KI24mRps}8QRDPs&ldCiGn*Tw^AS)j&7aL_Y zD$L*WSVrt(2`Qa~IMiv4seYQ)nTVqaB;b&l9K^*9r^BZaAx|SSAGu|3TeaiJ3H~5F zjBYv5)&u5bRp?9{6rlQl9zhz%E7c{)OGa;Ly4+Qwu63Sq>bF_+_=+L=f{fu zJOv`Nbz9~03&o#It&fbiSMhsb^Ezp7*`Uek{XDY9)*very)b?)(x%HFlAF=dd(JPe z!c64e!bGbQRG$4ONm(eaC*9e^jHWI>i5_nqmz|#RIk&4>!Jvg_NwyCb{Lddb+5P>D zS0lVm?Wx|z?697f?(NcjxTY05Z^)UJ)e`J+FFL!+b?D8JY(@TPLD7Fws9b%UtzcHjUZ}x8M)RauOag&{3iZN~Jl;b|cNf-RuOo<6jc8jeN)91haP zk1PuXgd)k)eE7wMK}C)oIrBeGT@Qk+dxWjwPV@2xXvSz+%$tEI5agz^E zA*qWH;(#_ri65~L`Pm1%j7VpFARLK?UIa}@z@qP% zyB?z7GgiuaHUqyE5_x1IfxLnFA$K$Hd~3c^%PFGJu$5se_8Y`h`ONCKK5SXqF%5R6 z*zRpF4G(};-f=VImujQfYYH%A;Rn4o5=Ij^>0Qc>P`CdCos@l_fM*f3IP<#xZKb?v zE|Iq^PO$8?lN-t8ie=dBNrK%qA*ec%DkJPXxt9CG1rrfo0#2TE#3JJRQY1JyP$U54 z2OD4V`~m_i+UKp|^X6;(zxn2y8BY((_Vu$=ydIWL2N=6C*iE` zY*6DAVw%3Fb0LNmtUzS^#Z53Wuu}wct8(E|wJx&c{DPW^!hEnm4<}?ZP!V#SwVGGx zoK%M{`h&I#=5MK>y@==~Sf>N?q6d=_HVizxU~V>MICXAPCpWj;yu$3`BvN)&%;HLi zFa|Et{c{=sHzc%BAQO|`F5u{^`L4J4RhK?u#HYzg^(dmbQvvs{_fZTJv%l?$$YU9J zk8T7sQ#Etj*a;@{CY2)d?{Wb7mH(BA!t%Q;v|uofs4vM_3lkFQK#UW39CWnMO1$i% zT*WO6{1l^Lb{qNHTmg|LuLm&P6|zvhhl52xras_@j}gZ~vcFx~+r+&H;hqB-jd?D# ziGB<#zxC>IJ`!hOy@59~!bHOcf*W?;*#xVXN^6#2LcdsQ0>@-w0a;V9sRKPp$c}-h zb_>_MRL)qMFKIWvccRY8oFTsJ?3~!tO9STu`zQGHWObqS_!U+TM6tgZ)}Q|cdCeeC z$HIiTv}<{^+(F#(duJ1(7vm}(87PG*lb?*6haId{cPey4RjimiySY2!Jf#tF&<%g2 za}yMXucZyy!b^}~BjBE+6Y9TrJFVCj(w_|UZcb-hI}lHw505-zk>+c--YbbSZd`7S`RV#|8oNo*#VL%x5Q!)Or4~~ve3$lUDC?rjD zMfeOUP4b-Fu;K^-J;1n~oRHboX{}XWcVZzhHGU;V{-b1MpQB$)y$iQm>zvQFf?bp_ z)ywZ`z4R#Y+tV!{r%A&2t?KcNgb&lcD^4&A)#wyV81u>s(T!^dMoj!q^@V{3o0?C~ z?dnscl4QZuT0qMU<+`n2+_bc`=FHsh{t0|w13f)v8OO~%S#9mK$V!tAO4r?ypgyoP ztRzVgrogfi7Zw&C93AcJ4nt4O&St+TEh$OJu)%WJ%dZ1d#iLEjpTTY(_wIb7o(!d-;nQqmRBtmf)pET z;E3up=khA@C%4N{#AUka68T;eZ9=3~)iDp^j>|f(CJyowxmnOazN$DCLpNOx0{LaR zWTV?G18ve1~RpobGqC#TGpC24rLqH;~eg=+J^z!ZRKN(R~vE~2Ijs5#c=nKhKBLB9X;fG5xHW5Z7Ze+~AOX^>| z|9ew~u7_es66>trxjx?I8B{sRFv++L?fgBjXT<(AA4g%aJm?8M2?j=gScQ3AY*V1mnBpKw@%#Hso{f|dGpiE@h>_}dW$khsbmoT zdO&oKmL*9!5g*a1^mDuFpzSL=tO_&f_vgkt$InEfZ$_(_QvX?^tj#~agOHiE*dw=q zgI>sN1es~F#Z7p~?Q?B>_2VdKbtPOCfH4GkJunYCE%L0|g`khjDkj!ezVeC5Y!zY` z-Uh#_tFIVx?7PRO_x_)z|# z*xHn5vkoF{TR?iO;;H0<$49rjJxOH}x;zdH=K9S3OG*(1TWsi=iBoM*U4G16EODs1 zb2~{%p=PfT0INT7D|0S`5R78XceaJ95>GfoF-~Lsy$oAK6kL)~=>L0ZyLoE3S195} zdg6*LtWR%(owndV#O;RJ~AE%%!74drtc?fkwb4FJ|ds^C~?+2Oq1d5W*f z(@nx6(N}gdzeW~wA0;~~=I>#O85b*q2!8G?>Ue^uDqD?fo2~H*1bt)ftgbZfnmwiL zOiR+%^JbWie#BHhy9;=R#$N;q{G1)8O1kmpqx#WRdnwtYW56=GugSUwZIsZBG2s-( zxLM%&^%?umt&mj>$;VG9M%aRhVVTwSoG{7mkC{T2c)4Aa*uc>&rZvl;QueONK&%~x zLfXX*(>r&j3L7blWKxg!?D`iSJpqzXg^4p|r@nl0=g~qdGjEpM`Kkmics*GSE;ALf zB4ZD92SYFPu^(^cWdNppNV&NZhy@kjkuQm}Le7szAW=UB?d7mH5EA+}9ti zW2!0m73Vi}C+^aD_K;WHrrnzkwmzjN<-;s#KoD=VA}dC-i$1~4C31)ESan$Q!7_}W zW?~?&`wD3u{H*%X%mE(9$Bq+vfz%@EwaA?=<`2(7k{n1~L`iM)8jvrEheHx6rAo~Q zhXo-+KN~#(AF((DW&eQxU~DRt;~S0u|HWI*i2dh6KogD$Rat~q+O?K=+W?$_4}Nr` zUyv*k;Sm{2OaRU!B&HCxen5?S?`fOKu{O_$=r<|ck=L0SPawwz3|QcFb_PdLeBeJ@ zM1_n__Lib^(rDSKSli{|cjTN%3K7M?h5b(m#B-yLoxg7!!GrzRh2}<%V^L?%r`TQW z|J7eiOC!=PH+n|YW*`6_x4hdIie@kRmJZYo%vO?uk-k*`jh%@dgtMRaI^W%~qp6ZD zBr|M9(?|n~MMKBq_i?flLb=tonARV#N*LGU(EGno(~ShB9r&i4tOw6c3YvKZ6Wwe9 zi%YBn-Ftmw<9?3CddvXLYQ8f-7}i43d0|QaO8An|vbupL+`z~k2|hw-FIL}K8Jh|j z9;UeMF{woOWE2c0n39%e+8;~GMS@Y2LNch!Hbrgi<0EP(K<*}DR4D_SpTTmJ(DLqX z8FNd^ZimJgF=$N#Mu#>5F>%57?_}Hkak9R?tqF|{4K)|ycTX+=aCm%g@37@|P0U!g zMNj$d91rq)&Nd9S$9pnEen(^ldZBlXm*g`Gbf$45Qi?{TEG#Nczpf`pVS}?{CtU+| z*I$UyLnZ1Old(nGD0Q1O6DZNuj^S{5sMaKX2hEZ5{0i}CMr0#BdmCYl#9R6dnJJ_( z>C~)CnPlptc7&QUxhuZ{>E1<5m|~jlIil?pEILR<%)QF)L3Dl359PDQ`C^gR6I--o zLm{F+w4@V)W;{0+yPNNQbl)F4Qd$S8tWZi-PSS?gzwd$h>DefVFULO;VJ5>B9cZM$ z??C`StQ^FY zI=BGS)aEF|CgR%-BJ@}!IE!61@-r@Sivo6tz$nnW}yi`a$|HB^ERO&ygvG71nxBX#hA-#5#|VI~k~>4vCm?;*lZp}nBW z&Llns?~{=RSy9pptZd{Tw#}FpdC!N9jQ#m*&m3S~ew7SVg1zw@bpTJE>mr>C4Wv+hVJu;t2 zQey7`{)45hw0oG_N{P+EWC^Nl!rPwv_2ujz+mEG?pdXZhSm~e=p&-j-gg$yg2;U-Z z@vO9MiP@e3s;w(O3)#<07R?Z;xwPPJ9s(k*nkPG_8`s=#WOpr|rY6Sx2R({3`KxdU zqS*Doa!3h>)q@F5cFVC{$EPQ!XLNW*qPi@hXg|?-kbNHT{nTP}5xSI_KgR*9?L?Y4 zksBs`@i)F2f!Zf@?y7OB4&$c#N~Kw%Mza&sJ^%OgXg2Kmc1)sGLD6NO{CKX^Ve*=? zhAOXZlQGL@=`Zd^po~5WPKff|IC#%sc(3>@U_Thjb? zuOFsQvwS(la#dYaZQe^cL1q z(6@5)U{fM6Orsz?F*&e*4og$#CrCFPmDs#+s1SycN$u_L2k#6fwqbqy_H? zAPAf-1e}gcxQDvBs+dA&n|@7uijAf>@h?#*X%q){zW060=Qp)#$_-k6PG_ASWlvzz zil^LH^%wc@_DIWTvn&h`2|x4?tF3;RoIej(Xv{m3eYz)R!u6k2X8RWeF z)yuk%`1bnZ^j*y}f>>i7=F9V?EVyWc7Qn@cX0mTfO0}rcrGsSP0lUBXX89leBJ`7jcDbv3tup7|fe372BdU$y) znRe|`KrmE&8be`sd+AgBawNRs{u6lnlhxo%Ra&%Vv$mnkApFqF!14ty{>6v<<_xJ& z?0$Tn+q14QA9Q)>wUJ{IIZpmE0?-??_1buHzg@k2NgIEUvQ#!&a{1|c`tjjxXbzcT zEOBggy^Ql?Y(B!>;S03mF=^lEfrRMM4+ZL;!7=1s(Y(0aJ@ygq`zy>p3Z6*bjNDtd zFDON(BPcCZ9s?*&hv4`iGeAv9{ zFcbmee=m9Kw2Ig2X@sO7J-5NUCsoXO8+gL7$ z;TagQ@yb;#L(rVzP9LoBl8MlBppM#+X0lmEd$)dj| z!Kb`$sC`?XCYc_NoLen{@ntB_agGwr#N#hJLZAICL>qQzdtPVW$Wi44U7| z-Fjkgt+P@ND36cyGNm!Lx#CBItVX+ASp%Ynw;Xz0b6TTjJ37!j-;xDgxmI?M>ydYW zX{>%cr4v&|+Ye)H09gAX4(4eQ@K0`qZHGg=&M8IL?%Ht_Thh^o^$miPvN+G;Z!(>> zc{xGH8CK`x>&8KHX1VC##!p z=N~FJGbub`84AG{B|u#haBut10L8TruG}x#f_j-Rv5o%XsN9>6KncPnYSSJ1roAQe zmEWbTXO{s_n5B}ejQG#aQ4te<7+aBmvuF#xtGuVo`*L+MzO8l>y3lL4frNc z>+f|hW?PPQUvSmfCCHO$?-sxH;dvmQeAxY~^>&aV7Q!~L)FHne)o9XvkTricW`vq< zX1=E-jWeS6apTj+XPU9pS>@Ayv-y)=SdyGi`+xobiCE*9WR zD2T5tamTs#U?$YvgKc^@=AyeCD|FGd4r)DMS*Zqp8#kjYo~9A;!DAqv?R2Wb7|1NE z(zS6meQ+3wB4qZ^q}!@;y=&~{9XH_@bbreLtXSPp zQOW>(*3ZotzjfEUJwKEeYY5X(94ED{M(KdZsMh7i4)&^cus?2;sx}Mh?mk>j=KR?% zbymP9AqpFOhoYf8zkSKcn}-^y;Oj;WFVl^il@8@T)ZVNTrl@z`SGwG)o7nHhC6mAy zfPTzdT0m3wL5NLF9TbIE;?+c=OIQ1eW22~LhE5@_yE*L!rfWC+&A+y!36NlOc{7Jh z57??p!lR1$W~Km|`l6oBErHqa3Nu6H8p6WSRnZ9D8cxmGTJ@Cd6=hx63mA4Lp!z2B zzA?t6)LP*Qmo+1P0Ca_v%;o$>fWy>1Og8>8*t?DkGsjUuGu2eh7J&67C#;lnq+e6p zV=5ByiyT=lh^X$n^WYF=$T>cvsf-6x()PjR#B^8;rgk00LWEysK&0TyZ&GcC%C4X( z0TNMgVggz0kAivd_NIttT54{SdI;H-2N=7jAv?BO^MpMqdIJCO^ z_011*m=80C`ngg(n%qGG9|l!&5bh^jz~%=T*^t~bCAmHZI{lB4ATveKN&?C2Fr*%b z3i;J2?CPC1?DPAG<*MTcJU*SqXgJgMmY!)1Zi^L&$|pXGWRhxWtCO+0kUL>ug$$mKDHcqEr?2NSsDX_o=YyxGqds_oTz$-V)Tqu#WTSs~p? z_|mS}a7O_UzNpUHQ-UAm4XJbMcT6HbL~wq0!e<=lOk%;pU3wsw84dJkB{bE+!y%Op5N}x=1wg&M0s`44-@x6W4uoKmQ+DQ7}L%vCbwl%}r z-&{G=e^YC?NtCeA6|_}^;1T!$m}6zul!YQ#hAw<8B zA}bhWy^gE+$Z#e|;`ux#rx1~;c^DA#mY5a{mRj1=`1tdJjqq8g6=`{iC|x&e1yG=J zU^d4bxO*jF@SQEZe~+!bVqd%JLfhUeteJ(pSqLs}B1Sg!rCp2!mwA%p!(TXP9y+;K z8`3G&wCq1*6G5iO4kw)xXI!r%P-M*jG7uHoso^EP`9(hwH1C-DJj4Ol-{8BsH+;H! zbTDzg@_8ERu|15K#O3^18YUrlxKT^pGLH{S-^LKb<>)+i^qTG-*~}MWsu-=vwf$WI z^hfCn-W%7GjB)+3-?p890Dvlr4WPT|;|1qdGXCpph>g7rsqIJU;rWb6xuFzwl7L07 zFNYcGo=kAKLAa4GsI_24M#G%W#fue`M|8B3 z9A7fE&GhDT+?OwiuZOUrUd2&L%NA`+)hdE)>TnBN8aG!{TM~85MLqbW+)}h5$^(VN| zIUGOgYzBr>v!-A${1kQ-iW7>~OsOwR%d-oWztQ`oq>Q1+MSN+Jk30Z^XkaAKh2+L7 zDRei*oE79*6fZszN<7>Eu+j^-{fz~Z3hKBZx|mVhi8voI54&b{>o4ehb9BOp{CKuB zcoNCJh4B@cNkPD5cs1d)P%Q$IR}dNegrxMyky|cqx4+r6@*z@2B;6X}pxxEq8-i*t zFz41YrsrqaDb=OSlR)uhzl%SRbIndx@f~Z1{$c|HS0)+AIUTon9!+#5XUV~})26Y@ z(pFKqR$V{Kuv9*wp76eC=`&0?oqa`@^n>`9?3q|U!{;$+xf%P%p`05Ny?HcoYEJONcg8Km;K|j$kYim3r5Ex(z z#pEjNkL7~ng0CLGwmsrtQ8M?sti+l;pW{9r|DN9rcdcE?B0}?+3$SOe|7A+-gK3hY zm*z9o1$BHkB=>k9g>sf$8*I9E&28-GN}5Imktg?zZR(n~)V23mU?ikAfj!}3_eardt@Jr{R$?-t@0Tu+ziz9JK_IUqeed83yg(rT#p{Bh5p_QJV zFAs4;S1BvEEJeVIAUr0L=t#&x(XEu#B^M3QXCDa%0zL5cOLYBw^A6sYiYf2q$gc-) zdE<+67|rB?_T0TFG-}5C)Tjag0Ux0Ccg-m04}ChO#?h#XlHOE>i|?JE&9JvWtv>;N z8z)6_-RPZ#E0jhsxU(r3JEK3}{vJ4gl>Ag~m zUd!m;Bas=ud1rMxK;=jg^4DK9M<>T`x2pCh8Wr;)${aT}mrUkhGFq^Vk#~^(LU+Vw zQO;V_Lj`4A?9jE>&%3?z{y7!`!8`A-Lui?c!E-j$k$!KRc{PIV7x!exC8&D#45OAQ zEptkVDF-BT0&oKEw)wIIStt(N&rs0*YY5=gtx;rlKYF@(Y+?jO5APdteFGDi9`21b zX$=clX?TS`(2vSo*CjQV>UA|hym{jqL9J5$yPr|_d@K2OUbdt6I%d818Xuf6B2Hax z#&vvP0`5ag8}EM7F$o;5_zu)re?nOirNaYxKVORxnmK$Yo|k+gsThF|t}in(tL(8C zTn}cf0LCa4Nt`R_Bdhl|Gx4`RnjG3YqSP*;|oH z1P0p(C+{mF<1|rOL+PY}aMA?4!jL}0kd@P$+;0`?LlY6QRGHDAGJc*j zeQpV+#CDHHKCHqO*N!%CB#JND@owxWG&>BBkFTLi*C=G^5p1`P>?9fMyzV(D?nHu8 z|7o!4mgDidfh%_0^mptTQ)uI>G>gNkZws*p9u1tc^u-d|f#v;9a-(8_+x;2@+BNs8 zam6JIC@pQQ15n?QrUD58tZgWfbU+os0J(vwHG6N+Pmj=s&>FM-JF*bB=UMvWKFJPd zx!OgRBQN@t)JA?&mod@7#r5DJOKlTYTh||;9g3e&erjPB0`5HE$sTh={A?{ID-BfM z%Z*kBs#D-`jb&GI9Jn~PBd_@Go$e9L-!|se9mzc;JC-u&s8vO5@0EnOGhm&v+{}WF zEAw#Cs`eE>zwsRR4;Xkw0KMN{ESkRsf!kU4HJHxuR8(kb6f$^+woX+k^`RSMq}4^@ zvoWB`=o)@qa&1C{kLcs}Sp?aaF!`$K_tjrR6z+VFBw|NVZi63yN42w1I$=?DpOgr#&upPNQ55?=8*{O zX=I7|iP2I%2|F~M5v^P}^K^$Bh7asv2GI!N*6wji&GxIEM;N@snn*OGYsoTnRZJoz zE~fiT7pA)#1B_d3aXCKM0%}k6f7@zV zwbGBY!`EJj^7&3BiSov z_q2Un4}UNj>Jmh1XCR&K!buEY#1@Y=i1q}(Y&|SIuSBEoNd_xo^KCKZIF{oxD}4ql z%*gXEkP4v|Y`MJ~rzIT3@^quE+G_6DZczT>`YWE5Xyfr)lv13I+U{%i-lri)|2SK# z)d+dc<6cHde;geZEXD6OaqR35zOlPG@mFBY)@v>ftDMGWot2Ol9sUiewlcm>z^}9Y zgTFnW|9M0P{Ut9?zqEwB<%k~j`JJX_=)VOEA|pv6@lA1TV3d1h^njjR$B2@-N|ShD z*WFHVHT7$`49&Gor$}!WR@TJ-R)p{P7tr6IO>7%80uv$>FM7Rm06U5`0r*Xvfn}2RoLMlk2J)X15mhTAX^#rFk0(abq^r@ttP}0jG!h ze5qi^Z%DIHzz8K3V^L1x8aY>9^A`fec`7MNWj%ZaQ#+6F8KOeJb;A6*3@uz-Xe>y- z=ws00r%9!GzPvAIh;yfGL}{JFSn)D8xxl*?I}(rCcfDak6W+Ag{PhY8JmX!FkTbmu zbBZd1SfXmK<3MjAR`^wl*$XHktd}aXI9LNOQGy)~RHs@Nkn%`8ebtkwu%fMa>-DogfbJy$tpoPx)aDf|m^egPM;y`5xuFA`0#XIdeWz1D$0 zXwO^*PeDx*oz4lK+|x@^E%```X-pEDW%&G8;ytx^8E(ByQS8j6cLbdem@H{!*U81v zdrLYGoxi4%3vK3I%GR&= z=O_h-lcwc?(8{%N$LBWEhm2ROCesG}bGp!}Q^~#pTXd(~d$-16$s~TA@3U;)WlYM^6wyqO5wL861 zf#uP=G*opuY$jCILKIiCfa!lSM`$)&Q^3Sz8zP*LjRHrxCmrw9Iky&>&t964X%aN_ zeg~&&d8AmhiA*$}sGzEgLHQ}nCzVXSiGx_Nom1MP()TZ-8R8SgH7L7~?%_%CJc3!m9Ayf1sT7?T1C8LlE^od;@aY-uvGz`-Nq81!X4Ti|cyV8l>{QeBeHVS9 zrHM7e;8ChyToxyzURREd8_zlBblDcxuQ7A0Nl-lfBL>#TWj|zMiUY|Q{7os2BKh|~ ztHbM{o(!<&Fj#OY)09Ipd{%UqfGV_2sfgK2I*^-6|;AR?`L|# zlSg@f558i5=HiF<2d z9qV3L4ml)rgyv0+YDC{>H$n3#GCI~F;LRXEtN2?s5LTa%0>Z~*6AfGU-KmU(iJ5A;E!@0vRY18amXA-R;;O<`8r1I z;-I)HQD|%>F0+NQcAySlOUGv}W-g=1%yJ@~xpYRzGgKYYf5FRlFgG z5J@o>D^JE`Z2RG-T>+b>-B8e8GpvUyE~b>@$Q+^gg~vs52rPf1B6^sRj4|(=JX~_& zC9|)_p>5SnxA@au`>1$dGvaj$%tPGWEtLB5G1IwEEgo;%6TEzMQa z#ogpO;gz;DXUzY|=*Yc%`8PorW;g%;iQ-)TSoYu0&2u<@V>K9m+Qr2sAu}^344s%( zRMcQc2WFwdUmxKJs3Y1Q?BCYC_oWYKyCpjmQ0obWDc;|gUP+Ci++GJ@=dVGKibndH zbxfkZj-e_%@5O`tmW5JID-@4ULYN|B`}yO=<4PHRfflRbBiffkk|M2d&413PyAOaz zI-CIDc>A6`?2ZUE-Bf#$D0Cv@@I%M!K=nDXvhRn4z8bc2+#1|2OKdC8EqCdpX1#fZ zFZ~fFl%4(fQcA?`b@he3KCVvBS6F=QzXc!9WywWg-7k?njge+=tY@wt#U%)lKw(N= z;#DYB_1xor7-#i14Cb!MhsySrq(=-ciAPvc^ z%mHIR_T6aEj?ukE7YoG_fNEg6@K^8;k)ap^KkDk%CHTsrw%UBw+{BJ_GGd zQj3#?3u!~g1#v6To6r(A71BZ4Gn*#o+^z=(PQt5LxEuOU5@3|-g_!7!chkAnI5~JT zvGF4@Ez$p|`1Zi4Z$~5aju$@BpaD!=YBAP^U3+PY#z3z->5y``uo7C}zRmT#^5OPp zt(6(cH1DZVl&8cMaZuIXh`KI5C%}q{n2+(8kU`ackO)}p&ijkgX*YSbT?eb#J z&tJ^nZ9O-;y)32ujS69XBB+C5c&Tz_r}BJk7ZMywwe#r5+v%x-BzVis zp_Z{e`8|Pxn*xjC=38q+E)lZ*P0N`bzj&j!pHSVYe4*oOD}j|)C1#)Jf@yDr?|;pD z7+&;K#6oKe?#Vqq?-CX`FVXe}oWlZ`IwmwD7{__e{0n;%(9tjzD#SfBHWsH!UcJ?> zb7ogSgj-FM?m0c$w7Wa(EiG3CDExFtGv6>v$KB_WKSac(q9c7UJs1u z;HEa40jvlJqIx%OBdgyG!Aw;qvgB{4Bv7s+%B!d(%Dz*cJ>zE|hBF6buKfPMHVf_V zex2pXT6&q+oL+HiI56AMgi>q!acj|!nMA^w)>c_WX4zn(_hviZ;uC;fGWZh>L;CKU z2V9K?Oh-1O2tgenqUHePy8yQ6%)sLo)n-NMcz`5H&f^d#(5t}=a#j5NScQ6;UvOWbNph6VcG(8 zpR*#oo|IzAiGp#AfG!fE;m}y6P{^Tr-7=m<#H6}Cr_}y9eV$GdX(3)@eJ^ha`|F_jsXe6DHhr@Nr#(~8W;v0 zKa0?^PM2W7B^9COqQ$}`{v6?YpuK(RXAj{b#X+IdZz=9+^2CJp#mSE>pz1C>vVXqy zW_>mGJPD(OV5UMRco~*Sk>e<=K%)LM;G3SW5NcwRZpXW&c)1>AhXKekuO5A zsQN+c+GD+C%=k`f3WPV6{!}Iuz_=6|++S5h`75}umQxPTA2#p2%+B>wp>Y+&qt$!c*dFsL_H#nABB=CY2} z%2fXb602sOO~aLcuzY=cTVQ{CdCs&V8bH#Y!;jBRn6tT25$Cnsg!3DU71#_x_YeuE zu^S@vdK_Znb9h2=xv|P6t>!|UDadOA7<}b`ZR>Ebf=hy(!ExPSxPT9l0&#h7UMDwz zL;z{K`!KguB04n!J`tA`!{``v)PNyv+7EaH8sIUN3Rwo{{@X%Ah|h}V)ZQ1KJO@l{R)>u>`KS@hL6ify}M zTRZ-8PWRXSp8v0}*4?^T>v<-|7<0^3-G(Cl$(7x&p*%WM_1%q5=h4z>`1^TJZ&+Nh z`m!IMNcAndY}uY2QJW=HgZdo71+{3cOcPXtY3`EiQu-^zPI{Vy?nu~NACV%Hy1Zc? zfw3D^Q^x+luq!g)V=p9$3k~Z|n4L6bRw0ka&35-3y8oB!Qs=Y;BQpA`1poI^kV; zFlb4tdYku|U>4cwQr?m>Sk|aNPP zp#VyU(Wa{&ShiE$ed1veBcT{>(cwRbEf_j%%CPy04;o^JgeA#P!$e5pB>wyHB(`&T zDK8}j%bt<-{{AJcYkS0oJqK!%5`b<+fRc9T_-;CvN@!nLPL+evo`J)(=E$|tl5TZG zPrp}V310UA=t4>Y%^ly}CwI%pcOB0v^7Cyu!HqH10?!39Rjn5!2Qf=P4K<<7K_OTj zh6)m{4T5=g)_8pdadTe;P$uH9;_;o#@??i=F3bKhFU$4LFkjJ175DHL(Kq&pKw&)E zQXWBqr5wDdp1*m6C*rdOrDP?*v~I9X6|XsLM8Yq{GKlX0j!-Si?0qNTv}F--aZ*>P z%OC|5leHFqHS`?iFG8g0^eq|V5u)uSoxw&9{YiS~K*bF2m94+Ri5AYE zha)AE%P_I8HzFXk!6W`a{*U{(3`5ri>SP+GyiqJHAQxyWg6mw>8CuSmAt>@Y`R3W| zncfz?yFMbY@thUbvt7rGu8HE|fNgfxc!29>Z-zAmqu%|+?xFECEZvhIOJ162Q%QPe z6XLAO)vy+6tg5sju+9ir1(v}qMVek*6q3ydySVs**evS2xvXFmiJP1Aqj%8Ead9HW zVRxbayA{iv=B8AAX;>RX`?0)Ee_D#(v1_1pzk}~WTzFO`P5>51+9UqKK|~cMlXG{ z&Nvs)_=;Xz*fJwZK1Tkc*T(9%+sCKl2A1=IsgON~{-EjM1O=(cu#(H}k&na1ijJEY zjjAhw%box1;+d`KUZZ9yOvWgEFS}iCBqE+#XYd}7D`;829x0b&K>r*tJAG-#SBo#S*UIh}pZqzmi9&o3NMBEDq!J+w#u(3kQ#0iL@OzCo?dbz+Uq*P5%kVp-PBZ*01jky1al zVf*Mdx0^NT?&zOLZj1opFp;35UCUGBKj$dtsXrtPNSL>+&}m2o)A%jqJa#g0tjh^= z79j`8kAf?FLqpSk{ANd0Pf7dYID{1juwgwK#>bM5jSZMV4qBYTYg!2z+Z3C?Bq+pl zUhXjZX7AS$GqEo*J4dNwy85> zeL8Ac-5ghOHIxr${F-z>pPo*|SW?tkopJLgjO<(4wYso~2a%=ZHu#0=3Wh0u-e72X zRXk-Pe4)U^P$_XbmvQwsGKouE0oEhS--c;7PEhA%^>!sz&<6dOSu@p=vkCLYQH+xi z%?L5gU0yUXkE^?46IHZ?K6&3u96u5w)QL2;UVUKa{q0Kf9HPbL9yg~ z2(^lmh%P;7V8jI@QPJ&pXu8>DDm+*S@%wQ@?Egwu|LY3eL=C>Ub;%Tqb8lQ-Uk9`> z2fZI5bu?e7x}9loCvJidr&^58hI;H`NJN-8cfN4ek`kpil&aspJf_qco?g|vbv!6% zzm9mybnYGcw49jQ!ETK{i+A-!3B1Eyeu|a8NngC;e0aF;y%R9j8NaaUa8SliwTkfs z<>!aA+1fkW4>vlFB<;m73`#gqWJF`}hGPL=N@}xk*STY^aLG{>*s%_B*1B>YH4yDXN71pM~ zMlz`vnC-*Ig(6LhFD=4uU^%zISD*jhx01>{idfa;N3d*yu=3`BR zqwuaizGfq<1%IfxSfsDiZ;8kUrfcp-TFk>L7JEE1OW{?WE8l}xqMlSjvZ>!6O;@(2 zA;fXHwM+uVp)S7z^w9+1eZk;o%6qpmaHLl{)@2`ml`sIizcGe)U{+Q9?A%eU%bnd> z*mp!G3$%bUnau~Hs-){>V?z-R-9~#jbMA!-_oB?|$%F=&zf3!W=C&?7v&$#brwU{E z$4;W^Ltl?P33+Z&{9em_JxJ|1V_=@&S0svq|4;Suc_8BL>DV)(8m*VEdY~`I?hxel z__QjEvBh_+qjUU;LcRdbq&aHyH^o5iU)npfqr*|%Tz>h^H~k~7k7TR*?JV8Sgh?du zQTM|b=1=Uru(=7L|C)|)_r^f{KgJ=dh%~hIjWI;yLmbsN-tE(&zp*Hr-`~-Zfv4X#f04DxP zFv>Xz4@D#==?}TcQ?Te$_`acYBRI)l!ays^vk`sAxm6??Zr1cC!~b+JhWmR)WZ@=i zL7+GzT?+OoC!z}_ zP69qGu0b^)kjX}$S)c;>L;n5%%1I*x+qWLwe=-VR`rOL;p44y( zF|pn{H}hNRSYvbqxR}9KbD`fIb5-UQ8hd1xGEA4{6)H}ak`24py)h!?;Fx|mIpjOcMAM2aR8?kPo`M<_gOUf zK|YJ;dKAaEh4`&boTrvOuXMYk3PQ1U;RZ2`qo;WZTxi=zP#s59tJ`lQZt7(TJKkbp z2a;m{BDpGenC;GuR*Hc(FAg&UK_rw2d;j8o9`F#L8}tQXe?$jC7Nuv&AU`y*tM?SB zkoM$lh+kh^d`BR!cOi{_ds)%vh-bvEYR;Neh33!hJCQ0Wqc%`={5F=t2LJ6&|L)Yf zW$y$>200}w*-k3uEtE%Jb7JhmDyb9u>mdJ1gSC?AYM+7Qd=t=qc5hRag?-j{hsq-9HZA@j~uXJ3y;RP5+f=kx# zf}%(%SU#brp*d4RAAC7Fw{OIyyDjg@(h^5H6F2Ti3hPI``D}Sg7Dw!nyDuD3LmyXC zQeq3+s~`67It4`}4zP?_+zBlgxa@p)!Y2p(!+W0QOdMt+UBd8VMEP(iswAQwrIIDBzflJh1#DTO4oq&pVlCVIPVf5<{15uvthx$@4} z@$l+o^$T@+2>0r&9{DJ2cRT@VC)(WS$?tQqH|X*FOFuZ8xXhocvlJM{b;|C?E*{BY zjc_S&N5zAI7TR{k?#DcK8tpu-)e?P{G;lUnZxD^{br*0~&$!ni$t=RLS91ektXbhm z_?Za#HRI-5Ty*~2f4e9Vm;Kd{n#Zc`D3dcS$n)@KjB6Vb9L-u&oSob;LFYjkxwXL@ z7(oG@&!p-v_ma_@x?LREOFC%Evv2>JTzva#=`Le1x#u$3t{~hrec8hg=O)f5rb#s*nVahA8A$Twx1WJF)bX<0F%WH4p>ac-<^aMXD8l_Lj=kNfF{NXW@iP*8{!**kTxTSSlXgfx6u z5-5ZIDnApxX#H}e{tANtPeEixlA_Na9OUmd{)?F-jV=UX>|X zjCCNlyZFJ;Wy0Ha+gEUCZJ~x*K16=$YF?RA_#sqzO7W>lxN-)vaBoryLlm*GEYTw~ z+a{Sf;thgP6HvZyJ84}rGMPA`6s&1s%sXBcN7^QkWjA7NKD;gYL(G1o_*FSL0eahm zM)#CXI-HKBVs}Cua^(=hCn`oHA}``b5J*5e2>(h%Q(01a8uHb7u1scYRP#dUyqlj3 zmSnDWta00Z_{#GUVqv4_#KR`N1&Sz%@p3*b*(KA+ulYkjew{#EO3dJZ=^BTk;$Rd) zEa4y8jCSo&goRYq_mmz+nDq&PFiSCRH3&OQ+Sd_M#3am7EulXKMegU!ZYWvFlOz*% zB;1;2=c`fOX|AF|N&Real@lPQ{}#0uWU3J#PFrebVin`nVWd<7%7t}YOF=vQ7J)q}nw4n$#`L(il)U4^?VNMEDia1`j=ABiA=kebnub0+W7&_Wly0R_DR zB=Gv>aO&-0Zn^Rwj^@t$9n2;J-{4-ZiHS-;iwtbxH72u4B&nH6R5nZrLCE^AiCN3R z+0VW~QG>-S9C9&>?Qp{pL-c#6!rk1NTsVdz-@x0&bDseNj6hLp~#FIWX;_|ObGr`9v?c-Jl=gmR~N+l6(Z7tJ}>1BLc_<^M208fPl*Uc3=AnL zapZ4>Tn=$yCnlhR;akXGg&p7^N+nxYo1t^RvnG$ApL<|f$Y3}OC``nu#bEQdV+ z2M#y_kLsM%7s*2x0dqZ50Oh|J;Nemw?6q_ngh~A1b(L4BUaG zn@0!5UjpUelEaa}hv`H{gE5Ekx2Q~!ItdbTgDLLg8UHS(|0^;*y;3Doq4VR11=2lX z?l}E;(o04PQYwuh-e+~x@Nit6NVNARaBhLt6-sr{kl^R|4`|}^b+0Lkr@th+Pjc2h zw|y|l{db5+N1DGSO}{NWKg}Uc?t$QT<;sJ7EqCJ?!(Fug-P-*ZD*0jRgHH3>s}u%{ zNHnd^Fym`|jneiAN5V`Kd-Q{zbh|(vt{_Ufi)vQu-#F%fbpmtn-u6J*CqQjy9SHF@ z1@QM(pf9+!J~^DAoXVnZ)*3MKuA^~OS)OlTiHMPf_@1H*Y(`hsYzaK$=5b4b$9rw; zUl-Ih<&t)1H>_)ax=b5Ou`EVxD}(!-|Bcv@bMPX~%{lmw_T%%5-2irKAB?OjC@709 zsFK(pruhtdj82M*{)ptv-RkQweUlddW{USQISXOSdgqtM)_!DPS=d>b#jqx^cxX6H ziffuzSDP_-!QX}pJK}jO$)1EX?I^`O^>WOq(_aLwmN55eA;}g0mex}1);znSA)X<6 zbgJSDZ?{J2vZ9+LJGt2GQ9K@MpB6rrA#TsV5 zAH`eWQkInb{!v8k=VzlU#BrX##$jWvx^SP^oIX&@_(L87JND1t`Yv3-_Ob##yVU475}VZVKy&A7PpA}4O03!#%vZ0XES?kF8t&ZE>8SR2 zbUdmQxZQ3C)KnUBK00sL2|hvj-S)a=Z!AiDNIdu>0T;BlOcrka_d8i?GEYt#TeoQ! z_ldHbSlqhq=^`+<`gd~gcnE#G7@sx*cTP%yoECY8OIF#sE@)U$ytm1q&Ao}Qx5EVb zj3>>nN$&i}=RAA1IpPi7pbn0Yeqkhm0mdzwd~>Qt)<3)dC?ndxpZVFLv^{BTk-Y7l zC&VCKa+YzjMAMW~kD2uuyVtTdXM}vb|9&2gm4o}gxcYxX6?+2xjGmYgRb6Q*7di4* z1l04-E)I7r{u~FtTFe|{I6O<|+A%VA>-1)P zQ}$$jp>GOL>^$Mdocpu5c9v7Zvy?FF+1?Illdvl+e?PyjJL2#2Q=eC0mvLr?Bw-&Zd+mT3=BF+U9-lZi1@f`CwbQtX#%?ugM>}pCX z>pv#dc>G`jAT3u**Bg_z_^&6K@5OM$K>ba#i8*gDx>_%ygY0TP4N;@SIQ^(a7R44%_2}vi*E7#=9S^Gq^0keIGN2_zON9Qa zFtSo}%9x~YEOxU#44LUtVnK+2;-rAQM&6H68bftF4f<90`9-O$)O9~$W9zG7-vKw7 z4L)$HYy}m8L4_rK`Q}#d%?|&GDzQw=16pJBq9V$gI|3>*J$|4?W^wCL>UEQsD+eDx zcQ0BJRl3-kFLnEkiikYR&yvUB+y`5;w`8aA)d7!oGxkzLEqHNsR;si4*+1Da_~7DV zmeWy~NVMnZt0IHW67AsLSyB6A2ERwFnI@#BI!Eg-Y-$jW^^+vlHK~t?53`FJlJ*1q z+5R6)pZj3;&d;!JLoD#z$1~FIjO*vK-2j&Fkx}h zWS;8K2IUE}b}99;tfnJOqpsRn5$*%sOXzyvxeMZFBBnNbnN_u+J}+LY`eR8`*knS< z^Xb^vtX{WoKmaYW740hj^fw=sWwvCd#Ao_$q1M$Fhv$~t5{m^avK3--^p=BEHR(iS zZOt`Lk$vPSXilC%yGmuzybaV^6e5y}%SGi@D4j216Jm^(D|;j`y9|L%*WIc2`WZ5@ zM!oEbO?;yW_9M`-pR_k zS8>yNTCTj<;GdDTmBR=ZM8Z)vhC$&HKA8(a&A|O(k(bc9K!N`jg>Jh(-o>}Sla{AC z=|+=WxuakR?DdHj4kV_+)(?(|w>|abYYuMHLqI|4A)|QqSL(){p)^#N0zjXOwy(4? z##Fju#ubZ{9_6|zBQyr{X>>T@;s5r$v_e$pn46yd;p__2p26#ZPQ$83{L;4|1Z4}q z>|MIno*d&uOMQmkR^K#7Vslyfih1HKFd#^6Q}KRfxXCpg!F_HsIU;4O6a;7qu5{(7 zaaKpO?M3uqWvG~t#rLBH(I`_Eo?4eqUKT)eFn9~Nwj(JmtqaF2JzCUmm)hs|(YX}V z%&00*UofI^H_d9bgfHwk=Z*x=uE^`(f7#sB6Aqq^8xz0NrG6$e$)E8!qS+AD(<26@ zd&M+*gKA&^c+rzyZe6N^wh0Ku>e+hQ1Q!d%3gVgVVGyqNcFA1z}TL7fk%U z=@VV_=5`0S&^l}9mFzXC;xX$Xqceo4!fLGls8RQ{M}7~5wX(&;3op#G-aFGU2Y1ux zyiKsGEGjB(2D>9Tc?kU6%LrpsG^S+oeE24Vq|uwz{q`+poioB&If`_t6E4`R*GRb5 zGHE_-)sbtpq;^7NV>+g|Gx)#{ZljW5JQ9Ye=7lK($)$d(@h9~A1MU0G(L@1jl0qYG z%&eXR5{+e@D9f8ShvROgxuaS*BVlvI=Cjnpg_f{fv%q$}-Ojf3t|EqwNi}oo)oE8> zV0U}q)`tr$jG)zgz8dU?8=kHAV%;t9;ugv~1ol;F@-Y7L^{0Mz#%NHb_HuFhkg5B7 zD(E8I+|G)>9gcokfK9{oyQ6ba{oaK%c=8_WD(e>Li0P)FH7%9V;$^di>8Mub{u0!T zq8P~|fNdL^HTo(Cl_>`$g{TyV5i`|5rgXn)j+8H*)_XTns#DJyHRku=EHiJp|Ia@k zcakE4D(`nG!F1v0MK11qPqL2dZ%4ko*UbROs#D}5i1w8=*3m#`R9&r&E*Hz$maFDR zhpmq+S)rPEzF^loZYYb**7(c-iO4yToGQ)n;Ci%``ohG~MLjxFc|tcW53DiW5-+wO z>}Wovad|9~vY5S^Ql#QF+HSE1#bcRv@ZqPQB5g~NKXj*SC94+%KYk#iALy3=83J2C2VzGih{z-oU`F-EPt zdZ^OE5?>@wxm|`xaX8&ETTEh|nRnj7Sz1&Rzs^P7EWbOPz25GJM!d|!YjBJ3JE(Ih zPHzcwZhhb}cMfaeH+vy06Dk6hE{G_|@|pUo&2XSSf$qn{B22_Ou5+7-mC8|rafHXKB>}x2`RWtnjaeZ?^~W7pd874pXYjQ=h%Fy~=7<5^96t#i(xhM> z&8KHj2Y>t`;EtPk&7z{>FyB?Gs_TW}9h~Cb@|dhiCqqch{)>Voc%E7rJPGg5@VdS6 zdN32wY8Ma^umih^Y+8*^F7>itJGd-y#nfT4Z4r{YB zcp{=@cXjJ#IO1tOYVU*bc*;Af*zb+g{ndzcpx0oJ*t}TaQ}a{%M5(ksKWUKjtw?|5 z^_u+`n<_d-`H^jQ?_GleYZU`ssTI8W08lMgh#+3lU2o8RxSo^XNrzCqiR&Rq93xG3hoVf}P>j+ZmwGMv2_zR`2~utG&b35~`z zB`WI;V7PukL>olrVn|Q?8ONe8{2ymt?>T(s>Be~7`;>3}d0fv53coL+Kbf0`qx!FX z^J{`^5=82IzVQQe$=W?Ep8g9dKs9jTC3!at+iDDt_i?)Y?ELEx^*5cQOqK_?3fC9U z%Ova8*UzGUH+qCDQs-IUDAS3yd5b@I3^UPTDuet^qhM{Pfs*MbBoA5QlA>C23~)In zXdJtO28)Y}g8N|*#Y$o4_fr>lKK%zCB~`J?_`9DetWmLH`~Q-PC<-!VM8^bNA>2#-qbf0~xA#RZikh7nZ|& zX2(S@#DhkstHxUx^7NyrW~geG#?G;NVo3Svzuy~Y zd@}0`x~pLT&II*&zh-EEvcm1sq}BKVInBZTOtdIbKiY>m{%T_>0$0sKQ`iGTlE}{FgvL{8O(M%>##ms|Xo4 zgwCTgq4()PzO6?0iKQPCM`$Y?Bau#q$j60nq8i3_W_l>`UV>cJlsxd;Wrgw938q_;4yWl}-5#wdH~qi5=$rEa+oI~qxVAtZ>diZ-m$C^LZPBiw=*lG#Wl=aj zc8(mcyphA+sLtxB><6zlo1K}Qhl<=Lmuamn$?j8htOT;+$Q2b)-FMm&#_m)cbCWof zWB+(k-gj@RH&Thz^npmQLA<`Mv|)Xe-ElK#Crl`@;#y>p566ecM$VN425}g1i*$L( zs`Jl#;9TfT`FFVQVrxgePQRnPV({GUAr=aW@9u+)?f{;Pj#PRvKxC{ z*|K)U8LMxud7DH#X5)rR2b?TPs&`tt%i>v~du}b3lTT+aUGVD=6x_ZI%Xz?5W`;16 ztTeq~XA8qOpyF|;Wb}|e&v5&PSAsCG2o)C~20qlJe|)5@GyfT?L_DU)!5|M81zo|3 z#}sQOU?=UP z;xwGxC4%jM$>oKivmtu@5M&-PRD6UYDv2+LH|I}lM_G?g>Q2?2H+VN(PVn(rIazMR{g1tjzK)E|0 zgG%7y3R}b2j!HLwqn7?JA>%LtU;><7*l%O$Z=QIkOqLBoy17({jk`)9WNxtrQnqwv zFUoU9q~ZN7cBkek}ZoO=!xVfTFMDGkM*cV5}|3L?k#dzvO@6 zta}Xx1_u8W-#S;^t)`a@mlk%Ff&QZFrxmEm`u6Dger~sKnJYOV=L%sxWNW2|Z|(=0@#wC(Dm8t1N`I z=EvWhkAW>tzdT%6{~pT~!y=3nB(|xlPi4cyrKX-jv0WQ)bM?gMoDQEu4xKC!r%VJM z)ftzsjkL+Gt#tTufULETX9mzr6>@K&RPJwuH|)hS>H~L}oh9HG&~{#2<6qT5eb)e6 zYi{Cy0c#-WtVb{hE~?6Eg9V!YyWI}v~9_WDMC__1<*TfKj(nuqvSb~ z)R+apC!y?-xUVz_fdrt^Qro|sn=9*ns;G_ub~0RCDvPXhZV$ohti-WImA?W88QRKd zsVysWjV|@9yimg?(}lb`aJ(1X!XvSm=$R#!<59KM2`USDL^caExv1kD%8#ra>3MJ~ zz)gpB#d+Dn7zC_MZAX0)i)rTZm=p(XaYdeIYTOT1=E9B$&|@*{=E#o|LfVaR6vHM4lE%(?llHl@>CU=`Xds}olY5$U}xGNTq9wYg- zxH=ODFx8@acW9ibX_4l{`ed2mpkY#qxmxt-syX5^VvyTyeo;~1MGJM{!t#k1#?8a@AYXpMf<2&K4p-!*-$7~E+~GMJ-y7jw6d)5 zuK~`QG}L#=@06?>Q&*(|n_+sv-Q9@RDQSacRyRTP^H>-O-Sw%$m0mu|MUK}vjv{S% z%gto~QyuKm+di0@dxcJ0w$5vFWQ?3p4xhdu4NE$%{@e{7E(J0dkD63po{Zy9Vu=|T z_)W2wy)jP~B*U6AKdUh(;V20>q4MXxZJH}beU{A{RBwEPb045nw*#2}-1nxR`=;+XBS$U&5G746vI2!Uhi zm4M@S+hixuquj#{rS##xjsFTGeT!yGjmCYP3qt@iA_jE>XK`}!J1;N&W*rrAziB#y z)67C}v-@S&@h$;xRsvojqE+Rnq9OCKN$q!Ylae13=$BO?STA!l&72&D=Qy{bDnjkL zBmI}x&CNI`mW=7lyhHDcx23%;d2@NfpwTsfPD>7=G3(%bt<0ipbluB89iU%fk|EDo zJjV?UN;5Pz4I0B`({jIR=1dHWjluzD(+J5>4?Zd)rrxCYzEO!VZyv5LH6y{&r_wbs z1mU+UTMMES+Z1KD;m0>%gH%sU&BPnSR;|c<2eW>U8Z`nV>Bg9&z%0RQU2KahL4DnU z><2Zga3m!~yB>_#kxbDvvgI+4Zkv{~^~l)j;QDuw|49kS@yJbB8s^y(rKT-SnO(kP zDk+hK!8**U^Q~Iuim@rkEo389c-pb8l}n9G9T%x%{bZO8Y_b7<_*DHPErg!SEcVsw zq;#zzpxfVqbXY-D_T13zU~z7BUCP%KCcQ;cM05zb2+tCfGUcGvQgNoxCDl$qR#cdGy4+J#2^y(VV6yZ=g}UtZ82Z9qy*|{m?w5BENjkqNvKg(e(QZkr z{g|kr>X*vD&zhHy&~maxZhpu^CxHKRDtW==@i{*_l0ZI)hR!GK9LHw?@b(Y zrHjzVusAqBU^Nh-LJM~&6Cg{>F9B?DnA6XZo%D9U+RYN<)oxO3vZtlJm0Hn0F*{kO z>%GHOdB7}#W4}2VlfRvLFmiHVnl)L-4-X|J|2mIxd3y_Ti}kgjEego0@Ds?{zz`5Tk)vCZ_EVPDf%03;N)W>qY+XQJDgLPaJcG zG>P=Kh%d?zx`yVl7}jJe#r>v)Nh$c^X5s0A@*K4M6%@u4XKR|nUFV{Sj~0$*x;?TH z#$h*D4;-^JPy{6v6Bs{sIpTz5%>upQp?VQ zvN-}$4G>1Vyu8i{ZHPYyF_xtzs{>kEkXe4|YG|)1n9x!9+I%NoSa7i)Hgi=a&7P+g z(G*IJ#gMg0M;bMLKInDQA@FKU>SD(`fAX3HU(n44`P_^1I0YGUxi>Y}TDdZSBH+m; z#|&2CnPa?hHQHQ&1HrOKDLNys&Soq;4=vOEWrj~ti>5V`l1j0d+RHLULsrwUS*rI` zj;BJJtX$z&{b51PSPITpM5k_viYl8Dx_=?fWFkqa=P#G@6YdNPVELfo8%+}|q;WuH zpA!=TAZz>V36Xs0!g^48Um&(JsYE(@WREF^6IEcprpSN@!KsNLNZ$Pm!T_F!Ww6I$ zE{hayLK?3%?owvTkDAq(&}+#fw*$pmo|Jn~dPzkvxYZKuwvZ2t`h3q__!Z+f0y)=a zOvs=Xd&SyFZZ9k%%u7TjQG^F+F-zoe_gAmr-Nmb-m4+ZSTiT*OoAvd%ZNBd`D7|83ot-%J$K@otH-G@ab?-mIFT zv*vh*5sEqG>36Ag35|^}G>;eN_kKJCRhqARSaYIpxki(h`9o?W?U(y7z9J|Bb27{G zDkQzi5|7PMb>9Alfqo^Cf|1u7f3iFG&njwX`LO?R>VBv0mD}xb^O~pNGwQuMsSAxC zRYHW_@VEyiLVbmilrRjj@YgY*zpP%De;34(+a;=XHV&1~8o`$38Q^<2!WU(sp8*J{ z1Iicif7kp7kc%9#jMy0tKi!^iZ;H*)jsn_pCseg1M$9Ib(4FsPbeQ&~ee#!BoURw$ zzhY7gKJsO&{!2UXzbS|~pA8F3%K@X>NFQ#PjTeo#aR$Uh>NKYhQE-ZUq|=~<9qm%<#hcMj@v<^67Z1m)kzN-oqq~gNK+Pwc{3FZHJYM72!OIPd}yH7 zF|jk~dwU7<+14{dN_xZkHn5;E=^s!&=x~M@L5go10dOYlPWYDVP?vJ*ZQZQU@UT=7 z>XnvZ_F|yjl#r(bJ>&mQY#v(okm-Ld)0&Js(`Akcnr_@x^s8lzs+~J5`Gf6$ z$Td>cBjx3G5&2i+#va|tYTsv^C6I3Lv|5fCK0q=$Wntv`+U;7!Q94E3uu%F&hi^uevo_Mc&*9|xoDIenRa2=1@1 z#0*iExmN?nuMHn|n2asSAWALE)h9%tz4FbRzdoDN5c_7gFP|}10wpW< zFe*Vp<~!L}h_2k8pvilMxw(m-l?ex{Mmh+M>n!9Donq@5se^Y{W(RlG#NCh~9N(VNn!AS1|W_muQc@#l|UjjHwX7$xYNzq+#Sx{Q~ z4T6T_m6t!Po36QZ98gD^(SZvCtu9!Edm$BMcPG1U5)xem^BA?AeIr^E*c2h5myE3^ zZ&6}p^8e=!e)fAl3MIbGk@A$SHD9NCXspDlQQK{oEALeZw8mz|FAjUQUc+Ai{#h8> zh;xgyRn)8&f#!~by)Z$bsNAjW!Nh?P$d__4g6liLPLuF0gP!jN6T@4lKwqRw+Qw>AkmT zq?s2&g>3{ceP>TWYc7t+K9TbZKi|P5fCV^Kv;PVe!KjtoNUaqAS_z%6__A9}P)9e9 zOUf@aXqTcryeijS8opZTziW^58pLDYp5X2G$f!4dUMPChyN|nK`qwr`Dr)AUe`q%@ zV1+zhUR2oO8Q+YqHMJb*bFJ*JnNYQdCu%@)dmz6b;yf3ofF!>kZ_n@_bP^T-12W3c z%z$z7g2qk7HByK3*H?gJj8?wjuIxKAnY_IDXc`P8k}g62F5;lYbUu>P^tAaPU&pVv zoZX|LS(W~mOM;@ji4f`eOTG;KN>u+vZ>-60e%r=j-{mRuh(V(}_*RX^Ga^N3=Gbk# zK}zJS)elWuSOOmo@n-rxEd|)U-E!vqz8fevgeXsnP<)&DQDXc)gdI}~p7*~A!UqiD z%}7DD|2MKrkO_NWMdaf+%aIWZV}YEcjH*bj^ z1@5%{Ue-Y11;(nKlUp$G0{a5jf!=fU0j3x{pYC&ZTO7t`LXbYH4TlTD~iaYvZ>0%xp-!^qG zSq7#LC;Qo42=e>4>>K=w?_-L7ENtD1Tq~E>rmeiU!#x#Z`p!keZ(Jx-_|S(PFSULK za5}VqAK%LMOE1oOh4c3X7whnohdX?1=iBnS(KcPE;Tj8H&%F5A1{O+nO>oxU-%Tq` z2aVVa&Fe^eYxC$f#f|Ah#-OFNf>wVa%J8{$-PN2S0{M#MU{9WFTDr)2QoF3uve7Re zvy!Sttwx<-sX29|ZDZh;u$+$C9eJQEXe|oz=fW4-N3O8X?l@d$)iwp2Z-=XzKQQdB zH&%qijR|ZquaCh^9()^<{92>5)TmC>G;fJ7T?7BKH6hEt0&qm&NI{^DjgDaCfP~Po zQA6?81P%Jl*w4-fZJf8=9u>89#5O05WES;C1-v55a9|?a4^!6JoGA`FKd3U`ye$c@ zh6Mf~Ma@X+dUGJAz)cl%Gl+Dx99*{y+{Tc_fO&_1i-j3!F%ABM;b#Zesf&=fx4(^# zm`8LqfW0Sg1XZDR7$~?eZmilg6!FKa4>h596n@teMk+p>*E z!;|+vHiT19;WoJy185$}Q=@1yp` zm%N`G2rI9{S%JNB9X;S~?xB#h6I=V*=cn!)Jsgdg$4Ku?c(*h2V@AR~HR2R)|7Ul8 zDuEu~oDqku4tD=G;w;R6rQJAuVfc}HO6KF)ySOR6SIJao6kuK5mH!=uUH3B!L+2gT zg`YPmz|D2G`F!j3I*S|bwasRf9U`Wj6<72fT~eUe2b=fdBlLG z;%8WVWQtP3=omC^*6U?U(I+{%DuQmg9AQ~iD!S5LDEGM=x^y}(6xi+QKFXx{qtJfB6VDITJd!rG7H^h#c*Coe>o)uUT(^d<(=g?jlbJ1z~m6~(KZ z-G&V6wHw$sxT*d2>aKn~`Hx82q43KTz2DPe41y1k9}QMefs~mNRP=1 zx>r)c;u}H~IYCL8&ql`<_=!BEa%vF-27@`dxmjPM zF>~fIvH(={`J_>kJrI1{_tA*tln_A1Ao|OxVp-R+b9VFe7}r2F zaMpOGP;yhhmNADpyX&kE9&_ekB%;cDMABPJxQ`0*M$o$V-|`;M)M=IXyF+D(#_HJE zdJu@mZ||`&apivu6R>m8aG1=Jn2%(1FBON0-}=CbiUB~j6(F-CPf`Aj)}+AzUpcqF>cRKN`+u$ z59>{FB-36GJxTj5*Yx8%AFci!bwSSsfv|$lDkVZLw(8W`S*%c8CVco1u}8hukh(=r zhQ{>~#jB6R;U)CH)*J0Jb#-;d)moB5zH&dV$KyL9NFDrs?lcH<(9k6pO+BjRw6ySD zA1#dNxi1Gzc!UrA5Y>OWLb$sDy(lbhA*VPl5HhBdDXjHxzu;c)1RUvi1YD^r^5N@s zZ#tWNoFvnO@s*!3t9WL7G`RjYvon&W-SlHUMoherctvANkO-oqWMjjyu(0q-{BnfV z&&B>;UuJ=`v$N~z@$q-Rf;}bc*l1PfAw`TJid6R$<=kA_4?MSjWT7lkK#NF$$^y!KeGT5;)kp$Tm7fxheOjM27=KZ4oF<$ z-X9xhG{Cc^@Wjb-xDzaEk1ev#;UH+(3C~zjFyfE0@Vh$Z;fyFwe9$Oy>?}=n{ghr! z)<3qpCBg6SV%4;~ew{`D`aC&4Bi3=ptr`|CWB*OjCcmAO8@czgecMj!(`u>J5_z&q z#A~7d4jE70QKsMOVCN_ z5PyV|JRr~zHFX8vnqhFkt)KI;Y#QXsNn|nSc=P-3Jl%kNI+5GbBm3thG0)^EIyE(( ziK#;|OZj(kWAZe!V63_vnXPv*q2b!%MeVmZ1NTJ{2w=O-V&;-&3)OQpur>t zjG~wc+Bie2p(Y`Rq{97c1E%yl`1#ENEhX06N2SE}-~ZJkjKwrAsI&$o{8=l(2__^_ z*gIp#Z5q+LoW=!BA5wcAd9Y7zBEsml4E&x^TM>3KlUTEyEzDUT(s_SLq)-6oH;24n z4D3SNd%mNISmzOkylPX?;K~eNKPwApmcx2kMBncU61|3u64wm_DNc*$3;IbL_qFhp z(3;j?-2nUT{iJmHCv7}ORcbbUj<03VAO=q|6A7w=c6cXr)WxQ6hjN#7ALJESF(mO_ znKEq4U0)^Y2hhND(7aqY4}luX%;5!X@yQ=;pZlhxPq0ISov;6E83lOCbTXMPtJGw4 z2tJ|{nT(O!Lq$iEGlw5t4EU~3K6R`}7T#V_v9hN|E_A~#>PUb4yX$1%h|moS=nTWD zduun^^7xe@ts&qSuo}&}Y^eL*ww6mhaH}=wh=90%^;VD59_-DDE3aDhZm9fbbH+0% zHX3TjY@Lg0Kt(2P&W|T4!{lc5Izpfb?$Hci`ft=l>{Rp^cxuC?YeG@VmE{A%w-l#4 ztO6_Josb{_J-#^B;ZwSM60#B;UlJE+J60247o_7_IZMNaLj|j3y*;2BW*-~f| zHgsGYZg{*4gRphvaA!(acRS~r-K!q{;X0<8`E=0K{nc}!4jnZh#M8%0w@K3KB&IZHZRe^GqPQRrIZPI&#qLpssN|<8@n~e~KVz*^ z8>*%y*uD%*Mkgh9kG>MzR4d$?*EuLCpT8~2KBWquF0H>gXe7xVDKS6wNZ}iH(MYJ- z1cN;6U70-*oUHc0zD_GFZFc#^6#mi#+7aQd zX}cR$|4>BBl<)W{d9TP&G~;UPc%gf_G7)nc90$vTQ8D0@=Vts$(x|l`A>-b9-A}HO zqe0mT(*B6eXoxQ&x_xhYfLgN5chxcs6Oq3e_&gqCf zbxXX+CFhSpYxr)G;IKoxa7y6s#}}&L0UqbMJmK9tn$a#|_3b+0mYurX2uPQ%#*-&c z(((@J$`=lmn^&3Oa_YA9L5xx~JMi4C&aF$iC*ug% zL6ZjyZCTkHJrfA72mjU)#yvqxnz{X>H#Twu?mw3r-B!F|IAW?Dzb;m}2nfw!O<;I- zLIv(V|1=Q3LC?HfzFLae_9cGimDj)tfe&qaK6$)KSv@^X{`y%HU}#avay?ypx48;1 ztKB<9s9fm+$W-yJO9%6p|t z0j{pQe*vcyH3C;gOHZED=E$mI2tFM!oz8l*r*NxQLBw_R@m{d(^mpwphWS22(SKx< zk=TEDAQDY+fAL*%|D56$|GTz1#ye4QE2;7^0wmOy74am9(_RM>tKK~wcWu{wxZw9V z&41Y}mNIA8z#$Z@EEbECZr-wBd|CTIURmh5?*D#A($-`f4STl0*XOn+b!|(>({8c0 z%=3l}NMihHRA+qYtE(dENvPM!&1@@d>~S-ZgV%enSZX{@z?Uq7xhbkvti2oiq`iM| zHNBfjo8s6Cq&hE#CikKeEY}!HBkYriTe$?e%m>x@IsYc`+sIU^#g9X3r3vGBxh2k= ze;gbq@PVz=7J1NRwINLvLLyW`AXu$?*2iC_K!B$mvP_>xdou0ZzIF#v@0#PymrUSq z1&629MV3Ls{g5x5+8LI$%p1`mZEkm;ONDQ_&<&~rW+geoFRd6KM^NAEx$wN`-(mSZ zbn4ug8cxCRIOx;zefxi* zL)lLgEg0`M^7@+~Vw+!C%um?9g|WSV%@+&&@!{YUBe$NY&4`@Dce!pRvFdP;BQy;| zs4_Ws9)ZNf#aX0 z8dX~#V(&Pz={vkz5cDf4bNA+=(qw%>c&nkX(hv!>Hx2Fj`4g2Us`BxXLQC7uikukAO6rnShUb*pg)+ua@5yU_C7XF38St12=%co z-e9!DzxTrLuihA$u{W&09y@!gsEM2*?0pVP09)|dI2(ngP=w|5K}0eu1oV^FK{)V< zppS!};!XMeE!ApVe_dPn(sj8&^`VSCww*rjWz zB{5@BCGn6}MpgY!UMvpMKhaEuBkzyL*c)=zPKj?Xs2UyjA5WYw0!lqw#}Ac$jQjF} z0%{|*s6+g^if!%ea%Y!CqlDC>^3d3@%!+0TmF<9AB<#NVduJpt390kBd znIp60`w`H^yix@*S-=fY+~TB|jKLyrZd!a40z2}!wD5VUNlW&-b7;PCPdhu}p4j!(Kq3X9eddK59dv|k|mH>_ieDOU({^9l=N7XnGc70<)H)c_M;R|#<5!7XS(O_xkc0Ct{?VO2NSwU`O|@r#%7Rtc2(>xNp&83Ah zqL=Toa_e$On2${Mync(=S3pe(+su`;ZINt%$$|!>f*3K}<}kmbIeeG?owfi&bfhI* zfNxatL4&FxZ&oopb^!VJi_X@0QbLoAh6^Ob5Y_XBbl^Ly$ z-&<)HtA6?ak&qWM!Q9Pc3)6PCa9Y`5+)+e_6c&dbUkh5GS%b}07d!R!_&8uxEHA})>9$t_~)yxspp5Dya%t>8nv5nb^n35(U z4lU5xD-`V?^b^;xQzR1X)Me*?N2(XkT-il$ip$LvxwbO#bQ}M5DT;cwF676QHe%pD zQ{8b%Vcta8aTx)lO{RsCJ1-=RgV#iokxoSMJW{pU)R+-FHZN=_l#;D1tGm*#|A3uF z!;b<{v}@}C ziTtAVt^0C9KUwa2RYN(eJz3_WFb3CxiuG?4g*|hv?t}JrC$vel8_ihsl z3lJ}rlN<1r^}WY1*jD#mw;z5M>PU^4o7$T@kN ztNneSgd^lunUfhoaQj5HEJLKJgT>ltGpi0C9pcOpTBJQB*Xp&;T~O=MDPBNHv_Hnf z3XAnXsi0@8P{avcj2fC1yK0zuwJu!uN@0&1h-_zOG?_2;Z*UY;EB70%JnpAAS~9A# zXQ(|r_{v%%ObqMxcQwD#HPP6T1(M>Gg{L>P0SJliQ?9yiekiGuwL%kI_KlkvQ*yju z0};~FSephjVg@E(lr%%CZrikVn@ssGcH~W-H#m}c>=-w(K8GpEQ!yUQ0AT6z3x9DtLhRd&KQW8`*~eR$K|TBk~DiFerC%iD|2 z5Cg#t8jiHD@_^|*Aff9wLdYmRgK^|uW4LcU4J0?!B?th2PRc-7q|@l(;L+#bs;X*? zuVQHot^YtO7J`={aCDDoI&>=+wsO9Iu=*7!sFrg-AY)Sq4 z(ep0!SNr|fcvrmP5p%C4djUM;<$z4`lv1v~IUDR6rwvr~r{*(m#X^eQS_E}(fF3sj znG{cXNZ<-7kqcBwINM)Zmrh!mM(A4yMD=*8XndoJjM7p{3F;~rD(~@Kx6q@3mb*Cx2hOpHjTbFv* zah6M8(KhF}tmq~Yo=xhpwWFb+<4WO>QkLYePF2EWX_@nE*k3l=v?EbZ;kWgrtn3)< zR+gm<*ajbtTTkNQ9KFF4+(sX1?t7J~Q%qxJ{{QWHao~ZwUN)cTepB+bh2Ay~yUuAW zp(^BYD(v0wB=vSC_0?(ocAOOnsteoFh>z&eci z8*}r|GawTV=e%N*_a|ewcaE9B>-Hqj&?Wkn5MhcS)_wj`(q^ulW%f-q3MBia?Qk)befHCP;BLLG}bz5Grc{d zKXp+C7Dc-vz~sT^^f?(4D7@mW37tjWuPue_=g$_$K6(FO!E?}2MJ2q>5Az@ZL==-)TtEdl;(-$%bX|nUC?s_aCvpl%~2A4@?X_@FK#a#kwmM}4$ zXR>Xm(xTP+-=!t7DS!KWNJvhV+hlTvlvy+GLwrzr+FF63uOM9F+mBA;I+}f>Am~T^ zbcydJZzXEOmejWi*nO(6IKS1jhV2M(Rp+^X7Z1rkvCg-27c5~UMKiJmCrDhnUu_Qa zhLn9|*g2xVhZj$)cOzj6S$MIh$*IL-XV#bL*cZRvAYc21*t0M=Kli6|jzc;*FX4XD zIMLyT=5WK~m+*~Z1dg%q1Hm5MIvCDAvfX}ZR_LHKm5$Mh+EgB6*<0a~woXe7mpAS3 z%jGQEcdVV5bdsN)vjY`yf?d>s84(>JBzCTKob}a>G=T(JLI-HJMt+rm05(D?_wOik zY0_;IQGF9~CkI@d^kVz&UZno&oEoILQW2n`(@yitV# zozMpI^K`oKyAwe0_V%{ei|oH0GA}l5$QUM&$S*Az|Ils0U|)lQjl!)%2|Ybh@9U$T ziq_*UO92sa-2on?N{Y@yao!E(+nV_{PYz^!W|CBFmzMSJd2nlW+f`jdLu^Kdf{F^} zoW3^`At9mI+#>WfhvLgj?fwVBtGc777zyF;iV*`S`w`l-nGao{NknG-fvb-1qb=Zi zanq5Fbc5&2Rc0j0B1aC8-JVevM-V=c&)<;#?i7le{0;KkaSY4+@O}?^PPzJWq1b@u zA_}Fl~FA)4&hmWLcMrZ9*cN-C&1wY@PSPFPXyG!Kf zZ7_mAws$Yp?F?_{0#6*r(l;UHS6YZr9n5-s36Pq9#WW3ai#;VOAze%T=LtO#7 z$bNGb?p@XnQeN+-4yHwqBLGdzQ_q`GHrLZffUPcg+n8Fa-uYHqI1`-EYcyW9@iPBu z>qx#mROgqo(r4APhgwbM6Yy9)dIh0%O40|OmCpR#!Z?>(bjAqZ@I`#eFfT=t-#sf% z$>%d;PQ3sp%adyK1n?D2qqB$_LT}}AKf<%H`FWj$F86U>=?O&dHIN>8UcKC&4H*&%|E>n-Fow#TK};;V zrrallUVzkN8Is0*cpAd@7=Acr-puzx_z2uii7S!YlO1OnXKMznj^d*Tr>H1Koli=R zs~>VZGB=bOlPo$YwsZ$th%?u=UGL)asn{=;kiXV#|H8MxvR#yx11|Tul00$r`n#H< z%#NHjjM<0*c2T1`H5_$J`PO$=xYZmy2GSlc7G?zMos{Q0Q@YR+O=KUaA_}7{jGq+s zTdz;L6v;O$R-JYUMQ&ep|1QniTk_b~h51}e$a;g3d7F=$UcF3;$f3>q(BI7i5#*GS zCqhiNleOWv4&I05gj^lz0}^pvcj3Nx|Ita^?NIz9MA-89Gqthk@A5reKOIjIxe>dt zIjN+8ES(wM^63>c{FzxTVsKVUPY&JJ9Kl+cH29SE^HTzC##7x*D;v6X81jWgP{v9N zP?yNSryFGt*IpMcgR>5u)zCG<;yworje<%msCzoRxKFh5rsq@8yUUy&2@gxH2c%Ya z+$q*WeP+cE!U?~#Pv3NX_EBjiMXBRPo3WZ9V1tjiCL~DM4bgzfjsHY&HKz3fATJl_ zLtBn$6M*j##Im}w-hhKYfdW<}Bbt;*GmruUG+IibtY3oCBSqc^!DDl`pcN(nYon-ZQv;<{B=>tJ?IG4=;@HHY z9i^aPa?&vCdZI{wq!v~z{Oqq2i*lN;i#rMsQe-$e?^n=slYy{c1MuFf#cJ;qh!A%D z0WEv_bzw_3hbR702A8am!3(#Ec&eI%)i7>RJ#oN>ax?ektM@LV=}BqNo|}<1F(qqn zXcjaGCM~@23)4KPwlNIY7%Wo$+c5u%lKqM>F=EfaZm2JWVL#v(BIkWhb>n1SG?n<6rulpb^Qox*}noEF(BqZCU$XB2Ep4Y(=#Vg?tUJF|w z%1mj4>y*_&Uf!H{Zd^xI02!Nb;AZ88#4b)vF|HkkM4i!ZQ6*!=>KkM|FHqnl;=@HJ z)n)nkUUc*Y=_Hu_9GelL6WD$8$X1``Vh!S$L`F1P-KQc z#E^MN?pf%U=9f=nf_CJl@>p^e@}CX2fUhTTgd=Q&ALHv#3!PjFgWTuDH8t@)Jw4?!1yVvoLvx4~1OL;=yW=Bwf91Rt^4#6swcTz+ z_`E!<(r|I%f}d-Zz9sTAwUc_R#*U4RnGD2I-QL|rZOOJ5-`?J?ot%KWyio>{`Wqeo zMac81eND6Tps_kJZS#A1&Uy9nS;+n`I&X_O;2)S=A&-7x@9Oh)V@}pd`@?Y#KCCSw zjYf=*sa;Tu(OjcUi(Dy+7xk2n(Y|>b4+XwkdNirKvD0cDHk7>>!1GuS>LT`8lp2of zo>QcOM*w?a3*V9;vN97&?itXoG7tmu$DgE+=kOg+5Y9lBMIhxZi+at2C%?WI*=sSy z2q^UXYhEV^*eUm)aisK^KIGtuUYh^IC4Hj3!!PN>a=bkWk(xRH!lm{>hmLziq0f&0pYGG3u;bE?K zGcB%*!7&c`o!YZ|&CS5j5b-6X`V`m+5c!XTd6n{?iTMRg2&+4djfwgDcy|#J{r;Zw zpI7g8)&=qCX=#ZtP; zc=|5p-E&7i7heR=lQY@#l3z{6cMFmDHz<9WUnB$+_bN@FN(E_Ea|hZ!`S<^pGa$0( zcRAW%S#^;77lYUf$>jB?N`A33^pw*fboFFd0Ju($0`KM@?KITaxKEq^r@TfwE%u7=5;UlG z!~kV>TrSu38@e83n!0|7yNYt3xYQyfU6K0Ud+HjN7!P&wIaxp4er8^6hk{9%nR1Js zZ0=)g!Ew-ZYo|ue39dbeoz-VQ1);m;>YgP9 z+(gpZAWIOJ^6DDqI#50=MuIyM61!ZFN{)L?zf436(FoQ{sF5tm70dYC$1C^=A>mq| zJw!-GY7bcCJx*mkUsl~9)Gqj3GR4o&&*wP57e=k*fts=plqdcFFBx0;VdcYcOiWCU z9~IWXe#ni&9@zT^?TG{zm#eOOW0+%%M_p zMFC@DrHkI0=zEdFalXah06x~xzo%bCDR4NGV3ZwetWPB<8#vZJ0gs3uQ9mw zrd~SU#B_OisRBJF^2`kIFCc5t8Rmt%w3KLFf+OYR;(T?zi945unK$Cu%t)r%0xuah zLWwL3B>M*oF2(XEfY)e~%)&`aJg zE=lNw=v|6Mfb;y{M!>ZW0)!Lh+?FnpQ?64<*f>~vyz2hi9ADVf~~%en-}WXM$6@{NgZe zyxvwB7YD&!XR>L2-uFHCul}=|Q5tzT=LAt1(Xjzt@LrDQ>2exPF*;Yjcf){W)eMa> zc8x)a&m!ciBjX%Cfn}+DBi)`}RGFFP^rgMGr8YUGV@NIQ-25#z`$vtFCllo1XhS8- z+&HqGlNz1vdablhf3WFI^Dhp>PWVmp^mU(@;tHCs5CJV1Q!(C6>}x0S6ch~mU&fw>^+1qtSp(&u&-%MpRHP4uBVL- z@VJ?Gk}9C)ErGgqD`##!Do#CUZ5K-3#J+kN({2&P5c+!u&2>Dt!`;olY~xHj3?T%X z_V*=7mV~iSo}$;;jz}roD4_kFL=`XWr+wn(opzOL9^D7JoVM48AsHG93JH{KZfQv% zp6-8j!Lbfl|E$x~S4bScdnh3_!5S8mxol?p6O{g0io`mQt$GypW(UpY!hCL9UpD(d z64JVpS)U`ro5^S9qjJT5C0Q#3!xv7aA|3 zC4#rbOvOr=^!Bb@$ zvIj=n8CNVPfD_7_MX4P*l1X*O60-zGH_?U10JFF?ErRL2wRwn_>Ul!B)JeFqbLWSC z$D6Pl=YiFxqy(FmP+fr(%PD<*@B7uIvj_{V24ms`qgojd7ls*~*Qd?P;^G*-O z)|}{yFi-V%KGyxKKmM2ErT5FCz}4Jt)8VtG=Vm~8+p!GINJEy0j&R7edhLEYjmKp@ zZe5TCWc0#UuBt6dlWfG?9xZG-?;E>Via5FODh|5; ziBmy@&#MN*ghzNFv>e)mMF4xd#~3#UmhIF~B&$5kDf#aEJ=brJ=9}WobOxJFG?mVw zHe9!n3gp~h(tp7E#oDG#F9sJE1g>K>cXfhBiIu7L_Z`&7wS7XPpF2(u4a(PoNB};f zpOX_Ye^pL(8J-aVFNX>}_NwPRd|_40NyAa(<4V0%-o0VqjxgAZM<5USk;O=+o=;uv zFIT8b#VEm_+j^cxS?wwz_&QFf(sj782P!!Q>Ct8{WXw-=|xVA)z;FFgId_7yFF#&8X@rNR8qh6BejVxC7sH1AE_M| z)XEW0dws^X`A|tnuLv9l5$h5GHAGH6XyKEqHy@KT~dYShHG?6-7x|Ely#^#N>=SfWh7IbCdl*wdvk zcngZ4y?_^@ia*A?iUvim*nNDJfl}U??9t_26ipdpxQ?J@0?#FmZ?`$x+U57k>60A^ zF)6)D7PwkQf@I^3DE{@|;W$09{zNhM5RoN$5u_*(_un89hHgXF(~GQ^^lFp7=&jdx z2Ii1$T*;d6652?d(3Q$P5=Ke^TgNu$7)M}B_wEY#UluQ+SppB74o|m?6<#J3Ur@RE z_+{sv=N0nKzQ5XoGGGg!Qypi3|HAeWE&b-2)Y$1@zWaGzqy8uU2Sok*2P(#oAEMmV zSC#9fn1YM!Oh`i=*V%8pB9AYXG<8x5e)@W7ba^NMO#$QAb{82oqn1TVrZ zO==KHt)2B+7w92DDg4}l-1JmTqt&{B$Bg`C7+NUjxQ}->eSoiZ1%b)?ZKEG8YKeLLG~H>ZThGn^K)C?~84VF|Y&v-Ug-1ysEtTBZ&3@ zbU-IBOXeZ-Ugwvt`@gR8nMva3(gF^J^;whdWQ8vq5zSXmjq{J4EU!8XGX0ggAZA~9 zu!u@or6nfJIqW(?)lwL)Tqr!I0c*vFE{6a4nMG*+@?GWgrD(;2c>lYc-I@Sf-<>bA z_AjXDz*C}=7sgD&QTL|p45F5@ZnPTRuDvX0IvpN?0c7`?ZhJS0ejkGWiAZsPKy|v$z4df`x>-DgAE<m_z z;<~1_EGS+O6|!xO%Za7)I}x2r&_8geg2XM0b7)FEKM(qQ70TUBCB z+yW%Vn<_=Z&nvkDS!Y!LfhSS$2lF<|j^j9)f@D+b1x%DDqq~oDM%@&fc)Bkr?$;*^ ziq$7o0uFoc(3`oJ6a*F`sR5Qu3!C~Bw1?9vVUb%c>fyBBReK(%<0sJB2ExrnNUJ%U zRlM+Ej4R$QQ|2(3M}CKfrM)M(d@hWQK;*sD`00e^T5=@t}b{)DJ=}O^;iBvWwmE7oB-B2nc!8c_Olar z0{^fmym9oxJ)WFHR#y-Ws0#Qknvbb%*B>4Mfy1cleI!H`#gyXT_UwP^R8!o?M}TL= zgTl(n>h{i;t5fgQpSvY2QLem3xR<}K%p7tLhbW)XJ3WlU{<%jY0SgOTnj}qj=N1J5 z;)*5tEvDKS5MAOF?$mJ6DFry2oN_p;ES#$$_u~(O^~U2~D>r`*<#-i*-$%-`b6`u$ zpg@Y=1-YB}L%tgR1XTa_`h|@p1HhLp5*ayV&qq!IN7M+mB7&k!4uAS(%zs#?jqd;zXe#A(L~Npb+M=Oi@R5N=>g?RA1a(&(>#?*mn2D{)MQc zs@0`cqm@U0cl=I73vBg|a;V&l(o8yEDlPSJb|#z&Dxas=2!qvNx99&9hzqDV7rP9* zz6)=cv}9}|qMuhW4bJv355FG0Zg2NP!5c2eBWnB*%jrq7S@?&;*_e-xd|eHvaSC>c z!i3lt-mZY_J2WhB=4CEm9~3LJ=*SPOga7pov?n05Cy?6z^~6!)_boBIOcrbKSxQPI zU=w0UV3^$skaNX!P-0KODx*g4WTNT`t0AMfgn#Dia5 zN6WO|qTHZz2VqEIG&aU~+N$4D1imDW+r8%YeJ3QKdy;8mx5H(>qGIBU^F*!@?}!~B zV6Yul@`uudjfXmlg7!_LvF#KOAyQ`DZj&*z`gwE4u=#-s1v$_A-h{Tgn$U&==HbjY z8yh}s?_Dk?S0sn8B}-~4CR}>s$PRNW^HRev#lHpmm@5t#Ki(?GKDtlRURvLAI;-8~ zaNNfcRD5RT&Wx|F?vWxI2SJz0rx7qLr?E+Ql+YxaF2Zx{h#PCaAv!sTxTNH$@em+a_9@L#~EGq)Au_^oz9GHVYL3ZP?7>%ca zd(}Era+PHBPEyNn^Izm4T8^1)rs~=9DT_t8OH6wQn%TY=5qZUL%@jStPxRIqIlcmb z^bSbR}uT5DpgsA?R2zluvZt_I$u*ySJni`Kcmh+Jq?_^iDVfGw48VE4LeiFLAh8 zuK$wGNJ&BvL5K14YFOWb(!;v+bO1aGJk$N!$K1Y=9SEHYWe-gpVS!;=O*9NQBOYK0 z!8lgZGA5ZYfz+JxPxYg)sx%uBr*Y%OE*g_U{aJlJrr__64+u2uNaqH)+*;x8p&Gp> z$R#|gHM~JV`=a;x=}8*xT53H{`~*NgywfzA6|Y>E%G)K@Hi{tp*p*=UPQ0PpzqT=L zgV*olw9(}hHc8yztpq*?)hy^|oW?rleU-^RF=gkP(w|QB{8@ZoW!~zMu8Q(wP=;pK zUxq0m@~I!+Ub_egq#Y|HAsx(-*>9+XWQ8xQh4cZPGK4P3i^YO}p}y)Qwlz7Yb2;do zSS+?8A*tCt(p_S3)j(xYDKSKTJ(){FESd4vDt>r^;g49?c_Ni~d>}5-ks@=N zPN`d%zMn4HV!3)=XDxkj-z?kZ^<;_0I1a9Sa!enaW2l{Tt`7NJy5c&}v;%BKF z?ei?)(Jda@T*9X%;g>Az59E7<>msZ@{YD+e#%k7yQlQHoapqsH)>i-P3ZS8)Ol52F z=eF1>vj5-B*MFZ-4HR$A!p8}iy}eoSqv4^fQ>nYheSUg2=hj@1JSOOb{k3wOTD19E zekt<0-H&{w%{I@S|IIqy4C`3xGXUHnHtGvROn+1+dMG+!GjU8m7%TzZjvd;bzV4&t z$9~%F**%YiyaNQ$63>Hr&AJct=3Sv|=q_s$^eXhYkzNarJ(knAY2~!TZf7W!*gdj- zho58{v7&h1HQhXBlI@QF0{5BcjjjJt#kqiRs#y7`gbL}jGF|$ON_vxMFlL}`X}V8X zxd8`9Bi>&cT@3K~@!h=i1H2s&zesS2`KS8gwC8rLN49R!+qb^#K3-LJY=lYq4Z~@^ zLR~&b*I60$DAvX{UcDh6dJIEB`oty;BDWHlI(Z`ZYhotyop96lwh|n(F9tyUPphXy z`{hxsO@zT3Iev4W&>r4sc(Vw#6RGK|M=jmu=P75O&R}A2_{(+N2$Ffo&(C2C?@k~% ztPjcXaz9-ot(Cc%L+Py=7pICP!s}bOLzu5! zXGQ4yu%1dF`6tF-Hovp*HG*^p;`6H1k;AShm5J;F<6VBz#EH?_~jCy1s1d zKi?Mu91k~K3KX-(+K4N5a||Fk-#cP?04x0=hs3=5Rt7Zd$ox!g*rER|y7bkH{U1-? zzzdd+0^!WVO;w&wgxCGZ<64RMXx7n_V6V5U^5bqN%xUw$E+1S1g8LGO$Zq{HBJyuX z3*1yHoUM(kkz3Ob4M0H+M7){kv2f?i#f{Kx1k9U}+qTGI&Gu+oq*C%OR9dZ?p(8#c zsNRKNuSuMEDYH{aNQ_gBjrJUjoWzW487V$2DDUb=!KDD_;?AY=y)Cnoz%TNCU1Gxo zV;lT-H01vFhFeK`0XcEEQnc6)BF79RF&CDT|n zhpBs(12mrM=q+x7_FhcfSCU@QGs+W2f9k7Z0uQW>CD@UIm`3$QETco)&@G%w6#K>g zSYcfqHxMZc0}7z;&Ko+q6<+xIkB?Xy>$8>l*92f9Kp19-?=xB=6~XAVyPOgH14n64 z8Na1XsnJW0fVK7FxYu0{kJy8b!-YX(81JnImbI#^l|H)-TK!}$VP`pr*>sjmOj-Iu z)kYsYpXZ2>6eiQNJFTp`D&lFy*SlS)0^hoBY~hXQ(0N%gB+EC$GysKW;)~}?!Ys$) zZ_RKhabi@+w-z+ybUaBAI3lMro!jI7)P9E9lRMY`A`7A*i$zP&{892J_4?k6-su}J z+XUj$3@^Q{8FZLII$BnQ3rTX99O!!` zq#-AB@RBk*MSfaGRL>FVXSNOZ#SQ*BL5ZWeWFUiV6dbdcLHyx4Ewl9>-OJ9@NArzx zU**zAyZh*TLCWP5tSgQ%;IkQQf+mU1 zYKuE5mgPS2&+1OQO?oucdHmMEzKLF)sG3WnzP#tt71n-@ zFW{;3u{{-SaMO69%@N<>q_SGKlog)+ZuC_dsfmKg6>@jFYZJ~# z@6~biyjJwlMW2jG>scT7J73bZ(3QPD?HYxTPV2fm<>_{`l(y)5$g0{_CNI9Czf@#i zdYr>=2L2h+HdzuhZab3S-pulYG~9}Qr-?L!Dgid0V>qvcT7&e$%uKyJa>#@-X#ARg z(mh8v6(h9U7)k37*<`_X1N2~l_n__dBztq|JI7fEq2X|oJKlY@z>yb1^cCLVY7x=v z!kgO1-o^#pUFn-h$3WArP-Z2`c0XawFWhmB&L6VuqAjFkvC(3mmWct|7CVhrwSaJ| zd9g>}FATKWLVh8Rt&ve3P=oNwc!D@C=884myaWVvIu>+_iBVf6Yi+HuZp4_U+04Jp#e zV_=s2wOObQSF<k*6S2eZ;krAjviJTK&U57Xc3-MN%}GUdOiP@pxKbMkrP zJ>GRJ39TfI3w2Kl>W!=SR^aO!UHLO^EK6>BcQ3c`=Or|$8&tu*zAZM>x8%fbx+#|! z201~%m+xD-?KkHD_@Ol@CbPF*H9o<)(V0Vo#DZ4ke2{Y*ZY{F|@=J%0=)$Cs0YC0_ z9_Npm!d#I*gWp{XT+m9WzCiY@I8qKQm_R}1le51413jOi_%9)?zZ7eCZWtC^OG0Nq zvV4|8E8Nq=lwHxIwVaaKv9A~iuo0f`#XqcJ^IE92oW;=4kYYV4VS5AyqcVjg*50lbUnX}q@6bdv z!3tFgd?5tx_^5@AHNMO6nG3cMiQ1oinNGReTEu2gF6B@CQjaw1GSQ1J8v2K#hZFe% z=d)IdyIh-=Hh)z6+xMWt)sM&0T^F;}M%&+oWLz;fMes@M6Hr>$X_n4UlNz`8axDgq zkq%%0)iIM==(JGwn1G||d&RCw4nGbSq1uoDtNNzkW)3%9&XN4jPF%pC^FYP z?W0P$&^_Mf1a}Qmv%3kWbTvUkdyD%#5T+4hf!7On0}fI-K2WHZY$saByvm~nImro0 z9bjNHB`W#f*N&6qN?pwF=JTdW9wy7myt=B;r$V_hvbTY#=*H5@#IUo)lrt|AFI; zD63U%!~XEcBPgOgvBliWO7^g;)-whFsrABR*u`g2Z4nmT1Xv-zu)l; zigF~!{xJ}9cKA#ig-vFOM)E^h)FEj{Gq6G?aIsiA@@8?{f@%4xIGg;DT{_VS8KJwZ z57i%^p|#}egH3iBZ|Ge4w;7PGSdO?bnYibPbG35Y)GomQGa9}Xy@g>cLv$r0^5sEc z9cj#x3>sL>``ba`VUzWD<~ijAh@5_1ME0^@GXfKAg&NhqiVh?i;N)9iTmCqK*B-0g3R;ax~0+BjfvFE138~2g}cjR<=AOE7` zab`#1VOCl}a}j~eCe(`iQXsxF2ZzWTyc>g2T>bcUD<>+8a(Fj+q*mVi*2jp}@VoP5 zgWn1Xa&hy+A4ke#wzCY;^36@i)P0|3wj(%AxIg#J*PBskxk`oV;P>tX2Y5hMa`4oW zejDlX66jaE-dMO*&uvT`sZ-#o*|l`8q?`{g6Q7U&Xl9WxYh)>DW` zqb`ww6d#pS-b!J?Cd%I+q&~sJ#;xTVi@e`*TKJYmU)wZN+EA6XsD+NnLBs~de7l{JO@D3RnPs5t@EGz z+g&Vgj_Fv~xiu*fL0T5&H-CxI6uIwF{z;|#weZWgf55W3&>37a#u}TE5!L1YkAlL!Cx_Pmjud;WedFU9Xo4PwP}jOAA3mS+bSwt-IrFTY zO#wzI6igx)1LRpG3K}z4l%MhXR_82r^#Y3)vzVjl-{$yf*ynS7;%`^#tXpEd=A#Z= zu@>tCz7MC)xhqo=*Ta}l7irSV0nYAXk-}@&zmXP z3h!jTC3lF~>0z~?Xq@{E{eMsMKhN~duzp@CA$=e&kYWxOLM^|lsN+oQ8AV!NgwIPW zwGuDsr9wE~q4}pr%}`Fkf>bsh->R)&eR3f}%{lJgCA%6uP+P~3eOfC)LZKIt_4xG- zTe-`d*NTyj#8sa3(UlVNT;+cs#&lXhZZ}NI(+MYi15D4MOee%|s@eV7AW(^c?23^= z`}d}k^=M$xv2*a^x0 zG(#tRL?a-I}0qwABJB4f|Nxq--Vw6MA#B283ZaS>xd13ep<+%Q(Cy9 z;PcQY#IXT!x3~X{v#C3vl~=>ut-Ud#X$Yxw6mBAKWx-FQ=BWvc{3TO5QCCLpsPk{_ z{r?)&f7(FN)0hN*o6efO@pp$ig(NBgWeo)Hl_DjbmU?K?#MBKv!>}cr?>D%;?+>Ia zZocHSKHYDJ(xCt)V$bfb(>?B`O{Vya)7YV;(CA!PqiVIMahoSWDkf=EZ!gU4xSY(} z^xGq>JUgd`lJZ<{4%D{!e6njl*l=>QHI_)Tebd`io=BSKk$}!(hiD;jGqss zhJRid1da&|^om}0*fK5PER#UuY;8{^6^DoQ^)V{G**A1n?#*I( zRY=u>&KP5hoRT~!FSW^y#xLo&AP%;IYe_y&1L(#Ay&FEA#|-Axg$(*sw2PV<0bw_7 zUfZaQE{4q%XfBQ^+Wm<~%lLD2$?LWS{9-9md9rZ@2}KwiX-R5}>*u6$dXCZ}4_Osm zJ8<)xbYB5{$JP_!+lgHmtWOZhhxt4%R=OWD5LzbN){b4Q-QOd#OlZT!Z3B~}Fq`>T z;k;T$boyk&FLJmAPj?2(?R%O747^T#ug%9zpdwi z1MttgFK_3uS7&AM7!C}fKzaA3xyCIWP^8!BbeE6HDjVzXFIfz%iNMJtS1fq;O3`M( zqo|&MP}tuy4I6t14^IzbM=m@cjiK$BAibw_E5*nXl{@IqQ|SG$%usGs#Y7J&{`6b9 zmkofllH47X^Tq}Uf|9?zx*mzf*E!TR?mdXL^e(r#Gbswau;X(%^v}-D9?|_9>bJ97Thj(Wj(;Eb--iG2xRiJP zcLqylLJIzfjcqx);TXTPq-8Og88vOyzrMb{WvQ)pa+p(F8z&ly8k?3jLg>CKEGHL9 z(Oz1LB-F(ubnnZoj#wr=G_+N}QS~@aF2H$+|42R=ZBkUz&cA}`e18?H#Su_xK^o+} z-JG-!ro7y6zjLB5L+5*O`q*K4m7F|x^5`M}Cy&P|`mQc8`GInEm<=t;@)v7-bG^^H zO?rP3SF=*>9^qAKo3uT^cyMAn7o)HFnW+gde!|?_Z*ED=3+6ko`WuxsVUL#Tq56YQEXg~-+A?WA(I z5_P4P#J?b3PGu|CPaC8U?>(%x}oA^x5Kw6{TTz!Yi! z&{B(>u8*&fZ_P-7#t{4BR|lVjWXCWI9iule=3Iu!scZ}RPK(p^h&D3jX$^F_VeTQ) zbZ%{td0_L~@g=Cl39)r^p-W&ck=(C29EBKM+o#jM>HZe6Qk6=5!xc3q;E3=B3q0XQ zG&T+EwExfqmyk(gC~QeLPSgWjyTE}z|2$a4Xi)D63%C`8-t7(tfo>8yhLN6h{gg4e52ySF z9Dzl9)YaNvX+frxzXUygm+^Q1Y0p&DAlw1@78v<&-q}lkxuiE8MtJ2Z2{msu^C&@v^hPF zL~B3Wu&(J#=#-75KJU=2)_72=zIcJALr+a(1YX^bE&r`@h%sPcVUwajeCO@x@S(y& z2mkuGkP`#~(W)_leOJ_@ASdttPds=J31lvhCZ?u=8f7)m7tYu-l!C|KH$hb@%WbPP z_F7W!>sBgydUl?FO_!>TJv=(QbU~ZK75S&!GN3&44{U`j zENYVbg?(0{q=4#*qW1C>4tZfHFh8VJG<{jWFnh_Hzey3PyGS5O74lDg<$C0WlCCVJ z617#;c+b>)gvk!WYKIdB`k-e{sSH(Kb_5LLY_q-1r_IJ;3_36BMNhVYl7PUsp+Yv& zgjknQ)?V~ESjj`g^k2z&aK0NOHNZI)TcR4-J0*wXpOe|FZOzM5nQ^^O?rhZ=f{D1Z z(9253B8~zK(T6WS>FAGUt|azuXL2cg;eeb>?&NYaQ{jJXvU22bD}`sBerANOT|^*S zJdiW3dL`@(-hJU*#C{i~*2%yZ-rS7D{W_xv#|uqA8iHsifEoDg4eW! zut+o>6&ln;f|(QiRXjD|F4qA%2*0V3JTzEV?wraJxk=QBVOKW5G=qlbZ%OdXq~xyl z8&ID)VuLQMDtGd%`C*OZgP0s~NLOoSh-$J{3=L__!k-VVEZ~X&Rz3=GBnEU$*mCH- zG#-=`mxC?B7!@v!lQ@sfhP_fjgsc9J8y@y64`mvnAe=(x!c-pS(}}9=?xm}b8gtxq zUT!MCEAJxb$^-nmrJA<5AZLa;$IqfiIk}$Y zKocw4{fAM+6sm#0+g17LjL|f?9v5e+V=3GTUla*j>)Hs^sLCxYz4(?n$(sEfFi0RO z3XLAd`}ut_A5}Q%_kWrY^jSumH)}EwGVt`fg)lEK5=E^o+k+TI=`aTcP0TBaX>*EP z_K`{Wm1IX>cjr75d&Y%uHqK;9Yoo8bM!r-=)Qe_lNSj-8O)R2P)zhUfz09-Ib>MQ@ zQk#-x9OxNFTjnz{211(1-l+LNk!D45$qFVkb*Na|^!L`zsx zmO_2!zYM5zUU~Suv8m`#1UEaf9sn{IGWspIhQi)gm`tuH%ZVT-y<-)n67}LWn9Dj_ zqdJm5W!UnYY13!G_wy$-l98HhFwBq*!#ocrl3))9D)B~xrHZP4Cb!OSj&Z9=Acn)@#fZ=|k+ZvW|LpQ&S%d~A&wgS4KA zC5$T>oA>X^&g%?WfRZa<*H3YGm%0+~Gr9Q66H@FZ+EoHA&$h~1p4SJ)@JmG&F(#+C z6p&|HM35L9NXSySO|iHXuX?o2K^YUE--z)k{&h~iLd}i%WKZNgujk*X!R0HAyO>>Z%M4EmX>5I1x=fCt@%F0Nsk~hKOaj) zQ@eXakD~{@(7DKJ^4K!y>r7`%ytw>agKf=ywdno|$q~6;QTRv#?FcB{DlVd=dSHR( z=jL^=okhqut70lsQw|7^Cd+vx{`*-^fE?kLO-U^5{txg3K`+W@7y!26bHyl{NQ|Y{ zKRv3UIpKf08=CY-^GVh{Zaeij{s{)dP8P?Gb$EYuXTl3t9_q?3jDXD0vT|vf3NT~AbhmRQSNb&ULo@wOahF?W5I19-i#*3G$!}2OZW9|eXj8x z2%>?N8mWmX4WhL534f|$Xo7qCjf5hn_#;Pxd)rsv`7a5^rYThXp)kuDFqrbVQ|hC7Eo4_b`>NRhkiv}=2#@^ z@ckX__*#ONW?eB-@SQ9mDCoKcBTf}mV$C(H=aHgc)_8S!#ZKGbpl=BAXA*-4FW4!x zUlDVj%8)jU7~LlS3#kYm)}DNdiyIiXj!J3Iocxj3k{B}MQ~MkhUMRcTa%w|U zbhTq+@H*)iZLt`hp6tL}4tCeUUoe#ked?GShSI7Gxav~EbX zq_sXCj^9;hFUTveu}=JaCv;(5eznqVO531c(3j*{k-+SEMBs#5M=pRDu0S3w;##oP zJ%H8SZN|h_^sbuuqu!~LQtKvO<)FD1c4E|N2PcdO6oBH~S7bOH7|4%s0qm77=o_H= zmd?}T;b{YC47oQcEFcXI(r?p#+q76HUm5HHV&2-n5LLXXKrSv&`c#R0L_`4dHK2A;o`tMaT12~eHcble84Al7ybn!bgyhz(f+Bk>NS@FPE zwJ)fUoS;t-qvNfxGJWRF3Bga^w;A&014|P6eyHAycKfr5D-R~J{Ff~p^*VtJH^T$k z;T3sg>qxMHDuzcu*t~nlX2h;v}UdVGO6%)7(%cw4{=uw2H`Qo9u*VCJ& z)7yU!W&TDI*#!C9>ceUyhAvk-aEvaTSnR&)r5!^iar!hO>P>QAE@y0&bw@0-ZFb6VsgE zHqOlIi)usRl2-kg?$;hkM^Sfl-SpoRX(vN|Pe*t?%H-wMxx@AypTqtH-#N|>(PmEQ zhNZhO{w++V&BN8}zfHP}`IO9M&EzArs>x~57wxJy`lIvlgl|w;5lit7quY2~n_US%iVEu!Ba#A)KrW%!nQnt#}*RKJ+ z!%^)IVlpnFMpZ!YB@$1^lEm)M@qF)x*_Em~o;#PjvzJIh{Pms3W0-JY*OGid9d)aB ze?}AVoIx+}iKVAam zg>(*hN%^YUbaZm6YC)8)zA8K^vWH?Uq_qb(6t!^^-eDZO`FEeGckKn#^nAKAa6?sb zp84fnC46SkWgu{vw`c@R9#E>EKj!P%`%^1*8~>^;QhwWslW%gjAS`n%Vwxu9I&r%C zJYw4)!5IrNcRaC#9yTf?p9>V6=>ZLz721OnkJq<@OU8E?U*O&OpT1QQd^IgL{_P}Y zy0mlyIXgs&ebpHy4Tg;}Uk&s(X*gJEV|erj4^FQ3Wb}2N{bL?Wbf++}dbfJ))40iI zoAEl(nyAULtRI+14XST)F67VU4wUf?`M?xCq*qz50tB-0y({RQLpQFg3KX61|2X}c zxb}*FFWQ=Zbel=6KP$3yJD7Di;ZHOxYTqqaY2g(1*-ue6{9D$cA?8iXK@X8--lbci zkz(5KF#qT1SnC(Ye>+FAYu}mWWodhRhMXLdPw?=Y=jTjqbW4v94@N8AoRgRlbP6B7 z)LRkydvc~{V&VT1U30Q>=yrMhwr&@bzq0(8o5}jRu3VyY*dQl(N8^bYY_^CXBnlH! z8c#6Btgwy5Pjt^ym&5Xn1XTk_1Zrw6G@RN z*316Nue2aD%OKCG4}g9qKr=6`$Uo{vy-RkV!F7RYT4xQH+}DPI|9&G=FlcMT+QMLt zp&tH_5v7($HM7Prvb7`TJEZ1?r8&e?RsCK#aLtKl3zI#yPK*v+Rb1vL za%r7Wq}$?42|1_XWsoUr2N%zb4B4~K*q0X_Nxh$vqyE(`JDarxq8XFrHoF7R$_zY%g;VdZnV!D#V)tjrZSlys$$VGlCRdkFNYOg0$yvnao^~uZeDs&r zO%d?AI`p;%`*E@rSq59Mw>?K8C>n2MD4O>~$UlAK^%7H1`ZT9(4Herq4QBc;-k09y z<3Urc%MXsPm&EOz>;Vs@es!;fc(uq9arIvOgkrkBmZCvei&IjR>)x1WbV6Ic%1J_g z8e%H<1+2#xfqjim<1#aeZ^|)#S=ldC5{{5rpRH{dRC6mX0j91sFn&NW?KJQyi zV>)aI=*?oC03%WlWf{PtbGnpLj}Op%XD86d2y?|d`!BDXlTiryWb2-s~XgXOo(bID;PtjXbg4cfMs z6iM_A90w-*J+{a+}hyuP8K#$*6#Z!A?-N-Avrew0}$ z*(EM=#H;q#o{Q})mh-Aa&LtA*h&&CLG7u;IuFf+ng)Ji8UeOU2_YseBgE>lx3nhY= zWx+ga>&J99k7!qm49dh(#HEaBc_GOgJAOFBpy=h{<;{J- z%3Mf#e0^kuD7SJY?1|1Oo6La2#LjCtwW9NB85tW1SUByLnECm=ux0;6lD8ifs^6UL zFdMCIGJzf;Y~Bf6!i=cJCwA5MjiR`m;kY>t9-zZ8~-}P3H!)wz}^tnS~z>E4Z234ZRMBR};;4vuC?*unJU_Wi0PMOxg zTR0(;f+sVaG(j!rY}D^;ky|UPQb*A;H!5IrGgv&Ztc+Up;LArs@yCHblV<1PRWU-_ zzdA0^oC_OEX0P&_Whw^NmqB0S!C$rt@jTEVv*Ja{q4%C6C;Qu=tWYdRf4=v755bY_ z4^g<2OJ$U7>x)<`L~IpqXJWA4Uk*=ys_3nlpNSm`L>M_vu6r$0Gq(k?QVby~dS5Qn z?}gkkicKPX?;ekxm>^0^526RIN2cHfdplv6e$+<CWAn5|EO@oIhoRPU7gf^;}C9wMJrGeT&-vld7 z{QeV+Jng`|-~I?<0%B_B7@4+F|-4c9(G5uIxX>dKNz-7q75ONBgtVip)7 z&SH7>fTW6d`a0JPDioJ%_g`mXL^M@R1-_;W;sPk&xhQqkU^O{MQ);EwysMQ`F&j75d* zeWDv_m8NS|-8AUl&z&m(#bE)%zkOlJ(p<{9!D6K!tJ0kQADs0{%8gPf5!z_ft9hX>r2^OI_Iv4Ye zS2oM<=^KnORt@>PhYh|lB4p&WVb45!h(zg~T@L;p<6sx`%Ecl3A{!{PIvI(BE%A_j zcgk{qCo2>?NllE&1M8YgOylGfPHxgKwl{tS7B`-)s@$p*3638sD{CA#xgMSv5BzH! zkARG3DiMVC^#h~Ttxahu9{p+A4DVMQ+<`ASWd^x14P^qU7z`t&=sLa@?aqCjMKEpG zBa?wC-`(|Ap_iPRvo_TY2hj@yC^5yGazt2SzunO&WqrjBXP?>3l9;~cfzgk4LvSMC zjN;SNEd_W-q%2j5;0;@2n$ob?tT*NPz2p-P^!7nXyHAEP-^yOG%CBR27cdb44>P^ zCD*2Dr7x2uOC9C<$s!#W$5xi%+o(UbKS^~?Y#!rK$IB-FOpEtRP$RReG2r2zA zXzSe=D{74u55LA!^&|an{P|gRkUuSCG*v#y$wd2&WmHkP+)id~K1ug*C!TNq1*0wN z?NIhp+eb?sJ{sZI|F+CZk!_B@ljW*4Gh?L6M*;m$`cuc38L%-7)%r7GRuS(M=Sflf z)rHt-{6G8YtXu;feJfe&aaL*Fh8u=b3C(x)K>J{(LV(cri){g{$n<>~(r~2VXiwfV zcfwj*jWsS8l#+pES23Izg2*~ ztAPU4gU|(}9jn#HVg>D9FteZlIAaBq83qd5;#?X_Y$m}QJO#9lu|Kx^%rlh1?Q6tN zZ??w#H#2%6w%gMB*F3VQNy<5>BUhzvxZQ5y; z4;V6s1+uw~ZS*HxX*wx#gV?OUYW2VEX!~J9qMc_4+g)jG98g!b1sP?wNj;2pJk3wV9{ zg}|ZABGVJ8=vbYRnGVPt+8Afgzx}H~lt+c|EiaA2_*lO(A?#c3^t;pk_WhUBi;sgv zwqgddp68Q`&SjgvnQIARDvCJhlEEwsO;IQ%Eg};Zwrw|45H$&dJEB&J_0gf69Bz#Y zlk+r+cHf5&ez)Ln)0Mu50%L)Vw>WlQ4-iL$;UPWguy9-V4LjiiTj zdq`uiZ~OJ2`!HHd(u$!r?aY@$dTf6~uirlmEz=;3Hwsn%KCS}OvRW#;qe+}}ZTZDv zIhFLN6l9M44Bqi#1Vc)3*o^z0q^i*9?%}4|gIB}rDRu$WCTOZq$76~4AMckIA%Hx> zOEmJ-Uo754o-VIcNekYuUN0T1PbY0j%~}4?5AHFpJ(@+|jjm8uuVW^?24#kQuL!!( z(61-PiLdX%B}UupVy?<(%e_x0$>Co^4LiRN_{Y4xn!sriddGBC$WxZI2e;m=^UUx` z5-03S{WlLu$Sc3ajBR)jZF@#-92!Ok=o8s;u99?o#IvQ^EXI>bX*a&i+u~2hf-wN{ zBrhQ8sJLH1k4VH&QYTKPg|$%im5aO0Sv5B}F%c&-nbHbNWnQ47ON8&=nL}!}uDfRyq0?=v zP+-=Ay0n>T@y0fOfq>DC9 zi|#274|&Kx*!Zn@e8T$^Vt_oN?d-F}*aQPD@>$}JXcAPsvaEOX?@wGFIfG|f7Gq}s zesFxI+L>$2Rs1s-`oLx)pk;NtlaT+{J%pX zPNgv1WLe~Cve5yx@1bLnA0e!YSFe}0hmH4x$Iz-M11xUjw#2f+$?YWL7Yl|3PyIPD zn4(e}hU*DIs3{n*xFNK=pj^4olE8PC)0gr(8(ZwYtE8hLY`j5mxaqPlHM{el;QQ_( zkz+BD>kXaL?m`3dO&epY-3A+UG4FxXcQ<`vXL%a>rZpGeqIaM#)b?pCW1Kw^gx?JL z&cDik;ij&8N*9)Y0`!1~&zZfOQc@K$X9H>zo6YjJY@Y2}@??#eFb^!?QlSwtPQdAm zmRcRsQl3lkfGw~^LQyEREI}C!K%@e*-zE1JPDTOhOOTdr?7fh9h55D%%QEr9zoKTv z3<3fD_|!bX3{zFJ&}?D}(Sr{OR~t_xAftnf(a*1+eQ;KJ zF-)3RDmw-~hhtD`tfHt>KB2QDVx-pXu3^IXNXy?xFHwYOt-ctKtjp@51Q~W5yczGE;WOY?as!4UOIEcwH zM!ucDI~MZY4q1fxbUPWzHirbRb{O&Zy<}7;!*L#tqq*?e3rMp!HcTyB z6CxG>6`N3MaEugJ{f?UcUu15g2}eP~D2xqj8z* zfb_huHw0DC^Gf=abTwY_C1Wv((8RGcAn8hn<@|(~Em?K>*a;1xZ@g!MH@Q}{%zc20 z6hT}T@fOA8Y-NE@lGeJM&pmpFVlwu<)Blh8`7D{7pMlEK@uLkJemH5nv@D9!W)Wq? z-_b1^oB3(!UD0YbnN1aSBxVwI3`m8}`%UAj*$}#wS|Ec(Z1A#=PXg@%m2%Wpa+F<# zW$7~3Zs)Mmm4Li|H;;gBB z+<;cr)`D|7yYyy|}ivTcfGw{#fkcCPRRMb|xp}ol=PPfh#ZBT}nDN zS*%>5hRC5&O{rSe9J{v6s5K{>dgptt`Y9|f8J% z**ZC0_Z!AWd8p(1ne5Iop1WOcRu8HZOHeufav%IV5~SbpaGtppLCMH6jdiVg4;_7Z$OHqB>b z3W!99moE7be=Bi{&!1+y_5(-koI&^V+8PQF_$~;-*{c|_f^S%Ru)cqAc#W;_w2D6v zC-LTiwTN%__}y3VdQIl7d1f|1rvkfioHIp7?gb9Kjy%yH|0+YoX^vq@Y#Ny zB%aJG7M;8>&g7;gL=4Lunlj?LX((E*u@Fet^yxpYY9A^)uQDDDN74aMSe>XN-?PuA zxh9;JY1X+7x3ynP?mwQ-XrWrpO?k0I;Sl^hhaNX?Cv9AGH;^fjXHhb8X6Bb_jH(7C zvFcivl#$d$G`y!RIbuo(9g?(RM?g%n zz3Fm<+1AVvkGu5qbN3HfYm~&)dG@fCK~UZN1Iod-_~IE4K}gzIVgJ#(s#2$FD@!AX zQhJuKXMFg?1m{u25%sV`zI>41+R+`*-PnejqOLZeHp$CoW_IcM#7!a5O(oSea$Iuj zfx2cL@0tFzp~YM#G$rRJ?lx0R!lOSsr*5LYVf)fp6H_%-?kbhw zl$3k<45wqoeY;s&GBTZYaog<5s`L08s)HHcRyUOGkD7E*CuKP4C2gI#rq+xBCwYzq zV=C|Z5p3jiv8X)}+ocrOac(GQdB@Fvzz+&7#jFwP-HP|#=pHL-)FTVDq<71q`SKSH>_vi zh_8Xd3B|xyIiCk>hsZC1TjBOT&5XgVom4OdoL}Ccxr5FdAX}~4RU0ek-_N(V+hG8h zjCf+>uZ!6V3VF=C?3dx{^=iD%+fzy>iSJ@^Y27qq?f2Ts`!Np(f$Bb&SH#UOuhcpb zvfP)iDmmOHKYlNYo0~Bb;lpw+^jwyOG!!5Ek2_}i2VkEQ2|v`_dwAJ@3^!+3xKs)S zd(tnqzp*g+T;a+JzWuy^z2+9mG6GB2#TH0zhsjqpNd%6|6$gC*haPxytdW@!B zjoV;OJ9z^}U<=$#65ZT!OWonH`#ShG!bHiPQwNc1Bah6$!N=oS6Nn({`0SwU>yjTc znMyX$(IuBj_Fpr(A+3@k+O}WlS#1{=vW~URgMHA;B4s_I!jH64+KnJr|8;OIFU#6v zkATy(wEl#$iQyw**|&6Rx>2(?K5vinL+)DfgT;)}Tbvau-X|Kx3W1549TzUDPD98+ z@uX4T8gY%OCJAiv<5%SQVf>}KBMJka89C5qnTB-duR)(IQPnaHU zR?3rc4Lz|f^&R=P6KLW82tbvoWvuP2^IVlet?Y~Q^Ty#4XW-ozh2K~I#3FX0RqNB> zk~wSf;0S`|(2mP+u%7(SV#3cVEo@}HnGZ6ix%sl|90?)ymAEeNBToAk=@ zjD-l!?3rQz?_#VtljN&(c~5rN6ydq?cYcRtUU+VrMC%i70zVUKv{fHz^Dt+4e3sAH z5k3A9n8`wdx)_e1xdg+0FESqV(R_&g%;PVKfu|i-UYp{yo@1{S%NE1?aj?q zJ`7=$34bH_Ke>?;Kep*ih&HI7%C_sGm^$BGR7+Q6$H@F)GcVB!+?{Q>* zhI=gcbN%QAMOn)BC!61dt-IXztFnW}#waZO$yx|tB}B5>%@`pkj>QP~^Lw=V5O|P& zOM&!j^^cQM)_ydl(>JtL!I;If=pJ#Ommb#`x-Tn(MBdQz4&pXud^~F2*6{ccD=3)> z4)K{^bSyf)E(IqoL!&GH& zgh2EXpDh-lWVfO|X&_cr>&Gv^M=m+UzQxLbKdYQbBX;4q=)s^V65Vt>B$NAU$4As? zb{vGxBR3NtLMN+n5+SzqKyBvNG=K@SimBu0y*<`abhoQ@9d8lKapQ%hFZ@vjYG$XD zjn=HQlA+)BN{%_g?DKx)xaPENeldsTz*ubl%DGUM)pJg1GdjZEQG}uI1dnTIrmSuY zW*o!Js6bh=t|?Qbq^Sx2m`A+5@2ULSWyULTTP#301%a55T`A2Im@X>o+679o_(^

_Ge6xe7E>Uq!8Uq!)I+n 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

From 87db5fbf9d4861254d823dd6ac9f4df814e31cca Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 25 Sep 2024 15:51:00 -0700 Subject: [PATCH 082/119] chore(developer): fixup missing documentation images --- .../docs/help/images/dist-file-browser-ap.png | Bin 0 -> 15648 bytes developer/docs/help/images/dist-install1-ap.png | Bin 0 -> 31248 bytes developer/docs/help/images/dist-install1-i.png | Bin 0 -> 25155 bytes developer/docs/help/images/dist-kmp-open-i.png | Bin 0 -> 20076 bytes .../docs/help/images/dist-kmp-success-i.png | Bin 0 -> 19311 bytes .../help/images/dist-storage-permission-ap.png | Bin 0 -> 41020 bytes .../docs/help/images/dist-url-screen-ap.png | Bin 0 -> 9196 bytes .../docs/help/images/dist-url-screen-i.png | Bin 0 -> 7954 bytes developer/docs/help/images/dist-welcome-ap.png | Bin 0 -> 72409 bytes developer/docs/help/images/dist-welcome-i.png | Bin 0 -> 49395 bytes .../docs/help/images/settings-language-ap.png | Bin 0 -> 7778 bytes .../images/ui/frmNewLDMLProjectParameters.png | Bin 0 -> 23605 bytes developer/docs/help/reference/file-layout.md | 2 +- 13 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 developer/docs/help/images/dist-file-browser-ap.png create mode 100644 developer/docs/help/images/dist-install1-ap.png create mode 100644 developer/docs/help/images/dist-install1-i.png create mode 100644 developer/docs/help/images/dist-kmp-open-i.png create mode 100644 developer/docs/help/images/dist-kmp-success-i.png create mode 100644 developer/docs/help/images/dist-storage-permission-ap.png create mode 100644 developer/docs/help/images/dist-url-screen-ap.png create mode 100644 developer/docs/help/images/dist-url-screen-i.png create mode 100644 developer/docs/help/images/dist-welcome-ap.png create mode 100644 developer/docs/help/images/dist-welcome-i.png create mode 100644 developer/docs/help/images/settings-language-ap.png create mode 100644 developer/docs/help/images/ui/frmNewLDMLProjectParameters.png diff --git a/developer/docs/help/images/dist-file-browser-ap.png b/developer/docs/help/images/dist-file-browser-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..e0957ac4dfed929d470e992e1416502331b80d91 GIT binary patch literal 15648 zcmeHuc{H2t*Dh^UUwzR@y{)QF+Nz?hsVFI`ikbyQsJ5oWP(!F8Nvl;w(Fv_7<{=SE z5rhP-YN;WH7=jpTN)S^LGCAq@t+UQLYn|`+o%7H6>-R@k&+T?UdG34fYhU}?`-!u% zFcud(E+!--ByMu&mW_~*@J%71UDx;R6^zLIbtOaaOE}oZ*g&Yf`^2K)Vvm=;xxSE4 zW%7QmyNKZWug7=p1q%sDeEahePEnMQ5fZvlV{%L1?uqO2xafT;;OO@?&6`gTM9`z3 z9?`dMc`0^rAN9hkrZ6LGyQQYH4XMDPs#IVl79=9vHqjQp>ym5%>)ioxE3Z2^=z{A5 z1A|jnAM*+0ZzJbx>us~cdp^~_FR+L0NUI9%v--3}5IT^Fk!W_j?0N5=43FS!&_j7s zPb8K1j6UkEQwmqn4V(G?5kq;yb9H7%+>bnnnKuHpGuU^r7%GG9z{1+Q7d`B1xZLUZ zeo@pfzwoEM`ZLC?Lq%8h=%C{0J1JV3O(YKW1F&Z;7D8^8INDN6lH`?}hH z2YL8X%ha6fd=m+v-pEB*pQ?tV7Hcfk9OamGT*{9b{db1;g>jpXw3>J+F-_f@K3Fhg z?@j>CbI>e^G-Dbj{v#|>>1G< zJa>JQL4r_TGW$THBO+n&hi3`t4;7?3+K_KGoBRi-+b6Z}0u$^%e{!&c>F=h)UqE{PGRI0An`7H4 zA0OTG&p=V5OFtXEMiG@|X`@4g%eCu2Gc?Xi!DE-kn?osuFF{XyX_=p$8-lW$e(TZE zZbwHx1}13AL|eC|J6tXB0d{U!nrQXs3_WUis^YBibJnEKlVF*f(adf=o<~-6*3EUbp#zBFB|n(lu;GXE&)t*H9QIc|Yz;UmsgoU1)1sERy% z`1z?wj+M|dHWK8_A2DJ6PUOrUgZDLBOW_t9$NeTa?c}x#)oX(f^vMY)9kyiajCIlX zR5<{z zNM(7D<;6bl1y}nky_u;587^MyP*GL%^l*vrSv@UVv1MmJZ%pw>$w+#3p|-|9a*)-( z@dI*rS}d{ORC(km!!;#8c}U=y>M6ZyJJ z$MV3}Ve^FE!>nk2tf!u$p{gSNBqX-vdC_RC_=z zyMJeFW+-!Hf`Z_7nbbaBJdR#U7al!qk9L_zBO!U!%>ejJJ#PM2$o; z0-q0XV|Pt#JuVvG-n`E7=(`3eH%y@Nb8erB$xi>lE8jY&SM)ghm`2-e_|DWYC z(I{Qj-l=b;$EnM|!twpriPaQJLfA>~0Nk#N9?A2*KU8Oya?vcN&WlErox*jY@%@A6 z{G13?S%bwXi6Nz&jyFr5bRSKaI~}Huom@4`ITQ);KJ6WGss4~-iw4Z10kChKvzfwd zZ~Qysnqn8K;5=EAaGBXd$A{?>a;hDKYcGrzkm{E`K#fk??8zeg5s?R+)ImQMNu76{ zQCb@JF@r4v;JH5==Phk*eeBAZGypfh34qn44AqwLHT-Z?`#!acAH*QPUdY@36rsS< z!Y*A=`@&&9U`Fq+qRDM5L>6#Ls$buABkID;q!E*zX;~e>o0S96Hy~V(>vGIxc$Iwg z!$Z{iqgj+VoK3>nIO}8JKWZRfxSO|T!?uGw%-V?O@0a}2=~fImoIdgt_kC-ZG0;EOUcD@^$qrYz zv%*}oZSq|i1L~dVpb}Uj7v9c?+ck4IXF>s4BHQXFn5dCS~_v3sv`pV_S#XYqmKxe~jS!n{x zp+^D3|xQW?-f;Q@VaxA$mPq|Bx?2G6(E+jeiF7p&*l0kAfe;;IS*Yz$bS!XJ9 zKWi0Jt7rkCbCx&qm#dwN*`&yw+oAbrzBU#;+m7{f9oOviYB-wRKm<4VH4PcbIVP4@ z44VwW{M%g^r3ef3(LvZ3LOwdl0S1j{ERu!^t}!+zjj9|<2xThLX%0=>fAs=T7^P7DkHDjk@i9OC490|0_z43vQVkG(QzX-92Ddb86sc30_1t zT7{OLP0aBu(Y|1IW>3xMnqE=Z>q`hfIyx+`W_Rg2B731^G9`}M_aCV*kuHc`J)GEN=|XJdXcYxk2%%oN@lKwA3L z^|&DoKS@s*ykqz{rvvK274TJKbmR{RzJbiDehZJ{%)H#j^Lw&a{L+x4-AC&^*YUE{ z(S`O1_QqLgM@B89RGDj6HV)S}rnn6G=%OUhIC>hzBClD<<%>qAg?3rJc@!FH4#y$Q zkA+t6Xa;`#y%%bA+oVxTB&&X9mSDJX%8@4LyhVb;eC)jxUwrl|cQC z(E^t7Jrv+x=T@iPwRhOHG`?S(LRROTi52JeiavD5h1%6cae2FNoKH*7&j2i4J=4Zn zO@qPa{bK`F{VJB<3B-1!SK1vZhmg^96e>zg(X#FBCT(Ki_(19J0ONISU1N$-O35XA zXhmtxb}09On@j0mH@vK0LXs+2$xuD$ize<$2=1$T1tPopR{$+tPWyU3yklg)JqH!m zT0NVgyVq(`ML&e^)&rB-dQ3F=6>g%O_NafZh&+OYFJDkrQT_;`?F=P4mzNm0-wr0 zYsd*<4-L&6B})>NN2beV{Z#iu;p17Nqs@_cM$4fXyK|%E*>!<#h`cZCo->zR`K-0O zoXyx6yxCoaf5>%2JvrPDhfi^KZ$XcjltXRkbNqs(Z^4mL-;v&AH1%uckF?$=BCQS^pmj0AyNC)*Y-R=v4UoIGK#;ix?Jup?Z zHTKewb3$EI^;>>f)^#-8Iq0#Gs>%Ml#?dulHmWY>Q0U*b+wR8sZrbN?;!P!98s3ri zZx$v^U4b7Lw8XL-m0fan=jm~$tK()R2(PXg&Tq~dopwCVp4-oGzTfqx_2OOc?XXLe zJTVz~T%OP64v6pzh0@u#0Y{a`h3<>KA7E}t?z<_ZZ%PemIk)S;%{T9u)Eyb&eW&hZ z0B-*+q;o|u_E|8Y<&2QtUzAFsF3jcU}^{iO`LTa@B!0aN$1C?Y?>e(-$l>13jG$8T%VKRJCvnpS;a zJQi|ViWPn7RcnRO*L700f4B_bAx6op=W^*v+oYN74^4$AKX-_ET=<+qt?O)!{VLb9-tYVD8C%;iz~oF|$3Yb|m6B zJvLZP*iO4z|dNn}hd4d8Oh@uMHt19?4x*l88Il_*pEh;>Fzabl_nm zgl?acNa8P1%1luia(gBz7P)ULH9EVOK;&}WQaq27)u!>gaNEASW?yxsW(ja28&~vc z*@e&uZHlVGxZ;QbI&J32taKX^KB}$;6GSWJ*Yzg9SM}YLR9q&h9>4bz-Fyj0rJa$! zxtmR@JStwbb0*{aGJGXK`9{J?Q$c1nH`g!YNZ1YDvVsTwJ`@?Xb;hh~KKZM3!5wGk zRI{CzHSd?(WYWnHO}fj%)L=$vZLBhQTKb6zF?y`#UOd#-`lpiyYLe+Hh3Vm|FRgWk zRt*LCPetn^D#85+9PWE(M#G(n&PMc4TeZ}Ukp<6Kre|DGQHyv(R@%44U-JrULtYe8 z*x;M3fz~LA_~Z;4-l%Wqhc&C(KSI-i(Ax zgr`7#+``{8PTfkEljFYeY^wO=8|!j)1XzgX)#Y94Q>G%`6zd)vNqHm*+43=sDjb` z-Fl0Y#$oV>G8=cCIouXfXoBL@pvtEqRGF@S7s>+$%T<-+_TUsbNx|(mNttX1Kz&TeO7dbC&Ni%H@6T;d@+QiO%`nu&4gJ%>rlVg=H@V z1brwul|KBp^bt2+L&wgunQ00An3(9r@za>H-2M3{{gZRAxgr3Lr-OJu8Ozn#HA_Wa z^CKBZl`!+!cqW1DwDmZG@!rF}!n2AoUeVCy^gDXJ!$j|d9#ojQf>m6~i}i9g!hUYw z@p2&8Fq;BV=9x7lWo=YB2=1b*1N-r}TzbXCK&xoq)*@u7SOE=ttX^_&qC7k(sfoXM zjUxJF!X4^6nU5H52NdESD?^aDUK`ObMJ6p#QA5Y|nsIJ=Be5$)QPO8zx8EbeP9@0| z3VfdWwI$N7k~N+kI7#r_rt^n$vX&;t(Zer3LB^86DRfn90%qP^IhyF^GBPu<@$l-Kt>z`1U^49!s`BfT1DkEpS9zz0;?X7E7V>txagwS$;=F z7d&T`Q5_^;$m}eXQ^S5TY_zU@3?|#wZ<-_J^()|5=x=e`rSi0SGNz}Cr8wm3e|pZp zyUbN4SlFpukc05vI2;`wwER^=LuNy;e`nDhYCDrk=N$}|qg;c9VbnK^%)0#*4+Aph zc7y1pkB7uY9wwvk8F?&q+a>;xbi-=qZ|2-c3O1F}Eq~kheO=H|&R=Z~BSwFmd3JWXw zZRB3GJBY;$c!13!_O4tj_;3_lLOqgJ z*TeQ+GL^2oO3wF)mmJ)A?KHg$@+>Rrv3X=GFv76HC;RiEbN4dNON|q*a#oAg02OEl zWm+;R;MLAsxcSg85gH6hnTm9%aSyAl-k)6dFdz#5OQhz~h&ukuu{KK@$OF3@-?jYW zsB%wrn*Z>~Ufk0~DvEU$M0@ycGBwl%dtAeZ>4bQruQS%gkPA>{@6+@iCpMr_w&wSj zU*!i5DyD6;??x4TSWAXvHhhW?rdDqtz`qYUzkRznH?%i$isw--Z(s1wM*OC!lA0_i ztLE|ZE|ANXdygeuEF$hD zl-8xGH4s*M{%tz$ArkC0f6}#GuDbU|V!BL3@+0Z;s?p`s`8{Tt^9>l*V#LTf8Ge_T zo7TjXMnj+_9h?kmcu)QkbgS-MO5pyVN)kGoR0X{A?~l77Z2T-@Ghhk5xv`S57+OtR z&gXgWpsouB{n2i$_WvFR9SBb@WTRmW`$2R(M3NUBTy z=%i}|ED##_ZacUvQhp;hJD^G`^q(goAf2B;B?w4|PanotKMpx(Z@wS+a9rD-k@CK~ zb|~C|>ISj;lDR*ADW){OG%)MY&ZtPI##X*Lc$6yCd#nlE&;$w{hHW@E0G{NYub%7j zn(2cf@3`h2=tzimFh2>5MctH&I3D6WRn{IN7OiL8wX{;ci@+?c58ZzFg(p_RvY*5V zObcqn*?l~HXr<|kWX>Z*lD(q{^ek)KKf*H`8l-5OtayQAE0#oeJ&OwnQ%si{zUCxf z%`f$U<~yI{xN>ofhKMTJsO@t)Tk$`c+jYQD&c=rCL?46sL*Bd$M;1=KwGRxlp`<(Q z9^FQ}ImJX1WaW-bq=#l*_(!+m`l1e6Zgtnt11;L;QNHgh%qK|!DP>45es1ap*%0j9 zW6fNIvPt==k_qn$M)HG~?OM@yDL8XfQy^r&Tr}0ttn-In{pL8m&m|5-QU=s!D}_A6 zb^{&K8Wu?>=d!LUa*r*5N0TxtN1ZfG*9LPXd@sAc^*IbWTnOqvLaDgEmR!T<)qaQ$ z7KlExui)pR~1D@(%*>;RHr$RG4}P z75V@y0Rh=;*kB|Xypzy=wG7;&=ek-YpXkB%F>b!67mD-)Fi?;v3(k3%$g6zZM6Vcl zrk=%6^eY@Lrbl-=wlSCL40lHkKNfs578 zE-83mzG@NJ`S^;l;W2fDt>0US0S%{FZaX1&ZzZhX4*h!$Xma`Nk!+GEqb0EpU8o*1 z$jfywX9CO>JGyJH45Sk+uIKd-yS3I%6_IqILksn9!Tvf5wG_^Gxdd=gr=J*_-mgUDh}P;8=X+(;GS!1c;txot`iKTLT}AG*%R$&0Lhqhm9OL@jYE}>Dh;i`84FKct={B4y=U1#7r%v2kC zyX$C7i9|V2f;N7J78IdITP^ErcdP`3zwg8@0$eLp6L zBGb;%$USXNx}#HZ;A?<$r?Q!lufslq-}8SVC;T4-2UBq1=(i=a7w5KjXvQzuDnd(7 z9*hL0y$_dzZ+;@U+IV^vd3bn?e7_7b7}xDke;~AUG3r^`Bae>M$|{deCoSGp&$K|3 zhY0p*`*N46{mtSd!V5bm&j3$7l{Np>@gZ*46`hTDaQ^nZ@b!R+Mn^FC(tl2W z{rdHiP?<~pwg0>XqV3n5?+Z=+ck;`9(E{4|Hu|KF_M+xnWkfNOK-F?KNPE)<2|Ksv zl$EJnsZATo9z%V8-Woo$k$<1F)-LBa{Vh(*y%-_&A_Cc?$N7~VK6fnRin~Fsp%t>} ze#5u;_B_&Wv9A!GS<-42MJeg99bUi} z2?PMQ>wZeGZeuyvqZ;sF)!Vbib5Y5!Rsici&f0(RG|y1;>C-?P{Pjn{YF@_C@yyk) zk{mHBDPq4Rzz?@nm9U6f76T;Ws3CX(%9!8HC`Q89bMslp zwL`osfrvc%#qQDuti~sVV@V*acP~R+W ztle_kR@f)yh#DSX6^bni?o=z-%<<70h?lHRX!Y5o>#Y+{X2dCFz?h+8OF6fengGfK zA+01Fec$%+0&L*d5s}PGI=akG6~dOOC9uFCaI7v+BY5sEqU%PY?UuraBLaE~5=!?s zPgsaV8zi<`jti%Yl7o)_hYop4$)&Eh9M1;Jg*+FPtPSqgx-h>`anhk=v1j;pi1Xl^ zm*4WgiPendp%lUx1|(9)Ujxe~B_ykCA#u-RZxs{!Hp7(MO#)@7JS7 z4*?6z!#B2C*lcClzH6eSRZ*p6A}G=;8etPI~(P z7B2ob#C&)3vSTwtfWGn#C-3)dt<8X#2jN1kc?a&E;R(Hn*ZaQ^xc?6k>3`m$Y;xCQ zVxCdzr%%TStm4_uG_qi)XIP<^6QosY1>W|J?$@-vF&``vxO5~I4K`D1P{ucAVG#d=PEgVJ_VN?hKoo)9Yi}|fB*iy)dX0i=h+FW z%j?ga9F8>+`3Elf@JHWY9}67qH}r>{C-k}o17d(Bk1>?&L2NM|H0f))_54XF??e>`B9_*{Fl3R z=+z3gMO*PIteL!`)x(xI+yy|R#gYsEeee%BMQPr=1+1ED`Rx96DN%FcRWeUey#g7v zZi0yX_Ud45(5z|XVqu!bCl!^()oA3zAEV@4i`rVv3`g}?SXw3nc74b^^jGtrz@^-< za0d7Lof-dHrog}Tu9(``i3`xZW5?rSsbgiHBu3zT;}i;{qAAE=wJ5{C3dS61w=Z*a zKYYPrvuoj`Zp2njx;i9PJz!#tRCaF$iEbVaqrfnpUFq<%bP^^*ZbyJvBSd34KL?k< zw)6ULGUf&a&*!V4prCgIJXF36a9F9IKS{|H09u(`@w`z>;6|4wSwz}p68!~TfgfdW zE30Cy6}5-hysgIKC;U-w-B z!xe5Y#?e6ZT)PkdPvGTqe0rm_r(d1*r4E$pxrB{)NK+6O|DZZ_X_#pFJXAvbxZ02H z?3-~!IipMdX`s-1OMPZ4iGoq@_wJL;&ng{U!{tM#<1Ty`#N_0yF9{AA8h#JnU$9K7 zznL%|O7>f;tQ;;a&OVM~kep{&4=M#;Olb~v6cH&fip2W(4oWHs5lpCiXZp@<^hYL*JPYc$VXo_rikzWi5TOL(sjs^E@ zlY^RtMZdY+=a9=I5*IBqZwqdW9gdZQe+(waxG&{Amxu>NF4w>_H8%}<5#yMl$M z3G*rh?lj>Gds-}LYbus3Di?Ks92cf3eM-Y`v^ukgq}H&yhBZQFq@>I$ULP+PFe2{3 zF9QPunP+R*-O7`&n%P}F$%lc3>C$h{Cg13DfaLX{+z5C=RtDQFlDV{q1~diSLZ%H5 zm0Y^Irn{+aUa`PCjEo$1kKNwh^P#|oC^}3)AP6mrdqDF4$T{B-oYcJL=6Unw&YBJ^P(niKdaU%x2d%R@CGJeED*)3 zjF?A-I)t6&-(wEeksz>1Gapj7p+aU#TI-!WJzluE$_3nQN)kav0G=qi8Ts< zxJMH(C>6+A#*&=_nr4y3&kc#fM@2Fx%#as|oKlmDvv}NcZH8RM+0N}QX(BB@yeun5 z&ype_;pKcC*RXLY|7uRbx%$K}!7`8Wj81V^wF*=oi7cr+LRqgE(SjqpgL=& zdP?y?$f3%GSKbehInmSHjUMc?-J)!k?ar8hDK0%XuIN`&tlmsth%(Z(EM8d%z9pRB z?>jIClxIyommJj>mHl1p0E-=+dNpAzeNaw4*KsRrtKv(*5C)||n|cJcx@9&tcMlz*q;cF8XXh&MNS8`>f71&ZAF$xYO& z^g(au-%n_LU{)G$t3D_o;*?)a0vzLceXysJqb8q;YWxMtDM-0imPFl-ildW*r7fw5fc7zUfxD{*G->WLc8`I z6>t|rwi5I~#XJ8U0gA3g7N&Kd>fJ^g<=P_SHwJ2^?Whvb3-vL&K2IPE_w}bunh)~M z7|CvGU$CB^j#J*3V|!DLUo+&oF>}Ugm3^9EF+CXmguR`ykheDuz=&U%e<*Ok5U%TD zv0Kf;hvQi^X%Iu6*e31fE3gXWas#cLU*LC4H=>$AXg?Xbwg23?zVL)}m3joT2>E+) z%!JrD;Bzg)O{sXyfvnJFp}kmO-W@YgdMgefeHjz-OdMoVa&hyk2x$0Gq}>_e5-C?v z&5&+4{pS|V=G-PoVDC?ywvVQ^ip6}L(S-%-22@Ilhcf6n4BBPZLwo}Ak$-DpN2(7c z7M52NsTUqM7{n)S>g{kh*1XaYNfxh?^ui)@@;e0&tB=(A6*8g}GoeX|njvIZuv7P| zH1@)I3oRUiwwUaxDCvz#C|@|M zEo!GDo0XP+=K_{i@T3bOQrqp5I7iSkcF;QHht8yeB zo`GQKZG(`S3+5T5{lw6GdLhboW=C26(9x07ZmhJnOZdyyhD z7oVwkjXv+wKEl*9e`zNx=Sev#KD8IiYHrjL=%=?ZF$e(<52(teeR~Adijy+%DPBFy zV;iRUp8*Cs`R8>a7Nu45z*kYL)zL0iyQiK6g`5FIl&T7Wx@) zxDh_~HTE+Uq+IHK?k#vFIT1t!NoafNU|v>js{=W0A*3`vNxK74dlDg_EWE!KiE%tI z&-;_Y4d}h==7i9t(J6(x!FX$$!djX+QF4DZY(a;1{9Ob_OcaLQ;ShEo#P&qo5q12w}|kAoRx(h`WwBjPnmFA@5Jo6ifw+V8_C>E zs|`}LAL~EPm2da2o7#(TqkT~3 zNfEWrIZ3;S{0^W6JuYu$Vk;WgJ3gYz9|+hGsN17g4Ovk?cO1~O(!_EF2)dOrANaRV zQOs!Qg?Aor7i_!);lHOoB%Ndg%DYReR2Ci*zqEu4VBLG>$Wnxy5e#nM0txmo02~p ziAdi3EeZ&u1M~y)A>;kwm8drx>6C-K4>p9q9KKu=vUY9C)(D)Q zt+};1WMFL2@|cXK|55-%)}iw@J&hCP+GJ0;cZh(k6((vQh6N-hxFWao*m2%=jI@HB zT~_7_F-Ya3Iq-|(PM?Ve{RXcsnn`;rPQCXwN*U{N5XrH>%sZ;#bnlkpQ`h1^>S1Dh zDU0+SbVxM3Rzw6it-iPB4CF#Cy^x+m(K42{d@S_>nRZCs!>Gr6%p0nc9xJ9NlB+C~ zo2U#XEmFMC4h#l{q|laQ%3Jf#7fFoW5P%>2Ycf9VR&EaCypyDW`P8Qaz`s7n{_R<-mpKNb`w_6CW-TM>j6KWf?Y*>w_Uee8*Ym~6? z8M#d{rahmqeV)Fiy;?l0AcpmJVvHXOfb`C!JLEwPKvr=>!%KtXg zVeIzV{Th$EbTg(&8HJ*nD=yvh%9@oMvTpW%NTe7Lzvp%OEtWiaKq$SmkHLH8nxAMs z_)6o|g26%R^S-yXpcD2fU)YVc(qc*?FLoIYnc58&95p)EfPq@KoOMFvsqPICvU-*S zy)E_8;EuE?F{*$4Rp?&u&x@;eAoR4Y+=PIx(K+M(^|MDIBUOb6SAi(SCFE_Fvq&L= z-e4|pb)gA(m3l_10YjM2J2j}U!cYJo9|$Oh>gP%;UC5Hknay8}S5D7Gfzs~ux9Q|1 zz!qTn4-Ci&B$=2Te>BpC)+|WCsB$Vk^6R$Og~+6@l7J;in~S%ADT`t^n<80BfQE1| zm3lwkzyzR^7`iHNg7CU+^b$2oI4rzx&+Vyvyf5&r_Hj(Y!8A4K!4jGwkA}GLrwJ~a zx_i&lTYFADy?^kjP_)s1@`6*2|8l_I#@_y@w4u;}f^(o909-~W`dzhW*YQ7%cMH4! z>*l(Dp*{Rp{doWWm;a_=@!uQt?+yA_4XyvSkAK_8|7ZJn_rQXyA+$$+QJ^-;3wB@O zr??=RoFaHFM?&~vu3lt!j;B}0SG?jq-+lf_f@NId$^DbgHU*34>Ki<%G z?b@}Fwkvc&#^19M{&$R=fXidI#<=LX!x!eZkH2h{eAu3p*wfYelcsBM+-=50U7nD_!*yEvx|iqZY(rQb0XLJ&9L|=L8gSn+_>gPgQdLzojcqj& znhT;gu}0TtJ27Ty%4=7LkM5N`=_{zDzNU1#36|nsyGisl5%T{T9QG(Y^<}Pj?8yl4 zM(Z~Ofdr%4Gj#394d2qniRZbKQye-Wxu+$%{-}92{b1jLC=tgRFi=LI(h9UoZN0r@ zr=|$TG*+y_@dYl@GZm;|<-@@%4ix)@R}SFY2|3P6{%1h@iHT zKrsybsOn|GwV#rjRc}re(-TrvRb4L0PpV2)avmM451x5gsZ>~8OnxVCHq8<%dTu2s zswGf%$4eSNn<+BS@Jy7^ter{H=@#g7(sBuY9s*r<%~=Gu*=II`eL9^sPkh@Ot3z*8 zg_kW^dSyZFvwJ))j$ILm-&>i#D1t&w+C1c#n5OT~xLyHA{mBn7oDl;^cAY5NItD0qxOcZ6SZ=E(i)C2ME9`4ac^W9_NM#3SEMlFqX}C^ws6%73I9o6g&q+Aez6X?3eyya%#{1 k^-BT&JBH@`;>#r>T}mw9uly9e)huLUWO1w9;C}S~08#{Vt^fc4 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-install1-ap.png b/developer/docs/help/images/dist-install1-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..9150ea481a7e41bd69149e6f00f243f6d5a76e60 GIT binary patch literal 31248 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-install1-i.png b/developer/docs/help/images/dist-install1-i.png new file mode 100644 index 0000000000000000000000000000000000000000..e4632eafc93b5f6d132aa511fb117b97ea0d52dc GIT binary patch literal 25155 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
Pr`pTslAh=EhP!tfmX)e`En)4!ap!{oYFt( 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 Js8TQw`X5F=bfy3R literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-kmp-open-i.png b/developer/docs/help/images/dist-kmp-open-i.png new file mode 100644 index 0000000000000000000000000000000000000000..a6220a3856262da802f2a1fe9b58b3eaec888695 GIT binary patch literal 20076 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-kmp-success-i.png b/developer/docs/help/images/dist-kmp-success-i.png new file mode 100644 index 0000000000000000000000000000000000000000..af1108946b9640232a059aa005816770cdaf6f2b GIT binary patch literal 19311 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 WVx7c&;Rf)KECx?kKbLh*2~7Z^G^qms literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-storage-permission-ap.png b/developer/docs/help/images/dist-storage-permission-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..0deb5cf41af09c0f33438ffebec1d41b01b11ff2 GIT binary patch literal 41020 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-url-screen-ap.png b/developer/docs/help/images/dist-url-screen-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..bf15950a5b17f64e8074caeafe4a74946c061e2a GIT binary patch literal 9196 zcmeHtX*iVc`}c^7#@2!&NkRw}#y&)n7_#qU-$&N5FQufiRYG>MuVWkgE`*S6m>Elw z-B`j5#+d*8eg3}}|L1x0Jg=YQ`(lp!xbI``>$6e0tsre0oEqLxjP+~d?X3c?{FyixvNvRc6Om+zR9U0`{q>5a zAlPOE9(J^J^8F(pSgi2bH3>(p({Gn`e&~F;m-A~;xYQeC>co~_7%C(xI>f=o#ukE@ zDAGOKSBj{^Iv%0IDI51s za!bE!R$KI|<;sP8>OhA7+%;1BWL3z~--y9=3&^zfs}rw2ZjNsIy&-9Fnb`M9f_uwD zgIPiA#YcAWijX;urAIk|260NKhbLCl<0+ZhU!AYa`?ecbGLHl^18&7BEq}3-`;m|s zyxl4dJza?6=`~j@?A6Iske#!tLzuR-?)Gvu|G>BH2VAlz6YA?f)M9@Av>q>j)m-Fz zY@(r|ahDS#qsSh|O6(C2yPpB>Q2z43;r%~vt+mcEbS5z)#V1ZSU(hmFCW;sr*ai6k zgWyNPPkq4XI$tf4is-~vv)0z`RXyx$&qfSV)-;M>Sm1?m-jJY00E`+7F{k>uAUC;! z;Kam4FWlOAVWAz)`Q&INYhErraHG6_vtKZ)HXeF>=Z%$fO7HH#O+|s6$1axzwPU*R z?)8=}mWelL@5!5$nN;1%oGmUYdRtG3I{30$L}UFcmPZN7y*}qsnBnNrcH|g@s-zI{ zBaTC<4%=`^s4`e4JCp}$_9?E>x3VV z%an0uBN~^IcI!Uepsj3cYeT*?wnQ3ka(#C;S$s4u34!$5fHr!I3o~6&?WaLO;#Gio z6{0JQMl<$n)M&y@%nbL>N;{lx3q=1vZO?Kc#nwp=))7+j)pwg(*;GcPWKDdDH+5xf{DDIZvJ_j=PmP<=xrhOr@PjkjI8btTYs2*nBbnfMWIXUZ-ip^Qt zXA6Zqa?UO;HhgC`t`XXC9tVnM#Cb!Jt1m7nxi^gFsu$XU%5+LfOBYAf(bW4izJ`@7 z&$uee%I>zFw+_v<(ipWe(4)0LKi7%)d7i$ky_Q+Hq^9 zaaWwbMoH9+E!4*L+uMtNfBOadRtO`k6Ap^qZwhxm+cw~xY>79 zbZL9TM2q4OD%^LRO2gwfZQ}>{quzzn?4RSumVrx&M8GBD&T?3=T3K1CeE4TNj3h`? zQ*eJ7GEKZoYu)`k0{Gk!nsatO6Dyr?1?Q_0Ahg zla2?`-MeSBg76OiIkHb^r=CK*et!#KKm4q(ox{S~(V;IcY}g4RLXV@YX?q{Er_^mF09B4qPdcXOFEvtA}L&Q#2tRJ3qh_= zOmlpR<+*blNCi&JbR-Ad8E|_ELtpOmg}I}|frNp($ggnFVqkD^(RkQ*SxRKPWiJlE z(44#1r3uk?nui<^>(rGYp{Y8D!q;~g^6r@>pt_158|&&`bPGyF)#nr(4J+(v$!|3* z{+51n9DQ243T%B`XA2}OD;l}{%|i!Sqi$PG{%Y z@UIzq3dG~e%02oVXqwqiXP={;`@)Xb1i0jl!cobaFJQ1hydT~+_-JYQ5Qo<0d;A9x zE&3iKL&p|2PkCOhxTmF0pPo)=3$CL45p>v40G=nq&74>iC!801m%9A!RGZekLDD~T z&rOEA#_>V|JiT9-)ZO(6-n@UOEPM_gn2+s^>F)`w!<9_KL($lQ0dFrTMJ^~bbPh^c z`+E4rS*~>o%q|(ZwDh~Ot`w@%On}^hvfTUGB>A$2k8EUa_?l(MyP3Roj=UScp~8B% zek80;VN1bn@s>~I{NJU(;GNFLT&q<0m>Xb2L3rfUd)CdRx|K{r;&;B-sygq@Dk-lS zc(5UEZ$uhdEL0Jf%2^XmnR`qraFlbdIBlPKK(3QK#Pr_#oa(S4lP@(1DmWN8~ zsYh8A)RpX?Y4Y`>%re=+i1-V5hh*>OrKIDXC(s*L#oJrNVyrGE>2qz5WX@ha)Arzb zGlf`M?N(7-UtV89pOqND$#a_1`#5%>hjjGvJg4eg*QWQZA#A&QlZ{CXjGvjMl+WV7 ze{5vc7U{a!h)ueS?dXl4DwJ@NCm7gJN#RIh7no~$SiYWOZs6{&$9G+>*1Zoi3g7QE z5*5x}GYEcm$i!uI#jm5}8Mv5bu`d#*9BpVUIF5XtSq%9&c}YEPB1j;9jdP1QVy>Ss z@!+Xuf>+6;(CZ7=q)NUMv4vw{Wc<12ovs|eetriV#BiK^#Xx4j*M8`Ur`DHt{^9up zWUZ6~x)rA%Td>zqimIsD8$ngkvfM@Y-2jWSgdjAtKevWtyryUGl&}nWJXnn)nHg=(+ z`Ek#V{K9Ka`I8-C`NLnr!Mi=ntTC`0h@p!WH3(Vs(6EnNowv|?OhXD_7i@KF1xtQ& zfg+2{hs$ZAHgf}4!;X92)3TH?(&%z!S?vv{W38&8sH zCy%3kX>{qJ9(MZTT%>pr#?z0v67gp_CVHlFZl+5XkHtZoZ%Vy*CNU4Ohl4hRED3W1LcoR@d6-!zW!O+&QT5mH_^-57}?uo=lA@MpoP<16DU zLMhTI&}-)~k<2tj%UDIyZNpEq{vM@E#l(X|)aTcpB21kh>bX3wyHY9hu{jWZk7$ni z*B^u#UK(6Vl|}-@Qv>;k;%wLZ8NVGqf5r7v?xxbI-4_bJ-4KtS!eCcNW%1AD30F%r zzGNUVzbY4#Uvn!sIb~U1PSr}xF_pVBVfMH$!=;@vpn6%vbZdW2mC$}#dS5bQL$%0g zI=Q_pi_#yN`bd=#7cEx8B$cE`9<)l`+#fI9)Cpg2yjJ?bv@-j?mKC?(>isH#;-7l4 z8YsIz-@O4Y;HrAr?-61Q9u|lUm@BzwMg6xt&^ z*t0Cwkzx)QF%Nn4d3)#=MUsW;bnjBZ#!oh_y=AGWS5E?q9HgSWa@_|$>yd~3OKd;5 zQVjOScVeY07|+LCB5zo!V{_v%Q6I|RZj^W`kY+j;WL@pP3xAnZC*j;;ZGtCW_eFRA zE$!;ehtM5lS8np|-u&vh9xJ&Wq_*+t$?-=v@AKF1-MPW|B0hnc=8i|p$IWuw8ZLa5 zEdq_!=tKLJy}K;srZ=AOip6LpM_c%|{O8mNCZ-`5LWhb^{e)OE!hZVN`6#o8!*L1^ zH24p|+{g)Qd^q*t?$Pr$Sp^M~xUNTor$-}EZ^&vnriPc(+7^4+A~T?YV>Kf;uDd2W zK-`iFbOl58iwt9{c}_ix2-TX^&~-Zlrsswe_feBbX?TK~35lZZV8z=+ zjj?LE3Ul;9TUnsaaU)94ExapDnritWvk4MeJqu`NhCx^STRE&J)?Eowg=LFPYyBVLpAbmv1?=^)4}l zZElJxQcrk^hl{xgyt^ji^yK0~$K-Y9$3YU_3pb^HFv}I)mQ+JCyD5F13l{efZ^@?p za0bHTI^wWPnOZr2D6@9yg=w}+JFFRZVIUQmLJT$iTJXyWD)F6NbjFqD1z zak~*^Tv?VpyPc{MYrvbtBGtTZvT<1o>&tF2u0XQT-~44P3L7uJYnB)LA^zpQ7W(#P6F*@qg|;e<_Lyu-w z-m3;AO&c0dVwI>q$Po82;&peOf*Ld$Jw#klim%S_6V_IJfUj#b;lewn*>fA^Q;tbV z%wP2jD{AGpikP-Xv!5+;kLHJ0v9`io*J)|<2m3_bQrmVP7rqAX(-6co<-$ED4d6|_ zT1D8~QW<&gnr=a?kk=kLnLRhZTuj)lTQ-<-8>r5xS=3IQap9U8x==rWSE7uw2LJ8P z8xK1T$zXGLCZr7>cT6B!4lp@>2a^uGjOvkVz2B6_Hh?2>8-!F*+iI;J4%^SI78A6_ zwI^*pf?;@)bgke5@_Z<>{p^QoIYt$2!|wxj4*SBd&zRxG_Bo|cbuS~-_ngkB6Swur z2W#4O-16=1*p=+XI-QU;%^n+a4D*Hs0?YxyTKZ4+IG&a`2d+a8S994_SZNEo)nQT> zq;%OXkmj@Yo!!*OqV!>gOit*^JpC5Y&(%Ch!+wlX@*{GkauA2TBPNw{wRfMuu#PGa8R~3b;HX-ne`%>d_!c&}U`gn84eO7jgp4aGvJ$fIwNmuB;R(Z>ea&Z? zm_)-eYL8DzZq4ay=Z-a_EY*{rYNb4oA#xQ{x3XWA*me}lmVzyj?EAC+2^j%oLPDzn zH~A||h2MMoLh<(;SLVGnV~0``_vIZZFf6}h6TK-3-93d77{ZU{Mt2QYgq4L92|-Lu zO}(6f21KX)79iS`8h&YyX8)bFCDw|75(zb}w?VA+frUEDK;Z&sUSx~gi_U^hA1fBNAEzeh6Env){W9P1h$Z zpBdzl%6e{uHSi)5z6Pi~{q)LMmlNS`;5PA2+_bJtHWNJ+#K;4;FU*2pPF;0jlX3;0 zAn@UfT(7$KgN8#Cf|b1UGH;rX{K+m^nS2S8vdExJC7!pOH_i_CZD4*TuUxknLTVNn z=YEv6{)ZMw*Sj~Pljc-)cy!)iG7w`y&Cy5S-H$C7|IzI#KO zh~3|gc&DsSthe}Vtyg7z*J2{n_O#MXI3pYkOyG0O&<5P{a5;-SF8k*gNrhj@kZwI7~)*>SZ0_U!%8@nbkT2EHottTi+}1` zQWSR`0ZpjvzDZu>QO5%bH}0ak0iL`qh|-*D1o*t&CYME>7TOk;1s&~bD`PW#jeiH3T#N(ms+*mkRaq&P8GrFq<7 zPeySbbw!HS&HBk<6DF2@yPlxjj{e#Q8yUK@D$!zT9vVmh-<`Gy30%pjBeYE#@e`wz zVq)<6Q*`SwCjb`szRj8}QD%~Q&*fXe+m>w1*|;~a>?BBQg$Wq7TPg6ti6B@SL;>-N zcjE;AU?)ckbkJ#BuBL9qRO*-O7~Q2Uo0DM*kQm2NhBH!z)fvVVf7AA)GLunTyWZ8e z9zc;qbQjNhTVvJyzsk%SRX4GdOmKHhELBi{-_9pH=$HA+eP_=cZBAUAV2kn0M-DK7*s zu}yx*4MJPo<@MBqTAKSFl%_fw4sH)spV!MlPBtJ~R;w~GjfGR_l0I;G_xk$Uk#WBG z9`P~sItUVTUQLCSQVu})GMI9(>}jw)i+y-osuLhrn&dsR-{|1uFoH6*phKn|$sMTbxzS+6 zErTnn%&Mbf7?i9js{bjRu>(wA^bG5N6Zd}vl#BmIjp5%v{C9=%UmX6$;eS?~|FwsI z?cra0`2Rj$G&VIgg~&02D*h}FXJ`UJQ;6dN5Hk6X|A+YWe|H7*XSX5&iEeZY5N_p9 z4;TN@m!J08!YqA9)%=K9C;VeB_bc1&$LpoUMIP$(7Esv@;0g5sL?Cm0{e-2x*=<~Y zem+3iNMkk9fDhOFFg<@IxBo}5p&2M%`^$3;!20Zrc66Z&*}@Uo7= z$LB+HLbZ%KkpiC51+X;s_-sJq^OWl?tE+=>cdZKx303iHCgqVX=*M~<{asp9EPI!u z8dadW%5XzOk<#%MJe6l0nd#0py=7coc%TnK;K)#Y_8`eXba1*=u6$&N)%r*z^0PodQv$d2$K`|0iedZF)=X_$@A1X$C1no==(Og)$CVgjg7Lc z#$PIiP6!_1ZX(7NT78F){z=aO@#p_J9g}e&Qfsd^dVYL=gCFS70cogdKdMl%j`%O> CMYF~L literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-url-screen-i.png b/developer/docs/help/images/dist-url-screen-i.png new file mode 100644 index 0000000000000000000000000000000000000000..1c0029646756c875ada8b6cbb121d954a5a892ff GIT binary patch literal 7954 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 Y^m|N~eyH-lJ~jeCR#m1!$~5GE0M|t%A^-pY literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-welcome-ap.png b/developer/docs/help/images/dist-welcome-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..8d753979b12c57e94913a0bf967368b0e4888b27 GIT binary patch literal 72409 zcmcG0RajKv*Do=Yv`8x<5`y$l(n!Z3jkF*o-5_1kAl)G;NQ-obNXO9KNO#wH`G4Pc zah~&>yK^oKn9a<7_kPz}zuJVnhe=^SA$x*=fPgI{Ev}4!fGC21fW(WA3cf>*!IldC zL3B`-5<@5*e7*&~fS8IZh$0|VL}A{3L;+u8*h+tJKtRCheEfqL&xAvcfbftfBQC1y zs<)et;-l6z**a9&w?C@u7e|F28p_N-#K`T;l$|+0A2@%lf%S~N9GOu28KePEi5-2* znn-iW^MwB(qr0)&og5v#;RN2jz+ba5nC`xxoa`|8NzLnFD+z++E5es6cFKc?4(WX% zihzpbYu|@D4Pnu2mN%>*WVs;BwReWaT`#KC8V0KV?TxX#V0ztW#QtGrzq`P%p{#ND zNzD2^CWQML-mAVj{`a-*o;q|p3}#1uP_6B367QSm z5@+00i&U0_6{0LXNi57`nnRfKKZ7=A!>FzLlQxHFFn%&WJYII6?0t*_vzGcl*aiiR?AXCx?##!7h>v;#+7c@7 zf*ZiW7=kBmpiHDuJtIpbC04HNT#c2^rS`Qy<>i$%A9`EsHO|3?vPM)QtL_`@qKUXw zo*D7#5+w~XUf+P?ORKi$SBB?MH{+GedT+fhoeQsL^OtLBf%|D(bNqF~P2`0KvZskZ#D^o`V1hyG^mn^ogpHUCm$3?gr>byy&F+OMZ*Z_U%9avBKW++N95U zB#)fAlGd2{LLYKlRPAx=el$|uKGAgxpFYtfg*sI3>ilf(XMPhWoc3P$y9`qg*;F@1 zYuY%`U*Fbx9~S~+Q+Uz%`W3TFY$WWEunSIb9|xE8D19PEM{Ra+1N%)T9VR=T3*I`- zuw3~E_3h`kZI@RtH0cvrHMJhUmNb#Z+Y6huv%*!`HxRiu2yP#LY7{eYp1&264N*C2 zDmXQfw|!&RZZN9XEt7NG`-KMGcL248u4O2lg}7!xYk$EKZE{U}KgD%=bope`cHR*7wTY8*_SB~w26`3={X376u@z!9oj{HM?c(<$dEgeyCi&A+z@m#*(o zg`M|Vw8wwYe6SIEIazB@s!}eZmv)=@YiuQ2G~bfS ziYVU9nTAcJn$C}=`){9`j)WCjs@92MtJ;jrj2ddoE@nAIjJNjlm^#bxH=kBk0`2u1 zUd(Ch|7br@rN2ATZ&)<{y1Jfjb&)^_!(@B{m9@@S4ARZD*7Fj(^yKx-zMrr0A~0Wr zwxZ1(FpQ`D39)@0dIj~RaejWD5UvLm)^fPe?607^<#zadU&lNn=i5+IU&j=ve?wi? za{(Kdsx=jBNn*i0uvt_Hq?~J7XR&|ppFf%-W8qfoN&jKFnU40F5e4ai{Rr1l{>%NX zo4|L-?)h0mOsu2`wLGSo;6%8Emsvux!J^}{3!DOFLqyH#!ZhN$>pWH09i@Wvby+nP=w5ganOm-;lzGzM zQY)liGs3c-p^%FAZF7353bZL5tZshF{B9#1e{m!6dSz^_#dx{Wn0BA@#%^E!YQ{Y8 zM?dW!!fOr}eH%--8ii#|Y#O{iNB)3}*lX`=BV)^8>Uv5uVc3wryEC~)(bJM(ojF6y z=~5HH>0kSj_VsYbEy0MeSrLP~0%d0jx6h~OZo8R_IdT2F_u~y5ZLeQUSaPYxIx<%& zx(G?9@S=Q{VYmONpk#=MjxHMf!nOX*zH=p32A9MF$;r>py0ciGDikFA%EwF_b-zsd z7TqamD*T6HP+$f+mnV21%5z1cnmWzH(VL9OZL)W|L{IyBXWde=6$7dFwcweLv?nza}bu{gB#6 zkn&ju#a1chGoGg}HpW7j2YuDxrQJ6VVHe4`dd9^2^9T>_J<7tkQIx#)GK24pjUCOE z+Ub%U1xf15DY>APMZ-|Zxyf&fc5epIM)REC@fEFad_fi-%FMe-dQv~hbI_}v*+TtW z_t&Yn_TI+6ec?H=5aw>HuQ37 z2-_P~d33PU02%k^OltFq!FOTpkhPzy-ihQqdknK<)6x`nfvD;t#u*p-lZhj(9Q+ma>Tm$#A z7tcvh+OE&(M8aEk`5ddT{(MsB#`9eD%3zn3qsRDm33Wg9z&5#&-MCne^$S8kww7jXjFC7#j)YyhA*b%d z#8~*S{2JFKh%#C1vZ{{VNmH+hZum}27okqg{Zkuv`j;L-vU;uN@5Y7M-PeLzE^)D` zRSCrOzZ6mSm};%U29Gc91&wb~&en35-&H-7Gh9}F;@fhby2#}Hc-_sIUebMcnk=xD zQW50wP(fsEr?5n(v}uuAWQTn^9pc@Sl^na)WWJiG#huTTl12m}&rxogv8JD_nN}~g zX!)hH=gFEP3)aQu(LyaZ^~5`uFX$_Kg-b8bPi`HIV`UsTWgSI|2^lpdf0r^qIu}W9hc5AXaj(T2aY6&AD38~L48BYHlhO|=J7|&)qiH?+aByz7DPz+?EZnVp)d&|It#j^R;7Z0o*>6TY zo5Yn=x*$L=jxu}UQc`h822ET(G3{OJLiw4L!2WlnP#u|c7h=FT-+U!f^r?H1(lSsu ziJe*oW`GLMw&%La>BCp*l`SPbYnnTr#0@zLU15l)u38`&5Vly|R8>W6#~|Ww`?fdX zkZzJA*|)oT?h-N+)E!pLST>7GT-}(K7XJ0y*3yg!C8b|{bJsNNo4mdvS&F%I87Ga}Ik~s4W+(F<8dB9*o0VR&0#b+JM?H4k;mn##g9HaQSP*V; zSB-DTRgNA~7?c4^$FyNNT(}q3v#A|7aYe7}thGL1pD@y!d;In7DU}&$NP}HTOBL!a zPoS}hN#ZRtB*cEVog`v}s064p3IwkNup>d!sZb%A7-u3><&2F%g}um!3vsHKZK$si zkbOlA6u!|O2;f5usPGsPKfSnFE%+~7DwAL#hlWT3fGX|BBz8RXIBh=!EC|wi0@dSB z)zPB2icr0`#z12GfAmsb|C3f)xrD#%ftXHiM=M<+>%V)7KOFTePZFMN4ka4*Wn&ag zyhK4kxyFR_lI`dq?EjwB<8VLUHM82YTlBo>S#Uon>El^&&3W#1xm>?{GGkHJ0}dfC z>Eb)-=UhLZwTYULl}dl>l%41FE|uGAt&3Pcd_vuR#=M}1rD69a|3Tv~$L%qh(#GRn zv%YP+l@R(~aLDtL67Bo@8ymiz;$PXnPq8S4bhu|NIn8IP3QzZDd1MuEoyw%5DD20S zq$FPZ9{0Z`_Q~`(4*C4)XCG~%&dY8Jcgw1T?GnUy;SmK2@5qV46CYR3NpUPo-cZP6RtIVIg1g#zswO=`D)^K zyjsJuJpFC+d~a6nV4*2zOf6Z+v)=Oexcc#^9BU72%k9g8H2cuT!*TdQM)@xTIV=orHg=IrJ*vU-b)&R?|cz*drN+`Zk&QlfG7DMig#l%Y?5)$(xPkWXsUbe8bk zp`V?@Y?$im6t1|Q>3ttk-C6TJQ1E8=my#@pNBN%!a*f^YW3Y$DO&7nvLu1B;P+!TR z&9KcsOVo8v-YxIIQTm)EaFThBnBg$UH)FZXG!%AV!P#hw-f2Bw-{U-MMQ_u1^mVNG zgNnYjS6$sv@}h&i{ina*sO`543wlXS)2KJoT{7|$6#9RH>H;#Ji^pXs3tY9c5A zL6J7rK&QemFyRBZU+drA;V8ASJN|n=4?D5ze&G^_j4SY-4wjb0i{`zTGoC9$Kxh*E-PXbLOGJJ4b!R;yDTxoRQt&kF%8WrDMz>DOWcT`b!BV*RC9;;_}*`H&e z6*TIOjNceYm9jXxrRG(+I-Ar#%P5puJ4vx94XK9oa><8Qu`I{Hrf3s%Q6`NI=FRCV z+)g&OD%nl?lcqo|=JaXkdpZ@H4rSD1!D53GR&MGNwG-3dhw_Q$_Q6s^_^9*ygkUsb z<7N8#W$RV`3|x@}&g>U4QWh0ci{1|}9LT=1G!QdvRB`HBj~A)!j%(j%m5L=yk)aM6m>|o_dEXnA_*v*mnIxDJT24X0b#V5qrUzqy>{*yZS-0yDh7S z<&fZoypBzK00ujKup=qM5P_nAQsQ*b9_qSOvhsqUf!j zHUcdA&9_G;MBLVe#}N>%I!(7m^OQ@pxa#)ncT`WN48xdJ9Yl62_MrUOP`WDK=36r* zGdWt6h+w*nu|gF!%+pj)u)XWJPlg+ZxgYO~UAuJ6NSO&Tt@qto;&bPzkM(I!wEB4# zJ!mMsZ!2(KUE0E`@~W+7x1E?YO5ebeKC6rzl)Z`)TI&!oavoyS(#F{GN5h?9L8SLk z3#+~(bdzhlJi@i9bU&9dCa*SiGjOm>^-{mQuBpb=#4rGG+9P2&>FRc zF9HDva_@kc^dtp;CK02~d2gnWTbk^f^@~+A8==O2Gn%g$Zw?c&M{i-y(6q=G{M#I! zj%6+P^(@G&QNmMpYtd3g29o5b6>U$i^YO6KhPW{EydUmUaIiKIOgOQMEm@(triIslH?>jBC6Pmb^dx%+1c^_gy zT6_Q+<#l4_nYJIi6B==|TxQ{HQBR;6a<^sVi1gC=daGcEd-V3$uKjIA8G#{t!G}L- zL}XUF7_-8cOa5k7YH8eYyio+7E3B%gCE@9k`4_TozXq;fZVCSuK%7lm8Z*8o-_vQ> zt4_W5*)-dNwRWe`J$Go=t>Lp$f~S{{wOq_OMCBKBV7#604%*y?uA4CvHLS(RJ)PVh z{{AkGEbN6{C%(+iV|jR{8BDgoZo)xpWBPEr%J?n|o#7>18k>G@EWEp_PK2Y-_z%ZC zX1F67(hla1E`h7(E49myLqTrcIZ;Anc@X8cszBdpue>RIcb{%WF^C=)z>2s+p# zmLDAxMZ-nDun~3tP4?nJEvHjRd1i$HnV=LS;QbHyLVZMO%>M=3h>Z{`Z$+elLAKbHIjho7o>H_So1|e+z^&$p!BA<2&|p5Y_rBIvUIoC8C0w8~t?d^9)YbPG-|t6PIb&Mhx=e`$2bZ#tO9 zz=elij3Yy~6iUeSil3ifD@@UP4_^N9UGiI}B9_S?N;F4EGmUk8e0<89nm_uC@x8qa zgb>t;c4GGD8|bTcGrg{5s^{$Gba5a^dGs>K^63b3n}2DdgY z=lyW!QbmLgh=ME>{dmq{sE4Vn@o7oO?QtLLi1O8UjWWHFQQ3b{m=Gj#maZovCa1yx z+hub_FEqK!-JI{`{QktKR`d!$j&UK5Dj6?r%L<8@>dT$77P{(rkCTBJ8vsGO#Ahhn zcfa36kn_N_z@?G48P4*(1t(F@9G?^Uma&4e#bh9*XQ|CUr^JqX!F9Fs90il;pAUAQ zqR`c+DyfmilR^G#7XZ!UA3K`;VzcL28Lp?lb2`AN%GOP16P<5Cw`h3?JD1-8pipk+ z;Cm27j0%j8wnFbYmiTmY1Q}PT@@nJRgm&eKBsp#M3ID$=fAy_W-s^uk1ha1Ysn+#{ zEC6ixj8OQBkopUW7s;$N(-tqrfhUI{t>+pnT17(ev@79AxB z5Lw6>=tulBOpz@%@r-0v?(vIYXc6tbC;%YW{Nlv>4|UM<80nj>f=uXMC{w9)uCb}9 zMT%VyZQ`ryyqkek9@ZI7A_pT26+9h0i;1g*!_d_Um&`$+$ju3V~}el_lzL=me-s z?ql2gLSZ{&{PHfzC{oFHxW)THoJ=^!xGzCwOYNt6#Q0AQMHDT&Dswp9mIus1w%DfS z?mWeWw}h=C0^F(jf(w`PX;b<6xI9czYGZQJC2XD3KmcbfIvH| z!4}hldmz^CRnLA-Sxy-Yu~NyG4^cLfVZHibnx1D)Ko678-K&DbQcN1bZVs_}1VD14FQKEDDv_e1ZLXZ-`YKSJme{m8bs>;EKZI(2hw} zY<*YiVaw#jTD#Tkrj<*vQ$Pj7lvgjwj=+lZ&6^PfwsK>k%y{Xcw*(x-5y^lHh6XXNDZ zp0*Hn9d%PuGKcUgs9QbrEGLHI2%Zj`y^dTg+l20cPv3t>z>I=qoM?!$1o#p-5L715 z3be?q#5FB}fH|)lV+kDHvQN3gn)?0{z?DN~mk0R|!V|>xT$fR{Msk91U~J_Eb54`GBgz~S^ZG@$a)b%rzIZ6ZD!`=#rPJ6 zmtp8T3~qQS}P2!Ys4bgFnlf$(Uu@PZ{tSY(72nDI^PBEbeUHd)zh?_vCo4 z=+v#}-<%-mNJ|yn6tOeEE#!i5UO3)tukbhkj=~JK@yN+Z&NQ$0eQ%vwrsw&GJME_> z1Dh*htl)I37ror~W^-i}DRq?;G_w{7YW4l?*~&$s=W`B<*`7_vE#M#-JIk2B`zugP2w6XW{h25)mACq{3%f@qY-e0C4H7EKlQVUy56q~&k zdMmH_18`o6*GwM+o-t2cx7|7X4w&J%uj*~y$b{uBTva)S zZ!m|ez;;cw6y6m^EG75ykt$TZvcK7@d8B!HeOPn3|VE*;*>A@)A%^Go-$90 zWEHFA(@BWczRYrPaL9?n#)Y&bqg_#^a-Ag+vFIdyQh$aXXDT}fS-@*`wte@^YwF*! z@ZG%2VqsPeu5GGSbx3un}?7IIgfDJ>yeEuID%(%%4 zi2(6Wcwk7JvKH~LGel0TO+D^Uvz_4FD??F(<)#l>9#}w=)sBn7Qc|26oTKOn!i`d% z6nK;ao?v@L2^>qu)qkvj!}zz*SVLj7-CF zljLKcm0;M8@^GuJ&cAiq7MJTm)I;`dy%vo@c*EkAMk$dbO%wFOS@RJcAdyqhQb3N< zH$o^)@uh(EZ19fO94|n^TMu_uT-9u+Bimf|w#gBXvJ7wuGS;Xo)?vKls0r885h<=1 zP6aFP(vMW_9R4Wc->9#9K^>%`bM$%;&o{VC{vETVA2$Dd`YaPPCjFe8Zx1EF@daYl zgIQk@Ui8-!0^`6&yBD|ip6I`#Q2Rx&luUSe5G8O04n_7hIi+)Oc3XiMx z#2x32iQmv0_D%L*3)A%kKJ_->I(vf&mE3N3`fnt}$qVQKR#m1P#QGj~qh7EbIV~yP z_PdM4Olf}5#<;MrPq$*Fg#irU8sMrRFh4)pMB6aE@q;hLRIjhCbsird$Bf>Z(n2b?GCQ}A8)`zBP@4!WklndF*`kQG0zu(u6*^f~W8Mxm=9A@2^aEQ*D}Ma&IoyQm!g?cXvCh zA0^zgsBk25L9zczjc!qjABLb2J;8# zGG%u!Nj!1h{>%EGPd1eDO~&lx1z;s7FWvypij9f%+&aMZWlB#3&jN|n2R_j46xIRS zDRaOkPo`UirROAkSj1|tzxlptMaNI+jmkG!9F?##X=LD!mnp9|l5gWLPSpo~y&l83r0&*ghWty$0}Z`scthFJd4(L8LfULPeagL|Uac)1cb zqIHaAF0tIu#csblBoV{noME&0_rCR?Es$89NZYy~|2(fxUvr=9ZF{_I{)V}4?c4fQ zA{uG9ij$6%hYjNj?8NNfpRkWMQf<_KJ(ZWer9|o__IQ-TvUnHm*q#FBsIeLI~D( zjOj=pHhCZ4gBSLX_-p`z29!(1(NFVBFiQI2ic`pC9{evGlk+K|W(|``;G#R}mSvhC{ zigEX2{pVIaYR4D4Rc1=cZ#STcI`%TkURR{|RKakeoU!=JZoUZ3gC>B_L!e$C@m_&D zBpoB4WPQnM#aKF>RCNagi16ypG5J4>8xI*knl>wouiY>)bbll*WAQqUBN8Ed00F?> z+z1y4O1gI+?O~~ShfCkgdEM-pUvxnKBmf>(cym3;!}%f;=wN&m^AA_uO3tA9-Mzd) z4RRMHSUT=n>IML%B@~nN&a*a*ouR!d;iu{cxt#SdvkcpgK@WIQLBD z0yq8v8USXL2phw4NABWjw^ci6!FJ1(}zg4JM-I5=sV^#+S zM|$lGm#RrUcjjnC|C1MPYtg{0uxw&YIfH&kW=q?7N*Ltc8XslCu3(wHWZPV%_EXX{ zq~i$YKQ>}kZD*ab4C7S45RuHctDsSQJo{x~%;3=SPE+FhoHrmxWDg5L6`gnm;WKz5 zP2j~Hj1T(#PKr}0;x)I2&$3;fY<%`_5l{gx#SYltn%`YNpqmCpJK=fxiY&Ff?8kim zs2J?%AOlCo_bl-Llcn?D9?|P)gjb)aVv`byO$O6mKUV4lw|r7o21e-w-G5r{Gjz+O zR~RC6!rq__0m~pm(0%)jML@;kmz|QFu`@~&qn*hz{VMe@kKO{`!|h4VZzo)WI?j`f zwq5tUbfx_e`iyUYSqN!q^RqcDr2x#;JiJMSUMv>_p;8eaOyyBb1Rj9;)#Yl``u)wp ztoX%eZXy#jCmPSy|F`1cV zCrjD1dUjoem0-0pv2+SCkiUS$6|))v5uPB0(BZiH^SEr3kzpcs&>x=K|kS1>cb#*E=1`8KY z#)Wbsr4qFS78JKV{&VMdl8T#x{jez7)*UBngrLSY*5uYyMb5$jID^tHUwZ@xKN4^q z^&TmuY2>#g0#~KaZ>m4_JXPSF>mzYs)v;V^^{oJHKtOi9PQtMCD!&gl)u|&9%C}79 z5U&7lRohL1|1bm=mux>*UCtO+(E15L_E9ff=IrXRyzX_4qp(RiUY&!F+ioJ+<+Pfq z(##a{gxW|ww-euukz)y|rpsJii&c!&b(wdn-z_M^V0cF#X9Q@UZeI9YH-lDa7fbCD z(g4%?T#gj3g2T*Dp)x57w^tiNnklFW-H*zLGg!bjhvqeKDF{;8jlQw~o9U(kjPxyz zS<``(yuP?Vg3@{{i{oZp0^aIJV8?O63!E8U=XRM)c#4mMvfkJA2hcyFUbrs#*6V0$ z)=C~Qm3zhJB4%GTf}wE?yvssvgJR8!moho;kduVHoAY_B=Xhl!ESSwSeIx@+F2I_1 zvXHc>yGJ@H*bO0E@}|Msv01O}Uf8nM^HTrlE3C4dR@RY7j1sz*W&vg(16PLWK1ReL zP!2}vNWFbM?}Qky<@Ro&$&;^uAXN!KRp*&PEHeYc@GTcGdw!ck=a)Nze*T%PvC*HW zXJu97;;(0xe+PkzR@DO)M4JUziws=%Z-Dn%a>D5XEV`Ssxo(-X!-#Xd@oQg}Xuw0H z5+~`#NHe+~C1-$2lRoEJAVE#HGj7bn2&$DnH->d=zci*~5C+8`F!QKBC`hDKKAM14 z5}&S)*GH6fs76(nx+|9tIyh$W=>U`pYW4sHq}(PIxPc;pULs>QN)^EG_%DlUn2v1*7+VZRq~)6~0eeuqGgJn110bL7<`vTai=6 z;x-snLY2RAn@JEXm^U&eVGEg|uImE^br)ru^%E&{W_=P1qZD zH_468D3tLi(!;V9Gxt+`Ose6xppd+xfxN{b8}TcD$IzgIN(SM0rNP9HCC76(==2Y{ z&5!p-H(SHvcrR7S60lpI+Og=aEyF?ZQZcPz2^dfaNZ@XIh8e?#{kbz6+T@6KtIM_l15y$Vg!sO`3>QKep*8WD%EH==6XVKJML6%%74D( z)+g<#IJ`?fTr+J7@C^XqBPUi2>ixg@Jc@$w7TZpIsUH)_jjm8*d=hli{p3{!OoL%x zI#Mce5Uc%p;hQDFU~l8a`9(qG1nw=0&ke8(+?<~TzCWr!3zs>g zxJIaF@n5E#MPgmYXy=}(rN1qKZMXrHC264D=>UAfN9g5|I|7a19OR|ZdJ^Zr1mJrVALbCI4R5^O{&_t74!5x5{u(Lc*(nMUnm=A% z50B_8HZ)ltvOE3OEW&)M9fEL4;j=N7k(m_49TajITnI-+C_?8%c(lHxKt;D#Oe z!#cqA1lBGGjVG|G^_IXJ=)*@zibv5_7q$+@Xu{EIx0FSf1K1M10MeCkJMSPvv^3!+ z{6CRR#HV=Mf%ZLq=&sP-9Ui?lxbV_+LXp+Iu~0v03iJ{cj$Xrn{o- zo}`cfcH1S9vzXeg{M78Y+SiCe>A-W*ZjbxwBri35&$gVzWudM-?8iAIpfX_EzYB3d zf6z)=G3X2vq^4tC>#9ly^0xAc2nBX{8arj%LK!b!|K;qtz|9VTaWSo}wjFXz~{X615w@Cv0(l;{NbNQ6FO=W!xq;G0=?0HC-{> ze8ZJ@yyRVSj~EtZP}#o>zTpnmK~teSMooLD>|=pn2XBT>i{`fnrBTueCNYzeT#`?@ zC<`BepoDIB4ytJQ;>kApP%A3BKNYH11q?yl!tPK8blzZH_r2fj1r=TS^2tvf2X`S3S%qjE_29njZJkmA^!8vXETI=>GPqKI%Zj z`n~BcDZlT}p#hAJDXvK!f*pV?@@p(6VVN)93j^Jf_>5*V?ea?$a4ZrFGYe~RT#no2|0a4wG{o?zuG5z7#CP`&wWfcx;FB(%`ScfOO5zHuLVr8sIO)h;cU6RB> zzn{U$SVD|J7r-|50=v#fyF$Dk&T-1RWM)lBisyrlMIa04tyGN9^>PrUp|;iUc$S;Z zY0F;&s+#W$aRJ!{Z=i?J#`ER$-xL_ulnyhWcEOR6kCLd&O)fH`nIGEseJH0c428Pw zEd4xx^HJW-Vcrr&I5zA6M#9q@fKnW%&E?q(utADwm)&W2QwNUDqiLl6JgShos7(BW zM(yNUHP$7R@{n>k5*If0PSw^Fpg4r?K>9HPevkUc_+A|TT|59q4jk*igb!Iw|4RH* zDd#H-a{E01latr&Xt;>~(8|pg8te2p340^Hgi$$@eTu6;*1P z?Jix_*@)>z@LT4YFZNG0sXRE5C80eQ)hG70GhgMk5Q~QlZuQb>X%p@T(Q)1^$@s1| zAG}`e5c2w|DAbhG)iVC0nHvdqgM!2`f}Y@>r$YU@7ab(Elo*bM~;2#dWS1RH#*+}?>zOwMvZh{aNEosQNI@7 zy2yQqx>@o6cz&jUh%=97b?0#5c^RM)In=q;+^BRB}1;^fCtK_O{&( z(e57Y`0tVgqnY3uf$J8Dyv!y+uag_QTiZy2Tgb@QtvE%rlu`_yDt3a_Ib6S##FR=0 z1#<-{0_rC`7h-(hW%B&E`_A}?^o`*ec;f2&YtfCBxSKgxZq9QBtmRmclJy7<7-1v& zn|?JPQ>i+RA1FHAlwA@Q>-AWS>}&}zgq6*{?r(_9$41>J;d?V!r{8R#mPou=T))!o zp$z)RsW_uYA%D=4PL|Hi@SgcyNBVrqvI2Tq%HR^^js1eibU|kZRXF<7@5I!AiylyA zk@}vms-Yqk78{}^VL(IAdTjad{z5A7@qK{XA4+qHga&xMTnHCPR^l;OKoBn}eUoA4 z@(vU9B)JB!zPy8!#f!9}BOMAGS_Q=G6R`Ct(=GqeVG$4b;~Ake7t{WOSt&__SZBgA zz{`nBFMC-E6&Iq8?~|m2*OvRrU}hy%&Y-~5KzVugoOB8+`;Md-c>^!G)v=>r6M+C_ zQJ(tj?fsg>8m{S0jL6?B)psA|bv?Y*cb~IQgJW7?b_V2|nP@662j#kMzSdf zTeeq`gm1$*$Z)+V*)j;d_XK+Gxb7AJtK(1)F+|~+Qr(8_#>U6MRsM2szz&=))iQf0 z`S4e0CjGuvZDaJ{^QPM_jc1z9ti>$)U{X|ocBhue>C5`Mn=Q%~27~Pa<#G6wxq3=$ z{>LHyA1mxf^x|~Zo@WUl0qhc&xC^8{b66ao8=Ww$X8#5#V~69utTx_`g`R{9o8g^D z42YB#-B)(mbzt*!rWq(x8lH@!_J;9A9@R9hCul<>PL^4|x>L;BDL&_SF0TJ^B!9TG zE>*XL6VfmZLJFiefNYQ5ML71NW-frizs2XazoC!0i(JcWufHL?RmCPq-0jem{cj#T zH)3XwLm%uEX)tIpH0LRjBMA4Gdj-NVSku$fTKkvEvHOsUeEtY^U1qz?wK}w3G|-VY zUHoNQ?21{R=;_>gWB)w7^u{5BN+$wbAct*m2y$0DxjSF?`oa$Mc?i&9gNV*=ycLG| z_GqF9F;}Zdb?K522!e@GShFz%+1l1_LXMI6vBgh@^W+jA#~jBpbbAVrLXfq+&~Nsr zyZ$%hB<(Phz(QkyvEBM=4dTi+ML({{PbkdFdqML_5u_WdgyzyRDQ)%9MXCNGiZZuy z1sZAFH2nti<%zJ>Z3TV|s-J(z0Dh8uu+7x(!$5B8ttu13PE?_#^W|Ph`>4>Ld%>5D zw`cN~l!WJ-$q4s*5D8nYQka;HW&Kt@ZBeW*c4jUe+W`ITmm{B6PDJgZmDbNfgeelP z*akronfMgw@=7ucv?e+^tRWb6ZR^w}1tN?f6Zh+DYdgH-z`IglCHkY=a#@Sc^RzF z`oeM8%0L%0j%(oa2DQnxT%-5D6^19h3jz{Ti-&hHVeKBl*i7yMuA2FnfhU|y6mG}5 zg2=|HuMq#r$+q-^AW_l&r!F-ly-#|%s)0VvKa1qW^17W8j5jT( zrcaZQmgO^CO`2zQvanVeMUdLn@rioOwP#dqS&gb_1!3Q|yaH0Qy@y~@`o!#0dT#54 z5v!7%BvX&p=I123>));BBs0Z~7^j;fHpT)V!8Ie?<%FIn9!!&k8!p6?;-v#m`I4N4 z@y84L5G-M;U^4pUY&&n@ZNip+cE~oAaULg^80}_Q*z^we%XDaBqY%#R$Uh)*U4`D$ z<$Nt~{`8l8?VFSeC})`eJDalMV=jHkabBQTx(W0TPHYo2N9ssz*jhPIP%C@h~|;V?Vv#=lv%o(sKV zT?;p)UShXK`Cf@qJ zKCX^w{>@C+q5m8=7qC{aiO^X0n=Teod2x-oK%OL*B&6{#5cw7veGMtU{QI7J-?Ksj zB2j;yI%=uJJ*8Zu9xj55=fowQPfwpnAmFzQiPYkuJB{Ybd=c`W3Icw=G`cNPu01p5 ze%L0!=)Q*7LVjL4A_3GFJ1L7wvLo-iYq{TVx^BQMCeButc+b&VgvZRkUvs)r2+;3n z;KX@ylW6do9MMDWQDf$TQ-N6CMj{5cA+f9iA+D5Hkav$XIRRS|S%4;TC@gXtQyX%#HT{(dlpERLmbl+CAbDW$*;Xhgj0{${bK3@RPM@oo|Wr& zwZ45n_#Jon-(20VdbH)TP~A*-{A_0SvskO?O5=8gZ69Qu_o+o7<)W^jU7p^KGLX;n z>9fpSW|AKM2|gHif@9}TE*RxWV7$waGbgL5^6x3e24CA7>n`!gW9bzq?keCMoH(~1 z*u$t=F7b>cPXL1dOkwMOJYc8XRuJcrZ1eAMxnmp~%N@FS*54`+XtmqXWcOnK#iG`& zwH2dG>qPkNC5v~V?L)0T;>m$w2GZ2xvR@!2B3~vlH@5P&oZ>p3 zYVxVQk2ccv)BPW}JL6KORzITpCF2Y|PZiGKbdyIjVNPOOjtVO=05S4dk2Y)_^nnGu z+UBdd7?>VQ)2Xs9n$A4dcA^c%CxeN1S0rg222a%X5tTDp4O+|$Bm;-|ZE;cW52o@f z=goaU{=WEEC<1iVbmQuGs7xLgIg1{iCA>8;vvJHMCul$e3}DA(9~AT_t+s?T7Olh+ zk=>=?#*o)khs811ljZBc72sViAMER&>lDcdJHA<`SzZzcLd^D{X*s-`c24YT#!73h&g~(=>*wVq9Nqi!X7-nSkS->_u=WOpLM`==;{IgI z`PRSB-G>|xeb;ls1!*@sHOXsP)_P2hQAz@e|d^O+-Nw#oV7TBp{{F!3boY= zxi>D7Zf6{!lv$j6U62+t^+z?4Wif>AwO46v3F0Jc5iXtvdl;J3FQQqo!;=ggZ~nUs zd0d%h58)4U>*!5gjtTO={tC2gwGJgFUtCV>R6*(ah&S`*unQ22n5f~g%8{ryhzb|? zcQ+P4m~}?_)gp(L(kKrtOg;|-L04n4her3sl&ZY~=3W=p7m+XdzS#T8l<(;z;<=mx z@0E}LK`j($-Xs%v)c0HZJ*I70_)ByjkXRhH=9qkM@+p+{_Wg^0%`Z1QgADZc`Pk-; z(6jp8%%K)Ee^0CJ_kH?V9_6wM?`m_AgS-lsL*TVznNY&WU!js{d`Mw@U&`t>Qp9(K zt`lslc|ubLzsbtpzV-N!?2veZM;_@G?DlcMcL9~nN1zyn=A7@&{kO(@!4U~bbOlO= zoz*&&Sw9kFfsgjB73ESMS(G6uG?v4eESon%5&qhy_YfomWoFT2+#H0CH(SQ;F%>gk zu=3phg%lX*m%AIxFSgWHvQ3r!@Jzm?5Di3lb%3r**&=Xfe6kEf^BNr!_Nc-y2f^Wl zNqui!cv$<8X}xdM*e3aZ#PH^3GxF9+f*_A2V+pv~cv1Y|G(UKDMd9LmOkI94%L$<* z$zi))xCFAKQF*U)USFvd-i&Kxrn&f$l`7N>752LYn1715JKNxY-^5nV8>T z(%ihJvq))M8LgS!hi8xtl8$6caHv&4MH{kY!bWp#`v0a)@;FJyZLt^rhDcjI1%ImzQkb zP<(4D_{sYHj~bCU8vd4fxhM+3rw$^-gm(1r&p{q0z|D}u`en^5EL_MgLbadH}2Oa-GVu2h5czm#cxDH=pbn3tmjfgR;0Y{MS;h3Jh_^41CqZ(hZ; zyr@M@^Sa)8+vb!%VwSB)pd99bXV(S6xaeP7Oa3?gtKc(PxZ?@O&G#%`BC|p2*1zX~e$xMofZ1xeI zQr-n7c&0iZRe5sY3vKtJ_P8=IX2d+Up4B|3(JJuYY#S0mC(sIa7k3@CLO^cgID7J78es-A&Ycjy6$I6>z8!KH|b zB{jf;^^0T?whi`xG`S#Z$q`^?3R4el;E57y;8ymT-2#Id_|a`Czvn#Q}1- z8hb_;&GKWIb}HxNY4|b&YPTlb=tJh)q<&`y_f?Wv7$wcu(Tx^z@Ock}U6Dvedy3(L zkZkjy{`JrfL0|Ms@bnQo56!KQXP?*HHhA1F(~KGX`i*=3P(q(t)@9U*8k@xc8@7FA zsCkHLd*`yHV%M#B2=59S?j>MF-m&o2qGXX)Io>TP0L@&p`S67 zWJ$K>fh{zC0VTZEI#NLK2-uS96s43pr+)X<>}@-H|0&2~-802pBe46nO=q@3%sxLp z0Kx5I_msXJ!vj2*#dzuyOo!g}=&gQX6z528#kp+Tfex)qQV zFhGz2Bt}A7kQ_ilQbA(q7Nr}cyIVj)y1QeDz2^PClYO$!_L;{d?R_ld)2@N`z=%#bMkGQHsc0r>y_`m2KK|Ja{zN+c4>faYOJ zdGk(bB~ofH8o<;Vc_b+Uri!t2cvutE;9)sm3gLeOud}OSwmtzNVUAKTNg3$BssX!g z^*;lwz@rf`akK(Zzj}b9NP3J0{Wn|F3p$EVJO$O=)st^%@0O0ivhf5^tSXlPtjQez zE)XyiLe7ek6!juIyh1aZcvh!E3Gx7m_ zVQ4>~uTlRUP8>sVir#oOZF2;sGEZy{*EZ|Md%5*rfB4NEmi>eD857yX{==7L05?`4 z0hpq-<_Z93V?jwKX85M3%%abw*+2fD5AaC8ZI0!sc(!9>w1ziYF!_34-YPTXLoc=N2G%HB} zO;tmBx;#?O0QIwF$tW{=tdI}n?E>;aZa{@YOLCK~L1m^1tiMOs$3rS_z)K+s4;_iP z|LCQFTHS53z^KTr;WRofLpm&9T;bak=Nw9&8M{el(#)2*K4?SW08!GFr9m@E4B__Y z#Vhtvp_?Eg+Ds(f14$Rv-;gHI01=;lGzgw;lA9b-0-b)BHf$Hn#zIeezdz!POFI)=WkzKIpXk;IPM>1m;fJ6M{0iXgyQQXC5 zqXXC+*hYJh0AQo_1l79vDG=qdoweFVFT9U>I7>nQ;ipcONThI`+b*I)t_ctbU7+HX zo!iSZaq3|&1*1+8H=u2>=Om$>U?aga?I%o&Uh8T&oL2bh7{)0U=jvUca}+nV zhsb~aJ{bksm)Zdo8SxS&K_I|fB;v)W7doKTNT23Az6aa!l$hPL2*BZdK7amWL782_w~S@Yb7y zhJ&-BIiN{x;&mhVcIvi^0C|l=!a&0tT0{LRBHmcfpzh;7pBCkpsu1x)ox4=m34<$Y z*^33tL^)rdOt}*9+Fd=q&&dQ}YpvfX+#F30`6SD6xl`>X*v~FY5H`wo_m679#OO~| zncYkk%C3Og=@y{53=CSUt$^qAs_k7Gt+1uCItxm^rQ>J4XH2Q@1J+jSFg7AMfBk{t z4VXk6_@fa15kxo2qUL2^78$dCND{!*2@LO;qXh)&vjPE!kvFs-A*y~SxvPx}L6H}t zFM)2ofBK36ID$a?)JTyOHKfRYQ*B>yk5hEM8FvZH`64EiQ3rof!JoQ0Un)M#zfFEg z1C%HXnC2;b(a=A~Ej}pUk)Q)5xt^o;?Z|$NJ$r!l zjabNwXJaa?E_=RkxB+jFip?(qt^{chr-};Qq**XHKILD4EmfG_ya4mKXS}qHaq&N8 za@S@SSeq-!d{DST>jn~(ao>T=yXgd&E8JlcvC#+&dX$o3>#QjFETRK7R#W|`ImPA5 zKB2O%wBGcsq!M44x&QMJyviLhS(blb8EfvPoaJT2R$|yGZRP?5U%-U;d5r zZG$+m7myf14gU_9bf^oRGzOxX>;yfd(K3OB&nD zD-cYIXlFA|MF0~;5MZZV&(O5eWMwvKCX*+g8)K!U*<%dDJVPs* zZm-nG(ovJ5lmFaqV(`0&p&*nOUr%-(wYS0=)7HMZT;qNUIKG%OHTFM59CQ3HgjXat z&&tzCb0s#<4t<|K#~=g8+Q97P(Hjl4Tc9$jZ5H9DRSe>N1kdy_+bQ~0R{o|t0HQK; z#CNAF$C^;a{xx`4U@H8yr<#w;wmhFFf7;3i@0FJ}Ik5bsPHI8t_1jZ@_%;J*UyJ}m zdG4c0wm}6|a0^-H^o0N(m{%i}ZNAZToHZEykMYnhYPAZA|?_y=9`xagd= zP)m?Va78WNi30eiyF1qRMSNjz)P-{$x z

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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/dist-welcome-i.png b/developer/docs/help/images/dist-welcome-i.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa0cc725fc809e5a4d0b9db4b34757ea4f07c6d GIT binary patch literal 49395 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/settings-language-ap.png b/developer/docs/help/images/settings-language-ap.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b2ac4c9d0c6fefc3f1f899c1485bae7eeec3d2 GIT binary patch literal 7778 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/reference/file-layout.md b/developer/docs/help/reference/file-layout.md index 634df33c536..e466d7c05b0 100644 --- a/developer/docs/help/reference/file-layout.md +++ b/developer/docs/help/reference/file-layout.md @@ -111,7 +111,7 @@ of these files should be included in a git repository. `build/sample.keyboard_info` : A [metadata file](/developer/cloud/keyboard_info) detailing the - keyboard's origin, version, requirements, and capabilities. + keyboard's origin, version, requirements, and capabilities. This file is built automatically by the kmc compiler. Please see [.keyboard_info specification](/developer/cloud/keyboard_info) for more details. From 70ed0b5dd4e6c5872e51111f82b69ad8d5cc4733 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Thu, 26 Sep 2024 14:30:09 +0700 Subject: [PATCH 083/119] feat(mac): transform left option modifier to right option --- .../Keyman4MacIM/KMInputMethodAppDelegate.m | 2 +- .../Keyman4MacIM/KMInputMethodEventHandler.m | 34 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index 08dce670ba4..90c00e3a38a 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -292,7 +292,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef switch (type) { case kCGEventFlagsChanged: - os_log_debug([KMLogs eventsLog], "eventTapFunction: system event kCGEventFlagsChanged to: %x", (int) sysEvent.modifierFlags); + os_log_debug([KMLogs eventsLog], "eventTapFunction: system event kCGEventFlagsChanged to: 0x%X", (int) sysEvent.modifierFlags); appDelegate.currentModifierFlags = sysEvent.modifierFlags; if (appDelegate.currentModifierFlags & NSEventModifierFlagCommand) { appDelegate.contextChangedByLowLevelEvent = YES; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m index d102e69ca37..4579cac88d7 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m @@ -118,12 +118,42 @@ - (BOOL) handleEventWithKeymanEngine:(NSEvent *)event in:(id) sender { return [self applyKeymanCoreActions:output event:event client:sender]; } +/** + * If necessary change the modifier so that it appears that the right option key was pressed instead of the + * left option key. This will trigger keyboard rules that are defined for right option because both option keys + * generally have the same meaning on the Mac. + */ +- (NSEventModifierFlags) determineModifierFlag { + const NSEventModifierFlags LEFT_OPTION_MASK = 0x80120; + const NSEventModifierFlags RIGHT_OPTION_MASK = 0x80140; + + NSEventModifierFlags originalModifierFlag = self.appDelegate.currentModifierFlags; + NSEventModifierFlags newModifierFlag = originalModifierFlag; + + if (self.appDelegate.modifierMapping.bothOptionKeysGenerateRightAlt) { + // if original includes left option key, then replace it with the right option key + if ((originalModifierFlag & LEFT_OPTION_MASK) == LEFT_OPTION_MASK) { + os_log_debug([KMLogs eventsLog], "determineModifierFlag \n originalModifierFlag: 0x%lX \n LEFT_OPTION_MASK: 0x%lx \n inverse: 0x%lx", (unsigned long)originalModifierFlag, LEFT_OPTION_MASK, ~LEFT_OPTION_MASK); + // clear all left option bits + newModifierFlag = originalModifierFlag & ~LEFT_OPTION_MASK; + os_log_debug([KMLogs eventsLog], " cleared left option bits: 0x%lX", (unsigned long)newModifierFlag); + // set all right option bits + newModifierFlag = newModifierFlag | RIGHT_OPTION_MASK; + os_log_debug([KMLogs eventsLog], " set right option bits: 0x%lX", (unsigned long)newModifierFlag); + } + } else { + os_log_debug([KMLogs eventsLog], "determineModifierFlag = originalModifierFlag: 0x%lX", (unsigned long)originalModifierFlag); + } + return newModifierFlag; +} + - (CoreKeyOutput*) processEventWithKeymanEngine:(NSEvent *)event in:(id) sender { CoreKeyOutput* coreKeyOutput = nil; if (self.appDelegate.lowLevelEventTap != nil) { - NSEvent *eventWithOriginalModifierFlags = [NSEvent keyEventWithType:event.type location:event.locationInWindow modifierFlags:self.appDelegate.currentModifierFlags timestamp:event.timestamp windowNumber:event.windowNumber context:[NSGraphicsContext currentContext] characters:event.characters charactersIgnoringModifiers:event.charactersIgnoringModifiers isARepeat:event.isARepeat keyCode:event.keyCode]; + NSEventModifierFlags newModifierFlag = [self determineModifierFlag]; + NSEvent *eventWithOriginalModifierFlags = [NSEvent keyEventWithType:event.type location:event.locationInWindow modifierFlags:newModifierFlag timestamp:event.timestamp windowNumber:event.windowNumber context:[NSGraphicsContext currentContext] characters:event.characters charactersIgnoringModifiers:event.charactersIgnoringModifiers isARepeat:event.isARepeat keyCode:event.keyCode]; coreKeyOutput = [self.kme processEvent:eventWithOriginalModifierFlags]; - os_log_debug([KMLogs eventsLog], "processEventWithKeymanEngine, using AppDelegate.currentModifierFlags: %lu / 0x%lX, instead of event.modifiers = %lu / 0x%lX", self.appDelegate.currentModifierFlags, self.appDelegate.currentModifierFlags, event.modifierFlags, event.modifierFlags); + os_log_debug([KMLogs eventsLog], "processEventWithKeymanEngine, using newModifierFlag 0x%lX, instead of event.modifiers 0x%lX", newModifierFlag, event.modifierFlags); } else { // Depending on the client app and the keyboard, using the passed-in event as it is should work okay. From 3fab6c2d2cc1abb7a6851f5f609ae431a3ec36a1 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Thu, 26 Sep 2024 18:26:04 +0200 Subject: [PATCH 084/119] fix(linux): ignore additional C++ symbol in API check I have no idea why this C++ symbol suddenly shows up in the API check, but since it's not part of our API we can ignore it. --- linux/debian/libkeymancore2.symbols | 1 + 1 file changed, 1 insertion(+) diff --git a/linux/debian/libkeymancore2.symbols b/linux/debian/libkeymancore2.symbols index 593e7aa7fc3..83aa5a5125c 100644 --- a/linux/debian/libkeymancore2.symbols +++ b/linux/debian/libkeymancore2.symbols @@ -2,6 +2,7 @@ libkeymancore.so.2 libkeymancore2 #MINVER# * Build-Depends-Package: libkeymancore-dev (c++|optional)"typeinfo name for std::codecvt_utf8_utf16@Base" 17.0.244 + (c++|optional)std::piecewise_construct@Base 18.0.118 km_core_context_clear@Base 17.0.195 km_core_context_get@Base 17.0.195 km_core_context_item_list_size@Base 17.0.195 From 275c352629624ee4d18c69f5e55b11bc96149546 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Thu, 26 Sep 2024 14:03:09 -0400 Subject: [PATCH 085/119] auto: increment master version to 18.0.119 --- HISTORY.md | 9 +++++++++ VERSION.md | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 9bc4268dc30..01762fcc2c9 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,14 @@ # Keyman Version History +## 18.0.118 alpha 2024-09-26 + +* chore(developer): add context/options (#11566) +* chore(deps-dev): bump rollup from 4.16.4 to 4.22.4 (#12462) +* fix(developer): ignore excess whitespace in `` attribute (#12468) +* refactor(common): move help into common prod/docs/help folders (#12424) +* fix(developer): publish developer-utils package during build (#12471) +* fix(linux): ignore additional C++ symbol in API check (#12474) + ## 18.0.117 alpha 2024-09-25 * docs(common): Document how to skip generating CDN on websites (#12446) diff --git a/VERSION.md b/VERSION.md index e272e231ff7..49dcd615789 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.118 \ No newline at end of file +18.0.119 \ No newline at end of file From 7ff8c707e904cf4cf9999ed4c5aa6371dbda244f Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 26 Sep 2024 17:31:43 -0700 Subject: [PATCH 086/119] fix(developer): warn before importing over touch layout Fixes: #12476 --- developer/src/tike/child/UfrmKeymanWizard.pas | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/developer/src/tike/child/UfrmKeymanWizard.pas b/developer/src/tike/child/UfrmKeymanWizard.pas index baa906e8369..59e0f8a3411 100644 --- a/developer/src/tike/child/UfrmKeymanWizard.pas +++ b/developer/src/tike/child/UfrmKeymanWizard.pas @@ -3263,6 +3263,14 @@ procedure TfrmKeymanWizard.cmdImportFromOnScreenClick(Sender: TObject); // I39 Exit; end; + if MessageDlg( + 'Importing the Desktop On Screen Keyboard will overwrite all changes in all '+ + 'layers in the touch layout. Continue and overwrite touch layout?', mtWarning, + mbOkCancel, 0) = mrCancel then + begin + Exit; + end; + if Self.Modified then // I4059 begin if not FKeymanDeveloperOptions.OSKAutoSaveBeforeImporting then From fa0f2ea109e4931a88018518fac6cb876740c5f3 Mon Sep 17 00:00:00 2001 From: DavidLRowe Date: Thu, 26 Sep 2024 18:03:47 -0800 Subject: [PATCH 087/119] Update kmx-plus-file-format.md --- docs/file-formats/kmx-plus-file-format.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/file-formats/kmx-plus-file-format.md b/docs/file-formats/kmx-plus-file-format.md index a7b7e190a6e..a289213d53e 100644 --- a/docs/file-formats/kmx-plus-file-format.md +++ b/docs/file-formats/kmx-plus-file-format.md @@ -35,7 +35,10 @@ Draft spec PR: - Other than the `sect` table itself, the rest of the sections follow in binary order in the file. In other words, the binary ordering of the section identifiers determines the order of the file layout. -- All sections other than the `sect` table are optional +- All sections other than the `sect` table are optional, + however, the `elem` table is required to have as its initial entry + the null element string (with offset=0, length=0), + so essentially the 'elem' table is required to be present as well ### C7043.2.1 `sect`—Section Table of contents From 6abd59bad53834b73bdb508c7a25400292b81dab Mon Sep 17 00:00:00 2001 From: sgschantz Date: Fri, 27 Sep 2024 16:17:31 +0700 Subject: [PATCH 088/119] feat(mac): renaming and moved adjustModifiers to KMModifierMapping Fixes: #875 --- .../Keyman4MacIM/KMInputMethodAppDelegate.h | 18 +++++--- .../Keyman4MacIM/KMInputMethodAppDelegate.m | 22 +++++++--- .../Keyman4MacIM/KMInputMethodEventHandler.m | 44 ++++--------------- .../Keyman4MacIM/KMModifierMapping.h | 1 + .../Keyman4MacIM/KMModifierMapping.m | 34 ++++++++++++++ .../KeymanTests/TestAppDelegate.h | 1 - .../KeymanTests/TestAppDelegate.m | 2 +- 7 files changed, 71 insertions(+), 51 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h index 878f3eb5a7b..fe06fa603a8 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h @@ -62,23 +62,25 @@ static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX = 0; } @property (nonatomic, strong) KMEngine *kme; -@property (nonatomic, strong) KMXFile *kmx; -@property (nonatomic, strong) KMModifierMapping *modifierMapping; +// TODO: refactor and encapsulate below properties with current keyboard +@property (nonatomic, strong, readonly) KMXFile *kmx; +@property (nonatomic, strong, readonly) KMModifierMapping *modifierMapping; @property (nonatomic, strong) KVKFile *kvk; +@property (nonatomic, strong) NSString *keyboardName; +@property (nonatomic, strong) NSString *selectedKeyboard; +@property (nonatomic, strong) NSImage *keyboardIcon; +// TODO: refactor above properties @property (nonatomic, strong) NSString *keyboardsPath; @property (nonatomic, strong) NSString *fontsPath; @property (nonatomic, strong) NSMutableArray *kmxFileList; -@property (nonatomic, strong) NSString *selectedKeyboard; @property (nonatomic, strong) NSMutableArray *activeKeyboards; @property (assign) int numberOfKeyboardMenuItems; @property (nonatomic, strong) NSMutableString *contextBuffer; -@property (nonatomic, assign) NSEventModifierFlags currentModifierFlags; +@property (nonatomic, assign) NSEventModifierFlags currentModifiers; @property (nonatomic, assign) CFMachPortRef lowLevelEventTap; @property (nonatomic, assign) CFRunLoopSourceRef runLoopEventSrc; @property (nonatomic, assign) BOOL contextChangedByLowLevelEvent; @property (nonatomic, strong) OSKWindowController *oskWindow; -@property (nonatomic, strong) NSString *keyboardName; -@property (nonatomic, strong) NSImage *keyboardIcon; @property (nonatomic, strong) NSAlert *downloadInfoView; @property (nonatomic, strong) NSProgressIndicator *progressIndicator; @property (nonatomic, weak) KMInputController *inputController; @@ -91,7 +93,6 @@ static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX = 0; @property (nonatomic, strong) NSString *downloadFilename; @property (nonatomic, strong) NSMutableData *receivedData; @property (nonatomic, assign) NSUInteger expectedBytes; -@property (nonatomic, assign) BOOL useNullChar; - (NSMenu *)menu; - (void)saveActiveKeyboards; @@ -101,6 +102,9 @@ static const int KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX = 0; - (void)showConfigurationWindow; - (void)selectKeyboardFromMenu:(NSInteger)tag; - (void)handleKeyEvent:(NSEvent *)event; +- (void)loadKeyboardFromKmxFile:(KMXFile *)kmx; +- (void)resetKmx; +- (NSEventModifierFlags) determineModifiers; - (BOOL)unzipFile:(NSString *)filePath; - (NSWindowController *)downloadKBWindow_; - (NSWindowController *)aboutWindow_; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index 41cdaafd02f..ef13f15b789 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -284,8 +284,8 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef switch (type) { case kCGEventFlagsChanged: os_log_debug([KMLogs eventsLog], "eventTapFunction: system event kCGEventFlagsChanged to: 0x%X", (int) sysEvent.modifierFlags); - appDelegate.currentModifierFlags = sysEvent.modifierFlags; - if (appDelegate.currentModifierFlags & NSEventModifierFlagCommand) { + appDelegate.currentModifiers = sysEvent.modifierFlags; + if (appDelegate.currentModifiers & NSEventModifierFlagCommand) { appDelegate.contextChangedByLowLevelEvent = YES; } break; @@ -389,7 +389,12 @@ - (KMPackageReader *)packageReader { return _packageReader; } -- (void)setKmx:(KMXFile *)kmx { +- (void)resetKmx { + _kmx = nil; + _modifierMapping = nil; +} + +- (void)loadKeyboardFromKmxFile:(KMXFile *)kmx { _kmx = kmx; CoreKeyboardInfo *keyboardInfo = [self.kme loadKeyboardFromKmxFile:kmx]; @@ -790,7 +795,7 @@ - (void) setSelectedKeyboard:(NSString*)keyboardName inMenuItem:(NSMenuItem*) me os_log_debug([KMLogs dataLog], "setSelectedKeyboard, keyboardName = '%{public}@', full path = '%{public}@'", keyboardName, fullPath); [menuItem setState:NSOnState]; KMXFile *kmx = [[KMXFile alloc] initWithFilePath:fullPath]; - [self setKmx:kmx]; + [self loadKeyboardFromKmxFile:kmx]; NSDictionary *kmxInfo = [KMXFile keyboardInfoFromKmxFile:fullPath]; NSString *kvkFilename = [kmxInfo objectForKey:kKMVisualKeyboardKey]; if (kvkFilename != nil) { @@ -818,7 +823,7 @@ - (void) addKeyboardPlaceholderMenuItem { NSString* placeholder = NSLocalizedString(@"no-keyboard-configured-menu-placeholder", nil); NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:placeholder action:NULL keyEquivalent:@""]; [self.menu insertItem:item atIndex:KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX]; - [self setKmx:nil]; + [self resetKmx]; [self setKvk:nil]; [self setKeyboardName:nil]; [self setKeyboardIcon:nil]; @@ -847,7 +852,7 @@ - (void)selectKeyboardFromMenu:(NSInteger)tag { os_log_debug([KMLogs dataLog], "setSelectedKeyboard, keyboardName = '%{public}@', full path = '%{public}@'", path, fullPath); KMXFile *kmx = [[KMXFile alloc] initWithFilePath:fullPath]; - [self setKmx:kmx]; + [self loadKeyboardFromKmxFile:kmx]; KVKFile *kvk = nil; NSDictionary *kmxInfo = [KMXFile keyboardInfoFromKmxFile:fullPath]; NSString *kvkFilename = [kmxInfo objectForKey:kKMVisualKeyboardKey]; @@ -1225,6 +1230,11 @@ - (void)handleKeyEvent:(NSEvent *)event { [_oskWindow.oskView handleKeyEvent:event]; } +- (NSEventModifierFlags) determineModifiers { + NSEventModifierFlags originalModifiers = self.currentModifiers; + return [self.modifierMapping adjustModifiers:originalModifiers]; +} + extern const CGKeyCode kProcessPendingBuffer; // This could more easily and logically be done in the input method, but this diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m index 68a0a3c2d18..1c6462f02ab 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m @@ -119,50 +119,22 @@ - (BOOL) handleEventWithKeymanEngine:(NSEvent *)event in:(id) sender { return [self applyKeymanCoreActions:output event:event client:sender]; } -/** - * If necessary change the modifier so that it appears that the right option key was pressed instead of the - * left option key. This will trigger keyboard rules that are defined for right option because both option keys - * generally have the same meaning on the Mac. - */ -- (NSEventModifierFlags) determineModifierFlag { - const NSEventModifierFlags LEFT_OPTION_MASK = 0x80120; - const NSEventModifierFlags RIGHT_OPTION_MASK = 0x80140; - - NSEventModifierFlags originalModifierFlag = self.appDelegate.currentModifierFlags; - NSEventModifierFlags newModifierFlag = originalModifierFlag; - - if (self.appDelegate.modifierMapping.bothOptionKeysGenerateRightAlt) { - // if original includes left option key, then replace it with the right option key - if ((originalModifierFlag & LEFT_OPTION_MASK) == LEFT_OPTION_MASK) { - os_log_debug([KMLogs eventsLog], "determineModifierFlag \n originalModifierFlag: 0x%lX \n LEFT_OPTION_MASK: 0x%lx \n inverse: 0x%lx", (unsigned long)originalModifierFlag, LEFT_OPTION_MASK, ~LEFT_OPTION_MASK); - // clear all left option bits - newModifierFlag = originalModifierFlag & ~LEFT_OPTION_MASK; - os_log_debug([KMLogs eventsLog], " cleared left option bits: 0x%lX", (unsigned long)newModifierFlag); - // set all right option bits - newModifierFlag = newModifierFlag | RIGHT_OPTION_MASK; - os_log_debug([KMLogs eventsLog], " set right option bits: 0x%lX", (unsigned long)newModifierFlag); - } - } else { - os_log_debug([KMLogs eventsLog], "determineModifierFlag = originalModifierFlag: 0x%lX", (unsigned long)originalModifierFlag); - } - return newModifierFlag; -} - - (CoreKeyOutput*) processEventWithKeymanEngine:(NSEvent *)event in:(id) sender { CoreKeyOutput* coreKeyOutput = nil; if (self.appDelegate.lowLevelEventTap != nil) { - NSEventModifierFlags newModifierFlag = [self determineModifierFlag]; - NSEvent *eventWithOriginalModifierFlags = [NSEvent keyEventWithType:event.type location:event.locationInWindow modifierFlags:newModifierFlag timestamp:event.timestamp windowNumber:event.windowNumber context:[NSGraphicsContext currentContext] characters:event.characters charactersIgnoringModifiers:event.charactersIgnoringModifiers isARepeat:event.isARepeat keyCode:event.keyCode]; + NSEventModifierFlags newModifiers = [self.appDelegate determineModifiers]; + NSEvent *eventWithOriginalModifierFlags = [NSEvent keyEventWithType:event.type location:event.locationInWindow modifierFlags:newModifiers timestamp:event.timestamp windowNumber:event.windowNumber context:[NSGraphicsContext currentContext] characters:event.characters charactersIgnoringModifiers:event.charactersIgnoringModifiers isARepeat:event.isARepeat keyCode:event.keyCode]; coreKeyOutput = [self.kme processEvent:eventWithOriginalModifierFlags]; - os_log_debug([KMLogs eventsLog], "processEventWithKeymanEngine, using newModifierFlag 0x%lX, instead of event.modifiers 0x%lX", newModifierFlag, event.modifierFlags); + os_log_debug([KMLogs eventsLog], "processEventWithKeymanEngine, using newModifierFlag 0x%lX, instead of event.modifiers 0x%lX", newModifiers, event.modifierFlags); } else { - // Depending on the client app and the keyboard, using the passed-in event as it is should work okay. - // Keyboards that depend on chirality support will not work. And command-key actions that change the - // context might go undetected in some apps, resulting in errant behavior for subsequent typing. + /** + * Without the low level event tap, there will be no way to distinguish left and right option keys. + * Also command-key actions that should invalidate the context may go undetected. + * Have yet to determine which scenarios prevent an event tap from be created + */ coreKeyOutput = [self.kme processEvent:event]; } - //os_log_debug([KMLogs eventsLog], "processEventWithKeymanEngine, coreKeyOutput = %{public}@", coreKeyOutput); return coreKeyOutput; } diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMModifierMapping.h b/mac/Keyman4MacIM/Keyman4MacIM/KMModifierMapping.h index d7f701a315d..71efb50db6e 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMModifierMapping.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMModifierMapping.h @@ -14,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN -(instancetype)init:(CoreKeyboardInfo*)keyboardInfo; -(BOOL)optionKeysUnused; -(BOOL)bothOptionKeysGenerateRightAlt; +-(NSEventModifierFlags)adjustModifiers:(NSEventModifierFlags)originalModifiers; @end NS_ASSUME_NONNULL_END diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMModifierMapping.m b/mac/Keyman4MacIM/Keyman4MacIM/KMModifierMapping.m index 1f6c2d2cba3..14eba0f770e 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMModifierMapping.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMModifierMapping.m @@ -10,6 +10,7 @@ #import "KMModifierMapping.h" #import +#import "KMLogs.h" @interface KMModifierMapping () @property (nonatomic, strong) CoreKeyboardInfo *keyboardInfo; @@ -17,6 +18,13 @@ @interface KMModifierMapping () @implementation KMModifierMapping +const NSEventModifierFlags LEFT_OPTION_MASK = 0x80120; +const NSEventModifierFlags RIGHT_OPTION_MASK = 0x80140; + ++(BOOL)containsLeftOptionFlag:(NSEventModifierFlags)modifiers { + return (modifiers & LEFT_OPTION_MASK) == LEFT_OPTION_MASK; +} + -(instancetype)init:(CoreKeyboardInfo*)keyboardInfo { self = [super init]; if (self) { @@ -35,4 +43,30 @@ -(BOOL)bothOptionKeysGenerateRightAlt { return (self.keyboardInfo.containsRightAlt || self.keyboardInfo.containsAlt) && !self.keyboardInfo.containsLeftAlt; } +/** + * If necessary, change the modifiers so that it appears that the right option key was pressed instead of the + * left option key. This will trigger keyboard rules that are defined for right option because both option keys + * usually have the same meaning on the Mac. + */ +- (NSEventModifierFlags) adjustModifiers:(NSEventModifierFlags)originalModifiers { + + NSEventModifierFlags newModifiers = originalModifiers; + + if (self.bothOptionKeysGenerateRightAlt) { + // if original includes left option key, then replace it with the right option key + if ([KMModifierMapping containsLeftOptionFlag:originalModifiers]) { + + // clear all left option bits + newModifiers = originalModifiers & ~LEFT_OPTION_MASK; + + // set all right option bits + newModifiers = newModifiers | RIGHT_OPTION_MASK; + os_log_debug([KMLogs eventsLog], "adjustModifiers, changing from originalModifiers: 0x%lX to newModifiers: 0x%lX", originalModifiers, newModifiers); + } + } else { + os_log_debug([KMLogs eventsLog], "adjustModifiers, retaining originalModifiers: 0x%lX", (unsigned long)originalModifiers); + } + return newModifiers; +} + @end diff --git a/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.h b/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.h index 8cb043d4105..437f19c01d1 100644 --- a/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.h +++ b/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.h @@ -21,7 +21,6 @@ typedef void(^PostEventCallback)(CGEventRef eventToPost); @property (nonatomic, strong) NSMutableString *contextBuffer; @property (nonatomic, assign) CFMachPortRef lowLevelEventTap; // Always nil for tests @property (nonatomic, assign) BOOL contextChangingEventDetected; -@property (nonatomic, assign) BOOL useNullChar; @property (nonatomic, assign) CGKeyCode virtualKeyPosted; // Helper method diff --git a/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.m b/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.m index b2d1f859a2f..c2078c95ea0 100644 --- a/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.m +++ b/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.m @@ -24,7 +24,7 @@ - (KMEngine *)kme { - (void)setKmx:(KMXFile *)kmx { _kmx = kmx; - [self.kme setKmx:_kmx]; + [self.kme loadKeyboardFromKmxFile:_kmx]; } - (NSMutableString *)contextBuffer { From 14fff2d0a4df570d5e26ac22e903abe49d0f2da0 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Fri, 27 Sep 2024 12:54:16 +0200 Subject: [PATCH 089/119] chore(linux): display branch name with API verification This change adds the branch name to the API verification workflow so that it's easier to see which run belongs to which PR or branch build. --- .github/workflows/api-verification.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/api-verification.yml b/.github/workflows/api-verification.yml index 786e8ebad2d..6eeccdaccb0 100644 --- a/.github/workflows/api-verification.yml +++ b/.github/workflows/api-verification.yml @@ -1,4 +1,5 @@ name: "API Verification" +run-name: "API Verification for ${{ github.ref_name }}" on: workflow_run: workflows: [Ubuntu packaging] From 968c9716f9728ce8399a4733411f0d9bc43ac68b Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Fri, 27 Sep 2024 16:29:28 +0200 Subject: [PATCH 090/119] chore(common): improve configuration detection for hextobin This improves #12440. The previous change was a bit fragile if we updated commander versions. This change now implements a better solution that doesn't rely on dependencies and their locations for detecting if we need to run the `configure` action for hextobin. --- common/tools/hextobin/build.sh | 2 +- common/tools/hextobin/package.json | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/common/tools/hextobin/build.sh b/common/tools/hextobin/build.sh index 9e73f8c4101..309260c1b12 100755 --- a/common/tools/hextobin/build.sh +++ b/common/tools/hextobin/build.sh @@ -11,7 +11,7 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" builder_describe "Build hextobin" clean configure build builder_describe_outputs \ - configure /common/tools/hextobin/node_modules/commander \ + configure /common/tools/hextobin/build/.configured \ build /common/tools/hextobin/build/index.js builder_parse "$@" diff --git a/common/tools/hextobin/package.json b/common/tools/hextobin/package.json index fb651481f7a..0b2ea05a31c 100644 --- a/common/tools/hextobin/package.json +++ b/common/tools/hextobin/package.json @@ -15,5 +15,8 @@ "main": "build/index.js", "bin": { "hextobin": "build/hextobin.js" + }, + "scripts": { + "postinstall": "mkdir -p build && touch build/.configured" } } From 7e631c1a73530c98b3a6850c684953b0988cd054 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Sep 2024 14:09:42 -0500 Subject: [PATCH 091/119] feat(common): unified xml parser scaffolding Fixes: #12208 --- developer/src/common/web/utils/src/index.ts | 2 ++ developer/src/common/web/utils/src/xml-utils.ts | 11 +++++++++++ .../src/common/web/utils/test/test-xml-utils.ts | 13 +++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 developer/src/common/web/utils/src/xml-utils.ts create mode 100644 developer/src/common/web/utils/test/test-xml-utils.ts diff --git a/developer/src/common/web/utils/src/index.ts b/developer/src/common/web/utils/src/index.ts index 7ee5c507b80..4a748bc354a 100644 --- a/developer/src/common/web/utils/src/index.ts +++ b/developer/src/common/web/utils/src/index.ts @@ -45,3 +45,5 @@ export { defaultCompilerOptions, CompilerBaseOptions, CompilerCallbacks, Compile export { CommonTypesMessages } from './common-messages.js'; export * as xml2js from './deps/xml2js/xml2js.js'; + +export { KeymanXMLParser, KeymanXMLGenerator } from './xml-utils.js'; diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts new file mode 100644 index 00000000000..fa71dcf9656 --- /dev/null +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -0,0 +1,11 @@ + +/** wrapper for XML parsing support */ +export class KeymanXMLParser { + +} + +/** wrapper for XML generation support */ +export class KeymanXMLGenerator { + +} + diff --git a/developer/src/common/web/utils/test/test-xml-utils.ts b/developer/src/common/web/utils/test/test-xml-utils.ts new file mode 100644 index 00000000000..756855e6b9f --- /dev/null +++ b/developer/src/common/web/utils/test/test-xml-utils.ts @@ -0,0 +1,13 @@ +import { assert } from 'chai'; +import 'mocha'; + +import { KeymanXMLParser, KeymanXMLGenerator } from '../src/xml-utils.js'; + +describe('XML Parser Test', () => { + it('null test', () => assert.ok(new KeymanXMLParser())); +}); + +describe('XML Generator Test', () => { + it('null test', () => assert.ok(new KeymanXMLGenerator())); +}); + From d552b44a9dd0ad676a07977874c27706a21fb09b Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Fri, 27 Sep 2024 22:32:33 +0200 Subject: [PATCH 092/119] chore(common): use node to touch file The previous attempt failed when building on Windows. Using node should work everywhere. --- common/tools/hextobin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/tools/hextobin/package.json b/common/tools/hextobin/package.json index 0b2ea05a31c..2cb98f81cc4 100644 --- a/common/tools/hextobin/package.json +++ b/common/tools/hextobin/package.json @@ -17,6 +17,6 @@ "hextobin": "build/hextobin.js" }, "scripts": { - "postinstall": "mkdir -p build && touch build/.configured" + "postinstall": "node --eval \"const fs =require('fs'); const path = require('path'); var dir = 'build'; if (!fs.existsSync(dir)) { fs.mkdirSync(dir); } fs.writeFileSync(path.join(dir, '.configured'), '');\"" } } From 609faf80475864aced1fbe4ee187082e0705b3aa Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Sep 2024 16:52:21 -0500 Subject: [PATCH 093/119] feat(common): unified xml parser reader test Fixes: #12208 --- developer/src/common/web/utils/src/index.ts | 2 +- .../src/common/web/utils/src/xml-utils.ts | 94 +- .../utils/test/fixtures/xml/disp_maximal.xml | 16 + .../test/fixtures/xml/disp_maximal.xml.json | 35 + .../xml/error_invalid_package_file.kps | 32 + .../utils/test/fixtures/xml/k_020_fr-test.xml | 23 + .../test/fixtures/xml/k_020_fr-test.xml.json | 538 ++++++++ .../web/utils/test/fixtures/xml/k_020_fr.xml | 200 +++ .../utils/test/fixtures/xml/k_020_fr.xml.json | 509 +++++++ .../utils/test/fixtures/xml/khmer_angkor.kpj | 187 +++ .../test/fixtures/xml/khmer_angkor.kpj.json | 190 +++ .../utils/test/fixtures/xml/khmer_angkor.kvks | 206 +++ .../test/fixtures/xml/khmer_angkor.kvks.json | 1172 +++++++++++++++++ .../fixtures/xml/strs_invalid-illegal.xml | 58 + .../xml/strs_invalid-illegal.xml.json | 113 ++ .../utils/test/fixtures/xml/test_valid.kps | 46 + .../test/fixtures/xml/test_valid.kps.json | 64 + .../test/fixtures/xml/tran_fail-empty.xml | 19 + .../fixtures/xml/tran_fail-empty.xml.json | 28 + .../common/web/utils/test/test-xml-utils.ts | 109 +- 20 files changed, 3632 insertions(+), 9 deletions(-) create mode 100644 developer/src/common/web/utils/test/fixtures/xml/disp_maximal.xml create mode 100644 developer/src/common/web/utils/test/fixtures/xml/disp_maximal.xml.json create mode 100644 developer/src/common/web/utils/test/fixtures/xml/error_invalid_package_file.kps create mode 100644 developer/src/common/web/utils/test/fixtures/xml/k_020_fr-test.xml create mode 100644 developer/src/common/web/utils/test/fixtures/xml/k_020_fr-test.xml.json create mode 100644 developer/src/common/web/utils/test/fixtures/xml/k_020_fr.xml create mode 100644 developer/src/common/web/utils/test/fixtures/xml/k_020_fr.xml.json create mode 100644 developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kpj create mode 100644 developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kpj.json create mode 100644 developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks create mode 100644 developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks.json create mode 100644 developer/src/common/web/utils/test/fixtures/xml/strs_invalid-illegal.xml create mode 100644 developer/src/common/web/utils/test/fixtures/xml/strs_invalid-illegal.xml.json create mode 100644 developer/src/common/web/utils/test/fixtures/xml/test_valid.kps create mode 100644 developer/src/common/web/utils/test/fixtures/xml/test_valid.kps.json create mode 100644 developer/src/common/web/utils/test/fixtures/xml/tran_fail-empty.xml create mode 100644 developer/src/common/web/utils/test/fixtures/xml/tran_fail-empty.xml.json diff --git a/developer/src/common/web/utils/src/index.ts b/developer/src/common/web/utils/src/index.ts index 4a748bc354a..7b83f682dff 100644 --- a/developer/src/common/web/utils/src/index.ts +++ b/developer/src/common/web/utils/src/index.ts @@ -46,4 +46,4 @@ export { CommonTypesMessages } from './common-messages.js'; export * as xml2js from './deps/xml2js/xml2js.js'; -export { KeymanXMLParser, KeymanXMLGenerator } from './xml-utils.js'; +export { KeymanXMLOptions, KeymanXMLWriter, KeymanXMLReader } from './xml-utils.js'; diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index fa71dcf9656..319b607fe73 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -1,11 +1,99 @@ +import { xml2js } from "./index.js"; + +export class KeymanXMLOptions { + type: 'keyboard3' // LDML + | 'keyboard3-test' // LDML + | 'kps' // + | 'kvks' // + | 'kpj' // // + ; +} /** wrapper for XML parsing support */ -export class KeymanXMLParser { +export class KeymanXMLReader { + public constructor(public options: KeymanXMLOptions) { + } + public parse(data: string): Object { + const parser = this.parser(); + let a: any; + parser.parseString(data, (e: unknown, r: unknown) => { if (e) throw e; a = r; }); + return a; + } + + public parser() { + const { type } = this.options; + switch (type) { + case 'keyboard3': + return new xml2js.Parser({ + explicitArray: false, + mergeAttrs: true, + includeWhiteChars: false, + emptyTag: {} as any + // Why "as any"? xml2js is broken: + // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means + // that an old version of `emptyTag` is used which doesn't support + // functions, but DefinitelyTyped is requiring use of function or a + // string. See also notes at + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 + // An alternative fix would be to pull xml2js directly from github + // rather than using the version tagged on npmjs.com. + }); + case 'keyboard3-test': + return new xml2js.Parser({ + // explicitArray: false, + preserveChildrenOrder: true, // needed for test data + explicitChildren: true, // needed for test data + // mergeAttrs: true, + // includeWhiteChars: false, + // emptyTag: {} as any + // Why "as any"? xml2js is broken: + // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means + // that an old version of `emptyTag` is used which doesn't support + // functions, but DefinitelyTyped is requiring use of function or a + // string. See also notes at + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 + // An alternative fix would be to pull xml2js directly from github + // rather than using the version tagged on npmjs.com. + }); + case 'kps': + return new xml2js.Parser({ + explicitArray: false + }); + case 'kpj': + return new xml2js.Parser({ + explicitArray: false, + mergeAttrs: false, + includeWhiteChars: false, + normalize: false, + emptyTag: '' + }); + case 'kvks': + return new xml2js.Parser({ + explicitArray: false, + mergeAttrs: false, + includeWhiteChars: true, + normalize: false, + emptyTag: {} as any + // Why "as any"? xml2js is broken: + // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means + // that an old version of `emptyTag` is used which doesn't support + // functions, but DefinitelyTyped is requiring use of function or a + // string. See also notes at + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 + // An alternative fix would be to pull xml2js directly from github + // rather than using the version tagged on npmjs.com. + }); + default: + /* c8 ignore next 1 */ + throw Error(`Internal error: unhandled XML type ${type}`); + } + } } /** wrapper for XML generation support */ -export class KeymanXMLGenerator { - +export class KeymanXMLWriter { + constructor(public options: KeymanXMLOptions) { + } } diff --git a/developer/src/common/web/utils/test/fixtures/xml/disp_maximal.xml b/developer/src/common/web/utils/test/fixtures/xml/disp_maximal.xml new file mode 100644 index 00000000000..aeab3a71a5c --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/disp_maximal.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/disp_maximal.xml.json b/developer/src/common/web/utils/test/fixtures/xml/disp_maximal.xml.json new file mode 100644 index 00000000000..55ea878c833 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/disp_maximal.xml.json @@ -0,0 +1,35 @@ +{ + "keyboard3": { + "xmlns": "https://schemas.unicode.org/cldr/45/keyboard3", + "locale": "mt", + "conformsTo": "45", + "info": { + "name": "disp-maximal" + }, + "displays": { + "display": [ + { + "keyId": "g", + "display": "(g)" + }, + { + "output": "f", + "display": "(f)" + }, + { + "output": "${eee}", + "display": "(${eee})" + } + ], + "displayOptions": { + "baseCharacter": "x" + } + }, + "variables": { + "string": { + "id": "eee", + "value": "e" + } + } + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/fixtures/xml/error_invalid_package_file.kps b/developer/src/common/web/utils/test/fixtures/xml/error_invalid_package_file.kps new file mode 100644 index 00000000000..e18eaa26a06 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/error_invalid_package_file.kps @@ -0,0 +1,32 @@ + + + + 15.0.266.0 + 7.0 + + + SENĆOŦEN (Saanich Dialect) Keyboard + + © 2019 National Research Council Canada & this test + Eddie Antonio Santos + 1.0 + + + + basic.kmx + Keyboard Basic + 0 + .kmx + + + + + Basic + basic + 1.0 + + Khmer + + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/k_020_fr-test.xml b/developer/src/common/web/utils/test/fixtures/xml/k_020_fr-test.xml new file mode 100644 index 00000000000..22fce785389 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/k_020_fr-test.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/k_020_fr-test.xml.json b/developer/src/common/web/utils/test/fixtures/xml/k_020_fr-test.xml.json new file mode 100644 index 00000000000..ab530dd0b4a --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/k_020_fr-test.xml.json @@ -0,0 +1,538 @@ +{ + "keyboardTest3": { + "$": { + "conformsTo": "techpreview" + }, + "#name": "keyboardTest3", + "$$": [ + { + "$": { + "keyboard": "k_020_fr.xml", + "author": "Team Keyboard", + "name": "fr-test-updated" + }, + "#name": "info" + }, + { + "$": { + "name": "simple-repertoire", + "chars": "[a b c d e \\u0022]", + "type": "simple" + }, + "#name": "repertoire" + }, + { + "$": { + "name": "chars-repertoire", + "chars": "[á é ó]", + "type": "gesture" + }, + "#name": "repertoire" + }, + { + "$": { + "name": "key-tests-updated" + }, + "#name": "tests", + "$$": [ + { + "$": { + "name": "key-test" + }, + "#name": "test", + "$$": [ + { + "$": { + "to": "abc\\u0022..." + }, + "#name": "startContext" + }, + { + "$": { + "key": "s" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...s" + }, + "#name": "check" + }, + { + "$": { + "key": "t" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...st" + }, + "#name": "check" + }, + { + "$": { + "key": "u" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...stu" + }, + "#name": "check" + }, + { + "$": { + "to": "v" + }, + "#name": "emit" + }, + { + "$": { + "result": "abc\\u0022...stuv" + }, + "#name": "check" + } + ], + "startContext": [ + { + "$": { + "to": "abc\\u0022..." + } + } + ], + "keystroke": [ + { + "$": { + "key": "s" + } + }, + { + "$": { + "key": "t" + } + }, + { + "$": { + "key": "u" + } + } + ], + "check": [ + { + "$": { + "result": "abc\\u0022...s" + } + }, + { + "$": { + "result": "abc\\u0022...st" + } + }, + { + "$": { + "result": "abc\\u0022...stu" + } + }, + { + "$": { + "result": "abc\\u0022...stuv" + } + } + ], + "emit": [ + { + "$": { + "to": "v" + } + } + ] + } + ], + "test": [ + { + "$": { + "name": "key-test" + }, + "$$": [ + { + "$": { + "to": "abc\\u0022..." + }, + "#name": "startContext" + }, + { + "$": { + "key": "s" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...s" + }, + "#name": "check" + }, + { + "$": { + "key": "t" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...st" + }, + "#name": "check" + }, + { + "$": { + "key": "u" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...stu" + }, + "#name": "check" + }, + { + "$": { + "to": "v" + }, + "#name": "emit" + }, + { + "$": { + "result": "abc\\u0022...stuv" + }, + "#name": "check" + } + ], + "startContext": [ + { + "$": { + "to": "abc\\u0022..." + } + } + ], + "keystroke": [ + { + "$": { + "key": "s" + } + }, + { + "$": { + "key": "t" + } + }, + { + "$": { + "key": "u" + } + } + ], + "check": [ + { + "$": { + "result": "abc\\u0022...s" + } + }, + { + "$": { + "result": "abc\\u0022...st" + } + }, + { + "$": { + "result": "abc\\u0022...stu" + } + }, + { + "$": { + "result": "abc\\u0022...stuv" + } + } + ], + "emit": [ + { + "$": { + "to": "v" + } + } + ] + } + ] + } + ], + "info": [ + { + "$": { + "keyboard": "k_020_fr.xml", + "author": "Team Keyboard", + "name": "fr-test-updated" + } + } + ], + "repertoire": [ + { + "$": { + "name": "simple-repertoire", + "chars": "[a b c d e \\u0022]", + "type": "simple" + } + }, + { + "$": { + "name": "chars-repertoire", + "chars": "[á é ó]", + "type": "gesture" + } + } + ], + "tests": [ + { + "$": { + "name": "key-tests-updated" + }, + "$$": [ + { + "$": { + "name": "key-test" + }, + "#name": "test", + "$$": [ + { + "$": { + "to": "abc\\u0022..." + }, + "#name": "startContext" + }, + { + "$": { + "key": "s" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...s" + }, + "#name": "check" + }, + { + "$": { + "key": "t" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...st" + }, + "#name": "check" + }, + { + "$": { + "key": "u" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...stu" + }, + "#name": "check" + }, + { + "$": { + "to": "v" + }, + "#name": "emit" + }, + { + "$": { + "result": "abc\\u0022...stuv" + }, + "#name": "check" + } + ], + "startContext": [ + { + "$": { + "to": "abc\\u0022..." + } + } + ], + "keystroke": [ + { + "$": { + "key": "s" + } + }, + { + "$": { + "key": "t" + } + }, + { + "$": { + "key": "u" + } + } + ], + "check": [ + { + "$": { + "result": "abc\\u0022...s" + } + }, + { + "$": { + "result": "abc\\u0022...st" + } + }, + { + "$": { + "result": "abc\\u0022...stu" + } + }, + { + "$": { + "result": "abc\\u0022...stuv" + } + } + ], + "emit": [ + { + "$": { + "to": "v" + } + } + ] + } + ], + "test": [ + { + "$": { + "name": "key-test" + }, + "$$": [ + { + "$": { + "to": "abc\\u0022..." + }, + "#name": "startContext" + }, + { + "$": { + "key": "s" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...s" + }, + "#name": "check" + }, + { + "$": { + "key": "t" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...st" + }, + "#name": "check" + }, + { + "$": { + "key": "u" + }, + "#name": "keystroke" + }, + { + "$": { + "result": "abc\\u0022...stu" + }, + "#name": "check" + }, + { + "$": { + "to": "v" + }, + "#name": "emit" + }, + { + "$": { + "result": "abc\\u0022...stuv" + }, + "#name": "check" + } + ], + "startContext": [ + { + "$": { + "to": "abc\\u0022..." + } + } + ], + "keystroke": [ + { + "$": { + "key": "s" + } + }, + { + "$": { + "key": "t" + } + }, + { + "$": { + "key": "u" + } + } + ], + "check": [ + { + "$": { + "result": "abc\\u0022...s" + } + }, + { + "$": { + "result": "abc\\u0022...st" + } + }, + { + "$": { + "result": "abc\\u0022...stu" + } + }, + { + "$": { + "result": "abc\\u0022...stuv" + } + } + ], + "emit": [ + { + "$": { + "to": "v" + } + } + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/fixtures/xml/k_020_fr.xml b/developer/src/common/web/utils/test/fixtures/xml/k_020_fr.xml new file mode 100644 index 00000000000..671f1b8b9b6 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/k_020_fr.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/k_020_fr.xml.json b/developer/src/common/web/utils/test/fixtures/xml/k_020_fr.xml.json new file mode 100644 index 00000000000..1e23ec4bdbd --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/k_020_fr.xml.json @@ -0,0 +1,509 @@ +{ + "keyboard3": { + "xmlns": "https://schemas.unicode.org/cldr/45/keyboard3", + "locale": "fr-t-k0-azerty", + "conformsTo": "45", + "locales": { + "locale": { + "id": "br" + } + }, + "version": { + "number": "1.0.1" + }, + "info": { + "author": "Team Keyboard", + "layout": "AZERTY", + "indicator": "FR", + "name": "French Test Updated" + }, + "displays": { + "display": { + "output": "\\u{0300}", + "display": "\\u{02CB}" + }, + "displayOptions": { + "baseCharacter": "x" + } + }, + "keys": { + "import": [ + { + "base": "cldr", + "path": "45/keys-Zyyy-punctuation.xml" + }, + { + "base": "cldr", + "path": "45/keys-Zyyy-currency.xml" + } + ], + "key": [ + { + "id": "shift", + "layerId": "shift" + }, + { + "id": "numeric", + "layerId": "numeric" + }, + { + "id": "symbol", + "layerId": "symbol" + }, + { + "id": "base", + "layerId": "base" + }, + { + "id": "bksp", + "gap": "true" + }, + { + "id": "extra", + "gap": "true" + }, + { + "id": "enter", + "output": "\\u{000A}" + }, + { + "id": "u-grave", + "output": "ü" + }, + { + "id": "e-grave", + "output": "é" + }, + { + "id": "e-acute", + "output": "è" + }, + { + "id": "c-cedilla", + "output": "ç" + }, + { + "id": "a-grave", + "output": "à" + }, + { + "id": "a-acute", + "output": "á" + }, + { + "id": "a-caret", + "output": "â" + }, + { + "id": "a-umlaut", + "output": "ä" + }, + { + "id": "a-tilde", + "output": "ã" + }, + { + "id": "a-ring", + "output": "å" + }, + { + "id": "a-caron", + "output": "ā" + }, + { + "id": "A-grave", + "output": "À" + }, + { + "id": "A-acute", + "output": "Á" + }, + { + "id": "A-caret", + "output": "Â" + }, + { + "id": "A-umlaut", + "output": "Ä" + }, + { + "id": "A-tilde", + "output": "Ã" + }, + { + "id": "A-ring", + "output": "Å" + }, + { + "id": "A-caron", + "output": "Ā" + }, + { + "id": "bullet", + "output": "•" + }, + { + "id": "umlaut", + "output": "¨" + }, + { + "id": "sub-2", + "output": "₂" + }, + { + "id": "super-2", + "output": "²", + "longPressKeyIds": "sub-2" + }, + { + "id": "a", + "flickId": "a", + "output": "a", + "longPressKeyIds": "a-grave a-caret a-acute a-umlaut a-tilde a-ring a-caron", + "longPressDefaultKeyId": "a-caret" + }, + { + "id": "A", + "flickId": "b", + "output": "A", + "longPressKeyIds": "A-grave A-caret A-acute A-umlaut a-tilde A-ring A-caron", + "longPressDefaultKeyId": "A-caret" + } + ] + }, + "flicks": { + "flick": [ + { + "id": "b", + "flickSegment": [ + { + "directions": "nw", + "keyId": "A-grave" + }, + { + "directions": "nw se", + "keyId": "A-acute" + }, + { + "directions": "e", + "keyId": "A-caron" + }, + { + "directions": "s", + "keyId": "numeric" + } + ] + }, + { + "id": "a", + "flickSegment": [ + { + "directions": "nw", + "keyId": "a-grave" + }, + { + "directions": "nw se", + "keyId": "a-acute" + }, + { + "directions": "e", + "keyId": "a-caron" + } + ] + } + ] + }, + "layers": [ + { + "formId": "iso", + "layer": [ + { + "modifiers": "none", + "row": [ + { + "keys": "super-2 amp e-grave double-quote apos open-paren hyphen e-acute underscore c-cedilla a-acute close-paren equal" + }, + { + "keys": "a z e r t y u i o p caret dollar" + }, + { + "keys": "q s d f g h j k l m u-grave asterisk" + }, + { + "keys": "open-angle w x c v b n comma semi-colon colon bang" + }, + { + "keys": "space" + } + ] + }, + { + "modifiers": "shift", + "row": [ + { + "keys": "1 2 3 4 5 6 7 8 9 0 degree plus" + }, + { + "keys": "A Z E R T Y U I O P umlaut pound" + }, + { + "keys": "Q S D F G H J K L M percent micro" + }, + { + "keys": "close-angle W X C V B N question period slash section" + }, + { + "keys": "space" + } + ] + } + ] + }, + { + "formId": "touch", + "minDeviceWidth": "150", + "layer": [ + { + "id": "base", + "row": [ + { + "keys": "a z e r t y u i o p" + }, + { + "keys": "q s d f g h j k l m" + }, + { + "keys": "shift gap w x c v b n gap" + }, + { + "keys": "numeric extra space enter" + } + ] + }, + { + "id": "shift", + "row": [ + { + "keys": "A Z E R T Y U I O P" + }, + { + "keys": "Q S D F G H J K L M" + }, + { + "keys": "base W X C V B N" + }, + { + "keys": "numeric extra space enter" + } + ] + }, + { + "id": "numeric", + "row": [ + { + "keys": "1 2 3 4 5 6 7 8 9 0" + }, + { + "keys": "hyphen slash colon semi-colon open-paren close-paren dollar amp at double-quote" + }, + { + "keys": "symbol period comma question bang double-quote" + }, + { + "keys": "base extra space enter" + } + ] + }, + { + "id": "symbol", + "row": [ + { + "keys": "open-square close-square open-curly close-curly hash percent caret asterisk plus equal" + }, + { + "keys": "underscore backslash pipe tilde open-angle close-angle euro pound yen bullet" + }, + { + "keys": "numeric period comma question bang double-quote" + }, + { + "keys": "base extra space enter" + } + ] + } + ] + } + ], + "transforms": { + "type": "simple", + "transformGroup": { + "transform": [ + { + "from": "` ", + "to": "`" + }, + { + "from": "`a", + "to": "à" + }, + { + "from": "`A", + "to": "À" + }, + { + "from": "`e", + "to": "è" + }, + { + "from": "`E", + "to": "È" + }, + { + "from": "`i", + "to": "ì" + }, + { + "from": "`I", + "to": "Ì" + }, + { + "from": "`o", + "to": "ò" + }, + { + "from": "`O", + "to": "Ò" + }, + { + "from": "`u", + "to": "ù" + }, + { + "from": "`U", + "to": "Ù" + }, + { + "from": "^ ", + "to": "^" + }, + { + "from": "^a", + "to": "â" + }, + { + "from": "^A", + "to": " " + }, + { + "from": "^e", + "to": "ê" + }, + { + "from": "^E", + "to": "Ê" + }, + { + "from": "^i", + "to": "î" + }, + { + "from": "^I", + "to": "Î" + }, + { + "from": "^o", + "to": "ô" + }, + { + "from": "^O", + "to": "Ô" + }, + { + "from": "^u", + "to": "û" + }, + { + "from": "^U", + "to": "Û" + }, + { + "from": "¨ ", + "to": "¨" + }, + { + "from": "¨a", + "to": "ä" + }, + { + "from": "¨A", + "to": "Ä" + }, + { + "from": "¨e", + "to": "ë" + }, + { + "from": "¨E", + "to": "Ë" + }, + { + "from": "¨i", + "to": "ï" + }, + { + "from": "¨I", + "to": "Ï" + }, + { + "from": "¨o", + "to": "ö" + }, + { + "from": "¨O", + "to": "Ö" + }, + { + "from": "¨u", + "to": "ü" + }, + { + "from": "¨U", + "to": "Ü" + }, + { + "from": "¨y", + "to": "ÿ" + }, + { + "from": "~ ", + "to": "~" + }, + { + "from": "~a", + "to": "ã" + }, + { + "from": "~A", + "to": "Ã" + }, + { + "from": "~n", + "to": "ñ" + }, + { + "from": "~N", + "to": "Ñ" + }, + { + "from": "~o", + "to": "õ" + }, + { + "from": "~O", + "to": "Õ" + } + ] + } + } + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kpj b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kpj new file mode 100644 index 00000000000..4b239df20ce --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kpj @@ -0,0 +1,187 @@ + + + + $PROJECTPATH\build + True + True + False + keyboard + + + + id_f347675c33d2e6b1c705c787fad4941a + khmer_angkor.kmn + source\khmer_angkor.kmn + 1.3 + .kmn +

+ Khmer Angkor + © 2015-2022 SIL International + More than just a Khmer Unicode keyboard. +
+ + + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + khmer_angkor.kps + source\khmer_angkor.kps + + .kps +
+ Khmer Angkor + © 2015-2022 SIL International +
+
+ + id_8a1efc7c4ab7cfece8aedd847679ca27 + khmer_angkor.ico + source\khmer_angkor.ico + + .ico + id_f347675c33d2e6b1c705c787fad4941a + + + id_8dc195db32d1fd0514de0ad51fff5df0 + khmer_angkor.js + source\..\build\khmer_angkor.js + + .js + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_10596632fcbf4138d24bcccf53e6ae01 + khmer_angkor.kvk + source\..\build\khmer_angkor.kvk + + .kvk + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_0a851f95ce553ecd62cbee6c32ced68f + khmer_angkor.kmx + source\..\build\khmer_angkor.kmx + + .kmx + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_d8b6eb05f4b7e2945c10e04c1f49e4c8 + keyboard_layout.png + source\welcome\keyboard_layout.png + + .png + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_724e5b4c63f10bc0abf7077f7c3172fc + welcome.htm + source\welcome\welcome.htm + + .htm + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_35857cb2b54f123612735ec948400082 + FONTLOG.txt + source\..\..\..\shared\fonts\khmer\mondulkiri\FONTLOG.txt + + .txt + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_7e3afe5bb59b888b08b48cd5817d8de4 + Mondulkiri-B.ttf + source\..\..\..\shared\fonts\khmer\mondulkiri\Mondulkiri-B.ttf + + .ttf + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_b9734e80f86c69ea5ae4dfa9f0083d09 + Mondulkiri-BI.ttf + source\..\..\..\shared\fonts\khmer\mondulkiri\Mondulkiri-BI.ttf + + .ttf + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_25abe4d2b0abc03a5be5b666a8de776e + Mondulkiri-I.ttf + source\..\..\..\shared\fonts\khmer\mondulkiri\Mondulkiri-I.ttf + + .ttf + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_b766568498108eee46ed1601ff69c47d + Mondulkiri-R.ttf + source\..\..\..\shared\fonts\khmer\mondulkiri\Mondulkiri-R.ttf + + .ttf + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_84544d04133cab3dbfc86b91ad1a4e17 + OFL.txt + source\..\..\..\shared\fonts\khmer\mondulkiri\OFL.txt + + .txt + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_0c33fbefd1c20f487b1bea2343b3bb2c + OFL-FAQ.txt + source\..\..\..\shared\fonts\khmer\mondulkiri\OFL-FAQ.txt + + .txt + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_a59d89fca36a310147645fa2604e521b + KAK_Documentation_EN.pdf + source\welcome\KAK_Documentation_EN.pdf + + .pdf + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_5643c4cd3933b3ada0b4af6579305ec4 + KAK_Documentation_KH.pdf + source\welcome\KAK_Documentation_KH.pdf + + .pdf + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_8da344c4cea6f467013357fe099006f5 + readme.htm + source\readme.htm + + .htm + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_acb0dd94c60e345d999670e999cbd159 + image002.png + source\welcome\image002.png + + .png + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_4edf70bc019f05b5ad39a2ea727ad547 + khmer_busra_kbd.ttf + source\..\..\..\shared\fonts\khmer\busrakbd\khmer_busra_kbd.ttf + + .ttf + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + id_bc823844e4399751e1867016801f7327 + splash.gif + source\splash.gif + + .gif + id_8d4eb765f80c9f2b0f769cf4e4aaa456 + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kpj.json b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kpj.json new file mode 100644 index 00000000000..8f2310f821c --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kpj.json @@ -0,0 +1,190 @@ +{ + "KeymanDeveloperProject": { + "Options": { + "BuildPath": "$PROJECTPATH\\build", + "CompilerWarningsAsErrors": "True", + "WarnDeprecatedCode": "True", + "CheckFilenameConventions": "False", + "ProjectType": "keyboard" + }, + "Files": { + "File": [ + { + "ID": "id_f347675c33d2e6b1c705c787fad4941a", + "Filename": "khmer_angkor.kmn", + "Filepath": "source\\khmer_angkor.kmn", + "FileVersion": "1.3", + "FileType": ".kmn", + "Details": { + "Name": "Khmer Angkor", + "Copyright": "© 2015-2022 SIL International", + "Message": "More than just a Khmer Unicode keyboard." + } + }, + { + "ID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456", + "Filename": "khmer_angkor.kps", + "Filepath": "source\\khmer_angkor.kps", + "FileVersion": "", + "FileType": ".kps", + "Details": { + "Name": "Khmer Angkor", + "Copyright": "© 2015-2022 SIL International" + } + }, + { + "ID": "id_8a1efc7c4ab7cfece8aedd847679ca27", + "Filename": "khmer_angkor.ico", + "Filepath": "source\\khmer_angkor.ico", + "FileVersion": "", + "FileType": ".ico", + "ParentFileID": "id_f347675c33d2e6b1c705c787fad4941a" + }, + { + "ID": "id_8dc195db32d1fd0514de0ad51fff5df0", + "Filename": "khmer_angkor.js", + "Filepath": "source\\..\\build\\khmer_angkor.js", + "FileVersion": "", + "FileType": ".js", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_10596632fcbf4138d24bcccf53e6ae01", + "Filename": "khmer_angkor.kvk", + "Filepath": "source\\..\\build\\khmer_angkor.kvk", + "FileVersion": "", + "FileType": ".kvk", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_0a851f95ce553ecd62cbee6c32ced68f", + "Filename": "khmer_angkor.kmx", + "Filepath": "source\\..\\build\\khmer_angkor.kmx", + "FileVersion": "", + "FileType": ".kmx", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_d8b6eb05f4b7e2945c10e04c1f49e4c8", + "Filename": "keyboard_layout.png", + "Filepath": "source\\welcome\\keyboard_layout.png", + "FileVersion": "", + "FileType": ".png", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_724e5b4c63f10bc0abf7077f7c3172fc", + "Filename": "welcome.htm", + "Filepath": "source\\welcome\\welcome.htm", + "FileVersion": "", + "FileType": ".htm", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_35857cb2b54f123612735ec948400082", + "Filename": "FONTLOG.txt", + "Filepath": "source\\..\\..\\..\\shared\\fonts\\khmer\\mondulkiri\\FONTLOG.txt", + "FileVersion": "", + "FileType": ".txt", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_7e3afe5bb59b888b08b48cd5817d8de4", + "Filename": "Mondulkiri-B.ttf", + "Filepath": "source\\..\\..\\..\\shared\\fonts\\khmer\\mondulkiri\\Mondulkiri-B.ttf", + "FileVersion": "", + "FileType": ".ttf", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_b9734e80f86c69ea5ae4dfa9f0083d09", + "Filename": "Mondulkiri-BI.ttf", + "Filepath": "source\\..\\..\\..\\shared\\fonts\\khmer\\mondulkiri\\Mondulkiri-BI.ttf", + "FileVersion": "", + "FileType": ".ttf", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_25abe4d2b0abc03a5be5b666a8de776e", + "Filename": "Mondulkiri-I.ttf", + "Filepath": "source\\..\\..\\..\\shared\\fonts\\khmer\\mondulkiri\\Mondulkiri-I.ttf", + "FileVersion": "", + "FileType": ".ttf", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_b766568498108eee46ed1601ff69c47d", + "Filename": "Mondulkiri-R.ttf", + "Filepath": "source\\..\\..\\..\\shared\\fonts\\khmer\\mondulkiri\\Mondulkiri-R.ttf", + "FileVersion": "", + "FileType": ".ttf", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_84544d04133cab3dbfc86b91ad1a4e17", + "Filename": "OFL.txt", + "Filepath": "source\\..\\..\\..\\shared\\fonts\\khmer\\mondulkiri\\OFL.txt", + "FileVersion": "", + "FileType": ".txt", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_0c33fbefd1c20f487b1bea2343b3bb2c", + "Filename": "OFL-FAQ.txt", + "Filepath": "source\\..\\..\\..\\shared\\fonts\\khmer\\mondulkiri\\OFL-FAQ.txt", + "FileVersion": "", + "FileType": ".txt", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_a59d89fca36a310147645fa2604e521b", + "Filename": "KAK_Documentation_EN.pdf", + "Filepath": "source\\welcome\\KAK_Documentation_EN.pdf", + "FileVersion": "", + "FileType": ".pdf", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_5643c4cd3933b3ada0b4af6579305ec4", + "Filename": "KAK_Documentation_KH.pdf", + "Filepath": "source\\welcome\\KAK_Documentation_KH.pdf", + "FileVersion": "", + "FileType": ".pdf", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_8da344c4cea6f467013357fe099006f5", + "Filename": "readme.htm", + "Filepath": "source\\readme.htm", + "FileVersion": "", + "FileType": ".htm", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_acb0dd94c60e345d999670e999cbd159", + "Filename": "image002.png", + "Filepath": "source\\welcome\\image002.png", + "FileVersion": "", + "FileType": ".png", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_4edf70bc019f05b5ad39a2ea727ad547", + "Filename": "khmer_busra_kbd.ttf", + "Filepath": "source\\..\\..\\..\\shared\\fonts\\khmer\\busrakbd\\khmer_busra_kbd.ttf", + "FileVersion": "", + "FileType": ".ttf", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + }, + { + "ID": "id_bc823844e4399751e1867016801f7327", + "Filename": "splash.gif", + "Filepath": "source\\splash.gif", + "FileVersion": "", + "FileType": ".gif", + "ParentFileID": "id_8d4eb765f80c9f2b0f769cf4e4aaa456" + } + ] + } + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks new file mode 100644 index 00000000000..e9c38a464dd --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks @@ -0,0 +1,206 @@ + + +
+ 10.0 + khmer_angkor + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + ] + [ + / + . + + + + & + + * + @ + \ + } + { + - + ÷ + : + , + + ; + < + # + > + × + $ + +   + + + + + + + + + + + + + ᧿ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + « + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ! + + " + + % + + ( + ) + + = + + + ? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + » + + + +
diff --git a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks.json b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks.json new file mode 100644 index 00000000000..6775beb1605 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks.json @@ -0,0 +1,1172 @@ +{ + "visualkeyboard": { + "_": "\n \n \n", + "header": { + "_": "\n \n \n \n ", + "version": "10.0", + "kbdname": "khmer_angkor", + "flags": { + "_": "\n \n ", + "usealtgr": "" + } + }, + "encoding": { + "_": "\n \n \n \n \n ", + "$": { + "name": "unicode", + "fontname": "Khmer Busra Kbd", + "fontsize": "16" + }, + "layer": [ + { + "_": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ", + "$": { + "shift": "RA" + }, + "key": [ + { + "_": "ឞ", + "$": { + "vkey": "K_B" + } + }, + { + "_": "ឝ", + "$": { + "vkey": "K_K" + } + }, + { + "_": "ៈ", + "$": { + "vkey": "K_QUOTE" + } + }, + { + "_": "ឳ", + "$": { + "vkey": "K_RBRKT" + } + }, + { + "_": "ឨ", + "$": { + "vkey": "K_T" + } + }, + { + "_": "ឩ", + "$": { + "vkey": "K_LBRKT" + } + }, + { + "_": "ឰ", + "$": { + "vkey": "K_P" + } + }, + { + "_": "ឫ", + "$": { + "vkey": "K_R" + } + }, + { + "_": "ឦ", + "$": { + "vkey": "K_I" + } + }, + { + "_": "ឱ", + "$": { + "vkey": "K_O" + } + }, + { + "_": "ឯ", + "$": { + "vkey": "K_E" + } + }, + { + "_": "", + "$": { + "vkey": "K_3" + } + }, + { + "_": "", + "$": { + "vkey": "K_W" + } + }, + { + "_": "ៜ", + "$": { + "vkey": "K_Q" + } + }, + { + "_": "", + "$": { + "vkey": "K_EQUAL" + } + }, + { + "_": "៖", + "$": { + "vkey": "K_COLON" + } + }, + { + "_": "៙", + "$": { + "vkey": "K_6" + } + }, + { + "_": "៚", + "$": { + "vkey": "K_7" + } + }, + { + "_": "", + "$": { + "vkey": "K_M" + } + }, + { + "_": "៘", + "$": { + "vkey": "K_L" + } + }, + { + "_": "‌", + "$": { + "vkey": "K_1" + } + }, + { + "_": "‍", + "$": { + "vkey": "K_BKQUOTE" + } + }, + { + "_": "]", + "$": { + "vkey": "K_U" + } + }, + { + "_": "[", + "$": { + "vkey": "K_Y" + } + }, + { + "_": "/", + "$": { + "vkey": "K_SLASH" + } + }, + { + "_": ".", + "$": { + "vkey": "K_PERIOD" + } + }, + { + "_": "‘", + "$": { + "vkey": "K_H" + } + }, + { + "_": "+", + "$": { + "vkey": "K_A" + } + }, + { + "_": "&", + "$": { + "vkey": "K_V" + } + }, + { + "_": "’", + "$": { + "vkey": "K_J" + } + }, + { + "_": "*", + "$": { + "vkey": "K_8" + } + }, + { + "_": "@", + "$": { + "vkey": "K_2" + } + }, + { + "_": "\\", + "$": { + "vkey": "K_BKSLASH" + } + }, + { + "_": "}", + "$": { + "vkey": "K_0" + } + }, + { + "_": "{", + "$": { + "vkey": "K_9" + } + }, + { + "_": "-", + "$": { + "vkey": "K_S" + } + }, + { + "_": "÷", + "$": { + "vkey": "K_F" + } + }, + { + "_": ":", + "$": { + "vkey": "K_G" + } + }, + { + "_": ",", + "$": { + "vkey": "K_COMMA" + } + }, + { + "_": "≈", + "$": { + "vkey": "K_HYPHEN" + } + }, + { + "_": ";", + "$": { + "vkey": "K_N" + } + }, + { + "_": "<", + "$": { + "vkey": "K_Z" + } + }, + { + "_": "#", + "$": { + "vkey": "K_C" + } + }, + { + "_": ">", + "$": { + "vkey": "K_X" + } + }, + { + "_": "×", + "$": { + "vkey": "K_D" + } + }, + { + "_": "$", + "$": { + "vkey": "K_4" + } + }, + { + "_": "€", + "$": { + "vkey": "K_5" + } + }, + { + "_": " ", + "$": { + "vkey": "K_SPACE" + } + } + ] + }, + { + "_": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ", + "$": { + "shift": "SRA" + }, + "key": [ + { + "_": "៸", + "$": { + "vkey": "K_8" + } + }, + { + "_": "៰", + "$": { + "vkey": "K_0" + } + }, + { + "_": "៱", + "$": { + "vkey": "K_1" + } + }, + { + "_": "៲", + "$": { + "vkey": "K_2" + } + }, + { + "_": "៳", + "$": { + "vkey": "K_3" + } + }, + { + "_": "៴", + "$": { + "vkey": "K_4" + } + }, + { + "_": "៵", + "$": { + "vkey": "K_5" + } + }, + { + "_": "៶", + "$": { + "vkey": "K_6" + } + }, + { + "_": "៷", + "$": { + "vkey": "K_7" + } + }, + { + "_": "៹", + "$": { + "vkey": "K_9" + } + }, + { + "_": "᧿", + "$": { + "vkey": "K_PERIOD" + } + }, + { + "_": "᧾", + "$": { + "vkey": "K_COMMA" + } + }, + { + "_": "᧪", + "$": { + "vkey": "K_LBRKT" + } + }, + { + "_": "᧫", + "$": { + "vkey": "K_RBRKT" + } + }, + { + "_": "᧶", + "$": { + "vkey": "K_QUOTE" + } + }, + { + "_": "᧵", + "$": { + "vkey": "K_COLON" + } + }, + { + "_": "᧬", + "$": { + "vkey": "K_A" + } + }, + { + "_": "᧷", + "$": { + "vkey": "K_Z" + } + }, + { + "_": "᧥", + "$": { + "vkey": "K_Y" + } + }, + { + "_": "᧸", + "$": { + "vkey": "K_X" + } + }, + { + "_": "᧡", + "$": { + "vkey": "K_W" + } + }, + { + "_": "᧻", + "$": { + "vkey": "K_B" + } + }, + { + "_": "᧹", + "$": { + "vkey": "K_C" + } + }, + { + "_": "᧮", + "$": { + "vkey": "K_D" + } + }, + { + "_": "᧢", + "$": { + "vkey": "K_E" + } + }, + { + "_": "᧯", + "$": { + "vkey": "K_F" + } + }, + { + "_": "᧰", + "$": { + "vkey": "K_G" + } + }, + { + "_": "᧦", + "$": { + "vkey": "K_U" + } + }, + { + "_": "᧱", + "$": { + "vkey": "K_H" + } + }, + { + "_": "᧤", + "$": { + "vkey": "K_T" + } + }, + { + "_": "᧭", + "$": { + "vkey": "K_S" + } + }, + { + "_": "᧣", + "$": { + "vkey": "K_R" + } + }, + { + "_": "᧧", + "$": { + "vkey": "K_I" + } + }, + { + "_": "᧠", + "$": { + "vkey": "K_Q" + } + }, + { + "_": "᧺", + "$": { + "vkey": "K_V" + } + }, + { + "_": "᧲", + "$": { + "vkey": "K_J" + } + }, + { + "_": "᧳", + "$": { + "vkey": "K_K" + } + }, + { + "_": "᧴", + "$": { + "vkey": "K_L" + } + }, + { + "_": "᧩", + "$": { + "vkey": "K_P" + } + }, + { + "_": "᧨", + "$": { + "vkey": "K_O" + } + }, + { + "_": "᧼", + "$": { + "vkey": "K_N" + } + }, + { + "_": "᧽", + "$": { + "vkey": "K_M" + } + } + ] + }, + { + "_": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ", + "$": { + "shift": "" + }, + "key": [ + { + "_": "​", + "$": { + "vkey": "K_SPACE" + } + }, + { + "_": "", + "$": { + "vkey": "K_QUOTE" + } + }, + { + "_": "", + "$": { + "vkey": "K_COMMA" + } + }, + { + "_": "ឥ", + "$": { + "vkey": "K_HYPHEN" + } + }, + { + "_": "។", + "$": { + "vkey": "K_PERIOD" + } + }, + { + "_": "", + "$": { + "vkey": "K_SLASH" + } + }, + { + "_": "០", + "$": { + "vkey": "K_0" + } + }, + { + "_": "១", + "$": { + "vkey": "K_1" + } + }, + { + "_": "២", + "$": { + "vkey": "K_2" + } + }, + { + "_": "៣", + "$": { + "vkey": "K_3" + } + }, + { + "_": "៤", + "$": { + "vkey": "K_4" + } + }, + { + "_": "៥", + "$": { + "vkey": "K_5" + } + }, + { + "_": "៦", + "$": { + "vkey": "K_6" + } + }, + { + "_": "៧", + "$": { + "vkey": "K_7" + } + }, + { + "_": "៨", + "$": { + "vkey": "K_8" + } + }, + { + "_": "៩", + "$": { + "vkey": "K_9" + } + }, + { + "_": "", + "$": { + "vkey": "K_COLON" + } + }, + { + "_": "ឲ", + "$": { + "vkey": "K_EQUAL" + } + }, + { + "_": "", + "$": { + "vkey": "K_LBRKT" + } + }, + { + "_": "ឮ", + "$": { + "vkey": "K_BKSLASH" + } + }, + { + "_": "ឪ", + "$": { + "vkey": "K_RBRKT" + } + }, + { + "_": "«", + "$": { + "vkey": "K_BKQUOTE" + } + }, + { + "_": "", + "$": { + "vkey": "K_A" + } + }, + { + "_": "ប", + "$": { + "vkey": "K_B" + } + }, + { + "_": "ច", + "$": { + "vkey": "K_C" + } + }, + { + "_": "ដ", + "$": { + "vkey": "K_D" + } + }, + { + "_": "", + "$": { + "vkey": "K_E" + } + }, + { + "_": "ថ", + "$": { + "vkey": "K_F" + } + }, + { + "_": "ង", + "$": { + "vkey": "K_G" + } + }, + { + "_": "ហ", + "$": { + "vkey": "K_H" + } + }, + { + "_": "", + "$": { + "vkey": "K_I" + } + }, + { + "_": "", + "$": { + "vkey": "K_J" + } + }, + { + "_": "ក", + "$": { + "vkey": "K_K" + } + }, + { + "_": "ល", + "$": { + "vkey": "K_L" + } + }, + { + "_": "ម", + "$": { + "vkey": "K_M" + } + }, + { + "_": "ន", + "$": { + "vkey": "K_N" + } + }, + { + "_": "", + "$": { + "vkey": "K_O" + } + }, + { + "_": "ផ", + "$": { + "vkey": "K_P" + } + }, + { + "_": "ឆ", + "$": { + "vkey": "K_Q" + } + }, + { + "_": "រ", + "$": { + "vkey": "K_R" + } + }, + { + "_": "ស", + "$": { + "vkey": "K_S" + } + }, + { + "_": "ត", + "$": { + "vkey": "K_T" + } + }, + { + "_": "", + "$": { + "vkey": "K_U" + } + }, + { + "_": "វ", + "$": { + "vkey": "K_V" + } + }, + { + "_": "", + "$": { + "vkey": "K_W" + } + }, + { + "_": "ខ", + "$": { + "vkey": "K_X" + } + }, + { + "_": "យ", + "$": { + "vkey": "K_Y" + } + }, + { + "_": "ឋ", + "$": { + "vkey": "K_Z" + } + } + ] + }, + { + "_": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ", + "$": { + "shift": "S" + }, + "key": [ + { + "_": "", + "$": { + "vkey": "K_SPACE" + } + }, + { + "_": "!", + "$": { + "vkey": "K_1" + } + }, + { + "_": "", + "$": { + "vkey": "K_QUOTE" + } + }, + { + "_": "\"", + "$": { + "vkey": "K_3" + } + }, + { + "_": "៛", + "$": { + "vkey": "K_4" + } + }, + { + "_": "%", + "$": { + "vkey": "K_5" + } + }, + { + "_": "", + "$": { + "vkey": "K_7" + } + }, + { + "_": "(", + "$": { + "vkey": "K_9" + } + }, + { + "_": ")", + "$": { + "vkey": "K_0" + } + }, + { + "_": "", + "$": { + "vkey": "K_8" + } + }, + { + "_": "=", + "$": { + "vkey": "K_EQUAL" + } + }, + { + "_": "", + "$": { + "vkey": "K_COLON" + } + }, + { + "_": "៕", + "$": { + "vkey": "K_PERIOD" + } + }, + { + "_": "?", + "$": { + "vkey": "K_SLASH" + } + }, + { + "_": "ៗ", + "$": { + "vkey": "K_2" + } + }, + { + "_": "", + "$": { + "vkey": "K_A" + } + }, + { + "_": "ព", + "$": { + "vkey": "K_B" + } + }, + { + "_": "ជ", + "$": { + "vkey": "K_C" + } + }, + { + "_": "ឌ", + "$": { + "vkey": "K_D" + } + }, + { + "_": "", + "$": { + "vkey": "K_E" + } + }, + { + "_": "ធ", + "$": { + "vkey": "K_F" + } + }, + { + "_": "អ", + "$": { + "vkey": "K_G" + } + }, + { + "_": "ះ", + "$": { + "vkey": "K_H" + } + }, + { + "_": "", + "$": { + "vkey": "K_I" + } + }, + { + "_": "ញ", + "$": { + "vkey": "K_J" + } + }, + { + "_": "គ", + "$": { + "vkey": "K_K" + } + }, + { + "_": "ឡ", + "$": { + "vkey": "K_L" + } + }, + { + "_": "", + "$": { + "vkey": "K_M" + } + }, + { + "_": "ណ", + "$": { + "vkey": "K_N" + } + }, + { + "_": "", + "$": { + "vkey": "K_O" + } + }, + { + "_": "ភ", + "$": { + "vkey": "K_P" + } + }, + { + "_": "ឈ", + "$": { + "vkey": "K_Q" + } + }, + { + "_": "ឬ", + "$": { + "vkey": "K_R" + } + }, + { + "_": "", + "$": { + "vkey": "K_S" + } + }, + { + "_": "ទ", + "$": { + "vkey": "K_T" + } + }, + { + "_": "", + "$": { + "vkey": "K_U" + } + }, + { + "_": "", + "$": { + "vkey": "K_V" + } + }, + { + "_": "", + "$": { + "vkey": "K_W" + } + }, + { + "_": "ឃ", + "$": { + "vkey": "K_X" + } + }, + { + "_": "", + "$": { + "vkey": "K_Y" + } + }, + { + "_": "ឍ", + "$": { + "vkey": "K_Z" + } + }, + { + "_": "", + "$": { + "vkey": "K_6" + } + }, + { + "_": "", + "$": { + "vkey": "K_HYPHEN" + } + }, + { + "_": "", + "$": { + "vkey": "K_LBRKT" + } + }, + { + "_": "ឭ", + "$": { + "vkey": "K_BKSLASH" + } + }, + { + "_": "ឧ", + "$": { + "vkey": "K_RBRKT" + } + }, + { + "_": "»", + "$": { + "vkey": "K_BKQUOTE" + } + }, + { + "_": "", + "$": { + "vkey": "K_COMMA" + } + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/fixtures/xml/strs_invalid-illegal.xml b/developer/src/common/web/utils/test/fixtures/xml/strs_invalid-illegal.xml new file mode 100644 index 00000000000..3eddaffdeea --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/strs_invalid-illegal.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/strs_invalid-illegal.xml.json b/developer/src/common/web/utils/test/fixtures/xml/strs_invalid-illegal.xml.json new file mode 100644 index 00000000000..e26bf18696d --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/strs_invalid-illegal.xml.json @@ -0,0 +1,113 @@ +{ + "keyboard3": { + "xmlns": "https://schemas.unicode.org/cldr/45/keyboard3", + "locale": "mt", + "conformsTo": "45", + "version": { + "number": "1.0.0" + }, + "info": { + "author": "srl295", + "indicator": "🙀", + "layout": "qwerty", + "name": "TestKbd" + }, + "displays": { + "display": [ + { + "output": "a", + "display": "^" + }, + { + "keyId": "e", + "display": "^e" + } + ], + "displayOptions": { + "baseCharacter": "e" + } + }, + "keys": { + "key": [ + { + "id": "hmaqtugha", + "output": "h\\u{FDD0}", + "longPressKeyIds": "a e" + }, + { + "id": "that", + "output": "￿" + } + ] + }, + "layers": { + "formId": "us", + "minDeviceWidth": "123", + "layer": { + "id": "￾", + "row": { + "keys": "hmaqtugha that" + } + } + }, + "variables": { + "string": [ + { + "id": "a", + "value": "\\m{a}" + }, + { + "id": "vst", + "value": "abc pua:\\u{E010}" + } + ], + "set": { + "id": "vse", + "value": "a b \\u{04FFFE} \\u{5FFFF}" + }, + "uset": { + "id": "vus", + "value": "[abc]" + } + }, + "transforms": [ + { + "type": "simple", + "transformGroup": [ + { + "transform": [ + { + "from": "^a", + "to": "\\u{FDD0}" + }, + { + "from": "a", + "to": "\\m{a}\\u{E020}" + } + ] + }, + { + "transform": { + "from": "\\m{a}" + } + }, + { + "reorder": { + "before": "\\u{1A6B}", + "from": "\\u{1A60}[\\u{1A75}-\\u{1A79}]\\u{1A45}", + "order": "10 55 10" + } + } + ] + }, + { + "type": "backspace", + "transformGroup": { + "transform": { + "from": "^e" + } + } + } + ] + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/fixtures/xml/test_valid.kps b/developer/src/common/web/utils/test/fixtures/xml/test_valid.kps new file mode 100644 index 00000000000..8877759a281 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/test_valid.kps @@ -0,0 +1,46 @@ + + + + 10.0.1024.0 + 7.0 + + + + + + + + + + + + 1.0 + Test Valid + + + + test_valid.kmx + Keyboard Test Valid + 0 + .kmx + + + test_valid.js + Keyboard Test Valid + 0 + .js + + + + + Test Valid + test_valid + 1.0 + True + + English + + + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/test_valid.kps.json b/developer/src/common/web/utils/test/fixtures/xml/test_valid.kps.json new file mode 100644 index 00000000000..276554d09c3 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/test_valid.kps.json @@ -0,0 +1,64 @@ +{ + "Package": { + "System": { + "KeymanDeveloperVersion": "10.0.1024.0", + "FileVersion": "7.0" + }, + "Options": { + "ExecuteProgram": "", + "MSIFileName": "", + "MSIOptions": "" + }, + "StartMenu": { + "Folder": "", + "Items": "" + }, + "Info": { + "Version": { + "_": "1.0", + "$": { + "URL": "" + } + }, + "Name": { + "_": "Test Valid", + "$": { + "URL": "" + } + } + }, + "Files": { + "File": [ + { + "Name": "test_valid.kmx", + "Description": "Keyboard Test Valid", + "CopyLocation": "0", + "FileType": ".kmx" + }, + { + "Name": "test_valid.js", + "Description": "Keyboard Test Valid", + "CopyLocation": "0", + "FileType": ".js" + } + ] + }, + "Keyboards": { + "Keyboard": { + "Name": "Test Valid", + "ID": "test_valid", + "Version": "1.0", + "RTL": "True", + "Languages": { + "Language": { + "_": "English", + "$": { + "ID": "en" + } + } + } + } + }, + "Strings": "" + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/fixtures/xml/tran_fail-empty.xml b/developer/src/common/web/utils/test/fixtures/xml/tran_fail-empty.xml new file mode 100644 index 00000000000..6c28d3f00d7 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/tran_fail-empty.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/tran_fail-empty.xml.json b/developer/src/common/web/utils/test/fixtures/xml/tran_fail-empty.xml.json new file mode 100644 index 00000000000..3308970fdd8 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/tran_fail-empty.xml.json @@ -0,0 +1,28 @@ +{ + "keyboard3": { + "xmlns": "https://schemas.unicode.org/cldr/45/keyboard3", + "locale": "mt", + "conformsTo": "45", + "info": { + "name": "tran-mixed" + }, + "transforms": { + "type": "simple", + "transformGroup": [ + { + "transform": { + "from": "xx", + "to": "x" + } + }, + { + "reorder": { + "from": "ខែ្ម", + "order": "1 3 4 2" + } + }, + {} + ] + } + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/test-xml-utils.ts b/developer/src/common/web/utils/test/test-xml-utils.ts index 756855e6b9f..b06da2cc034 100644 --- a/developer/src/common/web/utils/test/test-xml-utils.ts +++ b/developer/src/common/web/utils/test/test-xml-utils.ts @@ -1,13 +1,112 @@ import { assert } from 'chai'; import 'mocha'; +import { env } from 'node:process'; +import { readFileSync, writeFileSync } from 'node:fs'; -import { KeymanXMLParser, KeymanXMLGenerator } from '../src/xml-utils.js'; -describe('XML Parser Test', () => { - it('null test', () => assert.ok(new KeymanXMLParser())); +import { KeymanXMLOptions, KeymanXMLReader, KeymanXMLWriter } from '../src/xml-utils.js'; +import { makePathToFixture } from './helpers/index.js'; + +// if true, attempt to WRITE the fixtures +const { GEN_XML_FIXTURES } = env; + +class Case { + options: KeymanXMLOptions; + paths: string[]; +}; + +const read_cases : Case[] = [ + { + options: { type: 'keyboard3' }, + paths: [ + // keyboards + 'disp_maximal.xml', + 'k_020_fr.xml', + 'strs_invalid-illegal.xml', + 'tran_fail-empty.xml', + ], + }, { + options: { type: 'keyboard3-test' }, + paths: [ + // keyboard test + 'k_020_fr-test.xml', + ], + }, { + options: { type: 'kvks' }, + paths: [ + // kvks + 'khmer_angkor.kvks', + ], + }, { + options: { type: 'kps' }, + paths: [ + // kps + 'test_valid.kps', + // 'error_invalid_package_file.kps', + ], + }, { + options: { type: 'kpj' }, + paths: [ + // kpj + 'khmer_angkor.kpj', + ], + }, +]; + +/** read data, or null */ +function readData(path: string) : string | null { + try { + return readFileSync(path, 'utf-8'); + } catch(e) { + if (e?.code !== 'ENOENT') console.error(`reading ${path}`, e); + return null; + } +} + +function readJson(path: string) : any | null { + const data = readData(path); + if(data === null) return null; + return JSON.parse(data); +} + +function writeJson(path: string, data: any) { + writeFileSync(path, JSON.stringify(data, null, ' ')); +} + +describe(`XML Reader Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => { + for (const c of read_cases) { + const {options, paths} = c; + describe(`test reading ${JSON.stringify(options)}`, () => { + const reader = new KeymanXMLReader(options); + assert.ok(reader); + for (const path of paths) { + const xmlPath = makePathToFixture('xml', `${path}`); + const jsonPath = makePathToFixture('xml', `${path}.json`); + it(`read: ${xmlPath}`, () => { + // get the string data + const xml = readData(xmlPath); + assert.ok(xml, `Could not read ${xmlPath}`); + + // now, parse + const actual = reader.parse(xml); + assert.ok(actual, `Parser failed on ${xmlPath}`); + + // get the expected + const expect = readJson(jsonPath); + if (GEN_XML_FIXTURES) { + console.log(`GEN_XML_FIXTURES: writing ${jsonPath} from actual`); + writeJson(jsonPath, actual); + } else { + assert.ok(expect, `Could not read ${jsonPath} - run with env GEN_XML_FIXTURES=1 to update.`); + assert.deepEqual(actual, expect, `Mismatch of ${xmlPath} vs ${jsonPath}`); + } + }); + } + }); + } }); -describe('XML Generator Test', () => { - it('null test', () => assert.ok(new KeymanXMLGenerator())); +describe('XML Writer Test', () => { + it('null test', () => assert.ok(new KeymanXMLWriter({type: 'kpj'}))); }); From 7da7375ee513381b66e752aeb69a8f684fcf24d0 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Sep 2024 17:31:00 -0500 Subject: [PATCH 094/119] feat(common): xml: map \r\n to \n - help make the parsed form identical across platforms Fixes: #12208 --- developer/src/common/web/utils/test/test-xml-utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/developer/src/common/web/utils/test/test-xml-utils.ts b/developer/src/common/web/utils/test/test-xml-utils.ts index b06da2cc034..48461ee58b5 100644 --- a/developer/src/common/web/utils/test/test-xml-utils.ts +++ b/developer/src/common/web/utils/test/test-xml-utils.ts @@ -87,8 +87,8 @@ describe(`XML Reader Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => const xml = readData(xmlPath); assert.ok(xml, `Could not read ${xmlPath}`); - // now, parse - const actual = reader.parse(xml); + // now, parse. subsitute endings for Win + const actual = reader.parse(xml.replace(/\r\n/g, '\n')); assert.ok(actual, `Parser failed on ${xmlPath}`); // get the expected From 3832ca1c122cd4828a8d39b8782733e068e0e95a Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Sep 2024 17:49:32 -0500 Subject: [PATCH 095/119] feat(developer,common): use unified xml parser Subsystems changed: - ldml keyboard reader (main and test) - kpj - kvks - kmp compiler test: made the test-xml-utils less verbose about the pathnames Fixes: #12208 --- .../utils/src/types/kpj/kpj-file-reader.ts | 19 ++----- .../utils/src/types/kvks/kvks-file-reader.ts | 38 +++++--------- .../ldml-keyboard/ldml-keyboard-xml-reader.ts | 49 +++---------------- .../src/common/web/utils/src/xml-utils.ts | 2 +- .../common/web/utils/test/test-xml-utils.ts | 2 +- .../kmc-package/src/compiler/kmp-compiler.ts | 8 ++- 6 files changed, 26 insertions(+), 92 deletions(-) diff --git a/developer/src/common/web/utils/src/types/kpj/kpj-file-reader.ts b/developer/src/common/web/utils/src/types/kpj/kpj-file-reader.ts index d7768987531..4d60436d1c0 100644 --- a/developer/src/common/web/utils/src/types/kpj/kpj-file-reader.ts +++ b/developer/src/common/web/utils/src/types/kpj/kpj-file-reader.ts @@ -1,4 +1,4 @@ -import { xml2js } from '../../index.js'; +import { KeymanXMLReader } from '../../index.js'; import { KPJFile, KPJFileProject } from './kpj-file.js'; import { util } from '@keymanapp/common-types'; import { KeymanDeveloperProject, KeymanDeveloperProjectFile10, KeymanDeveloperProjectType } from './keyman-developer-project.js'; @@ -13,20 +13,9 @@ export class KPJFileReader { public read(file: Uint8Array): KPJFile { let data: KPJFile; - const parser = new xml2js.Parser({ - explicitArray: false, - mergeAttrs: false, - includeWhiteChars: false, - normalize: false, - emptyTag: '' - }); + data = new KeymanXMLReader({ type: 'kpj' }) + .parse(file.toString()); - parser.parseString(file, (e: unknown, r: unknown) => { - if(e) { - throw e; - } - data = r as KPJFile; - }); data = this.boxArrays(data); if(data.KeymanDeveloperProject?.Files?.File?.length) { for(const file of data.KeymanDeveloperProject?.Files?.File) { @@ -126,4 +115,4 @@ export class KPJFileReader { util.boxXmlArray(source.KeymanDeveloperProject.Files, 'File'); return source; } -} \ No newline at end of file +} diff --git a/developer/src/common/web/utils/src/types/kvks/kvks-file-reader.ts b/developer/src/common/web/utils/src/types/kvks/kvks-file-reader.ts index 6b2ad8e0a98..d0a43a6418d 100644 --- a/developer/src/common/web/utils/src/types/kvks/kvks-file-reader.ts +++ b/developer/src/common/web/utils/src/types/kvks/kvks-file-reader.ts @@ -1,5 +1,5 @@ import { SchemaValidators as SV, KvkFile, util, Constants } from '@keymanapp/common-types'; -import { xml2js } from '../../index.js' +import { KeymanXMLReader } from '../../index.js' import KVKSourceFile from './kvks-file.js'; const SchemaValidators = SV.default; import boxXmlArray = util.boxXmlArray; @@ -20,31 +20,15 @@ export default class KVKSFileReader { public read(file: Uint8Array): KVKSourceFile { let source: KVKSourceFile; - const parser = new xml2js.Parser({ - explicitArray: false, - mergeAttrs: false, - includeWhiteChars: true, - normalize: false, - emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - - parser.parseString(file, (e: unknown, r: unknown) => { - if(e) { - if(file.byteLength > 4 && file.subarray(0,3).every((v,i) => v == KVK_HEADER_IDENTIFIER_BYTES[i])) { - throw new Error('File appears to be a binary .kvk file', {cause: e}); - } - throw e; - }; - source = r as KVKSourceFile; - }); + try { + source = new KeymanXMLReader({ type: 'kvks' }) + .parse(file.toString()) as KVKSourceFile; + } catch(e) { + if(file.byteLength > 4 && file.subarray(0,3).every((v,i) => v == KVK_HEADER_IDENTIFIER_BYTES[i])) { + throw new Error('File appears to be a binary .kvk file', {cause: e}); + } + throw e; + } if(source) { source = this.boxArrays(source); this.cleanupFlags(source); @@ -197,4 +181,4 @@ export default class KVKSFileReader { } return 0; } -} \ No newline at end of file +} diff --git a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts index d364c16d7dc..8e653054836 100644 --- a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts +++ b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts @@ -4,13 +4,12 @@ * Reads a LDML XML keyboard file into JS object tree and resolves imports */ import { SchemaValidators, util } from '@keymanapp/common-types'; -import { xml2js } from '../../index.js'; import { CommonTypesMessages } from '../../common-messages.js'; import { CompilerCallbacks } from '../../compiler-interfaces.js'; import { LDMLKeyboardXMLSourceFile, LKImport, ImportStatus } from './ldml-keyboard-xml.js'; import { constants } from '@keymanapp/ldml-keyboard-constants'; import { LDMLKeyboardTestDataXMLSourceFile, LKTTest, LKTTests } from './ldml-keyboard-testdata-xml.js'; - +import { KeymanXMLReader } from '@keymanapp/developer-utils'; import boxXmlArray = util.boxXmlArray; interface NameAndProps { @@ -262,26 +261,9 @@ export class LDMLKeyboardXMLSourceFileReader { } loadUnboxed(file: Uint8Array): LDMLKeyboardXMLSourceFile { - const source = (() => { - let a: LDMLKeyboardXMLSourceFile; - const parser = new xml2js.Parser({ - explicitArray: false, - mergeAttrs: true, - includeWhiteChars: false, - emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - const data = new TextDecoder().decode(file); - parser.parseString(data, (e: unknown, r: unknown) => { if(e) throw e; a = r as LDMLKeyboardXMLSourceFile }); // TODO-LDML: isn't 'e' the error? - return a; - })(); + const data = new TextDecoder().decode(file); + const source = new KeymanXMLReader({ type: 'keyboard3' }) + .parse(data) as LDMLKeyboardXMLSourceFile; return source; } @@ -311,27 +293,8 @@ export class LDMLKeyboardXMLSourceFileReader { } loadTestDataUnboxed(file: Uint8Array): any { - const source = (() => { - let a: any; - const parser = new xml2js.Parser({ - // explicitArray: false, - preserveChildrenOrder:true, // needed for test data - explicitChildren: true, // needed for test data - // mergeAttrs: true, - // includeWhiteChars: false, - // emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - parser.parseString(file, (e: unknown, r: unknown) => { a = r as any }); // TODO-LDML: isn't 'e' the error? - return a; // Why 'any'? Because we need to box up the $'s into proper properties. - })(); + const source = new KeymanXMLReader({ type: 'keyboard3-test' }) + .parse(file.toString()) as any; return source; } diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index 319b607fe73..a6a0849ca41 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -14,7 +14,7 @@ export class KeymanXMLReader { public constructor(public options: KeymanXMLOptions) { } - public parse(data: string): Object { + public parse(data: string): any { const parser = this.parser(); let a: any; parser.parseString(data, (e: unknown, r: unknown) => { if (e) throw e; a = r; }); diff --git a/developer/src/common/web/utils/test/test-xml-utils.ts b/developer/src/common/web/utils/test/test-xml-utils.ts index 48461ee58b5..c0a2855a4f6 100644 --- a/developer/src/common/web/utils/test/test-xml-utils.ts +++ b/developer/src/common/web/utils/test/test-xml-utils.ts @@ -82,7 +82,7 @@ describe(`XML Reader Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => for (const path of paths) { const xmlPath = makePathToFixture('xml', `${path}`); const jsonPath = makePathToFixture('xml', `${path}.json`); - it(`read: ${xmlPath}`, () => { + it(`read: xml/${path}`, () => { // get the string data const xml = readData(xmlPath); assert.ok(xml, `Could not read ${xmlPath}`); diff --git a/developer/src/kmc-package/src/compiler/kmp-compiler.ts b/developer/src/kmc-package/src/compiler/kmp-compiler.ts index 04688d0e5a2..d187f4831e8 100644 --- a/developer/src/kmc-package/src/compiler/kmp-compiler.ts +++ b/developer/src/kmc-package/src/compiler/kmp-compiler.ts @@ -1,4 +1,4 @@ -import { xml2js } from '@keymanapp/developer-utils'; +import { KeymanXMLReader } from '@keymanapp/developer-utils'; import JSZip from 'jszip'; import KEYMAN_VERSION from "@keymanapp/keyman-version"; @@ -180,12 +180,10 @@ export class KmpCompiler implements KeymanCompiler { const kpsPackage = (() => { let a: KpsFile.KpsPackage; - let parser = new xml2js.Parser({ - explicitArray: false - }); try { - parser.parseString(data, (e: unknown, r: unknown) => { if(e) throw e; a = r as KpsFile.KpsPackage }); + a = new KeymanXMLReader({ type: 'kps' }) + .parse(data.toString()) as KpsFile.KpsPackage; } catch(e) { this.callbacks.reportMessage(PackageCompilerMessages.Error_InvalidPackageFile({e})); } From d540e4cda0f4cd9278415c9c89308dc11c7d9341 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Sep 2024 18:37:40 -0500 Subject: [PATCH 096/119] feat(common): unified xml writer test Fixes: #12208 --- .../src/common/web/utils/src/xml-utils.ts | 23 + .../test/fixtures/xml/khmer_angkor2.kvks | 206 +++ .../test/fixtures/xml/khmer_angkor2.kvks.json | 1172 +++++++++++++++++ .../common/web/utils/test/test-xml-utils.ts | 57 +- 4 files changed, 1449 insertions(+), 9 deletions(-) create mode 100644 developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks create mode 100644 developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks.json diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index a6a0849ca41..8b467b03422 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -93,7 +93,30 @@ export class KeymanXMLReader { /** wrapper for XML generation support */ export class KeymanXMLWriter { + write(data: any) : string { + const builder = this.builder(); + return builder.buildObject(data); + } constructor(public options: KeymanXMLOptions) { } + + public builder() { + switch(this.options.type) { + case 'kvks': + return new xml2js.Builder({ + allowSurrogateChars: true, + attrkey: '$', + charkey: '_', + xmldec: { + version: '1.0', + encoding: 'UTF-8', + standalone: true + } + }); + default: + /* c8 ignore next 1 */ + throw Error(`Internal error: unhandled XML type ${this.options.type}`); + } + } } diff --git a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks new file mode 100644 index 00000000000..05eb838178f --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks @@ -0,0 +1,206 @@ + + +
+ 10.0 + khmer_angkor + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + ] + [ + / + . + + + + & + + * + @ + \ + } + { + - + ÷ + : + , + + ; + < + # + > + × + $ + +   + + + + + + + + + + + + + ᧿ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + « + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ! + + " + + % + + ( + ) + + = + + + ? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + » + + + +
\ No newline at end of file diff --git a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks.json b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks.json new file mode 100644 index 00000000000..beabd9e6737 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks.json @@ -0,0 +1,1172 @@ +{ + "visualkeyboard": { + + "header": { + + "version": "10.0", + "kbdname": "khmer_angkor", + "flags": { + + "usealtgr": "" + } + }, + "encoding": { + + "$": { + "name": "unicode", + "fontname": "Khmer Busra Kbd", + "fontsize": "16" + }, + "layer": [ + { + + "$": { + "shift": "RA" + }, + "key": [ + { + "_": "ឞ", + "$": { + "vkey": "K_B" + } + }, + { + "_": "ឝ", + "$": { + "vkey": "K_K" + } + }, + { + "_": "ៈ", + "$": { + "vkey": "K_QUOTE" + } + }, + { + "_": "ឳ", + "$": { + "vkey": "K_RBRKT" + } + }, + { + "_": "ឨ", + "$": { + "vkey": "K_T" + } + }, + { + "_": "ឩ", + "$": { + "vkey": "K_LBRKT" + } + }, + { + "_": "ឰ", + "$": { + "vkey": "K_P" + } + }, + { + "_": "ឫ", + "$": { + "vkey": "K_R" + } + }, + { + "_": "ឦ", + "$": { + "vkey": "K_I" + } + }, + { + "_": "ឱ", + "$": { + "vkey": "K_O" + } + }, + { + "_": "ឯ", + "$": { + "vkey": "K_E" + } + }, + { + "_": "", + "$": { + "vkey": "K_3" + } + }, + { + "_": "", + "$": { + "vkey": "K_W" + } + }, + { + "_": "ៜ", + "$": { + "vkey": "K_Q" + } + }, + { + "_": "", + "$": { + "vkey": "K_EQUAL" + } + }, + { + "_": "៖", + "$": { + "vkey": "K_COLON" + } + }, + { + "_": "៙", + "$": { + "vkey": "K_6" + } + }, + { + "_": "៚", + "$": { + "vkey": "K_7" + } + }, + { + "_": "", + "$": { + "vkey": "K_M" + } + }, + { + "_": "៘", + "$": { + "vkey": "K_L" + } + }, + { + "_": "‌", + "$": { + "vkey": "K_1" + } + }, + { + "_": "‍", + "$": { + "vkey": "K_BKQUOTE" + } + }, + { + "_": "]", + "$": { + "vkey": "K_U" + } + }, + { + "_": "[", + "$": { + "vkey": "K_Y" + } + }, + { + "_": "/", + "$": { + "vkey": "K_SLASH" + } + }, + { + "_": ".", + "$": { + "vkey": "K_PERIOD" + } + }, + { + "_": "‘", + "$": { + "vkey": "K_H" + } + }, + { + "_": "+", + "$": { + "vkey": "K_A" + } + }, + { + "_": "&", + "$": { + "vkey": "K_V" + } + }, + { + "_": "’", + "$": { + "vkey": "K_J" + } + }, + { + "_": "*", + "$": { + "vkey": "K_8" + } + }, + { + "_": "@", + "$": { + "vkey": "K_2" + } + }, + { + "_": "\\", + "$": { + "vkey": "K_BKSLASH" + } + }, + { + "_": "}", + "$": { + "vkey": "K_0" + } + }, + { + "_": "{", + "$": { + "vkey": "K_9" + } + }, + { + "_": "-", + "$": { + "vkey": "K_S" + } + }, + { + "_": "÷", + "$": { + "vkey": "K_F" + } + }, + { + "_": ":", + "$": { + "vkey": "K_G" + } + }, + { + "_": ",", + "$": { + "vkey": "K_COMMA" + } + }, + { + "_": "≈", + "$": { + "vkey": "K_HYPHEN" + } + }, + { + "_": ";", + "$": { + "vkey": "K_N" + } + }, + { + "_": "<", + "$": { + "vkey": "K_Z" + } + }, + { + "_": "#", + "$": { + "vkey": "K_C" + } + }, + { + "_": ">", + "$": { + "vkey": "K_X" + } + }, + { + "_": "×", + "$": { + "vkey": "K_D" + } + }, + { + "_": "$", + "$": { + "vkey": "K_4" + } + }, + { + "_": "€", + "$": { + "vkey": "K_5" + } + }, + { + "_": " ", + "$": { + "vkey": "K_SPACE" + } + } + ] + }, + { + + "$": { + "shift": "SRA" + }, + "key": [ + { + "_": "៸", + "$": { + "vkey": "K_8" + } + }, + { + "_": "៰", + "$": { + "vkey": "K_0" + } + }, + { + "_": "៱", + "$": { + "vkey": "K_1" + } + }, + { + "_": "៲", + "$": { + "vkey": "K_2" + } + }, + { + "_": "៳", + "$": { + "vkey": "K_3" + } + }, + { + "_": "៴", + "$": { + "vkey": "K_4" + } + }, + { + "_": "៵", + "$": { + "vkey": "K_5" + } + }, + { + "_": "៶", + "$": { + "vkey": "K_6" + } + }, + { + "_": "៷", + "$": { + "vkey": "K_7" + } + }, + { + "_": "៹", + "$": { + "vkey": "K_9" + } + }, + { + "_": "᧿", + "$": { + "vkey": "K_PERIOD" + } + }, + { + "_": "᧾", + "$": { + "vkey": "K_COMMA" + } + }, + { + "_": "᧪", + "$": { + "vkey": "K_LBRKT" + } + }, + { + "_": "᧫", + "$": { + "vkey": "K_RBRKT" + } + }, + { + "_": "᧶", + "$": { + "vkey": "K_QUOTE" + } + }, + { + "_": "᧵", + "$": { + "vkey": "K_COLON" + } + }, + { + "_": "᧬", + "$": { + "vkey": "K_A" + } + }, + { + "_": "᧷", + "$": { + "vkey": "K_Z" + } + }, + { + "_": "᧥", + "$": { + "vkey": "K_Y" + } + }, + { + "_": "᧸", + "$": { + "vkey": "K_X" + } + }, + { + "_": "᧡", + "$": { + "vkey": "K_W" + } + }, + { + "_": "᧻", + "$": { + "vkey": "K_B" + } + }, + { + "_": "᧹", + "$": { + "vkey": "K_C" + } + }, + { + "_": "᧮", + "$": { + "vkey": "K_D" + } + }, + { + "_": "᧢", + "$": { + "vkey": "K_E" + } + }, + { + "_": "᧯", + "$": { + "vkey": "K_F" + } + }, + { + "_": "᧰", + "$": { + "vkey": "K_G" + } + }, + { + "_": "᧦", + "$": { + "vkey": "K_U" + } + }, + { + "_": "᧱", + "$": { + "vkey": "K_H" + } + }, + { + "_": "᧤", + "$": { + "vkey": "K_T" + } + }, + { + "_": "᧭", + "$": { + "vkey": "K_S" + } + }, + { + "_": "᧣", + "$": { + "vkey": "K_R" + } + }, + { + "_": "᧧", + "$": { + "vkey": "K_I" + } + }, + { + "_": "᧠", + "$": { + "vkey": "K_Q" + } + }, + { + "_": "᧺", + "$": { + "vkey": "K_V" + } + }, + { + "_": "᧲", + "$": { + "vkey": "K_J" + } + }, + { + "_": "᧳", + "$": { + "vkey": "K_K" + } + }, + { + "_": "᧴", + "$": { + "vkey": "K_L" + } + }, + { + "_": "᧩", + "$": { + "vkey": "K_P" + } + }, + { + "_": "᧨", + "$": { + "vkey": "K_O" + } + }, + { + "_": "᧼", + "$": { + "vkey": "K_N" + } + }, + { + "_": "᧽", + "$": { + "vkey": "K_M" + } + } + ] + }, + { + + "$": { + "shift": "" + }, + "key": [ + { + "_": "​", + "$": { + "vkey": "K_SPACE" + } + }, + { + "_": "", + "$": { + "vkey": "K_QUOTE" + } + }, + { + "_": "", + "$": { + "vkey": "K_COMMA" + } + }, + { + "_": "ឥ", + "$": { + "vkey": "K_HYPHEN" + } + }, + { + "_": "។", + "$": { + "vkey": "K_PERIOD" + } + }, + { + "_": "", + "$": { + "vkey": "K_SLASH" + } + }, + { + "_": "០", + "$": { + "vkey": "K_0" + } + }, + { + "_": "១", + "$": { + "vkey": "K_1" + } + }, + { + "_": "២", + "$": { + "vkey": "K_2" + } + }, + { + "_": "៣", + "$": { + "vkey": "K_3" + } + }, + { + "_": "៤", + "$": { + "vkey": "K_4" + } + }, + { + "_": "៥", + "$": { + "vkey": "K_5" + } + }, + { + "_": "៦", + "$": { + "vkey": "K_6" + } + }, + { + "_": "៧", + "$": { + "vkey": "K_7" + } + }, + { + "_": "៨", + "$": { + "vkey": "K_8" + } + }, + { + "_": "៩", + "$": { + "vkey": "K_9" + } + }, + { + "_": "", + "$": { + "vkey": "K_COLON" + } + }, + { + "_": "ឲ", + "$": { + "vkey": "K_EQUAL" + } + }, + { + "_": "", + "$": { + "vkey": "K_LBRKT" + } + }, + { + "_": "ឮ", + "$": { + "vkey": "K_BKSLASH" + } + }, + { + "_": "ឪ", + "$": { + "vkey": "K_RBRKT" + } + }, + { + "_": "«", + "$": { + "vkey": "K_BKQUOTE" + } + }, + { + "_": "", + "$": { + "vkey": "K_A" + } + }, + { + "_": "ប", + "$": { + "vkey": "K_B" + } + }, + { + "_": "ច", + "$": { + "vkey": "K_C" + } + }, + { + "_": "ដ", + "$": { + "vkey": "K_D" + } + }, + { + "_": "", + "$": { + "vkey": "K_E" + } + }, + { + "_": "ថ", + "$": { + "vkey": "K_F" + } + }, + { + "_": "ង", + "$": { + "vkey": "K_G" + } + }, + { + "_": "ហ", + "$": { + "vkey": "K_H" + } + }, + { + "_": "", + "$": { + "vkey": "K_I" + } + }, + { + "_": "", + "$": { + "vkey": "K_J" + } + }, + { + "_": "ក", + "$": { + "vkey": "K_K" + } + }, + { + "_": "ល", + "$": { + "vkey": "K_L" + } + }, + { + "_": "ម", + "$": { + "vkey": "K_M" + } + }, + { + "_": "ន", + "$": { + "vkey": "K_N" + } + }, + { + "_": "", + "$": { + "vkey": "K_O" + } + }, + { + "_": "ផ", + "$": { + "vkey": "K_P" + } + }, + { + "_": "ឆ", + "$": { + "vkey": "K_Q" + } + }, + { + "_": "រ", + "$": { + "vkey": "K_R" + } + }, + { + "_": "ស", + "$": { + "vkey": "K_S" + } + }, + { + "_": "ត", + "$": { + "vkey": "K_T" + } + }, + { + "_": "", + "$": { + "vkey": "K_U" + } + }, + { + "_": "វ", + "$": { + "vkey": "K_V" + } + }, + { + "_": "", + "$": { + "vkey": "K_W" + } + }, + { + "_": "ខ", + "$": { + "vkey": "K_X" + } + }, + { + "_": "យ", + "$": { + "vkey": "K_Y" + } + }, + { + "_": "ឋ", + "$": { + "vkey": "K_Z" + } + } + ] + }, + { + + "$": { + "shift": "S" + }, + "key": [ + { + "_": "", + "$": { + "vkey": "K_SPACE" + } + }, + { + "_": "!", + "$": { + "vkey": "K_1" + } + }, + { + "_": "", + "$": { + "vkey": "K_QUOTE" + } + }, + { + "_": "\"", + "$": { + "vkey": "K_3" + } + }, + { + "_": "៛", + "$": { + "vkey": "K_4" + } + }, + { + "_": "%", + "$": { + "vkey": "K_5" + } + }, + { + "_": "", + "$": { + "vkey": "K_7" + } + }, + { + "_": "(", + "$": { + "vkey": "K_9" + } + }, + { + "_": ")", + "$": { + "vkey": "K_0" + } + }, + { + "_": "", + "$": { + "vkey": "K_8" + } + }, + { + "_": "=", + "$": { + "vkey": "K_EQUAL" + } + }, + { + "_": "", + "$": { + "vkey": "K_COLON" + } + }, + { + "_": "៕", + "$": { + "vkey": "K_PERIOD" + } + }, + { + "_": "?", + "$": { + "vkey": "K_SLASH" + } + }, + { + "_": "ៗ", + "$": { + "vkey": "K_2" + } + }, + { + "_": "", + "$": { + "vkey": "K_A" + } + }, + { + "_": "ព", + "$": { + "vkey": "K_B" + } + }, + { + "_": "ជ", + "$": { + "vkey": "K_C" + } + }, + { + "_": "ឌ", + "$": { + "vkey": "K_D" + } + }, + { + "_": "", + "$": { + "vkey": "K_E" + } + }, + { + "_": "ធ", + "$": { + "vkey": "K_F" + } + }, + { + "_": "អ", + "$": { + "vkey": "K_G" + } + }, + { + "_": "ះ", + "$": { + "vkey": "K_H" + } + }, + { + "_": "", + "$": { + "vkey": "K_I" + } + }, + { + "_": "ញ", + "$": { + "vkey": "K_J" + } + }, + { + "_": "គ", + "$": { + "vkey": "K_K" + } + }, + { + "_": "ឡ", + "$": { + "vkey": "K_L" + } + }, + { + "_": "", + "$": { + "vkey": "K_M" + } + }, + { + "_": "ណ", + "$": { + "vkey": "K_N" + } + }, + { + "_": "", + "$": { + "vkey": "K_O" + } + }, + { + "_": "ភ", + "$": { + "vkey": "K_P" + } + }, + { + "_": "ឈ", + "$": { + "vkey": "K_Q" + } + }, + { + "_": "ឬ", + "$": { + "vkey": "K_R" + } + }, + { + "_": "", + "$": { + "vkey": "K_S" + } + }, + { + "_": "ទ", + "$": { + "vkey": "K_T" + } + }, + { + "_": "", + "$": { + "vkey": "K_U" + } + }, + { + "_": "", + "$": { + "vkey": "K_V" + } + }, + { + "_": "", + "$": { + "vkey": "K_W" + } + }, + { + "_": "ឃ", + "$": { + "vkey": "K_X" + } + }, + { + "_": "", + "$": { + "vkey": "K_Y" + } + }, + { + "_": "ឍ", + "$": { + "vkey": "K_Z" + } + }, + { + "_": "", + "$": { + "vkey": "K_6" + } + }, + { + "_": "", + "$": { + "vkey": "K_HYPHEN" + } + }, + { + "_": "", + "$": { + "vkey": "K_LBRKT" + } + }, + { + "_": "ឭ", + "$": { + "vkey": "K_BKSLASH" + } + }, + { + "_": "ឧ", + "$": { + "vkey": "K_RBRKT" + } + }, + { + "_": "»", + "$": { + "vkey": "K_BKQUOTE" + } + }, + { + "_": "", + "$": { + "vkey": "K_COMMA" + } + } + ] + } + ] + } + } +} diff --git a/developer/src/common/web/utils/test/test-xml-utils.ts b/developer/src/common/web/utils/test/test-xml-utils.ts index c0a2855a4f6..8d32c7e1746 100644 --- a/developer/src/common/web/utils/test/test-xml-utils.ts +++ b/developer/src/common/web/utils/test/test-xml-utils.ts @@ -15,7 +15,7 @@ class Case { paths: string[]; }; -const read_cases : Case[] = [ +const read_cases: Case[] = [ { options: { type: 'keyboard3' }, paths: [ @@ -53,19 +53,29 @@ const read_cases : Case[] = [ }, ]; +const write_cases: Case[] = [ + { + options: { type: 'kvks' }, + paths: [ + // kvks + 'khmer_angkor2.kvks', // similar to the 'read case' with the similar name, except for whitespace differences and the prologue + ], + }, +]; + /** read data, or null */ -function readData(path: string) : string | null { +function readData(path: string): string | null { try { return readFileSync(path, 'utf-8'); - } catch(e) { + } catch (e) { if (e?.code !== 'ENOENT') console.error(`reading ${path}`, e); return null; } } -function readJson(path: string) : any | null { +function readJson(path: string): any | null { const data = readData(path); - if(data === null) return null; + if (data === null) return null; return JSON.parse(data); } @@ -75,7 +85,7 @@ function writeJson(path: string, data: any) { describe(`XML Reader Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => { for (const c of read_cases) { - const {options, paths} = c; + const { options, paths } = c; describe(`test reading ${JSON.stringify(options)}`, () => { const reader = new KeymanXMLReader(options); assert.ok(reader); @@ -106,7 +116,36 @@ describe(`XML Reader Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => } }); -describe('XML Writer Test', () => { - it('null test', () => assert.ok(new KeymanXMLWriter({type: 'kpj'}))); -}); +describe(`XML Writer Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => { + for (const c of write_cases) { + const { options, paths } = c; + describe(`test writing ${JSON.stringify(options)}`, () => { + const writer = new KeymanXMLWriter(options); + assert.ok(writer); + for (const path of paths) { + const jsonPath = makePathToFixture('xml', `${path}.json`); + const xmlPath = makePathToFixture('xml', `${path}`); + it(`write: xml/${path}`, () => { + // get the object data + const data = readJson(jsonPath); + assert.ok(data, `Could not read input ${jsonPath}`); + + // now, write. + const actual = writer.write(data); + assert.ok(actual, `Writer failed on ${jsonPath}`); + + if (GEN_XML_FIXTURES) { + console.log(`GEN_XML_FIXTURES: writing ${xmlPath} from actual`); + writeFileSync(xmlPath, actual); + } else { + // get the expected data + const expect = readData(xmlPath).replace(/\r\n/g, '\n'); + assert.ok(expect, `Could not read expected output ${xmlPath} - run with env=GEN_XML_FIXTURES=1 to update`); + assert.deepEqual(actual.trim(), expect.trim(), `Mismatch of ${xmlPath} vs ${jsonPath}`); + } + }); + } + }); + } +}); From 1780b1ebf3e3d6b2da2cbc03e6e73df7b6b9d09d Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Sep 2024 18:53:54 -0500 Subject: [PATCH 097/119] feat(developer,common): use unified xml writer Fixes: #12208 --- .../utils/src/types/kvks/kvks-file-writer.ts | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/developer/src/common/web/utils/src/types/kvks/kvks-file-writer.ts b/developer/src/common/web/utils/src/types/kvks/kvks-file-writer.ts index dd4962a8fad..6138403f6ef 100644 --- a/developer/src/common/web/utils/src/types/kvks/kvks-file-writer.ts +++ b/developer/src/common/web/utils/src/types/kvks/kvks-file-writer.ts @@ -1,6 +1,6 @@ import { VisualKeyboard as VK, Constants } from '@keymanapp/common-types'; import KVKSourceFile, { KVKSEncoding, KVKSFlags, KVKSKey, KVKSLayer } from './kvks-file.js'; -import { xml2js } from '../../index.js'; +import { KeymanXMLWriter } from '../../index.js'; import USVirtualKeyCodes = Constants.USVirtualKeyCodes; import VisualKeyboard = VK.VisualKeyboard; @@ -11,18 +11,6 @@ import VisualKeyboardShiftState = VK.VisualKeyboardShiftState; export default class KVKSFileWriter { public write(vk: VisualKeyboard): string { - - const builder = new xml2js.Builder({ - allowSurrogateChars: true, - attrkey: '$', - charkey: '_', - xmldec: { - version: '1.0', - encoding: 'UTF-8', - standalone: true - } - }) - const flags: KVKSFlags = {}; if(vk.header.flags & VisualKeyboardHeaderFlags.kvkhDisplayUnderlying) { flags.displayunderlying = ''; @@ -37,8 +25,6 @@ export default class KVKSFileWriter { flags.useunderlying = ''; } - - const kvks: KVKSourceFile = { visualkeyboard: { header: { @@ -105,7 +91,7 @@ export default class KVKSFileWriter { l.key.push(k); } - const result = builder.buildObject(kvks); + const result = new KeymanXMLWriter({type: 'kvks'}).write(kvks); return result; //Uint8Array.from(result); } @@ -124,4 +110,4 @@ export default class KVKSFileWriter { } return ''; } -} \ No newline at end of file +} From 8e3b6b4a54f1bcd36468cf87b1cb02e429d88fb6 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Sat, 28 Sep 2024 05:57:04 +0200 Subject: [PATCH 098/119] Update docs/file-formats/kmx-plus-file-format.md Co-authored-by: Steven R. Loomis --- docs/file-formats/kmx-plus-file-format.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/file-formats/kmx-plus-file-format.md b/docs/file-formats/kmx-plus-file-format.md index a289213d53e..680f3675b92 100644 --- a/docs/file-formats/kmx-plus-file-format.md +++ b/docs/file-formats/kmx-plus-file-format.md @@ -35,10 +35,9 @@ Draft spec PR: - Other than the `sect` table itself, the rest of the sections follow in binary order in the file. In other words, the binary ordering of the section identifiers determines the order of the file layout. -- All sections other than the `sect` table are optional, - however, the `elem` table is required to have as its initial entry - the null element string (with offset=0, length=0), - so essentially the 'elem' table is required to be present as well +- All sections other than the `sect` table are optional for the file + format to be valid, however, a valid keyboard will need most or + all of the sections present to be usable. ### C7043.2.1 `sect`—Section Table of contents From 4c202a1312983558b0356f81b062d2c7969cccad Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Sat, 28 Sep 2024 14:02:54 -0400 Subject: [PATCH 099/119] auto: increment master version to 18.0.120 --- HISTORY.md | 7 +++++++ VERSION.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 01762fcc2c9..b18c1a27ce3 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ # Keyman Version History +## 18.0.119 alpha 2024-09-28 + +* refactor(developer): copy dev 17.0 help into repo (#12427) +* fix(developer): warn before importing over touch layout (#12478) +* chore(linux): display branch name with API verification (#12480) +* docs(core): Update kmx-plus-file-format.md (#12479) + ## 18.0.118 alpha 2024-09-26 * chore(developer): add context/options (#11566) diff --git a/VERSION.md b/VERSION.md index 49dcd615789..003084cd89e 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.119 \ No newline at end of file +18.0.120 \ No newline at end of file From bc1d3f16fa9e25be240ec196c908620618e0f575 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Mon, 23 Sep 2024 08:07:45 +0700 Subject: [PATCH 100/119] chore(oem/fv): Update FirstVoices keyboard versions --- oem/firstvoices/keyboards.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/oem/firstvoices/keyboards.csv b/oem/firstvoices/keyboards.csv index d1f1b92180e..c3df46af415 100644 --- a/oem/firstvoices/keyboards.csv +++ b/oem/firstvoices/keyboards.csv @@ -11,7 +11,7 @@ fv,fv_uwikala,'Uwik̓ala,BC Coast,fv_uwikala_kmw-9.0.js,9.4,hei,Heiltsuk fv,fv_dexwlesucid,Dəxʷləšucid,BC Coast,fv_dexwlesucid_kmw-9.0.js,9.2.1,lut-Latn,Lushootseed (Latin) fv,fv_diitiidatx,Diidiitidq,BC Coast,fv_diitiidatx_kmw-9.0.js,9.2.1,nuk-Latn,Nuu-chah-nulth (Latin) fv,fv_gitsenimx,Gitsenimx̱,BC Coast,fv_gitsenimx_kmw-9.0.js,10.1.2,git,Gitxsan (Latin) -fv,fv_hailzaqvla,Haiɫzaqvla,BC Coast,fv_hailzaqvla_kmw-9.0.js,9.5.2,hei,Heiltsuk (Latin) +fv,fv_hailzaqvla,Haiɫzaqvla,BC Coast,fv_hailzaqvla_kmw-9.0.js,10.0,hei,Heiltsuk (Latin) fv,fv_haisla,Haisla,BC Coast,fv_haisla.js,2.1.3,has-Latn,Haisla (Latin) fv,fv_halqemeylem,Halq'eméylem,BC Coast,fv_halqemeylem_kmw-9.0.js,9.2.1,hur-Latn,Halkomelem (Latin) fv,fv_henqeminem,Hǝn̓q̓ǝmin̓ǝm,BC Coast,fv_henqeminem_kmw-9.0.js,10.2.1,hur-Latn,Halkomelem (Latin) @@ -88,7 +88,7 @@ fv,fv_dine_bizaad,Diné Bizaad,South West,fv_dine_bizaad_kmw-9.0.js,9.1.1,nv-La fv,fv_dane_zaa_zaage,Dane-Z̲aa Z̲áágéʔ,Western Subarctic,fv_dane_zaa_zaage_kmw-9.0.js,9.4.1,bea,Beaver fv,fv_dene_dzage,Dene Dzage,Western Subarctic,fv_dene_dzage_kmw-9.0.js,11.0.1,kkz-Latn,Kaska (Latin) fv,fv_dene_zhatie,Dene Zhatié,Western Subarctic,fv_dene_zhatie_kmw-9.0.js,10.2.1,den,Dene Zhatıé -fv,fv_denesuline_epsilon,Dënesųłıné,Western Subarctic,fv_denesuline_epsilon_kmw-9.0.js,10.0.1,chp,Chipewyan +fv,fv_denesuline_epsilon,Dënesųłıné,Western Subarctic,fv_denesuline_epsilon_kmw-9.0.js,10.0.2,chp,Chipewyan fv,fv_denesuline,Dɛnɛsųłiné,Western Subarctic,fv_denesuline_kmw-9.0.js,10.0.1,chp,Chipewyan (Latin) fv,fv_gwichin,Gwich'in,Western Subarctic,fv_gwichin_kmw-9.0.js,9.2.1,gwi-Latn,Gwichʼin (Latin) fv,fv_han,Hän,Western Subarctic,fv_han_kmw-9.0.js,9.2,haa-Latn,Han (Latin) From 813f4725d5329bd7a6dd64b7dc310dc8e9b534d0 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 24 Sep 2024 08:41:15 +0700 Subject: [PATCH 101/119] fix(oem/fv): Update keyboard names --- oem/firstvoices/keyboards.csv | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/oem/firstvoices/keyboards.csv b/oem/firstvoices/keyboards.csv index c3df46af415..d0bc2867974 100644 --- a/oem/firstvoices/keyboards.csv +++ b/oem/firstvoices/keyboards.csv @@ -15,7 +15,7 @@ fv,fv_hailzaqvla,Haiɫzaqvla,BC Coast,fv_hailzaqvla_kmw-9.0.js,10.0,hei,Heiltsuk fv,fv_haisla,Haisla,BC Coast,fv_haisla.js,2.1.3,has-Latn,Haisla (Latin) fv,fv_halqemeylem,Halq'eméylem,BC Coast,fv_halqemeylem_kmw-9.0.js,9.2.1,hur-Latn,Halkomelem (Latin) fv,fv_henqeminem,Hǝn̓q̓ǝmin̓ǝm,BC Coast,fv_henqeminem_kmw-9.0.js,10.2.1,hur-Latn,Halkomelem (Latin) -fv,fv_klahoose,Homalco-Klahoose-Sliammon,BC Coast,fv_klahoose_kmw-9.0.js,10.2,coo,Comox +fv,fv_klahoose,Éy7á7juuthem,BC Coast,fv_klahoose_kmw-9.0.js,10.2,coo,Comox fv,fv_hulquminum,Hul’q’umi’num’,BC Coast,fv_hulquminum_kmw-9.0.js,9.1,hur,Halkomelem fv,fv_hulquminum_combine,Hul̓q̓umin̓um̓,BC Coast,fv_hulquminum_combine_kmw-9.0.js,2.0.1,hur-Latn,Halkomelem (Latin) fv,fv_kwakwala_liqwala,Kʷak̓ʷala,BC Coast,fv_kwakwala_liqwala_kmw-9.0.js,9.3,kwk-Latn,Kwakiutl (Latin) @@ -39,7 +39,7 @@ fv,fv_natwits,Nedut’en-Witsuwit'en,BC Interior,fv_natwits_kmw-9.0.js,9.2,caf-L fv,fv_nlekepmxcin,Nłeʔkepmxcin,BC Interior,fv_nlekepmxcin_kmw-9.0.js,9.5.1,thp-Latn,Thompson (Latin) fv,fv_nlha7kapmxtsin,Nlha7kapmxtsin,BC Interior,fv_nlha7kapmxtsin_kmw-9.0.js,10.1.2,thp,Thompson fv,fv_nlakapamuxcheen,Nlakapamuxcheen,BC Interior,fv_nlakapamuxcheen_kmw-9.0.js,1.1,thp,Thompson -fv,fv_nsilxcen,Nsilxcən,BC Interior,fv_nsilxcen_kmw-9.0.js,10.0.1,oka,Okanagan +fv,fv_nsilxcen,Nsyilxcən,BC Interior,fv_nsilxcen_kmw-9.0.js,10.0.1,oka,Okanagan fv,fv_secwepemctsin,Secwepemctsín,BC Interior,fv_secwepemctsin_kmw-9.0.js,9.3,shs,Shuswap fv,fv_stlatlimxec,Sƛ̓aƛ̓imxəc,BC Interior,fv_stlatlimxec_kmw-9.0.js,9.4,lil-Latn,Lillooet (Latin) fv,fv_statimcets,St̓át̓imcets,BC Interior,fv_statimcets_kmw-9.0.js,9.2,lil-Latn,Lillooet (Latin) @@ -86,8 +86,8 @@ fv,fv_tsuutina,Tsúùt'ínà,Prairies,fv_tsuutina_kmw-9.0.js,9.1.1,srs-Latn,Sars fv,fv_plains_cree,ᓀᐦᐃᔭᐍᐏᐣ (Plains Cree),Prairies,fv_plains_cree_kmw-9.0.js,11.1,crk-Cans,ᓀᐦᐃᔭᐍᐏᐣ (Cree syllabics) fv,fv_dine_bizaad,Diné Bizaad,South West,fv_dine_bizaad_kmw-9.0.js,9.1.1,nv-Latn,Navajo (Latin) fv,fv_dane_zaa_zaage,Dane-Z̲aa Z̲áágéʔ,Western Subarctic,fv_dane_zaa_zaage_kmw-9.0.js,9.4.1,bea,Beaver -fv,fv_dene_dzage,Dene Dzage,Western Subarctic,fv_dene_dzage_kmw-9.0.js,11.0.1,kkz-Latn,Kaska (Latin) -fv,fv_dene_zhatie,Dene Zhatié,Western Subarctic,fv_dene_zhatie_kmw-9.0.js,10.2.1,den,Dene Zhatıé +fv,fv_dene_dzage,Danezāgéʼ,Western Subarctic,fv_dene_dzage_kmw-9.0.js,11.0.1,kkz-Latn,Kaska (Latin) +fv,fv_dene_zhatie,Dene Zhatıé,Western Subarctic,fv_dene_zhatie_kmw-9.0.js,10.2.1,den,Dene Zhatıé fv,fv_denesuline_epsilon,Dënesųłıné,Western Subarctic,fv_denesuline_epsilon_kmw-9.0.js,10.0.2,chp,Chipewyan fv,fv_denesuline,Dɛnɛsųłiné,Western Subarctic,fv_denesuline_kmw-9.0.js,10.0.1,chp,Chipewyan (Latin) fv,fv_gwichin,Gwich'in,Western Subarctic,fv_gwichin_kmw-9.0.js,9.2.1,gwi-Latn,Gwichʼin (Latin) From c2bbf5b62e1afbd56dd10c310f6e3ac7ae40b1af Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Thu, 26 Sep 2024 08:16:39 +0700 Subject: [PATCH 102/119] fix(oem/fv): Match more keyboard names from kmp.json --- oem/firstvoices/keyboards.csv | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/oem/firstvoices/keyboards.csv b/oem/firstvoices/keyboards.csv index d0bc2867974..cb6d081a72a 100644 --- a/oem/firstvoices/keyboards.csv +++ b/oem/firstvoices/keyboards.csv @@ -7,11 +7,11 @@ fv,fv_uummarmiutun,Uummarmiutun,Arctic,fv_uummarmiutun_kmw-9.0.js,9.1.1,ikt-Latn fv,fv_eastern_canadian_inuktitut,ᐃᓄᒃᑎᑐᑦ (Eastern Canadian Inuktitut),Arctic,fv_eastern_canadian_inuktitut_kmw-9.0.js,9.2.1,ike-Cans,Eastern Canadian Inuktitut (Unified Canadian Aboriginal Syllabics) fv,fv_migmaq,Mi'gmawi'simg / Mi'kmawi'simk,Atlantic,fv_migmaq_kmw-9.0.js,9.1.2,mic-Latn,Mi'kmaq (Latin) fv,fv_skicinuwatuwewakon,Skicinuwatuwewakon,Atlantic,fv_skicinuwatuwewakon_kmw-9.0.js,9.1.1,pqm-Latn,Malecite-Passamaquoddy (Latin) -fv,fv_uwikala,'Uwik̓ala,BC Coast,fv_uwikala_kmw-9.0.js,9.4,hei,Heiltsuk +fv,fv_uwikala,’Wuìk̓ala,BC Coast,fv_uwikala_kmw-9.0.js,9.4,hei,Heiltsuk fv,fv_dexwlesucid,Dəxʷləšucid,BC Coast,fv_dexwlesucid_kmw-9.0.js,9.2.1,lut-Latn,Lushootseed (Latin) fv,fv_diitiidatx,Diidiitidq,BC Coast,fv_diitiidatx_kmw-9.0.js,9.2.1,nuk-Latn,Nuu-chah-nulth (Latin) fv,fv_gitsenimx,Gitsenimx̱,BC Coast,fv_gitsenimx_kmw-9.0.js,10.1.2,git,Gitxsan (Latin) -fv,fv_hailzaqvla,Haiɫzaqvla,BC Coast,fv_hailzaqvla_kmw-9.0.js,10.0,hei,Heiltsuk (Latin) +fv,fv_hailzaqvla,Haíɫzaqvḷa,BC Coast,fv_hailzaqvla_kmw-9.0.js,10.0,hei,Heiltsuk (Latin) fv,fv_haisla,Haisla,BC Coast,fv_haisla.js,2.1.3,has-Latn,Haisla (Latin) fv,fv_halqemeylem,Halq'eméylem,BC Coast,fv_halqemeylem_kmw-9.0.js,9.2.1,hur-Latn,Halkomelem (Latin) fv,fv_henqeminem,Hǝn̓q̓ǝmin̓ǝm,BC Coast,fv_henqeminem_kmw-9.0.js,10.2.1,hur-Latn,Halkomelem (Latin) @@ -28,9 +28,9 @@ fv,fv_nuxalk,Nuxalk,BC Coast,fv_nuxalk_kmw-9.0.js,10.0.1,blc-Latn,Bella Coola (L fv,fv_sencoten,SENĆOŦEN,BC Coast,fv_sencoten_kmw-9.0.js,9.2.3,str,Straits Salish fv,fv_sguuxs,Sgüüx̱s,BC Coast,fv_sguuxs.js,1.1,tsi,Tsimshian fv,fv_shashishalhem,Shashishalhem,BC Coast,fv_shashishalhem_kmw-9.0.js,9.2.1,sec-Latn,Sechelt (Latin) -fv,fv_skwxwumesh_snichim,Sḵwx̱wúmesh sníchim,BC Coast,fv_skwxwumesh_snichim_kmw-9.0.js,10.0,squ-Latn,Squamish (Latin) +fv,fv_skwxwumesh_snichim,Sḵwx̱wú7mesh sníchim,BC Coast,fv_skwxwumesh_snichim_kmw-9.0.js,10.0,squ-Latn,Squamish (Latin) fv,fv_smalgyax,Sm'algya̱x,BC Coast,fv_smalgyax_kmw-9.0.js,9.3,tsi-Latn,Tsimshian (Latin) -fv,fv_xaislakala,X̄a'ʼislak̓ala,BC Coast,fv_xaislakala_kmw-9.0.js,10.0,has-Latn,Haisla (Latin) +fv,fv_xaislakala,X̄aʼislak̓ala,BC Coast,fv_xaislakala_kmw-9.0.js,10.0,has-Latn,Haisla (Latin) fv,fv_hlgaagilda_xaayda_kil,X̱aayda-X̱aad Kil,BC Coast,fv_hlgaagilda_xaayda_kil_kmw-9.0.js,9.4,hax,Southern Haida fv,fv_dakelh,Dakelh,BC Interior,fv_dakelh_kmw-9.0.js,9.2.1,caf-Latn,Southern Carrier (Latin) fv,fv_ktunaxa,Ktunaxa,BC Interior,fv_ktunaxa_kmw-9.0.js,10.0,kut-Latn,Kutenai (Latin) @@ -43,9 +43,9 @@ fv,fv_nsilxcen,Nsyilxcən,BC Interior,fv_nsilxcen_kmw-9.0.js,10.0.1,oka,Okanagan fv,fv_secwepemctsin,Secwepemctsín,BC Interior,fv_secwepemctsin_kmw-9.0.js,9.3,shs,Shuswap fv,fv_stlatlimxec,Sƛ̓aƛ̓imxəc,BC Interior,fv_stlatlimxec_kmw-9.0.js,9.4,lil-Latn,Lillooet (Latin) fv,fv_statimcets,St̓át̓imcets,BC Interior,fv_statimcets_kmw-9.0.js,9.2,lil-Latn,Lillooet (Latin) -fv,fv_taltan,Tāłtān,BC Interior,fv_taltan_kmw-9.0.js,9.2,tht-Latn,Tahltan (Latin) +fv,fv_taltan,Tāłtān,BC Interior,fv_taltan_kmw-9.0.js,9.2,tht-Latn,Tahltan (Latin) fv,fv_tsekehne,Tsek'ehne,BC Interior,fv_tsekehne_kmw-9.0.js,9.2,sek-Latn,Sekani (Latin) -fv,fv_tsilhqotin,Tŝilhqot'in,BC Interior,fv_tsilhqotin_kmw-9.0.js,9.3,clc-Latn,Chilcotin (Latin) +fv,fv_tsilhqotin,Tŝilhqot’in,BC Interior,fv_tsilhqotin_kmw-9.0.js,9.3,clc-Latn,Chilcotin (Latin) fv,fv_southern_carrier,ᑐᑊᘁᗕᑋᗸ (Southern Carrier),BC Interior,fv_southern_carrier_kmw-9.0.js,10.1,caf-Cans,Southern Carrier (Unified Canadian Aboriginal Syllabics) fv,fv_anicinapemi8in,Anicinapemi8in/Anishinàbemiwin,Eastern Subarctic,fv_anicinapemi8in_kmw-9.0.js,9.1.1,alq-Latn,Algonquin (Latin) fv,fv_atikamekw,Atikamekw,Eastern Subarctic,fv_atikamekw_kmw-9.0.js,9.1.1,atj-Latn,Atikamekw (Latin) @@ -87,9 +87,9 @@ fv,fv_plains_cree,ᓀᐦᐃᔭᐍᐏᐣ (Plains Cree),Prairies,fv_plains_cree_km fv,fv_dine_bizaad,Diné Bizaad,South West,fv_dine_bizaad_kmw-9.0.js,9.1.1,nv-Latn,Navajo (Latin) fv,fv_dane_zaa_zaage,Dane-Z̲aa Z̲áágéʔ,Western Subarctic,fv_dane_zaa_zaage_kmw-9.0.js,9.4.1,bea,Beaver fv,fv_dene_dzage,Danezāgéʼ,Western Subarctic,fv_dene_dzage_kmw-9.0.js,11.0.1,kkz-Latn,Kaska (Latin) -fv,fv_dene_zhatie,Dene Zhatıé,Western Subarctic,fv_dene_zhatie_kmw-9.0.js,10.2.1,den,Dene Zhatıé -fv,fv_denesuline_epsilon,Dënesųłıné,Western Subarctic,fv_denesuline_epsilon_kmw-9.0.js,10.0.2,chp,Chipewyan -fv,fv_denesuline,Dɛnɛsųłiné,Western Subarctic,fv_denesuline_kmw-9.0.js,10.0.1,chp,Chipewyan (Latin) +fv,fv_dene_zhatie,Dene Zhatıé,Western Subarctic,fv_dene_zhatie_kmw-9.0.js,10.2.1,den,Dene Zhatıé +fv,fv_denesuline_epsilon,Dɛnɛsųłįnɛ,Western Subarctic,fv_denesuline_epsilon_kmw-9.0.js,10.0.2,chp,Chipewyan +fv,fv_denesuline,Dënesųłıné,Western Subarctic,fv_denesuline_kmw-9.0.js,10.0.1,chp,Chipewyan (Latin) fv,fv_gwichin,Gwich'in,Western Subarctic,fv_gwichin_kmw-9.0.js,9.2.1,gwi-Latn,Gwichʼin (Latin) fv,fv_han,Hän,Western Subarctic,fv_han_kmw-9.0.js,9.2,haa-Latn,Han (Latin) fv,fv_kashogotine_yati,K'áshogot'ı̨nę́ Yatı̨́,Western Subarctic,fv_kashogotine_yati_kmw-9.0.js,10.1,scs,North Slavey From bc8c74d4f0c983e45522af7196dc424e0c8ae55a Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Mon, 30 Sep 2024 11:02:45 +0700 Subject: [PATCH 103/119] chore(common): Add note on troubleshooting website errors --- docs/websites/README.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/docs/websites/README.md b/docs/websites/README.md index 62fc3f7388c..be329ad054b 100644 --- a/docs/websites/README.md +++ b/docs/websites/README.md @@ -58,14 +58,14 @@ Some sites have assets in `/cdn/dev/` used to generate CDN in `/dev/deploy/`. To ##### Port lookup table After this, you can access the website at the following ports: -| Website | URL | with website-local-proxy running | -|----------------|-----------------------|-----------------------------------| -| keyman.com | http://localhost:8053 | http://keyman.com.localhost | -| s.keyman.com | http://localhost:8054 | http://s.keyman.com.localhost | -| help.keyman | http://localhost:8055 | http://help.keyman.com.localhost | -| keymanweb.com | http://localhost:8057 | http://keymanweb.com.localhost | -| | | http://web.keyman.com.localhost | -| api.keyman.com | http://localhost:8058 | http://api.keyman.com.localhost | +| Website | URL | with website-local-proxy running | Docker Container Name | +|----------------|-----------------------|-----------------------------------|------------------------| +| keyman.com | http://localhost:8053 | http://keyman.com.localhost | keyman-website | +| s.keyman.com | http://localhost:8054 | http://s.keyman.com.localhost | s-keyman-website | +| help.keyman | http://localhost:8055 | http://help.keyman.com.localhost | help-keyman-website | +| keymanweb.com | http://localhost:8057 | http://keymanweb.com.localhost | web-keyman-website | +| | | http://web.keyman.com.localhost | | +| api.keyman.com | http://localhost:8058 | http://api.keyman.com.localhost | api-keyman-com-website | #### Remove the Docker container and image 1. Run `./build.sh clean`. @@ -78,6 +78,16 @@ You might need to install the broken-link-checker first Checks for broken links 1. Run `./build.sh test` +#### Troubleshooting Errors + +You can access PHP errors with + +```bash +docker logs -f {Docker Container Name} +``` + +Refer to **Port lookup table** above for Docker container names + --------- ## Kubernetes Deployment From a85b701aede91cf6efdbd9e7bd2d13498c17098b Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Mon, 30 Sep 2024 15:28:08 +0700 Subject: [PATCH 104/119] docs(developer): Fix image links in help --- .../guides/test/keyboard-touch-and-desktop.md | 16 ++++++++-------- .../test/keyboard-touch-mobile-emulator.md | 10 +++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/developer/docs/help/guides/test/keyboard-touch-and-desktop.md b/developer/docs/help/guides/test/keyboard-touch-and-desktop.md index c947cef1b71..33900238911 100644 --- a/developer/docs/help/guides/test/keyboard-touch-and-desktop.md +++ b/developer/docs/help/guides/test/keyboard-touch-and-desktop.md @@ -6,7 +6,7 @@ Keyman Developer includes full touch layout editing tools. In the image below I am editing a Khmer Angkor touch layout sample. [![Touch Editor - -Khmer](../../../images/testing/touch-editor-khmer-800wi.png "Touch Editor - Khmer")](../../../images/testing/touch-editor-khmer.png) +Khmer](../../images/testing/touch-editor-khmer-800wi.png "Touch Editor - Khmer")](../../images/testing/touch-editor-khmer.png) Once you have created your keyboard layout, you need to test it. Your keyboard layout may cover desktops as well as touch devices. The @@ -14,7 +14,7 @@ keyboard layout may cover desktops as well as touch devices. The debugging commands for all platforms. [![Touch Editor - Build -tab](../../../images/testing/touch-editor-build-800wi.png "Touch Editor - Build tab")](../../../images/testing/touch-editor-build.png) +tab](../../images/testing/touch-editor-build-800wi.png "Touch Editor - Build tab")](../../images/testing/touch-editor-build.png) Testing is easy on Windows: press the **Start Debugging** button on the **Build** tab to test the rules in your keyboard layout with a [fully @@ -56,7 +56,7 @@ will need to use different addresses; Keyman Developer leaves that up to you! We call the list the **Debug Host List**. ![KeymanWeb Debug -Host](../../../images/testing/startdebugging-kd10.png "KeymanWeb Debug Host") +Host](../../images/testing/startdebugging-kd10.png "KeymanWeb Debug Host") ## Testing your web keyboard on your desktop @@ -91,12 +91,12 @@ choice, so you can then just click the link in your email on your target device. ![Enter the debug host -URL](../../../images/testing/frame/android-enter-debug-host.png "Enter the debug host URL") +URL](../../images/testing/frame/android-enter-debug-host.png "Enter the debug host URL") All going well, you should be presented with a page like this: ![Viewing the debug host on -iPhone](../../../images/testing/frame/android-debug-host.png "Viewing the debug host on iPhone") +iPhone](../../images/testing/frame/android-debug-host.png "Viewing the debug host on iPhone") If you get a Host Not Found error, try different addresses from the **KeymanWeb Debug Host** list, check your computer's firewall settings, @@ -109,7 +109,7 @@ F7), and reload on the touch device -- you don't need to click the **Test Keyboard on web** button again. ![Testing a keyboard on -iPhone](../../../images/testing/frame/android-debug-keyboard.png "Testing a keyboard on iPhone") +iPhone](../../images/testing/frame/android-debug-keyboard.png "Testing a keyboard on iPhone") ## Loading your keyboard into the native Keyman apps @@ -123,10 +123,10 @@ to Keyman for Android** button or **Add keyboard to Keyman for iOS** button on the test page on your device. ![Installing the keyboard into native -app](../../../images/testing/frame/installing-native-keyboard-1.png "Installing the keyboard into native app") +app](../../images/testing/frame/installing-native-keyboard-1.png "Installing the keyboard into native app") ![Installing the keyboard into native -app](../../../images/testing/frame/installing-native-keyboard-2.png "Installing the keyboard into native app") +app](../../images/testing/frame/installing-native-keyboard-2.png "Installing the keyboard into native app") Now your keyboard layout is installed and available in the Keyman App, and if you have the Keyman version with the system keyboard support diff --git a/developer/docs/help/guides/test/keyboard-touch-mobile-emulator.md b/developer/docs/help/guides/test/keyboard-touch-mobile-emulator.md index 62d14affc3f..fb68b11f2b2 100644 --- a/developer/docs/help/guides/test/keyboard-touch-mobile-emulator.md +++ b/developer/docs/help/guides/test/keyboard-touch-mobile-emulator.md @@ -24,24 +24,24 @@ devices emulated may or not work as well a real device. 1. Start testing your keyboard with the [original steps on testing touch keyboards](keyboard-touch-and-desktop). - ![](../../../images/testing/startdebugging-kd10.png "StartDebugging") + ![](../../images/testing/startdebugging-kd10.png "StartDebugging") 2. Open Chrome, navigate to the debug host page for your keyboard, and press F12. - ![Chrome1](../../../images/testing/chrome1.png "Chrome1") + ![Chrome1](../../images/testing/chrome1.png "Chrome1") 3. In the Developer Tools window, click the mobile icon: - ![Chrome2](../../../images/testing/chrome2.png "Chrome2") + ![Chrome2](../../images/testing/chrome2.png "Chrome2") 4. Back in the debug host page, select the appropriate device from the mobile emulation toolbar, then press F5 to reload and enable the touch mode. Some recommended devices are iPad or iPad Pro for tablet testing, and iPhone X or Nexus 6P for mobile testing. Do not select "Responsive". - ![Chrome3](../../../images/testing/chrome3.png "Chrome3") + ![Chrome3](../../images/testing/chrome3.png "Chrome3") 5. At this point, you should see a simulation of selected device's screen, and KeymanWeb should be presenting its touch keyboard rather than the desktop equivalent. You'll also see the mouse cursor has turned into a fuzzy circle, to simulate a fingertip instead of a precise arrow. - ![Chrome4"](../../../images/testing/chrome4.png "Chrome4") + ![Chrome4"](../../images/testing/chrome4.png "Chrome4") You can now test the keyboard layout and get an idea of how it will feel on a real touch device. Rotation, or changing device types will require From 3056128c149b587a1c0172dee8670b0a55df4414 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 30 Sep 2024 14:51:24 +0200 Subject: [PATCH 105/119] chore(common): create flag file without node Addresses code review comments. --- .gitignore | 3 +++ common/tools/hextobin/build.sh | 2 +- common/tools/hextobin/package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 772784fdb8c..6c8fbfbec84 100644 --- a/.gitignore +++ b/.gitignore @@ -183,3 +183,6 @@ lcov.info /keyman*.buildinfo /keyman*.changes /keyman*.tar.?z + +# flag file for build script +.configured diff --git a/common/tools/hextobin/build.sh b/common/tools/hextobin/build.sh index 309260c1b12..073b008bf2e 100755 --- a/common/tools/hextobin/build.sh +++ b/common/tools/hextobin/build.sh @@ -11,7 +11,7 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" builder_describe "Build hextobin" clean configure build builder_describe_outputs \ - configure /common/tools/hextobin/build/.configured \ + configure /common/tools/hextobin/.configured \ build /common/tools/hextobin/build/index.js builder_parse "$@" diff --git a/common/tools/hextobin/package.json b/common/tools/hextobin/package.json index 2cb98f81cc4..708dace5028 100644 --- a/common/tools/hextobin/package.json +++ b/common/tools/hextobin/package.json @@ -17,6 +17,6 @@ "hextobin": "build/hextobin.js" }, "scripts": { - "postinstall": "node --eval \"const fs =require('fs'); const path = require('path'); var dir = 'build'; if (!fs.existsSync(dir)) { fs.mkdirSync(dir); } fs.writeFileSync(path.join(dir, '.configured'), '');\"" + "postinstall": "echo configured > .configured" } } From 4540a501f63e57ecb3098e6fff4dff686fcb83bd Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 30 Sep 2024 16:03:03 +0200 Subject: [PATCH 106/119] docs(common): mention `KEYMAN_USE_NVM` in minimum versions doc Also fix a typo in a comment in a script file. --- resources/build/minimum-versions.inc.sh | 2 +- resources/locate_emscripten.inc.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/build/minimum-versions.inc.sh b/resources/build/minimum-versions.inc.sh index f58e7575d96..6f0211895ab 100644 --- a/resources/build/minimum-versions.inc.sh +++ b/resources/build/minimum-versions.inc.sh @@ -18,7 +18,7 @@ KEYMAN_MIN_TARGET_VERSION_UBUNTU=20.04 # Ubuntu 20.04 Focal KEYMAN_MIN_TARGET_VERSION_CHROME=95.0 # Final version that runs on Android 5.0 # Dependency versions -KEYMAN_MIN_VERSION_NODE_MAJOR=20 # node version source of truth is /package.json:/engines/node +KEYMAN_MIN_VERSION_NODE_MAJOR=20 # node version source of truth is /package.json:/engines/node; use KEYMAN_USE_NVM to automatically update KEYMAN_MIN_VERSION_NPM=10.5.1 # 10.5.0 has bug, discussed in #10350 KEYMAN_MIN_VERSION_EMSCRIPTEN=3.1.58 # Use KEYMAN_USE_EMSDK to automatically update to this version KEYMAN_MIN_VERSION_VISUAL_STUDIO=2019 diff --git a/resources/locate_emscripten.inc.sh b/resources/locate_emscripten.inc.sh index 3d470f75772..1d185f55525 100644 --- a/resources/locate_emscripten.inc.sh +++ b/resources/locate_emscripten.inc.sh @@ -41,7 +41,7 @@ locate_emscripten() { } # Ensure that we use correct version of emsdk on build agents. -# For developers, define KEYMAN_USE_SDK to do this on your +# For developers, define KEYMAN_USE_EMSDK to do this on your # build machine. verify_emscripten_version() { if [[ "$VERSION_ENVIRONMENT" != local || ! -z "${KEYMAN_USE_EMSDK+x}" ]]; then From eba7079694a334edaaa3033832fafe9fb2c42452 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 30 Sep 2024 10:00:46 -0500 Subject: [PATCH 107/119] chore(developer): update per style guide Fixes: #12208 --- .../src/common/web/utils/src/xml-utils.ts | 216 +++++++++--------- .../common/web/utils/test/test-xml-utils.ts | 8 + 2 files changed, 120 insertions(+), 104 deletions(-) diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index 8b467b03422..e902435cae3 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -1,122 +1,130 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Created by srl on 2024-09-27 + * + * Abstraction for XML reading and writing + */ + import { xml2js } from "./index.js"; export class KeymanXMLOptions { - type: 'keyboard3' // LDML - | 'keyboard3-test' // LDML - | 'kps' // - | 'kvks' // - | 'kpj' // // - ; + type: 'keyboard3' // LDML + | 'keyboard3-test' // LDML + | 'kps' // + | 'kvks' // + | 'kpj' // // + ; } /** wrapper for XML parsing support */ export class KeymanXMLReader { - public constructor(public options: KeymanXMLOptions) { - } + public constructor(public options: KeymanXMLOptions) { + } - public parse(data: string): any { - const parser = this.parser(); - let a: any; - parser.parseString(data, (e: unknown, r: unknown) => { if (e) throw e; a = r; }); - return a; - } + public parse(data: string): any { + const parser = this.parser(); + let a: any; + parser.parseString(data, (e: unknown, r: unknown) => { if (e) throw e; a = r; }); + return a; + } - public parser() { - const { type } = this.options; - switch (type) { - case 'keyboard3': - return new xml2js.Parser({ - explicitArray: false, - mergeAttrs: true, - includeWhiteChars: false, - emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - case 'keyboard3-test': - return new xml2js.Parser({ - // explicitArray: false, - preserveChildrenOrder: true, // needed for test data - explicitChildren: true, // needed for test data - // mergeAttrs: true, - // includeWhiteChars: false, - // emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - case 'kps': - return new xml2js.Parser({ - explicitArray: false - }); - case 'kpj': - return new xml2js.Parser({ - explicitArray: false, - mergeAttrs: false, - includeWhiteChars: false, - normalize: false, - emptyTag: '' - }); - case 'kvks': - return new xml2js.Parser({ - explicitArray: false, - mergeAttrs: false, - includeWhiteChars: true, - normalize: false, - emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - default: - /* c8 ignore next 1 */ - throw Error(`Internal error: unhandled XML type ${type}`); - } + public parser() { + const { type } = this.options; + switch (type) { + case 'keyboard3': + return new xml2js.Parser({ + explicitArray: false, + mergeAttrs: true, + includeWhiteChars: false, + emptyTag: {} as any + // Why "as any"? xml2js is broken: + // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means + // that an old version of `emptyTag` is used which doesn't support + // functions, but DefinitelyTyped is requiring use of function or a + // string. See also notes at + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 + // An alternative fix would be to pull xml2js directly from github + // rather than using the version tagged on npmjs.com. + }); + case 'keyboard3-test': + return new xml2js.Parser({ + // explicitArray: false, + preserveChildrenOrder: true, // needed for test data + explicitChildren: true, // needed for test data + // mergeAttrs: true, + // includeWhiteChars: false, + // emptyTag: {} as any + // Why "as any"? xml2js is broken: + // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means + // that an old version of `emptyTag` is used which doesn't support + // functions, but DefinitelyTyped is requiring use of function or a + // string. See also notes at + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 + // An alternative fix would be to pull xml2js directly from github + // rather than using the version tagged on npmjs.com. + }); + case 'kps': + return new xml2js.Parser({ + explicitArray: false + }); + case 'kpj': + return new xml2js.Parser({ + explicitArray: false, + mergeAttrs: false, + includeWhiteChars: false, + normalize: false, + emptyTag: '' + }); + case 'kvks': + return new xml2js.Parser({ + explicitArray: false, + mergeAttrs: false, + includeWhiteChars: true, + normalize: false, + emptyTag: {} as any + // Why "as any"? xml2js is broken: + // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means + // that an old version of `emptyTag` is used which doesn't support + // functions, but DefinitelyTyped is requiring use of function or a + // string. See also notes at + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 + // An alternative fix would be to pull xml2js directly from github + // rather than using the version tagged on npmjs.com. + }); + default: + /* c8 ignore next 1 */ + throw Error(`Internal error: unhandled XML type ${type}`); } + } } /** wrapper for XML generation support */ export class KeymanXMLWriter { - write(data: any) : string { - const builder = this.builder(); - return builder.buildObject(data); - } - constructor(public options: KeymanXMLOptions) { - } + write(data: any): string { + const builder = this.builder(); + return builder.buildObject(data); + } + constructor(public options: KeymanXMLOptions) { + } - public builder() { - switch(this.options.type) { - case 'kvks': - return new xml2js.Builder({ - allowSurrogateChars: true, - attrkey: '$', - charkey: '_', - xmldec: { - version: '1.0', - encoding: 'UTF-8', - standalone: true - } - }); - default: - /* c8 ignore next 1 */ - throw Error(`Internal error: unhandled XML type ${this.options.type}`); - } + public builder() { + switch (this.options.type) { + case 'kvks': + return new xml2js.Builder({ + allowSurrogateChars: true, + attrkey: '$', + charkey: '_', + xmldec: { + version: '1.0', + encoding: 'UTF-8', + standalone: true + } + }); + default: + /* c8 ignore next 1 */ + throw Error(`Internal error: unhandled XML type ${this.options.type}`); } + } } diff --git a/developer/src/common/web/utils/test/test-xml-utils.ts b/developer/src/common/web/utils/test/test-xml-utils.ts index 8d32c7e1746..d9e7f63ae3d 100644 --- a/developer/src/common/web/utils/test/test-xml-utils.ts +++ b/developer/src/common/web/utils/test/test-xml-utils.ts @@ -1,3 +1,11 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Created by srl on 2024-09-27 + * + * Test for abstraction for XML reading and writing + */ + import { assert } from 'chai'; import 'mocha'; import { env } from 'node:process'; From c5ded39fe05ee6019b4bf3d77f147f9aadff02d9 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 30 Sep 2024 18:49:43 +0200 Subject: [PATCH 108/119] docs(web): fix paths to several help pages --- web/src/app/browser/src/contextManager.ts | 2 +- web/src/app/browser/src/keymanEngine.ts | 4 ++-- web/src/engine/keyboard/src/keyboards/keyboardProperties.ts | 4 ++-- web/src/engine/main/src/keyboardInterface.ts | 2 +- web/src/engine/osk/src/views/oskView.ts | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/web/src/app/browser/src/contextManager.ts b/web/src/app/browser/src/contextManager.ts index 1fbc9052033..c2254c1fdd5 100644 --- a/web/src/app/browser/src/contextManager.ts +++ b/web/src/app/browser/src/contextManager.ts @@ -415,7 +415,7 @@ export default class ContextManager extends ContextManagerBase Date: Mon, 30 Sep 2024 18:52:08 +0200 Subject: [PATCH 109/119] docs(web): fix structure of test document When looking at `index.html` in VSCode's hierarchical view I noticed that the structure was off because some closing tags were missing. This fixes that. --- web/src/test/manual/web/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/test/manual/web/index.html b/web/src/test/manual/web/index.html index 8ee99a5ac32..6d608b08d33 100644 --- a/web/src/test/manual/web/index.html +++ b/web/src/test/manual/web/index.html @@ -29,7 +29,7 @@

Miscellaneous tests for smaller features

-

Chirality testing/bootstrapping

+

Chirality testing/bootstrapping

Tests option/variable store functionality

Platform testing

Prediction UI testing

@@ -40,7 +40,7 @@

Integration with CKEditor

Tests toggling & use of desktop OSK config & help buttons

Page integration (attachment) tests

-

Tests the Attachment/Enablement API functionality

+

Tests the Attachment/Enablement API functionality

Test desktop MutationObserver functionality

Light test for touch-based MutationObserver functionality

Test/stress-test touch-based MutationObserver functionality

From 158c4a7637c1b0a68bace21b3e94def5a3fcc7a6 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 30 Sep 2024 13:25:38 -0500 Subject: [PATCH 110/119] feat(developer): update the unified xml parser per review - declarative syntax for options - workaround an issue where xml2js is mutating our options objects - improve tests Fixes: #12208 --- developer/src/common/web/utils/src/index.ts | 4 +- .../utils/src/types/kpj/kpj-file-reader.ts | 2 +- .../utils/src/types/kvks/kvks-file-reader.ts | 2 +- .../utils/src/types/kvks/kvks-file-writer.ts | 2 +- .../ldml-keyboard/ldml-keyboard-xml-reader.ts | 4 +- .../src/common/web/utils/src/xml-utils.ts | 180 +++++++++--------- .../common/web/utils/test/test-xml-utils.ts | 32 ++-- .../kmc-package/src/compiler/kmp-compiler.ts | 2 +- 8 files changed, 113 insertions(+), 115 deletions(-) diff --git a/developer/src/common/web/utils/src/index.ts b/developer/src/common/web/utils/src/index.ts index 7b83f682dff..21b59cc749f 100644 --- a/developer/src/common/web/utils/src/index.ts +++ b/developer/src/common/web/utils/src/index.ts @@ -44,6 +44,4 @@ export { defaultCompilerOptions, CompilerBaseOptions, CompilerCallbacks, Compile export { CommonTypesMessages } from './common-messages.js'; -export * as xml2js from './deps/xml2js/xml2js.js'; - -export { KeymanXMLOptions, KeymanXMLWriter, KeymanXMLReader } from './xml-utils.js'; +export { KeymanXMLType, KeymanXMLWriter, KeymanXMLReader } from './xml-utils.js'; diff --git a/developer/src/common/web/utils/src/types/kpj/kpj-file-reader.ts b/developer/src/common/web/utils/src/types/kpj/kpj-file-reader.ts index 4d60436d1c0..f86879b0068 100644 --- a/developer/src/common/web/utils/src/types/kpj/kpj-file-reader.ts +++ b/developer/src/common/web/utils/src/types/kpj/kpj-file-reader.ts @@ -13,7 +13,7 @@ export class KPJFileReader { public read(file: Uint8Array): KPJFile { let data: KPJFile; - data = new KeymanXMLReader({ type: 'kpj' }) + data = new KeymanXMLReader('kpj') .parse(file.toString()); data = this.boxArrays(data); diff --git a/developer/src/common/web/utils/src/types/kvks/kvks-file-reader.ts b/developer/src/common/web/utils/src/types/kvks/kvks-file-reader.ts index d0a43a6418d..9f2ca18f887 100644 --- a/developer/src/common/web/utils/src/types/kvks/kvks-file-reader.ts +++ b/developer/src/common/web/utils/src/types/kvks/kvks-file-reader.ts @@ -21,7 +21,7 @@ export default class KVKSFileReader { let source: KVKSourceFile; try { - source = new KeymanXMLReader({ type: 'kvks' }) + source = new KeymanXMLReader('kvks') .parse(file.toString()) as KVKSourceFile; } catch(e) { if(file.byteLength > 4 && file.subarray(0,3).every((v,i) => v == KVK_HEADER_IDENTIFIER_BYTES[i])) { diff --git a/developer/src/common/web/utils/src/types/kvks/kvks-file-writer.ts b/developer/src/common/web/utils/src/types/kvks/kvks-file-writer.ts index 6138403f6ef..70534ff4408 100644 --- a/developer/src/common/web/utils/src/types/kvks/kvks-file-writer.ts +++ b/developer/src/common/web/utils/src/types/kvks/kvks-file-writer.ts @@ -91,7 +91,7 @@ export default class KVKSFileWriter { l.key.push(k); } - const result = new KeymanXMLWriter({type: 'kvks'}).write(kvks); + const result = new KeymanXMLWriter('kvks').write(kvks); return result; //Uint8Array.from(result); } diff --git a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts index 8e653054836..b0fe92be320 100644 --- a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts +++ b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts @@ -262,7 +262,7 @@ export class LDMLKeyboardXMLSourceFileReader { loadUnboxed(file: Uint8Array): LDMLKeyboardXMLSourceFile { const data = new TextDecoder().decode(file); - const source = new KeymanXMLReader({ type: 'keyboard3' }) + const source = new KeymanXMLReader('keyboard3') .parse(data) as LDMLKeyboardXMLSourceFile; return source; } @@ -293,7 +293,7 @@ export class LDMLKeyboardXMLSourceFileReader { } loadTestDataUnboxed(file: Uint8Array): any { - const source = new KeymanXMLReader({ type: 'keyboard3-test' }) + const source = new KeymanXMLReader('keyboardTest3') .parse(file.toString()) as any; return source; } diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index e902435cae3..6abcaa6d0f7 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -6,20 +6,84 @@ * Abstraction for XML reading and writing */ -import { xml2js } from "./index.js"; +import * as xml2js from "./deps/xml2js/xml2js.js"; -export class KeymanXMLOptions { - type: 'keyboard3' // LDML - | 'keyboard3-test' // LDML - | 'kps' // - | 'kvks' // - | 'kpj' // // - ; -} +export type KeymanXMLType = + 'keyboard3' // LDML + | 'keyboardTest3' // LDML + | 'kps' // + | 'kvks' // + | 'kpj' // + ; + +/** Bag of options, maximally one for each KeymanXMLType */ +type KemanXMLOptionsBag = { + [key in KeymanXMLType]?: any +}; + +/** map of options for the XML parser */ +const PARSER_OPTIONS: KemanXMLOptionsBag = { + 'keyboard3': { + explicitArray: false, + mergeAttrs: true, + includeWhiteChars: false, + emptyTag: {} as any + // Why "as any"? xml2js is broken: + // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means + // that an old version of `emptyTag` is used which doesn't support + // functions, but DefinitelyTyped is requiring use of function or a + // string. See also notes at + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 + // An alternative fix would be to pull xml2js directly from github + // rather than using the version tagged on npmjs.com. + }, + 'keyboardTest3': { + preserveChildrenOrder: true, // needed for test data + explicitChildren: true, // needed for test data + }, + 'kps': { + explicitArray: false + }, + 'kpj': { + explicitArray: false, + mergeAttrs: false, + includeWhiteChars: false, + normalize: false, + emptyTag: '' + }, + 'kvks': { + explicitArray: false, + mergeAttrs: false, + includeWhiteChars: true, + normalize: false, + emptyTag: {} as any + // Why "as any"? xml2js is broken: + // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means + // that an old version of `emptyTag` is used which doesn't support + // functions, but DefinitelyTyped is requiring use of function or a + // string. See also notes at + // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 + // An alternative fix would be to pull xml2js directly from github + // rather than using the version tagged on npmjs.com. + }, +}; + +const GENERATOR_OPTIONS: KemanXMLOptionsBag = { + kvks: { + allowSurrogateChars: true, + attrkey: '$', + charkey: '_', + xmldec: { + version: '1.0', + encoding: 'UTF-8', + standalone: true + }, + }, +}; /** wrapper for XML parsing support */ export class KeymanXMLReader { - public constructor(public options: KeymanXMLOptions) { + public constructor(public type: KeymanXMLType) { } public parse(data: string): any { @@ -30,72 +94,16 @@ export class KeymanXMLReader { } public parser() { - const { type } = this.options; - switch (type) { - case 'keyboard3': - return new xml2js.Parser({ - explicitArray: false, - mergeAttrs: true, - includeWhiteChars: false, - emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - case 'keyboard3-test': - return new xml2js.Parser({ - // explicitArray: false, - preserveChildrenOrder: true, // needed for test data - explicitChildren: true, // needed for test data - // mergeAttrs: true, - // includeWhiteChars: false, - // emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - case 'kps': - return new xml2js.Parser({ - explicitArray: false - }); - case 'kpj': - return new xml2js.Parser({ - explicitArray: false, - mergeAttrs: false, - includeWhiteChars: false, - normalize: false, - emptyTag: '' - }); - case 'kvks': - return new xml2js.Parser({ - explicitArray: false, - mergeAttrs: false, - includeWhiteChars: true, - normalize: false, - emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. - }); - default: - /* c8 ignore next 1 */ - throw Error(`Internal error: unhandled XML type ${type}`); + let options = PARSER_OPTIONS[this.type]; + if (!options) { + /* c8 ignore next 1 */ + throw Error(`Internal error: unhandled XML type ${this.type}`); + } + options = Object.assign({}, options); // TODO: xml2js likes to mutate the options here. Shallow clone the object. + if (options.emptyTag) { + options.emptyTag = {}; // TODO: xml2js likes to mutate the options here. Reset it. } + return new xml2js.Parser(options); } } @@ -105,26 +113,16 @@ export class KeymanXMLWriter { const builder = this.builder(); return builder.buildObject(data); } - constructor(public options: KeymanXMLOptions) { + constructor(public type: KeymanXMLType) { } public builder() { - switch (this.options.type) { - case 'kvks': - return new xml2js.Builder({ - allowSurrogateChars: true, - attrkey: '$', - charkey: '_', - xmldec: { - version: '1.0', - encoding: 'UTF-8', - standalone: true - } - }); - default: - /* c8 ignore next 1 */ - throw Error(`Internal error: unhandled XML type ${this.options.type}`); + const options = GENERATOR_OPTIONS[this.type]; + if (!options) { + /* c8 ignore next 1 */ + throw Error(`Internal error: unhandled XML type ${this.type}`); } + return new xml2js.Builder(Object.assign({}, options)); // Shallow clone in case the options are mutated. } } diff --git a/developer/src/common/web/utils/test/test-xml-utils.ts b/developer/src/common/web/utils/test/test-xml-utils.ts index d9e7f63ae3d..fbe32f8da4f 100644 --- a/developer/src/common/web/utils/test/test-xml-utils.ts +++ b/developer/src/common/web/utils/test/test-xml-utils.ts @@ -12,20 +12,20 @@ import { env } from 'node:process'; import { readFileSync, writeFileSync } from 'node:fs'; -import { KeymanXMLOptions, KeymanXMLReader, KeymanXMLWriter } from '../src/xml-utils.js'; +import { KeymanXMLType, KeymanXMLReader, KeymanXMLWriter } from '../src/xml-utils.js'; import { makePathToFixture } from './helpers/index.js'; // if true, attempt to WRITE the fixtures const { GEN_XML_FIXTURES } = env; class Case { - options: KeymanXMLOptions; + type: KeymanXMLType; paths: string[]; }; const read_cases: Case[] = [ { - options: { type: 'keyboard3' }, + type: 'keyboard3', paths: [ // keyboards 'disp_maximal.xml', @@ -34,26 +34,26 @@ const read_cases: Case[] = [ 'tran_fail-empty.xml', ], }, { - options: { type: 'keyboard3-test' }, + type: 'keyboardTest3', paths: [ // keyboard test 'k_020_fr-test.xml', ], }, { - options: { type: 'kvks' }, + type: 'kvks', paths: [ // kvks 'khmer_angkor.kvks', ], }, { - options: { type: 'kps' }, + type: 'kps', paths: [ // kps 'test_valid.kps', // 'error_invalid_package_file.kps', ], }, { - options: { type: 'kpj' }, + type: 'kpj', paths: [ // kpj 'khmer_angkor.kpj', @@ -63,7 +63,7 @@ const read_cases: Case[] = [ const write_cases: Case[] = [ { - options: { type: 'kvks' }, + type: 'kvks', paths: [ // kvks 'khmer_angkor2.kvks', // similar to the 'read case' with the similar name, except for whitespace differences and the prologue @@ -93,10 +93,8 @@ function writeJson(path: string, data: any) { describe(`XML Reader Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => { for (const c of read_cases) { - const { options, paths } = c; - describe(`test reading ${JSON.stringify(options)}`, () => { - const reader = new KeymanXMLReader(options); - assert.ok(reader); + const { type, paths } = c; + describe(`test reading ${type}`, () => { for (const path of paths) { const xmlPath = makePathToFixture('xml', `${path}`); const jsonPath = makePathToFixture('xml', `${path}.json`); @@ -105,12 +103,16 @@ describe(`XML Reader Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => const xml = readData(xmlPath); assert.ok(xml, `Could not read ${xmlPath}`); + const reader = new KeymanXMLReader(type); + assert.ok(reader); + // now, parse. subsitute endings for Win const actual = reader.parse(xml.replace(/\r\n/g, '\n')); assert.ok(actual, `Parser failed on ${xmlPath}`); // get the expected const expect = readJson(jsonPath); + if (GEN_XML_FIXTURES) { console.log(`GEN_XML_FIXTURES: writing ${jsonPath} from actual`); writeJson(jsonPath, actual); @@ -127,9 +129,9 @@ describe(`XML Reader Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => describe(`XML Writer Test ${GEN_XML_FIXTURES && '(update mode!)' || ''}`, () => { for (const c of write_cases) { - const { options, paths } = c; - describe(`test writing ${JSON.stringify(options)}`, () => { - const writer = new KeymanXMLWriter(options); + const { type, paths } = c; + describe(`test writing ${type}`, () => { + const writer = new KeymanXMLWriter(type); assert.ok(writer); for (const path of paths) { const jsonPath = makePathToFixture('xml', `${path}.json`); diff --git a/developer/src/kmc-package/src/compiler/kmp-compiler.ts b/developer/src/kmc-package/src/compiler/kmp-compiler.ts index d187f4831e8..1708d69704c 100644 --- a/developer/src/kmc-package/src/compiler/kmp-compiler.ts +++ b/developer/src/kmc-package/src/compiler/kmp-compiler.ts @@ -182,7 +182,7 @@ export class KmpCompiler implements KeymanCompiler { let a: KpsFile.KpsPackage; try { - a = new KeymanXMLReader({ type: 'kps' }) + a = new KeymanXMLReader('kps') .parse(data.toString()) as KpsFile.KpsPackage; } catch(e) { this.callbacks.reportMessage(PackageCompilerMessages.Error_InvalidPackageFile({e})); From a3326761989a7507d5db7568e4e79bfdc6552f93 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 1 Oct 2024 14:24:12 +0700 Subject: [PATCH 111/119] chore(oem/fv): Update name --- oem/firstvoices/keyboards.csv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/oem/firstvoices/keyboards.csv b/oem/firstvoices/keyboards.csv index cb6d081a72a..ed13eb5aaa0 100644 --- a/oem/firstvoices/keyboards.csv +++ b/oem/firstvoices/keyboards.csv @@ -14,9 +14,9 @@ fv,fv_gitsenimx,Gitsenimx̱,BC Coast,fv_gitsenimx_kmw-9.0.js,10.1.2,git,Gitxsan fv,fv_hailzaqvla,Haíɫzaqvḷa,BC Coast,fv_hailzaqvla_kmw-9.0.js,10.0,hei,Heiltsuk (Latin) fv,fv_haisla,Haisla,BC Coast,fv_haisla.js,2.1.3,has-Latn,Haisla (Latin) fv,fv_halqemeylem,Halq'eméylem,BC Coast,fv_halqemeylem_kmw-9.0.js,9.2.1,hur-Latn,Halkomelem (Latin) -fv,fv_henqeminem,Hǝn̓q̓ǝmin̓ǝm,BC Coast,fv_henqeminem_kmw-9.0.js,10.2.1,hur-Latn,Halkomelem (Latin) +fv,fv_henqeminem,hǝn̓q̓ǝmin̓ǝm̓,BC Coast,fv_henqeminem_kmw-9.0.js,10.2.1,hur-Latn,Halkomelem (Latin) fv,fv_klahoose,Éy7á7juuthem,BC Coast,fv_klahoose_kmw-9.0.js,10.2,coo,Comox -fv,fv_hulquminum,Hul’q’umi’num’,BC Coast,fv_hulquminum_kmw-9.0.js,9.1,hur,Halkomelem +fv,fv_hulquminum,Hul’q’umi’num’,BC Coast,fv_hulquminum_kmw-9.0.js,9.2,hur,Halkomelem fv,fv_hulquminum_combine,Hul̓q̓umin̓um̓,BC Coast,fv_hulquminum_combine_kmw-9.0.js,2.0.1,hur-Latn,Halkomelem (Latin) fv,fv_kwakwala_liqwala,Kʷak̓ʷala,BC Coast,fv_kwakwala_liqwala_kmw-9.0.js,9.3,kwk-Latn,Kwakiutl (Latin) fv,fv_kwakwala,Kwak̕wala,BC Coast,fv_kwakwala_kmw-9.0.js,9.2,kwk-Latn,Kwakiutl (Latin) @@ -88,7 +88,7 @@ fv,fv_dine_bizaad,Diné Bizaad,South West,fv_dine_bizaad_kmw-9.0.js,9.1.1,nv-La fv,fv_dane_zaa_zaage,Dane-Z̲aa Z̲áágéʔ,Western Subarctic,fv_dane_zaa_zaage_kmw-9.0.js,9.4.1,bea,Beaver fv,fv_dene_dzage,Danezāgéʼ,Western Subarctic,fv_dene_dzage_kmw-9.0.js,11.0.1,kkz-Latn,Kaska (Latin) fv,fv_dene_zhatie,Dene Zhatıé,Western Subarctic,fv_dene_zhatie_kmw-9.0.js,10.2.1,den,Dene Zhatıé -fv,fv_denesuline_epsilon,Dɛnɛsųłįnɛ,Western Subarctic,fv_denesuline_epsilon_kmw-9.0.js,10.0.2,chp,Chipewyan +fv,fv_denesuline_epsilon,Dɛnɛsųłįnɛ,Western Subarctic,fv_denesuline_epsilon_kmw-9.0.js,10.0.2,chp,Chipewyan fv,fv_denesuline,Dënesųłıné,Western Subarctic,fv_denesuline_kmw-9.0.js,10.0.1,chp,Chipewyan (Latin) fv,fv_gwichin,Gwich'in,Western Subarctic,fv_gwichin_kmw-9.0.js,9.2.1,gwi-Latn,Gwichʼin (Latin) fv,fv_han,Hän,Western Subarctic,fv_han_kmw-9.0.js,9.2,haa-Latn,Han (Latin) From 936a289e52976c7d00d706a2eebf09842bbbb383 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Wed, 2 Oct 2024 14:02:02 -0400 Subject: [PATCH 112/119] auto: increment master version to 18.0.121 --- HISTORY.md | 7 +++++++ VERSION.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index b18c1a27ce3..7e3d41a3386 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ # Keyman Version History +## 18.0.120 alpha 2024-10-02 + +* chore(common): Add note on troubleshooting website errors (#12487) +* docs(common): mention `KEYMAN_USE_NVM` in minimum versions doc (#12490) +* docs(web): fix paths to several help pages (#12491) +* docs(web): fix structure of test document (#12492) + ## 18.0.119 alpha 2024-09-28 * refactor(developer): copy dev 17.0 help into repo (#12427) diff --git a/VERSION.md b/VERSION.md index 003084cd89e..b67d9be263f 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.120 \ No newline at end of file +18.0.121 \ No newline at end of file From 3e168aafb232615f29ca7b1b88d04eb13dc35130 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 3 Oct 2024 08:34:24 -0500 Subject: [PATCH 113/119] chore(developer,common): deps: xml2js / fast-xml-parser - remove vendored xml2js - add fast-xml-parser@4.5.0 - Rewire the KeymanXMLReader / KeymanXMLWriter to use fast-xml-parser Four small changes to the test data on the generated .kvks: - allow " for XML generation (" is legal) - use the same XML prologue as the actual .kvks files. - treat as since we can't distinguish (removed a "_": "" entry) - remove whitespace because we now can ("_": "\n \n \n") on non-leaf nodes. This is ignored by the kvks code, but was difficult to maintain roundtrip. Fixes: #12208 --- developer/src/common/web/utils/package.json | 6 +- .../common/web/utils/src/deps/xml2js/LICENSE | 19 - .../web/utils/src/deps/xml2js/README.md | 507 ------------------ .../common/web/utils/src/deps/xml2js/bom.js | 8 - .../web/utils/src/deps/xml2js/builder.js | 118 ---- .../web/utils/src/deps/xml2js/defaults.js | 69 --- .../web/utils/src/deps/xml2js/parser.js | 381 ------------- .../web/utils/src/deps/xml2js/processors.js | 31 -- .../web/utils/src/deps/xml2js/xml2js.js | 27 - .../ldml-keyboard/ldml-keyboard-xml-reader.ts | 8 + .../src/common/web/utils/src/xml-utils.ts | 264 +++++++-- .../test/fixtures/xml/khmer_angkor.kvks.json | 19 +- .../test/fixtures/xml/khmer_angkor2.kvks | 6 +- .../utils/test/kpj/test-kpj-file-reader.ts | 4 +- developer/src/common/web/utils/tsconfig.json | 3 +- package-lock.json | 38 +- 16 files changed, 270 insertions(+), 1238 deletions(-) delete mode 100644 developer/src/common/web/utils/src/deps/xml2js/LICENSE delete mode 100644 developer/src/common/web/utils/src/deps/xml2js/README.md delete mode 100644 developer/src/common/web/utils/src/deps/xml2js/bom.js delete mode 100644 developer/src/common/web/utils/src/deps/xml2js/builder.js delete mode 100644 developer/src/common/web/utils/src/deps/xml2js/defaults.js delete mode 100644 developer/src/common/web/utils/src/deps/xml2js/parser.js delete mode 100644 developer/src/common/web/utils/src/deps/xml2js/processors.js delete mode 100644 developer/src/common/web/utils/src/deps/xml2js/xml2js.js diff --git a/developer/src/common/web/utils/package.json b/developer/src/common/web/utils/package.json index 1ab9daddbf8..7f2d9cef279 100644 --- a/developer/src/common/web/utils/package.json +++ b/developer/src/common/web/utils/package.json @@ -9,19 +9,19 @@ "/build/" ], "dependencies": { - "@sentry/node": "^7.57.0", "@keymanapp/common-types": "*", + "@sentry/node": "^7.57.0", "eventemitter3": "^5.0.0", + "fast-xml-parser": "^4.5.0", "restructure": "^3.0.1", - "semver": "^7.5.4", "sax": ">=0.6.0", + "semver": "^7.5.4", "xmlbuilder": "~11.0.0" }, "devDependencies": { "@types/git-diff": "^2.0.3", "@types/node": "^20.4.1", "@types/semver": "^7.3.12", - "@types/xml2js": "^0.4.5", "c8": "^7.12.0", "git-diff": "^2.0.6", "mocha": "^8.4.0", diff --git a/developer/src/common/web/utils/src/deps/xml2js/LICENSE b/developer/src/common/web/utils/src/deps/xml2js/LICENSE deleted file mode 100644 index e3b4222a66a..00000000000 --- a/developer/src/common/web/utils/src/deps/xml2js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2010, 2011, 2012, 2013. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/developer/src/common/web/utils/src/deps/xml2js/README.md b/developer/src/common/web/utils/src/deps/xml2js/README.md deleted file mode 100644 index 67f2104a513..00000000000 --- a/developer/src/common/web/utils/src/deps/xml2js/README.md +++ /dev/null @@ -1,507 +0,0 @@ -node-xml2js -=========== - -Ever had the urge to parse XML? And wanted to access the data in some sane, -easy way? Don't want to compile a C parser, for whatever reason? Then xml2js is -what you're looking for! - -Description -=========== - -Simple XML to JavaScript object converter. It supports bi-directional conversion. -Uses [sax-js](https://github.com/isaacs/sax-js/) and -[xmlbuilder-js](https://github.com/oozcitak/xmlbuilder-js/). - -Note: If you're looking for a full DOM parser, you probably want -[JSDom](https://github.com/tmpvar/jsdom). - -Installation -============ - -Simplest way to install `xml2js` is to use [npm](http://npmjs.org), just `npm -install xml2js` which will download xml2js and all dependencies. - -xml2js is also available via [Bower](http://bower.io/), just `bower install -xml2js` which will download xml2js and all dependencies. - -Usage -===== - -No extensive tutorials required because you are a smart developer! The task of -parsing XML should be an easy one, so let's make it so! Here's some examples. - -Shoot-and-forget usage ----------------------- - -You want to parse XML as simple and easy as possible? It's dangerous to go -alone, take this: - -```javascript -var parseString = require('xml2js').parseString; -var xml = "Hello xml2js!" -parseString(xml, function (err, result) { - console.dir(result); -}); -``` - -Can't get easier than this, right? This works starting with `xml2js` 0.2.3. -With CoffeeScript it looks like this: - -```coffeescript -{parseString} = require 'xml2js' -xml = "Hello xml2js!" -parseString xml, (err, result) -> - console.dir result -``` - -If you need some special options, fear not, `xml2js` supports a number of -options (see below), you can specify these as second argument: - -```javascript -parseString(xml, {trim: true}, function (err, result) { -}); -``` - -Simple as pie usage -------------------- - -That's right, if you have been using xml-simple or a home-grown -wrapper, this was added in 0.1.11 just for you: - -```javascript -var fs = require('fs'), - xml2js = require('xml2js'); - -var parser = new xml2js.Parser(); -fs.readFile(__dirname + '/foo.xml', function(err, data) { - parser.parseString(data, function (err, result) { - console.dir(result); - console.log('Done'); - }); -}); -``` - -Look ma, no event listeners! - -You can also use `xml2js` from -[CoffeeScript](https://github.com/jashkenas/coffeescript), further reducing -the clutter: - -```coffeescript -fs = require 'fs', -xml2js = require 'xml2js' - -parser = new xml2js.Parser() -fs.readFile __dirname + '/foo.xml', (err, data) -> - parser.parseString data, (err, result) -> - console.dir result - console.log 'Done.' -``` - -But what happens if you forget the `new` keyword to create a new `Parser`? In -the middle of a nightly coding session, it might get lost, after all. Worry -not, we got you covered! Starting with 0.2.8 you can also leave it out, in -which case `xml2js` will helpfully add it for you, no bad surprises and -inexplicable bugs! - -Promise usage -------------- - -```javascript -var xml2js = require('xml2js'); -var xml = ''; - -// With parser -var parser = new xml2js.Parser(/* options */); -parser.parseStringPromise(xml).then(function (result) { - console.dir(result); - console.log('Done'); -}) -.catch(function (err) { - // Failed -}); - -// Without parser -xml2js.parseStringPromise(xml /*, options */).then(function (result) { - console.dir(result); - console.log('Done'); -}) -.catch(function (err) { - // Failed -}); -``` - -Parsing multiple files ----------------------- - -If you want to parse multiple files, you have multiple possibilities: - - * You can create one `xml2js.Parser` per file. That's the recommended one - and is promised to always *just work*. - * You can call `reset()` on your parser object. - * You can hope everything goes well anyway. This behaviour is not - guaranteed work always, if ever. Use option #1 if possible. Thanks! - -So you wanna some JSON? ------------------------ - -Just wrap the `result` object in a call to `JSON.stringify` like this -`JSON.stringify(result)`. You get a string containing the JSON representation -of the parsed object that you can feed to JSON-hungry consumers. - -Displaying results ------------------- - -You might wonder why, using `console.dir` or `console.log` the output at some -level is only `[Object]`. Don't worry, this is not because `xml2js` got lazy. -That's because Node uses `util.inspect` to convert the object into strings and -that function stops after `depth=2` which is a bit low for most XML. - -To display the whole deal, you can use `console.log(util.inspect(result, false, -null))`, which displays the whole result. - -So much for that, but what if you use -[eyes](https://github.com/cloudhead/eyes.js) for nice colored output and it -truncates the output with `…`? Don't fear, there's also a solution for that, -you just need to increase the `maxLength` limit by creating a custom inspector -`var inspect = require('eyes').inspector({maxLength: false})` and then you can -easily `inspect(result)`. - -XML builder usage ------------------ - -Since 0.4.0, objects can be also be used to build XML: - -```javascript -var xml2js = require('xml2js'); - -var obj = {name: "Super", Surname: "Man", age: 23}; - -var builder = new xml2js.Builder(); -var xml = builder.buildObject(obj); -``` -will result in: - -```xml - - - Super - Man - 23 - -``` - -At the moment, a one to one bi-directional conversion is guaranteed only for -default configuration, except for `attrkey`, `charkey` and `explicitArray` options -you can redefine to your taste. Writing CDATA is supported via setting the `cdata` -option to `true`. - -To specify attributes: -```javascript -var xml2js = require('xml2js'); - -var obj = {root: {$: {id: "my id"}, _: "my inner text"}}; - -var builder = new xml2js.Builder(); -var xml = builder.buildObject(obj); -``` -will result in: -```xml - -my inner text -``` - -### Adding xmlns attributes - -You can generate XML that declares XML namespace prefix / URI pairs with xmlns attributes. - -Example declaring a default namespace on the root element: - -```javascript -let obj = { - Foo: { - $: { - "xmlns": "http://foo.com" - } - } -}; -``` -Result of `buildObject(obj)`: -```xml - -``` -Example declaring non-default namespaces on non-root elements: -```javascript -let obj = { - 'foo:Foo': { - $: { - 'xmlns:foo': 'http://foo.com' - }, - 'bar:Bar': { - $: { - 'xmlns:bar': 'http://bar.com' - } - } - } -} -``` -Result of `buildObject(obj)`: -```xml - - - -``` - - -Processing attribute, tag names and values ------------------------------------------- - -Since 0.4.1 you can optionally provide the parser with attribute name and tag name processors as well as element value processors (Since 0.4.14, you can also optionally provide the parser with attribute value processors): - -```javascript - -function nameToUpperCase(name){ - return name.toUpperCase(); -} - -//transform all attribute and tag names and values to uppercase -parseString(xml, { - tagNameProcessors: [nameToUpperCase], - attrNameProcessors: [nameToUpperCase], - valueProcessors: [nameToUpperCase], - attrValueProcessors: [nameToUpperCase]}, - function (err, result) { - // processed data -}); -``` - -The `tagNameProcessors` and `attrNameProcessors` options -accept an `Array` of functions with the following signature: - -```javascript -function (name){ - //do something with `name` - return name -} -``` - -The `attrValueProcessors` and `valueProcessors` options -accept an `Array` of functions with the following signature: - -```javascript -function (value, name) { - //`name` will be the node name or attribute name - //do something with `value`, (optionally) dependent on the node/attr name - return value -} -``` - -Some processors are provided out-of-the-box and can be found in `lib/processors.js`: - -- `normalize`: transforms the name to lowercase. -(Automatically used when `options.normalize` is set to `true`) - -- `firstCharLowerCase`: transforms the first character to lower case. -E.g. 'MyTagName' becomes 'myTagName' - -- `stripPrefix`: strips the xml namespace prefix. E.g `` will become 'Bar'. -(N.B.: the `xmlns` prefix is NOT stripped.) - -- `parseNumbers`: parses integer-like strings as integers and float-like strings as floats -E.g. "0" becomes 0 and "15.56" becomes 15.56 - -- `parseBooleans`: parses boolean-like strings to booleans -E.g. "true" becomes true and "False" becomes false - -Options -======= - -Apart from the default settings, there are a number of options that can be -specified for the parser. Options are specified by ``new Parser({optionName: -value})``. Possible options are: - - * `attrkey` (default: `$`): Prefix that is used to access the attributes. - Version 0.1 default was `@`. - * `charkey` (default: `_`): Prefix that is used to access the character - content. Version 0.1 default was `#`. - * `explicitCharkey` (default: `false`) Determines whether or not to use - a `charkey` prefix for elements with no attributes. - * `trim` (default: `false`): Trim the whitespace at the beginning and end of - text nodes. - * `normalizeTags` (default: `false`): Normalize all tag names to lowercase. - * `normalize` (default: `false`): Trim whitespaces inside text nodes. - * `explicitRoot` (default: `true`): Set this if you want to get the root - node in the resulting object. - * `emptyTag` (default: `''`): what will the value of empty nodes be. In case - you want to use an empty object as a default value, it is better to provide a factory - function `() => ({})` instead. Without this function a plain object would - become a shared reference across all occurrences with unwanted behavior. - * `explicitArray` (default: `true`): Always put child nodes in an array if - true; otherwise an array is created only if there is more than one. - * `ignoreAttrs` (default: `false`): Ignore all XML attributes and only create - text nodes. - * `mergeAttrs` (default: `false`): Merge attributes and child elements as - properties of the parent, instead of keying attributes off a child - attribute object. This option is ignored if `ignoreAttrs` is `true`. - * `validator` (default `null`): You can specify a callable that validates - the resulting structure somehow, however you want. See unit tests - for an example. - * `xmlns` (default `false`): Give each element a field usually called '$ns' - (the first character is the same as attrkey) that contains its local name - and namespace URI. - * `explicitChildren` (default `false`): Put child elements to separate - property. Doesn't work with `mergeAttrs = true`. If element has no children - then "children" won't be created. Added in 0.2.5. - * `childkey` (default `$$`): Prefix that is used to access child elements if - `explicitChildren` is set to `true`. Added in 0.2.5. - * `preserveChildrenOrder` (default `false`): Modifies the behavior of - `explicitChildren` so that the value of the "children" property becomes an - ordered array. When this is `true`, every node will also get a `#name` field - whose value will correspond to the XML nodeName, so that you may iterate - the "children" array and still be able to determine node names. The named - (and potentially unordered) properties are also retained in this - configuration at the same level as the ordered "children" array. Added in - 0.4.9. - * `charsAsChildren` (default `false`): Determines whether chars should be - considered children if `explicitChildren` is on. Added in 0.2.5. - * `includeWhiteChars` (default `false`): Determines whether whitespace-only - text nodes should be included. Added in 0.4.17. - * `async` (default `false`): Should the callbacks be async? This *might* be - an incompatible change if your code depends on sync execution of callbacks. - Future versions of `xml2js` might change this default, so the recommendation - is to not depend on sync execution anyway. Added in 0.2.6. - * `strict` (default `true`): Set sax-js to strict or non-strict parsing mode. - Defaults to `true` which is *highly* recommended, since parsing HTML which - is not well-formed XML might yield just about anything. Added in 0.2.7. - * `attrNameProcessors` (default: `null`): Allows the addition of attribute - name processing functions. Accepts an `Array` of functions with following - signature: - ```javascript - function (name){ - //do something with `name` - return name - } - ``` - Added in 0.4.14 - * `attrValueProcessors` (default: `null`): Allows the addition of attribute - value processing functions. Accepts an `Array` of functions with following - signature: - ```javascript - function (value, name){ - //do something with `name` - return name - } - ``` - Added in 0.4.1 - * `tagNameProcessors` (default: `null`): Allows the addition of tag name - processing functions. Accepts an `Array` of functions with following - signature: - ```javascript - function (name){ - //do something with `name` - return name - } - ``` - Added in 0.4.1 - * `valueProcessors` (default: `null`): Allows the addition of element value - processing functions. Accepts an `Array` of functions with following - signature: - ```javascript - function (value, name){ - //do something with `name` - return name - } - ``` - Added in 0.4.6 - -Options for the `Builder` class -------------------------------- -These options are specified by ``new Builder({optionName: value})``. -Possible options are: - - * `attrkey` (default: `$`): Prefix that is used to access the attributes. - Version 0.1 default was `@`. - * `charkey` (default: `_`): Prefix that is used to access the character - content. Version 0.1 default was `#`. - * `rootName` (default `root` or the root key name): root element name to be used in case - `explicitRoot` is `false` or to override the root element name. - * `renderOpts` (default `{ 'pretty': true, 'indent': ' ', 'newline': '\n' }`): - Rendering options for xmlbuilder-js. - * pretty: prettify generated XML - * indent: whitespace for indentation (only when pretty) - * newline: newline char (only when pretty) - * `xmldec` (default `{ 'version': '1.0', 'encoding': 'UTF-8', 'standalone': true }`: - XML declaration attributes. - * `xmldec.version` A version number string, e.g. 1.0 - * `xmldec.encoding` Encoding declaration, e.g. UTF-8 - * `xmldec.standalone` standalone document declaration: true or false - * `doctype` (default `null`): optional DTD. Eg. `{'ext': 'hello.dtd'}` - * `headless` (default: `false`): omit the XML header. Added in 0.4.3. - * `allowSurrogateChars` (default: `false`): allows using characters from the Unicode - surrogate blocks. - * `cdata` (default: `false`): wrap text nodes in `` instead of - escaping when necessary. Does not add `` if it is not required. - Added in 0.4.5. - -`renderOpts`, `xmldec`,`doctype` and `headless` pass through to -[xmlbuilder-js](https://github.com/oozcitak/xmlbuilder-js). - -Updating to new version -======================= - -Version 0.2 changed the default parsing settings, but version 0.1.14 introduced -the default settings for version 0.2, so these settings can be tried before the -migration. - -```javascript -var xml2js = require('xml2js'); -var parser = new xml2js.Parser(xml2js.defaults["0.2"]); -``` - -To get the 0.1 defaults in version 0.2 you can just use -`xml2js.defaults["0.1"]` in the same place. This provides you with enough time -to migrate to the saner way of parsing in `xml2js` 0.2. We try to make the -migration as simple and gentle as possible, but some breakage cannot be -avoided. - -So, what exactly did change and why? In 0.2 we changed some defaults to parse -the XML in a more universal and sane way. So we disabled `normalize` and `trim` -so `xml2js` does not cut out any text content. You can reenable this at will of -course. A more important change is that we return the root tag in the resulting -JavaScript structure via the `explicitRoot` setting, so you need to access the -first element. This is useful for anybody who wants to know what the root node -is and preserves more information. The last major change was to enable -`explicitArray`, so everytime it is possible that one might embed more than one -sub-tag into a tag, xml2js >= 0.2 returns an array even if the array just -includes one element. This is useful when dealing with APIs that return -variable amounts of subtags. - -Running tests, development -========================== - -[![Build Status](https://travis-ci.org/Leonidas-from-XIV/node-xml2js.svg?branch=master)](https://travis-ci.org/Leonidas-from-XIV/node-xml2js) -[![Coverage Status](https://coveralls.io/repos/Leonidas-from-XIV/node-xml2js/badge.svg?branch=)](https://coveralls.io/r/Leonidas-from-XIV/node-xml2js?branch=master) -[![Dependency Status](https://david-dm.org/Leonidas-from-XIV/node-xml2js.svg)](https://david-dm.org/Leonidas-from-XIV/node-xml2js) - -The development requirements are handled by npm, you just need to install them. -We also have a number of unit tests, they can be run using `npm test` directly -from the project root. This runs zap to discover all the tests and execute -them. - -If you like to contribute, keep in mind that `xml2js` is written in -CoffeeScript, so don't develop on the JavaScript files that are checked into -the repository for convenience reasons. Also, please write some unit test to -check your behaviour and if it is some user-facing thing, add some -documentation to this README, so people will know it exists. Thanks in advance! - -Getting support -=============== - -Please, if you have a problem with the library, first make sure you read this -README. If you read this far, thanks, you're good. Then, please make sure your -problem really is with `xml2js`. It is? Okay, then I'll look at it. Send me a -mail and we can talk. Please don't open issues, as I don't think that is the -proper forum for support problems. Some problems might as well really be bugs -in `xml2js`, if so I'll let you know to open an issue instead :) - -But if you know you really found a bug, feel free to open an issue instead. diff --git a/developer/src/common/web/utils/src/deps/xml2js/bom.js b/developer/src/common/web/utils/src/deps/xml2js/bom.js deleted file mode 100644 index 0ad6e2a4a43..00000000000 --- a/developer/src/common/web/utils/src/deps/xml2js/bom.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; -export function stripBOM(str) { - if (str[0] === '\uFEFF') { - return str.substring(1); - } else { - return str; - } -}; diff --git a/developer/src/common/web/utils/src/deps/xml2js/builder.js b/developer/src/common/web/utils/src/deps/xml2js/builder.js deleted file mode 100644 index 5dfca61c9f6..00000000000 --- a/developer/src/common/web/utils/src/deps/xml2js/builder.js +++ /dev/null @@ -1,118 +0,0 @@ -var escapeCDATA, requiresCDATA, wrapCDATA, - hasProp = {}.hasOwnProperty; - -import * as builder from 'xmlbuilder'; -import { defaults } from './defaults.js'; - -requiresCDATA = function(entry) { - return typeof entry === "string" && (entry.indexOf('&') >= 0 || entry.indexOf('>') >= 0 || entry.indexOf('<') >= 0); -}; - -wrapCDATA = function(entry) { - return ""; -}; - -escapeCDATA = function(entry) { - return entry.replace(']]>', ']]]]>'); -}; - -export class Builder { - constructor(opts) { - var key, ref, value; - this.options = {}; - ref = defaults["0.2"]; - for (key in ref) { - if (!hasProp.call(ref, key)) continue; - value = ref[key]; - this.options[key] = value; - } - for (key in opts) { - if (!hasProp.call(opts, key)) continue; - value = opts[key]; - this.options[key] = value; - } - } - - buildObject(rootObj) { - var attrkey, charkey, render, rootElement, rootName; - attrkey = this.options.attrkey; - charkey = this.options.charkey; - if ((Object.keys(rootObj).length === 1) && (this.options.rootName === defaults['0.2'].rootName)) { - rootName = Object.keys(rootObj)[0]; - rootObj = rootObj[rootName]; - } else { - rootName = this.options.rootName; - } - render = (function(_this) { - return function(element, obj) { - var attr, child, entry, index, key, value; - if (typeof obj !== 'object') { - if (_this.options.cdata && requiresCDATA(obj)) { - element.raw(wrapCDATA(obj)); - } else { - element.txt(obj); - } - } else if (Array.isArray(obj)) { - for (index in obj) { - if (!hasProp.call(obj, index)) continue; - child = obj[index]; - for (key in child) { - entry = child[key]; - element = render(element.ele(key), entry).up(); - } - } - } else { - for (key in obj) { - if (!hasProp.call(obj, key)) continue; - child = obj[key]; - if (key === attrkey) { - if (typeof child === "object") { - for (attr in child) { - value = child[attr]; - element = element.att(attr, value); - } - } - } else if (key === charkey) { - if (_this.options.cdata && requiresCDATA(child)) { - element = element.raw(wrapCDATA(child)); - } else { - element = element.txt(child); - } - } else if (Array.isArray(child)) { - for (index in child) { - if (!hasProp.call(child, index)) continue; - entry = child[index]; - if (typeof entry === 'string') { - if (_this.options.cdata && requiresCDATA(entry)) { - element = element.ele(key).raw(wrapCDATA(entry)).up(); - } else { - element = element.ele(key, entry).up(); - } - } else { - element = render(element.ele(key), entry).up(); - } - } - } else if (typeof child === "object") { - element = render(element.ele(key), child).up(); - } else { - if (typeof child === 'string' && _this.options.cdata && requiresCDATA(child)) { - element = element.ele(key).raw(wrapCDATA(child)).up(); - } else { - if (child == null) { - child = ''; - } - element = element.ele(key, child.toString()).up(); - } - } - } - } - return element; - }; - })(this); - rootElement = builder.create(rootName, this.options.xmldec, this.options.doctype, { - headless: this.options.headless, - allowSurrogateChars: this.options.allowSurrogateChars - }); - return render(rootElement, rootObj).end(this.options.renderOpts); - }; -} diff --git a/developer/src/common/web/utils/src/deps/xml2js/defaults.js b/developer/src/common/web/utils/src/deps/xml2js/defaults.js deleted file mode 100644 index d1009281792..00000000000 --- a/developer/src/common/web/utils/src/deps/xml2js/defaults.js +++ /dev/null @@ -1,69 +0,0 @@ -// Generated by CoffeeScript 1.12.7 -export const defaults = { - "0.1": { - explicitCharkey: false, - trim: true, - normalize: true, - normalizeTags: false, - attrkey: "@", - charkey: "#", - explicitArray: false, - ignoreAttrs: false, - mergeAttrs: false, - explicitRoot: false, - validator: null, - xmlns: false, - explicitChildren: false, - childkey: '@@', - charsAsChildren: false, - includeWhiteChars: false, - async: false, - strict: true, - attrNameProcessors: null, - attrValueProcessors: null, - tagNameProcessors: null, - valueProcessors: null, - emptyTag: '' - }, - "0.2": { - explicitCharkey: false, - trim: false, - normalize: false, - normalizeTags: false, - attrkey: "$", - charkey: "_", - explicitArray: true, - ignoreAttrs: false, - mergeAttrs: false, - explicitRoot: true, - validator: null, - xmlns: false, - explicitChildren: false, - preserveChildrenOrder: false, - childkey: '$$', - charsAsChildren: false, - includeWhiteChars: false, - async: false, - strict: true, - attrNameProcessors: null, - attrValueProcessors: null, - tagNameProcessors: null, - valueProcessors: null, - rootName: 'root', - xmldec: { - 'version': '1.0', - 'encoding': 'UTF-8', - 'standalone': true - }, - doctype: null, - renderOpts: { - 'pretty': true, - 'indent': ' ', - 'newline': '\n' - }, - headless: false, - chunkSize: 10000, - emptyTag: '', - cdata: false - } - }; diff --git a/developer/src/common/web/utils/src/deps/xml2js/parser.js b/developer/src/common/web/utils/src/deps/xml2js/parser.js deleted file mode 100644 index 1c7f148d906..00000000000 --- a/developer/src/common/web/utils/src/deps/xml2js/parser.js +++ /dev/null @@ -1,381 +0,0 @@ - var isEmpty, processItem, - bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - -import sax from 'sax'; -import { EventEmitter } from 'eventemitter3'; -import * as bom from './bom.js'; -import * as processors from './processors.js'; -import { setImmediate } from 'timers'; -import { defaults } from './defaults.js'; - - isEmpty = function(thing) { - return typeof thing === "object" && (thing != null) && Object.keys(thing).length === 0; - }; - - processItem = function(processors, item, key) { - var i, len, process; - for (i = 0, len = processors.length; i < len; i++) { - process = processors[i]; - item = process(item, key); - } - return item; - }; - -/** @type Class */ -export class Parser extends EventEmitter { -// export const Parser = (function(superClass) { - // extend(Parser, superClass); - - constructor(opts) { - super(); - this.parseStringPromise = bind(this.parseStringPromise, this); - this.parseString = bind(this.parseString, this); - this.reset = bind(this.reset, this); - this.assignOrPush = bind(this.assignOrPush, this); - this.processAsync = bind(this.processAsync, this); - var key, ref, value; - if (!(this instanceof Parser)) { - return new Parser(opts); - } - this.options = {}; - ref = defaults["0.2"]; - for (key in ref) { - if (!hasProp.call(ref, key)) continue; - value = ref[key]; - this.options[key] = value; - } - for (key in opts) { - if (!hasProp.call(opts, key)) continue; - value = opts[key]; - this.options[key] = value; - } - if (this.options.xmlns) { - this.options.xmlnskey = this.options.attrkey + "ns"; - } - if (this.options.normalizeTags) { - if (!this.options.tagNameProcessors) { - this.options.tagNameProcessors = []; - } - this.options.tagNameProcessors.unshift(processors.normalize); - } - this.reset(); - } - - processAsync() { - var chunk, err; - try { - if (this.remaining.length <= this.options.chunkSize) { - chunk = this.remaining; - this.remaining = ''; - this.saxParser = this.saxParser.write(chunk); - return this.saxParser.close(); - } else { - chunk = this.remaining.substr(0, this.options.chunkSize); - this.remaining = this.remaining.substr(this.options.chunkSize, this.remaining.length); - this.saxParser = this.saxParser.write(chunk); - return setImmediate(this.processAsync); - } - } catch (error1) { - err = error1; - if (!this.saxParser.errThrown) { - this.saxParser.errThrown = true; - return this.emit(err); - } - } - }; - - assignOrPush(obj, key, newValue) { - if (!(key in obj)) { - if (!this.options.explicitArray) { - return obj[key] = newValue; - } else { - return obj[key] = [newValue]; - } - } else { - if (!(obj[key] instanceof Array)) { - obj[key] = [obj[key]]; - } - return obj[key].push(newValue); - } - }; - - reset() { - var attrkey, charkey, ontext, stack; - this.removeAllListeners(); - this.saxParser = sax.parser(this.options.strict, { - trim: false, - normalize: false, - xmlns: this.options.xmlns - }); - this.saxParser.errThrown = false; - this.saxParser.onerror = (function(_this) { - return function(error) { - _this.saxParser.resume(); - if (!_this.saxParser.errThrown) { - _this.saxParser.errThrown = true; - return _this.emit("error", error); - } - }; - })(this); - this.saxParser.onend = (function(_this) { - return function() { - if (!_this.saxParser.ended) { - _this.saxParser.ended = true; - return _this.emit("end", _this.resultObject); - } - }; - })(this); - this.saxParser.ended = false; - this.EXPLICIT_CHARKEY = this.options.explicitCharkey; - this.resultObject = null; - stack = []; - attrkey = this.options.attrkey; - charkey = this.options.charkey; - this.saxParser.onopentag = (function(_this) { - return function(node) { - var key, newValue, obj, processedKey, ref; - obj = Object.create(null); - obj[charkey] = ""; - if (!_this.options.ignoreAttrs) { - ref = node.attributes; - for (key in ref) { - if (!hasProp.call(ref, key)) continue; - if (!(attrkey in obj) && !_this.options.mergeAttrs) { - obj[attrkey] = Object.create(null); - } - newValue = _this.options.attrValueProcessors ? processItem(_this.options.attrValueProcessors, node.attributes[key], key) : node.attributes[key]; - processedKey = _this.options.attrNameProcessors ? processItem(_this.options.attrNameProcessors, key) : key; - if (_this.options.mergeAttrs) { - _this.assignOrPush(obj, processedKey, newValue); - } else { - obj[attrkey][processedKey] = newValue; - } - } - } - obj["#name"] = _this.options.tagNameProcessors ? processItem(_this.options.tagNameProcessors, node.name) : node.name; - if (_this.options.xmlns) { - obj[_this.options.xmlnskey] = { - uri: node.uri, - local: node.local - }; - } - return stack.push(obj); - }; - })(this); - this.saxParser.onclosetag = (function(_this) { - return function() { - var cdata, emptyStr, key, node, nodeName, obj, objClone, old, s, xpath; - obj = stack.pop(); - nodeName = obj["#name"]; - if (!_this.options.explicitChildren || !_this.options.preserveChildrenOrder) { - delete obj["#name"]; - } - if (obj.cdata === true) { - cdata = obj.cdata; - delete obj.cdata; - } - s = stack[stack.length - 1]; - if (obj[charkey].match(/^\s*$/) && !cdata && !_this.options.includeWhiteChars) { - emptyStr = obj[charkey]; - delete obj[charkey]; - } else { - if (_this.options.trim) { - obj[charkey] = obj[charkey].trim(); - } - if (_this.options.normalize) { - obj[charkey] = obj[charkey].replace(/\s{2,}/g, " ").trim(); - } - obj[charkey] = _this.options.valueProcessors ? processItem(_this.options.valueProcessors, obj[charkey], nodeName) : obj[charkey]; - if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { - obj = obj[charkey]; - } - } - if (isEmpty(obj)) { - if (typeof _this.options.emptyTag === 'function') { - obj = _this.options.emptyTag(); - } else { - obj = _this.options.emptyTag !== '' ? _this.options.emptyTag : emptyStr; - } - } - if (_this.options.validator != null) { - xpath = "/" + ((function() { - var i, len, results; - results = []; - for (i = 0, len = stack.length; i < len; i++) { - node = stack[i]; - results.push(node["#name"]); - } - return results; - })()).concat(nodeName).join("/"); - (function() { - var err; - try { - return obj = _this.options.validator(xpath, s && s[nodeName], obj); - } catch (error1) { - err = error1; - return _this.emit("error", err); - } - })(); - } - if (_this.options.explicitChildren && !_this.options.mergeAttrs && typeof obj === 'object') { - if (!_this.options.preserveChildrenOrder) { - node = Object.create(null); - if (_this.options.attrkey in obj) { - node[_this.options.attrkey] = obj[_this.options.attrkey]; - delete obj[_this.options.attrkey]; - } - if (!_this.options.charsAsChildren && _this.options.charkey in obj) { - node[_this.options.charkey] = obj[_this.options.charkey]; - delete obj[_this.options.charkey]; - } - if (Object.getOwnPropertyNames(obj).length > 0) { - node[_this.options.childkey] = obj; - } - obj = node; - } else if (s) { - s[_this.options.childkey] = s[_this.options.childkey] || []; - objClone = Object.create(null); - for (key in obj) { - if (!hasProp.call(obj, key)) continue; - objClone[key] = obj[key]; - } - s[_this.options.childkey].push(objClone); - delete obj["#name"]; - if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { - obj = obj[charkey]; - } - } - } - if (stack.length > 0) { - return _this.assignOrPush(s, nodeName, obj); - } else { - if (_this.options.explicitRoot) { - old = obj; - obj = Object.create(null); - obj[nodeName] = old; - } - _this.resultObject = obj; - _this.saxParser.ended = true; - return _this.emit("end", _this.resultObject); - } - }; - })(this); - ontext = (function(_this) { - return function(text) { - var charChild, s; - s = stack[stack.length - 1]; - if (s) { - s[charkey] += text; - if (_this.options.explicitChildren && _this.options.preserveChildrenOrder && _this.options.charsAsChildren && (_this.options.includeWhiteChars || text.replace(/\\n/g, '').trim() !== '')) { - s[_this.options.childkey] = s[_this.options.childkey] || []; - charChild = { - '#name': '__text__' - }; - charChild[charkey] = text; - if (_this.options.normalize) { - charChild[charkey] = charChild[charkey].replace(/\s{2,}/g, " ").trim(); - } - s[_this.options.childkey].push(charChild); - } - return s; - } - }; - })(this); - this.saxParser.ontext = ontext; - return this.saxParser.oncdata = (function(_this) { - return function(text) { - var s; - s = ontext(text); - if (s) { - return s.cdata = true; - } - }; - })(this); - }; - - parseString(str, cb) { - var err; - if ((cb != null) && typeof cb === "function") { - this.on("end", function(result) { - this.reset(); - return cb(null, result); - }); - this.on("error", function(err) { - this.reset(); - return cb(err); - }); - } - try { - str = str.toString(); - if (str.trim() === '') { - this.emit("end", null); - return true; - } - str = bom.stripBOM(str); - if (this.options.async) { - this.remaining = str; - setImmediate(this.processAsync); - return this.saxParser; - } - return this.saxParser.write(str).close(); - } catch (error1) { - err = error1; - if (!(this.saxParser.errThrown || this.saxParser.ended)) { - if(this.listenerCount('error') > 0) { - this.emit('error', err); - } else { - throw err; - } - return this.saxParser.errThrown = true; - } else if (this.saxParser.ended) { - throw err; - } - } - }; - - parseStringPromise(str) { - return new Promise((function(_this) { - return function(resolve, reject) { - return _this.parseString(str, function(err, value) { - if (err) { - return reject(err); - } else { - return resolve(value); - } - }); - }; - })(this)); - }; - - } - - export const parseString = function(str, a, b) { - var cb, options, parser; - if (b != null) { - if (typeof b === 'function') { - cb = b; - } - if (typeof a === 'object') { - options = a; - } - } else { - if (typeof a === 'function') { - cb = a; - } - options = {}; - } - parser = new Parser(options); - return parser.parseString(str, cb); - }; - - export const parseStringPromise = function(str, a) { - var options, parser; - if (typeof a === 'object') { - options = a; - } - parser = new Parser(options); - return parser.parseStringPromise(str); - }; - diff --git a/developer/src/common/web/utils/src/deps/xml2js/processors.js b/developer/src/common/web/utils/src/deps/xml2js/processors.js deleted file mode 100644 index 2a6849088c1..00000000000 --- a/developer/src/common/web/utils/src/deps/xml2js/processors.js +++ /dev/null @@ -1,31 +0,0 @@ - "use strict"; - var prefixMatch; - - prefixMatch = new RegExp(/(?!xmlns)^.*:/); - - export const normalize = function(str) { - return str.toLowerCase(); - }; - - export const firstCharLowerCase = function(str) { - return str.charAt(0).toLowerCase() + str.slice(1); - }; - - export const stripPrefix = function(str) { - return str.replace(prefixMatch, ''); - }; - - export const parseNumbers = function(str) { - if (!isNaN(str)) { - str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str); - } - return str; - }; - - export const parseBooleans = function(str) { - if (/^(?:true|false)$/i.test(str)) { - str = str.toLowerCase() === 'true'; - } - return str; - }; - diff --git a/developer/src/common/web/utils/src/deps/xml2js/xml2js.js b/developer/src/common/web/utils/src/deps/xml2js/xml2js.js deleted file mode 100644 index 8ecbe3bcf2f..00000000000 --- a/developer/src/common/web/utils/src/deps/xml2js/xml2js.js +++ /dev/null @@ -1,27 +0,0 @@ -var - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty; - - // import { defaults } from './defaults.js'; - import * as builder from './builder.js'; - import * as parser from './parser.js'; - import * as processors from './processors.js'; - - // export const defaults = defaults.defaults; - // export const processors = processors; - - /** @type Class */ - export class ValidationError extends Error { - constructor(message) { - super(message); - this.message = message; - } - }; - - export const Parser = parser.Parser; - - export const Builder = builder.Builder; - - export const parseString = parser.parseString; - - export const parseStringPromise = parser.parseStringPromise; diff --git a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts index b0fe92be320..17ade173931 100644 --- a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts +++ b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts @@ -97,6 +97,14 @@ export class LDMLKeyboardXMLSourceFileReader { if(source?.keyboard3?.transforms) { for(const transforms of source.keyboard3.transforms) { boxXmlArray(transforms, 'transformGroup'); + // need to see if there's an empty ('') element. + // the schema allows an empty object, but the spec doesn't. + for (let i=0; i @@ -24,60 +24,81 @@ type KemanXMLOptionsBag = { /** map of options for the XML parser */ const PARSER_OPTIONS: KemanXMLOptionsBag = { 'keyboard3': { - explicitArray: false, - mergeAttrs: true, - includeWhiteChars: false, - emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. + ignoreAttributes: false, // We'd like attributes, please + attributeNamePrefix: '', // to avoid '@_' prefixes + trimValues: false, // preserve spaces, but: + htmlEntities: true, + tagValueProcessor: (tagName: string, tagValue: string /*, jPath, hasAttributes, isLeafNode*/) => { + // since trimValues: false, we need to zap any element values that would be trimmed. + // currently, the LDML spec doesn't have any element values, but this + // future-proofs us a little in that element values are allowed, just trimmed. + // if we do need elements in the future, we'd check the preserve-space attribute here. + return tagValue?.trim(); + }, }, 'keyboardTest3': { - preserveChildrenOrder: true, // needed for test data - explicitChildren: true, // needed for test data + ignorePiTags: true, + htmlEntities: true, + ignoreAttributes: false, // We'd like attributes, please + attributeNamePrefix: '', // avoid @_ + preserveOrder: true, // Gives us a 'special' format }, 'kps': { - explicitArray: false + ignorePiTags: true, + ignoreAttributes: false, + htmlEntities: true, + attributeNamePrefix: '$', // causes remapping into $: { … } objects + textNodeName: '_', + numberParseOptions: { + skipLike: /(?:)/, // parse numbers as strings + hex: null, + leadingZeros: null, + eNotation: null, + }, }, 'kpj': { - explicitArray: false, - mergeAttrs: false, - includeWhiteChars: false, - normalize: false, - emptyTag: '' + ignorePiTags: true, + textNodeName: '_', + htmlEntities: true, + ignoreAttributes: false, // We'd like attributes, please + attributeNamePrefix: '', // to avoid '@_' prefixes + numberParseOptions: { + skipLike: /(?:)/, // parse numbers as strings + hex: null, + leadingZeros: null, + eNotation: null, + }, }, 'kvks': { - explicitArray: false, - mergeAttrs: false, - includeWhiteChars: true, - normalize: false, - emptyTag: {} as any - // Why "as any"? xml2js is broken: - // https://github.com/Leonidas-from-XIV/node-xml2js/issues/648 means - // that an old version of `emptyTag` is used which doesn't support - // functions, but DefinitelyTyped is requiring use of function or a - // string. See also notes at - // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/59259#issuecomment-1254405470 - // An alternative fix would be to pull xml2js directly from github - // rather than using the version tagged on npmjs.com. + ignorePiTags: true, + textNodeName: '_', + htmlEntities: true, + ignoreAttributes: false, // We'd like attributes, please + attributeNamePrefix: '$', // causes remapping into $: { … } objects + numberParseOptions: { + skipLike: /(?:)/, // parse numbers as strings + hex: null, + leadingZeros: null, + eNotation: null, + }, + trimValues: false, // preserve spaces, but: + tagValueProcessor: (tagName: string, tagValue: string, jPath: string, hasAttributes: string, isLeafNode: boolean) : string | undefined => { + if (!isLeafNode) { + return tagValue?.trim(); // trimmed value + } else { + return null; // no change to leaf nodes + } + }, }, }; const GENERATOR_OPTIONS: KemanXMLOptionsBag = { kvks: { - allowSurrogateChars: true, - attrkey: '$', - charkey: '_', - xmldec: { - version: '1.0', - encoding: 'UTF-8', - standalone: true - }, + attributeNamePrefix: '$', + ignoreAttributes: false, + format: true, + textNodeName: '_', + suppressEmptyNode: true, }, }; @@ -86,11 +107,125 @@ export class KeymanXMLReader { public constructor(public type: KeymanXMLType) { } + /** move `{ $abc: 4 }` into `{ $: { abc: 4 } }` */ + private static fixupDollarAttributes(data: any) : any { + if (typeof data === 'object') { + if (Array.isArray(data)) { + return data.map(v => KeymanXMLReader.fixupDollarAttributes(v)); + } + // object + const e : any = []; + const attrs : any = []; + Object.entries(data).forEach(([k, v]) => { + if (k[0] === '$') { + k = k.slice(1); + attrs.push([k, KeymanXMLReader.fixupDollarAttributes(v)]); + } else { + e.push([k, KeymanXMLReader.fixupDollarAttributes(v)]); + } + }); + if (attrs.length) { + e.push(['$', Object.fromEntries(attrs)]); + } + return Object.fromEntries(e); + } else { + return data; + } + } + + /** replace any empty string "" with an empty object {} */ + private static fixupEmptyStringToEmptyObject(data: any) : any { + if (data === "") { + // this is the core feature here. + return {}; + } else if (typeof data === 'object') { + if (Array.isArray(data)) { + return data.map(v => KeymanXMLReader.fixupEmptyStringToEmptyObject(v)); + } + // object + const e : any = []; + Object.entries(data).forEach(([k, v]) => { + e.push([k, KeymanXMLReader.fixupEmptyStringToEmptyObject(v)]); + }); + return Object.fromEntries(e); + } else { + return data; + } + } + + /** + * Replace: + * ```json + * [ { "info": [], ":@": { "abc": "def" } }] + * ``` + * with: + * ```json + * [{"$": { "abc": "def" }, "#name": "info" }] + * ``` + * see https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v4/2.XMLparseOptions.md#preserveorder + * @param data input data + */ + private static fixupPreserveOrder(data: any): any { + + // we need to extract the root name specially + if (!Array.isArray(data)) { + throw Error(`Internal Error: XML parser preserveOrder did not yield an array.`); + } + if (data.length !== 1) { + // we ignore comments, so should only have one element + throw Error(`Internal Error: XML parser preserveOrder did not yield an array of size 1.`); + } + // the root element is special, we copy it into a property + const rootElement = KeymanXMLReader.fixupPreserveOrderObject(data[0]); + const rootElementName = rootElement['#name']; + const out: any = {}; + out[rootElementName] = rootElement; + return out; + } + + /** takes an 'object' with a property `:@` containing attrs, and one other property with the object name */ + private static fixupPreserveOrderObject(data: any): any { + const attrs = data[':@']; + const mainEntry : any = Object.entries(data).filter(([k,v]) => k !== ':@'); + const [elementName, subItems] = mainEntry[0]; + const out : any = {}; + if ( attrs ) { + out['$'] = attrs; + } + if (!elementName) { + throw Error(`could not find elementName in ${JSON.stringify(mainEntry[0])}`); + } + out['#name'] = elementName; + if (subItems && subItems.length) { + out['$$'] = subItems.map((subObject: any) => KeymanXMLReader.fixupPreserveOrderObject(subObject)); + // xml2js duplicated data here, including elements in their 'non-preserved-order' form. + // we don't read this data, but we're maintaining compatibility here with the read format. + // example: emit: […], keystroke:[…] + for (const o of out['$$']) { + const subElementName = o['#name']; + const nonPreservedElements = out[subElementName] = out[subElementName] ?? []; + const oWithoutName = {...o}; + delete oWithoutName['#name']; // #name is only there in the preserved-order form. + nonPreservedElements.push(oWithoutName); + } + } + return out; + } + public parse(data: string): any { const parser = this.parser(); - let a: any; - parser.parseString(data, (e: unknown, r: unknown) => { if (e) throw e; a = r; }); - return a; + let result = parser.parse(data, true); + if (PARSER_OPTIONS[this.type].attributeNamePrefix === '$') { + result = KeymanXMLReader.fixupDollarAttributes(result); + } + if (this.type === 'keyboard3') { + result = KeymanXMLReader.fixupEmptyStringToEmptyObject(result); + } + if (PARSER_OPTIONS[this.type].preserveOrder) { + result = KeymanXMLReader.fixupPreserveOrder(result); + } + delete result['?xml']; + return result; } public parser() { @@ -103,16 +238,49 @@ export class KeymanXMLReader { if (options.emptyTag) { options.emptyTag = {}; // TODO: xml2js likes to mutate the options here. Reset it. } - return new xml2js.Parser(options); + return new XMLParser(options); } } +/** + * Fixed prologue for writing XML + */ +const PROLOGUE = { '?xml': { '$version': '1.0', '$encoding': 'utf-8' } }; + /** wrapper for XML generation support */ export class KeymanXMLWriter { + + private static fixDataForWrite(data: any) : any { + if(typeof data === 'object') { + if (Array.isArray(data)) { + // just fixup each item of the array + return data.map(d => KeymanXMLWriter.fixDataForWrite(d)); + } + // else object + const e : any = []; + Object.entries(data).forEach(([k,v]) => { + if (k === '$') { + /* convert $: { a: 1, b: 2 } to { $a: 1, $b: 2} */ + Object.entries(v).forEach(([k,v]) => { + e.push([`\$${k}`, KeymanXMLWriter.fixDataForWrite(v)]); + }); + } else { + e.push([k, KeymanXMLWriter.fixDataForWrite(v)]); + } + }); + // reconstitute with $ elements fixed + return Object.fromEntries(e); + } else { + return data; // string or something else + } + } + write(data: any): string { const builder = this.builder(); - return builder.buildObject(data); + data = KeymanXMLWriter.fixDataForWrite(data); + return builder.build({ ...PROLOGUE, ...data }); } + constructor(public type: KeymanXMLType) { } @@ -122,7 +290,7 @@ export class KeymanXMLWriter { /* c8 ignore next 1 */ throw Error(`Internal error: unhandled XML type ${this.type}`); } - return new xml2js.Builder(Object.assign({}, options)); // Shallow clone in case the options are mutated. + return new XMLBuilder(Object.assign({}, options)); // Shallow clone in case the options are mutated. } } diff --git a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks.json b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks.json index 6775beb1605..a20c8b67518 100644 --- a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks.json +++ b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor.kvks.json @@ -1,17 +1,17 @@ { "visualkeyboard": { - "_": "\n \n \n", + "header": { - "_": "\n \n \n \n ", + "version": "10.0", "kbdname": "khmer_angkor", "flags": { - "_": "\n \n ", + "usealtgr": "" } }, "encoding": { - "_": "\n \n \n \n \n ", + "$": { "name": "unicode", "fontname": "Khmer Busra Kbd", @@ -19,7 +19,7 @@ }, "layer": [ { - "_": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ", + "$": { "shift": "RA" }, @@ -315,7 +315,7 @@ ] }, { - "_": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ", + "$": { "shift": "SRA" }, @@ -575,7 +575,7 @@ ] }, { - "_": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ", + "$": { "shift": "" }, @@ -871,13 +871,12 @@ ] }, { - "_": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ", + "$": { "shift": "S" }, "key": [ { - "_": "", "$": { "vkey": "K_SPACE" } @@ -1169,4 +1168,4 @@ ] } } -} \ No newline at end of file +} diff --git a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks index 05eb838178f..945477d3fee 100644 --- a/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks +++ b/developer/src/common/web/utils/test/fixtures/xml/khmer_angkor2.kvks @@ -1,4 +1,4 @@ - +
10.0 @@ -156,7 +156,7 @@ ! - " + " % @@ -203,4 +203,4 @@ - \ No newline at end of file + diff --git a/developer/src/common/web/utils/test/kpj/test-kpj-file-reader.ts b/developer/src/common/web/utils/test/kpj/test-kpj-file-reader.ts index 4b154af0606..1caf70cd20d 100644 --- a/developer/src/common/web/utils/test/kpj/test-kpj-file-reader.ts +++ b/developer/src/common/web/utils/test/kpj/test-kpj-file-reader.ts @@ -15,9 +15,7 @@ describe('kpj-file-reader', function () { const input = fs.readFileSync(path); const reader = new KPJFileReader(callbacks); const kpj = reader.read(input); - assert.doesNotThrow(() => { - reader.validate(kpj); - }); + reader.validate(kpj); assert.equal(kpj.KeymanDeveloperProject.Options.BuildPath, '$PROJECTPATH\\build'); assert.equal(kpj.KeymanDeveloperProject.Options.CheckFilenameConventions, 'False'); assert.equal(kpj.KeymanDeveloperProject.Options.CompilerWarningsAsErrors, 'True'); diff --git a/developer/src/common/web/utils/tsconfig.json b/developer/src/common/web/utils/tsconfig.json index 3be972dbcb6..6f96f75ee70 100644 --- a/developer/src/common/web/utils/tsconfig.json +++ b/developer/src/common/web/utils/tsconfig.json @@ -8,6 +8,5 @@ }, "include": [ "src/**/*.ts", - "src/deps/xml2js/*.js", ], -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 7cbb8d2da2a..8cf9c5d5d83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -327,6 +327,7 @@ "@keymanapp/common-types": "*", "@sentry/node": "^7.57.0", "eventemitter3": "^5.0.0", + "fast-xml-parser": "^4.5.0", "restructure": "^3.0.1", "sax": ">=0.6.0", "semver": "^7.5.4", @@ -336,7 +337,6 @@ "@types/git-diff": "^2.0.3", "@types/node": "^20.4.1", "@types/semver": "^7.3.12", - "@types/xml2js": "^0.4.5", "c8": "^7.12.0", "git-diff": "^2.0.6", "mocha": "^8.4.0", @@ -4668,14 +4668,6 @@ "@types/node": "*" } }, - "node_modules/@types/xml2js": { - "version": "0.4.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yargs": { "version": "17.0.26", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.26.tgz", @@ -8739,6 +8731,28 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-xml-parser": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -13553,6 +13567,12 @@ "resolved": "resources/tools/strip-emoji", "link": true }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "license": "MIT", From 03a24a150619f1677133240faef45eec9ec389f9 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 3 Oct 2024 12:41:08 -0500 Subject: [PATCH 114/119] feat(developer): fast-xml-parser: fix for ldml empty attributes - because of the form to="" in ldml, we need to distinguish attributes and sub-elements in the ldml xml parsing - use an attributePrefix, and fixup the object tree afterwards Fixes: #12208 --- .../src/common/web/utils/src/xml-utils.ts | 42 ++++++++++++------- .../xml/tran_fail-matches-nothing-1.xml | 13 ++++++ .../xml/tran_fail-matches-nothing-1.xml.json | 19 +++++++++ .../common/web/utils/test/test-xml-utils.ts | 1 + 4 files changed, 61 insertions(+), 14 deletions(-) create mode 100644 developer/src/common/web/utils/test/fixtures/xml/tran_fail-matches-nothing-1.xml create mode 100644 developer/src/common/web/utils/test/fixtures/xml/tran_fail-matches-nothing-1.xml.json diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index 02d28dfc90c..9ed252256e6 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -25,7 +25,7 @@ type KemanXMLOptionsBag = { const PARSER_OPTIONS: KemanXMLOptionsBag = { 'keyboard3': { ignoreAttributes: false, // We'd like attributes, please - attributeNamePrefix: '', // to avoid '@_' prefixes + attributeNamePrefix: '@__', // We'll use this to convert attributes to strings and subobjects to arrays, when empty. trimValues: false, // preserve spaces, but: htmlEntities: true, tagValueProcessor: (tagName: string, tagValue: string /*, jPath, hasAttributes, isLeafNode*/) => { @@ -133,19 +133,35 @@ export class KeymanXMLReader { } } - /** replace any empty string "" with an empty object {} */ + /** + * Requires attribute prefix @__ (double underscore) + * For attributes, just remove @__ and continue. + * For objects, replace any empty string "" with an empty object {} */ private static fixupEmptyStringToEmptyObject(data: any) : any { - if (data === "") { - // this is the core feature here. - return {}; - } else if (typeof data === 'object') { + if (typeof data === 'object') { + // For arrays of objects, we map "" to {} + // "" means an empty object if (Array.isArray(data)) { - return data.map(v => KeymanXMLReader.fixupEmptyStringToEmptyObject(v)); + return data.map(v => { + if (v === '') { + return {}; + } else { + return KeymanXMLReader.fixupEmptyStringToEmptyObject(v); + } + }); } - // object - const e : any = []; + // otherwise: remove @__ for attributes, remap objects + const e: any = []; Object.entries(data).forEach(([k, v]) => { - e.push([k, KeymanXMLReader.fixupEmptyStringToEmptyObject(v)]); + if (k.startsWith('@__')) { + e.push([k.substring(3), KeymanXMLReader.fixupEmptyStringToEmptyObject(v)]); + } else { + if (v === '') { + e.push([k, {}]); + } else { + e.push([k, KeymanXMLReader.fixupEmptyStringToEmptyObject(v)]); + } + } }); return Object.fromEntries(e); } else { @@ -217,11 +233,9 @@ export class KeymanXMLReader { let result = parser.parse(data, true); if (PARSER_OPTIONS[this.type].attributeNamePrefix === '$') { result = KeymanXMLReader.fixupDollarAttributes(result); - } - if (this.type === 'keyboard3') { + } else if (PARSER_OPTIONS[this.type].attributeNamePrefix === '@__') { result = KeymanXMLReader.fixupEmptyStringToEmptyObject(result); - } - if (PARSER_OPTIONS[this.type].preserveOrder) { + } else if (PARSER_OPTIONS[this.type].preserveOrder) { result = KeymanXMLReader.fixupPreserveOrder(result); } delete result['?xml']; diff --git a/developer/src/common/web/utils/test/fixtures/xml/tran_fail-matches-nothing-1.xml b/developer/src/common/web/utils/test/fixtures/xml/tran_fail-matches-nothing-1.xml new file mode 100644 index 00000000000..5b5e2bba5bd --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/tran_fail-matches-nothing-1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/developer/src/common/web/utils/test/fixtures/xml/tran_fail-matches-nothing-1.xml.json b/developer/src/common/web/utils/test/fixtures/xml/tran_fail-matches-nothing-1.xml.json new file mode 100644 index 00000000000..477499477d8 --- /dev/null +++ b/developer/src/common/web/utils/test/fixtures/xml/tran_fail-matches-nothing-1.xml.json @@ -0,0 +1,19 @@ +{ + "keyboard3": { + "conformsTo": "45", + "xmlns": "https://schemas.unicode.org/cldr/45/keyboard3", + "locale": "mt", + "info": { + "name": "fail-matches-nothing" + }, + "keys": {}, + "transforms": { + "type": "simple", + "transformGroup": { + "transform": { + "from": "" + } + } + } + } +} \ No newline at end of file diff --git a/developer/src/common/web/utils/test/test-xml-utils.ts b/developer/src/common/web/utils/test/test-xml-utils.ts index fbe32f8da4f..1cc9724b278 100644 --- a/developer/src/common/web/utils/test/test-xml-utils.ts +++ b/developer/src/common/web/utils/test/test-xml-utils.ts @@ -32,6 +32,7 @@ const read_cases: Case[] = [ 'k_020_fr.xml', 'strs_invalid-illegal.xml', 'tran_fail-empty.xml', + 'tran_fail-matches-nothing-1.xml', ], }, { type: 'keyboardTest3', From 358f2d5dbacc22e900bcc7eb3804fcb3fa3e747c Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Thu, 3 Oct 2024 14:02:54 -0400 Subject: [PATCH 115/119] auto: increment master version to 18.0.122 --- HISTORY.md | 6 ++++++ VERSION.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 7e3d41a3386..2ab24326098 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,11 @@ # Keyman Version History +## 18.0.121 alpha 2024-10-03 + +* docs(developer): Fix image links in help (#12488) +* fix(oem/fv): Update keyboard versions and names for fv_all.kmp 13.1 (#12486) +* feat(common): unified XML parser/writer (#12482) + ## 18.0.120 alpha 2024-10-02 * chore(common): Add note on troubleshooting website errors (#12487) diff --git a/VERSION.md b/VERSION.md index b67d9be263f..9fb9b046297 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.121 \ No newline at end of file +18.0.122 \ No newline at end of file From 5fb8d11203869acee84c82537d010cc40153684a Mon Sep 17 00:00:00 2001 From: sgschantz Date: Mon, 7 Oct 2024 11:03:08 +0700 Subject: [PATCH 116/119] feat(mac): add call to km_core_keyboard_key_list_dispose memory leak of key list without disposing --- .../KeymanEngine4Mac/CoreWrapper/CoreWrapper.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreWrapper.m b/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreWrapper.m index ea5bb8c2228..c1cd9b81f85 100644 --- a/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreWrapper.m +++ b/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreWrapper.m @@ -91,6 +91,8 @@ -(NSArray*)getKeyArray { } } + km_core_keyboard_key_list_dispose(keyList); + os_log_debug([KMELogs coreLog], "getKeyList returning %lu keys", (unsigned long)keyArray.count); return keyArray; @@ -103,7 +105,7 @@ -(void) dealloc{ if (self.coreKeyboard) { km_core_keyboard_dispose(self.coreKeyboard); } - os_log_debug([KMELogs coreLog], "dealloc called."); + os_log_debug([KMELogs coreLog], "CoreWrapper dealloc called"); } -(void)loadKeyboardUsingCore:(NSString*) path { From 2befe8ede7664407a2d6cd71f5392bdc141d9b65 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Mon, 7 Oct 2024 14:02:45 -0400 Subject: [PATCH 117/119] auto: increment master version to 18.0.123 --- HISTORY.md | 5 +++++ VERSION.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 2ab24326098..9439ba6224d 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,10 @@ # Keyman Version History +## 18.0.122 alpha 2024-10-07 + +* feat(mac): both option keys generate right alt if no left alt mapping (#12458) +* chore(common): improve configuration detection for hextobin (#12481) + ## 18.0.121 alpha 2024-10-03 * docs(developer): Fix image links in help (#12488) diff --git a/VERSION.md b/VERSION.md index 9fb9b046297..fa985f788c5 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.122 \ No newline at end of file +18.0.123 \ No newline at end of file From 9a4c7e5820a27487bfe5363d030a04f619756d85 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 7 Oct 2024 13:05:50 -0500 Subject: [PATCH 118/119] feat(developer): fast-xml-parser: typo fix in xml-utils.ts Fixes: #12208 --- developer/src/common/web/utils/src/xml-utils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index 9ed252256e6..999da59fde3 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -17,12 +17,12 @@ export type KeymanXMLType = ; /** Bag of options, maximally one for each KeymanXMLType */ -type KemanXMLOptionsBag = { +type KeymanXMLOptionsBag = { [key in KeymanXMLType]?: any }; /** map of options for the XML parser */ -const PARSER_OPTIONS: KemanXMLOptionsBag = { +const PARSER_OPTIONS: KeymanXMLOptionsBag = { 'keyboard3': { ignoreAttributes: false, // We'd like attributes, please attributeNamePrefix: '@__', // We'll use this to convert attributes to strings and subobjects to arrays, when empty. @@ -92,7 +92,7 @@ const PARSER_OPTIONS: KemanXMLOptionsBag = { }, }; -const GENERATOR_OPTIONS: KemanXMLOptionsBag = { +const GENERATOR_OPTIONS: KeymanXMLOptionsBag = { kvks: { attributeNamePrefix: '$', ignoreAttributes: false, From cd614a5a8ce2720ae1e4fd953458d86ae61fc8be Mon Sep 17 00:00:00 2001 From: sgschantz Date: Tue, 8 Oct 2024 14:41:31 +0700 Subject: [PATCH 119/119] chore(ios): renew certificate --- ios/exportAppStore.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/exportAppStore.plist b/ios/exportAppStore.plist index 48ef58f532d..bb7315750ed 100644 --- a/ios/exportAppStore.plist +++ b/ios/exportAppStore.plist @@ -7,9 +7,9 @@ teamID 3YE4W86L3G signingCertificate - BB842A0081298BBA6D034C85451750B08FC9EE8A + 683E4A3CDF5277C13004E84D63E31D2F720AB063 installerSigningCertificate - BB842A0081298BBA6D034C85451750B08FC9EE8A + 683E4A3CDF5277C13004E84D63E31D2F720AB063 provisioningProfiles Tavultesoft.Keyman

Tests keyboard documentation re

Stand-alone gesture recognition