From 9e17f7f9c0f0bcb63865d9ef22ac515493c71571 Mon Sep 17 00:00:00 2001 From: Nnyny Date: Mon, 27 May 2024 15:39:41 +0700 Subject: [PATCH 01/28] 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 3f071d11c3..b32c8d04ff 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 02/28] 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 b32c8d04ff..be466fdc2c 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 03/28] 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 be466fdc2c..1d0f3aa772 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 04/28] 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 1d0f3aa772..700ef63a65 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 05/28] 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 700ef63a65..4898f9a1c2 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 1ec1f0e1e8547303a68b144b54f9e0d17f95343b Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 16 Sep 2024 06:13:46 +0700 Subject: [PATCH 06/28] 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 07/28] 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 04fa876417..56b9a92326 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 cce0405050..c0b034dde0 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 42d04b5987..35fa2adde3 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 e05b8d284e..3bc959cc6c 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 3346a7defa..9296f80d05 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 6ef0be7d8b..1c730f8f4b 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 f5770fe885..364f3f1bcd 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 6160816443..98723f0667 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 d8331b345e..807f7047ab 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 c5e8fa36be..0000000000 --- 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 9b31b2de38517ee0718632cb4cbb19e86473ca6b Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 17 Sep 2024 08:21:41 +0700 Subject: [PATCH 08/28] fix(android): Remove banner toggle --- .../com/tavultesoft/kmapro/KeymanSettingsActivity.java | 1 - .../com/tavultesoft/kmapro/KeymanSettingsFragment.java | 7 ------- android/KMAPro/kMAPro/src/main/res/values/strings.xml | 6 +++--- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java index 86494e929b..7e6dcbe5b1 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java @@ -10,7 +10,6 @@ import androidx.appcompat.widget.Toolbar; public class KeymanSettingsActivity extends BaseActivity { protected static final String installedLanguagesKey = "InstalledLanguages"; protected static final String installKeyboardOrDictionaryKey = "InstallKeyboardOrDictionary"; - protected static final String showBannerKey = "ShowBanner"; protected static final String sendCrashReport = "SendCrashReport"; public static final String spacebarTextKey = "SpacebarText"; public static final String hapticFeedbackKey = "HapticFeedback"; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java index 95bb7774b0..59ac59e2f8 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java @@ -178,12 +178,6 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat { editor.putBoolean(KeymanSettingsActivity.showBannerKey, isChecked); as part of the default onClick() used by SwitchPreference. */ - SwitchPreference bannerPreference = new SwitchPreference(context); - bannerPreference.setKey(KeymanSettingsActivity.showBannerKey); - bannerPreference.setTitle(getString(R.string.show_banner)); - bannerPreference.setSummaryOn(getString(R.string.show_banner_on)); - bannerPreference.setSummaryOff(getString(R.string.show_banner_off)); - SwitchPreference getStartedPreference = new SwitchPreference(context); getStartedPreference.setKey(GetStartedActivity.showGetStartedKey); getStartedPreference.setTitle(String.format(getString(R.string.show_get_started), getString(R.string.get_started))); @@ -207,7 +201,6 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat { screen.addPreference(spacebarTextPreference); screen.addPreference(hapticFeedbackPreference); - screen.addPreference(bannerPreference); screen.addPreference(getStartedPreference); screen.addPreference(sendCrashReportPreference); diff --git a/android/KMAPro/kMAPro/src/main/res/values/strings.xml b/android/KMAPro/kMAPro/src/main/res/values/strings.xml index a1f9e7240d..01546f91ba 100644 --- a/android/KMAPro/kMAPro/src/main/res/values/strings.xml +++ b/android/KMAPro/kMAPro/src/main/res/values/strings.xml @@ -147,13 +147,13 @@ Vibrate when typing - + Always show banner - + To be implemented - + When off, only shown when predictive text is enabled From 59391949dfc2a09c8bf226111b1ef18634a2b29e Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 17 Sep 2024 08:27:41 +0700 Subject: [PATCH 09/28] docs(android): Remove placeholder docs for banner toggle --- .../android_images/settings-screen-ap.png | Bin 38196 -> 34247 bytes android/help/basic/config/index.md | 5 ----- 2 files changed, 5 deletions(-) diff --git a/android/help/android_images/settings-screen-ap.png b/android/help/android_images/settings-screen-ap.png index f316fefd73f2e550966732c4e7350bd4953b5073..f83da3804060f7837323f682bae74c9529b78a83 100644 GIT binary patch literal 34247 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 L9CyOldHsI@C}Bwn literal 38196 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

RPKRvZVC&N=slpg09vP`nhD?r z6eE25TQ%YzzrH3@5S0!x82TTMjRXbG6YPRpT-=`qiiU~*8LCGM5juf);R;oMc6qtZ zT!@l}#t+27D4QQC1E3zQ5|?c8B7Ce?G_6~zVW61DAcwjRe}*lIv6zj(A#fKh{2sz} zf$2yDAH((CfUHPycH{=e9?q~pQPFh@Bm+7#1+5eLQy{Y52}7CP9G z03WQQF9lNz-YBsC)?0|J`)T>_Ax)QW-TTS0Rf1i5)L=K92Tb9KYd3&r zX)h{aLm|bq3x#8XQ+J5O%%i#0FaHT&xyIAg-O(|FdwUu>I-|>v`}D!d-))G9dyexe z&L=$%3NpjlbHeDlJ-010Eo~SanFZ(U!P`WOMb44~aho6`Myxsp_6QIkS_Khu0nobe zaCh9-2_g@K!HPyt-tV>cCp>x+2!;Rwy}5o6dX{qrCA%M_rEw7;8vWRpz0#M4agJ+Hj+zqkC`hEtuuB_ohd(80|4h z53Of=xmG;elP=?s3XVAPqtgHgF?!5YT5VR?^yZBD_Ql=qFMI()M53gk;vg3wSULSr z_|IjGd`><-;?5yDMx@F-JxlxDq9xqJuzbX~JRo?)Rh$SbZyvZO7YS~H8b?J%F;qL_ zR1M+C;W#e_o7fES8)vWu90{Zw7HTd*3 z_<)6f^7~R!QvO>^3)7BqbH-093(q0}J1(4hU;Ik!u4UBzM2T?LcB64j*5v%;w^y)mfT*R(2$TT=otspl%faBHH1OCIkmlTHqi_d->LeZN0Uy0(Nw!nv&A-Ytdrr^4G72 z5idv>lW_OiC6@b{k%5#aCns-*1I1FRKfSPaVzYQ@D{ms~;1B4J#AzZHd{+k|A<&il zpuvNap${BpV7Q8bhrd9f-;=1~59b4ZGI6ZG&HQmd05j6f>@hA68XDw*X)tmUzzU(e z;%M1Z`9$gT&i0<3E1(BNW-Y7N+F`i>?Ep&S=TpiUNnll%Gc+6-@%?UzGj2A12O4 zqV)sxtzbJ6hgy+J!EUWL4M#hjoU}y#WEE$2dl6m*f+eulBVS*Kzx|>ta&Obpo@}fw zA3k!V7Nl%-glX#vt{tKjN(#FXXJ@cQN6=azoDdE^wx`EJn{0)TlO{xMQ~=Iiq5z2y zHn8X1kB1b*p%8o-&VC`kMq6`pLTdniJaq7&-34uEA^19j%a?aSfg_Uf8i#g>j2_NhC~@#+$seGg zNQU4=fW)LEHe&cZzWZ_5v-Q4Do%*S0g^* zycoVLqWsOfXX^|Web&P7G_2C+we_(gee_gIrTM( zW@^`i!5z|%y7#7cas^E=7}qt{*c2G&X=i@iuNgVLSZ$h{H|I&S9wdB9y6$}leQCyT z?JV>;OH0eqR?v|uldb%Oghwc0gS$t6JFQWVxl2G%KOrjG+goG)@`J^p?O;6l|N2od zkk7%pNIxSG#eQRrSN(w1FRCV>x*I`u#o8TvN_V_!VbNTXR5IA_! zsQK5(AawTWAS9QYi-S#7mU$2(&RbaE1RQ5aM+X)h6c5Ka_m}DqPLAEo)`F!2OB6(y z?WI4)YyFzhv2s2h9$Z#iN5>_3`6s$E0X5RdeB#B!c@#j2fdO7jy}^I#3cs|zUX_!> zNlN2_K29#KVeoMTn3L39?}{D6o=VKgQIVX6V~RpVz8xARzT1X4lJ?yu{44{wR6}

t_!AOKB0fIwRCngKD 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 diff --git a/android/help/basic/config/index.md b/android/help/basic/config/index.md index 4d55e98839..96a3fb5e35 100644 --- a/android/help/basic/config/index.md +++ b/android/help/basic/config/index.md @@ -55,11 +55,6 @@ Click on this to [change the displayed keyboard name](spacebar-caption) on the s ## Vibrate When Typing When enabled, the Keyman keyboard will provide haptic feedback (vibrate) when the user presses a key and generates output. The default preference is off. -## Always show banner -This toggle is reserved for future features. When off, the text suggestion banner is only displayed when -the dictionary is enabled. The language associated with the keyboard must match the language associated with -the dictionary. - ## Show "Get Started" on startup When enabled, the Keyman app will display the 'Get Started' screen on app startup. From 7c365e35a39c1dba014251d4b6ec6bfe90922641 Mon Sep 17 00:00:00 2001 From: Nguonnyny Tan <123520338+Nnyny@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:31:38 +0700 Subject: [PATCH 10/28] chore: update contexthelp.xml --- developer/src/tike/xml/help/contexthelp.xml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/developer/src/tike/xml/help/contexthelp.xml b/developer/src/tike/xml/help/contexthelp.xml index 552e975fe0..6a3dd4cef5 100644 --- a/developer/src/tike/xml/help/contexthelp.xml +++ b/developer/src/tike/xml/help/contexthelp.xml @@ -494,12 +494,14 @@ in a batch file and reference the batch file here.

