spiegel-keyman/web
Marc Durdin db5aa518c0 change(developer): add unit test to verify special key cap definitions
Special key caps such as '*ZWNJ*' are defined in a number of places in
the source. In theory, we could DRY these definitions out, but that
would add a number of unhelpful dependencies or take considerable time
to implement. So, for now I opted to write a unit test to compare the
definitions as found in the following files, treating web's definition
as primary:

 *   web/src/engine/osk/src/specialCharacters.ts
 *   developer/src/tike/xml/layoutbuilder/constants.js
 *   developer/src/kmc-kmn/kmw-compiler/constants.ts
 *   developer/docs/help/reference/file-types/keyman-touch-layout.md
 *   core/include/ldml/keyman_core_ldml.ts

Note that the keyman_core_ldml.ts file changes are not included in this
commit, and hence the unit test for it is currently skipped. This will
be enabled in a subsequent commit along with other KMX+ changes to
support epic/embed-osk-in-kmx.

Test-bot: skip
2025-10-16 12:37:44 +02:00
..
docs Merge pull request #14646 from keymanapp/refactor/common/13205_UnifyWhatsNew 2025-09-05 09:44:02 +02:00
src change(developer): add unit test to verify special key cap definitions 2025-10-16 12:37:44 +02:00
.build-builder chore(web): moves main web script to /web, adds .build-builder file as flag for CI 2022-10-18 13:59:19 +07:00
.c8rc.json chore(web): fix coverage-reporting artifact 2025-02-12 15:56:54 +07:00
.gitattributes Patches up the /samples pages. 2018-01-08 09:51:19 +07:00
.gitignore change(web): unit_tests -> src/test/auto 2022-10-24 11:55:40 +07:00
.mocharc.json chore(web): allow to run unit tests in vscode test explorer 2024-09-11 19:28:33 +02:00
build.sh maint(common): move build-utils-ci.inc.sh to ci/ci-publish.inc.sh 2025-08-05 12:54:56 +10:00
ci.sh maint(web): skip unnecessary steps for build buildLevel 2025-08-13 09:10:07 +02:00
common.inc.sh maint(common): move build-utils-ci.inc.sh to ci/ci-publish.inc.sh 2025-08-05 12:54:56 +10:00
history.md chore: merge stable history 2020-04-29 06:33:31 +10:00
index.html refactor(web): Link to index.html in test pages 2023-11-07 09:38:15 +07:00
LICENSE Move KeymanWeb project to web/ 2017-05-26 11:00:34 +07:00
NOTICE Move KeymanWeb project to web/ 2017-05-26 11:00:34 +07:00
package.json maint: update mocha 2025-05-13 14:02:02 +07:00
README.md refactor(web): merge device-detect with web/src/engine/main 2024-09-11 16:48:15 +02:00
test.sh maint(common): move build-utils-ci.inc.sh to ci/ci-publish.inc.sh 2025-08-05 12:54:56 +10:00
tsconfig.base.json change(web): remove support for es5 2024-07-04 20:49:30 +02:00

Keyman Engine for Web

The Original Code is (C) SIL International

Prerequisites

See build configuration for details on how to configure your build environment.


The following folders contain the distribution for Keyman Engine for Web:

src                        Source code
build/app/resources        OSK + UI resources for inclusion in all build types;
                           keymanweb-osk.ttf is maintained at https://github.com/silnrsi/font-keymanweb-osk

build/app/browser/release  Fully-compiled KeymanWeb modules for release
build/app/webview/release  Fully-compiled KMEA/KMEI modules for inclusion in
                           mobile app builds
build/app/browser/debug    Fully-compiled but non-minified KeymanWeb modules
build/app/webview/debug    Fully-compiled but non-minified KMEA/KMEI modules

src/samples                Sample pages demonstrating ways to link with KeymanWeb
src/test/manual            Test-case web-pages for various aspects of KeymanWeb functionality
src/test/auto              A Node-driven test suite for automated testing of KeymanWeb

Usage

