chore(windows): Merge branch 'epic/windows-updates' into feat/windows/add-apply-now-update
6
.github/labeler.yml
vendored
|
|
@ -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
|
|
@ -183,4 +183,3 @@ lcov.info
|
|||
/keyman*.buildinfo
|
||||
/keyman*.changes
|
||||
/keyman*.tar.?z
|
||||
|
||||
|
|
|
|||
143
HISTORY.md
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
18.0.95
|
||||
18.0.111
|
||||
|
|
@ -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" }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 135 B After Width: | Height: | Size: 214 B |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 217 B |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 168 B |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 180 B |
|
After Width: | Height: | Size: 326 B |
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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" \
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
BIN
android/help/android_images/ic_timelapse.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
android/help/android_images/longpress-slider.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 37 KiB |
13
android/help/basic/config/adjust-longpress-delay.md
Normal 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.
|
||||
|
||||

|
||||
|
|
@ -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
|
||||

|
||||
|
||||
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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
The presence of this file tells CI to use the new builder_ style parameters for build.sh.
|
||||
5
common/models/types/.gitignore
vendored
|
|
@ -1,5 +0,0 @@
|
|||
# Specifically here:
|
||||
test.js
|
||||
|
||||
node_modules/
|
||||
build/
|
||||
|
|
@ -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": "*",
|
||||
}
|
||||
```
|
||||
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
{
|
||||
"extends": "../tsconfig.kmw-worker-base.json",
|
||||
"compilerOptions": {
|
||||
"declaration": true,
|
||||
"outDir": "build/",
|
||||
},
|
||||
"include": ["./*.ts"],
|
||||
"exclude": ["test.ts"]
|
||||
}
|
||||
1
common/models/wordbreakers/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
build/
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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})
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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": "../../"}
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"extends": "../../web/tsconfig.base.json"
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@ module.exports = {
|
|||
overrides: [
|
||||
{
|
||||
files: "src/**/*.ts",
|
||||
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
|
||||
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
|
||||
},
|
||||
],
|
||||
rules: {
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -11,11 +11,12 @@
|
|||
},
|
||||
"include": [
|
||||
"**/test-*.ts",
|
||||
"**/*.tests.ts",
|
||||
"./helpers/*.ts",
|
||||
],
|
||||
"references": [
|
||||
{ "path": "../../keyman-version" },
|
||||
{ "path": "../../../../core/include/ldml/"},
|
||||
{ "path": "../" },
|
||||
]
|
||||
],
|
||||
}
|
||||
|
|
|
|||
1
common/windows/.gitignore
vendored
|
|
@ -7,3 +7,4 @@ delphi/**/*.~*
|
|||
delphi/**/__recovery/
|
||||
delphi/**/__history/
|
||||
delphi/general/keymanversion_build.inc
|
||||
delphi/ext/cef4delphi/packages/CEF4Delphi.res
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
#--------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ module.exports = {
|
|||
overrides: [
|
||||
{
|
||||
files:"src/**/*.ts",
|
||||
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
|
||||
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
|
||||
}
|
||||
],
|
||||
rules: {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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/*"],
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ module.exports = {
|
|||
overrides: [
|
||||
{
|
||||
files:"src/**/*.ts",
|
||||
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
|
||||
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
|
||||
}
|
||||
],
|
||||
rules: {
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ module.exports = {
|
|||
overrides: [
|
||||
{
|
||||
files: "src/**/*.ts",
|
||||
extends: ["../../../common/web/eslint/eslintNoNodeImports.js"],
|
||||
extends: ["../../../common/tools/eslint/eslintNoNodeImports.js"],
|
||||
}
|
||||
],
|
||||
rules: {
|
||||
|
|
|
|||
|
|
@ -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" \
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@keymanapp/common-types": "*",
|
||||
"@keymanapp/models-types": "*",
|
||||
"@keymanapp/common-types": "*",
|
||||
"@keymanapp/developer-utils": "*"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
|||