- -

+ +

You can check the location of your default project folder, where projects like keyboards or + lexical models will be saved automatically. If needed, you can change the folder location + to a more convenient spot.

- -

+ +

Reset all tabs to their original locations.

@@ -571,10 +573,6 @@ this option, then it will reset the debugger automatically instead.

- -

-
-

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 From becea93fa9f661df36a0419df287b73337ca51cc Mon Sep 17 00:00:00 2001 From: sgschantz Date: Tue, 17 Sep 2024 15:36:41 +0700 Subject: [PATCH 11/28] change(mac): remove verbose logging option also remove related debug mode code, debug logging is controlled solely by universal logging settings Fixes: #11525 --- mac/Keyman4Mac/Keyman4Mac/AppDelegate.m | 4 +- .../Base.lproj/preferences.xib | 29 +------- .../KMConfigurationWindowController.m | 11 --- .../Keyman4MacIM/KMInputMethodAppDelegate.h | 2 - .../Keyman4MacIM/KMInputMethodAppDelegate.m | 30 +------- .../Keyman4MacIM/KMInputMethodEventHandler.m | 15 ++-- .../Keyman4MacIM/KMSettingsRepository.h | 3 +- .../Keyman4MacIM/KMSettingsRepository.m | 16 ++--- .../KeymanTests/TestAppDelegate.h | 1 - .../KeymanTests/TestAppDelegate.m | 6 +- .../KeymanEngine4Mac/CoreWrapper/CoreHelper.h | 3 - .../KeymanEngine4Mac/CoreWrapper/CoreHelper.m | 3 +- .../KeymanEngine4Mac/KME/KMEngine.h | 4 +- .../KeymanEngine4Mac/KME/KMEngine.m | 71 +------------------ .../CoreTestStaticHelperMethods.m | 2 +- .../KeymanEngine4MacTests/KMEngineTests.m | 52 +++++++------- 16 files changed, 55 insertions(+), 197 deletions(-) diff --git a/mac/Keyman4Mac/Keyman4Mac/AppDelegate.m b/mac/Keyman4Mac/Keyman4Mac/AppDelegate.m index 44f7cfda58..3ffb9129cf 100644 --- a/mac/Keyman4Mac/Keyman4Mac/AppDelegate.m +++ b/mac/Keyman4Mac/Keyman4Mac/AppDelegate.m @@ -9,8 +9,6 @@ #import "AppDelegate.h" #import -static BOOL debugMode = YES; - BOOL isKeyMapEnabled; const unsigned short keyMapSize = 0x80; @@ -116,7 +114,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef NSLog(@"AppDelegate eventTapFunction key down event: %@", event); // Key down event NSEvent *mEvent = [NSEvent eventWithCGEvent:event]; - KMEngine *kme = [[KMEngine alloc] initWithKMX:kmx context:contextBuffer verboseLogging:debugMode]; + KMEngine *kme = [[KMEngine alloc] initWithKMX:kmx context:contextBuffer]; CoreKeyOutput *coreKeyOutput = [kme processEvent:mEvent]; if (coreKeyOutput) { if (coreKeyOutput.hasTextToInsert) { diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib index d5afcd00d5..e6cc0173aa 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib @@ -2,8 +2,8 @@ - - + + @@ -13,8 +13,6 @@ - - @@ -209,29 +207,6 @@ - - - - diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/KMConfigurationWindowController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/KMConfigurationWindowController.m index f3a0c3501e..202be65ef5 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/KMConfigurationWindowController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/KMConfigurationWindowController.m @@ -14,8 +14,6 @@ @interface KMConfigurationWindowController () @property (nonatomic, weak) IBOutlet NSTableView *tableView; @property (nonatomic, weak) IBOutlet WebView *webView; -@property (nonatomic, weak) IBOutlet NSButton *useVerboseLoggingCheckBox; -@property (nonatomic, weak) IBOutlet NSTextField *verboseLoggingInfo; @property (nonatomic, weak) IBOutlet NSButton *supportBack; @property (nonatomic, weak) IBOutlet NSButton *supportForward; @property (nonatomic, weak) IBOutlet NSButton *supportHome; @@ -68,8 +66,6 @@ NSURL *homeUrl = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html" subdirectory:@"Help"]; [self.webView.mainFrame loadRequest:[NSURLRequest requestWithURL:homeUrl]]; - - [self.useVerboseLoggingCheckBox setState:(self.AppDelegate.useVerboseLogging ? NSOnState : NSOffState)]; } - (void)webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id)listener { @@ -437,13 +433,6 @@ [self.AppDelegate.downloadKBWindow.window makeKeyAndOrderFront:nil]; } -- (IBAction)useVerboseLoggingCheckBoxAction:(id)sender { - NSButton *checkBox = (NSButton *)sender; - BOOL verboseLoggingOn = checkBox.state == NSOnState; - [self.AppDelegate setUseVerboseLogging:verboseLoggingOn]; - [self.verboseLoggingInfo setHidden:!verboseLoggingOn]; -} - - (void)handleRequestToInstallPackage:(KMPackage *) package { os_log_debug([KMLogs dataLog], "handleRequestToInstallPackage"); NSString *keyboardInfoString = NSLocalizedString(@"info-install-keyboard-filename", nil); diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h index 7f6b2f3655..667e630f3c 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.h @@ -89,9 +89,7 @@ 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 useVerboseLogging; @property (nonatomic, assign) BOOL useNullChar; -@property (nonatomic, assign) BOOL debugMode; - (NSMenu *)menu; - (void)saveActiveKeyboards; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index 7392c3dc2f..199721f8be 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -64,16 +64,7 @@ id _lastServerWithOSKShowing = nil; - (id)init { self = [super init]; - if (self) { -#ifdef DEBUG - // If debugging, we'll turn it on by default, regardless of setting. If developer - // really wants it off, they can either change this line of code temporarily or - // go to the config screen and turn it off explicitly. - _debugMode = YES; -#else - _debugMode = self.useVerboseLogging; -#endif - + if (self) { // first notify user and request access to Accessibility/PostEvent permissions // pass block as completion handler to complete init with initCompletion [PrivacyConsent.shared requestPrivacyAccess:^void (void){ @@ -384,7 +375,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef - (KMEngine *)kme { if (_kme == nil) { - _kme = [[KMEngine alloc] initWithKMX:nil context:self.contextBuffer verboseLogging:self.debugMode]; + _kme = [[KMEngine alloc] initWithKMX:nil context:self.contextBuffer]; } return _kme; @@ -441,19 +432,6 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef return [NSString stringWithFormat:@"%@ - Keyman", _keyboardName]; } -- (void)setUseVerboseLogging:(BOOL)useVerboseLogging { - os_log_debug([KMLogs configLog], "Turning verbose logging %{public}@", useVerboseLogging ? @"on." : @"off."); - _debugMode = useVerboseLogging; - if (_kme != nil) - [_kme setUseVerboseLogging:useVerboseLogging]; - - [[KMSettingsRepository shared] writeUseVerboseLogging:useVerboseLogging]; -} - -- (BOOL)useVerboseLogging { - return [[KMSettingsRepository shared] readUseVerboseLogging]; -} - #pragma mark - Keyman Data /** @@ -769,9 +747,7 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef NSString *keyboardMenuName = @""; int menuItemIndex = KEYMAN_FIRST_KEYBOARD_MENUITEM_INDEX; - if (self.debugMode) { - os_log_info([KMLogs configLog], "*** populateKeyboardMenuItems, number of active keyboards=%lu", self.activeKeyboards.count); - } + os_log_debug([KMLogs configLog], "*** populateKeyboardMenuItems, number of active keyboards=%lu", self.activeKeyboards.count); // loop through the active keyboards list and add them to the menu for (NSString *path in self.activeKeyboards) { diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m index d102e69ca3..c5b6f172b6 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodEventHandler.m @@ -45,11 +45,14 @@ NSString* const kEasterEggKmxName = @"EnglishSpanish.kmx"; _lowLevelBackspaceCount = 0; _queuedText = nil; - // In Xcode, if Keyman is the active IM and is in "debugMode" and "English plus Spanish" is - // the current keyboard and you type "Sentry force now", it will force a simulated crash to + BOOL forceSentryCrash = [KMSettingsRepository.shared readForceSentryError]; + + // In Xcode, if Keyman is the active IM and the settings include the + // forceSentryCrash flag and "English plus Spanish" is the current keyboard + // and you type "Sentry force now", it will force a simulated crash to // test reporting to sentry.keyman.com - if ([self.appDelegate debugMode] && [clientAppId isEqual: @"com.apple.dt.Xcode"]) { - os_log_debug([KMLogs testLog], "Sentry - Preparing to detect Easter egg."); + if (forceSentryCrash && [clientAppId isEqual: @"com.apple.dt.Xcode"]) { + os_log_debug([KMLogs testLog], "initWithClient, preparing to force Sentry crash."); _easterEggForSentry = [[NSMutableString alloc] init]; } else @@ -66,9 +69,7 @@ NSString* const kEasterEggKmxName = @"EnglishSpanish.kmx"; if (_generatedBackspaceCount > 0 || (_queuedText != nil && _queuedText.length > 0) || _keyCodeOfOriginalEvent != 0 || _sourceFromOriginalEvent != nil) { - if ([self.appDelegate debugMode]) { - os_log_error([KMLogs lifecycleLog], "ERROR: new app activated before previous app finished processing pending events! _generatedBackspaceCount: %lu, _queuedText: '%{public}@' _keyCodeOfOriginalEvent: %hu", _generatedBackspaceCount, _queuedText == nil ? @"(NIL)" : (NSString*)[self queuedText], _keyCodeOfOriginalEvent); - } + os_log_error([KMLogs lifecycleLog], "ERROR: new app activated before previous app finished processing pending events! _generatedBackspaceCount: %lu, _queuedText: '%{public}@' _keyCodeOfOriginalEvent: %hu", _generatedBackspaceCount, _queuedText == nil ? @"(NIL)" : (NSString*)[self queuedText], _keyCodeOfOriginalEvent); _keyCodeOfOriginalEvent = 0; _generatedBackspaceCount = 0; _queuedText = nil; diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h index 7fdf3de034..846b9e11c6 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.h @@ -26,8 +26,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)writeOptionForSelectedKeyboard:(NSString *)key withValue:(NSString*)value; - (BOOL)readShowOskOnActivate; - (void)writeShowOskOnActivate:(BOOL)show; -- (BOOL)readUseVerboseLogging; -- (void)writeUseVerboseLogging:(BOOL)verboseLogging; +- (BOOL)readForceSentryError; @end NS_ASSUME_NONNULL_END diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m index db59929eae..120c26e2c4 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMSettingsRepository.m @@ -15,7 +15,7 @@ NSString *const kActiveKeyboardsKey = @"KMActiveKeyboardsKey"; NSString *const kSelectedKeyboardKey = @"KMSelectedKeyboardKey"; NSString *const kPersistedOptionsKey = @"KMPersistedOptionsKey"; NSString *const kShowOskOnActivate = @"KMShowOskOnActivate"; -NSString *const kUseVerboseLogging = @"KMUseVerboseLogging"; +NSString *const kForceSentryError = @"KMForceSentryError"; /** * The following constant "KMSavedStoresKey" is left here for documentation @@ -30,6 +30,11 @@ NSString *const kKMDeprecatedPersistedOptionsKey = @"KMSavedStoresKey"; * but the related UI has been removed according to issue #12342 */ NSString *const kAlwaysShowOSKKey = @"KMAlwaysShowOSKKey"; +/** + * The following constant "KMUseVerboseLogging" is left here for documentation + * but it is obsolete and removed issue #11525 + */ +NSString *const kUseVerboseLogging = @"KMUseVerboseLogging"; NSString *const kObsoletePathComponent = @"/Documents/Keyman-Keyboards"; NSString *const kNewPathComponent = @"/Library/Application Support/keyman.inputmethod.Keyman/"; @@ -321,14 +326,9 @@ NSInteger const kCurrentDataModelVersionNumber = kVersionStoreDataInLibraryDirec [userData setBool:show forKey:kShowOskOnActivate]; } -- (BOOL)readUseVerboseLogging { +- (BOOL)readForceSentryError { NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; - return [userData boolForKey:kUseVerboseLogging]; -} - -- (void)writeUseVerboseLogging:(BOOL)verboseLogging { - NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; - [userData setBool:verboseLogging forKey:kUseVerboseLogging]; + return [userData boolForKey:kForceSentryError]; } @end diff --git a/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.h b/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.h index fafd6f1905..8cb043d410 100644 --- a/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.h +++ b/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.h @@ -22,7 +22,6 @@ typedef void(^PostEventCallback)(CGEventRef eventToPost); @property (nonatomic, assign) CFMachPortRef lowLevelEventTap; // Always nil for tests @property (nonatomic, assign) BOOL contextChangingEventDetected; @property (nonatomic, assign) BOOL useNullChar; -@property (nonatomic, assign) BOOL debugMode; @property (nonatomic, assign) CGKeyCode virtualKeyPosted; // Helper method diff --git a/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.m b/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.m index 4b247056af..b2d1f859a2 100644 --- a/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.m +++ b/mac/Keyman4MacIM/KeymanTests/TestAppDelegate.m @@ -16,7 +16,7 @@ - (KMEngine *)kme { if (_kme == nil) { - _kme = [[KMEngine alloc] initWithKMX:nil context:self.contextBuffer verboseLogging:self.debugMode]; + _kme = [[KMEngine alloc] initWithKMX:nil context:self.contextBuffer]; } return _kme; @@ -42,10 +42,6 @@ [self.kme setCoreContextIfNeeded:self.contextBuffer]; } -- (BOOL)debugMode { - return YES; -} - -(NSEvent *)keyStrokeEventForCharacter:(NSString *)character keyCode:(unsigned short) keyCode { return [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSZeroPoint modifierFlags:0 timestamp:NSTimeIntervalSince1970 windowNumber:0 context:nil characters:character charactersIgnoringModifiers:character isARepeat:NO keyCode:keyCode]; } diff --git a/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreHelper.h b/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreHelper.h index 0345ea6f31..ba3e5031f3 100644 --- a/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreHelper.h +++ b/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreHelper.h @@ -16,13 +16,10 @@ extern UInt32 VirtualKeyMap[0x80]; @interface CoreHelper : NSObject -@property (assign, nonatomic) BOOL debugMode; - -(unichar const *) createUnicharStringFromNSString:(NSString *)string; -(NSString *) createNSStringFromUnicharString:(unichar const *)string; -(unsigned long long) unicharStringLength:(unichar const *)string; --(instancetype)initWithDebugMode:(BOOL)debugMode; -(unsigned short) macVirtualKeyToWindowsVirtualKey:(unsigned short) keyCode; -(UTF32Char)macToKeymanModifier:(NSEventModifierFlags)modifiers; -(NSString*)utf32ValueToString:(UTF32Char)scalarValue; diff --git a/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreHelper.m b/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreHelper.m index 46ddbdeeb1..c7858e7b0d 100644 --- a/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreHelper.m +++ b/mac/KeymanEngine4Mac/KeymanEngine4Mac/CoreWrapper/CoreHelper.m @@ -69,10 +69,9 @@ UInt32 VirtualKeyMap[VIRTUAL_KEY_ARRAY_SIZE]; return length; } --(instancetype)initWithDebugMode:(BOOL)debugMode { +-(instancetype)init { self = [super init]; if (self) { - _debugMode = debugMode; [self initVirtualKeyMapping]; } return self; diff --git a/mac/KeymanEngine4Mac/KeymanEngine4Mac/KME/KMEngine.h b/mac/KeymanEngine4Mac/KeymanEngine4Mac/KME/KMEngine.h index c79b02ba32..523415fd26 100644 --- a/mac/KeymanEngine4Mac/KeymanEngine4Mac/KME/KMEngine.h +++ b/mac/KeymanEngine4Mac/KeymanEngine4Mac/KME/KMEngine.h @@ -18,16 +18,14 @@ @interface KMEngine : NSObject @property (weak, nonatomic) KMXFile *kmx; -@property (assign, nonatomic) BOOL debugMode; -- (id)initWithKMX:(KMXFile *)kmx context:(NSString *)ctxBuf verboseLogging:(BOOL)enableDebugLogging; +- (id)initWithKMX:(KMXFile *)kmx context:(NSString *)ctxBuf; - (NSString *)getCoreContextDebug; - (void)clearCoreContext; - (void)setCoreContextIfNeeded:(NSString *)context; - (void)setCoreOptions:(NSString *)key withValue:(NSString *)value; - (CoreKeyOutput *)processEvent:(NSEvent *)event; -- (void)setUseVerboseLogging:(BOOL)useVerboseLogging; @end diff --git a/mac/KeymanEngine4Mac/KeymanEngine4Mac/KME/KMEngine.m b/mac/KeymanEngine4Mac/KeymanEngine4Mac/KME/KMEngine.m index dd2b3247ed..4578472b6c 100644 --- a/mac/KeymanEngine4Mac/KeymanEngine4Mac/KME/KMEngine.m +++ b/mac/KeymanEngine4Mac/KeymanEngine4Mac/KME/KMEngine.m @@ -25,16 +25,11 @@ @implementation KMEngine -NSMutableString* _easterEggForSentry = nil; -const NSString* kEasterEggText = @"Sentrycrash#KME"; -const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx"; - -- (id)initWithKMX:(KMXFile *)kmx context:(NSString *)contextString verboseLogging:(BOOL)enableDebugLogging { +- (id)initWithKMX:(KMXFile *)kmx context:(NSString *)contextString { self = [super init]; if (self) { - self.debugMode = enableDebugLogging; _kmx = kmx; - _coreHelper = [[CoreHelper alloc] initWithDebugMode:enableDebugLogging]; + _coreHelper = [[CoreHelper alloc] init]; if (kmx) { [self loadCoreWrapperFromKmxFile:self.kmx.filePath]; @@ -63,31 +58,6 @@ const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx"; } } -- (void)setUseVerboseLogging:(BOOL)useVerboseLogging { - self.debugMode = useVerboseLogging; - - if (self.coreHelper) { - self.coreHelper.debugMode = useVerboseLogging; - } - - if (useVerboseLogging) { - os_log_debug([KMELogs testLog], "KMEngine - Turning verbose logging on"); - // In Keyman Engine if "debugMode" is turned on (explicitly) with "English plus Spanish" as the current keyboard and you type "Sentrycrash#KME", - // it will force a simulated crash to test reporting to sentry.keyman.com. - NSString * kmxName = [[_kmx filePath] lastPathComponent]; - os_log_debug([KMELogs testLog], "Sentry - KME: _kmx name = %{public}@", kmxName); - if ([kEasterEggKmxName isEqualToString:kmxName]) { - os_log_debug([KMELogs testLog], "Sentry - KME: Preparing to detect Easter egg."); - _easterEggForSentry = [[NSMutableString alloc] init]; - } - else - _easterEggForSentry = nil; - } - else { - os_log_debug([KMELogs testLog], "KMEngine - Turning verbose logging off"); - } -} - - (NSString *)getCoreContextDebug { return self.coreWrapper.contextDebug; } @@ -115,43 +85,6 @@ const NSString* kEasterEggKmxName = @"EnglishSpanish.kmx"; return [self.coreWrapper processEvent:event]; } -- (void) processPossibleEasterEggCharacterFrom:(NSString *)characters { - NSUInteger len = [_easterEggForSentry length]; - os_log_debug([KMELogs keyLog], "Sentry - KME: Processing character(s): %{public}@", characters); - if ([characters length] == 1 && [characters characterAtIndex:0] == [kEasterEggText characterAtIndex:len]) { - NSString *characterToAdd = [kEasterEggText substringWithRange:NSMakeRange(len, 1)]; - os_log_debug([KMELogs keyLog], "Sentry - KME: Adding character to Easter Egg code string: %{public}@", characterToAdd); - [_easterEggForSentry appendString:characterToAdd]; - if ([kEasterEggText isEqualToString:_easterEggForSentry]) { - os_log_debug([KMELogs keyLog], "Sentry - KME: Forcing crash now!"); - // Both of the following approaches do throw an exception that causes control to exit this method, - // but at least in my debug builds locally, neither one seems to get picked up by Sentry in a - // way that results in a new report on sentry.keyman.com - -#ifndef USE_ALERT_SHOW_HELP_TO_FORCE_EASTER_EGG_CRASH_FROM_ENGINE - //#1 - @throw ([NSException exceptionWithName:@"SentryForce" reason:@"Easter egg hit" userInfo:nil]); - - //#2 - // NSDecimalNumber *i = [NSDecimalNumber decimalNumberWithDecimal:[@(1) decimalValue]]; - // NSDecimalNumber *o = [NSDecimalNumber decimalNumberWithDecimal:[@(0) decimalValue]]; - // // Divide by 0 to throw an exception - // NSDecimalNumber *x = [i decimalNumberByDividingBy:o]; - -#else - //#3 The following DOES work, but it's really lame because the crash actually gets forced in the IM - // via this bogus call to a protocol method implemented in the IM's App Delegate just for the - // purpose of enabling the engine to force a crash. - [(NSObject *)[NSApp delegate] alertShowHelp:[NSAlert alertWithMessageText:@"Forcing an error" defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:@"Forcing an Easter egg error from KME!"]]; -#endif - } - } - else if (len > 0) { - os_log_debug([KMELogs keyLog], "Sentry - KME: Clearing Easter Egg code string."); - [_easterEggForSentry setString:@""]; - } -} - - (NSString *)getCharsFromKeyCode:(UInt16)keyCode { TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardLayoutInputSource(); CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData); diff --git a/mac/KeymanEngine4Mac/KeymanEngine4MacTests/CoreTestStaticHelperMethods.m b/mac/KeymanEngine4Mac/KeymanEngine4MacTests/CoreTestStaticHelperMethods.m index 0f0aaf8a83..9954f4e01d 100644 --- a/mac/KeymanEngine4Mac/KeymanEngine4MacTests/CoreTestStaticHelperMethods.m +++ b/mac/KeymanEngine4Mac/KeymanEngine4MacTests/CoreTestStaticHelperMethods.m @@ -16,7 +16,7 @@ + (CoreHelper *)helper { static CoreHelper *coreHelper = nil; if (coreHelper == nil) { - coreHelper = [[CoreHelper alloc] initWithDebugMode:YES]; + coreHelper = [[CoreHelper alloc] init]; } return coreHelper; } diff --git a/mac/KeymanEngine4Mac/KeymanEngine4MacTests/KMEngineTests.m b/mac/KeymanEngine4Mac/KeymanEngine4MacTests/KMEngineTests.m index 290f30f302..2ebe487f8c 100644 --- a/mac/KeymanEngine4Mac/KeymanEngine4MacTests/KMEngineTests.m +++ b/mac/KeymanEngine4Mac/KeymanEngine4MacTests/KMEngineTests.m @@ -32,7 +32,7 @@ NSString * names[nCombinations]; } - (void)testinitWithKMX_NilKmx_ProcessEventReturnsNil { - KMEngine *engine = [[KMEngine alloc] initWithKMX:nil context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:nil context:@""]; NSEvent *event = [[NSEvent alloc] init]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output == nil, @"Expected processEvent to return nil for nil kmx"); @@ -40,7 +40,7 @@ NSString * names[nCombinations]; - (void)testinitWithKMX_ValidKmxEmptyContext_InitializedWithEmptyContext { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; XCTAssert(engine != nil, @"Expected non-nil engine"); // Note: relying on km_core_state_context_debug output format is just barely // acceptable for a unit test @@ -49,7 +49,7 @@ NSString * names[nCombinations]; - (void)testinitWithKMX_ValidKmxNonEmptyContext_InitializedWithContext { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"abc" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"abc"]; XCTAssert(engine != nil, @"Expected non-nil engine"); // Note: relying on km_core_state_context_debug output format is just barely // acceptable for a unit test @@ -58,7 +58,7 @@ NSString * names[nCombinations]; - (void)testsetCoreContextIfNeeded_NonEmptyContext_InitialContextUpdated { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"a" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"a"]; [engine setCoreContextIfNeeded:@"xyz"]; // Note: relying on km_core_state_context_debug output format is just barely // acceptable for a unit test @@ -69,7 +69,7 @@ NSString * names[nCombinations]; /* - (void)testsetCoreContextIfNeeded_EmptyContext_InitialContextUpdated { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; [engine setCoreContextIfNeeded:@"xyz"]; // Note: relying on km_core_state_context_debug output format is just barely // acceptable for a unit test @@ -79,7 +79,7 @@ NSString * names[nCombinations]; - (void)testprocessEvent_eventForCommandKey_ReturnsNilOutput { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:NSEventModifierFlagCommand timestamp:0 windowNumber:0 context:nil characters:@"a" charactersIgnoringModifiers:@"a" isARepeat:NO keyCode:kVK_ANSI_A]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output == nil, @"expected nil output from core"); @@ -87,7 +87,7 @@ NSString * names[nCombinations]; - (void)testprocessEvent_eventWithoutKeycode_ReturnsNilOutput { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSEvent *event = [NSEvent mouseEventWithType:NSEventTypeMouseMoved location:NSMakePoint(29, 21) modifierFlags:NSEventModifierFlagShift timestamp:0 windowNumber:0 context:nil eventNumber:23 clickCount:0 pressure:0]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output == nil, @"nil CoreKeyOutput"); @@ -96,7 +96,7 @@ NSString * names[nCombinations]; // TODO: shouldn't this return emitKeystroke = YES? - (void)testprocessEvent_eventForUnmappedKey_ReturnsNoActions { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"z" charactersIgnoringModifiers:@"z" isARepeat:NO keyCode:kVK_ANSI_Z]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output == nil, @"Expected nil array of actions"); @@ -104,7 +104,7 @@ NSString * names[nCombinations]; - (void)testprocessEvent_eventForLowercaseA_ReturnsCharacterActionWithExpectedCharacterBasedOnKmx { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"a" charactersIgnoringModifiers:@"a" isARepeat:NO keyCode:kVK_ANSI_A]; CoreKeyOutput *output = [engine processEvent:event]; os_log_debug([KMELogs testLog], "output = %{public}@", output); @@ -116,7 +116,7 @@ NSString * names[nCombinations]; /* -(void)testprocessEvent_eventForCtrlShiftNumeralWithCipherMusicKmx_ReturnsQstrActionForCorrectUnicodeSurrogatePair { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForCipherMusicTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile contextBuffer:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile contextBuffer:@""]; for (int i = 1; i <= 6; i++) { unsigned short ansiCode = kVK_ANSI_1 + i - 1; @@ -152,7 +152,7 @@ NSString * names[nCombinations]; - (void)testprocessEvent_eventsForOpenCurlyBraceWithCipherMusicKmx_ReturnsCharacterForStartSlide { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForCipherMusicTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; UTF32Char expectedUtf32Char = 0x1D177; NSString * expectedStartSlideSurrogatePair = [[NSString alloc] initWithBytes:&expectedUtf32Char length:4 encoding:NSUTF32LittleEndianStringEncoding]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:NSEventModifierFlagShift timestamp:0 windowNumber:0 context:nil characters:@"{" charactersIgnoringModifiers:@"[" isARepeat:NO keyCode:kVK_ANSI_LeftBracket]; @@ -165,7 +165,7 @@ NSString * names[nCombinations]; // TODO: fails with core, investigate - (void)testprocessEvent_eventForUnshiftedNumeralWithCipherMusicKmx_ReturnsCharacterActionToInsertNumeral { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForCipherMusicTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile contextBuffer:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile contextBuffer:@""]; for (int i = 1; i <= 9; i++) { unsigned short ansiCode = kVK_ANSI_1 + i - 1; @@ -185,7 +185,7 @@ NSString * names[nCombinations]; // TODO: fails with core, returns CharacterAction - (void)testprocessEvent_eventForShiftNumeralsWithoutRulesInCipherMusicKmx_ReturnsNoAction { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForCipherMusicTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; for (int i = 0; i <= 9; i++) { if (i == 6) @@ -228,7 +228,7 @@ NSString * names[nCombinations]; // TODO: fails with core, returns CharacterAction - (void)testprocessEvent_eventForPeriodWithCipherMusicKmx_ReturnsNoAction { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForCipherMusicTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"." charactersIgnoringModifiers:@"." isARepeat:NO keyCode:kVK_ANSI_Period]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(!output.hasTextToInsert, @"expected no text to insert"); @@ -236,7 +236,7 @@ NSString * names[nCombinations]; - (void)testprocessEvent_eventForCtrl8WithCipherMusicKmx_ReturnsEmit { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForCipherMusicTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:NSEventModifierFlagControl timestamp:0 windowNumber:0 context:nil characters:@"8" charactersIgnoringModifiers:@"8" isARepeat:NO keyCode:kVK_ANSI_8]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output.emitKeystroke, @"emitKeystroke == YES"); @@ -279,7 +279,7 @@ NSString * names[nCombinations]; [KMEngineTests fillInNamesAndModifiersForAllChiralCombinations]; KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; for (i = 0; i < nCombinations; i++) { [engine clearCoreContext]; @@ -346,7 +346,7 @@ NSString * names[nCombinations]; [KMEngineTests fillInNamesAndModifiersForAllChiralCombinations]; KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileTestMacEngine]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; for (i = 0; i < nCombinations; i++) { [engine clearCoreContext]; @@ -419,7 +419,7 @@ NSString * names[nCombinations]; - (NSString *)checkPlatform_getOutputForKeystroke: (NSString*) character modifierFlags: (NSEventModifierFlags) flag keyCode:(unsigned short)code { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForPlatformTest]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSString *lcChar = [character lowercaseString]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:flag timestamp:0 windowNumber:0 context:nil characters:character charactersIgnoringModifiers:lcChar isARepeat:NO keyCode:code]; CoreKeyOutput *output = [engine processEvent:event]; @@ -516,7 +516,7 @@ NSString * names[nCombinations]; - (void)testEngine_ipaKeyboardAction_DoesNotCrash_Issue1892 { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForIndexOffsetTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"z" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"z"]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"a" charactersIgnoringModifiers:@"a" isARepeat:NO keyCode:kVK_ANSI_A]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output.hasCodePointsToDelete, @"output hasCodePointsToDelete == YES"); @@ -525,7 +525,7 @@ NSString * names[nCombinations]; - (void)testCoreProcessEvent_eventForFWithElNuerKmx_ReturnsCorrectCharacter { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForElNuerTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"f" charactersIgnoringModifiers:@"f" isARepeat:NO keyCode:kVK_ANSI_F]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert([output.textToInsert isEqualToString:@"ɣ"], @"Expected output to be 'ɣ'."); @@ -535,7 +535,7 @@ NSString * names[nCombinations]; - (void)testArmenianMnemonic_triggerPersistOptions_ReturnsOptions { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForArmenianMnemonicTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"√" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"√"]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"w" charactersIgnoringModifiers:@"w" isARepeat:NO keyCode:kVK_ANSI_W]; CoreKeyOutput *output = [engine processEvent:event]; NSString *key = @"option_ligature_ew"; @@ -546,7 +546,7 @@ NSString * names[nCombinations]; - (void)testCoreProcessEvent_backspaceElNuerEmptyContext_PassesThrough { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForElNuerTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@""]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"\b" charactersIgnoringModifiers:@"\b" isARepeat:NO keyCode:kVK_Delete]; CoreKeyOutput *output = [engine processEvent:event]; os_log_debug([KMELogs testLog], "output = %{public}@", output); @@ -557,7 +557,7 @@ NSString * names[nCombinations]; - (void)testCoreProcessEvent_backspaceElNuerWithContext_EmptiesContextReturnsDelete { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForElNuerTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"ɣ" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"ɣ"]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"\b" charactersIgnoringModifiers:@"\b" isARepeat:NO keyCode:kVK_Delete]; CoreKeyOutput *output = [engine processEvent:event]; os_log_debug([KMELogs testLog], "output = %{public}@", output); @@ -571,7 +571,7 @@ NSString * names[nCombinations]; - (void)testCoreProcessEvent_eventReturnWithElNuerKmx_EmitWithContextEmpty { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForElNuerTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"ɣ" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"ɣ"]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"\n" charactersIgnoringModifiers:@"\n" isARepeat:NO keyCode:kVK_Return]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output.emitKeystroke, @"Expected emitKeystroke==YES"); @@ -583,7 +583,7 @@ NSString * names[nCombinations]; - (void)testCoreProcessEvent_eventTabWithElNuerKmx_EmitWithContextEmpty { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForElNuerTests]; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"ɣ" verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:@"ɣ"]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"\t" charactersIgnoringModifiers:@"\t" isARepeat:NO keyCode:kVK_Tab]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output.emitKeystroke, @"Expected emitKeystroke==YES"); @@ -596,7 +596,7 @@ NSString * names[nCombinations]; - (void)testCoreProcessEvent_eventSingleQuoteWithElNuerKmx_ReturnsDiacritic { KMXFile *kmxFile = [KeymanEngineTestsStaticHelperMethods getKmxFileForElNuerTests]; NSString *context = @"ɛ"; - KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:context verboseLogging:YES]; + KMEngine *engine = [[KMEngine alloc] initWithKMX:kmxFile context:context]; NSEvent *event = [NSEvent keyEventWithType:NSEventTypeKeyDown location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0 windowNumber:0 context:nil characters:@"'" charactersIgnoringModifiers:@"'" isARepeat:NO keyCode:kVK_ANSI_Quote]; CoreKeyOutput *output = [engine processEvent:event]; XCTAssert(output.hasTextToInsert, @"returns text to insert"); From 96f6654a900bf75565c061d610b4c9bdbf6aa4d1 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 17 Sep 2024 16:06:59 +0700 Subject: [PATCH 12/28] chore(developer): remove .js output from LDML compiler --- developer/src/kmc-ldml/src/compiler/compiler.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/developer/src/kmc-ldml/src/compiler/compiler.ts b/developer/src/kmc-ldml/src/compiler/compiler.ts index cbaf2cad37..388a64de69 100644 --- a/developer/src/kmc-ldml/src/compiler/compiler.ts +++ b/developer/src/kmc-ldml/src/compiler/compiler.ts @@ -30,7 +30,6 @@ import { KmnCompiler } from '@keymanapp/kmc-kmn'; import { KMXPlusMetadataCompiler } from './metadata-compiler.js'; import { LdmlKeyboardVisualKeyboardCompiler } from './visual-keyboard-compiler.js'; import { LinterKeycaps } from './linter-keycaps.js'; -//KMW17.0: import { LdmlKeyboardKeymanWebCompiler } from './keymanweb-compiler.js'; export const SECTION_COMPILERS = [ // These are in dependency order. @@ -73,11 +72,6 @@ export interface LdmlKeyboardCompilerArtifacts extends KeymanCompilerArtifacts { * desktop projects alongside .kmx */ kvk?: KeymanCompilerArtifactOptional; - /** - * Javascript keyboard filedata and filename - installable into KeymanWeb, - * Keyman mobile products - */ - js?: KeymanCompilerArtifactOptional; }; export interface LdmlKeyboardCompilerResult extends KeymanCompilerResult { @@ -90,7 +84,7 @@ export interface LdmlKeyboardCompilerResult extends KeymanCompilerResult { /** * @public - * Compiles a LDML keyboard .xml file to a .kmx (KMXPlus), .kvk, and/or .js. The + * Compiles a LDML keyboard .xml file to a .kmx (KMXPlus), .kvk. The * compiler does not read or write from filesystem or network directly, but * relies on callbacks for all external IO. */ @@ -116,7 +110,7 @@ export class LdmlKeyboardCompiler implements KeymanCompiler { } /** - * Compiles a LDML keyboard .xml file to .kmx, .kvk, and/or .js files. Returns + * Compiles a LDML keyboard .xml file to .kmx, .kvk files. Returns * an object containing binary artifacts on success. The files are passed in * by name, and the compiler will use callbacks as passed to the * {@link LdmlKeyboardCompiler.init} function to read any input files by disk. @@ -186,7 +180,6 @@ export class LdmlKeyboardCompiler implements KeymanCompiler { artifacts: { kmx: { data: kmxBinary, filename: outputFilename }, kvk: kvkBinary ? { data: kvkBinary, filename: outputFilename.replace(/\.kmx$/, '.kvk') } : null, - //KMW17.0: js: { data: kmw_binary, filename: outputFilename.replace(/\.kmx$/, '.js') }, } }; } @@ -197,7 +190,6 @@ export class LdmlKeyboardCompiler implements KeymanCompiler { * * - .kmx file - binary keyboard used by Keyman on desktop platforms * - .kvk file - binary on screen keyboard used by Keyman on desktop platforms - * - .js file - Javascript keyboard for web and touch platforms * * @param artifacts - object containing artifact binary data to write out * @returns true on success @@ -211,10 +203,6 @@ export class LdmlKeyboardCompiler implements KeymanCompiler { this.callbacks.fs.writeFileSync(artifacts.kvk.filename, artifacts.kvk.data); } - if (artifacts.js) { - this.callbacks.fs.writeFileSync(artifacts.js.filename, artifacts.js.data); - } - return true; } From 44116b70ddd81e5486ed26b5aea67940fb927949 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 17 Sep 2024 11:38:41 +0200 Subject: [PATCH 13/28] chore(common): detect ssh remotes in git hooks Sometime ago we lost the ability to detect git remotes that use ssh (git@github.com:keymanapp/keyman.git) and we only detect remotes that use https (https://github.com/keymanapp/keyman.git). This change restores this ability. Also add some empty lines between the different parts of the error message. # Keyman Conventional Commit suggestions: # # - Link to a Sentry issue with git trailer: # Fixes: _MODULE_-_ID_ # - Give credit to co-authors: # Co-authored-by: _Name_ <_email_> # - Use imperative, present tense ('attach' not 'attaches', 'attached' etc) # - Don't include a period at the end of the title # - Always include a blank line before trailers # - More: https://github.com/keymanapp/keyman/wiki/Pull-Request-and-Commit-workflow-notes --- resources/git-hooks/commit-msg | 10 +++++++--- resources/git-hooks/pre-commit | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/resources/git-hooks/commit-msg b/resources/git-hooks/commit-msg index 427ad96b58..fcb4f26a04 100755 --- a/resources/git-hooks/commit-msg +++ b/resources/git-hooks/commit-msg @@ -51,7 +51,7 @@ fi GIT_ORIGIN="$(git remote get-url origin)" -if [[ ! "$GIT_ORIGIN" =~ github\.com/keymanapp ]]; then +if [[ ! "$GIT_ORIGIN" =~ github\.com(/|:)keymanapp ]]; then # Not a Keyman repository. We have no opinion. # echo "DEBUG: Not a Keyman repository. We don't care" exit 0 @@ -107,14 +107,18 @@ function print_error() { echo -e "----------------------------------------------------------${t_end}" echo -e "Valid types: ${t_grn}${types[@]}${t_end}" echo -e "Valid scopes: ${t_grn}${scopes[@]}${t_end}" - echo -e "Max length (first line): ${t_grn}$max_length${t_end}" + echo -e "" echo -e "Min length (first line): ${t_grn}$min_length${t_end}" + echo -e "Max length (first line): ${t_grn}$max_length${t_end}" + echo -e "" echo -e "If possible, append git trailers:" echo -e " * ${t_grn}Fixes: #1234${t_end}" echo -e " * ${t_grn}Fixes: KEYMAN-MODULE-XYZ${t_end}" echo -e " * ${t_grn}Cherry-pick-of: #2468${t_end}" echo -e " * ${t_grn}Co-authored-by: Firstname Lastname ${t_end}" + echo -e "" echo -e "${t_cyn}Example:${t_end} fix(windows): Re-attach the widget plug which had fallen out" + echo -e "" echo -e "${t_cyn}Reference${t_end}: https://github.com/keymanapp/keyman/wiki/Pull-Request-and-Commit-workflow-notes" echo -e "" echo -e "Tips: " @@ -136,4 +140,4 @@ if [[ ! $msg =~ $regexp ]]; then print_error fi exit 1 -fi \ No newline at end of file +fi diff --git a/resources/git-hooks/pre-commit b/resources/git-hooks/pre-commit index db7ba3cf30..df165feaec 100755 --- a/resources/git-hooks/pre-commit +++ b/resources/git-hooks/pre-commit @@ -6,7 +6,7 @@ GIT_ORIGIN="$(git remote get-url origin)" -if [[ ! "$GIT_ORIGIN" =~ github\.com/keymanapp ]]; then +if [[ ! "$GIT_ORIGIN" =~ github\.com(/|:)keymanapp ]]; then # Not a Keyman repository. We have no opinion. echo "DEBUG: Not a Keyman repository. We don't care" exit 0 From 17912a5429856613bbecbd14bd91b5bdb22caf6f Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 17 Sep 2024 11:52:52 +0200 Subject: [PATCH 14/28] fix(common): add proper configure output for hextobin This change fixes a dependency problem when building Core. Previously this failed on a clean source tree because hextobin was missing dependencies but didn't run its `configure` action if the top-level `node_modules` folder did already exist. --- common/tools/hextobin/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/tools/hextobin/build.sh b/common/tools/hextobin/build.sh index c1e2338e9d..9e73f8c410 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 /node_modules \ + configure /common/tools/hextobin/node_modules/commander \ build /common/tools/hextobin/build/index.js builder_parse "$@" From 0dbae5c199bd537487402c4d719af3b653c2f74c Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 17 Sep 2024 18:28:02 +0200 Subject: [PATCH 15/28] fix(core): add missing dependency for core Core depends on `kmc` which in turn depends on `core/include/ldml`. This change adds the missing dependency to the build script and fixes building core from a clean `core` subdirectory. # Keyman Conventional Commit suggestions: # # - Link to a Sentry issue with git trailer: # Fixes: _MODULE_-_ID_ # - Give credit to co-authors: # Co-authored-by: _Name_ <_email_> # - Use imperative, present tense ('attach' not 'attaches', 'attached' etc) # - Don't include a period at the end of the title # - Always include a blank line before trailers # - More: https://github.com/keymanapp/keyman/wiki/Pull-Request-and-Commit-workflow-notes --- developer/src/kmc/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/developer/src/kmc/build.sh b/developer/src/kmc/build.sh index a3bf11774a..a39808a546 100755 --- a/developer/src/kmc/build.sh +++ b/developer/src/kmc/build.sh @@ -16,6 +16,7 @@ builder_describe "Build Keyman Keyboard Compiler kmc" \ "@/common/include" \ "@/common/web/keyman-version" \ "@/common/web/types" \ + "@/core/include/ldml" \ "@/developer/src/common/web/utils" \ "@/developer/src/kmc-analyze" \ "@/developer/src/kmc-keyboard-info" \ From 389fb4f9ee35b20b08cd3553b5dd5de2b6a4169c Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Mon, 16 Sep 2024 16:16:47 +0200 Subject: [PATCH 16/28] chore(common): Allow to build offline A lot of the `configure` actions rely on node dependencies and so call `npm install`. Without a internet connection this hangs forever, even if you had successfully installed the dependencies before and nothing changed since then. This change adds a `--offline` parameter that passes `--prefer-offline` to npm, which causes npm to use the cached dependencies. Also sets the `MESON_PACKAGE_CACHE_DIR` environment variable so that all (sub-)projects share the same package cache dir. This will speed up regular builds a bit (e.g. `developer/src/kmcmplib` and `core` both have `icu4c` as a dependency), but will also help with offline builds. `MESON_PACKAGE_CACHE_DIR` requires Meson 1.3, however older Meson versions ignore this environment variable and simply continue to use a cache per subproject, so will continue to work (minus offline builds). --- resources/build/builder.md | 2 ++ resources/builder.inc.sh | 25 +++++++++++++++++++++++++ resources/shellHelperFunctions.sh | 7 ++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/resources/build/builder.md b/resources/build/builder.md index 0e3ef901f7..dd52318810 100644 --- a/resources/build/builder.md +++ b/resources/build/builder.md @@ -327,6 +327,8 @@ The following parameters are pre-defined and should not be overridden: * `--no-color`: forces off ANSI color output for the script * `--verbose`, `-v`: verbose mode, sets the [`$builder_verbose`] variable * `--debug`, `-d`: debug build; see [`builder_is_debug_build`] for more detail +* `--offline`: allow to build while offline. This might fail if not all + dependencies are cached. -------------------------------------------------------------------------------- diff --git a/resources/builder.inc.sh b/resources/builder.inc.sh index b233614029..c4cf586f42 100755 --- a/resources/builder.inc.sh +++ b/resources/builder.inc.sh @@ -40,6 +40,12 @@ function _builder_init() { else builder_use_color false fi + + # Set shared Meson package cache (works with Meson >= 1.3) + if [[ -z ${MESON_PACKAGE_CACHE_DIR:-} ]]; then + export MESON_PACKAGE_CACHE_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/keyman/builder" + mkdir -p "${MESON_PACKAGE_CACHE_DIR}" + fi } function _builder_findRepoRoot() { @@ -416,6 +422,7 @@ _builder_execute_child() { ${child_options[@]} \ $builder_verbose \ $builder_debug \ + $_builder_offline \ && ( if $_builder_debug_internal; then builder_echo success "## $action$target completed successfully" @@ -1267,6 +1274,7 @@ _builder_parse_expanded_parameters() { _builder_chosen_options=() _builder_current_action= _builder_is_child=1 + _builder_offline= local n=0 @@ -1399,6 +1407,9 @@ _builder_parse_expanded_parameters() { # internal reporting function, ignores all other parameters _builder_report_dependencies ;; + --offline) + _builder_offline=--offline + ;; *) # script does not recognize anything of action or target form at this point. if [[ $key =~ ^: ]]; then @@ -1565,6 +1576,7 @@ builder_display_usage() { _builder_pad $width " --debug, -d" "Debug build" _builder_pad $width " --color" "Force colorized output" _builder_pad $width " --no-color" "Never use colorized output" + _builder_pad $width " --offline" "Try to build while being offline" if builder_has_dependencies; then _builder_pad $width " --deps" "Build dependencies if required (default)" _builder_pad $width " --no-deps" "Skip build of dependencies" @@ -1731,6 +1743,7 @@ _builder_do_build_deps() { "$REPO_ROOT/$dep/build.sh" "configure$dep_target" "build$dep_target" \ $builder_verbose \ $builder_debug \ + $_builder_offline \ $_builder_build_deps \ --builder-dep-parent "$THIS_SCRIPT_IDENTIFIER" && ( if $_builder_debug_internal; then @@ -1761,6 +1774,18 @@ builder_is_child_build() { return $_builder_is_child } +# +# return `1` for a regular build, `0` to try to build while being offline. +# The offline build might fail if not all dependencies are cached. +# +builder_try_offline() { + if [[ "${_builder_offline}" == "--offline" ]]; then + return 0 + else + return 1 + fi +} + # # returns `0` if we should attempt to do quick builds in a dependency build, for # example skipping `tsc -b` where a parent may also do it; corresponds to the diff --git a/resources/shellHelperFunctions.sh b/resources/shellHelperFunctions.sh index 7ded208d44..a3f419382e 100755 --- a/resources/shellHelperFunctions.sh +++ b/resources/shellHelperFunctions.sh @@ -267,7 +267,12 @@ verify_npm_setup() { pushd "$KEYMAN_ROOT" > /dev/null - try_multiple_times npm ci + offline_param= + if builder_try_offline; then + builder_echo "Trying offline build" + offline_param=--prefer-offline + fi + try_multiple_times npm ${offline_param} ci popd > /dev/null } From 7f7bbd4f7463a21b37705988ea848c1a522fb219 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Thu, 19 Sep 2024 08:49:21 +0700 Subject: [PATCH 17/28] change(mac): fix sample app build error --- mac/Keyman4Mac/Keyman4Mac/AppDelegate.m | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/mac/Keyman4Mac/Keyman4Mac/AppDelegate.m b/mac/Keyman4Mac/Keyman4Mac/AppDelegate.m index 3ffb9129cf..f6bf6c81fe 100644 --- a/mac/Keyman4Mac/Keyman4Mac/AppDelegate.m +++ b/mac/Keyman4Mac/Keyman4Mac/AppDelegate.m @@ -45,8 +45,6 @@ NSString *const kKMXFileKey = @"KMXFile"; NSArray *kvkFiles = [self KVKFiles]; for (NSString *path in kvkFiles){ KVKFile *kvkFile = [[KVKFile alloc] initWithFilePath:path]; - if (debugMode) - NSLog(@"%@", kvkFile); }*/ } @@ -225,18 +223,6 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef NSLog(@"%d: %@", index, kmStore); index++; } - - for (NSObject *gp in kmx.group) { - if (debugMode) { - NSLog(@"Group %@", gp); - //NSLog(@"match = %@", gp.match); - //NSLog(@"nomatch = %@", gp.noMatch); - /* - for (KMCompKey *kmKey in gp.keys) { - NSLog(@"\nKey: %@", kmKey); - }*/ - } - } } } @@ -257,9 +243,6 @@ CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef if (!infoDict) continue; - //if (debugMode) - // NSLog(@"%@", infoDict); - //NSString *str = [NSString stringWithFormat:@"%@ (%@)", [infoDict objectForKey:kKMKeyboardNameKey], [infoDict objectForKey:kKMKeyboardVersionKey]]; NSString *str = [infoDict objectForKey:kKMKeyboardNameKey]; [kmxDesc addObject:str]; } From 7bd7d63c3bf22017a3881c4b99e4ad11d26d9a2c Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Thu, 19 Sep 2024 14:02:51 -0400 Subject: [PATCH 18/28] auto: increment master version to 18.0.116 --- HISTORY.md | 7 +++++++ VERSION.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 85a383c575..ddfcf2a3e8 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ # Keyman Version History +## 18.0.115 alpha 2024-09-19 + +* chore(common): detect ssh remotes in git hooks (#12437) +* fix(common): add proper configure output for hextobin (#12440) +* fix(core): add missing dependency for core (#12438) +* chore(developer): remove .js output from LDML compiler (#12432) + ## 18.0.114 alpha 2024-09-17 * fix(developer): rewrite ldml visual keyboard compiler (#12402) diff --git a/VERSION.md b/VERSION.md index 641f895ef1..fec92933d4 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.115 \ No newline at end of file +18.0.116 \ No newline at end of file From 0a5b185e82b5216ff0d49208cb77e10457da763e Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Fri, 20 Sep 2024 10:25:07 +0700 Subject: [PATCH 19/28] docs(common): Document how to skip generating CDN on websites --- docs/websites/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/websites/README.md b/docs/websites/README.md index 5fc84ffa59..62fc3f7388 100644 --- a/docs/websites/README.md +++ b/docs/websites/README.md @@ -53,6 +53,8 @@ This maps the local directory to the the Docker image. For sites that use Composer dependencies, this step also creates a link in the Docker image from /var/www/vendor/ to /var/www/html/vendor. The link file also appears locally. +Some sites have assets in `/cdn/dev/` used to generate CDN in `/dev/deploy/`. To avoid confusion during development, you can skip generating CDN with `./build.sh start --debug`. + ##### Port lookup table After this, you can access the website at the following ports: From 06896a9e4a1aba765c005e1130f705d8df342d97 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Fri, 20 Sep 2024 14:02:43 -0400 Subject: [PATCH 20/28] auto: increment master version to 18.0.117 --- HISTORY.md | 5 +++++ VERSION.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index ddfcf2a3e8..a90ef32165 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,10 @@ # Keyman Version History +## 18.0.116 alpha 2024-09-20 + +* change(mac): remove verbose logging option (#12431) +* chore(common): Allow to build offline (#12439) + ## 18.0.115 alpha 2024-09-19 * chore(common): detect ssh remotes in git hooks (#12437) diff --git a/VERSION.md b/VERSION.md index fec92933d4..bfdd37b653 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.116 \ No newline at end of file +18.0.117 \ No newline at end of file From e35bb72a44ef022810c90dbabef559002a22ad09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:37:34 +0000 Subject: [PATCH 21/28] chore(deps-dev): bump rollup from 4.16.4 to 4.22.4 Bumps [rollup](https://github.com/rollup/rollup) from 4.16.4 to 4.22.4. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v4.16.4...v4.22.4) --- updated-dependencies: - dependency-name: rollup dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 134 +++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index 912bb6727f..7cbb8d2da2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3639,9 +3639,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", - "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -3652,9 +3652,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", - "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -3665,9 +3665,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", - "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -3678,9 +3678,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", - "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -3691,9 +3691,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", - "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -3704,9 +3704,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", - "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -3717,9 +3717,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", - "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -3730,9 +3730,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", - "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -3743,9 +3743,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", - "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -3756,9 +3756,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", - "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -3769,9 +3769,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", - "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -3782,9 +3782,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", - "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -3795,9 +3795,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", - "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -3808,9 +3808,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", - "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -3821,9 +3821,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", - "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -3834,9 +3834,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", - "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -12742,9 +12742,9 @@ } }, "node_modules/rollup": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", - "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -12757,22 +12757,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.16.4", - "@rollup/rollup-android-arm64": "4.16.4", - "@rollup/rollup-darwin-arm64": "4.16.4", - "@rollup/rollup-darwin-x64": "4.16.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", - "@rollup/rollup-linux-arm-musleabihf": "4.16.4", - "@rollup/rollup-linux-arm64-gnu": "4.16.4", - "@rollup/rollup-linux-arm64-musl": "4.16.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", - "@rollup/rollup-linux-riscv64-gnu": "4.16.4", - "@rollup/rollup-linux-s390x-gnu": "4.16.4", - "@rollup/rollup-linux-x64-gnu": "4.16.4", - "@rollup/rollup-linux-x64-musl": "4.16.4", - "@rollup/rollup-win32-arm64-msvc": "4.16.4", - "@rollup/rollup-win32-ia32-msvc": "4.16.4", - "@rollup/rollup-win32-x64-msvc": "4.16.4", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, From 2c3ae9eba794855068ecae5e0fc08daa99588ff0 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 24 Sep 2024 19:29:10 -0700 Subject: [PATCH 22/28] fix(developer): prevent invalid string ids Adds checks for invalid string IDs and corresponding unit tests. Fixes: #12451 --- .../src/compiler/ldml-compiler-messages.ts | 17 ++++++++++++---- developer/src/kmc-ldml/src/compiler/vars.ts | 20 +++++++++++++++++++ .../vars/fail-invalid-identifiers.xml | 17 ++++++++++++++++ developer/src/kmc-ldml/test/test-vars.ts | 10 ++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 developer/src/kmc-ldml/test/fixtures/sections/vars/fail-invalid-identifiers.xml diff --git a/developer/src/kmc-ldml/src/compiler/ldml-compiler-messages.ts b/developer/src/kmc-ldml/src/compiler/ldml-compiler-messages.ts index 1b6752bdee..901f4b0022 100644 --- a/developer/src/kmc-ldml/src/compiler/ldml-compiler-messages.ts +++ b/developer/src/kmc-ldml/src/compiler/ldml-compiler-messages.ts @@ -187,7 +187,13 @@ export class LdmlCompilerMessages { static Error_UnparseableReorderSet = (o: { from: string, set: string }) => m(this.ERROR_UnparseableReorderSet, `Illegal UnicodeSet "${def(o.set)}" in reorder "${def(o.from)}`); - // Available: 0x029 + static ERROR_InvalidVariableIdentifer = SevError | 0x0029; + static Error_InvalidVariableIdentifer = (o: { id: string }) => m( + this.ERROR_InvalidVariableIdentifer, + `Invalid variable identifier "\\u${def(o.id)}". Identifiers must be between 1 and 32 characters, and can use A-Z, a-z, 0-9, and _.`, + ); + + // Available: 0x02A-0x2F static ERROR_InvalidQuadEscape = SevError | 0x0030; static Error_InvalidQuadEscape = (o: { cp: number }) => @@ -202,9 +208,12 @@ export class LdmlCompilerMessages { m(this.ERROR_UnparseableTransformFrom, `Invalid transform from="${def(o.from)}": "${def(o.message)}"`); static ERROR_IllegalTransformDollarsign = SevErrorTransform | 0x01; - static Error_IllegalTransformDollarsign = (o: { from: string }) => - m(this.ERROR_IllegalTransformDollarsign, `Invalid transform from="${def(o.from)}": Unescaped dollar-sign ($) is not valid transform syntax.`, - '**Hint**: Use `\\$` to match a literal dollar-sign.'); + static Error_IllegalTransformDollarsign = (o: { from: string }) => m( + this.ERROR_IllegalTransformDollarsign, + `Invalid transform from="${def(o.from)}": Unescaped dollar-sign ($) is not valid transform syntax.`, + `**Hint**: Use \`\\$\` to match a literal dollar-sign. If this precedes a variable name, `+ + `the variable name may not be valid (A-Z, a-z, 0-9, _, 32 character maximum).` + ); static ERROR_TransformFromMatchesNothing = SevErrorTransform | 0x02; static Error_TransformFromMatchesNothing = (o: { from: string }) => diff --git a/developer/src/kmc-ldml/src/compiler/vars.ts b/developer/src/kmc-ldml/src/compiler/vars.ts index 39bc9304af..3fc39f0d01 100644 --- a/developer/src/kmc-ldml/src/compiler/vars.ts +++ b/developer/src/kmc-ldml/src/compiler/vars.ts @@ -40,6 +40,14 @@ export class VarsCompiler extends SectionCompiler { return valid; } + private validateIdentifier(id: string) { + if(!id.match(VariableParser.ID)) { // From DTD + this.callbacks.reportMessage(LdmlCompilerMessages.Error_InvalidVariableIdentifer({id})); + return false; + } + return true; + } + private validateVars(st: Substitutions): boolean { let valid = true; const variables = this.keyboard3?.variables; @@ -67,6 +75,10 @@ export class VarsCompiler extends SectionCompiler { if (variables) { // Strings for (const { id, value } of variables.string) { + if(!this.validateIdentifier(id)) { + valid = false; + continue; + } addId(id); const stringrefs = VariableParser.allStringReferences(value); for(const ref of stringrefs) { @@ -81,6 +93,10 @@ export class VarsCompiler extends SectionCompiler { } // Sets for (const { id, value } of variables.set) { + if(!this.validateIdentifier(id)) { + valid = false; + continue; + } addId(id); allSets.add(id); // check for illegal references, here. @@ -103,6 +119,10 @@ export class VarsCompiler extends SectionCompiler { } // UnicodeSets for (const { id, value } of variables.uset) { + if(!this.validateIdentifier(id)) { + valid = false; + continue; + } addId(id); allUnicodeSets.add(id); const stringrefs = VariableParser.allStringReferences(value); diff --git a/developer/src/kmc-ldml/test/fixtures/sections/vars/fail-invalid-identifiers.xml b/developer/src/kmc-ldml/test/fixtures/sections/vars/fail-invalid-identifiers.xml new file mode 100644 index 0000000000..880864fd4e --- /dev/null +++ b/developer/src/kmc-ldml/test/fixtures/sections/vars/fail-invalid-identifiers.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/developer/src/kmc-ldml/test/test-vars.ts b/developer/src/kmc-ldml/test/test-vars.ts index d513574ee8..8eef17af25 100644 --- a/developer/src/kmc-ldml/test/test-vars.ts +++ b/developer/src/kmc-ldml/test/test-vars.ts @@ -121,6 +121,16 @@ describe('vars', function () { LdmlCompilerMessages.Error_DuplicateVariable({ids: 'upper, y'}) ], }, + { + subpath: 'sections/vars/fail-invalid-identifiers.xml', + errors: [ + LdmlCompilerMessages.Error_InvalidVariableIdentifer({id: 'invalid-string'}), + LdmlCompilerMessages.Error_InvalidVariableIdentifer({id: 'invalid-set'}), + LdmlCompilerMessages.Error_InvalidVariableIdentifer({id: 'invalid-uset'}), + LdmlCompilerMessages.Error_InvalidVariableIdentifer({id: 'a_marker_name_more_than_32_chars_long'}), + LdmlCompilerMessages.Error_InvalidVariableIdentifer({id: '😡'}), + ], + }, { subpath: 'sections/vars/fail-uset-props1.xml', errors: [ From 71f3d912a415c661562da40c33356ed748663f9c Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 25 Sep 2024 07:33:42 -0700 Subject: [PATCH 23/28] fix(developer): ignore excess whitespace in `` attribute Fixes: #12449 --- developer/src/kmc-ldml/src/compiler/layr.ts | 2 +- .../sections/layr/row-keys-whitespace.xml | 18 +++++++++++++ developer/src/kmc-ldml/test/test-layr.ts | 25 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 developer/src/kmc-ldml/test/fixtures/sections/layr/row-keys-whitespace.xml diff --git a/developer/src/kmc-ldml/src/compiler/layr.ts b/developer/src/kmc-ldml/src/compiler/layr.ts index 62f8b3360d..6c945a1864 100644 --- a/developer/src/kmc-ldml/src/compiler/layr.ts +++ b/developer/src/kmc-ldml/src/compiler/layr.ts @@ -63,7 +63,7 @@ export class LayrCompiler extends SectionCompiler { for (const layer of layers.layer) { const rows = layer.row.map((row) => { const erow: LayrRow = { - keys: row.keys.split(' ').map((id) => sections.strs.allocString(id)), + keys: row.keys.trim().split(/[ \t]+/).map((id) => sections.strs.allocString(id)), }; return erow; }); diff --git a/developer/src/kmc-ldml/test/fixtures/sections/layr/row-keys-whitespace.xml b/developer/src/kmc-ldml/test/fixtures/sections/layr/row-keys-whitespace.xml new file mode 100644 index 0000000000..f8d1a629d5 --- /dev/null +++ b/developer/src/kmc-ldml/test/fixtures/sections/layr/row-keys-whitespace.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/developer/src/kmc-ldml/test/test-layr.ts b/developer/src/kmc-ldml/test/test-layr.ts index 3cf0701986..8aeb604171 100644 --- a/developer/src/kmc-ldml/test/test-layr.ts +++ b/developer/src/kmc-ldml/test/test-layr.ts @@ -135,5 +135,30 @@ describe('layr', function () { LdmlCompilerMessages.Error_InvalidModifier({ layer: '', modifiers: 'caps bogus'}), ] }, + { + subpath: 'sections/layr/row-keys-whitespace.xml', + callback(sect) { + const layr = sect; + assert.ok(layr); + assert.equal(compilerTestCallbacks.messages.length, 0); + + assert.equal(layr.lists?.length, 1); + const list0 = layr.lists[0]; + assert.ok(list0); + assert.equal(list0.layers.length, 1); + assert.equal(list0.hardware.value, 'us'); + const layer0 = list0.layers[0]; + assert.ok(layer0); + assert.equal(layer0.rows.length, 2); + assert.equal(layer0.id.value, 'base'); + assert.equal(layer0.mod, constants.keys_mod_none); + for(const row of layer0.rows) { + assert.ok(row); + assert.equal(row.keys.length, 2); + assert.equal(row.keys[0]?.value, 'grave'); + assert.equal(row.keys[1]?.value, 'mistake'); + } + }, + }, ]); }); From 3d8d4012c48045a77f24321ea91c37200853e9a5 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Wed, 25 Sep 2024 14:03:06 -0400 Subject: [PATCH 24/28] auto: increment master version to 18.0.118 --- HISTORY.md | 7 +++++++ VERSION.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index a90ef32165..9bc4268dc3 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ # Keyman Version History +## 18.0.117 alpha 2024-09-25 + +* docs(common): Document how to skip generating CDN on websites (#12446) +* fix(android): Remove toggle for "Always Show Banner" (#12430) +* fix(android): Hide suggestion banner on password fields (#12442) +* fix(developer): prevent invalid string ids (#12465) + ## 18.0.116 alpha 2024-09-20 * change(mac): remove verbose logging option (#12431) diff --git a/VERSION.md b/VERSION.md index bfdd37b653..e272e231ff 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.117 \ No newline at end of file +18.0.118 \ No newline at end of file From 87aff8d4a37a019109dd2a86f512426882a2e799 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 25 Sep 2024 14:22:03 -0700 Subject: [PATCH 25/28] fix(developer): publish developer-utils package during build Fixes: #12426 --- developer/src/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/developer/src/build.sh b/developer/src/build.sh index c85851f1f6..cde9b7fc23 100755 --- a/developer/src/build.sh +++ b/developer/src/build.sh @@ -149,6 +149,7 @@ function do_publish() { DRY_RUN=--dry-run fi + ./common/web/utils/build.sh publish $DRY_RUN $NPM_PUBLISH ../../common/web/keyman-version/build.sh publish $DRY_RUN $NPM_PUBLISH ../../common/web/types/build.sh publish $DRY_RUN $NPM_PUBLISH ../../core/include/ldml/build.sh publish $DRY_RUN $NPM_PUBLISH From 035af7271ccf9dd7bb4d646d65549148672e3e48 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 26 Sep 2024 00:15:52 +0200 Subject: [PATCH 26/28] docs: tweak content --- developer/src/tike/xml/help/contexthelp.xml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/developer/src/tike/xml/help/contexthelp.xml b/developer/src/tike/xml/help/contexthelp.xml index 6a3dd4cef5..00e4cf525b 100644 --- a/developer/src/tike/xml/help/contexthelp.xml +++ b/developer/src/tike/xml/help/contexthelp.xml @@ -471,7 +471,8 @@

-

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

+

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

@@ -539,11 +540,13 @@ -

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

+

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.

+

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

@@ -568,8 +571,9 @@ -

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 +

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.

@@ -583,7 +587,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.

@@ -600,7 +604,7 @@
  • Seamless integration with the IDE (Start, Stop, Live reload, Recompile...)
  • Port configuration
  • Allow testing cross devices
  • -
  • Wider range support for NGROK...
  • +
  • Support for ngrok to allow simple sharing of debug sessions across the Internet
  • From 3fab6c2d2cc1abb7a6851f5f609ae431a3ec36a1 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Thu, 26 Sep 2024 18:26:04 +0200 Subject: [PATCH 27/28] 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 593e7aa7fc..83aa5a5125 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 28/28] 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 9bc4268dc3..01762fcc2c 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 e272e231ff..49dcd61578 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