diff --git a/.github/multi-labeler.yml b/.github/multi-labeler.yml
index a06a0b23e6..1278db2a28 100644
--- a/.github/multi-labeler.yml
+++ b/.github/multi-labeler.yml
@@ -64,4 +64,4 @@ labels:
- label: 'cherry-pick'
matcher:
- title: '\(๐|:cherries:\)'
+ title: '(๐|:cherries:)'
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
index 38e27cad8c..1c8704da25 100644
--- a/.github/workflows/labeler.yml
+++ b/.github/workflows/labeler.yml
@@ -12,7 +12,7 @@ jobs:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Update labels based on PR title
id: labeler
- uses: fuxingloh/multi-labeler@8afa186ed03230c98fe24ebf9fe35093072ad46e
+ uses: fuxingloh/multi-labeler@8afa186ed03230c98fe24ebf9fe35093072ad46e # v1.4.0
with:
github-token: ${{secrets.GITHUB_TOKEN}}
config-path: .github/multi-labeler.yml
diff --git a/HISTORY.md b/HISTORY.md
index 0be1d88ab8..377de392e8 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,5 +1,24 @@
# Keyman Version History
+## 15.0.123 alpha 2021-10-01
+
+* fix(common): Fix cherry-pick labeling (#5782)
+* chore(ios,android,windows): Update crowdin strings for Amharic (#5722)
+
+## 15.0.122 alpha 2021-09-30
+
+* fix(developer): move ampersand to shift+7 on touch (#5746)
+* feat(windows): Keyman Core integration (#5443)
+* chore(windows): Keyman Core UI and Settings (#5769)
+* fix(linux): Fix debian package script (#5771)
+* docs(mac): Add note about installing with homebrew (#5767)
+
+## 15.0.121 alpha 2021-09-29
+
+* fix(developer): remove empty touch rows on save (#5720)
+* chore(common): Check in crowdin strings for Shuwa Latin (#5734)
+* chore(windows): fix broken links in help (#5765)
+
## 15.0.120 alpha 2021-09-28
* fix: help.keyman.com script file cleanup (#5751)
diff --git a/VERSION.md b/VERSION.md
index d805a0328c..80a9265582 100644
--- a/VERSION.md
+++ b/VERSION.md
@@ -1 +1 @@
-15.0.121
\ No newline at end of file
+15.0.124
\ No newline at end of file
diff --git a/android/KMAPro/kMAPro/src/main/res/values-am-rET/strings.xml b/android/KMAPro/kMAPro/src/main/res/values-am-rET/strings.xml
index 817d731403..0ba117dd7c 100644
--- a/android/KMAPro/kMAPro/src/main/res/values-am-rET/strings.xml
+++ b/android/KMAPro/kMAPro/src/main/res/values-am-rET/strings.xml
@@ -18,6 +18,10 @@
แแปแปแซแแฝแ แญแซแ
แตแชแต %1$s
+
+ แชแญแแ แจแญแฎแ แตแชแตแ 57 แแญแ แ แฒแต แญแแแแแข
+
+ แญแฎแแ แแแแ
แฅแแ
แแญ แแปแ แญแแแฉ …
@@ -37,11 +41,11 @@
แชแญแแแ แแฒแตแฐแ แชแฆแญแต แฅแแฒแแ แซแตแญแ
- แชแแแ แแฐแ แ แจแแฐแ แแ แณ แญแฐแญแ
+ แชแแแ แแฐแ แ แจแแฐแ แแ แณ แญแฐแญแ
แฐแจแแช แแจแ
- แ แแแณแ แต แฐแ แต แญแณแญ\"%1$s\"
+ แ แแแณแ แต แฐแ แต แญแณแญ \"%1$s\"
แจแแฐแ แแ แณแแ แฐแแณ แฅแ
แแฝแ แแแซแ แแชแญแแ แแซแ แแจแแป แแแแ แฅ แแแต แญแตแกแตแข
@@ -50,13 +54,33 @@
แ แฐแจแแแต
- - แจแฐแซแ แแแแฝ (%1$d)
+ - แจแฐแซแ แแแแแฝ (%1$d)
- แจแฐแซแ แแแแฝ (%1$d)
แจแฐแซแ แจแแฐแ แแ แณ แแญแ แแแแ แแแต
- แจแชแแแ แจแแฝแณ แแแ แญแแญแฉ
+ แจแแฝแณ แแแ
+
+ แจแแแ แแ แณแแ แแแต แแตแฐแซแจแ
+
+ แจแตแแตแฃแฉ แแแแซ แฝแแ
+
+ แจแแฐแ แแ แณ
+
+ แแแ
+
+ แแแแ แจแแฐแ แแ แณ
+
+ แฃแถ
+
+ แจแแฐแ แแ แณ แฐแแณแแ แ แตแแต แฃแฉ แแญ แ แณแญ
+
+ แจแแแแแ แตแ แ แตแแต แฃแฉ แแญ แ แณแญ
+
+ แแแแ แจแแฐแ แแ แณแแ แ แตแแต แฃแฉ แแญ
+
+ แจแตแแตแฃแฉ แแแแซ แฝแแ แ แณแณแญ
แแแแ แฃแแฉแ แ แณแญ
@@ -87,6 +111,12 @@
%1$s แจแฐแจแแจ แแแ %2$s
แแแ แแแแแฝ แแฐแ แฒแ แฐแญแแ
+
+ แจแแฐแ แแ แณ แฐแแณแแ แ แแแฐแต แแแฑแ แ แตแฐแซแญแ
+
+ แฒแซแญแฑแ แ แแฝแจแญแจแญ แแญแตแฌแฑแแ แแแตแตแฌแแ แ แตแฐแซแญแ
+
+ แแฐ แแฐแแ แดแฒแแ แแแต
แแแ แแญแ URL แปแ
diff --git a/android/KMEA/app/src/main/res/values-am-rET/strings.xml b/android/KMEA/app/src/main/res/values-am-rET/strings.xml
index 417d02d5b5..49620d7315 100644
--- a/android/KMEA/app/src/main/res/values-am-rET/strings.xml
+++ b/android/KMEA/app/src/main/res/values-am-rET/strings.xml
@@ -24,6 +24,10 @@
แชแญแแแ แแ
+ แแฐแแต
+
+ แจแแแฅแแแ แจแแแ แซ แแด
+
แแญแทแ
แซแ
@@ -69,6 +73,8 @@
แจแฅแแ แแญแแ แแแจแต แแญแ แแฎแซแญแฐแฉ แคแฐ แแฝแแแต แซแตแแแแแ %1$s
แจแแ แณ แฐแแณ แแณแ แฝแแญ แแญแแญ %1$s:%2$s แ %3$s แแแแค แแฐแ แ แแแ แญแแแข
+
+ แจแแฐแ แแ แณ แฐแแณแ แฝแแญ %1$s:%2$s แ %3$s แแแแข
แฐแซแซแฅแแต แซแแแ แแแแ แแแต แแแซแ แฅแจแแฐแธ แแแข
diff --git a/common/core/desktop/build.bat b/common/core/desktop/build.bat
index fdcc18a7e6..856db992da 100644
--- a/common/core/desktop/build.bat
+++ b/common/core/desktop/build.bat
@@ -70,14 +70,7 @@ cd %KEYMAN_ROOT%\common\core\desktop
set BUILDTYPE=%2
-if "%3" == "--static" (
- set STATIC_LIBRARY=--default-library static
- shift
-) else (
- set STATIC_LIBRARY=
-)
-
-echo "Is static build = !STATIC_LIBRARY! (%3)"
+set STATIC_LIBRARY=--default-library both
if "%3" == "build" (
echo === Calling meson build for Windows !ARCH! !BUILDTYPE! ===
diff --git a/common/core/desktop/meson.build b/common/core/desktop/meson.build
index aec0bb12f2..dea4c55703 100644
--- a/common/core/desktop/meson.build
+++ b/common/core/desktop/meson.build
@@ -9,7 +9,8 @@ project('keyboardprocessor', 'cpp', 'c',
version: run_command(find_program('getversion.bat', 'getversion.sh')).stdout().strip(),
license: 'MIT',
default_options : ['buildtype=release',
- 'cpp_std=c++14'])
+ 'cpp_std=c++14',
+ 'b_vscrt=static_from_buildtype'])
message('meson.project_version(): ' + meson.project_version() + '\n')
compiler = meson.get_compiler('cpp')
diff --git a/common/core/desktop/src/kmx/kmx_file.cpp b/common/core/desktop/src/kmx/kmx_file.cpp
index 1a6bdf64f3..dfcac5f890 100644
--- a/common/core/desktop/src/kmx/kmx_file.cpp
+++ b/common/core/desktop/src/kmx/kmx_file.cpp
@@ -59,7 +59,7 @@ const unsigned long CRCTable[256] = {
* and returns the updated value.
*/
-unsigned long CalculateBufferCRC(unsigned long count, KMX_BYTE *p)
+static unsigned long CalculateBufferCRC(unsigned long count, KMX_BYTE *p)
{
unsigned long temp1;
unsigned long temp2;
diff --git a/common/core/web/input-processor/package-lock.json b/common/core/web/input-processor/package-lock.json
index dd83bff172..acf36f841b 100644
--- a/common/core/web/input-processor/package-lock.json
+++ b/common/core/web/input-processor/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/input-processor",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/core/web/input-processor/package.json b/common/core/web/input-processor/package.json
index 5f33938636..1edd2c4696 100644
--- a/common/core/web/input-processor/package.json
+++ b/common/core/web/input-processor/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/input-processor",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "The core text and prediction processing engine for KeymanWeb",
"repository": {
"type": "git",
@@ -18,8 +18,8 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/lexical-model-compiler": "^15.0.121",
- "@keymanapp/resources-gosh": "^15.0.121",
+ "@keymanapp/lexical-model-compiler": "^15.0.124",
+ "@keymanapp/resources-gosh": "^15.0.124",
"@types/node": "^11.9.4",
"chai": "^4.3.4",
"mocha": "^8.4.0",
@@ -34,11 +34,11 @@
"mocha": "mocha"
},
"dependencies": {
- "@keymanapp/keyboard-processor": "^15.0.121",
- "@keymanapp/lexical-model-layer": "^15.0.121",
- "@keymanapp/models-types": "^15.0.121",
- "@keymanapp/web-environment": "^15.0.121",
- "@keymanapp/web-utils": "^15.0.121",
+ "@keymanapp/keyboard-processor": "^15.0.124",
+ "@keymanapp/lexical-model-layer": "^15.0.124",
+ "@keymanapp/models-types": "^15.0.124",
+ "@keymanapp/web-environment": "^15.0.124",
+ "@keymanapp/web-utils": "^15.0.124",
"eventemitter3": "^4.0.0"
}
}
diff --git a/common/core/web/keyboard-processor/package-lock.json b/common/core/web/keyboard-processor/package-lock.json
index cb4e711ce0..6d1e5b37f7 100644
--- a/common/core/web/keyboard-processor/package-lock.json
+++ b/common/core/web/keyboard-processor/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/keyboard-processor",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/core/web/keyboard-processor/package.json b/common/core/web/keyboard-processor/package.json
index 18b73c1c9b..ed74c02e1e 100644
--- a/common/core/web/keyboard-processor/package.json
+++ b/common/core/web/keyboard-processor/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/keyboard-processor",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Core module for Keyman keyboard support in KeymanWeb.",
"repository": {
"type": "git",
@@ -18,7 +18,7 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/resources-gosh": "^15.0.121",
+ "@keymanapp/resources-gosh": "^15.0.124",
"chai": "^4.3.4",
"mocha": "^8.4.0",
"mocha-teamcity-reporter": "^4.0.0",
@@ -32,9 +32,9 @@
"mocha": "mocha"
},
"dependencies": {
- "@keymanapp/models-types": "^15.0.121",
- "@keymanapp/web-environment": "^15.0.121",
- "@keymanapp/web-utils": "^15.0.121",
+ "@keymanapp/models-types": "^15.0.124",
+ "@keymanapp/web-environment": "^15.0.124",
+ "@keymanapp/web-utils": "^15.0.124",
"@types/node": "^11.9.4"
}
}
diff --git a/common/core/web/keyboard-processor/src/keyboards/keyboard.ts b/common/core/web/keyboard-processor/src/keyboards/keyboard.ts
index bedfadfb00..857d2c223d 100644
--- a/common/core/web/keyboard-processor/src/keyboards/keyboard.ts
+++ b/common/core/web/keyboard-processor/src/keyboards/keyboard.ts
@@ -20,9 +20,14 @@ namespace com.keyman.keyboards {
CALIBRATED = 2
}
+ export interface VariableStoreDictionary {
+ [name: string]: string;
+ };
+
+
/**
* Acts as a wrapper class for Keyman keyboards compiled to JS, providing type information
- * and keyboard-centered functionality in an object-oriented way without modifying the
+ * and keyboard-centered functionality in an object-oriented way without modifying the
* wrapped keyboard itself.
*/
export class Keyboard {
@@ -37,7 +42,7 @@ namespace com.keyman.keyboards {
/**
* This is the object provided to KeyboardInterface.registerKeyboard - that is, the keyboard
* being wrapped.
- *
+ *
* TODO: Make this private instead. But there are a LOT of references that must be rooted out first.
*/
public readonly scriptObject: any;
@@ -71,6 +76,51 @@ namespace com.keyman.keyboards {
return this.scriptObject['KN'];
}
+ /**
+ * Cache variable store values
+ *
+ * Primarily used for predictive text to prevent variable store
+ * values from being changed in 'fat finger' processing.
+ *
+ * KVS is available in keyboards compiled with Keyman Developer 15
+ * and later versions. See #2924.
+ *
+ * @returns an object with each property referencing a variable store
+ */
+ get variableStores(): VariableStoreDictionary {
+ const storeNames = this.scriptObject['KVS'];
+ let values = {};
+ if(Array.isArray(storeNames)) {
+ for(let store of storeNames) {
+ values[store] = this.scriptObject[store];
+ }
+ }
+ return values;
+ }
+
+ /**
+ * Restore variable store values from cache
+ *
+ * KVS is available in keyboards compiled with Keyman Developer 15
+ * and later versions. See #2924.
+ *
+ * @param values name-value pairs for each store value
+ */
+ set variableStores(values: VariableStoreDictionary) {
+ const storeNames = this.scriptObject['KVS'];
+ if(Array.isArray(storeNames)) {
+ for(let store of storeNames) {
+ // If the value is not present in the cache, don't overwrite it;
+ // while this is not used in initial implementation, we could use
+ // it in future to update a single variable store value rather than
+ // the whole cache.
+ if(typeof values[store] == 'string') {
+ this.scriptObject[store] = values[store];
+ }
+ }
+ }
+ }
+
// TODO: Better typing.
private get _legacyLayoutSpec(): any {
return this.scriptObject['KV']; // used with buildDefaultLayout; layout must be constructed at runtime.
@@ -99,7 +149,7 @@ namespace com.keyman.keyboards {
/**
* HTML help text, as specified by either the &kmw_helptext or &kmw_helpfile system stores.
- *
+ *
* Reference: https://help.keyman.com/developer/language/reference/kmw_helptext,
* https://help.keyman.com/developer/language/reference/kmw_helpfile
*/
@@ -121,7 +171,7 @@ namespace com.keyman.keyboards {
* Embeds a custom script for use by the OSK, which may be interactive (like with sil_euro_latin).
* Note: this must be called AFTER any contents of `helpText` have been inserted into the DOM.
* (See sil_euro_latin's source -> sil_euro_latin_js.txt)
- *
+ *
* Reference: https://help.keyman.com/developer/language/reference/kmw_embedjs
*/
embedScript(e: any) {
@@ -136,10 +186,10 @@ namespace com.keyman.keyboards {
/**
* true if this keyboard uses a (legacy) pick list (Chinese, Japanese, Korean, etc.)
- *
+ *
* TODO: Make a property on keyboards (say, `isPickList` / `KPL`) to signal this when we
* get around to better, generalized picker-list support.
- */
+ */
get isCJK(): boolean { // I3363 (Build 301)
var lg: string;
if(typeof(this.scriptObject['KLC']) != 'undefined') {
@@ -147,7 +197,7 @@ namespace com.keyman.keyboards {
} else if(typeof(this.scriptObject['LanguageCode']) != 'undefined') {
lg = this.scriptObject['LanguageCode'];
}
-
+
// While some of these aren't proper BCP-47 language codes, the CJK keyboards predate our use of BCP-47.
// So, we preserve the old ISO 639-3 codes, as that's what the keyboards are matching against.
return ((lg == 'cmn') || (lg == 'jpn') || (lg == 'kor'));
@@ -186,7 +236,7 @@ namespace com.keyman.keyboards {
this.scriptObject['_kmw'] = tag;
}
- return tag;
+ return tag;
}
get explodedStores(): {[storeName: string]: text.ComplexKeyboardStore} {
@@ -209,7 +259,7 @@ namespace com.keyman.keyboards {
if(this._legacyLayoutSpec == null) {
return false;
}
-
+
// Only exists in KMW 10.0+, but before that Web had no chirality support, so... return false.
let layers = this._legacyLayoutSpec['KLS'];
if(!layers) {
@@ -219,18 +269,18 @@ namespace com.keyman.keyboards {
var emulationMask = modifierCodes['LCTRL'] | modifierCodes['LALT'];
var unshiftedEmulationLayer = layers[Layouts.getLayerId(emulationMask)];
var shiftedEmulationLayer = layers[Layouts.getLayerId(modifierCodes['SHIFT'] | emulationMask)];
-
+
// buildDefaultLayout ensures that these are aliased to the original modifier set being emulated.
// As a result, we can directly test for reference equality.
//
// This allows us to still return `true` after creating the layers for emulation; during keyboard
// construction, the two layers should be null for AltGr emulation to succeed.
- if(unshiftedEmulationLayer != null &&
+ if(unshiftedEmulationLayer != null &&
unshiftedEmulationLayer != layers[Layouts.getLayerId(modifierCodes['RALT'])]) {
return false;
}
- if(shiftedEmulationLayer != null &&
+ if(shiftedEmulationLayer != null &&
shiftedEmulationLayer != layers[Layouts.getLayerId(modifierCodes['RALT'] | modifierCodes['SHIFT'])]) {
return false;
}
@@ -273,9 +323,9 @@ namespace com.keyman.keyboards {
/**
* @param {number} _PCommand event code (16,17,18) or 0
* @param {Object} _PTarget target element
- * @param {number} _PData 1 or 0
+ * @param {number} _PData 1 or 0
* Notifies keyboard of keystroke or other event
- */
+ */
notify(_PCommand: number, _PTarget: text.OutputTarget, _PData: number) { // I2187
// Good example use case - the Japanese CJK-picker keyboard
if(typeof(this.scriptObject['KNS']) == 'function') {
@@ -318,7 +368,7 @@ namespace com.keyman.keyboards {
rawSpecifications = {'F':'Tahoma', 'BK': Layouts.dfltText};
}
- // Regardless of success, we'll want to initialize the field that backs the property;
+ // Regardless of success, we'll want to initialize the field that backs the property;
// may as well cache the default layout we just built, or a 'null' if it shouldn't exist..
if(!this._layouts) {
this._layouts = {};
@@ -339,7 +389,7 @@ namespace com.keyman.keyboards {
/**
* Returns an ActiveLayout object representing the keyboard's layout for this form factor. May return null if a custom desktop "help" OSK is defined, as with sil_euro_latin.
- *
+ *
* In such cases, please use either `helpText` or `insertHelpHTML` instead.
* @param formFactor {string} The desired form factor for the layout.
*/
diff --git a/common/core/web/keyboard-processor/src/text/kbdInterface.ts b/common/core/web/keyboard-processor/src/text/kbdInterface.ts
index 1324a9f167..fb729c0468 100644
--- a/common/core/web/keyboard-processor/src/text/kbdInterface.ts
+++ b/common/core/web/keyboard-processor/src/text/kbdInterface.ts
@@ -972,6 +972,9 @@ namespace com.keyman.text {
// Capture the initial state of the OutputTarget before any rules are matched.
let preInput = Mock.from(outputTarget);
+ // Capture the initial state of any variable stores
+ const cachedVariableStores = this.activeKeyboard.variableStores;
+
// Establishes the results object, allowing corresponding commands to set values here as appropriate.
this.ruleBehavior = new RuleBehavior();
@@ -987,6 +990,12 @@ namespace com.keyman.text {
// Finalize the rule's results.
this.ruleBehavior.transcription = outputTarget.buildTranscriptionFrom(preInput, keystroke);
+ // We always backup the changes to variable stores to the RuleBehavior, to
+ // be applied during finalization, then restore them to the cached initial
+ // values to avoid side-effects with predictive text mocks.
+ this.ruleBehavior.variableStores = this.activeKeyboard.variableStores;
+ this.activeKeyboard.variableStores = cachedVariableStores;
+
// `matched` refers to whether or not the FINAL rule (from any group) matched, rather than
// whether or not ANY rule matched. If the final rule doesn't match, we trigger the key's
// default behavior (if appropriate).
@@ -1001,6 +1010,19 @@ namespace com.keyman.text {
return behavior;
}
+ /**
+ * Applies the dictionary of variable store values to the active keyboard
+ *
+ * Has no effect on keyboards compiled with 14.0 or earlier; system store
+ * names are not exposed unless compiled with Developer 15.0 or later.
+ *
+ * @param stores A dictionary of stores which should be found in the
+ * keyboard
+ */
+ applyVariableStores(stores: com.keyman.keyboards.VariableStoreDictionary): void {
+ this.activeKeyboard.variableStores = stores;
+ }
+
/**
* Publishes the KeyboardInterface's shorthand API names. As this assigns the current functions
* held by the longform versions, note that this should be called after replacing any of them via
diff --git a/common/core/web/keyboard-processor/src/text/ruleBehavior.ts b/common/core/web/keyboard-processor/src/text/ruleBehavior.ts
index 2ce6df5d77..27eadcfe3e 100644
--- a/common/core/web/keyboard-processor/src/text/ruleBehavior.ts
+++ b/common/core/web/keyboard-processor/src/text/ruleBehavior.ts
@@ -24,6 +24,11 @@ namespace com.keyman.text {
*/
saveStore: {[name: string]: VariableStore} = {};
+ /**
+ * A set of variable stores with possible changes to be applied during finalization.
+ */
+ variableStores: keyboards.VariableStoreDictionary = {};
+
/**
* Denotes a non-output default behavior; this should be evaluated later, against the true keystroke.
*/
@@ -46,9 +51,9 @@ namespace com.keyman.text {
/**
* In reference to https://github.com/keymanapp/keyman/pull/4350#issuecomment-768753852:
- *
- * If the final group processed is a context and keystroke group (using keys),
- * and there is no nomatch rule, and the keystroke is not matched in the group,
+ *
+ * If the final group processed is a context and keystroke group (using keys),
+ * and there is no nomatch rule, and the keystroke is not matched in the group,
* the keystroke's default behavior should trigger, regardless of whether or not any
* rules in prior groups matched.
*/
@@ -78,6 +83,8 @@ namespace com.keyman.text {
}
}
+ processor.keyboardInterface.applyVariableStores(this.variableStores);
+
if(processor.keyboardInterface.variableStoreSerializer) {
for(let storeID in this.saveStore) {
processor.keyboardInterface.variableStoreSerializer.saveStore(processor.activeKeyboard.id, storeID, this.saveStore[storeID]);
@@ -99,13 +106,13 @@ namespace com.keyman.text {
/**
* Merges default-related behaviors from another RuleBehavior into this one. Assumes that the current instance
* "came first" chronologically. Both RuleBehaviors must be sourced from the same keystroke.
- *
+ *
* Intended use: merging rule-based behavior with default key behavior during scenarios like those described
* at https://github.com/keymanapp/keyman/pull/4350#issuecomment-768753852.
- *
+ *
* This function does not attempt a "complete" merge for two fully-constructed RuleBehaviors! Things
* WILL break for unintended uses.
- * @param other
+ * @param other
*/
mergeInDefaults(other: RuleBehavior) {
let keystroke = this.transcription.keystroke;
@@ -115,7 +122,7 @@ namespace com.keyman.text {
}
this.triggersDefaultCommand = this.triggersDefaultCommand || other.triggersDefaultCommand;
-
+
let mergingMock = Mock.from(this.transcription.preInput);
mergingMock.apply(this.transcription.transform);
mergingMock.apply(other.transcription.transform);
diff --git a/common/core/web/tools/recorder/package-lock.json b/common/core/web/tools/recorder/package-lock.json
index ac0c8d95b1..5e0568b4f6 100644
--- a/common/core/web/tools/recorder/package-lock.json
+++ b/common/core/web/tools/recorder/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/recorder-core",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/core/web/tools/recorder/package.json b/common/core/web/tools/recorder/package.json
index e8d6bbce66..9123cb3f6d 100644
--- a/common/core/web/tools/recorder/package.json
+++ b/common/core/web/tools/recorder/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/recorder-core",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Core classes used to develop KeymanWeb test cases based on keystrokes",
"main": "index.js",
"scripts": {
@@ -17,10 +17,10 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"dependencies": {
- "@keymanapp/keyboard-processor": "^15.0.121",
- "@keymanapp/models-types": "^15.0.121",
- "@keymanapp/web-environment": "^15.0.121",
- "@keymanapp/web-utils": "^15.0.121",
+ "@keymanapp/keyboard-processor": "^15.0.124",
+ "@keymanapp/models-types": "^15.0.124",
+ "@keymanapp/web-environment": "^15.0.124",
+ "@keymanapp/web-utils": "^15.0.124",
"@types/node": "^11.9.4"
},
"devDependencies": {
diff --git a/common/core/web/tools/sentry-manager/package-lock.json b/common/core/web/tools/sentry-manager/package-lock.json
index 15c05ef78e..dcb0e19252 100644
--- a/common/core/web/tools/sentry-manager/package-lock.json
+++ b/common/core/web/tools/sentry-manager/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-sentry-manager",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/common/core/web/tools/sentry-manager/package.json b/common/core/web/tools/sentry-manager/package.json
index a4e36fc5c6..1fda2f123d 100644
--- a/common/core/web/tools/sentry-manager/package.json
+++ b/common/core/web/tools/sentry-manager/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-sentry-manager",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Common setup for KeymanWeb's Sentry-based error reporting",
"main": "dist/index.js",
"scripts": {
@@ -20,7 +20,7 @@
"typescript": "^3.8.3"
},
"dependencies": {
- "@keymanapp/web-environment": "^15.0.121",
+ "@keymanapp/web-environment": "^15.0.124",
"@sentry/browser": "^5.27.4"
}
}
diff --git a/common/core/web/utils/package-lock.json b/common/core/web/utils/package-lock.json
index 0ae7ed2778..e6bd801152 100644
--- a/common/core/web/utils/package-lock.json
+++ b/common/core/web/utils/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-utils",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/common/core/web/utils/package.json b/common/core/web/utils/package.json
index cb77f098e0..d1dbe167de 100644
--- a/common/core/web/utils/package.json
+++ b/common/core/web/utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-utils",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Common utility functions used throughout other Keyman packages",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -20,8 +20,8 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/resources-gosh": "^15.0.121",
- "@keymanapp/web-environment": "^15.0.121",
+ "@keymanapp/resources-gosh": "^15.0.124",
+ "@keymanapp/web-environment": "^15.0.124",
"@types/node": "^14.0.5",
"typescript": "^3.8.3"
}
diff --git a/common/models/templates/package-lock.json b/common/models/templates/package-lock.json
index 2d33f3e9fb..5d0fa0670c 100644
--- a/common/models/templates/package-lock.json
+++ b/common/models/templates/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-templates",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/models/templates/package.json b/common/models/templates/package.json
index 0e8e0895fd..94da18b688 100644
--- a/common/models/templates/package.json
+++ b/common/models/templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-templates",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Backing model implementations (templates) for Keyman's modelling layer",
"keywords": [
"lm",
@@ -42,8 +42,8 @@
"url": "https://github.com/keymanapp/keyman/issues"
},
"devDependencies": {
- "@keymanapp/models-types": "^15.0.121",
- "@keymanapp/web-utils": "^15.0.121",
+ "@keymanapp/models-types": "^15.0.124",
+ "@keymanapp/web-utils": "^15.0.124",
"@types/chai": "^4.2.11",
"@types/mocha": "^7.0.2",
"@types/node": "^14.0.4",
@@ -52,6 +52,6 @@
"typescript": "^3.8.3"
},
"dependencies": {
- "@keymanapp/models-wordbreakers": "^15.0.121"
+ "@keymanapp/models-wordbreakers": "^15.0.124"
}
}
diff --git a/common/models/types/package-lock.json b/common/models/types/package-lock.json
index 481f13e65f..d1bb3374d4 100644
--- a/common/models/types/package-lock.json
+++ b/common/models/types/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-types",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/common/models/types/package.json b/common/models/types/package.json
index 7502298fc4..703f43f83d 100644
--- a/common/models/types/package.json
+++ b/common/models/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-types",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Type definitions in used in the modeling (lexical model/predictive text) component of Keyman.",
"types": "./index.d.ts",
"scripts": {
diff --git a/common/models/wordbreakers/package-lock.json b/common/models/wordbreakers/package-lock.json
index 41f552fa4c..8cb6c98709 100644
--- a/common/models/wordbreakers/package-lock.json
+++ b/common/models/wordbreakers/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-wordbreakers",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/models/wordbreakers/package.json b/common/models/wordbreakers/package.json
index b0808fe26b..7130127573 100644
--- a/common/models/wordbreakers/package.json
+++ b/common/models/wordbreakers/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-wordbreakers",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Word breakers bundled in the modeling layer",
"keywords": [
"lexical model",
@@ -40,7 +40,7 @@
"url": "https://github.com/keymanapp/keyman/issues"
},
"devDependencies": {
- "@keymanapp/models-types": "^15.0.121",
+ "@keymanapp/models-types": "^15.0.124",
"@types/chai": "^4.2.11",
"@types/mocha": "^7.0.2",
"chai": "^4.3.4",
diff --git a/common/predictive-text/package-lock.json b/common/predictive-text/package-lock.json
index 4136d44a9e..d01ea25722 100644
--- a/common/predictive-text/package-lock.json
+++ b/common/predictive-text/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-layer",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/predictive-text/package.json b/common/predictive-text/package.json
index a0b9cbafcc..d42f85e2af 100644
--- a/common/predictive-text/package.json
+++ b/common/predictive-text/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-layer",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Keyman/Predictive Text integration layer",
"main": "build/index.js",
"scripts": {
@@ -21,8 +21,8 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/models-types": "^15.0.121",
- "@keymanapp/resources-gosh": "^15.0.121",
+ "@keymanapp/models-types": "^15.0.124",
+ "@keymanapp/resources-gosh": "^15.0.124",
"@types/node": "^10.17.21",
"chai": "^4.3.4",
"karma": "^6.3.4",
@@ -46,10 +46,10 @@
"typescript": "^3.8.3"
},
"dependencies": {
- "@keymanapp/models-templates": "^15.0.121",
- "@keymanapp/models-wordbreakers": "^15.0.121",
- "@keymanapp/web-environment": "^15.0.121",
- "@keymanapp/web-utils": "^15.0.121",
+ "@keymanapp/models-templates": "^15.0.124",
+ "@keymanapp/models-wordbreakers": "^15.0.124",
+ "@keymanapp/web-environment": "^15.0.124",
+ "@keymanapp/web-utils": "^15.0.124",
"es6-shim": "^0.35.5",
"string.prototype.codepointat": "^0.2.1",
"string.prototype.startswith": "^0.2.0"
diff --git a/developer/js/package-lock.json b/developer/js/package-lock.json
index ddb4725e1b..fc6f4b19d0 100644
--- a/developer/js/package-lock.json
+++ b/developer/js/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-compiler",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/developer/js/package.json b/developer/js/package.json
index c90646ce02..30e4ece169 100644
--- a/developer/js/package.json
+++ b/developer/js/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-compiler",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Keyman Developer lexical model compiler",
"keywords": [
"keyboard",
@@ -37,14 +37,14 @@
"node": ">=12.0.0"
},
"dependencies": {
- "@keymanapp/models-types": "^15.0.121",
+ "@keymanapp/models-types": "^15.0.124",
"commander": "^3.0.0",
"typescript": "^3.8.3",
"xml2js": "^0.4.19"
},
"devDependencies": {
- "@keymanapp/models-templates": "^15.0.121",
- "@keymanapp/models-wordbreakers": "^15.0.121",
+ "@keymanapp/models-templates": "^15.0.124",
+ "@keymanapp/models-wordbreakers": "^15.0.124",
"@types/chai": "^4.1.7",
"@types/mocha": "^5.2.7",
"@types/node": "^10.14.6",
diff --git a/ios/engine/KMEI/KeymanEngine/am.lproj/Localizable.strings b/ios/engine/KMEI/KeymanEngine/am.lproj/Localizable.strings
index efd3bd7e52..f694d584a3 100644
--- a/ios/engine/KMEI/KeymanEngine/am.lproj/Localizable.strings
+++ b/ios/engine/KMEI/KeymanEngine/am.lproj/Localizable.strings
@@ -49,6 +49,12 @@
/* Confirmation text to display before uninstalling a lexical model */
"command-uninstall-lexical-model-confirm" = "แญแ
แแ แแแแ แแแต แแณแ แแ แตแแแแแ
?";
+/* Text for error when a keyboard cannot load properly */
+"error-loading-keyboard" = "แจแฐแ แจแแ แจแแฐแ แแ แณ แฐแแณแแ แแซแ แ แแฐแปแแ";
+
+/* Text for error when a lexical model cannot load properly */
+"error-loading-lexical-model" = "แจแฐแ แจแแ แฒแญแฝแแช แแซแ แ แแฐแปแแ";
+
/* Text for error when an installed file is unexpectedly missing */
"error-missing-file" = "แจแฅแญแณแณ แฐแแฑแ แแแแต แ แแฐแปแแแข";
@@ -181,6 +187,36 @@
/* Title for the main Settings menu */
"menu-settings-title" = "แจแชแญแแ แ
แแฅแฎแฝ";
+/* Secondary text showing current setting for spacebar caption - blank */
+"menu-settings-spacebar-hint-blank" = "แจแตแแตแฃแฉ แแแแซ แฝแแ แ แณแณแญ";
+
+/* Secondary text showing current setting for spacebar caption - keyboard */
+"menu-settings-spacebar-hint-keyboard" = "แจแแฐแ แแ แณ แฐแแณแแ แตแ แ แตแแต แฃแฉ แแญ แ แณแญ";
+
+/* Secondary text showing current setting for spacebar caption - language */
+"menu-settings-spacebar-hint-language" = "แจแแแแแ แตแ แ แตแแต แฃแฉ แแญ แ แณแญ";
+
+/* Secondary text showing current setting for spacebar caption - language + keyboard */
+"menu-settings-spacebar-hint-languageKeyboard" = "แแแแ แจแแฐแ แแ แณแแ แ แตแแต แฃแฉ แแญ";
+
+/* Label for the "Spacebar Caption" item on the main settings screen */
+"menu-settings-spacebar-text" = "แจแตแแตแฃแฉ แแแแซ แฝแแ";
+
+/* Title for the "Spacebar Caption" settings screen */
+"menu-settings-spacebar-title" = "แจแตแแตแฃแฉ แแแแซ แฝแแ";
+
+/* Text showing name of spacebar caption - blank */
+"menu-settings-spacebar-item-blank" = "แฃแถ";
+
+/* Text showing name of spacebar caption - keyboard */
+"menu-settings-spacebar-item-keyboard" = "แจแแฐแ แแ แณ แฐแแณ";
+
+/* Text showing name of spacebar caption - language */
+"menu-settings-spacebar-item-language" = "แแแ";
+
+/* Text showing name of spacebar caption - language + keyboard */
+"menu-settings-spacebar-item-languageKeyboard" = "แแแแ แจแแฐแ แแ แณ";
+
/* Short text for notification: download failure for keyboard */
"notification-download-failure-keyboard" = "แจแแฐแ แแ แณ แฐแแณ แแแจแต แ แแปแแ";
diff --git a/lerna.json b/lerna.json
index 576ecc9c1e..e062c20e3c 100644
--- a/lerna.json
+++ b/lerna.json
@@ -20,5 +20,5 @@
"ts-node",
"typescript"
],
- "version": "15.0.121"
+ "version": "15.0.124"
}
diff --git a/linux/scripts/debian.sh b/linux/scripts/debian.sh
index c81ba49efe..ab27887c66 100755
--- a/linux/scripts/debian.sh
+++ b/linux/scripts/debian.sh
@@ -31,7 +31,7 @@ for proj in ${projects}; do
downloadSource debianpackage
cd ${proj}-${version}
- if [ -n $DIST ]; then
+ if [ -n "$DIST" ]; then
EXTRA_ARGS="--distribution $DIST --force-distribution"
fi
dch --newversion ${version}-1 ${EXTRA_ARGS} "Re-release to Debian"
diff --git a/mac/help/start/install-keyman.md b/mac/help/start/install-keyman.md
index 1296a58673..a3bbdb0733 100644
--- a/mac/help/start/install-keyman.md
+++ b/mac/help/start/install-keyman.md
@@ -32,6 +32,18 @@ Apple Disk Image (.dmg) file. It should be installed according to the following
5. Now you can start typing with the selected keyboard in any text editor or
application that uses standard macOS input methods.
+---
+
+If you're using Homebrew, you can also install Keyman with the command:
+
+1.
+```
+brew install --cask keyman
+```
+
+2. Configure the macOS [security permissions](../troubleshooting/configure-security) for Keyman to run.
+
+----
## How To - Updating Keyman for macOS
When a new version of Keyman is released, you can update by following the instructions
diff --git a/resources/gosh/package-lock.json b/resources/gosh/package-lock.json
index 5feba92c70..63518a6743 100644
--- a/resources/gosh/package-lock.json
+++ b/resources/gosh/package-lock.json
@@ -1,5 +1,5 @@
{
"name": "@keymanapp/resources-gosh",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 1
}
diff --git a/resources/gosh/package.json b/resources/gosh/package.json
index d9e6f251a7..1b32bb03e4 100644
--- a/resources/gosh/package.json
+++ b/resources/gosh/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/resources-gosh",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Good Ol' Shell",
"author": "Marc Durdin (https://github.com/mcdurdin)",
"contributors": [
diff --git a/resources/web-environment/package-lock.json b/resources/web-environment/package-lock.json
index 2731c1c514..f7d69dba86 100644
--- a/resources/web-environment/package-lock.json
+++ b/resources/web-environment/package-lock.json
@@ -1,5 +1,5 @@
{
"name": "@keymanapp/web-environment",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 1
}
diff --git a/resources/web-environment/package.json b/resources/web-environment/package.json
index 7119795fb3..a866727f55 100644
--- a/resources/web-environment/package.json
+++ b/resources/web-environment/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-environment",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "A compilation utility for passing select environment variables into our TS builds",
"author": "Joshua Horton (https://github.com/jahorton)",
"homepage": "https://github.com/keymanapp/keyman",
@@ -17,6 +17,6 @@
"url": "https://github.com/keymanapp/keyman/issues"
},
"devDependencies": {
- "@keymanapp/resources-gosh": "^15.0.121"
+ "@keymanapp/resources-gosh": "^15.0.124"
}
}
diff --git a/web/package-lock.json b/web/package-lock.json
index 12256bd7b6..957989ef76 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "keyman",
- "version": "15.0.121",
+ "version": "15.0.124",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/web/package.json b/web/package.json
index a00a78847b..d02db532eb 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,6 +1,6 @@
{
"name": "keyman",
- "version": "15.0.121",
+ "version": "15.0.124",
"description": "Facilitates text input in any language.",
"repository": {
"type": "git",
@@ -18,8 +18,8 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/resources-gosh": "^15.0.121",
- "@keymanapp/web-sentry-manager": "^15.0.121",
+ "@keymanapp/resources-gosh": "^15.0.124",
+ "@keymanapp/web-sentry-manager": "^15.0.124",
"@sentry/cli": "^1.52.3",
"chai": "^4.3.4",
"google-closure-compiler-java": "^20200224.0.0",
@@ -52,13 +52,13 @@
"sentry-cli": "sentry-cli"
},
"dependencies": {
- "@keymanapp/input-processor": "^15.0.121",
- "@keymanapp/keyboard-processor": "^15.0.121",
- "@keymanapp/lexical-model-layer": "^15.0.121",
- "@keymanapp/models-types": "^15.0.121",
- "@keymanapp/recorder-core": "^15.0.121",
- "@keymanapp/web-environment": "^15.0.121",
- "@keymanapp/web-utils": "^15.0.121",
+ "@keymanapp/input-processor": "^15.0.124",
+ "@keymanapp/keyboard-processor": "^15.0.124",
+ "@keymanapp/lexical-model-layer": "^15.0.124",
+ "@keymanapp/models-types": "^15.0.124",
+ "@keymanapp/recorder-core": "^15.0.124",
+ "@keymanapp/web-environment": "^15.0.124",
+ "@keymanapp/web-utils": "^15.0.124",
"@types/node": "^11.9.4",
"es6-shim": "^0.35.5",
"eventemitter3": "^4.0.0"
diff --git a/web/testing/common/test.css b/web/testing/common/test.css
new file mode 100644
index 0000000000..88eacbf7e4
--- /dev/null
+++ b/web/testing/common/test.css
@@ -0,0 +1,22 @@
+body {
+ font-family: Tahoma,helvetica;
+}
+
+h3 {
+ font-size: 1em;
+ font-weight:normal;
+ color: darkred;
+ margin-bottom: 4px
+}
+
+.test {
+ font-size: 1.5em;
+ width:80%;
+ min-height:30px;
+ border: 1px solid gray;
+}
+
+#KeymanWebControl {
+ width:50%;
+ min-width:600px;
+}
diff --git a/web/testing/index.html b/web/testing/index.html
index ff0ee91c11..c8821e4ade 100644
--- a/web/testing/index.html
+++ b/web/testing/index.html
@@ -59,6 +59,7 @@
+
Return to main index.