diff --git a/.gitignore b/.gitignore index 7d3fd45792..e4385c1fc6 100644 --- a/.gitignore +++ b/.gitignore @@ -120,6 +120,7 @@ # /developer/inst/ /windows/src/developer/inst/*.wixpdb +/windows/src/developer/inst/download.mak /windows/src/developer/inst/copydev.mak # /developer/kmcmpdll/ diff --git a/HISTORY.md b/HISTORY.md index e70f220d45..1970f14ea8 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,21 @@ # Keyman Version History +## 14.0.156 alpha 2020-10-08 + +* chore(windows): Move to Windows SDK 10.0.17763.0 (#3654) +* fix(windows): Some registry keys could have incorrect permissions 🍒 (#3668) +* fix(developer): ci uses repo tier and version (#3670) +* fix(windows): update CI for publishing desktop help (#3671) +* fix(web): ci uses repo tier and version (#3672) +* fix(windows): improve version numbers (#3678) +* chore: don't add tag to version in filenames (#3681) + +## 14.0.155 alpha 2020-10-07 + +* refactor(common/models): centralizes suggestion & keep inits (#3645) +* fix(common/models): predictions after typed whitespace (#3657) +* fix(web): Fix how layer is separated from key name (#3659) + ## 14.0.154 alpha 2020-10-05 * fix(windows): Upgrading keyboards with transient profiles (#3637) diff --git a/VERSION.md b/VERSION.md index de31f8e7c7..ca335d8991 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -14.0.155 \ No newline at end of file +14.0.157 \ No newline at end of file diff --git a/common/core/web/input-processor/package-lock.json b/common/core/web/input-processor/package-lock.json index c65405e442..705191f41f 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": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/input-processor/package.json b/common/core/web/input-processor/package.json index accb9cd943..d966cbd549 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": "14.0.155", + "version": "14.0.157", "description": "The core text and prediction processing engine for KeymanWeb", "repository": { "type": "git", @@ -18,7 +18,7 @@ }, "homepage": "https://github.com/keymanapp/keyman#readme", "devDependencies": { - "@keymanapp/resources-gosh": "^14.0.155", + "@keymanapp/resources-gosh": "^14.0.157", "chai": "^4.2.0", "mocha": "^5.2.0", "typescript": "^3.8.3" @@ -29,11 +29,11 @@ "test": "gosh ./unit_tests/test.sh" }, "dependencies": { - "@keymanapp/keyboard-processor": "^14.0.155", - "@keymanapp/lexical-model-layer": "^14.0.155", - "@keymanapp/models-types": "^14.0.155", - "@keymanapp/web-environment": "^14.0.155", - "@keymanapp/web-utils": "^14.0.155", + "@keymanapp/keyboard-processor": "^14.0.157", + "@keymanapp/lexical-model-layer": "^14.0.157", + "@keymanapp/models-types": "^14.0.157", + "@keymanapp/web-environment": "^14.0.157", + "@keymanapp/web-utils": "^14.0.157", "@types/node": "^11.9.4", "eventemitter3": "^4.0.0", "ts-node": "^8.0.2" diff --git a/common/core/web/input-processor/src/text/prediction/languageProcessor.ts b/common/core/web/input-processor/src/text/prediction/languageProcessor.ts index 180c05e7f4..e3f781f903 100644 --- a/common/core/web/input-processor/src/text/prediction/languageProcessor.ts +++ b/common/core/web/input-processor/src/text/prediction/languageProcessor.ts @@ -186,7 +186,7 @@ namespace com.keyman.text.prediction { return this.predict_internal(transcription); } - public acceptSuggestion(suggestion: Suggestion, outputTarget: OutputTarget): Promise { + public applySuggestion(suggestion: Suggestion, outputTarget: OutputTarget): Promise { if(!outputTarget) { throw "Accepting suggestions requires a destination OutputTarget instance." } diff --git a/common/core/web/keyboard-processor/package-lock.json b/common/core/web/keyboard-processor/package-lock.json index e23e24293b..e5c2402504 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": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/keyboard-processor/package.json b/common/core/web/keyboard-processor/package.json index b3ba09b60e..8e9a1bbf61 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": "14.0.155", + "version": "14.0.157", "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": "^14.0.155", + "@keymanapp/resources-gosh": "^14.0.157", "chai": "^4.2.0", "mocha": "^5.2.0", "mocha-teamcity-reporter": "^3.0.0", @@ -31,9 +31,9 @@ "mocha": "mocha" }, "dependencies": { - "@keymanapp/models-types": "^14.0.155", - "@keymanapp/web-environment": "^14.0.155", - "@keymanapp/web-utils": "^14.0.155", + "@keymanapp/models-types": "^14.0.157", + "@keymanapp/web-environment": "^14.0.157", + "@keymanapp/web-utils": "^14.0.157", "@types/node": "^11.9.4", "ts-node": "^8.0.2" } diff --git a/common/core/web/tools/recorder/package-lock.json b/common/core/web/tools/recorder/package-lock.json index a07d7933a6..d8d851ed31 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": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/tools/recorder/package.json b/common/core/web/tools/recorder/package.json index b74140c295..77dc5d1cae 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": "14.0.155", + "version": "14.0.157", "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": "^14.0.155", - "@keymanapp/models-types": "^14.0.155", - "@keymanapp/web-environment": "^14.0.155", - "@keymanapp/web-utils": "^14.0.155" + "@keymanapp/keyboard-processor": "^14.0.157", + "@keymanapp/models-types": "^14.0.157", + "@keymanapp/web-environment": "^14.0.157", + "@keymanapp/web-utils": "^14.0.157" }, "devDependencies": { "typescript": "^3.8.3" diff --git a/common/core/web/tools/sentry-manager/package-lock.json b/common/core/web/tools/sentry-manager/package-lock.json index bf7d4a2e74..d96b0c7428 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": "14.0.155", + "version": "14.0.157", "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 b8dd31e07f..4e06689ad2 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": "14.0.155", + "version": "14.0.157", "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": "^14.0.155", + "@keymanapp/web-environment": "^14.0.157", "@sentry/browser": "^5.15.5" } } diff --git a/common/core/web/utils/package-lock.json b/common/core/web/utils/package-lock.json index f7584f41e4..35bb0e76f3 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": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/core/web/utils/package.json b/common/core/web/utils/package.json index 93a60ab77d..4998cbd420 100644 --- a/common/core/web/utils/package.json +++ b/common/core/web/utils/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-utils", - "version": "14.0.155", + "version": "14.0.157", "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": "^14.0.155", - "@keymanapp/web-environment": "^14.0.155", + "@keymanapp/resources-gosh": "^14.0.157", + "@keymanapp/web-environment": "^14.0.157", "@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 3bfb56c524..a90c0e9228 100644 --- a/common/models/templates/package-lock.json +++ b/common/models/templates/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-templates", - "version": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/models/templates/package.json b/common/models/templates/package.json index fedfd43d56..036326c344 100644 --- a/common/models/templates/package.json +++ b/common/models/templates/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-templates", - "version": "14.0.155", + "version": "14.0.157", "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": "^14.0.155", - "@keymanapp/web-utils": "^14.0.155", + "@keymanapp/models-types": "^14.0.157", + "@keymanapp/web-utils": "^14.0.157", "@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": "^14.0.155" + "@keymanapp/models-wordbreakers": "^14.0.157" } } diff --git a/common/models/templates/src/common.ts b/common/models/templates/src/common.ts index 6b9fb2bdea..73d360a2e7 100644 --- a/common/models/templates/src/common.ts +++ b/common/models/templates/src/common.ts @@ -60,4 +60,26 @@ namespace models { export function isSentinel(char: string): boolean { return char == models.SENTINEL_CODE_UNIT; } + + /** + * Builds a Suggestion based on a Transform corresponding to a predictive-text op. + * + * Assumes that the Transform's `insert` property represents a completed word, + * as models generally delete the whole prefix, replacing it with the full lexical entry. + * @param transform + */ + export function transformToSuggestion(transform: Transform): Suggestion; + export function transformToSuggestion(transform: Transform, p: number): Suggestion & {p: number}; + export function transformToSuggestion(transform: Transform, p?: number): Suggestion & {p?: number} { + let suggestion: Suggestion & {p?: number} = { + transform: transform, + transformId: transform.id, + displayAs: transform.insert + }; + + if(p === 0 || p) { + suggestion.p = p; + } + return suggestion; + } } diff --git a/common/models/templates/src/index.ts b/common/models/templates/src/index.ts index 5d63fe73a5..a20b43f602 100644 --- a/common/models/templates/src/index.ts +++ b/common/models/templates/src/index.ts @@ -1,4 +1,5 @@ /// +/// // Add all namespaces defined here to the global scope: if (typeof module != 'undefined' && typeof module.exports != 'undefined') { diff --git a/common/models/templates/src/quote-behavior.ts b/common/models/templates/src/quote-behavior.ts new file mode 100644 index 0000000000..d71dd688dc --- /dev/null +++ b/common/models/templates/src/quote-behavior.ts @@ -0,0 +1,46 @@ +namespace models { + export enum QuoteBehavior { + noQuotes = "no-quotes", + useQuotes = "use-quotes", + default = "default-quotes" + } + + // For an "enum/namespace merge". See https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-namespaces-with-classes + export namespace QuoteBehavior { + /** + * Applies the specified quote behavior to the provided `Transform`, mutating it as appropriate. + * @param transform The Transform to be mutated + * @param punctuation The active `LexicalModelPunctuation` settings + * @param defaultTo The default quote behavior to use (in case the current value is `.default`) + */ + export function apply(behavior: QuoteBehavior, text: string, punctuation: LexicalModelPunctuation, defaultTo: QuoteBehavior): string { + if(defaultTo == QuoteBehavior.default || !defaultTo) { + throw "Specified quote behavior may be ambiguous - default behavior not specified (may not be .default)"; + } + + if(behavior == QuoteBehavior.default) { + behavior = defaultTo; + } + + switch(behavior) { + case QuoteBehavior.noQuotes: + return text; + case QuoteBehavior.useQuotes: + let {open, close} = punctuation.quotesForKeepSuggestion; + + // TODO: Is this the right thing to do under RTL? + // We need an extra pass over this section to validate it. + if(punctuation.isRTL) { + let temp = close; + close = open; + open = temp; + } + + // This part's simple enough, at least. + return open + text + close; + default: + throw "Unsupported quote behavior state detected; implementation missing!"; + } + } + } +} \ No newline at end of file diff --git a/common/models/templates/src/trie-model.ts b/common/models/templates/src/trie-model.ts index 3c0c3039ea..3476081a51 100644 --- a/common/models/templates/src/trie-model.ts +++ b/common/models/templates/src/trie-model.ts @@ -124,18 +124,16 @@ let prefix = this.getLastWord(newContext.left); // Return suggestions from the trie. - return makeDistribution(this._trie.lookup(prefix).map(({text, p}) => ({ - transform: { - // Insert the suggestion from the Trie, verbatim + return makeDistribution(this._trie.lookup(prefix).map(({text, p}) => + models.transformToSuggestion({ insert: text, // Delete whatever the prefix that the user wrote. + deleteLeft: leftDelOffset + prefix.kmwLength() // Note: a separate capitalization/orthography engine can take this // result and transform it as needed. - deleteLeft: leftDelOffset + prefix.kmwLength(), }, - displayAs: text, - p: p - }))); + p + ))); /* Helper */ diff --git a/common/models/templates/test/test-common.js b/common/models/templates/test/test-common.js new file mode 100644 index 0000000000..61892ad985 --- /dev/null +++ b/common/models/templates/test/test-common.js @@ -0,0 +1,70 @@ +/* + * Unit tests for common utility functions/methods. + */ + +var assert = require('chai').assert; +var models = require('../').models; + +describe('Common utility functions', function() { + // TODO: unit tests for other common utility functions + + describe('transformToSuggestion', function() { + it('p: undefined', function() { + let suggestion = { + transform: { + insert: 'hello', + deleteLeft: 0, + id: 0 + }, + transformId: 0, + displayAs: 'hello' + }; + + assert.deepEqual(models.transformToSuggestion(suggestion.transform), suggestion); + }); + + it('p: 0', function() { + let suggestion = { + transform: { + insert: 'hello', + deleteLeft: 0, + id: 0 + }, + transformId: 0, + displayAs: 'hello', + p: 0 + }; + + assert.deepEqual(models.transformToSuggestion(suggestion.transform, 0), suggestion); + }); + + it('p > 0', function() { + let suggestion = { + transform: { + insert: 'hello', + deleteLeft: 0, + id: 0 + }, + transformId: 0, + displayAs: 'hello', + p: 0.5 + }; + + assert.deepEqual(models.transformToSuggestion(suggestion.transform, 0.5), suggestion); + }); + + it('properly handles the transformId', function() { + let suggestion = { + transform: { + insert: 'hello', + deleteLeft: 0, + id: 3 + }, + transformId: 3, // Ensures there isn't a separate ID seed in use. + displayAs: 'hello' + }; + + assert.deepEqual(models.transformToSuggestion(suggestion.transform), suggestion); + }); + }); +}); diff --git a/common/models/templates/test/test-quote-behavior.js b/common/models/templates/test/test-quote-behavior.js new file mode 100644 index 0000000000..339cf0af9d --- /dev/null +++ b/common/models/templates/test/test-quote-behavior.js @@ -0,0 +1,150 @@ +/* + * Unit tests for quote behaviors. + */ + +var assert = require('chai').assert; +var QuoteBehavior = require('../').models.QuoteBehavior; + +describe('Quote behaviors', function() { + describe('Script directionality', function() { + it('(default)', function() { + let englishPunctuation = { + quotesForKeepSuggestion: { open: `“`, close: `”`}, + insertAfterWord: " " + } + + var plainQuotedHello; + plainQuotedHello = QuoteBehavior.apply(QuoteBehavior.useQuotes, "hello", englishPunctuation, QuoteBehavior.useQuotes); + assert.equal(plainQuotedHello, "“hello”"); + }); + + it('LTR', function() { + let englishPunctuation = { + quotesForKeepSuggestion: { open: `“`, close: `”`}, + insertAfterWord: " ", + isRTL: false + } + + var plainQuotedHello; + plainQuotedHello = QuoteBehavior.apply(QuoteBehavior.useQuotes, "hello", englishPunctuation, QuoteBehavior.useQuotes); + assert.equal(plainQuotedHello, "“hello”"); + }); + + it.skip('RTL', function() { + // TODO: + }); + }); + + describe('Application', function() { + it('.useQuotes', function() { + let englishPunctuation = { + quotesForKeepSuggestion: { open: `“`, close: `”`}, + insertAfterWord: " " + } + + var plainQuotedHello; + plainQuotedHello = QuoteBehavior.apply(QuoteBehavior.useQuotes, "hello", englishPunctuation, QuoteBehavior.useQuotes); + assert.equal(plainQuotedHello, "“hello”"); + + plainQuotedHello = QuoteBehavior.apply(QuoteBehavior.useQuotes, "hello", englishPunctuation, QuoteBehavior.noQuotes); + assert.equal(plainQuotedHello, "“hello”"); + + let angleQuotePunctuation = { + quotesForKeepSuggestion: { open: `«`, close: `»`}, + insertAfterWord: " " + } + + var angleQuotedHello; + angleQuotedHello = QuoteBehavior.apply(QuoteBehavior.useQuotes, "hello", angleQuotePunctuation, QuoteBehavior.useQuotes); + assert.equal(angleQuotedHello, "«hello»"); + + angleQuotedHello = QuoteBehavior.apply(QuoteBehavior.useQuotes, "hello", angleQuotePunctuation, QuoteBehavior.noQuotes); + assert.equal(angleQuotedHello, "«hello»"); + }); + + it('.noQuotes', function() { + let englishPunctuation = { + quotesForKeepSuggestion: { open: `“`, close: `”`}, + insertAfterWord: " " + } + + var plainQuotedHello; + plainQuotedHello = QuoteBehavior.apply(QuoteBehavior.noQuotes, "hello", englishPunctuation, QuoteBehavior.useQuotes); + assert.equal(plainQuotedHello, "hello"); + + plainQuotedHello = QuoteBehavior.apply(QuoteBehavior.noQuotes, "hello", englishPunctuation, QuoteBehavior.noQuotes); + assert.equal(plainQuotedHello, "hello"); + + let angleQuotePunctuation = { + quotesForKeepSuggestion: { open: `«`, close: `»`}, + insertAfterWord: " " + } + + var angleQuotedHello; + angleQuotedHello = QuoteBehavior.apply(QuoteBehavior.noQuotes, "hello", angleQuotePunctuation, QuoteBehavior.useQuotes); + assert.equal(angleQuotedHello, "hello"); + + angleQuotedHello = QuoteBehavior.apply(QuoteBehavior.noQuotes, "hello", angleQuotePunctuation, QuoteBehavior.noQuotes); + assert.equal(angleQuotedHello, "hello"); + }); + + it('.default -> .useQuotes', function() { + let englishPunctuation = { + quotesForKeepSuggestion: { open: `“`, close: `”`}, + insertAfterWord: " " + } + + var plainQuotedHello; + plainQuotedHello = QuoteBehavior.apply(QuoteBehavior.default, "hello", englishPunctuation, QuoteBehavior.useQuotes); + assert.equal(plainQuotedHello, "“hello”"); + + let angleQuotePunctuation = { + quotesForKeepSuggestion: { open: `«`, close: `»`}, + insertAfterWord: " " + } + + var angleQuotedHello; + angleQuotedHello = QuoteBehavior.apply(QuoteBehavior.default, "hello", angleQuotePunctuation, QuoteBehavior.useQuotes); + assert.equal(angleQuotedHello, "«hello»"); + }); + + it('.default -> .noQuotes', function() { + let englishPunctuation = { + quotesForKeepSuggestion: { open: `“`, close: `”`}, + insertAfterWord: " " + } + + var plainQuotedHello; + plainQuotedHello = QuoteBehavior.apply(QuoteBehavior.default, "hello", englishPunctuation, QuoteBehavior.noQuotes); + assert.equal(plainQuotedHello, "hello"); + + let angleQuotePunctuation = { + quotesForKeepSuggestion: { open: `«`, close: `»`}, + insertAfterWord: " " + } + + var angleQuotedHello; + angleQuotedHello = QuoteBehavior.apply(QuoteBehavior.default, "hello", angleQuotePunctuation, QuoteBehavior.noQuotes); + assert.equal(angleQuotedHello, "hello"); + }); + + it('Error case: .default as fall-back behavior', function() { + let englishPunctuation = { + quotesForKeepSuggestion: { open: `“`, close: `”`}, + insertAfterWord: " " + } + + assert.throws(function() { + QuoteBehavior.apply(QuoteBehavior.default, "hello", englishPunctuation, QuoteBehavior.default); + }); + + assert.throws(function() { + QuoteBehavior.apply(QuoteBehavior.useQuotes, "hello", englishPunctuation, QuoteBehavior.default); + }); + + assert.throws(function() { + QuoteBehavior.apply(QuoteBehavior.noQuotes, "hello", englishPunctuation, QuoteBehavior.default); + }); + }); + }); +}); \ No newline at end of file diff --git a/common/models/types/build.sh b/common/models/types/build.sh index d141d9d2c7..447f4d9a03 100755 --- a/common/models/types/build.sh +++ b/common/models/types/build.sh @@ -17,73 +17,65 @@ EX_USAGE=64 display_usage ( ) { - echo "Usage: $0 [-test] [-version version] [-tier tier]" + echo "Usage: $0 [-test] [-publish-to-npm]" echo " $0 -help" echo echo " -help displays this screen and exits" - echo " -version version sets the package version before building" echo " -test runs tests" echo " -publish-to-npm publishes the current version to the npm package index" - echo " -tier tier also sets the package version tier and npm tag (alpha, beta, stable) before building or publishing" - echo " If version has 4 components, only first three are used." + echo " -dry-run do test, etc, but don't actually publish" } ################################ Main script ################################ run_tests=0 install_dependencies=1 -publish_version= -publish_tier= -lastkey= should_publish=0 npm_dist_tag= +should_dry_run=0 # Process command-line arguments while [[ $# -gt 0 ]] ; do key="$1" - if [[ -z "$lastkey" ]]; then - case $key in - -help|-h) - display_usage - exit - ;; - -test) - run_tests=1 - install_dependencies=0 - ;; - -version) - lastkey=$key - ;; - -tier) - lastkey=$key - ;; - -publish-to-npm) - should_publish=1 - ;; - *) - echo "$0: invalid option: $key" - display_usage - exit $EX_USAGE - esac - else - case $lastkey in - -version) - publish_version=$key - ;; - -tier) - publish_tier=$key - ;; - *) - # Should be impossible to reach ;-) - echo "$0: invalid option: $lastkey" - display_usage - exit $EX_USAGE - esac - lastkey= - fi + case $key in + -help|-h) + display_usage + exit + ;; + -dry-run) + should_dry_run=1 + ;; + -test) + run_tests=1 + install_dependencies=0 + ;; + -version) + echo "Warning: -version is now ignored" + ;; + -tier) + echo "Warning: -tier is now ignored" + ;; + -publish-to-npm) + should_publish=1 + ;; + *) + echo "$0: invalid option: $key" + display_usage + exit $EX_USAGE + esac shift # past the processed argument done +# Dry run settings +if (( should_dry_run )); then + DRY_RUN=--dry-run +else + DRY_RUN= +fi + +publish_version=`cat "$KEYMAN_ROOT/VERSION.md"` +publish_tier=`cat "$KEYMAN_ROOT/TIER.md"` + # Validate the publish_version if [ ! -z "$publish_version" ]; then # Remove final component if more than 3 components passed @@ -145,5 +137,5 @@ if (( should_publish )); then # a package in the @keymanapp scope on the public npm package index. # # See `npm help publish` for more details. - npm publish --access public --tag "${npm_dist_tag:=latest}" || fail "Could not publish ${npm_dist_tag} release." + npm publish $DRY_RUN --access public --tag "${npm_dist_tag:=latest}" || fail "Could not publish ${npm_dist_tag} release." fi diff --git a/common/models/types/package-lock.json b/common/models/types/package-lock.json index 389ea4b2d3..c9ba5db511 100644 --- a/common/models/types/package-lock.json +++ b/common/models/types/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-types", - "version": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/models/types/package.json b/common/models/types/package.json index ebb4b761d7..354ff22cd4 100644 --- a/common/models/types/package.json +++ b/common/models/types/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-types", - "version": "14.0.155", + "version": "14.0.157", "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 9239d08f04..d108de3f18 100644 --- a/common/models/wordbreakers/package-lock.json +++ b/common/models/wordbreakers/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-wordbreakers", - "version": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/models/wordbreakers/package.json b/common/models/wordbreakers/package.json index 59492a9516..dc87adc104 100644 --- a/common/models/wordbreakers/package.json +++ b/common/models/wordbreakers/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/models-wordbreakers", - "version": "14.0.155", + "version": "14.0.157", "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": "^14.0.155", + "@keymanapp/models-types": "^14.0.157", "@types/chai": "^4.2.11", "@types/mocha": "^7.0.2", "chai": "^4.2.0", diff --git a/common/predictive-text/package-lock.json b/common/predictive-text/package-lock.json index 830efb9885..0cda5388a4 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": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/common/predictive-text/package.json b/common/predictive-text/package.json index bf1eaec4cc..e1dbb86a78 100644 --- a/common/predictive-text/package.json +++ b/common/predictive-text/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-layer", - "version": "14.0.155", + "version": "14.0.157", "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": "^14.0.155", - "@keymanapp/resources-gosh": "^14.0.155", + "@keymanapp/models-types": "^14.0.157", + "@keymanapp/resources-gosh": "^14.0.157", "@types/node": "^10.17.21", "chai": "^4.2.0", "karma": "^4.2.0", @@ -46,10 +46,10 @@ "typescript": "^3.8.3" }, "dependencies": { - "@keymanapp/models-templates": "^14.0.155", - "@keymanapp/models-wordbreakers": "^14.0.155", - "@keymanapp/web-environment": "^14.0.155", - "@keymanapp/web-utils": "^14.0.155", + "@keymanapp/models-templates": "^14.0.157", + "@keymanapp/models-wordbreakers": "^14.0.157", + "@keymanapp/web-environment": "^14.0.157", + "@keymanapp/web-utils": "^14.0.157", "es6-shim": "^0.35.5", "string.prototype.codepointat": "^0.2.1", "string.prototype.startswith": "^0.2.0" diff --git a/common/predictive-text/unit_tests/headless/edit-distance/distance-modeler.js b/common/predictive-text/unit_tests/headless/edit-distance/distance-modeler.js index 148ac492f7..f6d0754ea2 100644 --- a/common/predictive-text/unit_tests/headless/edit-distance/distance-modeler.js +++ b/common/predictive-text/unit_tests/headless/edit-distance/distance-modeler.js @@ -398,8 +398,15 @@ describe('Correction Distance Modeler', function() { let iter = searchSpace.getBestMatches(); // While there's no input, insertion operations can produce suggestions. - let results = iter.next(); - assert.isFalse(results.done); + let resultState = iter.next(); + let results = resultState.value; + + // Just one suggestion should be returned. + assert.equal(results.length, 1); + assert.equal(results[0].totalCost, 0); // Gives a perfect match + assert.equal(results[0].inputSequence.length, 0); // for a state with no input and + assert.equal(results[0].matchString, ''); // an empty match string. + assert.isFalse(resultState.done); }); }); }); diff --git a/common/predictive-text/unit_tests/headless/worker-custom-punctuation.js b/common/predictive-text/unit_tests/headless/worker-custom-punctuation.js index 3407ace41f..b2fbc3b2db 100644 --- a/common/predictive-text/unit_tests/headless/worker-custom-punctuation.js +++ b/common/predictive-text/unit_tests/headless/worker-custom-punctuation.js @@ -8,16 +8,7 @@ var ModelCompositor = require('../../build/intermediate').ModelCompositor; describe('Custom Punctuation', function () { it('appears in the keep suggestion', function () { - let dummySuggestions = [ - { - transform: { - insert: 'Hrllo', - deleteLeft: 0, - }, - tag: 'keep', - displayAs: 'Hrllo', - }, - { + let dummySuggestions = [{ transform: { insert: 'Hello', deleteLeft: 0, diff --git a/common/predictive-text/unit_tests/headless/worker-model-compositor.js b/common/predictive-text/unit_tests/headless/worker-model-compositor.js index bdd60699ca..1ba4ba0497 100644 --- a/common/predictive-text/unit_tests/headless/worker-model-compositor.js +++ b/common/predictive-text/unit_tests/headless/worker-model-compositor.js @@ -2,6 +2,8 @@ * Integration tests for the model compositor with the trie model. */ +const { models } = require('../../build/intermediate'); + var assert = require('chai').assert; var TrieModel = require('../../build/intermediate').models.TrieModel; var ModelCompositor = require('../../build/intermediate').ModelCompositor; @@ -66,4 +68,70 @@ describe('ModelCompositor', function() { // 'the' should be the intended the result here. assert.isAbove(theSuggestion.p, thrSuggestion.p); }); + + // The nomenclature's a minor sneak-peek from child PRs. + describe('toAnnotatedSuggestion', function() { + let baseSuggestion = { + transform: { + insert: 'hello', + deleteLeft: 0, + id: 0 + }, + transformId: 0, + displayAs: 'hello' + }; + + let englishPunctuation = { + quotesForKeepSuggestion: { open: `“`, close: `”`}, + insertAfterWord: ' ' + }; + + let angledPunctuation = { + quotesForKeepSuggestion: { open: `«`, close: `»`}, + insertAfterWord: " " + } + + describe("'keep'", function() { + let annotationTest = function(punctuation, displayText, quoteStyle) { + let options = { + punctuation: punctuation + }; + + let model = new models.DummyModel(options); + let compositor = new ModelCompositor(model); + + var keep; + if(quoteStyle) { + keep = compositor.toAnnotatedKeepSuggestion(baseSuggestion, quoteStyle); + } else { + keep = compositor.toAnnotatedKeepSuggestion(baseSuggestion); + } + + // Make sure we didn't accidentally leak any mutations to the parameter. + assert.notDeepEqual(keep, baseSuggestion); + + assert.equal(keep.displayAs, displayText); + assert.equal(keep.tag, 'keep'); + } + + it('quoteBehavior: (.default)', function() { + annotationTest(englishPunctuation, "“hello”"); + annotationTest(angledPunctuation, "«hello»"); + }); + + it('quoteBehavior: .useQuotes', function() { + annotationTest(englishPunctuation, "“hello”", models.QuoteBehavior.useQuotes); + annotationTest(angledPunctuation, "«hello»", models.QuoteBehavior.useQuotes); + }); + + it('quoteBehavior: .noQuotes', function() { + annotationTest(englishPunctuation, "hello", models.QuoteBehavior.noQuotes); + annotationTest(angledPunctuation, "hello", models.QuoteBehavior.noQuotes); + }); + + it.skip('RTL test', function() { + // TODO: + }); + }); + }); }); diff --git a/common/predictive-text/worker/correction/context-tracker.ts b/common/predictive-text/worker/correction/context-tracker.ts index 67cac6861b..6d9b5f8750 100644 --- a/common/predictive-text/worker/correction/context-tracker.ts +++ b/common/predictive-text/worker/correction/context-tracker.ts @@ -11,6 +11,10 @@ namespace correction { transformDistributions: Distribution[] = []; replacements: TrackedContextSuggestion; activeReplacement: number = -1; + + get isNew(): boolean { + return this.transformDistributions.length == 0; + } } export class TrackedContextState { diff --git a/common/predictive-text/worker/correction/distance-modeler.ts b/common/predictive-text/worker/correction/distance-modeler.ts index e66f395af9..26f5b67658 100644 --- a/common/predictive-text/worker/correction/distance-modeler.ts +++ b/common/predictive-text/worker/correction/distance-modeler.ts @@ -319,7 +319,8 @@ namespace correction { this.completedPaths = [this.rootNode]; // Adds a base level queue to handle initial insertions. - let baseTier = new SearchSpaceTier(0, this.rootNode.buildInsertionEdges()); + // Start with _just_ the root node. Necessary for proper empty-token, empty-input handling! + let baseTier = new SearchSpaceTier(0, [this.rootNode]); this.tierOrdering.push(baseTier); this.selectionQueue.enqueue(baseTier); } diff --git a/common/predictive-text/worker/model-compositor.ts b/common/predictive-text/worker/model-compositor.ts index f8e1091bb3..5b4971edc7 100644 --- a/common/predictive-text/worker/model-compositor.ts +++ b/common/predictive-text/worker/model-compositor.ts @@ -40,7 +40,6 @@ class ModelCompositor { } private predictFromCorrections(corrections: ProbabilityMass[], context: Context): Distribution { - let punctuation = this.punctuation; let returnedPredictions: Distribution = []; for(let correction of corrections) { @@ -55,25 +54,6 @@ class ModelCompositor { pair.sample.transformId = transform.id; } - let preserveWhitespace: boolean = false; - if(this.isWhitespace(transform)) { - // Detect start of new word; prevent whitespace loss here. - let postContext = models.applyTransform(transform, context); - preserveWhitespace = (this.lexicalModel.wordbreak(postContext) == ''); - } - - // Prepends the original whitespace, ensuring it is preserved if - // the suggestion is accepted. - if(preserveWhitespace) { - models.prependTransform(pair.sample.transform, transform); - } - - // The model is trying to add a word; thus, add some custom formatting - // to that word. - if (pair.sample.transform.insert.length > 0) { - pair.sample.transform.insert += punctuation.insertAfterWord; - } - let prediction = {sample: pair.sample, p: pair.p * inputProb}; return prediction; }, this); @@ -106,28 +86,37 @@ class ModelCompositor { let keepOptionText = this.lexicalModel.wordbreak(postContext); let keepOption: Suggestion = null; - let predictionRoots: ProbabilityMass[] let rawPredictions: Distribution = []; - // Section 1: determining 'prediction roots'. + // Used to restore whitespaces if operations would remove them. + let prefixTransform: Transform; + // Section 1: determining 'prediction roots'. if(!this.contextTracker) { + let predictionRoots: ProbabilityMass[]; + // Generates raw prediction distributions for each valid input. Can only 'correct' // against the final input. // // This is the old, 12.0-13.0 'correction' style. - predictionRoots = transformDistribution.map(function(alt) { - let transform = alt.sample; + if(allowSpace) { + // Detect start of new word; prevent whitespace loss here. + predictionRoots = [{sample: inputTransform, p: 1.0}]; + prefixTransform = inputTransform; + } else { + predictionRoots = transformDistribution.map(function(alt) { + let transform = alt.sample; - // Filter out special keys unless they're expected. - if(this.isWhitespace(transform) && !allowSpace) { - return null; - } else if(this.isBackspace(transform) && !allowBksp) { - return null; - } + // Filter out special keys unless they're expected. + if(this.isWhitespace(transform) && !allowSpace) { + return null; + } else if(this.isBackspace(transform) && !allowBksp) { + return null; + } - return alt; - }, this); + return alt; + }, this); + } // Remove `null` entries. predictionRoots = predictionRoots.filter(tuple => !!tuple); @@ -151,6 +140,16 @@ class ModelCompositor { // The 'eventual' logic will be significantly more complex, though still manageable. let searchSpace = contextState.searchSpace[0]; + let newEmptyToken = false; + // Detect if we're starting a new context state. + let contextTokens = contextState.tokens; + if(contextTokens.length == 0 || contextTokens[contextTokens.length - 1].isNew) { + if(this.isEmpty(inputTransform) || this.isWhitespace(inputTransform)) { + newEmptyToken = true; + prefixTransform = inputTransform; + } + } + // TODO: whitespace, backspace filtering. Do it here. // Whitespace is probably fine, actually. Less sure about backspace. @@ -175,7 +174,8 @@ class ModelCompositor { // Replace the existing context with the correction. let correctionTransform: Transform = { insert: correction, // insert correction string - deleteLeft: lexicalModel.wordbreak(context).length, // remove actual token string + // remove actual token string. If new token, there should be nothing to delete. + deleteLeft: newEmptyToken ? 0 : lexicalModel.wordbreak(context).length, id: finalInput.id } @@ -217,13 +217,18 @@ class ModelCompositor { let displayText = prediction.sample.displayAs; if(displayText == keepOptionText || (lexicalModel.toKey && displayText == lexicalModel.toKey(keepOptionText)) ) { - keepOption = prediction.sample; - // Ensure we keep any original casing, etc that may have been stripped. - keepOption.transform.insert = keepOptionText + punctuation.insertAfterWord; - keepOption.displayAs = keepOptionText; - // Specifying 'keep' helps uses of the LMLayer find it quickly - // if/when desired. - keepOption.tag = 'keep'; + // Preserve the original, pre-keyed version of the text. + let baseTransform = prediction.sample.transform; + + let keepTransform = { + insert: keepOptionText, + deleteLeft: baseTransform.deleteLeft, + deleteRight: baseTransform.deleteRight, + id: baseTransform.id + } + + keepOption = models.transformToSuggestion(keepTransform, prediction.p); + keepOption = this.toAnnotatedKeepSuggestion(keepOption, models.QuoteBehavior.noQuotes); } else { let existingSuggestion = suggestionDistribMap[displayText]; if(existingSuggestion) { @@ -236,32 +241,11 @@ class ModelCompositor { // Generate a default 'keep' option if one was not otherwise produced. if(!keepOption && keepOptionText != '') { - keepOption = { - displayAs: keepOptionText, - transformId: inputTransform.id, - // Replicate the original transform, modified for appropriate language insertion syntax. - transform: { - insert: inputTransform.insert + punctuation.insertAfterWord, - deleteLeft: inputTransform.deleteLeft, - deleteRight: inputTransform.deleteRight, - id: inputTransform.id - }, - tag: 'keep' - }; - } + let keepTransform = models.transformToSuggestion(inputTransform, 1); // 1 is a filler value; goes unused b/c is for a 'keep'. + // This is the one case where the transform doesn't insert the full word; we need to override the displayAs param. + keepTransform.displayAs = keepOptionText; - // Add the surrounding quotes to the "keep" option's display string: - if (keepOption) { - let { open, close } = punctuation.quotesForKeepSuggestion; - - // Should we also ensure that we're using the default quote marks first? - // Or is it reasonable to say that the "left" mark is always the one - // called "open"? - if(!punctuation.isRTL) { - keepOption.displayAs = open + keepOption.displayAs + close; - } else { - keepOption.displayAs = close + keepOption.displayAs + open; - } + keepOption = this.toAnnotatedKeepSuggestion(keepTransform); } // Section 3: Finalize suggestions, truncate list to the N (MAX_SUGGESTIONS) most optimal, return. @@ -295,9 +279,36 @@ class ModelCompositor { suggestions = [ keepOption ].concat(suggestions); } + // Apply 'after word' punctuation. We delay until now so that utility functions relying on the + // unmodified Transform may execute properly. + suggestions.forEach(function(suggestion) { + if (suggestion.transform.insert.length > 0) { + suggestion.transform.insert += punctuation.insertAfterWord; + + // If this is a suggestion after wordbreak input, make sure we preserve the wordbreak transform! + if(prefixTransform) { + models.prependTransform(suggestion.transform, prefixTransform); + } + } + }); + return suggestions; } + private toAnnotatedKeepSuggestion(suggestion: Suggestion & {p?: number}, + quoteBehavior: models.QuoteBehavior = models.QuoteBehavior.default): Suggestion & {p?: number} { + // A method-internal 'import' of the enum. + let QuoteBehavior = models.QuoteBehavior; + + return { + transform: suggestion.transform, + transformId: suggestion.transformId, + displayAs: QuoteBehavior.apply(quoteBehavior, suggestion.displayAs, this.punctuation, QuoteBehavior.useQuotes), + tag: 'keep', + p: suggestion.p + }; + } + /** * Returns the punctuation used for this model, filling out unspecified fields */ diff --git a/developer/js/README.md b/developer/js/README.md index 0872cbef79..93fb0facfd 100644 --- a/developer/js/README.md +++ b/developer/js/README.md @@ -52,10 +52,3 @@ How to run the tests ./build.sh -test - -How to update the package version ---------------------------------- - -**NOTE**: this step should only be performed on the CI server: - - ./build.sh -version MAJOR.MINOR.${BUILD_NUMBER} [-tier (alpha|beta)] diff --git a/developer/js/build.sh b/developer/js/build.sh index eccc7baf76..b1547cf52c 100755 --- a/developer/js/build.sh +++ b/developer/js/build.sh @@ -24,80 +24,72 @@ build () { } display_usage ( ) { - echo "Usage: $0 [-test] [-version version] [-tier tier]" + echo "Usage: $0 [-test] [-publish-to-npm]" echo " $0 -help" echo echo " -help displays this screen and exits" - echo " -version version sets the package version before building" echo " -test runs unit tests after building" echo " -tdd runs unit tests WITHOUT building" echo " -publish-to-npm publishes the current version to the npm package index" - echo " -tier tier also sets the package version tier and npm tag (alpha, beta, stable) before building or publishing" - echo " If version has 4 components, only first three are used." + echo " -dry-run do build, etc, but don't actually publish" } ################################ Main script ################################ run_tests=0 install_dependencies=1 -publish_version= -publish_tier= -lastkey= should_publish=0 npm_dist_tag= +should_dry_run=0 # Process command-line arguments while [[ $# -gt 0 ]] ; do key="$1" - if [[ -z "$lastkey" ]]; then - case $key in - -help|-h) - display_usage - exit - ;; - -skip-package-install|-S) - install_dependencies=0 - ;; - -test) - run_tests=1 - ;; - -tdd) - run_tests=1 - install_dependencies=0 - ;; - -version) - lastkey=$key - ;; - -tier) - lastkey=$key - ;; - -publish-to-npm) - should_publish=1 - ;; - *) - echo "$0: invalid option: $key" - display_usage - exit $EX_USAGE - esac - else - case $lastkey in - -version) - publish_version=$key - ;; - -tier) - publish_tier=$key - ;; - *) - # Should be impossible to reach ;-) - echo "$0: invalid option: $lastkey" - display_usage - exit $EX_USAGE - esac - lastkey= - fi + case $key in + -help|-h) + display_usage + exit + ;; + -dry-run) + should_dry_run=1 + ;; + -skip-package-install|-S) + install_dependencies=0 + ;; + -test) + run_tests=1 + ;; + -tdd) + run_tests=1 + install_dependencies=0 + ;; + -version) + echo "Warning: -version is now ignored" + ;; + -tier) + echo "Warning: -tier is now ignored" + ;; + -publish-to-npm) + should_publish=1 + ;; + *) + echo "$0: invalid option: $key" + display_usage + exit $EX_USAGE + esac shift # past the processed argument done +# Dry run settings +if (( should_dry_run )); then + DRY_RUN=--dry-run +else + DRY_RUN= +fi + +publish_version=`cat "$KEYMAN_ROOT/VERSION.md"` +publish_tier=`cat "$KEYMAN_ROOT/TIER.md"` + # Validate the publish_version if [ ! -z "$publish_version" ]; then # Remove final component if more than 3 components passed @@ -155,5 +147,5 @@ if (( should_publish )); then # a package in the @keymanapp scope on the public npm package index. # # See `npm help publish` for more details. - npm publish --access public --tag "${npm_dist_tag:=latest}" || fail "Could not publish ${npm_dist_tag} release." + npm publish $DRY_RUN --access public --tag "${npm_dist_tag:=latest}" || fail "Could not publish ${npm_dist_tag} release." fi diff --git a/developer/js/package-lock.json b/developer/js/package-lock.json index 84c1f97273..396be7a9ed 100644 --- a/developer/js/package-lock.json +++ b/developer/js/package-lock.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-compiler", - "version": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/developer/js/package.json b/developer/js/package.json index 56a0bb69e9..ba840d7e8f 100644 --- a/developer/js/package.json +++ b/developer/js/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/lexical-model-compiler", - "version": "14.0.155", + "version": "14.0.157", "description": "Keyman Developer lexical model compiler", "keywords": [ "keyboard", @@ -37,14 +37,14 @@ "node": ">=12.0.0" }, "dependencies": { - "@keymanapp/models-types": "^14.0.155", + "@keymanapp/models-types": "^14.0.157", "commander": "^3.0.0", "typescript": "^3.8.3", "xml2js": "^0.4.19" }, "devDependencies": { - "@keymanapp/models-templates": "^14.0.155", - "@keymanapp/models-wordbreakers": "^14.0.155", + "@keymanapp/models-templates": "^14.0.157", + "@keymanapp/models-wordbreakers": "^14.0.157", "@types/chai": "^4.1.7", "@types/mocha": "^5.2.7", "@types/node": "^10.14.6", diff --git a/lerna.json b/lerna.json index 8057db79ec..60a419d7dc 100644 --- a/lerna.json +++ b/lerna.json @@ -16,5 +16,5 @@ "lerna", "typescript" ], - "version": "14.0.155" + "version": "14.0.157" } diff --git a/oem/firstvoices/windows/src/inst/download.in b/oem/firstvoices/windows/src/inst/download.in index e7d41cc41b..f31c2fe3c4 100644 --- a/oem/firstvoices/windows/src/inst/download.in +++ b/oem/firstvoices/windows/src/inst/download.in @@ -8,9 +8,9 @@ default: echo Please don't call this file directly -- used by Makefile copyredist-desktop: - -mkdir $(ROOT)\release\$VERSION - copy /Y firstvoices.msi $(ROOT)\release\$VERSION\firstvoices.msi - copy /Y firstvoices.exe $(ROOT)\release\$VERSION\firstvoices-$VERSION.exe + -mkdir $(ROOT)\release\$Version + copy /Y firstvoices.msi $(ROOT)\release\$Version\firstvoices.msi + copy /Y firstvoices.exe $(ROOT)\release\$Version\firstvoices-$Version.exe prepareredist: rem prepareredist @@ -20,5 +20,5 @@ clean: candle-desktop: $(WIXHEAT) dir ..\xml -o desktopui.wxs -ag -cg DesktopUI -dr INSTALLDIR -suid -var var.DESKTOPUISOURCE -wx -nologo - $(WIXCANDLE) -dOEMNAME="$(OEMNAME)" -dPRODUCTNAME="$(PRODUCTNAME)" -dROOT="$(ROOT)" -dVERSION=$VERSION -dRELEASE=$RELEASE -dPRODUCTID=$GUID1 -dDESKTOPUISOURCE=..\xml firstvoices.wxs desktopui.wxs + $(WIXCANDLE) -dOEMNAME="$(OEMNAME)" -dPRODUCTNAME="$(PRODUCTNAME)" -dROOT="$(ROOT)" -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dPRODUCTID=$GUID1 -dDESKTOPUISOURCE=..\xml firstvoices.wxs desktopui.wxs diff --git a/oem/firstvoices/windows/src/localedef.dtd.in b/oem/firstvoices/windows/src/localedef.dtd.in index c3e0484ada..4d5acac59a 100644 --- a/oem/firstvoices/windows/src/localedef.dtd.in +++ b/oem/firstvoices/windows/src/localedef.dtd.in @@ -1,7 +1,7 @@ - + diff --git a/resources/gosh/package-lock.json b/resources/gosh/package-lock.json index 58ab6d723e..856bd91481 100644 --- a/resources/gosh/package-lock.json +++ b/resources/gosh/package-lock.json @@ -1,5 +1,5 @@ { "name": "@keymanapp/resources-gosh", - "version": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1 } diff --git a/resources/gosh/package.json b/resources/gosh/package.json index 113d6d4c26..cf1a851b77 100644 --- a/resources/gosh/package.json +++ b/resources/gosh/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/resources-gosh", - "version": "14.0.155", + "version": "14.0.157", "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 7144802e22..4daaa39a65 100644 --- a/resources/web-environment/package-lock.json +++ b/resources/web-environment/package-lock.json @@ -1,5 +1,5 @@ { "name": "@keymanapp/web-environment", - "version": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1 } diff --git a/resources/web-environment/package.json b/resources/web-environment/package.json index 64604cef40..189b9ef859 100644 --- a/resources/web-environment/package.json +++ b/resources/web-environment/package.json @@ -1,6 +1,6 @@ { "name": "@keymanapp/web-environment", - "version": "14.0.155", + "version": "14.0.157", "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": "^14.0.155" + "@keymanapp/resources-gosh": "^14.0.157" } } diff --git a/web/package-lock.json b/web/package-lock.json index e0cec38520..6c16f8e701 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "14.0.155", + "version": "14.0.157", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/web/package.json b/web/package.json index 1e91dafbd2..b1b238fcd0 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "keyman", - "version": "14.0.155", + "version": "14.0.157", "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": "^14.0.155", - "@keymanapp/web-sentry-manager": "^14.0.155", + "@keymanapp/resources-gosh": "^14.0.157", + "@keymanapp/web-sentry-manager": "^14.0.157", "@sentry/cli": "^1.52.3", "chai": "^4.2.0", "google-closure-compiler-java": "^20200224.0.0", @@ -52,13 +52,13 @@ "sentry-cli": "sentry-cli" }, "dependencies": { - "@keymanapp/input-processor": "^14.0.155", - "@keymanapp/keyboard-processor": "^14.0.155", - "@keymanapp/lexical-model-layer": "^14.0.155", - "@keymanapp/models-types": "^14.0.155", - "@keymanapp/recorder-core": "^14.0.155", - "@keymanapp/web-environment": "^14.0.155", - "@keymanapp/web-utils": "^14.0.155", + "@keymanapp/input-processor": "^14.0.157", + "@keymanapp/keyboard-processor": "^14.0.157", + "@keymanapp/lexical-model-layer": "^14.0.157", + "@keymanapp/models-types": "^14.0.157", + "@keymanapp/recorder-core": "^14.0.157", + "@keymanapp/web-environment": "^14.0.157", + "@keymanapp/web-utils": "^14.0.157", "@types/node": "^11.9.4", "es6-shim": "^0.35.5", "eventemitter3": "^4.0.0", diff --git a/web/source/kmwembedded.ts b/web/source/kmwembedded.ts index 54eb96c542..ef38a8e14b 100644 --- a/web/source/kmwembedded.ts +++ b/web/source/kmwembedded.ts @@ -386,14 +386,19 @@ namespace com.keyman.text { osk.vkbd.keyPending = null; // Changes for Build 353 to resolve KMEI popup key issues - keyName=keyName.replace('popup-',''); //remove popup prefix if present (unlikely) - - var t=keyName.split('-'),layer=(t.length>1?t[0]:core.keyboardProcessor.layerId); - keyName=t[t.length-1]; + keyName=keyName.replace('popup-',''); //remove popup prefix if present (unlikely) + + // Can't just split on '-' because some layers like ctrl-shift contain it. + let separatorIndex = keyName.lastIndexOf('-'); + var layer = core.keyboardProcessor.layerId; + if (separatorIndex > 0) { + layer = keyName.substring(0, separatorIndex); + keyName = keyName.substring(separatorIndex+1); + } if(layer == 'undefined') { layer=core.keyboardProcessor.layerId; } - + // Note: this assumes Lelem is properly attached and has an element interface. // Currently true in the Android and iOS apps. var Lelem=keymanweb.domManager.getLastActiveElement(),keyShiftState=com.keyman.text.KeyboardProcessor.getModifierState(layer); diff --git a/web/source/osk/banner.ts b/web/source/osk/banner.ts index 36e2a37d2a..a1e9252450 100644 --- a/web/source/osk/banner.ts +++ b/web/source/osk/banner.ts @@ -266,7 +266,7 @@ namespace com.keyman.osk { } // Apply the Suggestion! - return keyman.core.languageProcessor.acceptSuggestion(this.suggestion, target); + return keyman.core.languageProcessor.applySuggestion(this.suggestion, target); } } diff --git a/windows/src/Defines.mak b/windows/src/Defines.mak index 0c7f6e6b69..0c1aaceb8d 100644 --- a/windows/src/Defines.mak +++ b/windows/src/Defines.mak @@ -162,7 +162,7 @@ NMAKE=nmake.exe CL=cl.exe MSBUILD=msbuild.exe # /maxcpucount see https://devblogs.microsoft.com/cppblog/precompiled-header-pch-issues-and-recommendations/ -MT="C:\Program Files (x86)\Windows Kits\8.1\bin\x86\mt.exe" +MT=mt.exe VCBUILD=error !IFDEF DEBUG diff --git a/windows/src/README.md b/windows/src/README.md index 4e639c5168..fad08256ae 100644 --- a/windows/src/README.md +++ b/windows/src/README.md @@ -91,7 +91,7 @@ In Visual Studio 2017, you need to have the following installed: #### Individual components * Windows Universal CRT SDK -* Windows 8.1 SDK +* Windows 10.0.17763.0 SDK Configure Visual Studio to use two-space tab stops: 1. Open the options dialog: Tools > Options. diff --git a/windows/src/buildtools/getfilelocks/getfilelocks.vcxproj b/windows/src/buildtools/getfilelocks/getfilelocks.vcxproj index b4672daaab..7743a661a5 100644 --- a/windows/src/buildtools/getfilelocks/getfilelocks.vcxproj +++ b/windows/src/buildtools/getfilelocks/getfilelocks.vcxproj @@ -14,7 +14,7 @@ {D737021A-16A7-9AED-C550-640E9E0582B2} - 8.1 + 10.0.17763.0 diff --git a/windows/src/buildtools/help-keyman-com.sh b/windows/src/buildtools/help-keyman-com.sh index dc2f40581e..2e4ab9b9bb 100644 --- a/windows/src/buildtools/help-keyman-com.sh +++ b/windows/src/buildtools/help-keyman-com.sh @@ -5,6 +5,15 @@ # SHLVL=0 +set -e +set -u + +## 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 + # # Allows us to check for existence of subfolders in help/ # @@ -19,7 +28,6 @@ shopt -s nullglob # These are passed via environment: # # HELP_KEYMAN_COM = the home of the help.keyman.com repository -# MAJOR_VERSION = 10.0, 11.0, etc # # That repo must have push to origin configured and logged in # @@ -29,11 +37,6 @@ if [ -z ${HELP_KEYMAN_COM+x} ]; then exit 1 fi -if [ -z ${MAJOR_VERSION+x} ]; then - >&2 echo "Not uploading documentation: must set MAJOR_VERSION in environment." - exit 1 -fi - if [ ! -d "$HELP_KEYMAN_COM/products/desktop/" ]; then >&2 echo "HELP_KEYMAN_COM path ($HELP_KEYMAN_COM) does not appear to be valid." exit 1 @@ -82,7 +85,7 @@ function upload_keyman_desktop_help { return 0 fi - local dstpath="$HELP_KEYMAN_COM/products/desktop/$MAJOR_VERSION/docs" + local dstpath="$HELP_KEYMAN_COM/products/desktop/$VERSION_RELEASE/docs" mkdir -p "$dstpath" @@ -92,6 +95,7 @@ function upload_keyman_desktop_help { # # Commit and push to the help.keyman.com repo +# TODO: turn this into a pull request # function commit_and_push { @@ -100,7 +104,7 @@ function commit_and_push { pushd $HELP_KEYMAN_COM git config user.name "Keyman Build Server" git config user.email "keyman-server@users.noreply.github.com" - git add products/desktop/$MAJOR_VERSION/docs || return 1 + git add products/desktop/$VERSION_RELEASE/docs || return 1 git diff --cached --no-ext-diff --quiet --exit-code && { # if no changes then don't do anything. echo "No changes to commit" diff --git a/windows/src/buildtools/inst/copydebug.in b/windows/src/buildtools/inst/copydebug.in index 4a8380375f..4f7cb7e761 100644 --- a/windows/src/buildtools/inst/copydebug.in +++ b/windows/src/buildtools/inst/copydebug.in @@ -7,36 +7,36 @@ SIGNCODE_BUILD=1 !include ..\..\Defines.mak copydebug: - -mkdir $(ROOT)\release\$VERSION + -mkdir $(ROOT)\release\$Version echo mkdir c:\kmsymbols > $(ROOT)\src\install.bat - echo mkdir c:\kmsymbols\$VERSION >> $(ROOT)\src\install.bat - echo copy *.tds c:\kmsymbols\$VERSION >> $(ROOT)\src\install.bat - echo copy *.dbg c:\kmsymbols\$VERSION >> $(ROOT)\src\install.bat - echo copy *.pdb c:\kmsymbols\$VERSION >> $(ROOT)\src\install.bat + echo mkdir c:\kmsymbols\$Version >> $(ROOT)\src\install.bat + echo copy *.tds c:\kmsymbols\$Version >> $(ROOT)\src\install.bat + echo copy *.dbg c:\kmsymbols\$Version >> $(ROOT)\src\install.bat + echo copy *.pdb c:\kmsymbols\$Version >> $(ROOT)\src\install.bat echo regedit /s tds.reg >> $(ROOT)\src\install.bat $(WZZIP) $(ROOT)\src\tds.zip $(ROOT)\src\install.bat $(ROOT)\src\buildtools\inst\tds.reg rem Disabling symsrv upload from the build agents (2018-06-19 mcdurdin) - # "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\symstore" add /r /f $(ROOT)\debug\*.* /s c:\Tavultesoft\Debug\Symbols /t "Keyman" /v "Build $VERSION" /c "Release $VERSION" - # "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\symstore" add /r /f $(ROOT)\bin\*.* /s c:\Tavultesoft\Debug\Symbols /t "Keyman" /v "Build $VERSION" /c "Release $VERSION" + # "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\symstore" add /r /f $(ROOT)\debug\*.* /s c:\Tavultesoft\Debug\Symbols /t "Keyman" /v "Build $Version" /c "Release $Version" + # "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\symstore" add /r /f $(ROOT)\bin\*.* /s c:\Tavultesoft\Debug\Symbols /t "Keyman" /v "Build $Version" /c "Release $Version" # ping localhost # delay for a few seconds # $(WZSE) $(ROOT)\src\tds.zip -setup -t $(ROOT)\src\buildtools\inst\tds_dialog.txt -c .\install.bat - copy $(ROOT)\src\tds.zip $(ROOT)\release\$VERSION\tds-$VERSION.zip + copy $(ROOT)\src\tds.zip $(ROOT)\release\$Version\tds-$Version.zip -del $(ROOT)\src\tds.zip del $(ROOT)\src\install.bat # wait 1 second -- gives winzip time to finish # ping -n 2 127.0.0.1 - # copy $(ROOT)\src\tds.exe $(ROOT)\release\$VERSION\tds-$VERSION.exe + # copy $(ROOT)\src\tds.exe $(ROOT)\release\$Version\tds-$Version.exe cd $(BUILD) - $(WZZIP) -r $(ROOT)\release\$VERSION\debug-$VERSION.zip *.zip + $(WZZIP) -r $(ROOT)\release\$Version\debug-$Version.zip *.zip uploadsymbols: rem Disabling symsrv upload from the build agents (2018-06-19 mcdurdin) - # "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\symstore" add /r /f $(ROOT)\debug\*.* /s c:\Tavultesoft\Debug\Symbols /t "Keyman" /v "Build $VERSION" /c "Release $VERSION" - # "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\symstore" add /r /f $(ROOT)\bin\*.* /s c:\Tavultesoft\Debug\Symbols /t "Keyman" /v "Build $VERSION" /c "Release $VERSION" + # "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\symstore" add /r /f $(ROOT)\debug\*.* /s c:\Tavultesoft\Debug\Symbols /t "Keyman" /v "Build $Version" /c "Release $Version" + # "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\symstore" add /r /f $(ROOT)\bin\*.* /s c:\Tavultesoft\Debug\Symbols /t "Keyman" /v "Build $Version" /c "Release $Version" diff --git a/windows/src/buildtools/inst/srcbackup.in b/windows/src/buildtools/inst/srcbackup.in index 01de6b8231..f957819f7d 100644 --- a/windows/src/buildtools/inst/srcbackup.in +++ b/windows/src/buildtools/inst/srcbackup.in @@ -5,6 +5,6 @@ !include ..\..\Defines.mak srcbackup: - -mkdir $(ROOT)\release\$VERSION + -mkdir $(ROOT)\release\$Version cd $(ROOT)\src - $(WZZIP) -r -x!*.ipch -x!*.sdf -x!*.db $(ROOT)\release\$VERSION\src-$VERSION.zip *.* + $(WZZIP) -r -x!*.ipch -x!*.sdf -x!*.db $(ROOT)\release\$Version\src-$Version.zip *.* diff --git a/windows/src/desktop/help/install.in b/windows/src/desktop/help/install.in index 050ebe3173..92d833bcf9 100644 --- a/windows/src/desktop/help/install.in +++ b/windows/src/desktop/help/install.in @@ -6,5 +6,5 @@ install: if not exist $(KEYMAN_SITE_ROOT)\help.keyman.com\products\desktop exit 1 - -rd /s/q $(KEYMAN_SITE_ROOT)\help.keyman.com\products\desktop\$RELEASE\docs - xcopy /s/q/y $(ROOT)\bin\help\php\desktop\* $(KEYMAN_SITE_ROOT)\help.keyman.com\products\desktop\$RELEASE\docs\ # + -rd /s/q $(KEYMAN_SITE_ROOT)\help.keyman.com\products\desktop\$VersionRelease\docs + xcopy /s/q/y $(ROOT)\bin\help\php\desktop\* $(KEYMAN_SITE_ROOT)\help.keyman.com\products\desktop\$VersionRelease\docs\ # diff --git a/windows/src/desktop/inst/download.in b/windows/src/desktop/inst/download.in index dcc2656dfd..6b8ff11d21 100644 --- a/windows/src/desktop/inst/download.in +++ b/windows/src/desktop/inst/download.in @@ -12,10 +12,10 @@ default: echo Please don't call this file directly -- used by Makefile copyredist-desktop: - -mkdir $(ROOT)\release\$VERSION - copy /Y keymandesktop.msi $(ROOT)\release\$VERSION\keymandesktop.msi - copy /Y keymandesktop.exe $(ROOT)\release\$VERSION\keymandesktop-$VERSION.exe - copy /Y $(ROOT)\bin\desktop\setup.exe $(ROOT)\release\$VERSION\setup.exe + -mkdir $(ROOT)\release\$Version + copy /Y keymandesktop.msi $(ROOT)\release\$Version\keymandesktop.msi + copy /Y keymandesktop.exe $(ROOT)\release\$Version\keymandesktop-$Version.exe + copy /Y $(ROOT)\bin\desktop\setup.exe $(ROOT)\release\$Version\setup.exe prepareredist: rem prepareredist @@ -31,7 +31,7 @@ candle: candle-desktop candle-cef candle-locale candle-desktop: $(WIXHEAT) dir ..\kmshell\xml -o desktopui.wxs -ag -cg DesktopUI -dr INSTALLDIR -suid -var var.DESKTOPUISOURCE -wx -nologo - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE -dPRODUCTID=$GUID1 -dDESKTOPUISOURCE=..\kmshell\xml keymandesktop.wxs desktopui.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dPRODUCTID=$GUID1 -dDESKTOPUISOURCE=..\kmshell\xml keymandesktop.wxs desktopui.wxs # # Chromium Embedded Framework @@ -47,7 +47,7 @@ heat-cef: -rmdir /s/q $(KEYMAN_WIX_TEMP_CEF) candle-cef: heat-cef - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE -dCefSourceDir=$(KEYMAN_CEF4DELPHI_ROOT) cef.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dCefSourceDir=$(KEYMAN_CEF4DELPHI_ROOT) cef.wxs # # Locale files @@ -56,4 +56,4 @@ candle-cef: heat-cef candle-locale: # locale files are in desktop/locale/* $(WIXHEAT) dir ..\kmshell\locale -o locale.wxs -ag -cg Locale -dr INSTALLDIR -var var.LOCALESOURCE -wx -nologo - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE -dPRODUCTID=$GUID1 -dLOCALESOURCE=..\kmshell\locale locale.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dPRODUCTID=$GUID1 -dLOCALESOURCE=..\kmshell\locale locale.wxs diff --git a/windows/src/desktop/insthelp/manifest.in b/windows/src/desktop/insthelp/manifest.in index e43d6cb0c8..63d855f57e 100644 --- a/windows/src/desktop/insthelp/manifest.in +++ b/windows/src/desktop/insthelp/manifest.in @@ -3,7 +3,7 @@ Keyman Engine Installation Assistant diff --git a/windows/src/desktop/kmbrowserhost/manifest.in b/windows/src/desktop/kmbrowserhost/manifest.in index 3453c33d9a..4619ab9b98 100644 --- a/windows/src/desktop/kmbrowserhost/manifest.in +++ b/windows/src/desktop/kmbrowserhost/manifest.in @@ -1,6 +1,6 @@ - + Keyman Desktop Browser Host Process diff --git a/windows/src/desktop/kmshell/localedef.dtd.in b/windows/src/desktop/kmshell/localedef.dtd.in index 71fe3566fb..573883bdb5 100644 --- a/windows/src/desktop/kmshell/localedef.dtd.in +++ b/windows/src/desktop/kmshell/localedef.dtd.in @@ -1,7 +1,7 @@ - + diff --git a/windows/src/desktop/kmshell/manifest.in b/windows/src/desktop/kmshell/manifest.in index d78c4d2e92..adb78d82c6 100644 --- a/windows/src/desktop/kmshell/manifest.in +++ b/windows/src/desktop/kmshell/manifest.in @@ -1,6 +1,6 @@ - + Keyman Desktop diff --git a/windows/src/desktop/setup/debug-manifest.in b/windows/src/desktop/setup/debug-manifest.in index e728e7a0e8..9a23a4f1b1 100644 --- a/windows/src/desktop/setup/debug-manifest.in +++ b/windows/src/desktop/setup/debug-manifest.in @@ -1,6 +1,6 @@ - + Keyman Desktop Setup diff --git a/windows/src/desktop/setup/manifest.in b/windows/src/desktop/setup/manifest.in index 05dac87a5e..0c23e6a31d 100644 --- a/windows/src/desktop/setup/manifest.in +++ b/windows/src/desktop/setup/manifest.in @@ -1,6 +1,6 @@ - + Keyman Desktop Setup diff --git a/windows/src/developer/TIKE/manifest.in b/windows/src/developer/TIKE/manifest.in index 84aef9f8c9..81e9234dec 100644 --- a/windows/src/developer/TIKE/manifest.in +++ b/windows/src/developer/TIKE/manifest.in @@ -1,6 +1,6 @@ - + Keyman Developer diff --git a/windows/src/developer/inst/Makefile b/windows/src/developer/inst/Makefile index 33e8c70d24..4b4a84dcca 100644 --- a/windows/src/developer/inst/Makefile +++ b/windows/src/developer/inst/Makefile @@ -15,15 +15,15 @@ setup: # cd $(ROOT)\src\developer\inst - $(MKVER_U) copydev.in copydev.mak + $(MKVER_U) download.in download.mak # # Build the installation archive # - $(MAKE) -fcopydev.mak candle + $(MAKE) -fdownload.mak candle $(WIXLIGHT) -sice:ICE91 -sice:ICE60 -dWixUILicenseRtf=License.rtf -out keymandeveloper.msi -ext WixUIExtension $(DEVELOPER_FILES) - $(MAKE) -fcopydev.mak clean-heat + $(MAKE) -fdownload.mak clean-heat # # Sign the installation archive @@ -36,7 +36,7 @@ setup: # cd $(ROOT)\src\developer\inst - $(MAKE) -fcopydev.mak + $(MAKE) -fdownload.mak build: @rem @@ -49,7 +49,7 @@ backup: clean: cd $(ROOT)\src\developer\inst - -del /Q copydev.mak + -del /Q download.mak -del /Q *.msi -del /Q *.msp -del /Q *.wixobj @@ -66,9 +66,9 @@ clean: test-releaseexists: cd $(ROOT)\src\developer\inst - $(MKVER_U) copydev.in copydev.mak + $(MKVER_U) download.in download.mak - $(MAKE) -fcopydev.mak test-releaseexists + $(MAKE) -fdownload.mak test-releaseexists install: @rem diff --git a/windows/src/developer/inst/copydev.in b/windows/src/developer/inst/download.in similarity index 82% rename from windows/src/developer/inst/copydev.in rename to windows/src/developer/inst/download.in index e3e761404f..5b99e09053 100644 --- a/windows/src/developer/inst/copydev.in +++ b/windows/src/developer/inst/download.in @@ -1,7 +1,7 @@ !include ..\..\Defines.mak ## -## In this file, $VERSION and $RELEASE will be replaced by mkver. These are not +## In this file, $Version, $VersionWin, and $VersionRelease will be replaced by mkver. These are not ## Make variables, but mkver variables. ## @@ -22,19 +22,19 @@ KEYMAN_DEVELOPER_TEMPLATES_ROOT=$(ROOT)\src\developer\kmconvert\data KEYMAN_MODELCOMPILER_ROOT=$(KEYMAN_ROOT)\developer\js copykmdev: makeinstaller - -mkdir $(ROOT)\release\$VERSION - copy /Y $(ROOT)\src\developer\inst\keymandeveloper.msi $(ROOT)\release\$VERSION\keymandeveloper.msi - copy /Y $(ROOT)\src\developer\inst\keymandeveloper-$VERSION.exe $(ROOT)\release\$VERSION\keymandeveloper-$VERSION.exe + -mkdir $(ROOT)\release\$Version + copy /Y $(ROOT)\src\developer\inst\keymandeveloper.msi $(ROOT)\release\$Version\keymandeveloper.msi + copy /Y $(ROOT)\src\developer\inst\keymandeveloper-$Version.exe $(ROOT)\release\$Version\keymandeveloper-$Version.exe test-releaseexists: - if exist $(ROOT)\release\$VERSION\keymandeveloper*.msi echo. & echo Release $VERSION already exists. Delete it or update src\version.txt and try again & exit 1 + if exist $(ROOT)\release\$Version\keymandeveloper*.msi echo. & echo Release $Version already exists. Delete it or update VERSION.md and try again & exit 1 candle: heat-cef heat-xml heat-templates heat-model-compiler - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE kmdev.wxs - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE -dXmlSourceDir=$(ROOT)\src\developer\TIKE\xml xml.wxs - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE -dCefSourceDir=$(KEYMAN_CEF4DELPHI_ROOT) cef.wxs - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE -dTemplatesSourceDir=$(KEYMAN_DEVELOPER_TEMPLATES_ROOT) templates.wxs - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE -dModelCompilerSourceDir=$(KEYMAN_WIX_TEMP_MODELCOMPILER) kmlmc.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease kmdev.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dXmlSourceDir=$(ROOT)\src\developer\TIKE\xml xml.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dCefSourceDir=$(KEYMAN_CEF4DELPHI_ROOT) cef.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dTemplatesSourceDir=$(KEYMAN_DEVELOPER_TEMPLATES_ROOT) templates.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -dModelCompilerSourceDir=$(KEYMAN_WIX_TEMP_MODELCOMPILER) kmlmc.wxs clean-heat: clean-heat-model-compiler @@ -73,9 +73,9 @@ heat-model-compiler: cd $(KEYMAN_MODELCOMPILER_ROOT) !ifdef GIT_BASH_FOR_KEYMAN - $(GIT_BASH_FOR_KEYMAN) build.sh -version "$VERSION" -tier "$(TIER)" + $(GIT_BASH_FOR_KEYMAN) build.sh !else - start /wait .\build.sh -version "$VERSION" -tier "$(TIER)" + start /wait .\build.sh !endif # We use `npm pack` to extract only the aspects of the model-compiler actually needed for distribution. # While we could use npm-bundle or similar, that adds extra, unwanted cruft; our approach gives us more @@ -141,9 +141,9 @@ clean-heat-model-compiler: makeinstaller: cd $(ROOT)\src\developer\inst echo [Setup] > setup.inf - echo Version=$VERSION >> setup.inf + echo Version=$Version >> setup.inf echo MSIFileName=keymandeveloper.msi >> setup.inf - echo Title=Keyman Developer $RELEASE >>setup.inf + echo Title=Keyman Developer $VersionRelease >>setup.inf $(WZZIP) setup.zip keymandeveloper.msi setup.inf - copy /b $(ROOT)\bin\developer\setup.exe + setup.zip keymandeveloper-$VERSION.exe - $(SIGNCODE) /d "Keyman Developer" keymandeveloper-$VERSION.exe + copy /b $(ROOT)\bin\developer\setup.exe + setup.zip keymandeveloper-$Version.exe + $(SIGNCODE) /d "Keyman Developer" keymandeveloper-$Version.exe diff --git a/windows/src/developer/kmcmpdll/kcframe.vcxproj b/windows/src/developer/kmcmpdll/kcframe.vcxproj index cf865a0ec4..eb02ce1ad5 100644 --- a/windows/src/developer/kmcmpdll/kcframe.vcxproj +++ b/windows/src/developer/kmcmpdll/kcframe.vcxproj @@ -21,7 +21,7 @@ {E92CC897-8228-4728-8110-028088D7A99C} kcframe - 8.1 + 10.0.17763.0 diff --git a/windows/src/developer/kmcmpdll/kmcmpdll.vcxproj b/windows/src/developer/kmcmpdll/kmcmpdll.vcxproj index 3f443976c8..15d2197391 100644 --- a/windows/src/developer/kmcmpdll/kmcmpdll.vcxproj +++ b/windows/src/developer/kmcmpdll/kmcmpdll.vcxproj @@ -21,7 +21,7 @@ {7E26FE08-721E-424B-9DA0-4A0DCA88A86E} kmcmpdll - 8.1 + 10.0.17763.0 diff --git a/windows/src/developer/kmcomp/manifest.in b/windows/src/developer/kmcomp/manifest.in index cc8354af8a..7123001713 100644 --- a/windows/src/developer/kmcomp/manifest.in +++ b/windows/src/developer/kmcomp/manifest.in @@ -1,6 +1,6 @@ - + Keyman Developer Command Line Compiler diff --git a/windows/src/developer/kmconvert/manifest.in b/windows/src/developer/kmconvert/manifest.in index 1a16ded596..5d9c732293 100644 --- a/windows/src/developer/kmconvert/manifest.in +++ b/windows/src/developer/kmconvert/manifest.in @@ -1,6 +1,6 @@ - + Keyman Developer Conversion Utility diff --git a/windows/src/developer/kmdecomp/kmdecomp.vcxproj b/windows/src/developer/kmdecomp/kmdecomp.vcxproj index 9b05b9f22f..c120a6d763 100644 --- a/windows/src/developer/kmdecomp/kmdecomp.vcxproj +++ b/windows/src/developer/kmdecomp/kmdecomp.vcxproj @@ -12,7 +12,7 @@ {963D608A-6689-469C-AE42-F56696DD42CC} - 8.1 + 10.0.17763.0 diff --git a/windows/src/developer/samples/imsample/IMSample.vcxproj b/windows/src/developer/samples/imsample/IMSample.vcxproj index 2860179ab1..5569efdc69 100644 --- a/windows/src/developer/samples/imsample/IMSample.vcxproj +++ b/windows/src/developer/samples/imsample/IMSample.vcxproj @@ -14,6 +14,7 @@ {0C9DB8F9-B788-8782-A97D-4F8294AA0B4E} + 10.0.17763.0 diff --git a/windows/src/developer/setup/manifest.in b/windows/src/developer/setup/manifest.in index 528a612937..64716356fb 100644 --- a/windows/src/developer/setup/manifest.in +++ b/windows/src/developer/setup/manifest.in @@ -1,6 +1,6 @@ - + Keyman Desktop Setup diff --git a/windows/src/engine/inst/download.in b/windows/src/engine/inst/download.in index 7de5f73386..7c4da0b5a1 100644 --- a/windows/src/engine/inst/download.in +++ b/windows/src/engine/inst/download.in @@ -8,8 +8,8 @@ default: echo Please don't call this file directly -- used by Makefile copyredist: - -mkdir $(ROOT)\release\$VERSION - copy /Y $(ROOT)\src\engine\inst\keymanengine.msm $(ROOT)\release\$VERSION\keymanengine-$VERSION.msm + -mkdir $(ROOT)\release\$Version + copy /Y $(ROOT)\src\engine\inst\keymanengine.msm $(ROOT)\release\$Version\keymanengine-$Version.msm prepareredist: rem @@ -18,4 +18,4 @@ clean: rem candle: - $(WIXCANDLE) -dVERSION=$VERSION -dRELEASE=$RELEASE -ext WixUtilExtension keymanengine.wxs components.wxs + $(WIXCANDLE) -dVERSION=$VersionWin -dRELEASE=$VersionRelease -ext WixUtilExtension keymanengine.wxs components.wxs diff --git a/windows/src/engine/keyman/debug-manifest.in b/windows/src/engine/keyman/debug-manifest.in index c6e6ff8b6e..30cd649514 100644 --- a/windows/src/engine/keyman/debug-manifest.in +++ b/windows/src/engine/keyman/debug-manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine diff --git a/windows/src/engine/keyman/main.pas b/windows/src/engine/keyman/main.pas index 18ad8516e8..a4559025d3 100644 --- a/windows/src/engine/keyman/main.pas +++ b/windows/src/engine/keyman/main.pas @@ -1,18 +1,18 @@ (* Name: main Copyright: Copyright (C) SIL International. - Documentation: - Description: + Documentation: + Description: Create Date: 1 Aug 2006 Modified Date: 25 Oct 2016 Authors: mcdurdin - Related Files: - Dependencies: + Related Files: + Dependencies: - Bugs: - Todo: - Notes: + Bugs: + Todo: + Notes: History: 01 Aug 2006 - mcdurdin - Initial version 02 Aug 2006 - mcdurdin - Timeout when Beta expires 04 Dec 2006 - mcdurdin - Block Keyman loading if KM5/6 running @@ -35,8 +35,9 @@ uses Vcl.Dialogs, Vcl.Forms, Winapi.Windows, - System.Win.Registry, + System.Classes, System.SysUtils, + System.Win.Registry, GetOsVersion, Keyman.System.Security, @@ -189,17 +190,30 @@ end; procedure InitialiseRegistrySecurity; var r: TRegistry; + + procedure ProcessKey(const root: string); + var + s: string; + str: TStringList; + begin + if r.OpenKey('\' + root, True) then + begin + str := TStringList.Create; + try + r.GetKeyNames(str); + GrantPermissionToAllApplicationPackages(r.CurrentKey, KEY_READ); + for s in str do + ProcessKey(root + '\' + s); + finally + str.Free; + end; + end; + end; + begin r := TRegistry.Create; try - if r.OpenKey(SRegKey_KeymanRoot_CU, True) then - begin - GrantPermissionToAllApplicationPackages(r.CurrentKey, KEY_READ); - // #1680 - on some systems, HKCU\Software\Keyman\Keyman Engine is not - // inheriting permissions from HKCU\Software\Keyman - if r.OpenKey('\' + SRegKey_KeymanEngineRoot_CU, True) then - GrantPermissionToAllApplicationPackages(r.CurrentKey, KEY_READ); - end; + ProcessKey(SRegKey_KeymanRoot_CU); finally r.Free; end; diff --git a/windows/src/engine/keyman/manifest.in b/windows/src/engine/keyman/manifest.in index fc2b794113..63b5df1925 100644 --- a/windows/src/engine/keyman/manifest.in +++ b/windows/src/engine/keyman/manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine diff --git a/windows/src/engine/keyman32/Keyman32.vcxproj b/windows/src/engine/keyman32/Keyman32.vcxproj index ce7c239ebd..967710cde8 100644 --- a/windows/src/engine/keyman32/Keyman32.vcxproj +++ b/windows/src/engine/keyman32/Keyman32.vcxproj @@ -13,7 +13,7 @@ {BD5564FB-35A5-4A3C-B96A-4A6578E2B593} Keyman32 - 8.1 + 10.0.17763.0 diff --git a/windows/src/engine/keyman64/keyman64.vcxproj b/windows/src/engine/keyman64/keyman64.vcxproj index 2efd99ae81..93083616ad 100644 --- a/windows/src/engine/keyman64/keyman64.vcxproj +++ b/windows/src/engine/keyman64/keyman64.vcxproj @@ -21,6 +21,7 @@ {D1115FB2-230D-4FD8-90B9-982E49953D18} Keyman32 + 10.0.17763.0 diff --git a/windows/src/engine/keymanx64/keymanx64.vcxproj b/windows/src/engine/keymanx64/keymanx64.vcxproj index b6f588cd1a..c16b2a9fd0 100644 --- a/windows/src/engine/keymanx64/keymanx64.vcxproj +++ b/windows/src/engine/keymanx64/keymanx64.vcxproj @@ -22,6 +22,7 @@ {A34650EA-D6E8-4229-8091-6BF1443565B5} keymanx64 Win32Proj + 10.0.17763.0 diff --git a/windows/src/engine/keymanx64/manifest.in b/windows/src/engine/keymanx64/manifest.in index 25e19871ed..3aea02d2fc 100644 --- a/windows/src/engine/keymanx64/manifest.in +++ b/windows/src/engine/keymanx64/manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine x64 diff --git a/windows/src/engine/kmcomapi/manifest.in b/windows/src/engine/kmcomapi/manifest.in index 131617a0ce..6e2606cbce 100644 --- a/windows/src/engine/kmcomapi/manifest.in +++ b/windows/src/engine/kmcomapi/manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine API diff --git a/windows/src/engine/kmtip/kmtip.vcxproj b/windows/src/engine/kmtip/kmtip.vcxproj index 4b5dd24290..1759b67a8d 100644 --- a/windows/src/engine/kmtip/kmtip.vcxproj +++ b/windows/src/engine/kmtip/kmtip.vcxproj @@ -20,6 +20,7 @@ {93391ECB-E2F1-4D23-B85E-6FDEB7ACF9B4} + 10.0.17763.0 diff --git a/windows/src/engine/mcompile/manifest.in b/windows/src/engine/mcompile/manifest.in index 6f1b2419db..a891c20d67 100644 --- a/windows/src/engine/mcompile/manifest.in +++ b/windows/src/engine/mcompile/manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine x64 diff --git a/windows/src/engine/mcompile/mcompile.vcxproj b/windows/src/engine/mcompile/mcompile.vcxproj index fc4d7493b7..5dab03a750 100644 --- a/windows/src/engine/mcompile/mcompile.vcxproj +++ b/windows/src/engine/mcompile/mcompile.vcxproj @@ -15,6 +15,7 @@ Win32Proj mtop mcompile + 10.0.17763.0 diff --git a/windows/src/engine/tsysinfo/manifest.in b/windows/src/engine/tsysinfo/manifest.in index a9462ce786..b9e49cfdf8 100644 --- a/windows/src/engine/tsysinfo/manifest.in +++ b/windows/src/engine/tsysinfo/manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine Diagnostics diff --git a/windows/src/engine/tsysinfox64/manifest.in b/windows/src/engine/tsysinfox64/manifest.in index 71059c79a3..a18341264e 100644 --- a/windows/src/engine/tsysinfox64/manifest.in +++ b/windows/src/engine/tsysinfox64/manifest.in @@ -1,6 +1,6 @@ - + Keyman Engine Diagnostics x64 diff --git a/windows/src/ext/tds2dbg/tds2dbg.vcxproj b/windows/src/ext/tds2dbg/tds2dbg.vcxproj index 2b5f0931c3..8d57ae5c66 100644 --- a/windows/src/ext/tds2dbg/tds2dbg.vcxproj +++ b/windows/src/ext/tds2dbg/tds2dbg.vcxproj @@ -22,6 +22,7 @@ 15.0 {40BFECE3-7FC0-4649-A3DC-E017FF84C75B} Win32Proj + 10.0.17763.0 diff --git a/windows/src/global/help/version.in b/windows/src/global/help/version.in index 00448a7c47..beb14e7ab8 100644 --- a/windows/src/global/help/version.in +++ b/windows/src/global/help/version.in @@ -1,5 +1,5 @@ diff --git a/windows/src/support/enumtsfcpp/enumtsfcpp/enumtsfcpp.vcxproj b/windows/src/support/enumtsfcpp/enumtsfcpp/enumtsfcpp.vcxproj index 8c6cfd7355..49fb23a4fb 100644 --- a/windows/src/support/enumtsfcpp/enumtsfcpp/enumtsfcpp.vcxproj +++ b/windows/src/support/enumtsfcpp/enumtsfcpp/enumtsfcpp.vcxproj @@ -22,6 +22,7 @@ {8B6195B3-F6F8-45E7-9FCD-A5437180DAE1} Win32Proj enumtsfcpp + 10.0.17763.0 diff --git a/windows/src/support/kmkb0045/manifest.in b/windows/src/support/kmkb0045/manifest.in index 678f04dc09..5c3f4b2c0d 100644 --- a/windows/src/support/kmkb0045/manifest.in +++ b/windows/src/support/kmkb0045/manifest.in @@ -5,7 +5,7 @@ Tavultesoft KMKB0045 diff --git a/windows/src/test/mnemonic-to-positional/importkeyboard/importkeyboard/importkeyboard.vcxproj b/windows/src/test/mnemonic-to-positional/importkeyboard/importkeyboard/importkeyboard.vcxproj index b17d1eaa47..8629810beb 100644 --- a/windows/src/test/mnemonic-to-positional/importkeyboard/importkeyboard/importkeyboard.vcxproj +++ b/windows/src/test/mnemonic-to-positional/importkeyboard/importkeyboard/importkeyboard.vcxproj @@ -14,6 +14,7 @@ {A4DF65F2-7C94-4CE9-93CD-625641B056B5} Win32Proj importkeyboard + 10.0.17763.0 diff --git a/windows/src/test/unit-tests/shared-data/cpp/cppshareddata.vcxproj b/windows/src/test/unit-tests/shared-data/cpp/cppshareddata.vcxproj index b45686582c..a4aeb94758 100644 --- a/windows/src/test/unit-tests/shared-data/cpp/cppshareddata.vcxproj +++ b/windows/src/test/unit-tests/shared-data/cpp/cppshareddata.vcxproj @@ -23,7 +23,7 @@ {748219AC-3BDE-40FC-8E93-7516C4BCE81D} Win32Proj cppshareddata - 8.1 + 10.0.17763.0