chore(windows): Merge branch 'epic/windows-updates' into feat/windows/add-apply-now-update

This commit is contained in:
rc-swag 2024-10-01 17:38:59 +10:00
commit 4ad5f0fc64
489 changed files with 13160 additions and 5233 deletions

6
.github/labeler.yml vendored
View file

@ -20,10 +20,8 @@ common/:
- common/**
- resources/**
common/models/: common/models/**
common/models/types/: common/models/types/**
common/models/templates/: common/models/templates/**
common/models/wordbreakers/: common/models/wordbreakers/**
common/models/templates/: web/src/engine/predictive-text/templates/**
common/models/wordbreakers/: web/src/engine/predictive-text/wordbreakers/**
common/resources/: resources/**
common/web/: common/web/**

1
.gitignore vendored
View file

@ -183,4 +183,3 @@ lcov.info
/keyman*.buildinfo
/keyman*.changes
/keyman*.tar.?z

View file

@ -1,5 +1,121 @@
# Keyman Version History
## 18.0.110 alpha 2024-09-12
* chore(common): Update to Unicode 16.0 (#12393)
* refactor(web): move `common/web/es-bundling` → `web/src/tools/es-bundling` (#12389)
* refactor(web): move `common/web/eslint` → `common/tools/eslint` (#12390)
* refactor(web): move sentry-manager → `web/src/engine/sentry-manager` (#12397)
* refactor(web): merge `device-detect` with `web/src/engine/main` (#12399)
* chore(web): allow to run unit tests in vscode test explorer (#12400)
* fix(developer): index() requires comma between parameters in kmcmplib compiler (#12328)
## 18.0.109 alpha 2024-09-11
* chore(common): Update history with 17.0.329 stable (#12394)
* refactor(web): move `model/templates` to `web/src/engine/predictive/text` (#12382)
* refactor(web): move `common/models` to `web/src/engine/predictive-text` (#12383)
* refactor(web): move `common/web/utils` to `web/src/engine/common/web-utils/` (#12384)
## 18.0.108 alpha 2024-09-10
* docs(android): Update help docs (#12367)
* fix(developer): fix building with Ubuntu 24.04 (#12379)
* refactor(android): Move build-publish.sh to builder script (#12351)
* fix(android): Separate `publishSentry` Gradle task to publish symbols to Sentry (#12358)
* refactor(web): move `model/types` to `web/types` (#12370)
## 18.0.107 alpha 2024-09-09
* fix(android): Update Text Size menu icons for RTL support (#12290)
## 18.0.106 alpha 2024-09-06
* feat(windows): add right modifier included in hotkey optional functionality (#12259)
* fix(android): Skip language counts for lexical-model packages (#12361)
* docs(web): fix link to documentation page (#12369)
## 18.0.105 alpha 2024-09-05
* chore(common): Fix missing entries in HISTORY.md (#12352)
* docs(android): Add in-app help for adjusting longpress delay (#12359)
* fix(mac): avoid crash on startup with macOS 10.15 (Catalina) (#12354)
* chore(oem/fv): Update to fv_all 13.0 (#12362)
* feat(windows): Add two new strings for SIL Global name instead of SIL International (#12327)
## 18.0.104 alpha 2024-09-03
* fix(mac): display package info after keyboard installation (#12326)
## 18.0.103 alpha 2024-09-02
* feat(windows): Remove hotkey related feature flags (#12252)
* feat(windows): update SIL logo for Windows UI (#12250)
## 18.0.102 alpha 2024-08-30
* docs(web): add documentation comments for touch layout interfaces (#12314)
* change(mac): store data in Library directory instead of Documents (#12106)
* change(mac): store partial path in UserDefaults (#12144)
## 18.0.101 alpha 2024-08-29
* refactor(web): move `gesture-recognizer` → `gesture-processor` (#12194)
* docs(core): fix a typo in the KMX+ doc (#12302)
* chore(web): remove obsolete comment (#12304)
* chore(android,ios): Update FirstVoices keyboards to fv_all.kmp 12.15 (#12300)
* fix(developer): make LDML import path consistent for all bundlings of kmc (#12280)
* fix(core): properly support 'other' modifier state with `uint32_t` type (#12281)
* chore(windows): fix typo in environment.inc.sh (#12286)
* fix(android): Check in material-stepper as internal Maven dependency (#12267)
* docs(core): improve formatting of KMX+ doc (#12303)
* fix(android): Prioritize certain actions over multi-line for ENTER key (#12315)
* fix(linux): add `keymanFacename` to .ldml file (#12277)
* chore(common): Update crowdin strings for Czech (#12316)
* fix(web): prevent unintuitive space-output blocking for mid-context suggestions (#12313)
## 18.0.100 alpha 2024-08-28
* fix(windows): check IM window will be in a visible location (#11967)
## 18.0.99 alpha 2024-08-27
* feat(web): import the generator for the pred-text wordbreaker's Unicode-property data-table (#10690)
* feat(web): optimize the wordbreaker data table for filesize and ease of first-load parsing (#10692)
* fix(web): fixes wordbreaker test import path (#12297)
* feat(web): enable utf8 charset encoding for the build artifacts (#12115)
## 18.0.98 alpha 2024-08-26
* change(ios): defer registration of fonts past initialization (#12190)
* refactor(ios): optimize font registration (#12210)
* test(mac): add unit tests to validate first calls to compliance check (#11724)
* fix(mac): limit short bundle version string to x.y.z format in info.plist (#12233)
* chore(developer): extend timeouts for lm compiler tests to 5 secs (#12273)
* fix(developer): find last matching key in LDML key bag when building KVK (#12278)
* chore(android): Cleanup stray debug statements in console (#12287)
* fix(developer): ensure call() detects invalid store in kmcmplib compiler (#12263)
## 18.0.97 alpha 2024-08-24
* refactor(linux): cleanup API of kvk2ldml.py (#12276)
* chore(common): adjust build settings for windows clean builds (#12264)
* chore(windows): remove remaining unused Makefiles (#12274)
* docs(developer): update build documentation to refer to build.sh (#12272)
## 18.0.96 alpha 2024-08-23
* fix(android): Fix navigation arrows in Info Activity for RTL (#12244)
* fix(web): fix documentation-keyboard spacebar-text scaling (#12232)
* fix(android): Use increment and decrement arrows on longpress delay menu (#12242)
* fix(android): Add RTL assets for adjusting keyboard height menu (#12261)
* chore(common): use `npm install` in emsdk update (#12269)
* docs: refresh windows.md (#12248)
## 18.0.95 alpha 2024-08-22
* chore(common): allow build agents to automatically select emsdk version, and enable support for 3.1.60+ (#12243)
## 18.0.94 alpha 2024-08-21
* fix(core): look for `emcc` instead of `emcc.py` (#12235)
@ -12,11 +128,11 @@
## 18.0.93 alpha 2024-08-20
* (#12188)
* refactor(web): remove engine/interfaces dependency on engine/js-processor (#12188)
* fix(web): fix malformed reversion display strings (#12201)
* feat(android): Add menu to specify long-press delay (#12170)
* feat(android): Pass longpress delay to KeymanWeb (#12185)
* (#12223)
* fix(core): set mac build version for meson cli build to 10.13 (#12223)
## 18.0.92 alpha 2024-08-19
@ -672,6 +788,29 @@
* chore(common): move to 18.0 alpha (#10713)
* chore: move to 18.0 alpha
## 17.0.329 stable 2024-09-09
* chore(android,ios): Add ojibwa ifinal/rdot keyboards to FirstVoices (#12020)
* change(web): revert #11174, which loads keyboards before initializing the OSK (#12040)
* fix(web): unrevert #11258, leaving OSK hidden before instructed to display (#12058)
* chore(common): use `nvm` to select version of node for builds (#12074)
* fix(developer): ignore scan code if zero in debugger (#12182)
* fix(developer): enforce presence of Version field when FollowKeyboardVersion is not set, in package compiler (#12206)
* fix(developer): enforce presence of kps Info.Description field in info compilers (#12207)
* fix(web): disable fat-finger data use when mayCorrect = false (#12226)
* chore(common): allow build agents to automatically select emsdk version, and enable support for 3.1.60+ (#12245)
* fix(web): fix documentation-keyboard spacebar-text scaling (#12240)
* fix(core): set mac build version for meson cli build to 10.13 (#12246)
* change(ios): defer registration of fonts past initialization (#12241)
* chore(android,ios): Update FirstVoices keyboards to 12.15 (#12301)
* fix(core): properly support 'other' modifier state with `uint32_t` type (#12285)
* fix(developer): find last matching key in LDML key bag when building KVK (#12284)
* fix(android): check in material-stepper as internal Maven dependency (#12324)
* fix(linux): add `keymanFacename` to .ldml file (#12283)
* chore(oem/fv): Update to fv_all 13.0 (#12363)
* fix(mac): avoid crash on startup with macOS 10.15 (Catalina) (#12364)
* fix(android): skip language counts for lexical-model packages (#12368)
## 17.0.328 stable 2024-07-27
* fix(web): add nullish test in setOsk (#12041)

View file

@ -1 +1 @@
18.0.95
18.0.111

View file

@ -2,8 +2,10 @@
buildscript {
repositories {
google()
jcenter()
mavenCentral()
flatDir {
dirs "kMAPro/libs/com/stepstone/stepper/material-stepper/4.3.1/"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
@ -11,16 +13,16 @@ buildscript {
classpath 'io.sentry:sentry-android-gradle-plugin:4.6.0'
classpath 'name.remal:gradle-plugins:1.5.0'
// From jcenter() which could be sunset in future
// From jcenter() which was deprecated August 2024
// https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/
classpath 'com.stepstone.stepper:material-stepper:4.3.1'
classpath 'com.stepstone.stepper:material-stepper:4.3.1@aar'
}
}
allprojects {
repositories {
maven { url uri("${projectDir}/libs") }
google()
jcenter()
mavenCentral()
maven { url "https://jitpack.io" }
}

View file

@ -10,6 +10,8 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
. "$KEYMAN_ROOT/resources/build/build-help.inc.sh"
. "$KEYMAN_ROOT/resources/build/build-download-resources.sh"
. "$KEYMAN_ROOT/android/KMAPro/build-play-store-notes.inc.sh"
# ################################ Main script ################################
# Definition of global compile constants
@ -25,6 +27,7 @@ builder_describe "Builds Keyman for Android app." \
"configure" \
"build" \
"test Runs lint and unit tests." \
"publish Publishes symbols to Sentry and the APK to the Play Store." \
"--ci Don't start the Gradle daemon. For CI" \
"--upload-sentry Upload to sentry"
@ -109,3 +112,13 @@ if builder_start_action test; then
builder_finish_action success test
fi
if builder_start_action publish; then
# Copy Release Notes
generateReleaseNotes
# Publish symbols and Keyman for Android to Play Store
./gradlew $DAEMON_FLAG publishSentry publishReleaseApk
builder_finish_action success publish
fi

View file

@ -105,12 +105,17 @@ android {
}
// how to configure the sentry android gradle plugin
sentry {
// Disables or enables the automatic configuration of Native symbols
uploadNativeSymbols = true
task publishSentry {
doLast {
println 'Publishing Keyman symbols to Sentry'
sentry {
// Disables or enables the automatic configuration of Native symbols
uploadNativeSymbols = true
// Does or doesn't include the source code of native code for Sentry
includeNativeSources = true
// Does or doesn't include the source code of native code for Sentry
includeNativeSources = true
}
}
}
String env_keys_json_file = System.getenv("keys_json_file")
@ -145,7 +150,6 @@ repositories {
dirs 'libs'
}
google()
jcenter()
}
dependencies {

View file

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stepstone.stepper</groupId>
<artifactId>material-stepper</artifactId>
<version>4.3.1</version>
<packaging>aar</packaging>
<name>Android Material Stepper</name>
<description>This library allows to use Material steppers inside Android applications.</description>
<url>https://github.com/stepstone-tech/android-material-stepper</url>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<id>zawadz88</id>
<name>Piotr Zawadzki</name>
<email>piotr.zawadzki@stepstone.com</email>
</developer>
</developers>
<scm>
<connection>https://github.com/stepstone-tech/android-material-stepper.git</connection>
<developerConnection>https://github.com/stepstone-tech/android-material-stepper.git</developerConnection>
<url>https://github.com/stepstone-tech/android-material-stepper</url>
</scm>
<dependencies>
<dependency>
<groupId>com.android.support</groupId>
<artifactId>appcompat-v7</artifactId>
<version>25.4.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.7.21</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.squareup.assertj</groupId>
<artifactId>assertj-android</artifactId>
<version>1.1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.robolectric</groupId>
<artifactId>robolectric</artifactId>
<version>3.3.1</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>org.apache.httpcomponents</groupId>
</exclusion>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jre7</artifactId>
<version>1.1.4-3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>1.1.4-3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.nhaarman</groupId>
<artifactId>mockito-kotlin</artifactId>
<version>1.4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View file

@ -31,8 +31,6 @@ public class AdjustLongpressDelayActivity extends BaseActivity {
// Keeps track of the adjusted longpress delay time for saving.
// Internally use milliseconds, but GUI displays seconds
private static int currentDelayTimeMS = KMManager.KMDefault_LongpressDelay; // ms
private static int minLongpressTime = 300; // ms
private static int maxLongpressTime = 1500; // ms
private static int delayTimeIncrement = 200; // ms
/**
@ -112,7 +110,7 @@ public class AdjustLongpressDelayActivity extends BaseActivity {
findViewById(R.id.delayTimeDownButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentDelayTimeMS > minLongpressTime) {
if (currentDelayTimeMS > KMManager.KMMinimum_LongpressDelay) {
currentDelayTimeMS -= delayTimeIncrement;
seekBar.setProgress(delayTimeToProgress());
}
@ -122,7 +120,7 @@ public class AdjustLongpressDelayActivity extends BaseActivity {
findViewById(R.id.delayTimeUpButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currentDelayTimeMS < maxLongpressTime) {
if (currentDelayTimeMS < KMManager.KMMaximum_LongpressDelay) {
currentDelayTimeMS += delayTimeIncrement;
seekBar.setProgress(delayTimeToProgress());
}

View file

@ -112,7 +112,8 @@ public class PackageActivity extends AppCompatActivity implements
// Number of languages associated with the first keyboard in a keyboard package.
// lexical-model packages will be 0
final int languageCount = kmpProcessor.getLanguageCount(pkgInfo, PackageProcessor.PP_KEYBOARDS_KEY, 0);
final int languageCount = (keyboardCount > 0) ?
kmpProcessor.getLanguageCount(pkgInfo, PackageProcessor.PP_KEYBOARDS_KEY, 0) : 0;
// Sanity check for keyboard packages
if (pkgTarget.equals(PackageProcessor.PP_TARGET_KEYBOARDS)) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 B

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

View file

@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M0.99,19h2.42l1.27,-3.58h5.65L11.59,19h2.42L8.75,5h-2.5L0.99,19zM5.41,13.39L7.44,7.6h0.12l2.03,5.79H5.41zM23,11v2h-8v-2H23z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="48dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="48dp">
<path android:fillColor="@android:color/white" android:pathData="M0.99,19h2.42l1.27,-3.58h5.65L11.59,19h2.42L8.75,5h-2.5L0.99,19zM5.41,13.39L7.44,7.6h0.12l2.03,5.79H5.41zM20,11h3v2h-3v3h-2v-3h-3v-2h3V8h2V11z"/>
</vector>

View file

@ -23,7 +23,7 @@
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:contentDescription="@string/ic_delay_time_down"
android:src="@drawable/ic_light_dialog_textsize_down" />
android:src="@drawable/ic_action_decrement" />
<!-- Seekbar range 0 to 6 corresponds to longpress duration 300 ms to 1500 ms -->
<SeekBar
@ -43,7 +43,7 @@
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:contentDescription="@string/ic_delay_time_up"
android:src="@drawable/ic_light_dialog_textsize_up" />
android:src="@drawable/ic_action_increment" />
</LinearLayout>

View file

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/ms_white"
tools:context=".InfoActivity" >
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/ms_white"
tools:context=".InfoActivity" >
<androidx.appcompat.widget.Toolbar
android:id="@+id/titlebar"
@ -15,25 +15,31 @@
android:layout_alignParentTop="true"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
<!-- Navigation buttons -->
<ImageButton
android:id="@+id/back_button"
style="?android:attr/actionButtonStyle"
app:tint="@color/image_button_color"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:contentDescription="@string/label_back"
android:src="@drawable/ic_action_back" />
android:orientation="horizontal">
<ImageButton
android:id="@+id/forward_button"
style="?android:attr/actionButtonStyle"
app:tint="@color/image_button_color"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/label_forward"
android:src="@drawable/ic_action_forward" />
<!-- Navigation buttons in a LinearLayout to mirror on RTL -->
<ImageButton
android:id="@+id/back_button"
style="?android:attr/actionButtonStyle"
app:tint="@color/image_button_color"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:contentDescription="@string/label_back"
android:src="@drawable/ic_action_back" />
<ImageButton
android:id="@+id/forward_button"
style="?android:attr/actionButtonStyle"
app:tint="@color/image_button_color"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/label_forward"
android:src="@drawable/ic_action_forward" />
</LinearLayout>
<ImageButton
android:id="@+id/close_button"

View file

@ -15,7 +15,7 @@
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:contentDescription="@string/ic_text_size_down"
android:src="@drawable/ic_action_decrement" />
android:src="@drawable/textsize_decrease" />
<SeekBar
android:id="@+id/seekBar"
@ -32,6 +32,6 @@
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:contentDescription="@string/ic_text_size_up"
android:src="@drawable/ic_action_increment" />
android:src="@drawable/textsize_increase" />
</LinearLayout>

View file

@ -33,6 +33,8 @@
<string name="ic_text_size_up" comment="Make text bigger">Velikost textu nahoru</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_down" comment="Make text smaller">Velikost textu dolů</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_slider" comment="Adjust text size">Posuvník velikosti textu</string>
<!-- Context: Clear Text dialog -->
<string name="all_text_will_be_cleared" comment="Erase all the text">\nVeškerý text bude vymazán\n</string>
<!-- Context: Get Started menu -->
@ -51,6 +53,7 @@
<string name="request_storage_permission" comment="Request storage permission to access keyboard packages"> Pro instalaci balíčků klávesnice povolte klávesnici oprávnění ke čtení externího úložiště.</string>
<!-- Context: Android Storage Permission -->
<string name="storage_permission_denied" comment="Keyboard package installation may fail since Android storage permission not granted"> Žádost o oprávnění k úložišti byla zamítnuta. Může selhat instalace balíčku klávesnice</string>
<string name="storage_permission_denied2" comment="Keyboard package installation failed. Recommend install from local file"> Žádost o oprávnění k úložišti se nezdařila. Zkuste nastavení Keyman - Instalovat z místního souboru</string>
<!-- Context: Keyman Settings menu -->
<string name="keyman_settings" comment="Settings menu title">Nastavení</string>
<!-- Context: Keyman Settings menu -->
@ -67,6 +70,8 @@
<!-- Context: Keyman Settings menu -->
<string name="adjust_keyboard_height" comment="Menu action to adjust keyboard height">Upravit výšku klávesnice</string>
<!-- Context: Keyman Settings menu -->
<string name="adjust_longpress_delay" comment="Menu action to adjust longpress delay duration">Upravit zpoždění dlouhého stisknutí</string>
<!-- Context: Keyman Settings menu -->
<string name="spacebar_caption" comment="Menu action to set the spacebar caption">Titulek mezerníku</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_keyboard" comment="Spacebar caption option - keyboard">Keyboard</string>
@ -85,7 +90,7 @@
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_blank" comment="Spacebar caption hint - blank">Nezobrazovat titulek v mezerníku</string>
<!-- Context: Keyman Settings menu / Haptic feedback -->
<string name="haptic_feedback" comment="haptic feedback on key press">Vibrate when typing</string>
<string name="haptic_feedback" comment="haptic feedback on key press">Při psaní vibrovat</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner" comment="text suggestions banner">Vždy zobrazovat banner</string>
<!-- Context: Keyman Settings menu -->
@ -122,6 +127,14 @@
<string name="rotate_the_device" comment="Second line of adjusting keyboard height">Otočit zařízení pro nastavení na výšku a na šířku</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="reset_to_defaults" comment="Button to reset to default heights">Obnovit výchozí nastavení</string>
<!-- Context: Adjust Longpress Delay Time menu -->
<string name="longpress_delay_time" comment="Current longpress delay time (seconds)">Doba zpoždění: %1$.1f sekund</string>
<!-- Context: Adjust Longpress Delay Time menu -->
<string name="ic_delay_time_up" comment="Make longpress delay longer">Prodloužit dobu zpoždění</string>
<!-- Context: Adjust Longpress Delay Time menu -->
<string name="ic_delay_time_down" comment="Make longpress delay shorter">Zkrátit dobu zpoždění</string>
<!-- Context: Adjust Longpress Delay Time menu -->
<string name="ic_longpress_delay_slider" comment="Adjust longpress delay time">Posuvník doby zpoždění dlouhého stisknutí</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_text" comment="Prompt to type in the browser search bar">Hledat nebo zadat URL</string>
<!-- Context: Keyman Web Browser -->
@ -157,7 +170,7 @@
<!-- Context: KMP Package strings -->
<string name="invalid_metadata" comment="kmp.json metadata file is invalid or missing in package">Neplatná/chybějící metadata v balíčku</string>
<!-- Context: KMP Package strings -->
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> Keyboard requires a newer version of Keyman</string>
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> Klávesnice vyžaduje novější verzi Keyman</string>
<!-- Context: anywhere -->
<string name="unable_to_open_browser" comment="Notification when a browser activity cannot be launched">Unable to launch web browser</string>
<string name="unable_to_open_browser" comment="Notification when a browser activity cannot be launched">Nelze spustit webový prohlížeč</string>
</resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- app_name removed in 16.0 beta. Set in build.gradle -->
<!-- Context: Menu Action -->
<string name="action_share" comment="Menu action to send text content to another app">Condividi</string>
<!-- Context: Menu Action -->
@ -32,6 +33,8 @@
<string name="ic_text_size_up" comment="Make text bigger">Dimensione testo in alto</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_down" comment="Make text smaller">Dimensione del testo giù</string>
<!-- Context: Text Size dialog -->
<string name="ic_text_size_slider" comment="Adjust text size">Cursore dimensione testo</string>
<!-- Context: Clear Text dialog -->
<string name="all_text_will_be_cleared" comment="Erase all the text">\nTutto il testo sarà cancellato\n</string>
<!-- Context: Get Started menu -->
@ -50,6 +53,7 @@
<string name="request_storage_permission" comment="Request storage permission to access keyboard packages"> Per installare pacchetti di tastiera, consentire a Keyman di leggere la memoria esterna.</string>
<!-- Context: Android Storage Permission -->
<string name="storage_permission_denied" comment="Keyboard package installation may fail since Android storage permission not granted"> La richiesta di autorizzazione all\'archiviazione è stata negata. Potrebbe non essere stato possibile installare il pacchetto tastiera</string>
<string name="storage_permission_denied2" comment="Keyboard package installation failed. Recommend install from local file"> Richiesta di autorizzazione archiviazione non riuscita. Prova Impostazioni Keyman - Installa da file locale</string>
<!-- Context: Keyman Settings menu -->
<string name="keyman_settings" comment="Settings menu title">Impostazioni</string>
<!-- Context: Keyman Settings menu -->
@ -64,6 +68,8 @@
<!-- Context: Keyman Settings menu -->
<string name="adjust_keyboard_height" comment="Menu action to adjust keyboard height">Regola altezza tastiera</string>
<!-- Context: Keyman Settings menu -->
<string name="adjust_longpress_delay" comment="Menu action to adjust longpress delay duration">Adjust longpress delay</string>
<!-- Context: Keyman Settings menu -->
<string name="spacebar_caption" comment="Menu action to set the spacebar caption">Didascalia barra spaziatrice</string>
<!-- Context: Keyman Settings menu / Spacebar caption -->
<string name="spacebar_caption_keyboard" comment="Spacebar caption option - keyboard">Keyboard</string>
@ -82,7 +88,7 @@
<!-- Context: Keyman Settings menu / Spacebar caption hint -->
<string name="spacebar_caption_hint_blank" comment="Spacebar caption hint - blank">Non mostrare la didascalia sulla barra spaziatrice</string>
<!-- Context: Keyman Settings menu / Haptic feedback -->
<string name="haptic_feedback" comment="haptic feedback on key press">Vibrate when typing</string>
<string name="haptic_feedback" comment="haptic feedback on key press">Vibra durante la digitazione</string>
<!-- Context: Keyman Settings menu -->
<string name="show_banner" comment="text suggestions banner">Mostra sempre il banner</string>
<!-- Context: Keyman Settings menu -->
@ -119,6 +125,14 @@
<string name="rotate_the_device" comment="Second line of adjusting keyboard height">Ruota il dispositivo per regolare verticale e orizzontale</string>
<!-- Context: Adjust Keyboard Height menu -->
<string name="reset_to_defaults" comment="Button to reset to default heights">Ripristina impostazioni predefinite</string>
<!-- Context: Adjust Longpress Delay Time menu -->
<string name="longpress_delay_time" comment="Current longpress delay time (seconds)">Delay Time: %1$.1f seconds</string>
<!-- Context: Adjust Longpress Delay Time menu -->
<string name="ic_delay_time_up" comment="Make longpress delay longer">Delay time longer</string>
<!-- Context: Adjust Longpress Delay Time menu -->
<string name="ic_delay_time_down" comment="Make longpress delay shorter">Delay time shorter</string>
<!-- Context: Adjust Longpress Delay Time menu -->
<string name="ic_longpress_delay_slider" comment="Adjust longpress delay time">Longpress delay time slider</string>
<!-- Context: Keyman Web Browser -->
<string name="hint_text" comment="Prompt to type in the browser search bar">Cerca o digita URL</string>
<!-- Context: Keyman Web Browser -->
@ -154,7 +168,7 @@
<!-- Context: KMP Package strings -->
<string name="invalid_metadata" comment="kmp.json metadata file is invalid or missing in package">Metadati non validi/mancanti nel pacchetto</string>
<!-- Context: KMP Package strings -->
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> Keyboard requires a newer version of Keyman</string>
<string name="minimum_keyboard_version_not_supported" comment="Notification when keyboard has functionality not supported by current Keyman"> La tastiera richiede una nuova versione di Keyman</string>
<!-- Context: anywhere -->
<string name="unable_to_open_browser" comment="Notification when a browser activity cannot be launched">Unable to launch web browser</string>
<string name="unable_to_open_browser" comment="Notification when a browser activity cannot be launched">Impossibile avviare il browser web</string>
</resources>

View file

@ -117,7 +117,7 @@ function notifyHost(event, params) {
function setLongpressDelay(delay) {
if (keyman.osk) {
keyman.osk.gestureParams.longpress.waitLength = delay;
console.debug('setLongpressDelay('+delay+')');
console_debug('setLongpressDelay('+delay+')');
} else {
window.console.log('setLongpressDelay error: keyman.osk undefined');
}
@ -304,7 +304,7 @@ function updateKMSelectionRange(start, end) {
console_debug('result:\n' + build_context_string(context));
} else {
console.debug('range unchanged');
console_debug('range unchanged');
}
}

View file

@ -310,8 +310,11 @@ public final class KMManager {
public static final String KMDefault_DictionaryVersion = "0.1.4";
public static final String KMDefault_DictionaryKMP = KMDefault_DictionaryPackageID + FileUtils.MODELPACKAGE;
// Default KeymanWeb longpress delay in milliseconds
// Default KeymanWeb longpress delay constants in milliseconds
public static final int KMDefault_LongpressDelay = 500;
public static final int KMMinimum_LongpressDelay = 300;
public static final int KMMaximum_LongpressDelay = 1500;
// Keyman files
protected static final String KMFilename_KeyboardHtml = "keyboard.html";
@ -1274,17 +1277,13 @@ public final class KMManager {
/**
* Sets enterMode which specifies how the System keyboard ENTER key is handled
*
* @param imeOptions EditorInfo.imeOptions
* @param inputType InputType
* @param imeOptions EditorInfo.imeOptions used to determine the action
* @param inputType InputType used to determine if the text field is multi-line
*/
public static void setEnterMode(int imeOptions, int inputType) {
if ((inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) != 0) {
enterMode = EnterModeType.NEWLINE;
return;
}
int imeActions = imeOptions & EditorInfo.IME_MASK_ACTION;
EnterModeType value = EnterModeType.DEFAULT;
int imeActions = imeOptions & EditorInfo.IME_MASK_ACTION;
boolean isMultiLine = (inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) != 0;
switch (imeActions) {
case EditorInfo.IME_ACTION_GO:
@ -1296,7 +1295,8 @@ public final class KMManager {
break;
case EditorInfo.IME_ACTION_SEND:
value = EnterModeType.SEND;
value = isMultiLine ?
EnterModeType.NEWLINE :EnterModeType.SEND;
break;
case EditorInfo.IME_ACTION_NEXT:
@ -1304,7 +1304,8 @@ public final class KMManager {
break;
case EditorInfo.IME_ACTION_DONE:
value = EnterModeType.DONE;
value = isMultiLine ?
EnterModeType.NEWLINE : EnterModeType.DONE;
break;
case EditorInfo.IME_ACTION_PREVIOUS:
@ -1312,7 +1313,8 @@ public final class KMManager {
break;
default:
value = EnterModeType.DEFAULT;
value = isMultiLine ?
EnterModeType.NEWLINE : EnterModeType.DEFAULT;
}
enterMode = value;
@ -2098,14 +2100,22 @@ public final class KMManager {
/**
* Set the longpress delay (in milliseconds) as a stored preference.
* Valid range is 300 ms to 1500 ms. Returns true if the preference is successfully stored.
* @param longpressDelay - int longpress delay in milliseconds
* @return boolean
*/
public static void setLongpressDelay(int longpressDelay) {
public static boolean setLongpressDelay(int longpressDelay) {
if (longpressDelay < KMMinimum_LongpressDelay || longpressDelay > KMMaximum_LongpressDelay) {
return false;
}
SharedPreferences prefs = appContext.getSharedPreferences(
appContext.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putInt(KMKey_LongpressDelay, longpressDelay);
editor.commit();
return true;
}
/**

View file

@ -49,7 +49,7 @@
<!-- Context: Button label -->
<string name="label_update" comment="Dialog button to update a resource">Aktualizovat</string>
<!-- Context: No internet for updates -->
<string name="no_internet_connection" comment="Internet connection missing">No internet connection</string>
<string name="no_internet_connection" comment="Internet connection missing">Žádné připojení k internetu</string>
<!-- Context: Keyboard Updates -->
<string name="cannot_connect" comment="Error message when network connection fails">Nelze se připojit k Keyman serveru!</string>
<!-- Context: Keyboard Updates -->
@ -88,7 +88,7 @@
<string name="fatal_keyboard_error_short" comment="Error in keyboard (keyboard ID::packageID for language)."> Chyba v klávesnici %1$s:%2$s pro jazyk %3$s.</string>
<!-- Context: Query for associated dictionary -->
<string name="query_associated_model" comment="Check if there's an available dictionary to download">Kontroluji související slovník ke stažení</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> Cannot connect to Keyman server to check for associated dictionary to download</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> Nelze se připojit ke Keyman serveru a zkontrolovat, zda je možné stáhnout přidružený slovník</string>
<!-- Context: Model Updates -->
<string name="confirm_download_model" comment="Confirmation to download a dictionary update">Chcete stáhnout nejnovější verzi tohoto slovníku?</string>
<!-- Context: No associated dictionary found -->
@ -111,7 +111,7 @@
<string name="dictionary_download_start_in_background" comment="Notification that a dictionary download has started">Stahování slovníku začalo na pozadí</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_is_running_in_background" comment="Notification that a dictionary download is still running">Vybraný slovník se již stahuje; zkuste to prosím za chvíli znovu!</string>
<!-- Context: Background download messages-->
<!-- Context: Background download messages. Removed in Keyman 17-->
<string name="dictionary_download_finished" comment="Notification that a dictionary download has finished">Stahování slovníku je dokončeno.</string>
<!-- Context: Background download messages -->
<string name="download_failed" comment="Notification that a download failed">Stahování se nezdařilo</string>
@ -123,7 +123,7 @@
<string name="update_check_current" comment="Notification that all resources are up to date">"Všechny zdroje jsou aktuální!"</string>
<!-- Context: General Updates -->
<string name="update_failed" comment="Notification that a resource update failed">Aktualizace jednoho nebo více zdrojů selhala!</string>
<!-- Context: General Updates -->
<!-- Context: General Updates. Removed in Keyman 17 -->
<string name="update_success" comment="Notification that a resource update successfully updated">Zdroje byly úspěšně aktualizovány!</string>
<!-- Context: Model Info -->
<string name="model_version" comment="Title for a dictionary version">Verze slovníku</string>
@ -132,11 +132,11 @@
<!-- Context: Model Info -->
<string name="confirm_delete_model" comment="Confirmation to delete a dictionary">Chcete odstranit tento slovník?</string>
<!-- Context: Model Deleted -->
<string name="model_deleted" comment="Notification when a dictionary is deleted">Dictionary deleted</string>
<string name="model_deleted" comment="Notification when a dictionary is deleted">Slovník smazán</string>
<!-- Context: Language Settings Keyboard install strings -->
<string name="keyboard_install_toast" comment="Notification when a keyboard is installed">Klávesnice %1$s nainstalována</string>
<!-- Context: Language Settings Keyboard uninstall strings -->
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">Keyboard deleted</string>
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">Klávesnice smazána</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_corrections" comment="Enable corrections from the suggestion banner">Povolit opravy</string>
<!-- Context: Language Settings menu strings -->
@ -144,14 +144,14 @@
<!-- Context: Language Settings menu strings -->
<string name="model_label">Slovník</string>
<plurals name="model_count">
<item quantity="one">Dictionary</item>
<item quantity="few">Dictionaries</item>
<item quantity="many">Dictionaries</item>
<item quantity="other">Dictionaries</item>
<item quantity="one">Slovník</item>
<item quantity="few">Slovníky</item>
<item quantity="many">Slovníků</item>
<item quantity="other">Slovníků</item>
</plurals>
<!-- Context: Language Settings menu substring - Check for available dictionary -->
<string name="check_available_model" comment="Check for available dictionary">Zkontrolovat dostupný slovník</string>
<string name="check_model_online" comment="Check for dictionaries online">Check for dictionaries online</string>
<string name="check_model_online" comment="Check for dictionaries online">Kouknout se na slovníky online</string>
<!-- Context: Language Settings menu strings -->
<string name="model_info_header" comment="Dictionary name">Slovník: %1$s</string>
<!-- Context: Language Settings menu strings -->
@ -176,5 +176,5 @@
<!-- Context: Other strings -->
<string name="help_bubble_text">Klepnutím sem změníte klávesnici</string>
<!-- Context: anywhere -->
<string name="unable_to_open_browser" comment="Notification when a browser activity cannot be launched">Unable to launch web browser</string>
<string name="unable_to_open_browser" comment="Notification when a browser activity cannot be launched">Nelze spustit webový prohlížeč</string>
</resources>

View file

@ -45,7 +45,7 @@
<!-- Context: Button label -->
<string name="label_update" comment="Dialog button to update a resource">Aggiorna</string>
<!-- Context: No internet for updates -->
<string name="no_internet_connection" comment="Internet connection missing">No internet connection</string>
<string name="no_internet_connection" comment="Internet connection missing">Nessuna connessione internet</string>
<!-- Context: Keyboard Updates -->
<string name="cannot_connect" comment="Error message when network connection fails">Impossibile connettersi al server Keyman!</string>
<!-- Context: Keyboard Updates -->
@ -84,7 +84,7 @@
<string name="fatal_keyboard_error_short" comment="Error in keyboard (keyboard ID::packageID for language)."> Errore nella tastiera %1$s:%2$s per %3$s lingua.</string>
<!-- Context: Query for associated dictionary -->
<string name="query_associated_model" comment="Check if there's an available dictionary to download">Controllo del dizionario associato da scaricare</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> Cannot connect to Keyman server to check for associated dictionary to download</string>
<string name="cannot_query_associated_model" comment="Cannot reach server to check if there's an available dictionary to download"> Non è possibile connettersi al server Keyman per verificare dizionari associati da scaricare</string>
<!-- Context: Model Updates -->
<string name="confirm_download_model" comment="Confirmation to download a dictionary update">Vuoi scaricare l\'ultima versione di questo dizionario?</string>
<!-- Context: No associated dictionary found -->
@ -107,7 +107,7 @@
<string name="dictionary_download_start_in_background" comment="Notification that a dictionary download has started">Scaricamento del dizionario avviato in background</string>
<!-- Context: Background download messages-->
<string name="dictionary_download_is_running_in_background" comment="Notification that a dictionary download is still running">Il dizionario selezionato è già in download; riprova tra un momento!</string>
<!-- Context: Background download messages-->
<!-- Context: Background download messages. Removed in Keyman 17-->
<string name="dictionary_download_finished" comment="Notification that a dictionary download has finished">Il download del dizionario è terminato.</string>
<!-- Context: Background download messages -->
<string name="download_failed" comment="Notification that a download failed">Download non riuscito</string>
@ -119,7 +119,7 @@
<string name="update_check_current" comment="Notification that all resources are up to date">"Tutte le risorse sono aggiornate!"</string>
<!-- Context: General Updates -->
<string name="update_failed" comment="Notification that a resource update failed">Una o più risorse non sono state aggiornate!</string>
<!-- Context: General Updates -->
<!-- Context: General Updates. Removed in Keyman 17 -->
<string name="update_success" comment="Notification that a resource update successfully updated">Risorse aggiornate con successo!</string>
<!-- Context: Model Info -->
<string name="model_version" comment="Title for a dictionary version">Versione dizionario</string>
@ -128,11 +128,11 @@
<!-- Context: Model Info -->
<string name="confirm_delete_model" comment="Confirmation to delete a dictionary">Vuoi eliminare questo dizionario?</string>
<!-- Context: Model Deleted -->
<string name="model_deleted" comment="Notification when a dictionary is deleted">Dictionary deleted</string>
<string name="model_deleted" comment="Notification when a dictionary is deleted">Dizionario eliminato</string>
<!-- Context: Language Settings Keyboard install strings -->
<string name="keyboard_install_toast" comment="Notification when a keyboard is installed">%1$s tastiera installata</string>
<!-- Context: Language Settings Keyboard uninstall strings -->
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">Keyboard deleted</string>
<string name="keyboard_deleted_toast" comment="Notification when a keyboard is deleted">Tastiera eliminata</string>
<!-- Context: Language Settings menu strings -->
<string name="enable_corrections" comment="Enable corrections from the suggestion banner">Abilita correzioni</string>
<!-- Context: Language Settings menu strings -->
@ -140,12 +140,12 @@
<!-- Context: Language Settings menu strings -->
<string name="model_label">Dizionario</string>
<plurals name="model_count">
<item quantity="one">Dictionary</item>
<item quantity="other">Dictionaries</item>
<item quantity="one">Dizionario</item>
<item quantity="other">Dizionari</item>
</plurals>
<!-- Context: Language Settings menu substring - Check for available dictionary -->
<string name="check_available_model" comment="Check for available dictionary">Controlla il dizionario disponibile</string>
<string name="check_model_online" comment="Check for dictionaries online">Check for dictionaries online</string>
<string name="check_model_online" comment="Check for dictionaries online">Controlla i dizionari online</string>
<!-- Context: Language Settings menu strings -->
<string name="model_info_header" comment="Dictionary name">Dizionario: %1$s</string>
<!-- Context: Language Settings menu strings -->
@ -168,5 +168,5 @@
<!-- Context: Other strings -->
<string name="help_bubble_text">Tocca qui per cambiare la tastiera</string>
<!-- Context: anywhere -->
<string name="unable_to_open_browser" comment="Notification when a browser activity cannot be launched">Unable to launch web browser</string>
<string name="unable_to_open_browser" comment="Notification when a browser activity cannot be launched">Impossibile avviare il browser web</string>
</resources>

View file

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

View file

@ -1,87 +0,0 @@
#!/usr/bin/env bash
# CI script to publish specified app APKs to the Play Store.
# The APKs should already have been built from a separate script
# set -x: Debugging use, print each statement
# set -x
## START STANDARD BUILD SCRIPT INCLUDE
# adjust relative paths as necessary
THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
. "${THIS_SCRIPT%/*}/../resources/build/build-utils.sh"
## END STANDARD BUILD SCRIPT INCLUDE
. "$KEYMAN_ROOT/android/KMAPro/build-play-store-notes.inc.sh"
echo Publishing APKs to Play Store
#
# Prevents 'clear' on exit of mingw64 bash shell
#
SHLVL=0
display_usage ( ) {
echo "build-publish.sh [-no-daemon] [-kmapro] [-fv]"
echo
echo "Publish app to the Play Store"
echo " -no-daemon Don't start the Gradle daemon. Use for CI"
echo " -kmapro Keyman for Android"
echo " -fv First Voices"
exit 1
}
NO_DAEMON=false
DO_KMAPRO=false
DO_FV=false
# Parse args
while [[ $# -gt 0 ]] ; do
key="$1"
case $key in
-no-daemon)
NO_DAEMON=true
;;
-kmapro)
DO_KMAPRO=true
;;
-fv)
DO_FV=true
;;
-h|-\?)
display_usage
;;
esac
shift # past argument
done
# Override JAVA_HOME to OpenJDK 11
set_java_home
echo
echo "NO_DAEMON: $NO_DAEMON"
echo "DO_KMAPRO: $DO_KMAPRO"
echo "DO_FV: $DO_FV"
echo
if [ "$NO_DAEMON" = true ]; then
DAEMON_FLAG=--no-daemon
else
DAEMON_FLAG=
fi
BUILD_FLAGS="publishReleaseApk"
echo "BUILD_FLAGS $BUILD_FLAGS"
# Publish Keyman for Android
if [ "$DO_KMAPRO" = true ]; then
# Copy Release Notes
generateReleaseNotes
cd "$KEYMAN_ROOT/android/KMAPro/"
./gradlew $DAEMON_FLAG $BUILD_FLAGS
fi
# Publish FV app
if [ "$DO_FV" = true ]; then
cd "$KEYMAN_ROOT/oem/firstvoices/android/"
./gradlew $DAEMON_FLAG $BUILD_FLAGS
fi

View file

@ -18,7 +18,7 @@ builder_describe \
configure \
build \
test \
"publish Publishes the APKs to the Play Store." \
"publish Publishes symbols to Sentry and the APKs to the Play Store." \
--ci+ \
--upload-sentry+ \
":engine=KMEA Keyman Engine for Android" \

View file

@ -19,7 +19,7 @@ Keyman does not use user accounts, so we are unable to identify which crash repo
### Developer Information
Keyman is developed and published by SIL International.
Keyman is developed and published by SIL Global.
You can contact SIL or provide any feedback using the app store.

View file

@ -3,3 +3,7 @@ title: What's New
---
Here are some of the new features we have added to Keyman 18.0 for Android:
* New menu to adjust longpress delay time (#12170, #12185)
* Support localizations for right-to-left languages (#12215)
* Handle additional actions for ENTER key (#12125, #12315)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View file

@ -0,0 +1,13 @@
---
title: Adjust Longpress Delay - Keyman for Android Help
---
## Adjust Longpress Delay
This menu is used to adjust the duration for triggering a longpress gesture.
Drag the slider to set the delay between 0.3 seconds to 1.5 seconds.
The default value is 0.5 seconds.
![](../../android_images/longpress-slider.png)

View file

@ -44,6 +44,11 @@ Click on this to bring up the Android system configuration for setting Keyman as
Click on this to [adjust the keyboard height](adjust-keyboard-height).
## Adjust longpress delay
![](../../android_images/ic_timelapse.png)
Click on this to [adjust the delay time](adjust-longpress-delay) for a longpress gesture.
## Spacebar Caption
Click on this to [change the displayed keyboard name](spacebar-caption) on the spacebar.

View file

@ -5,6 +5,7 @@
*/
#include <stdarg.h>
#include <wctype.h>
#include "utfcodec.hpp"
#include "km_u16.h"
@ -387,3 +388,43 @@ double u16tof(KMX_WCHAR* str16) {
std::string str = string_from_u16string(str16);
return strtof(str.c_str(), &pEnd);
}
/**
* @brief Trim whitespace from the start (left) of a string
* @param p Pointer to u16string
* @return Pointer to the string modified to remove leading whitespace
*/
KMX_WCHAR* u16ltrim(KMX_WCHAR* p) {
if (p && (u16len(p) > 0)) {
PKMX_WCHAR q = p;
while(iswspace(*q)) q++;
u16cpy(p, q);
}
return p;
}
/**
* @brief Trim whitespace from the end (right) of a string
* @param p Pointer to u16string
* @return Pointer to the string modified to remove trailing whitespace
*/
KMX_WCHAR* u16rtrim(KMX_WCHAR *p) {
if (p && (u16len(p) > 0)) {
PKMX_WCHAR q = p + u16len(p) - 1;
if (iswspace(*q)) {
while (iswspace(*q) && q > p) q--;
if (!iswspace(*q)) q++;
*q = '\0'; // delete first following whitespace
}
}
return p;
}
/**
* @brief Trim whitespace from both the start and end of a string
* @param p Pointer to u16string
* @return Pointer to the string modified to remove leading and trailing whitespace
*/
KMX_WCHAR* u16trim(KMX_WCHAR *p) {
return u16rtrim(u16ltrim(p));
}

View file

@ -74,3 +74,12 @@ KMX_CHAR* strrchr_slash(KMX_CHAR* Name);
const KMX_WCHAR* u16rchr_slash(KMX_WCHAR const* Name);
std::string toHex(int num1);
/** @brief Trim whitespace from the start (left) of a string */
KMX_WCHAR* u16ltrim(KMX_WCHAR* p);
/** @brief Trim whitespace from the end (right) of a string */
KMX_WCHAR* u16rtrim(KMX_WCHAR *p);
/** @brief Trim whitespace from both the start and end of a string */
KMX_WCHAR* u16trim(KMX_WCHAR *p);

View file

@ -1,12 +0,0 @@
{
"extends": "../../web/tsconfig.base.json",
"compilerOptions": {
// To help better support legacy Android devices
"downlevelIteration": true,
// Facilitates & simplifies stitching together the worker sourcemaps during the polyfill-concatenation step.
"inlineSourceMap": true,
// May not be set at the same time as the prior setting.
"sourceMap": false
}
}

View file

@ -1 +0,0 @@
The presence of this file tells CI to use the new builder_ style parameters for build.sh.

View file

@ -1,5 +0,0 @@
# Specifically here:
test.js
node_modules/
build/

View file

@ -1,68 +0,0 @@
`@keymanapp/models-types`
=========================
Declares TypeScript types and interfaces required to define **Lexical
Models**, **Word breaking functions**, and all things in between.
Install
-------
> (see below if you are working in the keymanapp/keyman repo!)
npm install --save-dev @keymanapp/models-types
Usage
-----
Say you are creating a **custom lexical model**. Then import this module
in your lexical model file!
```Typescript
// my-nifty-model.ts
import "@keymanapp/models-types";
export class MyNiftyClass implements LexicalModel {
configure(capabilities: Capabilities): Configuration {
// TODO: implement me!
throw new Error("Method not implemented.");
}
predict(transform: Transform, context: Context): ProbabilityMass<Suggestion>[] {
// TODO: implement me!
throw new Error("Method not implemented.");
}
wordbreak(context: Context): string {
// TODO: implement me!
throw new Error("Method not implemented.");
}
punctuation?: LexicalModelPunctuation;
}
```
If your are creating a **custom word breaker**, you would do the same:
```typescript
import "@keymanapp/models-types";
export let myShinyWordBreaker: WordBreakingFunction;
myShinyWordBreaker = function (phrase: string): Span[] {
// TODO: implement me!
throw new Error("Function not implemented")
}
```
Look at [index.d.ts](./index.d.ts) for documentation on each and every
type!
Usage within keymanapp/keyman repo
----------------------------------
To use it in other subprojects within keymanapp/keyman, ensure that this package
is linked using `"*"`. Add this dependency to your subproject like so:
```json
"dependencies": {
"@keymanapp/models-types": "*",
}
```

View file

@ -1,35 +0,0 @@
#!/usr/bin/env bash
#
# Packages the @keymanapp/models-types package.
#
## START STANDARD BUILD SCRIPT INCLUDE
# adjust relative paths as necessary
THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
. "${THIS_SCRIPT%/*}/../../../resources/build/builder.inc.sh"
## END STANDARD BUILD SCRIPT INCLUDE
. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh"
. "$KEYMAN_ROOT/resources/build/build-utils-ci.inc.sh"
builder_describe "Keyman model types package" \
"clean" \
"configure" \
"build" \
"test" \
"publish publish to npm" \
"--npm-publish+ For publish, do a npm publish, not npm pack (only for CI)" \
"--dry-run,-n don't actually publish, just dry run"
builder_describe_outputs \
configure /node_modules \
build /common/models/types/build/common/models/types/tsconfig.tsbuildinfo
builder_parse "$@"
#-------------------------------------------------------------------------------------------------------------------
builder_run_action clean rm -rf ./build/
builder_run_action configure verify_npm_setup
builder_run_action build tsc --build
builder_run_action test tsc test.ts -lib es6
builder_run_action publish builder_publish_npm

View file

@ -1,38 +0,0 @@
{
"name": "@keymanapp/models-types",
"description": "Type definitions in used in the modeling (lexical model/predictive text) component of Keyman.",
"types": "./index.d.ts",
"scripts": {
"test": "tsc test.ts -lib es6"
},
"repository": {
"type": "git",
"url": "https://github.com/keymanapp/keyman"
},
"keywords": [
"lmlayer",
"keyman",
"predictive",
"text",
"types",
"typing",
"typescript"
],
"author": "Marc Durdin <marc@keyman.com> (https://github.com/mcdurdin)",
"contributors": [
"Eddie Antonio Santos <Eddie.Santos@nrc-cnrc.gc.ca> (https://github.com/eddieantonio)",
"Joshua Horton"
],
"license": "MIT",
"bugs": {
"url": "https://github.com/keymanapp/keyman/issues"
},
"homepage": "https://github.com/keymanapp/keyman/tree/master/common/models/types#readme",
"devDependencies": {
"typescript": "^5.4.5"
},
"files": [
"README.md",
"index.d.ts"
]
}

View file

@ -1,9 +0,0 @@
{
"extends": "../tsconfig.kmw-worker-base.json",
"compilerOptions": {
"declaration": true,
"outDir": "build/",
},
"include": ["./*.ts"],
"exclude": ["test.ts"]
}

View file

@ -1 +0,0 @@
build/

File diff suppressed because it is too large Load diff

View file

@ -1,20 +0,0 @@
{
"extends": "../tsconfig.kmw-worker-base.json",
"compilerOptions": {
"baseUrl": "./",
"outDir": "build/obj",
"tsBuildInfoFile": "build/obj/tsconfig.tsbuildinfo",
"rootDir": "./src"
},
"references": [
{ "path": "../types" }
],
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"test/**/*.ts"
]
}

View file

@ -8,15 +8,9 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
. "${THIS_SCRIPT%/*}/../../resources/build/builder.inc.sh"
## END STANDARD BUILD SCRIPT INCLUDE
#
# TODO: future modules may include
# :sentry-manager \
#
builder_describe "Keyman common web modules" \
:keyman-version \
:types \
:utils \
clean \
configure \
build \

View file

@ -1,78 +0,0 @@
#!/usr/bin/env bash
## START STANDARD BUILD SCRIPT INCLUDE
# adjust relative paths as necessary
THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
. "$(dirname "$THIS_SCRIPT")/../../../resources/build/builder.inc.sh"
## END STANDARD BUILD SCRIPT INCLUDE
. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh"
BUNDLE_CMD="node $KEYMAN_ROOT/common/web/es-bundling/build/common-bundle.mjs"
################################ Main script ################################
builder_describe "Builds the gesture-recognition model for Web-based on-screen keyboards" \
"@/common/web/es-bundling build" \
"@/common/web/utils build" \
"clean" \
"configure" \
"build" \
"test" \
":module" \
":tools tools for testing & developing test resources for this module" \
"--ci sets the --ci option for child scripts (i.e, the $(builder_term test) action)"
builder_describe_outputs \
configure /node_modules \
build:module /common/web/gesture-recognizer/build/lib/index.mjs \
build:tools /common/web/gesture-recognizer/build/tools/lib/index.mjs
builder_parse "$@"
# TODO: build if out-of-date if test is specified
# TODO: configure if npm has not been run, and build is specified
function do_configure() {
verify_npm_setup
# Configure Web browser-engine testing environments. As is, this should only
# make changes when we update the dependency, even on our CI build agents.
playwright install
}
builder_run_action configure do_configure
if builder_start_action clean; then
rm -rf build/
builder_finish_action success clean
fi
if builder_start_action build:module; then
# Build
tsc --build $builder_verbose
$BUNDLE_CMD "${KEYMAN_ROOT}/common/web/gesture-recognizer/build/obj/index.js" \
--out "${KEYMAN_ROOT}/common/web/gesture-recognizer/build/lib/index.mjs" \
--format esm
builder_finish_action success build:module
fi
if builder_start_action build:tools; then
src/tools/build.sh build
builder_finish_action success build:tools
fi
if builder_start_action test:module; then
if builder_has_option --ci; then
./test.sh --ci
else
./test.sh
fi
builder_finish_action success test:module
fi
if builder_has_action test:tools && ! builder_has_action test:module; then
echo "The $(builder_term test:tools) action is currently a no-op."
fi

View file

@ -1,13 +0,0 @@
// @ts-check
import BASE_CONFIG from './web-test-runner.config.mjs';
import teamcityReporter from '@keymanapp/common-test-resources/test-runner-TC-reporter.mjs';
import { sessionStabilityReporter } from '@keymanapp/common-test-resources/test-runner-stability-reporter.mjs';
/** @type {import('@web/test-runner').TestRunnerConfig} */
export default {
...BASE_CONFIG,
reporters: [
teamcityReporter(), /* custom-written, for CI-friendly reports */
sessionStabilityReporter({ciMode: true})
]
}

View file

@ -1,69 +0,0 @@
// @ts-check
import { devices, playwrightLauncher } from '@web/test-runner-playwright';
import { defaultReporter, summaryReporter } from '@web/test-runner';
import { LauncherWrapper, sessionStabilityReporter } from '@keymanapp/common-test-resources/test-runner-stability-reporter.mjs';
import named from '@keymanapp/common-test-resources/test-runner-rename-browser.mjs'
import { esbuildPlugin } from '@web/dev-server-esbuild';
import { importMapsPlugin } from '@web/dev-server-import-maps';
import { dirname, resolve } from 'path';
import { fileURLToPath } from 'url';
const dir = dirname(fileURLToPath(import.meta.url));
const KEYMAN_ROOT = resolve(dir, '../../../../../../../');
/** @type {import('@web/test-runner').TestRunnerConfig} */
export default {
// debug: true,
browsers: [
new LauncherWrapper(playwrightLauncher({ product: 'chromium' })),
new LauncherWrapper(playwrightLauncher({ product: 'firefox' })),
playwrightLauncher({ product: 'webkit', concurrency: 1}),
named(new LauncherWrapper(playwrightLauncher({ product: 'webkit', concurrency: 1, createBrowserContext({browser}) {
return browser.newContext({...devices['iPhone X'] });
}})), 'iOS Phone (emulated)'),
named(new LauncherWrapper(playwrightLauncher({ product: 'chromium' , createBrowserContext({browser}) {
return browser.newContext({...devices['Pixel 4'] })
}})), 'Android Phone (emulated)'),
],
concurrency: 10,
nodeResolve: true,
files: [
'**/*.spec.html'
],
middleware: [
// Rewrites short-hand paths for test resources, making them fully relative to the repo root.
function rewriteResourcePath(context, next) {
if(context.url.startsWith('/resources/')) {
context.url = '/common/web/gesture-recognizer/src/test' + context.url;
}
return next();
}
],
plugins: [
esbuildPlugin({ ts: true, target: 'auto'}),
importMapsPlugin({
inject: {
importMap: {
// Redirects `eventemitter3` imports to the bundled ESM library. The standard import is an
// ESM wrapper around the CommonJS implementation, and WTR fails when it hits the CommonJS.
imports: {
'eventemitter3': '/node_modules/eventemitter3/dist/eventemitter3.esm.js'
}
}
}
})
],
reporters: [
summaryReporter({}), /* local-dev mocha-style */
sessionStabilityReporter({}),
defaultReporter({})
],
/*
Un-comment the next two lines for easy interactive debugging; it'll launch the
test page in your preferred browser.
*/
// open: true,
// manual: true,
rootDir: KEYMAN_ROOT
}

View file

@ -1,30 +0,0 @@
/*
* VS Code Intellisense needs this helper in order to properly use subpath imports in the
* test specs found under the `headless` subfolder. Otherwise, it'll report errors while
* editing - even if the tests themselves actually work.
*/
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../../build/test/",
// Not needed when testing via Node, and when `true` it seems to desync preset breakpoints
// worse than when `false`.
"importHelpers": false,
"allowJs": true,
"baseUrl": "../../",
"tsBuildInfoFile": "../../build/test/tsconfig.tsbuildinfo",
"rootDir": "./",
"typeRoots": ["./resources/@types", "../../../../../node_modules/@types"]
},
"include": [
"./auto/headless/**/*.ts",
"./resources/**/*.ts"
],
// Undo the base config's exclude.
"exclude": ["../../../../../node_modules/promise-status-async/lib/index.d.ts"],
"references": [
{"path": "../../"}
]
}

View file

@ -1,84 +0,0 @@
#!/usr/bin/env bash
## START STANDARD BUILD SCRIPT INCLUDE
# adjust relative paths as necessary
THIS_SCRIPT="$(greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null || readlink -f "${BASH_SOURCE[0]}")"
. "$(dirname "$THIS_SCRIPT")/../../../resources/build/build-utils.sh"
## END STANDARD BUILD SCRIPT INCLUDE
. $KEYMAN_ROOT/resources/shellHelperFunctions.sh
# This script runs from its own folder
cd "$(dirname $THIS_SCRIPT)"
################################ Main script ################################
builder_describe "Runs all tests for the gesture-recognizer module" \
"@/common/web/gesture-recognizer" \
"test+" \
":headless Runs headless user tests" \
":browser Runs browser-based user tests" \
"--ci Uses CI-based test configurations & emits CI-friendly test reports"
builder_parse "$@"
# TODO: build if out-of-date if test is specified
# TODO: configure if npm has not been run, and build is specified
# START - Script parameter configuration
REPORT_STYLE="local" # Default setting.
if builder_has_option --ci; then
REPORT_STYLE="ci"
echo "Replacing user-friendly test reports & configurations with CI-friendly versions."
fi
# END - Script parameter configuration
test-headless ( ) {
# During debugging, "--slow 0" allows reporting the duration of ALL tests, not just the ones that run long.
# Can be useful... but probably shouldn't be the default.
MOCHA_FLAGS=
if [ $REPORT_STYLE == "ci" ]; then
MOCHA_FLAGS="$MOCHA_FLAGS --reporter mocha-teamcity-reporter"
fi
# The currently-bundled declaration file for this package generates errors when compiling against it
# with current tsc versions.
rm -f "${KEYMAN_ROOT}/node_modules/promise-status-async/lib/index.d.ts"
tsc -b ./src/test/tsconfig.json
c8 mocha --recursive $MOCHA_FLAGS ./build/test/auto/headless/
}
test-browser ( ) {
local WTR_DEBUG=
local WTR_CONFIG=
if [[ $# -eq 1 && $1 == "debug" ]]; then
WTR_DEBUG=" --manual"
elif [ $REPORT_STYLE != "local" ]; then
WTR_CONFIG=.CI
fi
web-test-runner --config src/test/auto/browser/web-test-runner${WTR_CONFIG}.config.mjs ${WTR_DEBUG}
}
if builder_start_action test:headless; then
test-headless
builder_finish_action success test:headless
fi
if builder_start_action test:browser; then
if builder_has_option --debug; then
echo "Running browser-based unit tests in debug-mode configuration..."
echo
echo "${COLOR_YELLOW}You must manually terminate this mode (CTRL-C) for the script to exit.${COLOR_RESET}"
sleep 2
test-browser debug
else
test-browser
fi
builder_finish_action success test:browser
fi

View file

@ -1,3 +0,0 @@
{
"extends": "../../web/tsconfig.base.json"
}

View file

@ -14,7 +14,7 @@ module.exports = {
overrides: [
{
files: "src/**/*.ts",
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
},
],
rules: {

View file

@ -8,9 +8,11 @@
"unicode"
],
"type": "module",
"types": "./build/src/main.d.ts",
"exports": {
".": {
"es6-bundling": "./src/main.ts",
"types": "./build/src/main.d.ts",
"default": "./build/src/main.js"
}
},
@ -68,6 +70,7 @@
"src/kmx/kmx-plus.ts",
"src/kmx/kmx-builder.ts",
"src/kmx/element-string.ts",
"src/lexical-model-types.ts",
"src/kmx/string-list.ts",
"src/ldml-keyboard/ldml-keyboard-testdata-xml.ts",
"src/ldml-keyboard/unicodeset-parser-api.ts",

View file

@ -7,6 +7,11 @@
// writing
//
/**
* On screen keyboard description consisting of specific layouts for tablet, phone,
* and desktop. Despite its name, this format is used for both touch layouts and
* hardware-style layouts.
*/
export interface TouchLayoutFile {
tablet?: TouchLayoutPlatform;
phone?: TouchLayoutPlatform;
@ -17,6 +22,7 @@ export type TouchLayoutFont = string;
export type TouchLayoutFontSize = string;
export type TouchLayoutDefaultHint = "none"|"dot"|"longpress"|"multitap"|"flick"|"flick-n"|"flick-ne"|"flick-e"|"flick-se"|"flick-s"|"flick-sw"|"flick-w"|"flick-nw";
/** touch layout specification for a specific platform like phone or tablet */
export interface TouchLayoutPlatform {
font?: TouchLayoutFont;
fontsize?: TouchLayoutFontSize;
@ -27,6 +33,7 @@ export interface TouchLayoutPlatform {
export type TouchLayoutLayerId = string; // pattern = /^[a-zA-Z0-9_-]+$/
/** a layer with rows of keys on a touch layout */
export interface TouchLayoutLayer {
id: TouchLayoutLayerId;
row: TouchLayoutRow[];
@ -34,6 +41,7 @@ export interface TouchLayoutLayer {
export type TouchLayoutRowId = number;
/** a row of keys on a touch layout */
export interface TouchLayoutRow {
id: TouchLayoutRowId;
key: TouchLayoutKey[];
@ -62,22 +70,40 @@ export const PRIVATE_USE_IDS = [
*
* Make sure that when one is updated, the other also is. TS types are compile-time only,
* so the run-time-accessible mapping in activeLayout.ts cannot be auto-generated by TS. */
/** defines a key on a touch layout */
export interface TouchLayoutKey {
/** key id: used to find key in VKDictionary, or a standard key from the K_ enumeration */
id?: TouchLayoutKeyId;
/** text to display on key cap */
text?: string;
/**
* the modifier combination (not layer) that should be used in key events,
* for this key, overriding the layer that the key is a part of.
*/
layer?: TouchLayoutLayerId;
/** the next layer to switch to after this key is pressed */
nextlayer?: TouchLayoutLayerId;
/** font */
font?: TouchLayoutFont;
/** fontsize */
fontsize?: TouchLayoutFontSize;
/** the type of key */
sp?: TouchLayoutKeySp;
/** padding */
pad?: TouchLayoutKeyPad;
/** width of the key */
width?: TouchLayoutKeyWidth;
/** longpress keys, also known as subkeys */
sk?: TouchLayoutSubKey[];
/** flicks */
flick?: TouchLayoutFlick;
/** multitaps */
multitap?: TouchLayoutSubKey[];
/** hint e.g. for longpress */
hint?: string;
};
/** key type like regular key, framekeys, deadkeys, blank, etc. */
export const enum TouchLayoutKeySp {
normal=0,
/** A 'frame' key, such as Shift or Enter, which is styled accordingly; uses
@ -102,29 +128,54 @@ export const enum TouchLayoutKeySp {
spacer=10
};
/** padding for a key */
export type TouchLayoutKeyPad = number; // 0-100000
/** width of a key */
export type TouchLayoutKeyWidth = number; // 0-100000
/** defines a subkey */
export interface TouchLayoutSubKey {
/** key id: used to find key in VKDictionary, or a standard key from the K_ enumeration */
id: TouchLayoutKeyId;
/** text to display on key cap */
text?: string;
/**
* the modifier combination (not layer) that should be used in key events,
* for this key, overriding the layer that the key is a part of.
*/
layer?: TouchLayoutLayerId;
/** the next layer to switch to after this key is pressed */
nextlayer?: TouchLayoutLayerId;
/** font */
font?: TouchLayoutFont;
/** fontsize */
fontsize?: TouchLayoutFontSize;
/** the type of key */
sp?: TouchLayoutKeySp;
/** padding */
pad?: TouchLayoutKeyPad;
/** width of the key */
width?: TouchLayoutKeyWidth;
/** use this subkey if no other selected */
default?: boolean; // Only used for longpress currently
};
/** defines all possible flicks for a key */
export interface TouchLayoutFlick {
/** flick up (north) */
n?: TouchLayoutSubKey;
/** flick down (south) */
s?: TouchLayoutSubKey;
/** flick right (east) */
e?: TouchLayoutSubKey;
/** flick left (west) */
w?: TouchLayoutSubKey;
/** flick up-right (north-east) */
ne?: TouchLayoutSubKey;
/** flick up-left (north-west) */
nw?: TouchLayoutSubKey;
/** flick down-right (south-east) */
se?: TouchLayoutSubKey;
/** flick down-left (south-west) */
sw?: TouchLayoutSubKey;
};

View file

@ -1,7 +1,7 @@
import { constants } from '@keymanapp/ldml-keyboard-constants';
import { DependencySections, StrsItem, UsetItem } from './kmx-plus.js';
import { ElementParser, ElementSegment, ElementType } from '../../ldml-keyboard/pattern-parser.js';
import { util } from '@keymanapp/common-types';
import * as util from '../../util/util.js';
import MATCH_HEX_ESCAPE = util.MATCH_HEX_ESCAPE;
import unescapeOneQuadString = util.unescapeOneQuadString;

View file

@ -2,8 +2,8 @@ import { constants } from '@keymanapp/ldml-keyboard-constants';
import * as r from 'restructure';
import { ElementString } from './element-string.js';
import { ListItem } from '../../ldml-keyboard/string-list.js';
import { util } from '@keymanapp/common-types';
import { KMX } from '@keymanapp/common-types';
import * as util from '../../util/util.js';
import * as KMX from '../kmx.js';
import { UnicodeSetParser, UnicodeSet } from '../../ldml-keyboard/unicodeset-parser-api.js';
import { VariableParser } from '../../ldml-keyboard/pattern-parser.js';
import { MarkerParser } from '../../ldml-keyboard/pattern-parser.js';

View file

@ -15,14 +15,14 @@
*
* See also: https://developer.mozilla.org/en-US/docs/Web/API/USVString
*/
declare type USVString = string;
export type USVString = string;
declare type CasingForm = 'lower' | 'initial' | 'upper';
export type CasingForm = 'lower' | 'initial' | 'upper';
/**
* Represents one lexical entry and its probability..
*/
type TextWithProbability = {
export type TextWithProbability = {
/**
* A lexical entry (word) offered by the model.
*
@ -42,7 +42,7 @@ type TextWithProbability = {
* Used to facilitate edit-distance calculations by allowing the LMLayer to
* efficiently search the model's lexicon in a Trie-like manner.
*/
declare interface LexiconTraversal {
export interface LexiconTraversal {
/**
* Provides an iterable pattern used to search for words with a 'keyed' prefix matching
* the current traversal state's prefix when a new character is appended. Iterating
@ -116,7 +116,7 @@ declare interface LexiconTraversal {
/**
* The model implementation, within the Worker.
*/
declare interface LexicalModel {
export interface LexicalModel {
/**
* Processes `config` messages, configuring the newly-loaded model based on the host
* platform's capability restrictions.
@ -263,7 +263,7 @@ declare interface LexicalModel {
* first, you delete the specified amount amount from the left
* and right, then you insert the provided text.
*/
declare interface Transform {
export interface Transform {
/**
* Facilitates use of unique identifiers for tracking the Transform and
* any related data from its original source, as the reference cannot be
@ -298,7 +298,7 @@ declare interface Transform {
/**
* A concrete suggestion
*/
declare interface Suggestion {
export interface Suggestion {
/**
* Indicates the externally-supplied id of the Transform that prompted
* the Suggestion. Automatically handled by the LMLayer; models should
@ -341,11 +341,11 @@ declare interface Suggestion {
autoAccept?: boolean
}
interface Reversion extends Suggestion {
export interface Reversion extends Suggestion {
tag: 'revert';
}
interface Keep extends Suggestion {
export interface Keep extends Suggestion {
tag: 'keep';
/**
@ -368,12 +368,12 @@ interface Keep extends Suggestion {
*
* If left undefined, the consumers will assume this is a prediction.
*/
type SuggestionTag = undefined | 'keep' | 'revert' | 'correction' | 'emoji';
export type SuggestionTag = undefined | 'keep' | 'revert' | 'correction' | 'emoji';
/**
* The text and environment surrounding the insertion point (text cursor).
*/
declare interface Context {
export interface Context {
/**
* Up to maxLeftContextCodeUnits code units of Unicode scalar value
* (i. e., characters) to the left of the insertion point in the
@ -413,7 +413,7 @@ declare interface Context {
* from ambiguous text sequences. Designed for use with fat-finger correction
* and similar typing ambiguities.
*/
interface ProbabilityMass<T> {
export interface ProbabilityMass<T> {
/**
* An individual sample from a Distribution over the same type.
*/
@ -426,12 +426,12 @@ interface ProbabilityMass<T> {
p: number;
}
declare type Distribution<T> = ProbabilityMass<T>[];
export type Distribution<T> = ProbabilityMass<T>[];
/**
* A type augmented with an optional probability.
*/
type Outcome<T> = T & {
export type Outcome<T> = T & {
/**
* [optional] probability of this outcome.
*/
@ -441,7 +441,7 @@ type Outcome<T> = T & {
/**
* A type augmented with a probability.
*/
type WithOutcome<T> = T & {
export type WithOutcome<T> = T & {
/**
* Probability of this outcome.
*/
@ -458,7 +458,7 @@ type WithOutcome<T> = T & {
* prediction, as well as what operations the keyboard is allowed to do on the
* underlying buffer.
*/
declare interface Capabilities {
export interface Capabilities {
/**
* The maximum amount of UTF-16 code points that the keyboard will provide to
* the left of the cursor, as an integer.
@ -482,7 +482,7 @@ declare interface Capabilities {
/**
* Configuration of the LMLayer, sent back to the keyboard.
*/
declare interface Configuration {
export interface Configuration {
/**
* How many UTF-16 code units maximum to send as the context to the
* left of the cursor ("left" in the Unicode character stream).
@ -538,14 +538,14 @@ declare interface Configuration {
* @returns an array of spans from the phrase, in order as they appear in the
* phrase, each span which representing a word.
*/
declare interface WordBreakingFunction {
export interface WordBreakingFunction {
// invariant: span[i].end <= span[i + 1].start
// invariant: for all span[i] and span[i + 1], there does not exist a span[k]
// where span[i].end <= span[k].start AND span[k].end <= span[i + 1].start
(phrase: string): Span[];
}
declare interface CasingFunction {
export interface CasingFunction {
(caseToApply: CasingForm, text: string, defaultApplyCasing?: CasingFunction): string;
}
@ -553,7 +553,7 @@ declare interface CasingFunction {
* A span of text in a phrase. This is usually meant to represent words from a
* pharse.
*/
declare interface Span {
export interface Span {
// invariant: start < end (empty spans not allowed)
readonly start: number;
// invariant: end > end (empty spans not allowed)
@ -572,7 +572,7 @@ declare interface Span {
/**
* Options for various punctuation to use in suggestions.
*/
interface LexicalModelPunctuation {
export interface LexicalModelPunctuation {
/**
* The quotes that appear in "keep" suggestions, e.g., keep what the user
* typed verbatim.

View file

@ -29,3 +29,5 @@ export * as KMXPlus from './kmx/kmx-plus/kmx-plus.js';
export { UnicodeSetParser, UnicodeSet } from './ldml-keyboard/unicodeset-parser-api.js';
export { VariableParser, MarkerParser } from './ldml-keyboard/pattern-parser.js';
export { ElementString } from './kmx/kmx-plus/element-string.js';
export { USVString, CasingForm, CasingFunction, TextWithProbability, LexiconTraversal, LexicalModel, LexicalModelPunctuation, Transform, Suggestion, Reversion, Keep, SuggestionTag, Context, Distribution, Outcome, WithOutcome, ProbabilityMass, Configuration, Capabilities, WordBreakingFunction, Span } from './lexical-model-types.js';

View file

@ -1,12 +1,12 @@
/// <reference path="./index.d.ts" />
/**
* This file "tests" the exports from the main module.
*
*
* Since the exports are all types, the "test" here is that the type can be
* imported and compiled without any compiler errors.
*/
import { USVString, Transform, Suggestion, SuggestionTag, Context, Capabilities, Configuration, Distribution, WordBreakingFunction, Span, LexicalModelPunctuation, ElementString, KMXPlus } from '@keymanapp/common-types';
export let u: USVString;
export let l: Transform
export let s: Suggestion;
@ -17,4 +17,9 @@ export let conf: Configuration;
export let d: Distribution<Suggestion>;
export let wbf: WordBreakingFunction;
export let sp: Span;
export let lmp: LexicalModelPunctuation;
export let lmp: LexicalModelPunctuation;
// try some of the other types - that should still work
export let elemString: ElementString;
export let section: KMXPlus.Section;

View file

@ -11,11 +11,12 @@
},
"include": [
"**/test-*.ts",
"**/*.tests.ts",
"./helpers/*.ts",
],
"references": [
{ "path": "../../keyman-version" },
{ "path": "../../../../core/include/ldml/"},
{ "path": "../" },
]
],
}

View file

@ -7,3 +7,4 @@ delphi/**/*.~*
delphi/**/__recovery/
delphi/**/__history/
delphi/general/keymanversion_build.inc
delphi/ext/cef4delphi/packages/CEF4Delphi.res

View file

@ -110,6 +110,10 @@
#define REGSZ_KeyboardHotkeysAreToggle "hotkeys are toggles"
#define REGSZ_DeadkeyConversionMode "deadkey conversion mode" // CU // I4552
#define REGSZ_ZapVirtualKeyCode "zap virtual key code" // LM, defaults to 0x0E (_VK_PREFIX_DEFAULT)
/* Default is to only use left modifier in hotkeys trigger */
#define REGSZ_AllowRightModifierHotKey "allow right modifier for hotkey"
/*
Debug flags
These are all stored in HKCU\Software\Keyman\Debug
@ -121,13 +125,7 @@
#define REGSZ_Flag_ShouldSerializeInput "Flag_ShouldSerializeInput"
/* REGSZ_Keyman_Debug DWORD: Use old non-chiral Win32 API RegisterHotkey instead of left-only hotkeys */
#define REGSZ_Flag_UseRegisterHotkey "Flag_UseRegisterHotkey"
/* REGSZ_Flag_UseCachedHotkeyModifierState DWORD: Use old cached modifier state when checking hotkeys; ignores UseRegisterHotkey if FALSE */
#define REGSZ_Flag_UseCachedHotkeyModifierState "Flag_UseCachedHotkeyModifierState"
/* DWORD: Enable/disable deep TSF integration, default enabled; 0 = disabled, 1 = enabled, 2 = default */

View file

@ -1,299 +0,0 @@
# DEBUG=1
# TODO: this should be a shared Defines.mak for common,developer,windows. So we
# need to move any project-specific stuff into a defines-windows.mak,
# defines-etc.mak
#
# Paths
#
!IFNDEF KEYMAN_ROOT
!ERROR KEYMAN_ROOT must be defined!
!ENDIF
# TODO: COMMON_ROOT should be common\windows
COMMON_ROOT=$(KEYMAN_ROOT)\common\windows\delphi
WINDOWS_ROOT=$(KEYMAN_ROOT)\windows
OUTLIB=$(WINDOWS_ROOT)\lib
COMMON_OUTLIB=$(KEYMAN_ROOT)\windows\lib
COMMON_BIN=$(KEYMAN_ROOT)\windows\bin
# INCLUDE=$(ROOT)\src\global\inc;$(INCLUDE)
!IFDEF DEBUG
GO_FAST=1
MAKEFLAG_DEBUG="DEBUG=$(DEBUG)"
DELPHI_MSBUILD_FLAG_DEBUG="/p:Config=Debug"
!ELSE
!IFDEF TEAMCITY_PR_NUMBER
GO_FAST=1
!ENDIF
DELPHI_MSBUILD_FLAG_DEBUG="/p:Config=Release"
!ENDIF
!IFDEF USERDEFINES
MAKEFLAG_USERDEFINES="USERDEFINES=$(USERDEFINES)"
!ENDIF
!IFDEF SC_TIMESTAMP
MAKEFLAG_SC_TIMESTAMP="SC_TIMESTAMP=$(SC_TIMESTAMP)"
!ENDIF
!IFDEF BUILDHELP
MAKEFLAG_BUILDHELP="BUILDHELP=$(BUILDHELP)"
!ENDIF
!IFDEF LINT
MAKEFLAG_LINT="LINT=$(LINT)"
!ENDIF
!IFDEF NOUI
MAKEFLAG_QUIET="NOUI=$(NOUI)"
!ELSE
!IFDEF QUIET
MAKEFLAG_QUIET="QUIET=$(QUIET)"
!ENDIF
!ENDIF
!IFDEF RELEASE_OEM
MAKEFLAG_RELEASE_OEM="RELEASE_OEM=$(RELEASE_OEM)"
!ENDIF
#
# USERDEFINES allows the developer to specify overrides for various settings. We need a variable
# because Makefiles cannot test for file existence
#
# TODO: can we eliminate this?
!ifdef USERDEFINES
!include $(WINDOWS_ROOT)\src\UserDefines.mak
!endif
#
# Delphi Compiler Configuration - Delphi 10.3.2
#
!IFNDEF DELPHI_VERSION
DELPHI_VERSION=20.0
!ENDIF
DCC32PATH=C:\Program Files (x86)\Embarcadero\Studio\$(DELPHI_VERSION)\bin
#
# Pass local configuration through to sub-instances of MAKE
#
MAKE="nmake" /C $(MAKEFLAG_QUICK_BUILD_KEYMAN) $(MAKEFLAG_USERDEFINES) $(MAKEFLAG_DEBUG) $(MAKEFLAG_BUILDHELP) $(MAKEFLAG_BUILDRTF) $(MAKEFLAG_SC_TIMESTAMP) $(MAKEFLAG_LINT) $(MAKEFLAG_QUIET) $(MAKEFLAG_RELEASE_OEM)
#
# Delphi build commands
#
!IFDEF DEBUG
TARGET_PATH=Debug
!ELSE
TARGET_PATH=Release
!ENDIF
!IFDEF LINT
DELPHIWARNINGS=-W+MESSAGE_DIRECTIVE -W+IMPLICIT_STRING_CAST -W+IMPLICIT_STRING_CAST_LOSS -W+EXPLICIT_STRING_CAST -W+EXPLICIT_STRING_CAST_LOSS -W+CVT_WCHAR_TO_ACHAR -W+CVT_NARROWING_STRING_LOST -W+CVT_ACHAR_TO_WCHAR -W+CVT_WIDENING_STRING_LOST -W+UNICODE_TO_LOCALE -W+LOCALE_TO_UNICODE -W+IMPLICIT_VARIANTS
!ELSE
DELPHIWARNINGS=-W-MESSAGE_DIRECTIVE -W-IMPLICIT_STRING_CAST -W-IMPLICIT_STRING_CAST_LOSS -W-EXPLICIT_STRING_CAST -W-EXPLICIT_STRING_CAST_LOSS -W-CVT_WCHAR_TO_ACHAR -W-CVT_NARROWING_STRING_LOST -W-CVT_ACHAR_TO_WCHAR -W-CVT_WIDENING_STRING_LOST -W-UNICODE_TO_LOCALE -W-LOCALE_TO_UNICODE -W-IMPLICIT_VARIANTS -W-IMPLICIT_INTEGER_CAST_LOSS -W-IMPLICIT_CONVERSION_LOSS -W-COMBINING_SIGNED_UNSIGNED64 -W-COMBINING_SIGNED_UNSIGNED64
!ENDIF
DELPHIDPRPARAMS=-Q -B -GD -H -VT -^$C+ -^$D+ -^$J+ -^$L+ -^$O+ -^$Q- -^$R- -^$W+ -^$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -NU.\obj\Win32\$(TARGET_PATH) -E.\bin\Win32\$(TARGET_PATH)
DELPHIDPRPARAMS64=-Q -B -GD -H -VT -^$C+ -^$D+ -^$J+ -^$L+ -^$O+ -^$Q- -^$R- -^$W+ -^$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -NU.\obj\Win64\$(TARGET_PATH) -E.\bin\Win64\$(TARGET_PATH)
DELPHIDPKPARAMS=-Q -B -GD -VT -^$C+ -^$D+ -^$J+ -^$L+ -^$O+ -^$Q- -^$R- -^$W+ -^$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -LE$(OUTLIB) -LN$(OUTLIB) -NSData -NUobj\Win32\$(TARGET_PATH)
COMMON_DELPHIDPKPARAMS=-Q -B -GD -VT -^$C+ -^$D+ -^$J+ -^$L+ -^$O+ -^$Q- -^$R- -^$W+ -^$Y+ -E. $(DELPHIWARNINGS) -I$(DELPHIINCLUDES) -U$(DELPHIINCLUDES) -R$(DELPHIINCLUDES) -NSVcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Web;Soap;Winapi;System.Win -LE$(COMMON_OUTLIB) -LN$(COMMON_OUTLIB) -NSData -NUobj\Win32\$(TARGET_PATH)
# we are using cmd /c because dcc32/dcc64 are failing on direct execution
# from nmake
DCC32=cmd /c "$(DCC32PATH)\dcc32.exe" $(DELPHIDPRPARAMS)
DCC32DPK=cmd /c "$(DCC32PATH)\dcc32.exe" $(DELPHIDPKPARAMS)
COMMON_DCC32DPK=cmd /c "$(DCC32PATH)\dcc32.exe" $(COMMON_DELPHIDPKPARAMS)
DCC64=cmd /c "$(DCC32PATH)\dcc64.exe" $(DELPHIDPRPARAMS64) -N0x64\ -Ex64\
#
# Delphi MSBuild related commands and macros
#
DELPHI_MSBUILD="$(COMMON_ROOT)\tools\msbuild-wrapper.bat" "$(DCC32PATH)" $(DELPHI_MSBUILD_FLAG_DEBUG)
!IFDEF NODELPHI
DCC32=echo skipping
DCC32DPK=echo skipping
DCC64=echo skipping
DELPHI_MSBUILD=echo skipping
!ENDIF
# Visual C++ x86, x64
WIN32_TARGET_PATH=bin\Win32\$(TARGET_PATH)
X64_TARGET_PATH=bin\x64\$(TARGET_PATH)
# Delphi x86, x64
# WIN32_TARGET_PATH=...
WIN64_TARGET_PATH=bin\Win64\$(TARGET_PATH)
#
# Shared devtools app for common Delphi source manipulation
#
DEVTOOLS=$(COMMON_ROOT)\tools\devtools\$(WIN32_TARGET_PATH)\devtools.exe
#
# Other program build commands
#
BRCC32=rc.exe
HHC="C:\Program Files (x86)\HTML Help Workshop\hhc.exe"
NMAKE=nmake.exe
CL=cl.exe
MSBUILD=msbuild.exe
# /maxcpucount see https://devblogs.microsoft.com/cppblog/precompiled-header-pch-issues-and-recommendations/
MT=mt.exe
VCBUILD=error
!IFDEF DEBUG
MSBUILD_BUILD=/t:Build /p:Configuration=Debug
MSBUILD_CLEAN=/t:Clean /p:Configuration=Debug
!ELSE
MSBUILD_BUILD=/t:Rebuild /p:Configuration=Release
MSBUILD_CLEAN=/t:Clean /p:Configuration=Release
!ENDIF
COPY=copy
ISXBUILD=C:\PROGRA~1\INSTALLSHIELD\Express\System\IsExpCmdBld
WZZIPPATH="C:\program files\7-zip\7z.exe"
!IFDEF GO_FAST
WZZIP=$(WZZIPPATH) a -mx1
!ELSE
WZZIP=$(WZZIPPATH) a -mx9
!ENDIF
WZUNZIP=$(WZZIPPATH) e
# we are using cmd /c because tds2dbg is failing on direct execution
# from nmake
TDS2DBG=cmd /c $(KEYMAN_ROOT)\common\windows\bin\tools\tds2dbg
SENTRYTOOL=$(COMMON_ROOT)\tools\sentrytool\$(WIN32_TARGET_PATH)\sentrytool.exe
SENTRYTOOL_DELPHIPREP=$(SENTRYTOOL) delphiprep -r $(KEYMAN_ROOT) -i $(DELPHIINCLUDES)
WIXPATH="c:\program files (x86)\WiX Toolset v3.11\bin"
WIXCANDLE=$(WIXPATH)\candle.exe -wx -nologo
!IFDEF LINT
WIXLIGHTLINT=
!ELSE
# we suppress ICE82 because it reports spurious errors with merge module keymanengine to do with duplicate sequence numbers. Safely ignored.
WIXLIGHTLINT= -sice:ICE82 -sice:ICE80
!ENDIF
!IFDEF GO_FAST
# for debug builds, we turn off compression because it is so hideously slow
# for test builds, we also turn off compression
WIXLIGHTCOMPRESSION=-dcl:none
!ELSE
WIXLIGHTCOMPRESSION=-dcl:high
!ENDIF
WIXLIGHT=$(WIXPATH)\light.exe -wx -nologo $(WIXLIGHTLINT) $(WIXLIGHTCOMPRESSION)
WIXLIT=$(WIXPATH)\lit.exe -wx -nologo
WIXHEAT=$(WIXPATH)\heat.exe
LINKPATH=link.exe
#
# Certificates and code signing
#
!ifdef SIGNCODE_BUILD
MAKE=$(MAKE) "SIGNCODE_BUILD=$(SIGNCODE_BUILD)"
!else
MAKE=$(MAKE)
!endif
#
# To get a .pfx from a .spc and .pvk, run pvk2pfx.exe
#
!IFNDEF SC_PFX_SHA1
SC_PFX_SHA1="$(COMMON_ROOT)\tools\certificates\keymantest-sha1.pfx"
!ENDIF
!IFNDEF SC_PFX_SHA256
SC_PFX_SHA256="$(COMMON_ROOT)\tools\certificates\keymantest-sha256.pfx"
!ENDIF
!IFNDEF SC_URL
SC_URL="https://keyman.com/"
!ENDIF
!IFNDEF SC_PWD
SC_PWD=""
!ENDIF
SIGNCODE=@"$(KEYMAN_ROOT)\common\windows\signtime.bat" signtool.exe $(SC_PFX_SHA1) $(SC_PFX_SHA256) $(SC_URL) $(SC_PWD)
#
# On some computers, the PLATFORM environment variable is set to x86. This can break msbuild
# with our projects. This may be resolvable in the future, but for now the easy fix is ...
#
PLATFORM=Win32
#
# mkver commands. mkver determines tag from the local build environment variables
# in the same way as /resources/build/build-utils.sh.
#
!ifdef GIT_BASH_FOR_KEYMAN
MKVER_SH=$(GIT_BASH_FOR_KEYMAN) $(KEYMAN_ROOT)\common\windows\mkver.sh
!else
MKVER_SH=start /wait $(KEYMAN_ROOT)\common\windows\mkver.sh
!endif
MKVER_M=$(MKVER_SH) manifest.in manifest.xml
MKVER_U=$(MKVER_SH)
#
# Symstore
#
# KEYMAN_SYMSTOREPATH defaults to sibling folder "symbols". If it is not present,
# then we won't attempt to write symbols to the store.
!IFNDEF KEYMAN_SYMSTOREPATH
KEYMAN_SYMSTOREPATH=$(KEYMAN_ROOT)\..\symbols
!ENDIF
# Nearly matches algorithm from resources/build/build-utils.sh
# For now, we'll use it only for SYMSTORE, where it is for reference
# only. Thus using the variable name __VERSION_WITH_TAG. Issues:
# 1. always appends tier, even for stable
# 2. test builds will append a branch name for master/beta/stable-x.y
# 3. this is only available for `make symbols` (VERSION_WIN, VERSION_TIER
# are defined in Targets.mak only here)
# Fixing this properly would be possible but take a fair bit more
# work than I want to do just now. The intent is to make it possible to find
# symbols in the symstore index which we can purge later on.
__VERSION_WITH_TAG=$(VERSION_WIN)-$(VERSION_TIER)
!IFNDEF TEAMCITY_VERSION
__VERSION_WITH_TAG=$(__VERSION_WITH_TAG)-local
!ELSE
!IFDEF TEAMCITY_PR_NUMBER
__VERSION_WITH_TAG=$(__VERSION_WITH_TAG)-test-$(TEAMCITY_PR_NUMBER)
!ENDIF
!ENDIF
# This command depends on VERSION_WIN and VERSION_TIER being defined, through
# `make symbols` (i.e. don't call `make wrap-symbols`)
SYMSTORE="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore.exe" add \
/s "$(KEYMAN_SYMSTOREPATH)" \
/v "$(VERSION_WIN)" \
/c "Version: $(__VERSION_WITH_TAG)" \
/compress /f
CLEAN=-del /S /Q

View file

@ -1,59 +0,0 @@
#
# Header.mak - used for makefiles which are in parent folders
#
HEADER_MAK=1
!IFNDEF TARGETS
!ERROR You must define the targets before including the Header.mak file!
!ENDIF
!IFNDEF KEYMAN_ROOT
!ERROR KEYMAN_ROOT must be defined!
!ENDIF
# This path will need to be updated if the root path changes
!include $(KEYMAN_ROOT)\common\windows\delphi\Defines.mak
#
# The targets build, signcode, symbols are standard
# targets for all projects
#
build: $(BUILDPREREQ)
$(MAKE) "TARGET=build" $(TARGETS)
!IFNDEF NOTARGET_SIGNCODE
signcode:
$(MAKE) "TARGET=signcode" $(TARGETS)
symbols:
$(MAKE) "TARGET=symbols" $(TARGETS)
!ELSE
signcode:
rem no signcode required
symbols:
rem no symbols required
!ENDIF
build-release:
!IFDEF RELEASE_TARGETS
$(MAKE) "TARGET=build-release" $(RELEASE_TARGETS)
!ELSE
@rem
!ENDIF
clean:
$(MAKE) "TARGET=clean" $(TARGETS) $(CLEANS)
install:
$(MAKE) "TARGET=install" $(TARGETS)
test-manifest:
!IFDEF MANIFESTS
$(MAKE) "TARGET=test-manifest" $(MANIFESTS)
!ELSE
$(MAKE) "TARGET=test-manifest" $(TARGETS)
!ENDIF

View file

@ -1,14 +0,0 @@
!CMDSWITCHES +S
def-clean:
$(CLEAN) *.err *.stat *.dproj.local *.Build.CppClean.Log *.suo *.jdbg *.dbg *.dcu *.~* *.dsk *.exe *.rsm *.ncb *.opt *.pch *.plg *.aps *.001 *.sbr *.dep *.drc *.bak *.pdb *.lib *.cod *.ilk *.tds vc80.idb *.map *.bsc version.res manifest.xml manifest.res >nul 2>nul
$(CLEAN) ExcMagic.Debug *.wixpdb *.identcache *.embed.manifest *.embed.manifest.res *.intermediate.manifest error.log >nul 2>nul
if exist bin rd /s/q bin
if exist obj rd /s/q obj
!CMDSWITCHES -S
# This virtual rule forces targets which are folders, e.g. `kmshell` to
# always execute
.virtual:
rem always execute

View file

@ -13,31 +13,6 @@
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android' and '$(Base)'=='true') or '$(Base_Android)'!=''">
<Base_Android>true</Base_Android>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Base)'=='true') or '$(Base_Android64)'!=''">
<Base_Android64>true</Base_Android64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='iOSDevice32' and '$(Base)'=='true') or '$(Base_iOSDevice32)'!=''">
<Base_iOSDevice32>true</Base_iOSDevice32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='iOSDevice64' and '$(Base)'=='true') or '$(Base_iOSDevice64)'!=''">
<Base_iOSDevice64>true</Base_iOSDevice64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='iOSSimulator' and '$(Base)'=='true') or '$(Base_iOSSimulator)'!=''">
<Base_iOSSimulator>true</Base_iOSSimulator>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
@ -59,6 +34,12 @@
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_DcuOutput>.\obj\$(Platform)\$(Config)</DCC_DcuOutput>
<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
@ -77,23 +58,6 @@
<VerInfo_Locale>3081</VerInfo_Locale>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Android)'!=''">
<DCC_CBuilderOutput>None</DCC_CBuilderOutput>
<EnabledSysJars>android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Android64)'!=''">
<DCC_CBuilderOutput>None</DCC_CBuilderOutput>
<EnabledSysJars>android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar</EnabledSysJars>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_iOSDevice32)'!=''">
<DCC_CBuilderOutput>None</DCC_CBuilderOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_iOSDevice64)'!=''">
<DCC_CBuilderOutput>None</DCC_CBuilderOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_iOSSimulator)'!=''">
<DCC_CBuilderOutput>None</DCC_CBuilderOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType>
@ -113,6 +77,7 @@
<DCC_RemoteDebug>false</DCC_RemoteDebug>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_HppOutput>..\..\lib</DCC_HppOutput>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
@ -120,6 +85,11 @@
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_DebugInformation>0</DCC_DebugInformation>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<DCC_HppOutput>..\..\lib</DCC_HppOutput>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
@ -164,8 +134,6 @@
<Source Name="MainSource">common_components.dpk</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="c:\projects\keyman\app\windows\lib\DCPdelphi2009.bpl">File c:\projects\keyman\app\windows\lib\DCPdelphi2009.bpl not found</Excluded_Packages>
<Excluded_Packages Name="c:\projects\keyman\app\windows\lib\delphiprojectmanager.bpl">File c:\projects\keyman\app\windows\lib\delphiprojectmanager.bpl not found</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k260.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp260.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
@ -944,13 +912,6 @@
<ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
</Deployment>
<Platforms>
<Platform value="Android">False</Platform>
<Platform value="Android64">False</Platform>
<Platform value="iOSDevice32">False</Platform>
<Platform value="iOSDevice64">False</Platform>
<Platform value="iOSSimulator">False</Platform>
<Platform value="OSX32">False</Platform>
<Platform value="OSX64">False</Platform>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>

View file

@ -113,10 +113,11 @@ const
SRegValue_ShowWelcome = 'show welcome'; // CU
SRegValue_UseAdvancedInstall = 'use advanced install'; // CU
SRegValue_AltGrCtrlAlt = 'simulate altgr'; // CU
SRegValue_KeyboardHotKeysAreToggle = 'hotkeys are toggles'; // CU
SRegValue_AltGrCtrlAlt = 'simulate altgr'; // CU
SRegValue_KeyboardHotKeysAreToggle = 'hotkeys are toggles'; // CU
SRegValue_AllowRightModifierHotKey = 'allow right modifier for hotkey'; // CU
SRegValue_ReleaseShiftKeysAfterKeyPress = 'release shift keys after key press'; // CU
SRegValue_TestKeymanFunctioning = 'test keyman functioning'; // CU, default true
SRegValue_TestKeymanFunctioning = 'test keyman functioning'; // CU, default true
SRegValue_CreateStartMenuAsSubfolders = 'create start menu as subfolders'; // CU
SRegValue_CreateUninstallEntries = 'create uninstall entries'; // CU
@ -383,8 +384,6 @@ const
SRegKey_KeymanEngineDebug_CU = SRegKey_KeymanEngineRoot_CU + '\Debug';
SRegValue_Flag_UseRegisterHotkey = 'Flag_UseRegisterHotkey';
SRegValue_Flag_UseCachedHotkeyModifierState = 'Flag_UseCachedHotkeyModifierState';
SRegValue_Flag_ShouldSerializeInput = 'Flag_ShouldSerializeInput';
SRegValue_Flag_UseAutoStartTask = 'Flag_UseAutoStartTask';
SRegValue_Flag_SyncLanguagesToCloud = 'Flag_SyncLanguagesToCloud';

View file

@ -21,6 +21,8 @@ builder_describe_outputs \
function do_certificates() {
rm -f KeymanTestCA-sha1.* KeymanTest-sha1.* KeymanTest-sha256.* KeymanTestCA-sha256.*
source "$KEYMAN_ROOT/resources/build/win/visualstudio_environment.inc.sh"
makecert -r -pe -n "CN=Keyman Test CA SHA1" -ss CA -sr CurrentUser -a sha1 -cy authority -sky signature -sv KeymanTestCA-sha1.pvk KeymanTestCA-sha1.cer
certutil -user -addstore Root KeymanTestCA-sha1.cer
makecert -pe -n "CN=Keyman Test Certificate SHA1" -a sha1 -cy end -sky signature -ic KeymanTestCA-sha1.cer -iv KeymanTestCA-sha1.pvk -sv KeymanTest-sha1.pvk KeymanTest-sha1.cer

View file

@ -85,7 +85,7 @@ ldml_processor::ldml_processor(path const & kb_path, const std::vector<uint8_t>
} else {
str = keyEntry->get_to_string();
}
keys.add((km_core_virtual_key)kmapEntry->vkey, (uint16_t)kmapEntry->mod, str);
keys.add((km_core_virtual_key)kmapEntry->vkey, kmapEntry->mod, str);
}
} // else: no keys! but still valid. Just, no keys.

View file

@ -17,7 +17,7 @@ vkeys::vkeys() : vkey_to_string() {
}
void
vkeys::add(km_core_virtual_key vk, uint16_t modifier_state, std::u16string output) {
vkeys::add(km_core_virtual_key vk, km_core_ldml_modifier_state modifier_state, std::u16string output) {
// construct key
const vkey_id id(vk, modifier_state);
// assign the string

View file

@ -19,10 +19,17 @@ namespace km {
namespace core {
namespace ldml {
/**
* LDML keyboards have 32-bit modifier flags in order to support
* LDML_KEYS_MOD_OTHER (0x10000), unlike the Core APIs which have only 16 bit
* modifier flags.
*/
typedef uint32_t km_core_ldml_modifier_state;
/**
* identifier for keybag lookup
*/
typedef std::pair<km_core_virtual_key, uint16_t> vkey_id;
typedef std::pair<km_core_virtual_key, km_core_ldml_modifier_state> vkey_id;
/**
* LDML Class to manage all things key related: vkey remapping and vkey to string
@ -35,9 +42,9 @@ public:
vkeys();
/**
* add a vkey to the bag
* add a vkey to the bag.
*/
void add(km_core_virtual_key vk, uint16_t modifier_state, std::u16string output);
void add(km_core_virtual_key vk, km_core_ldml_modifier_state ldml_modifier_state, std::u16string output);
/**
* Lookup a vkey, returns an empty string if not found

View file

@ -171,8 +171,9 @@ const std::string &block_unicode_ver) {
// the cxx_icu can come from the Ubuntu environment, so do not depend on it
// for now.
// TODO: Resolve with ICU4C 76 in #12398
//assert_basic_equal(node_icu_unicode_major, cxx_icu_unicode_major);
assert_basic_equal(node_icu_unicode_major, block_ver_major);
//assert_basic_equal(node_icu_unicode_major, block_ver_major);
// seems less important if the C++ ICU verison matches the Node.js ICU version.
//assert_basic_equal(cxx_icu_major, node_icu_major);

View file

@ -4,7 +4,7 @@
```ts
/// <reference types="@keymanapp/models-types" />
/// <reference types="@keymanapp/common-types" />
import { CompilerCallbacks } from '@keymanapp/common-types';
import { CompilerEvent } from '@keymanapp/common-types';

View file

@ -2,6 +2,42 @@
This is the current home for Keyman Developer.
## Build Prerequisites
* See [Windows Build Environment Configuration](../../docs/build/windows.md).
## Building Keyman Developer
1. Start 'Git Bash' (part of Git for Windows).
2. Run `developer/src/build.sh`.
3. Artifacts from a successful build will be placed in **developer/bin** folder.
*Note*: running `build.sh` will currently reset the packages and path settings
in your Delphi environment. If you use Delphi for other projects, you should
consider building Keyman under a login user dedicated to it, or in a VM.
Type `build.sh` to see build targets and actions. Common build actions are:
* `build.sh build`
: builds Keyman Developer
* `build.sh clean`
: remove temporary files and build artifacts
* `build.sh publish`
: makes a release of all Keyman Developer projects
* `build.sh install`
: install some or all components to Program Files (requires elevated command prompt).
### Building without Delphi
It is possible to build all components that do _not_ require Delphi. Currently a
few components are Delphi-based (TIKE, setup, a few others), but you may be able
to get away without building them. In this situation, we recommend copying the
relevant Delphi-built components into developer/bin folders from a compatible
installed version of Keyman Developer for testing and debugging purposes.
# Folders
## common
@ -106,4 +142,6 @@ testing and packing keyboards for distribution.
## tools
Various build-time tools for Keyman Developer.
Various build-time tools for Keyman Developer.

View file

@ -151,7 +151,6 @@ function do_publish() {
../../common/web/keyman-version/build.sh publish $DRY_RUN $NPM_PUBLISH
../../common/web/types/build.sh publish $DRY_RUN $NPM_PUBLISH
../../common/models/types/build.sh publish $DRY_RUN $NPM_PUBLISH
../../core/include/ldml/build.sh publish $DRY_RUN $NPM_PUBLISH
# end TODO
#--------------------------------------------------------

View file

@ -35,9 +35,9 @@ function copy_cldr_imports() {
# TODO-LDML: developer/src/inst/download.in.mak needs these also...
CLDR_PATH=$(dirname "$CLDR_INFO_PATH")
CLDR_VER=$(basename "$CLDR_PATH")
mkdir -p "$THIS_SCRIPT_PATH/build/src/import/$CLDR_VER"
mkdir -p "$THIS_SCRIPT_PATH/build/src/types/import/$CLDR_VER"
# TODO-LDML: When these are copied, the DOCTYPE will break due to the wrong path. We don't use the DTD so it should be OK.
cp "$CLDR_INFO_PATH" "$CLDR_PATH/import/"*.xml "$THIS_SCRIPT_PATH/build/src/import/$CLDR_VER/"
cp "$CLDR_INFO_PATH" "$CLDR_PATH/import/"*.xml "$THIS_SCRIPT_PATH/build/src/types/import/$CLDR_VER/"
done
}

View file

@ -23,7 +23,7 @@ export class LDMLKeyboardXMLSourceFileReader {
}
static get defaultImportsURL(): [string,string] {
return ['../../import/', import.meta.url];
return ['../import/', import.meta.url];
}
readImportFile(version: string, subpath: string): Uint8Array {

View file

@ -5,7 +5,7 @@ module.exports = {
overrides: [
{
files:"src/**/*.ts",
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
}
],
rules: {

View file

@ -1,6 +1,3 @@
/// <reference types="@keymanapp/common-types" />
// above is required for now, seemingly https://github.com/microsoft/TypeScript/issues/42873
// probably addressed in ts 5.5.2
import { CompilerErrorNamespace, CompilerErrorSeverity, CompilerMessageSpec as m, CompilerMessageDef as def, CompilerMessageSpecWithException, KeymanUrls } from "@keymanapp/developer-utils";
const Namespace = CompilerErrorNamespace.Analyzer;

View file

@ -5,7 +5,7 @@ module.exports = {
overrides: [
{
files:"src/**/*.ts",
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
}
],
ignorePatterns: ["test/fixtures/*"],

View file

@ -6,7 +6,7 @@ module.exports = {
overrides: [
{
files:"src/**/*.ts",
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
}
],
rules: {

View file

@ -3,6 +3,23 @@ import { LDMLKeyboard, CompilerCallbacks } from "@keymanapp/developer-utils";
import { KeysCompiler } from "./keys.js";
import { LdmlCompilerMessages } from "./ldml-compiler-messages.js";
// This is a partial polyfill for findLast, so not polluting Array.prototype
// https://medium.com/@stheodorejohn/findlast-method-polyfill-in-javascript-bridging-browser-gaps-c3baf6aabae1
// TODO: remove and replace with Array.prototype.findLast when it is
// well-supported
function findLast(arr: any, callback: any) {
if (!arr) {
return undefined;
}
const len = arr.length >>> 0;
for (let i = len - 1; i >= 0; i--) {
if (callback(arr[i], i, arr)) {
return arr[i];
}
}
return undefined;
}
export class LdmlKeyboardVisualKeyboardCompiler {
public constructor(private callbacks: CompilerCallbacks) {
}
@ -57,7 +74,8 @@ export class LdmlKeyboardVisualKeyboardCompiler {
const keyId = key;
x++;
let keydef = source.keyboard3.keys?.key?.find(x => x.id == key);
//@ts-ignore
let keydef = findLast(source.keyboard3.keys?.key, x => x.id == key);
if (!keydef) {
this.callbacks.reportMessage(

View file

@ -8,7 +8,7 @@ module.exports = {
overrides: [
{
files: "src/**/*.ts",
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
}
],
rules: {

View file

@ -9,7 +9,6 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
builder_describe "Build Keyman kmc Lexical Model model-info Compiler module" \
"@/common/web/types" \
"@/common/models/types" \
"clean" \
"configure" \
"build" \

View file

@ -31,7 +31,7 @@
},
"dependencies": {
"@keymanapp/common-types": "*",
"@keymanapp/models-types": "*",
"@keymanapp/common-types": "*",
"@keymanapp/developer-utils": "*"
},
"devDependencies": {

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