Open index.html or samples/index.html in your browser. Be sure to compile Keyman Engine for Web before viewing the pages.

Refer to the samples for usage details.

To view pages using compiled Keyman Engine for Web,

  1. cd to keyman/web/
  2. Run ./build.sh
    • Use ./build.sh --help for the script's documentation.

Unit Testing

Before running unit tests on Keyman Engine for Web, first run ./build.sh according to the instructions above.

Once the build is complete, running npm test will run the unit testing suite on your local machine in-browser. Alternatively, see test.sh, which the former command executes.

Debugging Unit Tests

  1. During development, to run a specific unit test, change the it to it.only. You can also run all tests under a specific group with describe.only.

  2. From this directory, run ./test.sh --debug. Alternatively, from web/ or any web/ subdirectory,

    npm run test -- --debug
    

    The -- part tells npm to funnel anything to the script as the script's command-line parameters. As long as it's run from somewhere within the web/ folder's hierarchy, that line will always run from web/, as that's where package.json is.

  3. When the browser halts, click the "Debug" button which opens a new debugging tab.

  4. In the Dev console, you can set a breakpoint in your test and refresh the page to debug

Approximate Overall Design

---
title: Dependency Graph
---
%% For rendering, use e.g. https://mermaid.live
%%{init: {"flowchart": {"htmlLabels": false}} }%%
graph TD;
    OSK["/web/src/engine/osk"];
    KeyboardSpec["/web/src/engine/keyboard"];
    JSProc["/web/src/engine/js-processor"];
    OSK-->KeyboardSpec;
    WebUtils["@keymanapp/web-utils<br>(/web/src/engine/common/web-utils)"];
    KeyboardSpec---->WebUtils;
    Wordbreakers["@keymanapp/models-wordbreakers<br>(/web/src/engine/predictive-text/wordbreakers)"];
    Models["@keymanapp/models-templates<br>(/web/src/engine/predictive-text/templates/)"];
    Models-->WebUtils;
    LMWorker["@keymanapp/lm-worker<br>(/web/src/engine/predictive-text/worker-thread)"];
    LMWorker-->Models;
    LMWorker-->Wordbreakers;
    LMLayer["@keymanapp/lexical-model-layer<br>(/web/src/engine/predictive-text/worker-main)"];
    LMLayer-->LMWorker;
    Gestures["@keymanapp/gesture-recognizer<br>(/web/src/engine/osk/gesture-recognizer)"];
    Gestures-->WebUtils;

    subgraph PredText["PredText: WebWorker + its interface"]
        LMLayer;
        LMWorker;
        Models;
        Wordbreakers;
    end

    subgraph Headless["`**Headless**
    Fully headless components`"]
        direction LR
        KeyboardSpec;
        JSProc-->KeyboardSpec;
        WebUtils;
        PredText;
        Gestures;
    end

    subgraph ClassicWeb["`**ClassicWeb**
    Intermediate-level engine modules`"]
        Elements["/web/src/engine/element-wrappers"];
        Elements-->JSProc;
        KeyboardStorage["/web/src/engine/keyboard-storage"];
        KeyboardStorage-->Interfaces;
        DomUtils["/web/src/engine/dom-utils"];
        DomUtils-->WebUtils;
        DomUtils-->KeyboardSpec;
        OSK-->DomUtils;
        OSK-->Gestures;
        Interfaces["/web/src/engine/interfaces"];
        Interfaces-->KeyboardSpec;
        OSK-->Interfaces;
        CommonEngine["/web/src/engine/main"];
        CommonEngine-->Device;
        CommonEngine-->KeyboardStorage;
        CommonEngine-->OSK;
        Attachment["/web/src/engine/attachment"];
        Attachment-->DomUtils;
        Attachment-->Elements;
    end

    subgraph WebEngine["`**WebEngine**
    Keyman Engine for Web (top-level libraries)`"]
        Browser["/web/src/app/browser"];
        WebView["/web/src/app/webview"];

        WebView--->CommonEngine;

        Browser--->CommonEngine;
        Browser-->Attachment;
    end