From 84875cdc6e691f8ff4e93ad61a56c37833165d87 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Thu, 16 Jan 2025 10:52:30 +0700 Subject: [PATCH 001/109] change(web): simplify context-tracker token cloning --- .../src/main/correction/context-tracker.ts | 27 ++++++++++--------- .../src/main/model-compositor.ts | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts index e9d45db394..4da99a369f 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts @@ -42,9 +42,15 @@ export class TrackedContextToken { isWhitespace?: boolean; transformDistributions: Distribution[] = []; - replacements: TrackedContextSuggestion[]; + replacements: TrackedContextSuggestion[] = []; activeReplacementId: number = -1; + constructor(); + constructor(instance: TrackedContextToken); + constructor(instance?: TrackedContextToken) { + Object.assign(this, instance); + } + get currentText(): string { if(this.replacementText === undefined || this.replacementText === null) { return this.raw; @@ -60,8 +66,9 @@ export class TrackedContextToken { }); } - revert() { - delete this.activeReplacementId; + clearReplacements() { + this.activeReplacementId = -1; + this.replacements = [] } /** @@ -85,7 +92,8 @@ export class TrackedContextToken { }); this.raw = tokenText; - this.transformDistributions = backspacedTokenContext; + this.transformDistributions = backspacedTokenContext; + this.clearReplacements(); } update(transformDistribution: Distribution, tokenText?: USVString) { @@ -98,6 +106,7 @@ export class TrackedContextToken { // Replace old token's raw-text with new token's raw-text. this.raw = tokenText; + this.clearReplacements(); } } @@ -127,15 +136,7 @@ export class TrackedContextState { // Be sure to deep-copy the tokens! Pointer-aliasing is bad here. this.tokens = source.tokens.map(function(token) { let copy = new TrackedContextToken(); - copy.raw = token.raw; - copy.replacements = [].concat(token.replacements); - copy.activeReplacementId = token.activeReplacementId; - copy.transformDistributions = [].concat(token.transformDistributions); - - if(token.replacementText) { - copy.replacementText = token.replacementText; - } - + Object.assign(copy, token); return copy; }); diff --git a/web/src/engine/predictive-text/worker-thread/src/main/model-compositor.ts b/web/src/engine/predictive-text/worker-thread/src/main/model-compositor.ts index f8d94eef22..d0b4658b13 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/model-compositor.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/model-compositor.ts @@ -318,7 +318,7 @@ export class ModelCompositor { this.contextTracker.popNewest(); } - this.contextTracker.newest.tail.revert(); + this.contextTracker.newest.tail.activeReplacementId = -1; // Will need to be modified a bit if/when phrase-level suggestions are implemented. // Those will be tracked on the first token of the phrase, which won't be the tail From e61e79e01b662735b8cdf309e6208ea09e998d09 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Thu, 16 Jan 2025 10:56:45 +0700 Subject: [PATCH 002/109] change(web): enable context-tracker matching to track across backspaces --- .../src/main/correction/context-tracker.ts | 69 ++++++++++++++----- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts index 4da99a369f..4e4df655a5 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts @@ -344,14 +344,18 @@ export class ContextTracker extends CircularArray { let editPath = mapping.editPath(); - // When the context has but two tokens, the path algorithm tends to invert + // When the context has but three tokens, the path algorithm tends to invert // 'insert' and 'substitute' from our preferred ordering for them. // Logically, either order makes sense... but logic for other cases is // far simpler if we have 'substitute' before 'insert'. - if(editPath.length == 2 && editPath[0] == 'insert' && editPath[1] == 'substitute') { + if(editPath.length == 3 && editPath[0] == 'insert' && editPath[1] == 'insert' && editPath[2] == 'substitute') { + editPath[0] = 'substitute'; + editPath[2] = 'insert'; + } else if(editPath.length == 2 && editPath[0] == 'insert' && editPath[1] == 'substitute') { + // This path may be reachable for languages without space-based wordbreaking. editPath[0] = 'substitute'; editPath[1] = 'insert'; - } + } const firstMatch = editPath.indexOf('match'); let lastMatch = editPath.lastIndexOf('match'); @@ -377,7 +381,7 @@ export class ContextTracker extends CircularArray { // If we have a perfect match with a pre-existing context, no mutations have // happened; just re-use the old context state. if(firstMatch == 0 && lastMatch == editPath.length - 1) { - return { state: matchState, baseState: matchState }; + return { state: matchState, baseState: matchState}; } // If mutations HAVE happened, we have work to do. @@ -457,8 +461,12 @@ export class ContextTracker extends CircularArray { // // This may happen if tokenization for pre-existing text changes due to incoming // input - refer to #12494 for an example case. - if(!primaryInput && incomingToken.text != '') { - return null; + if(editPath[i] != 'delete') { + if(!incomingToken) { + return null; + } else if(!primaryInput && incomingToken?.text != '') { + return null; + } } if(primaryInput && primaryInput.insert == "" && primaryInput.deleteLeft == 0 && !primaryInput.deleteRight) { @@ -482,8 +490,9 @@ export class ContextTracker extends CircularArray { state = new TrackedContextState(state); } + const sourceToken = matchState.tokens[i]; + state.tokens[i - poppedTokenCount] = sourceToken; const token = state.tokens[i - poppedTokenCount]; - const matchToken = matchState.tokens[i]; // TODO: I'm beginning to believe that searchSpace should (eventually) be tracked // on the tokens, rather than on the overall 'state'. @@ -521,7 +530,7 @@ export class ContextTracker extends CircularArray { // transforms. That said, it's also very low impact. Best as I can // see, this is only really used for debugging info? if(state != matchState && !isLastToken) { - matchToken.replacementText = incomingToken.text; + token.replacementText = incomingToken.text; } break; @@ -574,21 +583,45 @@ export class ContextTracker extends CircularArray { continue; } // else 'fallthrough' / return null - default: - // No 'delete' should exist on the trailing edge of context when the - // context window slides. While it can happen due to keystrokes with - // `deleteLeft`, we keep a cache of recent contexts - an older one will - // likely match sufficiently. - // - may see 'delete' followed by 'substitute' in such cases. + case 'delete': + // While we do keep a cache of recent contexts, logic constraints for handling + // multitaps makes it tricky to reliably use in all situations. + // It's best to handle `delete` cases directly for this reason. + for(let j = i + 1; j < editPath.length; j++) { + // If something _other_ than delete follows a 'delete' on the edit path, + // we probably have a context mismatch. + // + // It's possible to construct cases where this isn't true, but it's likely not + // worth trying to handle such rare cases. + if(editPath[j] != 'delete') { + return null; + } + } + + // If ALL that remains are deletes, we're good to go. // - // No 'transform' edits should exist within this section, either. + // This may not be the token at the index, but since all that remains are deletes, + // we'll have deleted the correct total number from the end once all iterations + // are done. + if(state == matchState) { + state = new TrackedContextState(state); + } + + state.tokens.pop(); + break; + default: + // No 'transform' edits should exist within this section. return null; } priorEdit = editPath[i]; } - return { state, baseState: matchState, preservationTransform }; + return { + state, + baseState: matchState, + preservationTransform + }; } private static modelContextState( @@ -643,11 +676,13 @@ export class ContextTracker extends CircularArray { * @param model * @param context * @param transformDistribution + * @param preserveMatchState Set to `true` to avoid any edits to the matched context state when they might normally occur. */ analyzeState( model: LexicalModel, context: Context, - transformDistribution?: Distribution + transformDistribution?: Distribution, + preserveMatchState?: boolean ): ContextMatchResult { if(!model.traverseFromRoot) { // Assumption: LexicalModel provides a valid traverseFromRoot function. (Is technically optional) From d798083c761240263c0a6f26c8ee4c778ed7e430 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Thu, 16 Jan 2025 10:58:32 +0700 Subject: [PATCH 003/109] feat(web): track token shift counts during context tracking --- .../src/main/correction/context-tracker.ts | 13 +++++-- .../cases/edit-distance/context-tracker.js | 37 +++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts index 4e4df655a5..be46312932 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts @@ -321,6 +321,9 @@ interface ContextMatchResult { * (Refer to #12494 for an example case.) */ preservationTransform?: Transform; + + headTokensRemoved: number; + tailTokensAdded: number; } export class ContextTracker extends CircularArray { @@ -381,7 +384,7 @@ export class ContextTracker extends CircularArray { // If we have a perfect match with a pre-existing context, no mutations have // happened; just re-use the old context state. if(firstMatch == 0 && lastMatch == editPath.length - 1) { - return { state: matchState, baseState: matchState}; + return { state: matchState, baseState: matchState, headTokensRemoved: 0, tailTokensAdded: 0 }; } // If mutations HAVE happened, we have work to do. @@ -423,6 +426,7 @@ export class ContextTracker extends CircularArray { // does not land as part of the final token in the resulting context. This // component should be preserved by any suggestions that get applied. let preservationTransform: Transform; + let pushedTokenCount = 0; // Now to update the end of the context window. for(let i = lastMatch+1; i < editPath.length; i++) { @@ -573,6 +577,7 @@ export class ContextTracker extends CircularArray { // Auto-replaces the search space to correspond with the new token. state.pushTail(pushedToken); + pushedTokenCount++; break; case 'match': // The default (Unicode) wordbreaker returns an empty token after whitespace blocks. @@ -620,7 +625,9 @@ export class ContextTracker extends CircularArray { return { state, baseState: matchState, - preservationTransform + preservationTransform, + headTokensRemoved: poppedTokenCount, + tailTokensAdded: pushedTokenCount }; } @@ -763,7 +770,7 @@ export class ContextTracker extends CircularArray { let state = ContextTracker.modelContextState(tokenizedContext.left, model); state.taggedContext = context; this.enqueue(state); - return { state, baseState: null }; + return { state, baseState: null, headTokensRemoved: 0, tailTokensAdded: 0 }; } clearCache() { diff --git a/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/context-tracker.js b/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/context-tracker.js index c663072f6d..49297f4aee 100644 --- a/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/context-tracker.js +++ b/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/context-tracker.js @@ -35,6 +35,8 @@ describe('ContextTracker', function() { let newContextMatch = ContextTracker.attemptMatchContext(newContext.left, baseContextMatch, toWrapperDistribution(transform)); assert.isNotNull(newContextMatch?.state); assert.deepEqual(newContextMatch.state.tokens.map(token => token.raw), rawTokens); + assert.equal(newContextMatch.headTokensRemoved, 1); + assert.equal(newContextMatch.tailTokensAdded, 0); }); it("properly matches and aligns when lead token + following whitespace are removed", function() { @@ -53,6 +55,8 @@ describe('ContextTracker', function() { let newContextMatch = ContextTracker.attemptMatchContext(newContext.left, baseContextMatch, toWrapperDistribution(transform)); assert.isNotNull(newContextMatch?.state); assert.deepEqual(newContextMatch.state.tokens.map(token => token.raw), rawTokens); + assert.equal(newContextMatch.headTokensRemoved, 2); + assert.equal(newContextMatch.tailTokensAdded, 0); }); it("properly matches and aligns when final token is edited", function() { @@ -72,6 +76,8 @@ describe('ContextTracker', function() { let newContextMatch = ContextTracker.attemptMatchContext(newContext.left, baseContextMatch, toWrapperDistribution(transform)); assert.isNotNull(newContextMatch?.state); assert.deepEqual(newContextMatch.state.tokens.map(token => token.raw), rawTokens); + assert.equal(newContextMatch.headTokensRemoved, 0); + assert.equal(newContextMatch.tailTokensAdded, 0); }); // Needs improved context-state management (due to 2x tokens) @@ -99,6 +105,31 @@ describe('ContextTracker', function() { let state = newContextMatch?.state; assert.isNotEmpty(state.tokens[state.tokens.length - 2].transformDistributions); assert.isEmpty(state.tokens[state.tokens.length - 1].transformDistributions); + assert.equal(newContextMatch.headTokensRemoved, 0); + assert.equal(newContextMatch.tailTokensAdded, 2); + }); + + it("properly matches and aligns when a 'wordbreak' is removed via backspace", function() { + let existingContext = models.tokenize(defaultBreaker, { + left: "an apple a day keeps the doctor " + }); + let transform = { + insert: '', + deleteLeft: 1 + } + let newContext = models.tokenize(defaultBreaker, { + left: "an apple a day keeps the doctor" + }); + let rawTokens = ["an", " ", "apple", " ", "a", " ", "day", " ", "keeps", " ", "the", " ", "doctor"]; + + let baseContextMatch = ContextTracker.modelContextState(existingContext.left); + let newContextMatch = ContextTracker.attemptMatchContext(newContext.left, baseContextMatch, toWrapperDistribution(transform)); + assert.isOk(newContextMatch?.state); + assert.deepEqual(newContextMatch?.state.tokens.map(token => token.raw), rawTokens); + + // The 'wordbreak' transform + assert.equal(newContextMatch.headTokensRemoved, 0); + assert.equal(newContextMatch.tailTokensAdded, 0); }); it("properly matches and aligns when an implied 'wordbreak' occurs (as when following \"'\")", function() { @@ -124,6 +155,9 @@ describe('ContextTracker', function() { let state = newContextMatch.state; assert.isNotEmpty(state.tokens[state.tokens.length - 2].transformDistributions); assert.isNotEmpty(state.tokens[state.tokens.length - 1].transformDistributions); + + assert.equal(newContextMatch.headTokensRemoved, 0); + assert.equal(newContextMatch.tailTokensAdded, 1); }) // Needs improved context-state management (due to 2x tokens) @@ -151,6 +185,9 @@ describe('ContextTracker', function() { let state = newContextMatch.state; assert.isNotEmpty(state.tokens[state.tokens.length - 2].transformDistributions); assert.isEmpty(state.tokens[state.tokens.length - 1].transformDistributions); + + assert.equal(newContextMatch.headTokensRemoved, 2); + assert.equal(newContextMatch.tailTokensAdded, 2); }); it('rejects hard-to-handle case: tail token is split into three rather than two', function() { From 817adffc7046382806f6ad81b9d09593222ac2b2 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Fri, 17 Jan 2025 08:24:23 +0700 Subject: [PATCH 004/109] fix(web): prevent array aliasing during context-token cloning --- .../worker-thread/src/main/correction/context-tracker.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts index be46312932..cc505e7820 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts @@ -49,6 +49,11 @@ export class TrackedContextToken { constructor(instance: TrackedContextToken); constructor(instance?: TrackedContextToken) { Object.assign(this, instance); + // We don't alter the values in replacements, but we do wish to prevent aliasing + // of the array containing them. + if(instance) { + this.replacements = instance.replacements.slice(); + } } get currentText(): string { From 9b483850953d92842c1f8c0b5469fb1efa6b54bd Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Fri, 17 Jan 2025 09:01:28 +0700 Subject: [PATCH 005/109] fix(web): correct edit-path ordering at source --- .../src/main/correction/classical-calculation.ts | 9 ++++++--- .../src/main/correction/context-tracker.ts | 14 -------------- .../cases/edit-distance/classical-calculation.js | 10 ++++++++++ 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/classical-calculation.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/classical-calculation.ts index 296476b098..ffe104141c 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/classical-calculation.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/classical-calculation.ts @@ -206,12 +206,15 @@ export class ClassicalDistanceCalculation { ); let editPath = mapping.editPath(); - - // When the context has but three tokens, the path algorithm tends to invert - // 'insert' and 'substitute' from our preferred ordering for them. - // Logically, either order makes sense... but logic for other cases is - // far simpler if we have 'substitute' before 'insert'. - if(editPath.length == 3 && editPath[0] == 'insert' && editPath[1] == 'insert' && editPath[2] == 'substitute') { - editPath[0] = 'substitute'; - editPath[2] = 'insert'; - } else if(editPath.length == 2 && editPath[0] == 'insert' && editPath[1] == 'substitute') { - // This path may be reachable for languages without space-based wordbreaking. - editPath[0] = 'substitute'; - editPath[1] = 'insert'; - } - const firstMatch = editPath.indexOf('match'); let lastMatch = editPath.lastIndexOf('match'); diff --git a/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/classical-calculation.js b/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/classical-calculation.js index 1833e9f4d4..07a86b2bbb 100644 --- a/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/classical-calculation.js +++ b/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/classical-calculation.js @@ -513,6 +513,16 @@ describe('Classical Damerau-Levenshtein edit-distance calculation', function() { assert.deepEqual(buffer.editPath(), editSequence); }); + it("'then' -> 'their'", function() { + let buffer = compute("then", "their"); + + let editSequence = [ + op.m, op.m, op.m, op.s, op.i + ]; + + assert.deepEqual(buffer.editPath(), editSequence); + }); + // Two transpositions: abc -> ca, ig <- ghi. Also, one deletion: 'd'. it("'abczdefig' -> 'cazefghi'", function() { let buffer = compute("abczdefig", "cazefghi", "InputThenMatch", 2); From 5633b9ca363cef2f1dadd5254d5fdc35e43e1441 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Fri, 17 Jan 2025 09:01:28 +0700 Subject: [PATCH 006/109] fix(web): track shifts in context across applied suggestions --- .../main/correction/classical-calculation.ts | 2 +- .../src/main/correction/context-tracker.ts | 41 +++++----- .../src/main/correction/index.ts | 3 +- .../cases/edit-distance/context-tracker.js | 76 ++++++++++++++++++- 4 files changed, 101 insertions(+), 21 deletions(-) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/classical-calculation.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/classical-calculation.ts index ffe104141c..33b8a64783 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/classical-calculation.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/classical-calculation.ts @@ -1,6 +1,6 @@ import { SENTINEL_CODE_UNIT } from '@keymanapp/models-templates'; -type EditOperation = 'insert' | 'delete' | 'match' | 'substitute' | 'transpose-start' | 'transpose-end' | 'transpose-insert' | 'transpose-delete'; +export type EditOperation = 'insert' | 'delete' | 'match' | 'substitute' | 'transpose-start' | 'transpose-end' | 'transpose-insert' | 'transpose-delete'; /** * Represents the lowest-level unit for comparison during edit-distance calculations. diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts index e617a6ccd7..3f92808c99 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts @@ -1,6 +1,6 @@ import { applyTransform, buildMergedTransform, Token } from '@keymanapp/models-templates'; -import { ClassicalDistanceCalculation } from './classical-calculation.js'; +import { ClassicalDistanceCalculation, EditOperation } from './classical-calculation.js'; import { SearchSpace } from './distance-modeler.js'; import TransformUtils from '../transformUtils.js'; import { determineModelTokenizer } from '../model-helpers.js'; @@ -31,6 +31,18 @@ function textToCharTransforms(text: string, transformId?: number) { return perCharTransforms; } +export function getEditPathLastMatch(editPath: EditOperation[]) { + const editLength = editPath.length; + // Special handling: appending whitespace to whitespace with the default wordbreaker. + // The default wordbreaker currently adds an empty token after whitespace; this would + // show up with 'substitute', 'match' at the end of the edit path. (This should remain.) + if(editLength >= 2 && editPath[editLength - 2] == 'substitute' && editPath[editLength - 1] == 'match') { + return editPath.lastIndexOf('match', editLength - 2); + } else { + return editPath.lastIndexOf('match'); + } +} + export class TrackedContextSuggestion { suggestion: Suggestion; tokenWidth: number; @@ -352,14 +364,7 @@ export class ContextTracker extends CircularArray { let editPath = mapping.editPath(); const firstMatch = editPath.indexOf('match'); - let lastMatch = editPath.lastIndexOf('match'); - - // Special handling: appending whitespace to whitespace with the default wordbreaker. - // The default wordbreaker currently adds an empty token after whitespace; this would - // show up with 'substitute', 'match' at the end of the edit path. - if(editPath.length >= 2 && editPath[editPath.length - 2] == 'substitute' && editPath[editPath.length - 1] == 'match') { - lastMatch = editPath.lastIndexOf('match', editPath.length - 2); - } + const lastMatch = getEditPathLastMatch(editPath); // Assertion: for a long context, the bulk of the edit path should be a // continuous block of 'match' entries. If there's anything else in @@ -449,17 +454,12 @@ export class ContextTracker extends CircularArray { // transform as part of the input when doing correction-search. let primaryInput = hasDistribution ? tokenDistribution[0]?.sample : null; - // If the incoming token has text but we have no transform to match it with, - // abort the matching attempt. We can't match this case well yet. - // These cases are generally infrequent enough to be low-ROI, not worth the - // investment to optimize further. (Doing so isn't the simplest.) - // - // This may happen if tokenization for pre-existing text changes due to incoming - // input - refer to #12494 for an example case. + // If the incoming token has text but we have no transform (or 'insert') to match + // it with, abort the matching attempt. We can't match this case well yet. if(editPath[i] != 'delete') { if(!incomingToken) { return null; - } else if(!primaryInput && incomingToken?.text != '') { + } else if(!(primaryInput || editPath[i] == 'insert' ) && incomingToken?.text != '') { return null; } } @@ -475,7 +475,7 @@ export class ContextTracker extends CircularArray { // Note: will need a either a different approach or more specialized // handling if/when supporting phrase-level (multi-token) suggestions. if(!isLastToken) { - preservationTransform = preservationTransform ? buildMergedTransform(preservationTransform, primaryInput) : primaryInput; + preservationTransform = preservationTransform && primaryInput ? buildMergedTransform(preservationTransform, primaryInput) : (primaryInput ?? preservationTransform); } const isBackspace = primaryInput && TransformUtils.isBackspace(primaryInput); @@ -563,6 +563,11 @@ export class ContextTracker extends CircularArray { // we know to properly relocate the `f` and `l` transforms? if(primaryInput) { pushedToken.transformDistributions = tokenDistribution ? [tokenDistribution] : []; + } else if(incomingToken.text) { + // We have no transform data to match against an inserted token with text; abort! + // Refer to #12494 for an example case; we currently can't map previously-committed + // input transforms to a newly split-off token. + return null; } pushedToken.isWhitespace = incomingToken.isWhitespace; diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/index.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/index.ts index 33d9f70f54..6da63b7ced 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/index.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/index.ts @@ -1,4 +1,5 @@ export * from './classical-calculation.js'; export * from './context-tracker.js'; export * from './distance-modeler.js'; -export * from './execution-timer.js'; \ No newline at end of file +export * from './execution-timer.js'; +export * from './transform-tokenization.js'; \ No newline at end of file diff --git a/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/context-tracker.js b/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/context-tracker.js index 49297f4aee..65298a2dd3 100644 --- a/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/context-tracker.js +++ b/web/src/engine/predictive-text/worker-thread/src/tests/mocha/cases/edit-distance/context-tracker.js @@ -1,14 +1,18 @@ import { assert } from 'chai'; import { ContextTracker } from '#./correction/context-tracker.js'; +import { tokenizeTransformDistribution } from '#./correction/transform-tokenization.js'; import ModelCompositor from '#./model-compositor.js'; import * as models from '#./models/index.js'; +import { determineModelTokenizer } from '#./model-helpers.js'; import { default as defaultBreaker } from '@keymanapp/models-wordbreakers'; import { deepCopy } from '@keymanapp/web-utils'; import { jsonFixture } from '@keymanapp/common-test-resources/model-helpers.mjs'; +const tokenizer = determineModelTokenizer(new models.DummyModel({wordbreaker: defaultBreaker})); + describe('ContextTracker', function() { function toWrapperDistribution(transforms) { transforms = Array.isArray(transforms) ? transforms : [transforms]; @@ -190,6 +194,72 @@ describe('ContextTracker', function() { assert.equal(newContextMatch.tailTokensAdded, 2); }); + it("properly matches and aligns when initial token is modified AND a 'wordbreak' is added'", function() { + let existingContext = models.tokenize(defaultBreaker, { + left: "an" + }); + let transform = { + insert: 'd ', + deleteLeft: 0 + } + let newContext = models.tokenize(defaultBreaker, { + left: "and " + }); + let rawTokens = ["and", " ", ""]; + + let baseContextMatch = ContextTracker.modelContextState(existingContext.left); + let newContextMatch = ContextTracker.attemptMatchContext( + newContext.left, + baseContextMatch, + tokenizeTransformDistribution(tokenizer, {left: "an"}, [{sample: transform, p: 1}]) + ); + assert.isNotNull(newContextMatch?.state); + assert.deepEqual(newContextMatch.state.tokens.map(token => token.raw), rawTokens); + // We want to preserve all text preceding the new token when applying a suggestion. + assert.deepEqual(newContextMatch.preservationTransform, { insert: 'd ', deleteLeft: 0, deleteRight: 0}); + + // The 'wordbreak' transform + let state = newContextMatch.state; + assert.isNotEmpty(state.tokens[state.tokens.length - 2].transformDistributions); + assert.isEmpty(state.tokens[state.tokens.length - 1].transformDistributions); + + assert.equal(newContextMatch.headTokensRemoved, 0); + assert.equal(newContextMatch.tailTokensAdded, 2); + }); + + it("properly matches and aligns when tail token is modified AND a 'wordbreak' is added'", function() { + let existingContext = models.tokenize(defaultBreaker, { + left: "apple a day keeps the doc" + }); + let transform = { + insert: 'tor ', + deleteLeft: 0 + } + let newContext = models.tokenize(defaultBreaker, { + left: "apple a day keeps the doctor " + }); + let rawTokens = ["apple", " ", "a", " ", "day", " ", "keeps", " ", "the", " ", "doctor", " ", ""]; + + let baseContextMatch = ContextTracker.modelContextState(existingContext.left); + let newContextMatch = ContextTracker.attemptMatchContext( + newContext.left, + baseContextMatch, + tokenizeTransformDistribution(tokenizer, {left: "apple a day keeps the doc"}, [{sample: transform, p: 1}]) + ); + assert.isNotNull(newContextMatch?.state); + assert.deepEqual(newContextMatch.state.tokens.map(token => token.raw), rawTokens); + // We want to preserve all text preceding the new token when applying a suggestion. + assert.deepEqual(newContextMatch.preservationTransform, { insert: 'tor ', deleteLeft: 0, deleteRight: 0 }); + + // The 'wordbreak' transform + let state = newContextMatch.state; + assert.isNotEmpty(state.tokens[state.tokens.length - 2].transformDistributions); + assert.isEmpty(state.tokens[state.tokens.length - 1].transformDistributions); + + assert.equal(newContextMatch.headTokensRemoved, 0); + assert.equal(newContextMatch.tailTokensAdded, 2); + }); + it('rejects hard-to-handle case: tail token is split into three rather than two', function() { let baseContext = models.tokenize(defaultBreaker, { left: "text'" @@ -209,7 +279,11 @@ describe('ContextTracker', function() { insert: '\"', deleteLeft: 0 } - let problemContextMatch = ContextTracker.attemptMatchContext(newContext.left, baseContextMatch, toWrapperDistribution(transform)); + let problemContextMatch = ContextTracker.attemptMatchContext( + newContext.left, + baseContextMatch, + tokenizeTransformDistribution(tokenizer, {left: "text'"}, [{sample: transform, p: 1}]) + ); assert.isNull(problemContextMatch); }); }); From 5a0e6a3b015fc8f279eecdd1c4aeeb4ed4b08634 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Tue, 21 Jan 2025 09:04:52 +0700 Subject: [PATCH 007/109] change(web): minor tweak in constructor for clarity --- .../worker-thread/src/main/correction/context-tracker.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts index cc505e7820..cfa9048bda 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts @@ -48,10 +48,10 @@ export class TrackedContextToken { constructor(); constructor(instance: TrackedContextToken); constructor(instance?: TrackedContextToken) { - Object.assign(this, instance); - // We don't alter the values in replacements, but we do wish to prevent aliasing - // of the array containing them. if(instance) { + Object.assign(this, instance); + // We don't alter the values in replacements, but we do wish to prevent aliasing + // of the array containing them. this.replacements = instance.replacements.slice(); } } From 44cb4044df329618743886c7475dee181274c3da Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Tue, 21 Jan 2025 09:06:27 +0700 Subject: [PATCH 008/109] fix(web): clone token replacement arrays properly --- .../worker-thread/src/main/correction/context-tracker.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts index cfa9048bda..2ba3ba24e5 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts @@ -142,6 +142,7 @@ export class TrackedContextState { this.tokens = source.tokens.map(function(token) { let copy = new TrackedContextToken(); Object.assign(copy, token); + copy.replacements = copy.replacements.slice(); return copy; }); From 14b411821a8b6a190fcf90c2ad034ce61bdd8cc8 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 21 Jan 2025 14:57:36 +1000 Subject: [PATCH 009/109] feat(windows): improve switch handling for installing state Also handle the case where the SM seems to be stuck in the installing state. MSI may have failed. --- .../main/Keyman.System.UpdateStateMachine.pas | 13 +- windows/src/desktop/kmshell/main/initprog.pas | 127 +++++++++++------- 2 files changed, 86 insertions(+), 54 deletions(-) diff --git a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas index 725fae67e6..753e08cf92 100644 --- a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas +++ b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas @@ -99,6 +99,7 @@ type * @returns True if the Keyman is ready to install. *) function ReadyToInstall: Boolean; + function IsInstallingState: Boolean; property ShowErrors: Boolean read FShowErrors write FShowErrors; function CheckRegistryState: TUpdateState; @@ -573,6 +574,11 @@ begin Result := False; end; +function TUpdateStateMachine.IsInstallingState: Boolean; +begin + Result := (CurrentState is InstallingState); +end; + // base implmentation to be overiden procedure TState.HandleInstallPackages; @@ -1085,9 +1091,10 @@ end; function InstallingState.HandleKmShell; begin - // Result = exit straight away as we are installing (MSI installer) - // need to just do a no-op keyman will it maybe using kmshell to install - // packages. + // Should not be called while in installing state MSI installer may have + // failed. Clean Up and return to Idle + bucStateContext.RemoveCachedFiles; + ChangeState(IdleState); Result := kmShellContinue; end; diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index 651387bc47..7f9e3c83b3 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -161,6 +161,7 @@ uses function FirstRun(FQuery, FDisablePackages, FDefaultUILanguage: string): Boolean; forward; // I2562 procedure ShowKeyboardWelcome(PackageName: WideString); forward; // I2569 procedure PrintKeyboard(KeyboardName: WideString); forward; // I2329 +function ProcessBackroundUpdate(FMode: TKMShellMode; FSilent: Boolean): Boolean; forward; procedure Main(Owner: TComponent = nil); var @@ -389,9 +390,6 @@ var kdl: IKeymanDefaultLanguage; FIcon: string; FMutex: TKeymanMutex; // I2720 - BUpdateSM : TUpdateStateMachine; - frmStartInstall: TfrmStartInstall; - UserCanceled : Boolean; function FirstKeyboardFileName: WideString; begin if KeyboardFileNames.Count = 0 @@ -439,54 +437,10 @@ begin Exit; end; - BUpdateSM := TUpdateStateMachine.Create(False); - try - if (FMode = fmBackgroundUpdateCheck) then - begin - BUpdateSM.HandleCheck; - Exit; - end - else if (FMode = fmBackgroundDownload) then - begin - BUpdateSM.HandleDownload; - Exit; - end - else if (FMode = fmApplyInstallNow) then - begin - BUpdateSM.HandleInstallNow; - Exit; - end - else if (FMode = fmInstallKeyboardPackageAdmin) then - begin - BUpdateSM.HandleInstallPackages; - Exit; - end - else - begin - // The following logic around the WaitingRestartState should be - // encapsulated in the state machine however as we want separation of - // UI elements from the state machine we have bring some of logic here. - UserCanceled := False; - if BUpdateSM.ReadyToInstall and - (not FSilent and (FMode in [fmStart, fmSplash, fmMain, fmAbout])) then - begin - frmStartInstall := TfrmStartInstall.Create(nil); - try - if frmStartInstall.ShowModal = mrOk then - UserCanceled := False - else - UserCanceled := True - finally - frmStartInstall.Free; - end; - end; - if not UserCanceled and (BUpdateSM.HandleKmShell = 1) then - Exit; - end; - finally - BUpdateSM.Free; - end; - + if ProcessBackroundUpdate(FMode, FSilent) then + begin + Exit; + end; if not FSilent or (FMode = fmUpgradeMnemonicLayout) then // I4553 begin @@ -698,5 +652,76 @@ begin end; end; +function ProcessBackroundUpdate(FMode: TKMShellMode; FSilent: Boolean) : Boolean; +var + BUpdateSM : TUpdateStateMachine; + frmStartInstall: TfrmStartInstall; + UserCanceled : Boolean; + SkipBUpdate : Boolean; +begin + BUpdateSM := TUpdateStateMachine.Create(False); + Result := False; + try + if (FMode = fmBackgroundUpdateCheck) then + begin + BUpdateSM.HandleCheck; + Result := True; + Exit; + end + else if (FMode = fmBackgroundDownload) then + begin + BUpdateSM.HandleDownload; + Result := True; + Exit; + end + else if (FMode = fmApplyInstallNow) then + begin + BUpdateSM.HandleInstallNow; + Result := True; + Exit; + end + else if (FMode = fmInstallKeyboardPackageAdmin) then + begin + BUpdateSM.HandleInstallPackages; + Result := True; + Exit; + end + else + begin + // Since Package upgrade and Keyman upgrade share the installing state + // the following package related switches are valid in in the installing + // state. + SkipBUpdate := (BUpdateSM.IsInstallingState and (FMode in [fmInstallTip, + fmInstallTipsForPackages, fmRegisterTip, fmUpgradeKeyboards, + fmUpgradeMnemonicLayout])); + // The following logic around the WaitingRestartState should be + // encapsulated in the state machine however as we want separation of + // UI elements from the state machine we have bring some of logic here. + UserCanceled := False; + if BUpdateSM.ReadyToInstall and + (not FSilent and (FMode in [fmStart, fmSplash, fmMain, fmAbout, fmHelp, + fmShowHelp, fmSettings])) then + begin + frmStartInstall := TfrmStartInstall.Create(nil); + try + if frmStartInstall.ShowModal = mrOk then + UserCanceled := False + else + UserCanceled := True + finally + frmStartInstall.Free; + end; + end; + if not UserCanceled and not SkipBUpdate and (BUpdateSM.HandleKmShell = 1) then + begin + Result := True; + Exit; + end; + end; + finally + BUpdateSM.Free; + end; +end; + end. From ce705500d7ec7d6d4148eb6123f588e5cc4cc16f Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Wed, 22 Jan 2025 08:27:20 +0700 Subject: [PATCH 010/109] chore(web): better cloning of cloned object's values --- .../worker-thread/src/main/correction/context-tracker.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts index 2ba3ba24e5..2058d36a7c 100644 --- a/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts +++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/context-tracker.ts @@ -143,6 +143,7 @@ export class TrackedContextState { let copy = new TrackedContextToken(); Object.assign(copy, token); copy.replacements = copy.replacements.slice(); + copy.transformDistributions = copy.transformDistributions.slice(); return copy; }); From 43874185643a3b4609a1c75ad5f4409db8f1b6e6 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:08:20 +1000 Subject: [PATCH 011/109] feat(windows): initall adding -boot This updates the registry entry or run on start up and the switch to initprog. TODO is to actually process the switch correctly when set. --- windows/src/desktop/kmshell/main/initprog.pas | 2 ++ windows/src/engine/kmcomapi/util/utilkeymanoption.pas | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index 7f9e3c83b3..9d573b9be1 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -94,6 +94,7 @@ type fmRepair, fmKeepInTouch, fmSettings, + fmBoot, // Commands from Keyman Engine fmShowHint, @@ -232,6 +233,7 @@ begin // package installation. See https://superuser.com/a/1395288/521575 and // https://github.com/keymanapp/keyman/issues/2467 else if s = '-f' then FForce := True + else if s = '-boot' then FMode := fmBoot else if s = '-c' then FMode := fmMain else if s = '-m' then FMode := fmMigrate else if s = '-i' then FMode := fmInstall diff --git a/windows/src/engine/kmcomapi/util/utilkeymanoption.pas b/windows/src/engine/kmcomapi/util/utilkeymanoption.pas index 8a18f3be26..a7962094c2 100644 --- a/windows/src/engine/kmcomapi/util/utilkeymanoption.pas +++ b/windows/src/engine/kmcomapi/util/utilkeymanoption.pas @@ -323,7 +323,7 @@ begin if OpenKey('\'+SRegKey_WindowsRun_CU, True) then begin if FBoolValue then - WriteString(SRegValue_WindowsRun_Keyman, '"'+TKeymanPaths.KeymanDesktopInstallPath(TKeymanPaths.S_KMShell)+'" -s') + WriteString(SRegValue_WindowsRun_Keyman, '"'+TKeymanPaths.KeymanDesktopInstallPath(TKeymanPaths.S_KMShell)+'" -boot') else if ValueExists(SRegValue_WindowsRun_Keyman) then DeleteValue(SRegValue_WindowsRun_Keyman); end; From a69426f2f53364a8912f102806a7288754468dd5 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Thu, 23 Jan 2025 16:28:48 +0700 Subject: [PATCH 012/109] fix(mac): properly manage lifecycle moves handling of all KMInputMethodLifeCycle notifications to KMInputMethodAppDelegate and out of KMInputController because KMInputController instances are being cached by the OS and swapped in when the input method changes state Fixes: #12997 --- .../Keyman4MacIM/KMInputController.h | 3 +- .../Keyman4MacIM/KMInputController.m | 82 +++++++++++++------ .../Keyman4MacIM/KMInputMethodAppDelegate.m | 48 +++++++---- 3 files changed, 91 insertions(+), 42 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.h b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.h index 684db6fb38..c1264cb210 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.h +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.h @@ -14,5 +14,6 @@ - (void)menuAction:(id)sender; - (void)handleBackspace:(NSEvent *)event; - +- (void)changeClients:(NSString *)clientAppId; +- (void)deactivateClient; @end diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m index dd53b49622..1885f33091 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m @@ -25,22 +25,13 @@ KMInputMethodEventHandler* _eventHandler; - (id)initWithServer:(IMKServer *)server delegate:(id)delegate client:(id)inputClient { - os_log_debug([KMLogs lifecycleLog], "initWithServer, active app: '%{public}@'", [KMInputMethodLifecycle getRunningApplicationId]); + os_log_debug([KMLogs lifecycleLog], "+++KMInputController initWithServer, active app: '%{public}@'", [KMInputMethodLifecycle getRunningApplicationId]); self = [super initWithServer:server delegate:delegate client:inputClient]; if (self) { - self.appDelegate.inputController = self; + os_log_debug([KMLogs lifecycleLog], " +++initWithServer, self: %p", self); } - /** - * Register to receive the Deactivated and ChangedClient notification generated from KMInputMethodLifecycle so - * that the eventHandler can be changed. There is no need to receive the Activated notification because - * the InputController does it all it needs to when it receives the ChangedClient. - */ - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodDeactivated:) name:kInputMethodDeactivatedNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodChangedClient:) name:kInputMethodClientChangeNotification object:nil]; - return self; } @@ -67,35 +58,74 @@ KMInputMethodEventHandler* _eventHandler; } /** - * The Keyman input method is deactivating because the user chose a different input method: notification from KMInputMethodLifecycle + * Called by the app delegate when KMInputMethodLifecycle determines the user has switched clients */ -- (void)inputMethodDeactivated:(NSNotification *)notification { - os_log_debug([KMLogs lifecycleLog], "***KMInputController inputMethodDeactivated, deactivating eventHandler"); - if (_eventHandler != nil) { - [_eventHandler deactivate]; - } +- (void)changeClients:(NSString *)clientAppId { + os_log_debug([KMLogs lifecycleLog], "***KMInputController changeClients, deactivate old eventHandler and activate new one"); + + [self deactivateEventHandler]; + [self activateEventHandler:clientAppId]; } /** - * The user has switched to a different text input client: notification from KMInputMethodLifecycle + * Called by the app delegate when KMInputMethodLifecycle determines the user has deactivated Keyman */ -- (void)inputMethodChangedClient:(NSNotification *)notification { - os_log_debug([KMLogs lifecycleLog], "***KMInputController inputMethodChangedClient, deactivating old eventHandler and activating new one"); - if (_eventHandler != nil) { - [_eventHandler deactivate]; - } - _eventHandler = [[KMInputMethodEventHandler alloc] initWithClient:[KMInputMethodLifecycle getRunningApplicationId] client:self.client]; - +- (void)deactivateClient { + os_log_debug([KMLogs lifecycleLog], "***KMInputController deactivateClient, deactivate old eventHandler"); + + [self deactivateEventHandler]; } +- (void)deactivateEventHandler { + if (_eventHandler != nil) { + os_log_debug([KMLogs lifecycleLog], " * KMInputController deactivate old eventHandler"); + [_eventHandler deactivate]; + } +} + +- (void)activateEventHandler:(NSString *)clientAppId { + os_log_debug([KMLogs lifecycleLog], " * KMInputController activate new eventHandler"); + _eventHandler = [[KMInputMethodEventHandler alloc] initWithClient:clientAppId client:self.client]; +} + +/** + * Called by the OS to activate the input method, but some calls are not useful and are followed milliseconds later + * by a deactivateServer. These short-lived activations may be generated by clicking and releasing menu items without changing applications. + * Rather than treat every message received as a true activation, we send a message to KMInputMethodLifeCycle to evaluate. + */ - (void)activateServer:(id)sender { + os_log_info([KMLogs lifecycleLog], " +++KMInputController, activateServer, self=%p", self); [sender overrideKeyboardWithKeyboardNamed:@"com.apple.keylayout.US"]; + + /** + * When this KMInputController becomes the active server for the input method, then immediately update the AppDelegate. + * The duration that this controller is the active server may be extremely short, but, if so, we will receive another + * call to activateServer moments later and can update the AppDelegate again. + */ + [self attachToAppDelegate]; + + /** + * Call the shared lifecycle object so it can evaluate the current state and figure out whether this is a real activation of + * the input method or a change in clients or a false alarm. + */ [KMInputMethodLifecycle.shared activateClient:sender]; } +- (void)attachToAppDelegate { + self.appDelegate.inputController = self; +} + +/** + * Called by the OS to deactivate the input method + */ - (void)deactivateServer:(id)sender { + os_log_info([KMLogs lifecycleLog], " +++KMInputController, deactivateServer, self=%p", self); + + /** + * Call the shared lifecycle object so it can evaluate the current state and figure out whether this is a real deactivation of + * the input method or a change in clients or a false alarm. + */ [KMInputMethodLifecycle.shared deactivateClient:sender]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (NSMenu *)menu { diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index 73afb9271d..144b2e6537 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -123,15 +123,39 @@ id _lastServerWithOSKShowing = nil; // register to receive notifications generated from KMInputMethodLifecycle [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodActivated:) name:kInputMethodActivatedNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodDeactivated:) name:kInputMethodDeactivatedNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(inputMethodChangedClient:) name:kInputMethodClientChangeNotification object:nil]; // start Input Method lifecycle [KMInputMethodLifecycle.shared startLifecycle]; } /** - * When the input method is deactivated, hide the OSK and disable the low-level event tap + * When the input method is activated -- notification from KMInputMethodLifecycle + */ +- (void)inputMethodActivated:(NSNotification *)notification { + + // enable event tap + if (self.lowLevelEventTap && !CGEventTapIsEnabled(self.lowLevelEventTap)) { + os_log_debug([KMLogs lifecycleLog], "***KMInputMethodAppDelegate inputMethodActivated, re-enabling event tap..."); + CGEventTapEnable(self.lowLevelEventTap, YES); + } + + // show OSK if necessary + os_log_debug([KMLogs lifecycleLog], "--- inputMethodActivated, kvk is non-nil: %{public}@ showOskOnActivate: %{public}@", (_kvk!=nil)?@"true":@"false", [KMInputMethodLifecycle.shared shouldShowOskOnActivate]?@"true":@"false"); + + if ([KMInputMethodLifecycle.shared shouldShowOskOnActivate]) { + os_log_debug([KMLogs oskLog], "***KMInputMethodAppDelegate inputMethodActivated, showing OSK"); + [KMSentryHelper addBreadCrumb:@"lifecycle" message:@"opening OSK on input method activation"]; + [self showOSK]; + } +} + +/** + * When the input method is deactivated -- notification from KMInputMethodLifecycle */ - (void)inputMethodDeactivated:(NSNotification *)notification { + + // if the OSK is visible, hide it if ([self.oskWindow.window isVisible]) { os_log_debug([KMLogs oskLog], "***KMInputMethodAppDelegate inputMethodDeactivated, hiding OSK"); [KMSentryHelper addBreadCrumb:@"lifecycle" message:@"hiding OSK on input method deactivation"]; @@ -141,28 +165,22 @@ id _lastServerWithOSKShowing = nil; } [KMSentryHelper addOskVisibleTag:[self.oskWindow.window isVisible]]; + // disable the event tap if (self.lowLevelEventTap) { os_log_debug([KMLogs lifecycleLog], "***inputMethodDeactivated, disabling event tap"); CGEventTapEnable(self.lowLevelEventTap, NO); } + + // deactive the text input client + [self.inputController deactivateClient]; } /** - * When the input method is activated, show the OSK and enable the low-level event tap + * When the user switches to a different text input client -- notification from KMInputMethodLifecycle */ -- (void)inputMethodActivated:(NSNotification *)notification { - if (self.lowLevelEventTap && !CGEventTapIsEnabled(self.lowLevelEventTap)) { - os_log_debug([KMLogs lifecycleLog], "***KMInputMethodAppDelegate inputMethodActivated, re-enabling event tap..."); - CGEventTapEnable(self.lowLevelEventTap, YES); - } - - os_log_debug([KMLogs lifecycleLog], "--- inputMethodActivated, kvk is non-nil: %{public}@ showOskOnActivate: %{public}@", (_kvk!=nil)?@"true":@"false", [KMInputMethodLifecycle.shared shouldShowOskOnActivate]?@"true":@"false"); - - if ([KMInputMethodLifecycle.shared shouldShowOskOnActivate]) { - os_log_debug([KMLogs oskLog], "***KMInputMethodAppDelegate inputMethodActivated, showing OSK"); - [KMSentryHelper addBreadCrumb:@"lifecycle" message:@"opening OSK on input method activation"]; - [self showOSK]; - } +- (void)inputMethodChangedClient:(NSNotification *)notification { + os_log_debug([KMLogs lifecycleLog], "***KMInputMethodAppDelegate inputMethodChangedClient"); + [self.inputController changeClients:[KMInputMethodLifecycle getRunningApplicationId]]; } - (KeymanVersionInfo)versionInfo { From 12e3dcb5e7d42b88191ecb33bb81ae95a7cf225b Mon Sep 17 00:00:00 2001 From: Meng-Heng Date: Fri, 24 Jan 2025 11:48:27 +0700 Subject: [PATCH 013/109] chore: add the windows platform to titles --- windows/docs/engine/api/index.md | 6 +++--- windows/docs/help/about/credits.md | 2 +- windows/docs/help/about/index.md | 2 +- windows/docs/help/about/license.md | 2 +- windows/docs/help/advanced/index.md | 2 +- windows/docs/help/basic/index.md | 2 +- windows/docs/help/basic/uninstall-keyboard.md | 2 +- windows/docs/help/basic/uninstall.md | 2 +- windows/docs/help/basic/update.md | 2 +- windows/docs/help/start/index.md | 2 +- windows/docs/help/start/tutorial.md | 6 +++--- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/windows/docs/engine/api/index.md b/windows/docs/engine/api/index.md index 9ff2784f57..7032aa0cd2 100644 --- a/windows/docs/engine/api/index.md +++ b/windows/docs/engine/api/index.md @@ -1,5 +1,5 @@ --- -title: Keyman Engine for Windows 14.0 API +title: Keyman Engine for Windows 18.0 API --- ## Introduction @@ -7,8 +7,8 @@ title: Keyman Engine for Windows 14.0 API The Keyman Engine for Windows 18.0 API is implemented in COM. It can be instantiated with `CreateObject("keymanapi.Keyman")`. -**Note:** This documentation applies to Keyman Engine for Windows -versions 14.0 and up. +> [!Note] +> This documentation applies to Keyman Engine for Windows versions 14.0 and up. ## Interface Hierarchy diff --git a/windows/docs/help/about/credits.md b/windows/docs/help/about/credits.md index d0f16aca23..bd7698ecde 100644 --- a/windows/docs/help/about/credits.md +++ b/windows/docs/help/about/credits.md @@ -3,7 +3,7 @@ title: Credits --- These help files were written by Marc Durdin, Peirce Baehr and Jeremy -Kirkham; updated by Makara Sok, Joshua Horton, Darcy Wong, +Kirkham; updated by MengHeng Hav, Makara Sok, Joshua Horton, Darcy Wong, Eberhard Beilharz. Keyman is a registered trademark of Summer Institute of Linguistics Inc in diff --git a/windows/docs/help/about/index.md b/windows/docs/help/about/index.md index 4c0748acb2..856f4fde97 100644 --- a/windows/docs/help/about/index.md +++ b/windows/docs/help/about/index.md @@ -1,5 +1,5 @@ --- -title: About Keyman +title: About Keyman for Windows --- * [Welcome to Keyman](welcome) diff --git a/windows/docs/help/about/license.md b/windows/docs/help/about/license.md index b3d2e88414..2e3b74c13a 100644 --- a/windows/docs/help/about/license.md +++ b/windows/docs/help/about/license.md @@ -4,7 +4,7 @@ title: End User Licence and Services Agreement The MIT License -Copyright (c) 2017-2022 SIL International +Copyright (c) 2017-2025 SIL Global Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/windows/docs/help/advanced/index.md b/windows/docs/help/advanced/index.md index 371f85521d..5be5c488fb 100644 --- a/windows/docs/help/advanced/index.md +++ b/windows/docs/help/advanced/index.md @@ -1,5 +1,5 @@ --- -title: Advanced Help +title: Keyman for Windows Advanced Help --- * [proxy_config](proxy_config) diff --git a/windows/docs/help/basic/index.md b/windows/docs/help/basic/index.md index 0267f1ccc3..42bda8ba6f 100644 --- a/windows/docs/help/basic/index.md +++ b/windows/docs/help/basic/index.md @@ -1,5 +1,5 @@ --- -title: Basic Help +title: Keyman for Windows Basic Help --- * [New Ways to Use Keyman](new-ways-to-use-keyman) diff --git a/windows/docs/help/basic/uninstall-keyboard.md b/windows/docs/help/basic/uninstall-keyboard.md index b36ff14240..b06abc1802 100644 --- a/windows/docs/help/basic/uninstall-keyboard.md +++ b/windows/docs/help/basic/uninstall-keyboard.md @@ -1,5 +1,5 @@ --- -title: Keyboard Task - Uninstall a Keyboard +title: Keyboard Task - Uninstall a Keyman Keyboard on Windows --- Uninstalling a Keyman keyboard removes it from Keyman. If you want to diff --git a/windows/docs/help/basic/uninstall.md b/windows/docs/help/basic/uninstall.md index 6d98645613..cdd963d21c 100644 --- a/windows/docs/help/basic/uninstall.md +++ b/windows/docs/help/basic/uninstall.md @@ -1,5 +1,5 @@ --- -title: Software Task - Uninstall Keyman +title: Software Task - Uninstall Keyman for Windows --- ## Uninstall Keyman from Windows 10 diff --git a/windows/docs/help/basic/update.md b/windows/docs/help/basic/update.md index 37e4e3237f..03955bd518 100644 --- a/windows/docs/help/basic/update.md +++ b/windows/docs/help/basic/update.md @@ -1,5 +1,5 @@ --- -title: Software Task - Update Keyman +title: Software Task - Update Keyman for Windows --- ## Check for Updates Automatically diff --git a/windows/docs/help/start/index.md b/windows/docs/help/start/index.md index e3927980d1..4ac74eb998 100644 --- a/windows/docs/help/start/index.md +++ b/windows/docs/help/start/index.md @@ -1,5 +1,5 @@ --- -title: Getting Started +title: Getting Started on Windows --- * [Getting Started with Keyman](tutorial) diff --git a/windows/docs/help/start/tutorial.md b/windows/docs/help/start/tutorial.md index dd09de98db..d58fdd65fc 100644 --- a/windows/docs/help/start/tutorial.md +++ b/windows/docs/help/start/tutorial.md @@ -1,11 +1,11 @@ --- -title: Getting Started with Keyman +title: Getting Started with Keyman for Windows --- Follow these steps for a basic introduction to Keyman: -**Note:** Keyman must be installed first. For help on installing -Keyman, please see: [How To - Download and Install Keyman](download-and-install-keyman). +> [!Note] +> Keyman must be installed first. For help on installing Keyman, please see: [How To - Download and Install Keyman](download-and-install-keyman). ## Step 1 From 85da8fca5282ff04a126f8d5cc9ca208453073f1 Mon Sep 17 00:00:00 2001 From: Meng-Heng Date: Fri, 24 Jan 2025 12:52:45 +0700 Subject: [PATCH 014/109] chore: add android platform to titles --- android/docs/engine/guides/in-app/index.md | 2 +- android/docs/engine/guides/system-keyboard/index.md | 2 +- android/docs/help/about/index.md | 2 +- android/docs/help/basic/index.md | 2 +- android/docs/help/context/gestures.md | 2 +- android/docs/help/start/enabling-system-keyboard.md | 2 +- android/docs/help/start/index.md | 2 +- android/docs/help/troubleshooting/grant-storage-permission.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/android/docs/engine/guides/in-app/index.md b/android/docs/engine/guides/in-app/index.md index bfa37d4622..d788e267bb 100644 --- a/android/docs/engine/guides/in-app/index.md +++ b/android/docs/engine/guides/in-app/index.md @@ -1,5 +1,5 @@ --- -title: Guide: build an in-app keyboard +title: Guide: build an in-app keyboard for Android with Keyman Engine --- Keyman Engine for Android allows you to use any Keyman touch keyboard in your Android app, or even to create your own diff --git a/android/docs/engine/guides/system-keyboard/index.md b/android/docs/engine/guides/system-keyboard/index.md index 227bb4f33c..a4e68b3f05 100644 --- a/android/docs/engine/guides/system-keyboard/index.md +++ b/android/docs/engine/guides/system-keyboard/index.md @@ -1,5 +1,5 @@ --- -title: Guide: build a system keyboard app +title: Guide: build a system keyboard app on Android with Keyman Engine --- In [part 1](../in-app/) of this series, we looked at the steps involved diff --git a/android/docs/help/about/index.md b/android/docs/help/about/index.md index 787c0c9d4d..4428a4bb75 100644 --- a/android/docs/help/about/index.md +++ b/android/docs/help/about/index.md @@ -1,5 +1,5 @@ --- -title: About Keyman +title: About Keyman for Android --- * [Welcome to Keyman](welcome) diff --git a/android/docs/help/basic/index.md b/android/docs/help/basic/index.md index 02d942ca0e..4a0d7aafe0 100644 --- a/android/docs/help/basic/index.md +++ b/android/docs/help/basic/index.md @@ -1,5 +1,5 @@ --- -title: Basic Help +title: Basic Help - Keyman for Android --- * [Using the Banner on the Keyboard](using-the-banner) diff --git a/android/docs/help/context/gestures.md b/android/docs/help/context/gestures.md index d46ab541f6..ec3fc690bd 100644 --- a/android/docs/help/context/gestures.md +++ b/android/docs/help/context/gestures.md @@ -1,5 +1,5 @@ --- -title: Gesture Hints and Tips +title: Gesture Hints and Tips - Keyman for Android --- ## Using Gestures on the Keyboard Keys diff --git a/android/docs/help/start/enabling-system-keyboard.md b/android/docs/help/start/enabling-system-keyboard.md index 381fbb3e27..dcf16b97fb 100644 --- a/android/docs/help/start/enabling-system-keyboard.md +++ b/android/docs/help/start/enabling-system-keyboard.md @@ -1,5 +1,5 @@ --- -title: How To - Enabling Keyman as a System-Wide Keyboard +title: How To - Enabling Keyman for Android as a System-Wide Keyboard --- ## Enabling System Wide Keyboards diff --git a/android/docs/help/start/index.md b/android/docs/help/start/index.md index 4787ce9f9b..7d46903c58 100644 --- a/android/docs/help/start/index.md +++ b/android/docs/help/start/index.md @@ -1,5 +1,5 @@ --- -title: Getting Started +title: Getting Started with Keyman for Android --- * [How To - Download and Install a Keyman Keyboard](installing-keyboards) diff --git a/android/docs/help/troubleshooting/grant-storage-permission.md b/android/docs/help/troubleshooting/grant-storage-permission.md index 7b47cdf4ea..82f1e0d1aa 100644 --- a/android/docs/help/troubleshooting/grant-storage-permission.md +++ b/android/docs/help/troubleshooting/grant-storage-permission.md @@ -1,5 +1,5 @@ --- -title: How To - Granting Storage Permission +title: How To - Granting Storage Permission on Keyman for Android --- ## Granting Storage Permission From d0e566c411de04d2b7d07dd5eeade363b1c99740 Mon Sep 17 00:00:00 2001 From: Meng-Heng Date: Fri, 24 Jan 2025 12:55:26 +0700 Subject: [PATCH 015/109] Revert "Reapply "chore: add ios platform to titles"" This reverts commit 01ed5f711e1d9ffd26c78d9430422a85053ddba3. --- ios/docs/engine/guides/in-app/index.md | 2 +- ios/docs/engine/guides/system-keyboard/index.md | 2 +- ios/docs/help/about/index.md | 2 +- ios/docs/help/basic/index.md | 2 +- ios/docs/help/context/gestures.md | 2 +- ios/docs/help/start/index.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/docs/engine/guides/in-app/index.md b/ios/docs/engine/guides/in-app/index.md index 14ba8ba4c5..3dfebbf82d 100644 --- a/ios/docs/engine/guides/in-app/index.md +++ b/ios/docs/engine/guides/in-app/index.md @@ -1,5 +1,5 @@ --- -title: Guide: build an in-app keyboard for iPhone and iPad with Keyman Engine +title: Guide: build an in-app keyboard --- Keyman Engine for iPhone and iPad allows you to use any Keyman touch diff --git a/ios/docs/engine/guides/system-keyboard/index.md b/ios/docs/engine/guides/system-keyboard/index.md index 4a533f08d8..ea652360b2 100644 --- a/ios/docs/engine/guides/system-keyboard/index.md +++ b/ios/docs/engine/guides/system-keyboard/index.md @@ -1,5 +1,5 @@ --- -title: Guide: build a system keyboard app on iPhone and iPad with Keyman Engine +title: Guide: build a system keyboard app --- In [part 1](../in-app/) of this series, we looked at the steps involved diff --git a/ios/docs/help/about/index.md b/ios/docs/help/about/index.md index d37b9ed978..71ead99252 100644 --- a/ios/docs/help/about/index.md +++ b/ios/docs/help/about/index.md @@ -1,5 +1,5 @@ --- -title: About Keyman for iPhone and iPad +title: About Keyman --- * [Welcome to Keyman](welcome) diff --git a/ios/docs/help/basic/index.md b/ios/docs/help/basic/index.md index e93f77f3aa..b67688e03c 100644 --- a/ios/docs/help/basic/index.md +++ b/ios/docs/help/basic/index.md @@ -1,5 +1,5 @@ --- -title: Keyman for iPhone and iPad Basic Help +title: Basic Help --- * [Using the Banner on the Keyboard](using-the-banner) diff --git a/ios/docs/help/context/gestures.md b/ios/docs/help/context/gestures.md index ab15c3203d..251de0f1ce 100644 --- a/ios/docs/help/context/gestures.md +++ b/ios/docs/help/context/gestures.md @@ -1,5 +1,5 @@ --- -title: Gesture Hints and Tips - Keyman for iPhone and iPad +title: Gesture Hints and Tips --- ## Using Gestures on the Keyboard Keys diff --git a/ios/docs/help/start/index.md b/ios/docs/help/start/index.md index d7bb7ad72e..f48fc3f185 100644 --- a/ios/docs/help/start/index.md +++ b/ios/docs/help/start/index.md @@ -1,5 +1,5 @@ --- -title: Getting Started with Keyman for iPhone and iPad +title: Getting Started --- * [How To - Adding a Keyboard](searching-for-keyboards) From 7d24043778950675730bf40b65fc0970833c1e70 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Fri, 24 Jan 2025 13:58:02 +0700 Subject: [PATCH 016/109] fix(ios): prevent message-handler collision Fixes: KEYMAN-IOS-1J Fixes: #13036 --- .../Classes/Keyboard/KeymanWebViewController.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Keyboard/KeymanWebViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/Keyboard/KeymanWebViewController.swift index c101ebd832..ea9cf71ac3 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Keyboard/KeymanWebViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Keyboard/KeymanWebViewController.swift @@ -164,6 +164,9 @@ class KeymanWebViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) + if #available(iOSApplicationExtension 14.0, *) { + self.userContentController.removeAllScriptMessageHandlers() + } self.userContentController.add(self, name: keymanWebViewName) } From d1bfbd4f80b73350db463ce189e104f337428439 Mon Sep 17 00:00:00 2001 From: MengHeng <90595388+Meng-Heng@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:53:17 +0700 Subject: [PATCH 017/109] Update tutorial.md --- windows/docs/help/start/tutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows/docs/help/start/tutorial.md b/windows/docs/help/start/tutorial.md index d58fdd65fc..83aed054e8 100644 --- a/windows/docs/help/start/tutorial.md +++ b/windows/docs/help/start/tutorial.md @@ -4,8 +4,8 @@ title: Getting Started with Keyman for Windows Follow these steps for a basic introduction to Keyman: -> [!Note] -> Keyman must be installed first. For help on installing Keyman, please see: [How To - Download and Install Keyman](download-and-install-keyman). +**Note:** Keyman must be installed first. For help on installing +Keyman, please see: [How To - Download and Install Keyman](download-and-install-keyman). ## Step 1 From 4e8d4e5538b4ebd4d82925940fed40a5afd45c2a Mon Sep 17 00:00:00 2001 From: MengHeng <90595388+Meng-Heng@users.noreply.github.com> Date: Fri, 24 Jan 2025 14:59:09 +0700 Subject: [PATCH 018/109] Apply suggestions from code review Co-authored-by: Marc Durdin --- android/docs/engine/guides/system-keyboard/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/docs/engine/guides/system-keyboard/index.md b/android/docs/engine/guides/system-keyboard/index.md index a4e68b3f05..7a4901e166 100644 --- a/android/docs/engine/guides/system-keyboard/index.md +++ b/android/docs/engine/guides/system-keyboard/index.md @@ -1,5 +1,5 @@ --- -title: Guide: build a system keyboard app on Android with Keyman Engine +title: Guide: build a system keyboard app for Android with Keyman Engine --- In [part 1](../in-app/) of this series, we looked at the steps involved From 75d77704a2977e74b68deb1f72faa59fcab8e536 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 27 Jan 2025 09:59:38 +0700 Subject: [PATCH 019/109] refactor: move langtags to @keymanapp/langtags npm module We want to use langtags in several modules, so it makes sense to make it into its own NPM module. Relates-to: #13045 --- common/web/build.sh | 1 + common/web/langtags/.gitignore | 1 + common/web/langtags/build.sh | 45 +++++++++++++++++++ common/web/langtags/package.json | 39 ++++++++++++++++ common/web/langtags/src/main.ts | 8 ++++ common/web/langtags/tsconfig.json | 19 ++++++++ developer/src/build.sh | 1 + developer/src/kmc-keyboard-info/.gitignore | 1 - developer/src/kmc-keyboard-info/build.sh | 12 ++--- developer/src/kmc-keyboard-info/package.json | 3 +- .../src/keyboard-info-compiler.ts | 4 +- .../test/keyboard-info-compiler.tests.ts | 2 +- developer/src/kmc-keyboard-info/tsconfig.json | 8 +--- developer/src/packages.inc.sh | 1 + docs/npm-packages.md | 1 + package-lock.json | 29 +++++++----- package.json | 6 ++- tsconfig.base.json | 1 + tsconfig.json | 7 +-- 19 files changed, 152 insertions(+), 37 deletions(-) create mode 100644 common/web/langtags/.gitignore create mode 100755 common/web/langtags/build.sh create mode 100644 common/web/langtags/package.json create mode 100644 common/web/langtags/src/main.ts create mode 100644 common/web/langtags/tsconfig.json diff --git a/common/web/build.sh b/common/web/build.sh index 798db3b231..2370e3ecf4 100755 --- a/common/web/build.sh +++ b/common/web/build.sh @@ -10,6 +10,7 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" builder_describe "Keyman common web modules" \ :keyman-version \ + :langtags \ :types \ clean \ configure \ diff --git a/common/web/langtags/.gitignore b/common/web/langtags/.gitignore new file mode 100644 index 0000000000..a0d996af40 --- /dev/null +++ b/common/web/langtags/.gitignore @@ -0,0 +1 @@ +src/imports/ diff --git a/common/web/langtags/build.sh b/common/web/langtags/build.sh new file mode 100755 index 0000000000..f125448d4a --- /dev/null +++ b/common/web/langtags/build.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +## START STANDARD BUILD SCRIPT INCLUDE +# adjust relative paths as necessary +THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" +. "${THIS_SCRIPT%/*}/../../../resources/build/builder.inc.sh" +## END STANDARD BUILD SCRIPT INCLUDE + +. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" +. "$KEYMAN_ROOT/resources/build/build-utils-ci.inc.sh" + +builder_describe "Build Keyman langtags.js common module" \ + "clean" \ + "configure" \ + "build" \ + "test" \ + "publish publish to npm" \ + "--npm-publish+ For publish, do a npm publish, not npm pack (only for CI)" \ + "--dry-run,-n don't actually publish, just dry run" + +builder_describe_outputs \ + configure /common/web/langtags/src/imports/langtags.js \ + build /common/web/langtags/build/src/main.js + +builder_parse "$@" + +#------------------------------------------------------------------------------------------------------------------- + +function compile_langtags() { + mkdir -p src/imports + echo 'export default ' > src/imports/langtags.js + cat "$KEYMAN_ROOT/resources/standards-data/langtags/langtags.json" >> src/imports/langtags.js +} + +function do_configure() { + verify_npm_setup + compile_langtags +} + +#------------------------------------------------------------------------------------------------------------------- + +builder_run_action clean rm -rf ./build ./src/imports ./node_modules +builder_run_action configure do_configure +builder_run_action build tsc --build +builder_run_action test echo 'no tests for langtags' +builder_run_action publish builder_publish_npm diff --git a/common/web/langtags/package.json b/common/web/langtags/package.json new file mode 100644 index 0000000000..f2848f587f --- /dev/null +++ b/common/web/langtags/package.json @@ -0,0 +1,39 @@ +{ + "name": "@keymanapp/langtags", + "description": "Keyman bundling of language tags from langtags.json", + "keywords": [ + "keyboard", + "keyman", + "ldml", + "unicode" + ], + "type": "module", + "types": "./build/src/main.d.ts", + "exports": { + ".": { + "es6-bundling": "./src/main.ts", + "types": "./build/src/main.d.ts", + "default": "./build/src/main.js" + } + }, + "files": [ + "/build/src/" + ], + "scripts": { + "build": "tsc -b", + "test": "echo no tests for langtags" + }, + "author": "Marc Durdin (https://github.com/mcdurdin)", + "license": "MIT", + "bugs": { + "url": "https://github.com/keymanapp/keyman/issues" + }, + "devDependencies": { + "typescript": "^5.4.5" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/keymanapp/keyman.git" + }, + "sideEffects": false +} diff --git a/common/web/langtags/src/main.ts b/common/web/langtags/src/main.ts new file mode 100644 index 0000000000..1b779671e3 --- /dev/null +++ b/common/web/langtags/src/main.ts @@ -0,0 +1,8 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Wraps langtags.json as a Javascript object + */ + +import langtags from './imports/langtags.js'; +export { langtags }; diff --git a/common/web/langtags/tsconfig.json b/common/web/langtags/tsconfig.json new file mode 100644 index 0000000000..c09293aeb0 --- /dev/null +++ b/common/web/langtags/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../../tsconfig.base.json", + + "compilerOptions": { + "outDir": "build/src/", + "rootDir": "src/", + "baseUrl": ".", + /* + following two settings allow us to import langtags.js. It cannot be a .ts + because the type is too complex for TypeScript to infer. + */ + "allowJs": true, + "noImplicitAny": false, + }, + "include": [ + "src/**/*.ts", + "src/imports/*.js", // Import langtags.json + ], +} diff --git a/developer/src/build.sh b/developer/src/build.sh index dd4f5264e5..d01c6caeb8 100755 --- a/developer/src/build.sh +++ b/developer/src/build.sh @@ -156,6 +156,7 @@ function do_publish() { ./common/web/utils/build.sh publish $DRY_RUN $NPM_PUBLISH ../../common/web/keyman-version/build.sh publish $DRY_RUN $NPM_PUBLISH + ../../common/web/langtags/build.sh publish $DRY_RUN $NPM_PUBLISH ../../common/web/types/build.sh publish $DRY_RUN $NPM_PUBLISH ../../core/include/ldml/build.sh publish $DRY_RUN $NPM_PUBLISH # end TODO diff --git a/developer/src/kmc-keyboard-info/.gitignore b/developer/src/kmc-keyboard-info/.gitignore index f118f231af..abbfb195cb 100644 --- a/developer/src/kmc-keyboard-info/.gitignore +++ b/developer/src/kmc-keyboard-info/.gitignore @@ -1,2 +1 @@ -src/imports/ test/fixtures/khmer_angkor/build/actual.keyboard_info \ No newline at end of file diff --git a/developer/src/kmc-keyboard-info/build.sh b/developer/src/kmc-keyboard-info/build.sh index acd6bd65de..87902b6876 100755 --- a/developer/src/kmc-keyboard-info/build.sh +++ b/developer/src/kmc-keyboard-info/build.sh @@ -8,6 +8,7 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" . "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" builder_describe "Build Keyman kmc keyboard-info Compiler module" \ + "@/common/web/langtags" \ "@/common/web/types" \ "@/developer/src/common/web/utils" \ "@/developer/src/kmc-package" \ @@ -21,23 +22,16 @@ builder_describe "Build Keyman kmc keyboard-info Compiler module" \ "--dry-run,-n don't actually publish, just dry run" builder_describe_outputs \ - configure /developer/src/kmc-keyboard-info/src/imports/langtags.js \ + configure /node_modules \ build /developer/src/kmc-keyboard-info/build/src/index.js \ api /developer/build/api/kmc-keyboard-info.api.json builder_parse "$@" -function do_configure() { - verify_npm_setup - mkdir -p src/imports - echo 'export default ' > src/imports/langtags.js - cat "$KEYMAN_ROOT/resources/standards-data/langtags/langtags.json" >> src/imports/langtags.js -} - #------------------------------------------------------------------------------------------------------------------- builder_run_action clean rm -rf ./build/ ./tsconfig.tsbuildinfo -builder_run_action configure do_configure +builder_run_action configure verify_npm_setup builder_run_action build tsc --build builder_run_action api api-extractor run --local --verbose builder_run_action test builder_do_typescript_tests diff --git a/developer/src/kmc-keyboard-info/package.json b/developer/src/kmc-keyboard-info/package.json index 45e1001501..b97cdcc22a 100644 --- a/developer/src/kmc-keyboard-info/package.json +++ b/developer/src/kmc-keyboard-info/package.json @@ -25,7 +25,8 @@ "dependencies": { "@keymanapp/common-types": "*", "@keymanapp/developer-utils": "*", - "@keymanapp/kmc-package": "*" + "@keymanapp/kmc-package": "*", + "@keymanapp/langtags": "*" }, "devDependencies": { "@types/mocha": "^5.2.7", diff --git a/developer/src/kmc-keyboard-info/src/keyboard-info-compiler.ts b/developer/src/kmc-keyboard-info/src/keyboard-info-compiler.ts index 3e1db45aed..3d6eea4959 100644 --- a/developer/src/kmc-keyboard-info/src/keyboard-info-compiler.ts +++ b/developer/src/kmc-keyboard-info/src/keyboard-info-compiler.ts @@ -7,7 +7,7 @@ import { minKeymanVersion } from "./min-keyman-version.js"; import { KeyboardInfoFile, KeyboardInfoFileIncludes, KeyboardInfoFileLanguageFont, KeyboardInfoFilePlatform } from "./keyboard-info-file.js"; import { KeymanFileTypes, KmpJsonFile, KmxFileReader, KMX, KeymanTargets } from "@keymanapp/common-types"; import { KeyboardInfoCompilerMessages } from "./keyboard-info-compiler-messages.js"; -import langtags from "./imports/langtags.js"; +import { langtags } from "@keymanapp/langtags"; import { CompilerCallbacks, KeymanCompiler, CompilerOptions, KeymanCompilerResult, KeymanCompilerArtifacts, KeymanCompilerArtifact, KeymanUrls, isValidEmail, validateMITLicense } from "@keymanapp/developer-utils"; import { KmpCompiler } from "@keymanapp/kmc-package"; @@ -16,7 +16,7 @@ import { getFontFamily } from "@keymanapp/developer-utils"; const regionNames = new Intl.DisplayNames(['en'], { type: "region" }); const scriptNames = new Intl.DisplayNames(['en'], { type: "script" }); -const langtagsByTag = {}; +const langtagsByTag: any = {}; /** * Build a dictionary of language tags from langtags.json diff --git a/developer/src/kmc-keyboard-info/test/keyboard-info-compiler.tests.ts b/developer/src/kmc-keyboard-info/test/keyboard-info-compiler.tests.ts index 99c244be2d..f71872da3a 100644 --- a/developer/src/kmc-keyboard-info/test/keyboard-info-compiler.tests.ts +++ b/developer/src/kmc-keyboard-info/test/keyboard-info-compiler.tests.ts @@ -4,7 +4,7 @@ import 'mocha'; import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; import { makePathToFixture } from './helpers/index.js'; import { KeyboardInfoCompiler, KeyboardInfoCompilerResult, unitTestEndpoints } from '../src/keyboard-info-compiler.js'; -import langtags from "../src/imports/langtags.js"; +import { langtags } from "@keymanapp/langtags"; import { KmpCompiler, KmpCompilerOptions } from '@keymanapp/kmc-package'; import { KMX, KeymanFileTypes, KeymanTargets, KmpJsonFile } from '@keymanapp/common-types'; import { CompilerCallbacks } from '@keymanapp/developer-utils'; diff --git a/developer/src/kmc-keyboard-info/tsconfig.json b/developer/src/kmc-keyboard-info/tsconfig.json index 124c812ecf..2791b7542b 100644 --- a/developer/src/kmc-keyboard-info/tsconfig.json +++ b/developer/src/kmc-keyboard-info/tsconfig.json @@ -4,18 +4,12 @@ "compilerOptions": { "outDir": "build/src/", "rootDir": "src/", - /* - following two settings allow us to import langtags.js. It cannot be a .ts - because the type is too complex for TypeScript to infer. - */ - "allowJs": true, - "noImplicitAny": false, }, "include": [ "src/**/*.ts", - "src/imports/langtags.js", ], "references": [ + { "path": "../../../common/web/langtags" }, { "path": "../../../common/web/types" }, { "path": "../kmc-package/" }, { "path": "../common/web/utils/" }, diff --git a/developer/src/packages.inc.sh b/developer/src/packages.inc.sh index 61b77e6438..62993c5ab9 100644 --- a/developer/src/packages.inc.sh +++ b/developer/src/packages.inc.sh @@ -5,6 +5,7 @@ readonly PACKAGES=( common/web/keyman-version + common/web/langtags common/web/types core/include/ldml developer/src/common/web/utils diff --git a/docs/npm-packages.md b/docs/npm-packages.md index 494bec0044..8306130d36 100644 --- a/docs/npm-packages.md +++ b/docs/npm-packages.md @@ -19,6 +19,7 @@ Packages are **never** published from a developer's machine. * `@keymanapp/kmc-model` -- located at `developer/src/kmc-model` * `@keymanapp/kmc-model-info` -- located at `developer/src/kmc-model-info` * `@keymanapp/kmc-package` -- located at `developer/src/kmc-package` +* `@keymanapp/langtags` -- located at `common/web/langtags` ### Deprecated npm packages diff --git a/package-lock.json b/package-lock.json index efc2a0557b..6bb5529782 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,8 +25,9 @@ "developer/src/kmc", "developer/src/server", "common/test/resources", - "common/tools/*", - "common/web/*", + "common/web/keyman-version", + "common/web/langtags", + "common/web/types", "common/tools/hextobin", "web", "web/src/engine/osk/gesture-processor", @@ -38,6 +39,7 @@ "@keymanapp/developer-utils": "file:developer/src/common/web/utils", "@keymanapp/hextobin": "file:common/tools/hextobin", "@keymanapp/keyman-version": "file:common/web/keyman-version", + "@keymanapp/langtags": "file:common/web/langtags", "@keymanapp/ldml-keyboard-constants": "file:core/include/ldml" }, "devDependencies": { @@ -100,6 +102,7 @@ }, "common/tools/sourcemap-path-remapper": { "name": "@keymanapp/sourcemap-path-remapper", + "extraneous": true, "license": "MIT", "dependencies": { "convert-source-map": "^2.0.0" @@ -111,10 +114,6 @@ "typescript": "^5.4.5" } }, - "common/tools/sourcemap-path-remapper/node_modules/convert-source-map": { - "version": "2.0.0", - "license": "MIT" - }, "common/web/es6-shim": { "name": "@keymanapp/es6-shim", "extraneous": true, @@ -131,6 +130,13 @@ "typescript": "^5.4.5" } }, + "common/web/langtags": { + "name": "@keymanapp/langtags", + "license": "MIT", + "devDependencies": { + "typescript": "^5.4.5" + } + }, "common/web/types": { "name": "@keymanapp/common-types", "license": "MIT", @@ -888,7 +894,8 @@ "dependencies": { "@keymanapp/common-types": "*", "@keymanapp/developer-utils": "*", - "@keymanapp/kmc-package": "*" + "@keymanapp/kmc-package": "*", + "@keymanapp/langtags": "*" }, "devDependencies": { "@types/mocha": "^5.2.7", @@ -3011,6 +3018,10 @@ "resolved": "developer/src/kmc-package", "link": true }, + "node_modules/@keymanapp/langtags": { + "resolved": "common/web/langtags", + "link": true + }, "node_modules/@keymanapp/ldml-keyboard-constants": { "resolved": "core/include/ldml", "link": true @@ -3043,10 +3054,6 @@ "resolved": "resources/gosh", "link": true }, - "node_modules/@keymanapp/sourcemap-path-remapper": { - "resolved": "common/tools/sourcemap-path-remapper", - "link": true - }, "node_modules/@keymanapp/web-sentry-manager": { "resolved": "web/src/engine/sentry-manager", "link": true diff --git a/package.json b/package.json index 135b0fdd3e..8f46bde471 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,9 @@ "developer/src/kmc", "developer/src/server", "common/test/resources", - "common/tools/*", - "common/web/*", + "common/web/keyman-version", + "common/web/langtags", + "common/web/types", "common/tools/hextobin", "web", "web/src/engine/osk/gesture-processor", @@ -59,6 +60,7 @@ ], "dependencies": { "@keymanapp/common-types": "file:common/web/types", + "@keymanapp/langtags": "file:common/web/langtags", "@keymanapp/developer-test-helpers": "file:developer/src/common/web/test-helpers", "@keymanapp/developer-utils": "file:developer/src/common/web/utils", "@keymanapp/hextobin": "file:common/tools/hextobin", diff --git a/tsconfig.base.json b/tsconfig.base.json index 9369051820..6880709c17 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -26,6 +26,7 @@ "paths": { "@keymanapp/common-types": ["./common/web/types/src/main"], + "@keymanapp/langtags": ["./common/web/langtags/src/main"], "@keymanapp/keyman": ["./web" ], "@keymanapp/models-templates": ["./web/src/engine/predictive-text/templates/"], "@keymanapp/models-wordbreakers": ["./web/src/engine/predictive-text/wordbreakers"], diff --git a/tsconfig.json b/tsconfig.json index 855c39f765..800e91d034 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,8 @@ { "path": "./common/tools/hextobin/" }, { "path": "./common/web/keyman-version" }, - { "path": "./common/web/types/" }, + { "path": "./common/web/types" }, + { "path": "./common/web/langtags" }, { "path": "./developer/src/common/web/test-helpers/tsconfig.json" }, { "path": "./developer/src/common/web/utils/tsconfig.json" }, @@ -44,9 +45,9 @@ { "path": "./web/src/engine/predictive-text/worker-thread" }, { "path": "./web/src/engine/osk/gesture-processor/tsconfig.json" }, { "path": "./web/src/engine/osk/gesture-processor/src/tools/unit-test-resources/tsconfig.json" }, - { "path": "./web/src/engine/sentry-manager" }, + { "path": "./web/src/engine/sentry-manager/src" }, - { "path": "./web/src/tools/recorder-recorder" }, + { "path": "./web/src/tools/testing/recorder" }, // { "path": "./web/tools/recorder/tsconfig.json" }, // { "path": "./web/tools/sourcemap-root/tsconfig.json" }, ] From 50097802bad4226c9ad1d605c5c77fe963563ddc Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 27 Jan 2025 10:22:28 +0700 Subject: [PATCH 020/109] chore: include sourcemap-path-remapper tool in package.json --- package-lock.json | 12 +++++++++++- package.json | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 6bb5529782..ccf9fcbb4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "common/web/keyman-version", "common/web/langtags", "common/web/types", + "common/tools/sourcemap-path-remapper", "common/tools/hextobin", "web", "web/src/engine/osk/gesture-processor", @@ -102,7 +103,6 @@ }, "common/tools/sourcemap-path-remapper": { "name": "@keymanapp/sourcemap-path-remapper", - "extraneous": true, "license": "MIT", "dependencies": { "convert-source-map": "^2.0.0" @@ -114,6 +114,12 @@ "typescript": "^5.4.5" } }, + "common/tools/sourcemap-path-remapper/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, "common/web/es6-shim": { "name": "@keymanapp/es6-shim", "extraneous": true, @@ -3054,6 +3060,10 @@ "resolved": "resources/gosh", "link": true }, + "node_modules/@keymanapp/sourcemap-path-remapper": { + "resolved": "common/tools/sourcemap-path-remapper", + "link": true + }, "node_modules/@keymanapp/web-sentry-manager": { "resolved": "web/src/engine/sentry-manager", "link": true diff --git a/package.json b/package.json index 8f46bde471..f0bc72f6b2 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "common/web/keyman-version", "common/web/langtags", "common/web/types", + "common/tools/sourcemap-path-remapper", "common/tools/hextobin", "web", "web/src/engine/osk/gesture-processor", From b49334d9cf0bf9b0f992585659cf5df636ab3cac Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 27 Jan 2025 11:47:25 +0700 Subject: [PATCH 021/109] chore(developer): use langtags.json for kmc-generate language names Also fills out the remaining functionality in @keymanapp/langtags. Fixes: #13045 --- common/web/langtags/src/main.ts | 116 +++++++++++++++++- developer/src/kmc-generate/package.json | 3 +- .../src/kmc-generate/src/basic-generator.ts | 9 +- .../keyman-keyboard/sample/source/sample.kps | 2 +- .../ldml-keyboard/sample/source/sample.kps | 2 +- .../source/sample.en.sample.model.kps | 2 +- .../src/keyboard-info-compiler.ts | 40 +----- .../test/keyboard-info-compiler.tests.ts | 12 +- package-lock.json | 3 +- 9 files changed, 138 insertions(+), 51 deletions(-) diff --git a/common/web/langtags/src/main.ts b/common/web/langtags/src/main.ts index 1b779671e3..44c0a69041 100644 --- a/common/web/langtags/src/main.ts +++ b/common/web/langtags/src/main.ts @@ -5,4 +5,118 @@ */ import langtags from './imports/langtags.js'; -export { langtags }; + +// These interfaces and types correspond to https://github.com/silnrsi/langtags/blob/master/source/langtags_schema.json + +export type LangTagBcp47 = string; // BCP 47 +export type LangTagBcp47Variant = string; // BCP 47 variant +export type LangTagIso639_3 = string; // ISO639-3 +export type LangTagIso3166_1 = string; // region +export type LangTagIso15924 = string; // script + + +export interface LangTag { + full: string; // should be LangTagBcp47? + iana?: string[]; + iso639_3?: LangTagIso639_3; + latnnames?: string[]; + localname?: string; + localnames?: string; + macrolang?: LangTagBcp47; + name?: string; + names?: string[]; + nophonvars?: boolean; + obsolete?: boolean; + region?: LangTagIso3166_1; + regionname?: string; + regions?: LangTagIso3166_1[]; + rod?: string; + script?: LangTagIso15924; + sldr?: boolean; + suppress?: boolean; + tag?: LangTagBcp47; + tags?: LangTagBcp47[]; + unwritten?: boolean; + variants?: LangTagBcp47Variant[]; + windows?: LangTagBcp47; +}; + +export interface LangTagConformance { + regions: LangTagIso3166_1[]; + scripts: LangTagIso15924[]; + tag: '_conformance'; +}; + +export interface LangTagGlobalVar { + variants: LangTagBcp47Variant[]; + tag: '_globalvar'; +}; + +export interface LangTagPhonVar { + variants: LangTagBcp47Variant[]; + tag: '_phonvar'; +}; + +export interface LangTagVersion { + api: string; + date: string; + tag: '_version'; +}; + +/** + * A map of all language tags, lower cased + */ +const langtagsByTag: Map = new Map(); + +/* metadata variables */ +let conformance: LangTagConformance = undefined; +let globalvar: LangTagGlobalVar = undefined; +let phonvar: LangTagPhonVar = undefined; +let version: LangTagVersion = undefined; + +const metadata = { + conformance: () => ({ regions: [...conformance.regions], scripts: [...conformance.scripts] }), + globalvar: () => ({ variants: [...globalvar.variants] }), + phonvar: () => ({ variants: [...phonvar.variants] }), + version: () => ({ api: version.api, date: version.date }) +}; + +/** + * Build a dictionary of language tags from langtags.json. This takes under 10ms + * on a reasonable laptop. + */ +function preinit(): void { + for(const tag of langtags) { + if(tag.tag == '_conformance') { + conformance = tag; + } else if(tag.tag == '_globalvar') { + globalvar = tag; + } else if(tag.tag == '_phonvar') { + phonvar = tag; + } else if(tag.tag == '_version') { + version = tag; + } else if(tag.full && tag.tag) { + langtagsByTag.set(tag.tag.toLowerCase(), tag); + langtagsByTag.set(tag.full.toLowerCase(), tag); + if(tag.tags) { + for(const t of tag.tags) { + langtagsByTag.set(t.toLowerCase(), tag); + } + } + } + } +} + +/** + * Find a LangTag from a given tag; matches on tag, tags, full properties, + * with a case-insensitive search. + * @param tag + * @returns LangTag or undefined if not found + */ +function getLangtagByTag(tag: string): LangTag { + return langtagsByTag.get(tag.toLowerCase()); +} + +preinit(); + +export { langtags, getLangtagByTag, metadata }; diff --git a/developer/src/kmc-generate/package.json b/developer/src/kmc-generate/package.json index ba488ff575..daf4f92922 100644 --- a/developer/src/kmc-generate/package.json +++ b/developer/src/kmc-generate/package.json @@ -27,7 +27,8 @@ "dependencies": { "@keymanapp/common-types": "*", "@keymanapp/developer-utils": "*", - "@keymanapp/keyman-version": "*" + "@keymanapp/keyman-version": "*", + "@keymanapp/langtags": "*" }, "devDependencies": { "@keymanapp/developer-test-helpers": "*", diff --git a/developer/src/kmc-generate/src/basic-generator.ts b/developer/src/kmc-generate/src/basic-generator.ts index fe5a5cd304..4aee4e3c07 100644 --- a/developer/src/kmc-generate/src/basic-generator.ts +++ b/developer/src/kmc-generate/src/basic-generator.ts @@ -6,6 +6,7 @@ import { KeymanTargets } from "@keymanapp/common-types"; import KEYMAN_VERSION from "@keymanapp/keyman-version"; +import { getLangtagByTag } from "@keymanapp/langtags"; import { AbstractGenerator, GeneratorArtifacts } from "./abstract-generator.js"; import { GeneratorMessages } from "./generator-messages.js"; @@ -72,8 +73,12 @@ export class BasicGenerator extends AbstractGenerator { } private getLanguageName(tag: string) { - // TODO-GENERATE: probably need to use langtags.json - return new Intl.Locale(tag).language; + const langtag = getLangtagByTag(tag); + if(!langtag) { + // Fallback to Intl.Locale, probably will be undefined + return new Intl.Locale(tag).language; + } + return langtag.name; } private generateLanguageListForPackage(): string { diff --git a/developer/src/kmc-generate/test/fixtures/keyman-keyboard/sample/source/sample.kps b/developer/src/kmc-generate/test/fixtures/keyman-keyboard/sample/source/sample.kps index 62931d3bcf..1e05660d2a 100644 --- a/developer/src/kmc-generate/test/fixtures/keyman-keyboard/sample/source/sample.kps +++ b/developer/src/kmc-generate/test/fixtures/keyman-keyboard/sample/source/sample.kps @@ -39,7 +39,7 @@ sample 1.0 - en + English diff --git a/developer/src/kmc-generate/test/fixtures/ldml-keyboard/sample/source/sample.kps b/developer/src/kmc-generate/test/fixtures/ldml-keyboard/sample/source/sample.kps index 62931d3bcf..1e05660d2a 100644 --- a/developer/src/kmc-generate/test/fixtures/ldml-keyboard/sample/source/sample.kps +++ b/developer/src/kmc-generate/test/fixtures/ldml-keyboard/sample/source/sample.kps @@ -39,7 +39,7 @@ sample 1.0 - en + English diff --git a/developer/src/kmc-generate/test/fixtures/lexical-model/sample.en.sample/source/sample.en.sample.model.kps b/developer/src/kmc-generate/test/fixtures/lexical-model/sample.en.sample/source/sample.en.sample.model.kps index 5020fd3eb0..76e9069e72 100644 --- a/developer/src/kmc-generate/test/fixtures/lexical-model/sample.en.sample/source/sample.en.sample.model.kps +++ b/developer/src/kmc-generate/test/fixtures/lexical-model/sample.en.sample/source/sample.en.sample.model.kps @@ -36,7 +36,7 @@ Sample Project sample.en.sample - en + English diff --git a/developer/src/kmc-keyboard-info/src/keyboard-info-compiler.ts b/developer/src/kmc-keyboard-info/src/keyboard-info-compiler.ts index 3d6eea4959..49da3d6684 100644 --- a/developer/src/kmc-keyboard-info/src/keyboard-info-compiler.ts +++ b/developer/src/kmc-keyboard-info/src/keyboard-info-compiler.ts @@ -7,7 +7,7 @@ import { minKeymanVersion } from "./min-keyman-version.js"; import { KeyboardInfoFile, KeyboardInfoFileIncludes, KeyboardInfoFileLanguageFont, KeyboardInfoFilePlatform } from "./keyboard-info-file.js"; import { KeymanFileTypes, KmpJsonFile, KmxFileReader, KMX, KeymanTargets } from "@keymanapp/common-types"; import { KeyboardInfoCompilerMessages } from "./keyboard-info-compiler-messages.js"; -import { langtags } from "@keymanapp/langtags"; +import { getLangtagByTag } from "@keymanapp/langtags"; import { CompilerCallbacks, KeymanCompiler, CompilerOptions, KeymanCompilerResult, KeymanCompilerArtifacts, KeymanCompilerArtifact, KeymanUrls, isValidEmail, validateMITLicense } from "@keymanapp/developer-utils"; import { KmpCompiler } from "@keymanapp/kmc-package"; @@ -16,29 +16,6 @@ import { getFontFamily } from "@keymanapp/developer-utils"; const regionNames = new Intl.DisplayNames(['en'], { type: "region" }); const scriptNames = new Intl.DisplayNames(['en'], { type: "script" }); -const langtagsByTag: any = {}; - -/** - * Build a dictionary of language tags from langtags.json - */ - -function preinit(): void { - if(langtagsByTag['en']) { - // Already initialized, we can reasonably assume that 'en' will always be in - // langtags.json. - return; - } - - for(const tag of langtags) { - langtagsByTag[tag.tag] = tag; - langtagsByTag[tag.full] = tag; - if(tag.tags) { - for(const t of tag.tags) { - langtagsByTag[t] = tag; - } - } - } -} /** * @public @@ -108,10 +85,6 @@ export class KeyboardInfoCompiler implements KeymanCompiler { private callbacks: CompilerCallbacks; private options: KeyboardInfoCompilerOptions; - constructor() { - preinit(); - } - /** * Initialize the compiler. * Copies options. @@ -571,7 +544,7 @@ export class KeyboardInfoCompiler implements KeymanCompiler { } } } - const tag = langtagsByTag[bcp47] ?? langtagsByTag[locale.language]; + const tag = getLangtagByTag(bcp47) ?? getLangtagByTag(locale.language); language.languageName = tag ? tag.name : bcp47; language.regionName = mapName(locale.region, regionNames); language.scriptName = mapName(locale.script, scriptNames); @@ -586,7 +559,7 @@ export class KeyboardInfoCompiler implements KeymanCompiler { '' ); - const resolvedScript = locale.script ?? langtagsByTag[bcp47]?.script ?? langtagsByTag[locale.language]?.script ?? undefined; + const resolvedScript = locale.script ?? getLangtagByTag(bcp47)?.script ?? getLangtagByTag(locale.language)?.script ?? undefined; if(commonScript === null) { commonScript = resolvedScript; } else { @@ -648,10 +621,3 @@ export class KeyboardInfoCompiler implements KeymanCompiler { } } - -/** - * these are exported only for unit tests, do not use - */ -export const unitTestEndpoints = { - langtagsByTag, -}; \ No newline at end of file diff --git a/developer/src/kmc-keyboard-info/test/keyboard-info-compiler.tests.ts b/developer/src/kmc-keyboard-info/test/keyboard-info-compiler.tests.ts index f71872da3a..7b62b012ed 100644 --- a/developer/src/kmc-keyboard-info/test/keyboard-info-compiler.tests.ts +++ b/developer/src/kmc-keyboard-info/test/keyboard-info-compiler.tests.ts @@ -3,8 +3,8 @@ import { assert } from 'chai'; import 'mocha'; import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; import { makePathToFixture } from './helpers/index.js'; -import { KeyboardInfoCompiler, KeyboardInfoCompilerResult, unitTestEndpoints } from '../src/keyboard-info-compiler.js'; -import { langtags } from "@keymanapp/langtags"; +import { KeyboardInfoCompiler, KeyboardInfoCompilerResult } from '../src/keyboard-info-compiler.js'; +import { getLangtagByTag, langtags } from "@keymanapp/langtags"; import { KmpCompiler, KmpCompilerOptions } from '@keymanapp/kmc-package'; import { KMX, KeymanFileTypes, KeymanTargets, KmpJsonFile } from '@keymanapp/common-types'; import { CompilerCallbacks } from '@keymanapp/developer-utils'; @@ -114,10 +114,10 @@ describe('keyboard-info-compiler', function () { const compiler = new KeyboardInfoCompiler(); // indirectly call preinit() assert.isNotNull(compiler); const en_langtag = langtags.find(({ tag }) => tag === 'en'); - assert.deepEqual((unitTestEndpoints.langtagsByTag)['en'], en_langtag); - assert.deepEqual((unitTestEndpoints.langtagsByTag)['en-Latn-US'], en_langtag); - assert.deepEqual((unitTestEndpoints.langtagsByTag)['en-Latn'], en_langtag); - assert.deepEqual((unitTestEndpoints.langtagsByTag)['en-US'], en_langtag); + assert.deepEqual(getLangtagByTag('en'), en_langtag); + assert.deepEqual(getLangtagByTag('en-latn-us'), en_langtag); + assert.deepEqual(getLangtagByTag('en-latn'), en_langtag); + assert.deepEqual(getLangtagByTag('en-us'), en_langtag); }); it('check init initialises KeyboardInfoCompiler correctly', async function() { diff --git a/package-lock.json b/package-lock.json index ccf9fcbb4b..0528b2c814 100644 --- a/package-lock.json +++ b/package-lock.json @@ -785,7 +785,8 @@ "dependencies": { "@keymanapp/common-types": "*", "@keymanapp/developer-utils": "*", - "@keymanapp/keyman-version": "*" + "@keymanapp/keyman-version": "*", + "@keymanapp/langtags": "*" }, "devDependencies": { "@keymanapp/developer-test-helpers": "*", From c74e841ed7f7f9486d1bd93a9e5f1e3e9ab79d84 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 27 Jan 2025 11:55:10 +0700 Subject: [PATCH 022/109] chore(common): add README.md for langtags package --- common/web/langtags/README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 common/web/langtags/README.md diff --git a/common/web/langtags/README.md b/common/web/langtags/README.md new file mode 100644 index 0000000000..8829194fc0 --- /dev/null +++ b/common/web/langtags/README.md @@ -0,0 +1,33 @@ +# Keyman langtags + +This package provides a wrapper for the +[langtags.json](https://ldml.api.sil.org/langtags.json) dataset from +https://github.com/silnrsi/langtags. + +This package is published in sync with Keyman, so changes in langtags may not +propagate immediately. + +## Usage + +* `getLangtagByTag(tag)`: Find a language tag from a given tag; matches on tag, + tags, full properties, with a case-insensitive search. Returns unmodified + object from langtags.json on match. + +* `metadata.conformance()`: Returns script and region conformance data from + langtags.json + +* `metadata.globalvar()`: Returns global variant data from langtags.json + +* `metadata.phonvar()`: Returns phonetic variant data from langtags.json + +* `metadata.version()`: Returns version data from langtags.json + +* `langtags`: Raw access to the langtags.json array of objects + +## Background + +Key documents for further reading (from langtags repository): + +* [Overview of language tags and how this project works with them](https://github.com/silnrsi/langtags/blob/master/doc/tagging.md) + +* [How to use langtags.json](https://github.com/silnrsi/langtags/blob/master/doc/langtags.md) From 68ef6108ebc4688d94b613dfce314e44d84abc7e Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 27 Jan 2025 13:25:32 +0700 Subject: [PATCH 023/109] chore(developer): add langtags dep for kmc-generate --- developer/src/kmc-generate/build.sh | 1 + developer/src/kmc-generate/tsconfig.json | 2 ++ 2 files changed, 3 insertions(+) diff --git a/developer/src/kmc-generate/build.sh b/developer/src/kmc-generate/build.sh index e99e8288c2..7db46acd56 100755 --- a/developer/src/kmc-generate/build.sh +++ b/developer/src/kmc-generate/build.sh @@ -13,6 +13,7 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" builder_describe "Build Keyman kmc-generate module" \ "@/common/web/keyman-version" \ + "@/common/web/langtags" \ "@/common/web/types" \ "@/developer/src/common/web/test-helpers" \ "@/developer/src/common/web/utils" \ diff --git a/developer/src/kmc-generate/tsconfig.json b/developer/src/kmc-generate/tsconfig.json index 1fc0a249be..bf711ca14a 100644 --- a/developer/src/kmc-generate/tsconfig.json +++ b/developer/src/kmc-generate/tsconfig.json @@ -8,6 +8,7 @@ "paths": { "@keymanapp/keyman-version": ["../../../common/web/keyman-version/keyman-version.mts"], + "@keymanapp/langtags": ["../../../common/web/langtags/src/main"], "@keymanapp/common-types": ["../../../common/web/types/src/main"], }, @@ -20,6 +21,7 @@ ], "references": [ { "path": "../../../common/web/keyman-version" }, + { "path": "../../../common/web/langtags" }, { "path": "../../../common/web/types/" }, ] } From 7e4eb9542c727e6a8e8157be5b2e6c3b6e795cdc Mon Sep 17 00:00:00 2001 From: Meng-Heng Date: Mon, 27 Jan 2025 15:34:39 +0700 Subject: [PATCH 024/109] chore: remove .md --- web/docs/engine/guide/examples/__auto-control.html | 2 +- web/docs/engine/guide/examples/__control-by-control.html | 2 +- web/docs/engine/guide/examples/__first-example.html | 2 +- web/docs/engine/guide/examples/__full-manual-control.html | 2 +- web/docs/engine/guide/examples/__manual-control.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/docs/engine/guide/examples/__auto-control.html b/web/docs/engine/guide/examples/__auto-control.html index e7fc2768c6..050e03a9f0 100644 --- a/web/docs/engine/guide/examples/__auto-control.html +++ b/web/docs/engine/guide/examples/__auto-control.html @@ -26,6 +26,6 @@

-Back to Document +Back to Document \ No newline at end of file diff --git a/web/docs/engine/guide/examples/__control-by-control.html b/web/docs/engine/guide/examples/__control-by-control.html index 440a7862d0..93a481a75f 100644 --- a/web/docs/engine/guide/examples/__control-by-control.html +++ b/web/docs/engine/guide/examples/__control-by-control.html @@ -44,6 +44,6 @@ -Back to Document +Back to Document \ No newline at end of file diff --git a/web/docs/engine/guide/examples/__first-example.html b/web/docs/engine/guide/examples/__first-example.html index 1657db9440..feb96f4daa 100644 --- a/web/docs/engine/guide/examples/__first-example.html +++ b/web/docs/engine/guide/examples/__first-example.html @@ -21,6 +21,6 @@

First Example

Click me and type:

-Back to Document +Back to Document \ No newline at end of file diff --git a/web/docs/engine/guide/examples/__full-manual-control.html b/web/docs/engine/guide/examples/__full-manual-control.html index 24b0d004a7..5a70c7183f 100644 --- a/web/docs/engine/guide/examples/__full-manual-control.html +++ b/web/docs/engine/guide/examples/__full-manual-control.html @@ -51,6 +51,6 @@ window.addEventListener( 'load' , SetupDocument );

-Back to Document +Back to Document diff --git a/web/docs/engine/guide/examples/__manual-control.html b/web/docs/engine/guide/examples/__manual-control.html index e9f5f219ca..9ccc74824c 100644 --- a/web/docs/engine/guide/examples/__manual-control.html +++ b/web/docs/engine/guide/examples/__manual-control.html @@ -40,7 +40,7 @@

-Back to Document +Back to Document \ No newline at end of file From 192e932949dd403e4d72811a8ab01a22c329f23c Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 28 Jan 2025 12:24:04 +0700 Subject: [PATCH 025/109] feat(developer): support relocation of external files in kmc-copy Fixes: #13060 --- .../docs/help/reference/kmc/cli/reference.md | 6 + .../src/kmc-copy/src/KeymanProjectCopier.ts | 12 +- developer/src/kmc-copy/test/copier.tests.ts | 102 +- .../external/alephwithbeth/HISTORY.md | 35 + .../external/alephwithbeth/LICENSE.md | 21 + .../projects/external/alephwithbeth/README.md | 25 + .../external/alephwithbeth/alephwithbeth.kpj | 9 + .../alephwithbeth/build/alephwithbeth.js | 1 + .../build/alephwithbeth.keyboard_info | 40 + .../alephwithbeth/build/alephwithbeth.kmp | Bin 0 -> 244476 bytes .../alephwithbeth/build/alephwithbeth.kmx | Bin 0 -> 7160 bytes .../alephwithbeth/build/alephwithbeth.kvk | Bin 0 -> 1921 bytes .../alephwithbeth/source/alephwithbeth.ico | Bin 0 -> 1150 bytes .../source/alephwithbeth.keyman-touch-layout | 1646 +++++++++++++++++ .../alephwithbeth/source/alephwithbeth.kmn | 215 +++ .../alephwithbeth/source/alephwithbeth.kps | 95 + .../alephwithbeth/source/alephwithbeth.kvks | 138 ++ .../source/help/KeyboardLayout.png | Bin 0 -> 97424 bytes .../source/help/KeyboardLayoutAlt.png | Bin 0 -> 61615 bytes .../source/help/KeyboardLayoutShift.png | Bin 0 -> 85201 bytes .../source/help/alephwithbeth.php | 22 + .../external/alephwithbeth/source/readme.htm | 22 + .../another-folder/welcome/KeyboardLayout.png | Bin 0 -> 97424 bytes .../welcome/KeyboardLayoutAlt.png | Bin 0 -> 61615 bytes .../welcome/KeyboardLayoutShift.png | Bin 0 -> 85201 bytes .../another-folder/welcome/welcome.htm | 28 + developer/src/kmc/src/commands/copy.ts | 2 + 27 files changed, 2414 insertions(+), 5 deletions(-) create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/HISTORY.md create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/LICENSE.md create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/README.md create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/alephwithbeth.kpj create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.js create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.keyboard_info create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kmp create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kmx create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kvk create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.ico create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.keyman-touch-layout create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kmn create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kps create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kvks create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayout.png create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayoutAlt.png create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayoutShift.png create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/alephwithbeth.php create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/readme.htm create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayout.png create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayoutAlt.png create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayoutShift.png create mode 100644 developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/welcome.htm diff --git a/developer/docs/help/reference/kmc/cli/reference.md b/developer/docs/help/reference/kmc/cli/reference.md index fdaed58faa..823c65f995 100644 --- a/developer/docs/help/reference/kmc/cli/reference.md +++ b/developer/docs/help/reference/kmc/cli/reference.md @@ -509,6 +509,12 @@ following sources: : Show what would happen, without making changes +`-r, --relocate-external` + +: Copy referenced files that are outside the project folder into an 'external' + folder within the new project, rather than just referencing them in their + current location. + ### File copying, renaming, and structure rules The **origin** project folder is the one that contains the .kpj file. When a diff --git a/developer/src/kmc-copy/src/KeymanProjectCopier.ts b/developer/src/kmc-copy/src/KeymanProjectCopier.ts index 9e8d175991..decc773486 100644 --- a/developer/src/kmc-copy/src/KeymanProjectCopier.ts +++ b/developer/src/kmc-copy/src/KeymanProjectCopier.ts @@ -33,6 +33,12 @@ export interface CopierOptions /* not inheriting from CompilerBaseOptions */ { * dryRun: show what would happen */ dryRun: boolean; + /** + * Copy referenced files that are outside the project folder into an + * 'external' folder within the new project, rather than just referencing them + * in their current location + */ + relocateExternalFiles?: boolean; }; /** @@ -78,7 +84,6 @@ export class KeymanProjectCopier implements KeymanCompiler { isLocalOrigin(): boolean { return this.githubRef == undefined; } - relocateExternalFiles: boolean = false; // TODO-COPY: support public async init(callbacks: CompilerCallbacks, options: CopierOptions): Promise { if(!callbacks || !options) { @@ -559,7 +564,7 @@ export class KeymanProjectCopier implements KeymanCompiler { let subOutputPath: string; if(this.callbacks.path.isAbsolute(subFilenameRelative) || subFilenameRelative.startsWith('..')) { - if(this.isLocalOrigin() && !this.relocateExternalFiles) { + if(this.isLocalOrigin() && !this.options.relocateExternalFiles) { // Reference outside the project structure, do not attempt to normalize or copy, // but we do need to update references for the new output path return this.normalizePath(this.callbacks.path.relative(result.artifacts[parentFilename].filename, subFilenameAbsolute)); @@ -567,7 +572,8 @@ export class KeymanProjectCopier implements KeymanCompiler { // Reference outside the project structure, we will copy into a subfolder of the project; // should be relative to root of remote repo, e.g. release/k/khmer_angkor references release/shared/fonts/..., // so should go external/release/shared/fonts/... - subOutputPath = this.normalizePath(this.callbacks.path.join(this.options.outPath, 'external', this.callbacks.path.dirname(subFilenameAbsolute))); + const relativePath = this.callbacks.path.dirname(subFilenameRelative).replace(/\.\.[/\\]/g, ''); + subOutputPath = this.normalizePath(this.callbacks.path.join(this.options.outPath, 'external', relativePath)); } } else { subOutputPath = this.normalizePath(this.callbacks.path.join(outputPath, this.callbacks.path.dirname(originalSubfilename))); diff --git a/developer/src/kmc-copy/test/copier.tests.ts b/developer/src/kmc-copy/test/copier.tests.ts index 6a2a8cbb1e..697e58e0b5 100644 --- a/developer/src/kmc-copy/test/copier.tests.ts +++ b/developer/src/kmc-copy/test/copier.tests.ts @@ -13,6 +13,7 @@ import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; import { KeymanProjectCopier } from '../src/KeymanProjectCopier.js'; import { makePathToFixture } from './helpers/index.js'; import { GitHubRef } from './cloud.js'; +import { KpsFileReader } from '@keymanapp/developer-utils'; const { TEST_SAVE_ARTIFACTS, TEST_SAVE_FIXTURES } = env; let outputRoot: string = '/an/imaginary/root/'; @@ -269,8 +270,8 @@ describe('KeymanProjectCopier', function() { "/release/j/jawa/source/jawa2.bmp": "source/jawa2.bmp", "/release/j/jawa/source/readme.htm": "source/readme.htm", "/release/j/jawa/source/welcome/welcome.htm": "source/welcome/welcome.htm", - "/release/shared/fonts/noto/Java/NotoSansJavanese-Bold.ttf": "external/release/shared/fonts/noto/Java/NotoSansJavanese-Bold.ttf", - "/release/shared/fonts/noto/Java/NotoSansJavanese-Regular.ttf": "external/release/shared/fonts/noto/Java/NotoSansJavanese-Regular.ttf", + "/release/shared/fonts/noto/Java/NotoSansJavanese-Bold.ttf": "external/shared/fonts/noto/Java/NotoSansJavanese-Bold.ttf", + "/release/shared/fonts/noto/Java/NotoSansJavanese-Regular.ttf": "external/shared/fonts/noto/Java/NotoSansJavanese-Regular.ttf", // NOTE: the following files are not included because this is a 1.0 // project and they are not referenced by any files: // * HISTORY.md @@ -523,6 +524,103 @@ describe('KeymanProjectCopier', function() { ]); }); + it('should copy external files into an "external" folder when relocateExternalFiles is true', async function() { + const copier = new KeymanProjectCopier(); + assert.isTrue(await copier.init(callbacks, { + dryRun: false, + outPath: 'organized', + relocateExternalFiles: true, + })); + + const result = await copier.run(makePathToFixture('projects','external','alephwithbeth','alephwithbeth.kpj')); + assert.sameMembers(Object.keys(result.artifacts).map(k => result.artifacts[k].filename), [ + 'organized', // kmc-copy:outputPath + 'organized/source/organized.keyman-touch-layout', + 'organized/source/organized.kmn', + 'organized/source/organized.ico', + 'organized/source/organized.kvks', + 'organized/source/organized.kps', + 'organized/source/readme.htm', + // files in 'another-folder/' get moved to 'external/' + 'organized/external/another-folder/welcome/welcome.htm', + 'organized/external/another-folder/welcome/KeyboardLayout.png', + 'organized/external/another-folder/welcome/KeyboardLayoutAlt.png', + 'organized/external/another-folder/welcome/KeyboardLayoutShift.png', + // build artifact files get moved to build/ + 'organized/build/organized.js', + 'organized/build/organized.kvk', + 'organized/build/organized.kmx', + // 'organized/build/organized.kmp', // TODO-COPY: do we need to copy this file as well? + 'organized/LICENSE.md', + 'organized/organized.kpj', + 'organized/HISTORY.md', + 'organized/README.md', + 'organized/source/help/organized.php', + 'organized/source/help/KeyboardLayout.png', + 'organized/source/help/KeyboardLayoutAlt.png', + 'organized/source/help/KeyboardLayoutShift.png', + ]); + + // Verify that .kps has the appropriate paths + const reader = new KpsFileReader(callbacks); + const kpsFilename = Object.keys(result.artifacts).find(k => result.artifacts[k].filename == 'organized/source/organized.kps')!; + const kps = reader.read(result.artifacts[kpsFilename].data); + assert.isDefined(kps.Package.Files?.File.find(file => file.Name == '../external/another-folder/welcome/welcome.htm')); + assert.isDefined(kps.Package.Files?.File.find(file => file.Name == '../external/another-folder/welcome/KeyboardLayout.png')); + assert.isDefined(kps.Package.Files?.File.find(file => file.Name == '../external/another-folder/welcome/KeyboardLayoutAlt.png')); + assert.isDefined(kps.Package.Files?.File.find(file => file.Name == '../external/another-folder/welcome/KeyboardLayoutShift.png')); + }); + + it('should leave external files in their original location when relocateExternalFiles is false', async function() { + const copier = new KeymanProjectCopier(); + assert.isTrue(await copier.init(callbacks, { + dryRun: false, + outPath: 'organized', + relocateExternalFiles: false, + })); + + const result = await copier.run(makePathToFixture('projects','external','alephwithbeth','alephwithbeth.kpj')); + assert.sameMembers(Object.keys(result.artifacts).map(k => result.artifacts[k].filename), [ + 'organized', // kmc-copy:outputPath + 'organized/source/organized.keyman-touch-layout', + 'organized/source/organized.kmn', + 'organized/source/organized.ico', + 'organized/source/organized.kvks', + 'organized/source/organized.kps', + 'organized/source/readme.htm', + + // files in 'another-folder/' stay there, so they are not referenced + // 'organized/external/welcome.htm', + // 'organized/external/KeyboardLayout.png', + // 'organized/external/KeyboardLayoutAlt.png', + // 'organized/external/KeyboardLayoutShift.png', + + // build artifact files get moved to build/ + 'organized/build/organized.js', + 'organized/build/organized.kvk', + 'organized/build/organized.kmx', + // 'organized/build/organized.kmp', // TODO-COPY: do we need to copy this file as well? + 'organized/LICENSE.md', + 'organized/organized.kpj', + 'organized/HISTORY.md', + 'organized/README.md', + 'organized/source/help/organized.php', + 'organized/source/help/KeyboardLayout.png', + 'organized/source/help/KeyboardLayoutAlt.png', + 'organized/source/help/KeyboardLayoutShift.png', + ]); + + // we'll check the .kps for its references, these are relative to the test/organized/source? folder + const reader = new KpsFileReader(callbacks); + const kpsFilename = Object.keys(result.artifacts).find(k => result.artifacts[k].filename == 'organized/source/organized.kps')!; + const kps = reader.read(result.artifacts[kpsFilename].data); + + assert.isDefined(kps.Package.Files?.File.find(file => file.Name == '../../../test/fixtures/projects/external/another-folder/welcome/welcome.htm')); + assert.isDefined(kps.Package.Files?.File.find(file => file.Name == '../../../test/fixtures/projects/external/another-folder/welcome/KeyboardLayout.png')); + assert.isDefined(kps.Package.Files?.File.find(file => file.Name == '../../../test/fixtures/projects/external/another-folder/welcome/KeyboardLayoutAlt.png')); + assert.isDefined(kps.Package.Files?.File.find(file => file.Name == '../../../test/fixtures/projects/external/another-folder/welcome/KeyboardLayoutShift.png')); + }); + // TODO-COPY: additional tests it.skip('should copy a standalone .kmn into a new project', async function() {}); it.skip('should copy a standalone .kmn and .kps into a new project', async function() {}); diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/HISTORY.md b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/HISTORY.md new file mode 100644 index 0000000000..65dd7e13c7 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/HISTORY.md @@ -0,0 +1,35 @@ +alephwithbeth Change History +==================== + +1.0.6 (2024-06-11) +------------------ +* Remove source files from package + +1.0.5 (2023-02-28) +------------------ +* replaced hyphen with maqef +* added a touch-optimized keyboard layout for phone + +1.0.4 (2023-02-13) +------------------ +* Removed unnecessary version numbers. +* added description + +1.0.3 (2023-02-11) +------------------ +* Removed the faulty auto correct feature. +* Captialized all words of the title. +* Added title to .kmn + +1.0.2 (2023-02-09) +------------------ +* Renamed keyboard to "Aleph with Beth" + +1.0.1 (2023-02-08) +---------------- +* Updated author and website (in kps) +* Added copyrights where needed. + +1.0 (2023-01-28) +---------------- +* Created by Cameron Briggs diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/LICENSE.md b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/LICENSE.md new file mode 100644 index 0000000000..7f84a306c0 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2023-2024 Cameron Briggs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/README.md b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/README.md new file mode 100644 index 0000000000..16edd8db20 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/README.md @@ -0,0 +1,25 @@ +alephwithbeth keyboard +============== + +Description +----------- +A Hebrew keyboard designed to intuitively match the standard QWERTY layout. + +Copyright +--------- +See [LICENSE.md](LICENSE.md) + +Supported Platforms +------------------- + * Windows + * macOS + * Linux + * Web + * iPhone + * iPad + * Android phone + * Android tablet + * Mobile devices + * Desktop devices + * Tablet devices + diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/alephwithbeth.kpj b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/alephwithbeth.kpj new file mode 100644 index 0000000000..e3309add20 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/alephwithbeth.kpj @@ -0,0 +1,9 @@ + + + + 2.0 + $PROJECTPATH\build + True + True + + diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.js b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.js new file mode 100644 index 0000000000..a17168b28d --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.js @@ -0,0 +1 @@ +KeymanWeb.KR(new Keyboard_alephwithbeth());function Keyboard_alephwithbeth(){this._v=(typeof keyman!="undefined"&&typeof keyman.version=="string")?parseInt(keyman.version,10):9;this.KI="Keyboard_alephwithbeth";this.KN="Aleph With Beth";this.KMINVER="14.0";this.KV={F:' 1em "Arial"',K102:0};this.KV.KLS={"shift": ["","!","֘","֨","֜","֞","֔","֬","֝","(",")","_","+","","","","קּ","וּ","ֵ","רּ","תּ","יּ","ֻ","","וֹ","פּ","{","}","|","","","","ָ","סּ","דּ","טּ","גּ","הּ","וַיּ","כּ","לּ","״","\"","","","","","","","זּ","צּ","שּׂ","שּׁ","בּ","נּ","מּ","","ּ","?","","","","","",""],"default": ["֑","1","2","3","4","5","6","7","8","9","0","־","=","","","","ק","ו","ֶ","ר","ת","י","ע","ִ","ֹ","פ","[","]","\\","","","","ַ","ס","ד","ט","ג","ה","ח","כ","ל","ְ","'","","","","","","","ז","צ","שׂ","שׁ","ב","נ","מ","א",".","/","","","","","",""],"alt": ["","֗","֮","֙","֠","֩","֟","֡","֕","֓","֯","ֿ","◌","","","","","","ֱ","","","","","ֽ","ֳ","ף","֔","֒","֫","","","","ֲ","","","","•","̊","","ך","","׃","ׄ","","","","","","","","ץ","","","","ן","ם","֫","̈","״","","","","","",""]};this.KV.BK=(function(x){var e=Array.apply(null,Array(65)).map(String.prototype.valueOf,""),r=[],v,i,m=['default','shift','ctrl','shift-ctrl','alt','shift-alt','ctrl-alt','shift-ctrl-alt'];for(i=m.length-1;i>=0;i--)if((v=x[m[i]])||r.length)r=(v?v:e).slice().concat(r);return r})(this.KV.KLS);this.KDU=0;this.KH="Aleph With Beth";this.KM=0;this.KBVER="1.0.6";this.KMBM=0x70;this.KRTL=1;this.KVKL={"tablet":{"displayUnderlying":false,"layer":[{"id":"default","row":[{"id":"1","key":[{"id":"K_1","text":"1"},{"id":"K_2","text":"2"},{"id":"K_3","text":"3"},{"id":"K_4","text":"4"},{"id":"K_5","text":"5"},{"id":"K_6","text":"6"},{"id":"K_7","text":"7"},{"id":"K_8","text":"8"},{"id":"K_9","text":"9"},{"id":"K_0","text":"0"},{"id":"K_HYPHEN","text":"־"},{"id":"K_EQUAL","text":"="},{"id":"K_BKSP","text":"*BkSp*","width":"100","sp":"1"}]},{"id":"2","key":[{"id":"K_Q","text":"ק","pad":"75"},{"id":"K_W","text":"ו"},{"id":"K_E","text":"ֶ"},{"id":"K_R","text":"ר"},{"id":"K_T","text":"ת"},{"id":"K_Y","text":"י"},{"id":"K_U","text":"ע"},{"id":"K_I","text":"ִ"},{"id":"K_O","text":"ֹ"},{"id":"K_P","text":"פ"},{"id":"K_LBRKT","text":"["},{"id":"K_RBRKT","text":"]"},{"id":"T_new_138","width":"10","sp":"10"}]},{"id":"3","key":[{"id":"K_BKQUOTE","text":"֑"},{"id":"K_A","text":"ַ"},{"id":"K_S","text":"ס"},{"id":"K_D","text":"ד"},{"id":"K_F","text":"ט"},{"id":"K_G","text":"ג"},{"id":"K_H","text":"ה"},{"id":"K_J","text":"ח"},{"id":"K_K","text":"כ"},{"id":"K_L","text":"ל"},{"id":"K_COLON","text":"ְ"},{"id":"K_QUOTE","text":"'"},{"id":"K_BKSLASH","text":"\\"}]},{"id":"4","key":[{"id":"K_SHIFT","text":"*Shift*","width":"160","sp":"1","nextlayer":"shift"},{"id":"K_oE2"},{"id":"K_Z","text":"ז"},{"id":"K_X","text":"צ"},{"id":"K_C","text":"שׂ"},{"id":"K_V","text":"שׁ"},{"id":"K_B","text":"ב"},{"id":"K_N","text":"נ"},{"id":"K_M","text":"מ"},{"id":"K_COMMA","text":"א"},{"id":"K_PERIOD","text":"."},{"id":"K_SLASH","text":"/"},{"id":"T_new_164","width":"10","sp":"10"}]},{"id":"5","key":[{"id":"K_LCONTROL","text":"alt","width":"130","sp":"1","nextlayer":"alt"},{"id":"K_LOPT","text":"*Menu*","width":"140","sp":"1"},{"id":"K_SPACE","width":"930"},{"id":"K_ENTER","text":"*Enter*","width":"145","sp":"1"}]}]},{"id":"shift","row":[{"id":"1","key":[{"id":"K_1","text":"!"},{"id":"K_2","text":"֘"},{"id":"K_3","text":"֨"},{"id":"K_4","text":"֜"},{"id":"K_5","text":"֞"},{"id":"K_6","text":"֔"},{"id":"K_7","text":"֬"},{"id":"K_8","text":"֝"},{"id":"K_9","text":"("},{"id":"K_0","text":")"},{"id":"K_HYPHEN","text":"_"},{"id":"K_EQUAL","text":"+"},{"id":"K_BKSP","text":"*BkSp*","width":"100","sp":"1"}]},{"id":"2","key":[{"id":"K_Q","text":"קּ","pad":"75"},{"id":"K_W","text":"וּ"},{"id":"K_E","text":"ֵ"},{"id":"K_R","text":"רּ"},{"id":"K_T","text":"תּ"},{"id":"K_Y","text":"יּ"},{"id":"K_U","text":"ֻ"},{"id":"K_I"},{"id":"K_O","text":"וֹ"},{"id":"K_P","text":"פּ"},{"id":"K_LBRKT","text":"{"},{"id":"K_RBRKT","text":"}"},{"id":"T_new_362","width":"10","sp":"10"}]},{"id":"3","key":[{"id":"K_BKQUOTE"},{"id":"K_A","text":"ָ"},{"id":"K_S","text":"סּ"},{"id":"K_D","text":"דּ"},{"id":"K_F","text":"טּ"},{"id":"K_G","text":"גּ"},{"id":"K_H","text":"הּ"},{"id":"K_J","text":"וַיּ"},{"id":"K_K","text":"כּ"},{"id":"K_L","text":"לּ"},{"id":"K_COLON","text":"״"},{"id":"K_QUOTE","text":"\""},{"id":"K_BKSLASH","text":"|"}]},{"id":"4","key":[{"id":"K_SHIFT","text":"*Shift*","width":"160","sp":"1","nextlayer":"default"},{"id":"K_oE2"},{"id":"K_Z","text":"זּ"},{"id":"K_X","text":"צּ"},{"id":"K_C","text":"שּׂ"},{"id":"K_V","text":"שּׁ"},{"id":"K_B","text":"בּ"},{"id":"K_N","text":"נּ"},{"id":"K_M","text":"מּ"},{"id":"K_COMMA"},{"id":"K_PERIOD","text":"ּ"},{"id":"K_SLASH","text":"?"},{"id":"T_new_388","width":"10","sp":"10"}]},{"id":"5","key":[{"id":"K_LCONTROL","text":"alt","width":"130","sp":"1","nextlayer":"alt"},{"id":"K_LOPT","text":"*Menu*","width":"140","sp":"1"},{"id":"K_SPACE","width":"930"},{"id":"K_ENTER","text":"*Enter*","width":"145","sp":"1"}]}]},{"id":"alt","row":[{"id":"1","key":[{"id":"K_1","text":"֗"},{"id":"K_2","text":"֮"},{"id":"K_3","text":"֙"},{"id":"K_4","text":"֠"},{"id":"K_5","text":"֩"},{"id":"K_6","text":"֟"},{"id":"K_7","text":"֡"},{"id":"K_8","text":"֕"},{"id":"K_9","text":"֓"},{"id":"K_0","text":"֯"},{"id":"K_HYPHEN","text":"ֿ"},{"id":"K_EQUAL","text":"◌"},{"id":"K_BKSP","text":"*BkSp*","width":"100","sp":"1"}]},{"id":"2","key":[{"id":"K_Q","pad":"75"},{"id":"K_W"},{"id":"K_E","text":"ֱ"},{"id":"K_R"},{"id":"K_T"},{"id":"K_Y"},{"id":"K_U"},{"id":"K_I","text":"ֽ"},{"id":"K_O","text":"ֳ"},{"id":"K_P","text":"ף"},{"id":"K_LBRKT","text":"֔"},{"id":"K_RBRKT","text":"֒"},{"id":"T_new_138","width":"10","sp":"10"}]},{"id":"3","key":[{"id":"K_BKQUOTE"},{"id":"K_A","text":"ֲ"},{"id":"K_S"},{"id":"K_D"},{"id":"K_F"},{"id":"K_G","text":"•"},{"id":"K_H","text":"̊"},{"id":"K_J"},{"id":"K_K","text":"ך"},{"id":"K_L"},{"id":"K_COLON","text":"׃"},{"id":"K_QUOTE","text":"ׄ"},{"id":"K_BKSLASH","text":"֫"}]},{"id":"4","key":[{"id":"K_SHIFT","text":"*Shift*","width":"160","sp":"1","nextlayer":"shift","layer":"shift"},{"id":"K_oE2"},{"id":"K_Z"},{"id":"K_X","text":"ץ"},{"id":"K_C"},{"id":"K_V"},{"id":"K_B"},{"id":"K_N","text":"ן"},{"id":"K_M","text":"ם"},{"id":"K_COMMA","text":"֫"},{"id":"K_PERIOD","text":"̈"},{"id":"K_SLASH","text":"״"},{"id":"T_new_164","width":"10","sp":"10"}]},{"id":"5","key":[{"id":"K_LCONTROL","text":"default","width":"130","sp":"1","nextlayer":"default"},{"id":"K_LOPT","text":"*Menu*","width":"140","sp":"1"},{"id":"K_SPACE","width":"930"},{"id":"K_ENTER","text":"*Enter*","width":"145","sp":"1"}]}]}]},"phone":{"displayUnderlying":false,"layer":[{"id":"default","row":[{"id":"1","key":[{"id":"K_1","text":"1"},{"id":"K_2","text":"2"},{"id":"K_3","text":"3"},{"id":"K_4","text":"4"},{"id":"K_5","text":"5"},{"id":"K_6","text":"6"},{"id":"K_7","text":"7"},{"id":"K_8","text":"8"},{"id":"K_9","text":"9"},{"id":"K_0","text":"0"},{"id":"K_HYPHEN","text":"־"},{"id":"K_EQUAL","text":"="},{"id":"K_BKSP","text":"*BkSp*","width":"100","sp":"1"}]},{"id":"2","key":[{"id":"K_Q","text":"ק","pad":"75"},{"id":"K_W","text":"ו"},{"id":"K_E","text":"ֶ"},{"id":"K_R","text":"ר"},{"id":"K_T","text":"ת"},{"id":"K_Y","text":"י"},{"id":"K_U","text":"ע"},{"id":"K_I","text":"ִ"},{"id":"K_O","text":"ֹ"},{"id":"K_P","text":"פ"},{"id":"K_LBRKT","text":"["},{"id":"K_RBRKT","text":"]"},{"id":"T_new_138","width":"10","sp":"10"}]},{"id":"3","key":[{"id":"K_BKQUOTE","text":"֑"},{"id":"K_A","text":"ַ"},{"id":"K_S","text":"ס"},{"id":"K_D","text":"ד"},{"id":"K_F","text":"ט"},{"id":"K_G","text":"ג"},{"id":"K_H","text":"ה"},{"id":"K_J","text":"ח"},{"id":"K_K","text":"כ"},{"id":"K_L","text":"ל"},{"id":"K_COLON","text":"ְ"},{"id":"K_QUOTE","text":"'"},{"id":"K_BKSLASH","text":"\\"}]},{"id":"4","key":[{"id":"K_SHIFT","text":"*Shift*","width":"160","sp":"1","nextlayer":"shift"},{"id":"K_oE2"},{"id":"K_Z","text":"ז"},{"id":"K_X","text":"צ"},{"id":"K_C","text":"שׂ"},{"id":"K_V","text":"שׁ"},{"id":"K_B","text":"ב"},{"id":"K_N","text":"נ"},{"id":"K_M","text":"מ"},{"id":"K_COMMA","text":"א"},{"id":"K_PERIOD","text":"."},{"id":"K_SLASH","text":"/"},{"id":"T_new_164","width":"10","sp":"10"}]},{"id":"5","key":[{"id":"K_LCONTROL","text":"alt","width":"130","sp":"1","nextlayer":"alt"},{"id":"K_LOPT","text":"*Menu*","width":"140","sp":"1"},{"id":"K_SPACE","width":"930"},{"id":"K_ENTER","text":"*Enter*","width":"145","sp":"1"}]}]},{"id":"shift","row":[{"id":"1","key":[{"id":"K_1","text":"!"},{"id":"K_2","text":"֘"},{"id":"K_3","text":"֨"},{"id":"K_4","text":"֜"},{"id":"K_5","text":"֞"},{"id":"K_6","text":"֔"},{"id":"K_7","text":"֬"},{"id":"K_8","text":"֝"},{"id":"K_9","text":"("},{"id":"K_0","text":")"},{"id":"K_HYPHEN","text":"_"},{"id":"K_EQUAL","text":"+"},{"id":"K_BKSP","text":"*BkSp*","width":"100","sp":"1"}]},{"id":"2","key":[{"id":"K_Q","text":"קּ","pad":"75"},{"id":"K_W","text":"וּ"},{"id":"K_E","text":"ֵ"},{"id":"K_R","text":"רּ"},{"id":"K_T","text":"תּ"},{"id":"K_Y","text":"יּ"},{"id":"K_U","text":"ֻ"},{"id":"K_I"},{"id":"K_O","text":"וֹ"},{"id":"K_P","text":"פּ"},{"id":"K_LBRKT","text":"{"},{"id":"K_RBRKT","text":"}"},{"id":"T_new_362","width":"10","sp":"10"}]},{"id":"3","key":[{"id":"K_BKQUOTE"},{"id":"K_A","text":"ָ"},{"id":"K_S","text":"סּ"},{"id":"K_D","text":"דּ"},{"id":"K_F","text":"טּ"},{"id":"K_G","text":"גּ"},{"id":"K_H","text":"הּ"},{"id":"K_J","text":"וַיּ"},{"id":"K_K","text":"כּ"},{"id":"K_L","text":"לּ"},{"id":"K_COLON","text":"״"},{"id":"K_QUOTE","text":"\""},{"id":"K_BKSLASH","text":"|"}]},{"id":"4","key":[{"id":"K_SHIFT","text":"*Shift*","width":"160","sp":"1","nextlayer":"default"},{"id":"K_oE2"},{"id":"K_Z","text":"זּ"},{"id":"K_X","text":"צּ"},{"id":"K_C","text":"שּׂ"},{"id":"K_V","text":"שּׁ"},{"id":"K_B","text":"בּ"},{"id":"K_N","text":"נּ"},{"id":"K_M","text":"מּ"},{"id":"K_COMMA"},{"id":"K_PERIOD","text":"ּ"},{"id":"K_SLASH","text":"?"},{"id":"T_new_388","width":"10","sp":"10"}]},{"id":"5","key":[{"id":"K_LCONTROL","text":"alt","width":"130","sp":"1","nextlayer":"alt"},{"id":"K_LOPT","text":"*Menu*","width":"140","sp":"1"},{"id":"K_SPACE","width":"930"},{"id":"K_ENTER","text":"*Enter*","width":"145","sp":"1"}]}]},{"id":"alt","row":[{"id":"1","key":[{"id":"K_1","text":"֗"},{"id":"K_2","text":"֮"},{"id":"K_3","text":"֙"},{"id":"K_4","text":"֠"},{"id":"K_5","text":"֩"},{"id":"K_6","text":"֟"},{"id":"K_7","text":"֡"},{"id":"K_8","text":"֕"},{"id":"K_9","text":"֓"},{"id":"K_0","text":"֯"},{"id":"K_HYPHEN","text":"ֿ"},{"id":"K_EQUAL","text":"◌"},{"id":"K_BKSP","text":"*BkSp*","width":"100","sp":"1"}]},{"id":"2","key":[{"id":"K_Q","pad":"75"},{"id":"K_W"},{"id":"K_E","text":"ֱ"},{"id":"K_R"},{"id":"K_T"},{"id":"K_Y"},{"id":"K_U"},{"id":"K_I","text":"ֽ"},{"id":"K_O","text":"ֳ"},{"id":"K_P","text":"ף"},{"id":"K_LBRKT","text":"֔"},{"id":"K_RBRKT","text":"֒"},{"id":"T_new_138","width":"10","sp":"10"}]},{"id":"3","key":[{"id":"K_BKQUOTE"},{"id":"K_A","text":"ֲ"},{"id":"K_S"},{"id":"K_D"},{"id":"K_F"},{"id":"K_G","text":"•"},{"id":"K_H","text":"̊"},{"id":"K_J"},{"id":"K_K","text":"ך"},{"id":"K_L"},{"id":"K_COLON","text":"׃"},{"id":"K_QUOTE","text":"ׄ"},{"id":"K_BKSLASH","text":"֫"}]},{"id":"4","key":[{"id":"K_SHIFT","text":"*Shift*","width":"160","sp":"1","nextlayer":"shift","layer":"shift"},{"id":"K_oE2"},{"id":"K_Z"},{"id":"K_X","text":"ץ"},{"id":"K_C"},{"id":"K_V"},{"id":"K_B"},{"id":"K_N","text":"ן"},{"id":"K_M","text":"ם"},{"id":"K_COMMA","text":"֫"},{"id":"K_PERIOD","text":"̈"},{"id":"K_SLASH","text":"״"},{"id":"T_new_164","width":"10","sp":"10"}]},{"id":"5","key":[{"id":"K_LCONTROL","text":"default","width":"130","sp":"1","nextlayer":"default"},{"id":"K_LOPT","text":"*Menu*","width":"140","sp":"1"},{"id":"K_SPACE","width":"930"},{"id":"K_ENTER","text":"*Enter*","width":"145","sp":"1"}]}]}]}};this.s7="כמנפצ";this.s8="ךםןףץ";this.s9="כּפּ";this.s10="ךּףּ";this.s11="ּ";this.s12="מּנּצּ";this.s13="םןץ";this.s14="ֽ֑֖֛֢֣֤֥֦֧֪֚֭֮֒֓֔֕֗֘֙֜֝֞֟֠֡֨֩֫֬֯־ֿ׀ׄ";this.s15="...";this.KVER="18.0.175.0";this.KVS=[];this.gs=function(t,e) {return this.g0(t,e);};this.gs=function(t,e) {return this.g0(t,e);};this.g0=function(t,e) {var k=KeymanWeb,r=0,m=0;if(k.KKM(e,16384,9)) {if(k.KA(0,k.KC(3,1,t),this.s7)&&k.KA(1,k.KC(2,1,t),this.s14)&&k.KCM(1,t,"ּ",1)){r=m=1;k.KIO(3,this.s8,1,t);k.KIO(-1,this.s14,2,t);k.KO(-1,t,"ּ");}else if(k.KA(0,k.KC(3,1,t),this.s7)&&k.KCM(2,t,"ּ",1)&&k.KA(2,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(3,this.s8,1,t);k.KO(-1,t,"ּ");k.KIO(-1,this.s14,3,t);}else if(k.KA(0,k.KC(2,1,t),this.s7)&&k.KCM(1,t,"ּ",1)){r=m=1;k.KIO(2,this.s8,1,t);k.KO(-1,t,"ּ");}else if(k.KA(0,k.KC(2,1,t),this.s7)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s8,1,t);k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(2,1,t),this.s9)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s10,1,t);k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(2,1,t),this.s12)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s13,1,t);k.KO(-1,t,"ּ");k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(1,1,t),this.s7)){r=m=1;k.KIO(1,this.s8,1,t);}else if(k.KA(0,k.KC(1,1,t),this.s9)){r=m=1;k.KIO(1,this.s10,1,t);}else if(k.KA(0,k.KC(1,1,t),this.s12)){r=m=1;k.KIO(1,this.s13,1,t);k.KO(-1,t,"ּ");}}else if(k.KKM(e,16384,13)) {if(k.KA(0,k.KC(3,1,t),this.s7)&&k.KA(1,k.KC(2,1,t),this.s14)&&k.KCM(1,t,"ּ",1)){r=m=1;k.KIO(3,this.s8,1,t);k.KIO(-1,this.s14,2,t);k.KO(-1,t,"ּ");}else if(k.KA(0,k.KC(3,1,t),this.s7)&&k.KCM(2,t,"ּ",1)&&k.KA(2,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(3,this.s8,1,t);k.KO(-1,t,"ּ");k.KIO(-1,this.s14,3,t);}else if(k.KA(0,k.KC(2,1,t),this.s7)&&k.KCM(1,t,"ּ",1)){r=m=1;k.KIO(2,this.s8,1,t);k.KO(-1,t,"ּ");}else if(k.KA(0,k.KC(2,1,t),this.s7)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s8,1,t);k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(2,1,t),this.s9)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s10,1,t);k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(2,1,t),this.s12)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s13,1,t);k.KO(-1,t,"ּ");k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(1,1,t),this.s7)){r=m=1;k.KIO(1,this.s8,1,t);}else if(k.KA(0,k.KC(1,1,t),this.s9)){r=m=1;k.KIO(1,this.s10,1,t);}else if(k.KA(0,k.KC(1,1,t),this.s12)){r=m=1;k.KIO(1,this.s13,1,t);k.KO(-1,t,"ּ");}}else if(k.KKM(e,16384,32)) {if(k.KA(0,k.KC(3,1,t),this.s7)&&k.KA(1,k.KC(2,1,t),this.s14)&&k.KCM(1,t,"ּ",1)){r=m=1;k.KIO(3,this.s8,1,t);k.KIO(-1,this.s14,2,t);k.KO(-1,t,"ּ");}else if(k.KA(0,k.KC(3,1,t),this.s7)&&k.KCM(2,t,"ּ",1)&&k.KA(2,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(3,this.s8,1,t);k.KO(-1,t,"ּ");k.KIO(-1,this.s14,3,t);}else if(k.KA(0,k.KC(2,1,t),this.s7)&&k.KCM(1,t,"ּ",1)){r=m=1;k.KIO(2,this.s8,1,t);k.KO(-1,t,"ּ");}else if(k.KA(0,k.KC(2,1,t),this.s7)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s8,1,t);k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(2,1,t),this.s9)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s10,1,t);k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(2,1,t),this.s12)&&k.KA(1,k.KC(1,1,t),this.s14)){r=m=1;k.KIO(2,this.s13,1,t);k.KO(-1,t,"ּ");k.KIO(-1,this.s14,2,t);}else if(k.KA(0,k.KC(1,1,t),this.s7)){r=m=1;k.KIO(1,this.s8,1,t);}else if(k.KA(0,k.KC(1,1,t),this.s9)){r=m=1;k.KIO(1,this.s10,1,t);}else if(k.KA(0,k.KC(1,1,t),this.s12)){r=m=1;k.KIO(1,this.s13,1,t);k.KO(-1,t,"ּ");}else if(1){r=m=1;k.KO(0,t," ");}}else if(k.KKM(e,16432,32)) {if(1){r=m=1;k.KO(0,t," ");}}else if(k.KKM(e,16400,32)) {if(1){r=m=1;k.KO(0,t," ");}}else if(k.KKM(e,16448,32)) {if(1){r=m=1;k.KO(0,t," ");}}else if(k.KKM(e,16400,49)) {if(1){r=m=1;k.KO(0,t,"!");}}else if(k.KKM(e,16400,222)) {if(1){r=m=1;k.KO(0,t,"\"");}}else if(k.KKM(e,16400,51)) {if(1){r=m=1;k.KO(0,t,"֨");}}else if(k.KKM(e,16400,52)) {if(1){r=m=1;k.KO(0,t,"֜");}}else if(k.KKM(e,16400,53)) {if(1){r=m=1;k.KO(0,t,"֞");}}else if(k.KKM(e,16400,55)) {if(1){r=m=1;k.KO(0,t,"֬");}}else if(k.KKM(e,16384,222)) {if(1){r=m=1;k.KO(0,t,"'");}}else if(k.KKM(e,16448,222)) {if(1){r=m=1;k.KO(0,t,"ׄ");}}else if(k.KKM(e,16400,57)) {if(1){r=m=1;k.KO(0,t,"(");}}else if(k.KKM(e,16400,48)) {if(1){r=m=1;k.KO(0,t,")");}}else if(k.KKM(e,16400,56)) {if(1){r=m=1;k.KO(0,t,"֝");}}else if(k.KKM(e,16400,187)) {if(1){r=m=1;k.KO(0,t,"+");}}else if(k.KKM(e,16448,188)) {if(1){r=m=1;k.KO(0,t,"֫");}}else if(k.KKM(e,16384,188)) {if(1){r=m=1;k.KO(0,t,"א");}}else if(k.KKM(e,16384,189)) {if(1){r=m=1;k.KO(0,t,"־");}}else if(k.KKM(e,16448,189)) {if(1){r=m=1;k.KO(0,t,"ֿ");}}else if(k.KKM(e,16384,190)) {if(1){r=m=1;k.KO(0,t,".");}}else if(k.KKM(e,16448,190)) {if(1){r=m=1;k.KO(0,t,"̈");}}else if(k.KKM(e,16384,191)) {if(1){r=m=1;k.KO(0,t,"/");}}else if(k.KKM(e,16448,191)) {if(1){r=m=1;k.KO(0,t,"״");}}else if(k.KKM(e,16384,48)) {if(1){r=m=1;k.KO(0,t,"0");}}else if(k.KKM(e,16448,48)) {if(1){r=m=1;k.KO(0,t,"֯");}}else if(k.KKM(e,16384,49)) {if(1){r=m=1;k.KO(0,t,"1");}}else if(k.KKM(e,16448,49)) {if(1){r=m=1;k.KO(0,t,"֗");}}else if(k.KKM(e,16384,50)) {if(1){r=m=1;k.KO(0,t,"2");}}else if(k.KKM(e,16448,50)) {if(1){r=m=1;k.KO(0,t,"֮");}}else if(k.KKM(e,16384,51)) {if(1){r=m=1;k.KO(0,t,"3");}}else if(k.KKM(e,16448,51)) {if(1){r=m=1;k.KO(0,t,"֙");}}else if(k.KKM(e,16384,52)) {if(1){r=m=1;k.KO(0,t,"4");}}else if(k.KKM(e,16448,52)) {if(1){r=m=1;k.KO(0,t,"֠");}}else if(k.KKM(e,16384,53)) {if(1){r=m=1;k.KO(0,t,"5");}}else if(k.KKM(e,16448,53)) {if(1){r=m=1;k.KO(0,t,"֩");}}else if(k.KKM(e,16384,54)) {if(1){r=m=1;k.KO(0,t,"6");}}else if(k.KKM(e,16448,54)) {if(1){r=m=1;k.KO(0,t,"֟");}}else if(k.KKM(e,16384,55)) {if(1){r=m=1;k.KO(0,t,"7");}}else if(k.KKM(e,16448,55)) {if(1){r=m=1;k.KO(0,t,"֡");}}else if(k.KKM(e,16384,56)) {if(1){r=m=1;k.KO(0,t,"8");}}else if(k.KKM(e,16448,56)) {if(1){r=m=1;k.KO(0,t,"֕");}}else if(k.KKM(e,16384,57)) {if(1){r=m=1;k.KO(0,t,"9");}}else if(k.KKM(e,16448,57)) {if(1){r=m=1;k.KO(0,t,"֓");}}else if(k.KKM(e,16400,186)) {if(1){r=m=1;k.KO(0,t,"״");}}else if(k.KKM(e,16448,186)) {if(1){r=m=1;k.KO(0,t,"׃");}}else if(k.KKM(e,16384,186)) {if(1){r=m=1;k.KO(0,t,"ְ");}}else if(k.KKM(e,16400,188)) {if(1){r=m=1;}}else if(k.KKM(e,16384,187)) {if(1){r=m=1;k.KO(0,t,"=");}}else if(k.KKM(e,16448,187)) {if(1){r=m=1;k.KO(0,t,"◌");}}else if(k.KKM(e,16400,190)) {if(1){r=m=1;k.KO(0,t,"ּ");}}else if(k.KKM(e,16400,191)) {if(1){r=m=1;k.KO(0,t,"?");}}else if(k.KKM(e,16400,50)) {if(1){r=m=1;k.KO(0,t,"֘");}}else if(k.KKM(e,16400,65)) {if(1){r=m=1;k.KO(0,t,"ָ");}}else if(k.KKM(e,16400,66)) {if(1){r=m=1;k.KO(0,t,"בּ");}}else if(k.KKM(e,16400,67)) {if(1){r=m=1;k.KO(0,t,"שּׂ");}}else if(k.KKM(e,16400,68)) {if(1){r=m=1;k.KO(0,t,"דּ");}}else if(k.KKM(e,16400,69)) {if(1){r=m=1;k.KO(0,t,"ֵ");}}else if(k.KKM(e,16400,70)) {if(1){r=m=1;k.KO(0,t,"טּ");}}else if(k.KKM(e,16400,71)) {if(1){r=m=1;k.KO(0,t,"גּ");}}else if(k.KKM(e,16400,72)) {if(1){r=m=1;k.KO(0,t,"הּ");}}else if(k.KKM(e,16400,73)) {if(1){r=m=1;}}else if(k.KKM(e,16400,74)) {if(1){r=m=1;k.KO(0,t,"וַיּ");}}else if(k.KKM(e,16400,75)) {if(1){r=m=1;k.KO(0,t,"כּ");}}else if(k.KKM(e,16400,76)) {if(1){r=m=1;k.KO(0,t,"לּ");}}else if(k.KKM(e,16400,77)) {if(1){r=m=1;k.KO(0,t,"מּ");}}else if(k.KKM(e,16400,78)) {if(1){r=m=1;k.KO(0,t,"נּ");}}else if(k.KKM(e,16400,79)) {if(1){r=m=1;k.KO(0,t,"וֹ");}}else if(k.KKM(e,16400,80)) {if(1){r=m=1;k.KO(0,t,"פּ");}}else if(k.KKM(e,16400,81)) {if(1){r=m=1;k.KO(0,t,"קּ");}}else if(k.KKM(e,16400,82)) {if(1){r=m=1;k.KO(0,t,"רּ");}}else if(k.KKM(e,16400,83)) {if(1){r=m=1;k.KO(0,t,"סּ");}}else if(k.KKM(e,16400,84)) {if(1){r=m=1;k.KO(0,t,"תּ");}}else if(k.KKM(e,16400,85)) {if(1){r=m=1;k.KO(0,t,"ֻ");}}else if(k.KKM(e,16400,86)) {if(1){r=m=1;k.KO(0,t,"שּׁ");}}else if(k.KKM(e,16400,87)) {if(1){r=m=1;k.KO(0,t,"וּ");}}else if(k.KKM(e,16400,88)) {if(1){r=m=1;k.KO(0,t,"צּ");}}else if(k.KKM(e,16400,89)) {if(1){r=m=1;k.KO(0,t,"יּ");}}else if(k.KKM(e,16400,90)) {if(1){r=m=1;k.KO(0,t,"זּ");}}else if(k.KKM(e,16384,219)) {if(1){r=m=1;k.KO(0,t,"[");}}else if(k.KKM(e,16448,219)) {if(1){r=m=1;k.KO(0,t,"֔");}}else if(k.KKM(e,16384,220)) {if(1){r=m=1;k.KO(0,t,"\\");}}else if(k.KKM(e,16448,220)) {if(1){r=m=1;k.KO(0,t,"֫");}}else if(k.KKM(e,16384,221)) {if(1){r=m=1;k.KO(0,t,"]");}}else if(k.KKM(e,16448,221)) {if(1){r=m=1;k.KO(0,t,"֒");}}else if(k.KKM(e,16400,54)) {if(1){r=m=1;k.KO(0,t,"֔");}}else if(k.KKM(e,16400,189)) {if(1){r=m=1;k.KO(0,t,"_");}}else if(k.KKM(e,16448,192)) {if(1){r=m=1;}}else if(k.KKM(e,16384,192)) {if(1){r=m=1;k.KO(0,t,"֑");}}else if(k.KKM(e,16448,65)) {if(1){r=m=1;k.KO(0,t,"ֲ");}}else if(k.KKM(e,16384,65)) {if(1){r=m=1;k.KO(0,t,"ַ");}}else if(k.KKM(e,16448,66)) {if(1){r=m=1;}}else if(k.KKM(e,16384,66)) {if(1){r=m=1;k.KO(0,t,"ב");}}else if(k.KKM(e,16448,67)) {if(1){r=m=1;}}else if(k.KKM(e,16384,67)) {if(1){r=m=1;k.KO(0,t,"שׂ");}}else if(k.KKM(e,16448,68)) {if(1){r=m=1;}}else if(k.KKM(e,16384,68)) {if(1){r=m=1;k.KO(0,t,"ד");}}else if(k.KKM(e,16448,69)) {if(1){r=m=1;k.KO(0,t,"ֱ");}}if(m) {}else if(k.KKM(e,16384,69)) {if(1){r=m=1;k.KO(0,t,"ֶ");}}else if(k.KKM(e,16448,70)) {if(1){r=m=1;}}else if(k.KKM(e,16384,70)) {if(1){r=m=1;k.KO(0,t,"ט");}}else if(k.KKM(e,16448,71)) {if(1){r=m=1;k.KO(0,t,"•");}}else if(k.KKM(e,16384,71)) {if(1){r=m=1;k.KO(0,t,"ג");}}else if(k.KKM(e,16448,72)) {if(1){r=m=1;k.KO(0,t,"̊");}}else if(k.KKM(e,16384,72)) {if(1){r=m=1;k.KO(0,t,"ה");}}else if(k.KKM(e,16448,73)) {if(1){r=m=1;k.KO(0,t,"ֽ");}}else if(k.KKM(e,16384,73)) {if(1){r=m=1;k.KO(0,t,"ִ");}}else if(k.KKM(e,16448,74)) {if(1){r=m=1;}}else if(k.KKM(e,16384,74)) {if(1){r=m=1;k.KO(0,t,"ח");}}else if(k.KKM(e,16448,75)) {if(1){r=m=1;k.KO(0,t,"ך");}}else if(k.KKM(e,16384,75)) {if(1){r=m=1;k.KO(0,t,"כ");}}else if(k.KKM(e,16448,76)) {if(1){r=m=1;}}else if(k.KKM(e,16384,76)) {if(1){r=m=1;k.KO(0,t,"ל");}}else if(k.KKM(e,16448,77)) {if(1){r=m=1;k.KO(0,t,"ם");}}else if(k.KKM(e,16384,77)) {if(1){r=m=1;k.KO(0,t,"מ");}}else if(k.KKM(e,16448,78)) {if(1){r=m=1;k.KO(0,t,"ן");}}else if(k.KKM(e,16384,78)) {if(1){r=m=1;k.KO(0,t,"נ");}}else if(k.KKM(e,16448,79)) {if(1){r=m=1;k.KO(0,t,"ֳ");}}else if(k.KKM(e,16384,79)) {if(1){r=m=1;k.KO(0,t,"ֹ");}}else if(k.KKM(e,16448,80)) {if(1){r=m=1;k.KO(0,t,"ף");}}else if(k.KKM(e,16384,80)) {if(1){r=m=1;k.KO(0,t,"פ");}}else if(k.KKM(e,16448,81)) {if(1){r=m=1;}}else if(k.KKM(e,16384,81)) {if(1){r=m=1;k.KO(0,t,"ק");}}else if(k.KKM(e,16448,82)) {if(1){r=m=1;}}else if(k.KKM(e,16384,82)) {if(1){r=m=1;k.KO(0,t,"ר");}}else if(k.KKM(e,16448,83)) {if(1){r=m=1;}}else if(k.KKM(e,16384,83)) {if(1){r=m=1;k.KO(0,t,"ס");}}else if(k.KKM(e,16448,84)) {if(1){r=m=1;}}else if(k.KKM(e,16384,84)) {if(1){r=m=1;k.KO(0,t,"ת");}}else if(k.KKM(e,16448,85)) {if(1){r=m=1;}}else if(k.KKM(e,16384,85)) {if(1){r=m=1;k.KO(0,t,"ע");}}else if(k.KKM(e,16448,86)) {if(1){r=m=1;}}else if(k.KKM(e,16384,86)) {if(1){r=m=1;k.KO(0,t,"שׁ");}}else if(k.KKM(e,16448,87)) {if(1){r=m=1;}}else if(k.KKM(e,16384,87)) {if(1){r=m=1;k.KO(0,t,"ו");}}else if(k.KKM(e,16448,88)) {if(1){r=m=1;k.KO(0,t,"ץ");}}else if(k.KKM(e,16384,88)) {if(1){r=m=1;k.KO(0,t,"צ");}}else if(k.KKM(e,16448,89)) {if(1){r=m=1;}}else if(k.KKM(e,16384,89)) {if(1){r=m=1;k.KO(0,t,"י");}}else if(k.KKM(e,16448,90)) {if(1){r=m=1;}}else if(k.KKM(e,16384,90)) {if(1){r=m=1;k.KO(0,t,"ז");}}else if(k.KKM(e,16400,219)) {if(1){r=m=1;k.KO(0,t,"{");}}else if(k.KKM(e,16400,220)) {if(1){r=m=1;k.KO(0,t,"|");}}else if(k.KKM(e,16400,221)) {if(1){r=m=1;k.KO(0,t,"}");}}else if(k.KKM(e,16400,192)) {if(1){r=m=1;}}return r;};} \ No newline at end of file diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.keyboard_info b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.keyboard_info new file mode 100644 index 0000000000..e96344dbbb --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.keyboard_info @@ -0,0 +1,40 @@ +{ + "id": "alephwithbeth", + "name": "Aleph With Beth", + "license": "mit", + "isRTL": true, + "authorName": "Cameron Briggs", + "description": "

alephwithbeth keyboard

", + "languages": { + "he": { + "examples": [], + "languageName": "Hebrew", + "displayName": "Hebrew" + } + }, + "lastModifiedDate": "2025-01-27T23:04:56.765Z", + "packageFilename": "alephwithbeth.kmp", + "packageFileSize": 244476, + "jsFilename": "alephwithbeth.js", + "jsFileSize": 23534, + "packageIncludes": [ + "documentation", + "welcome", + "visualKeyboard" + ], + "version": "1.0.6", + "encodings": [ + "unicode" + ], + "platformSupport": { + "windows": "full", + "macos": "full", + "linux": "full", + "desktopWeb": "full", + "ios": "full", + "android": "full", + "mobileWeb": "full" + }, + "minKeymanVersion": "14.0", + "helpLink": "https://help.keyman.com/keyboard/alephwithbeth" +} \ No newline at end of file diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kmp b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kmp new file mode 100644 index 0000000000000000000000000000000000000000..540f4ca3ecb4d5f9af20dd0980250f5f48ad4da4 GIT binary patch literal 244476 zcmZs>Qgc-S)>>f$3 z6IGNpOgUHFR*u4fU%l#bv8kge+)V1ZokG+Pd0;5>fV`}ldw+V0?P_C3#|jHc>EYzv z8#Kk%08n6I05L0{E@fRzC_*U;F=<59s=krIloWhsVpbZ)yf%VT+%HV&>OU^nPVUrqi1MK03UYoxt( z1_t?D!$KKk!3&r4a+V;L%KhmJxLvBrH>9aZ@aEQNlN(Y>+ zqI!y`>v%!?+~gHeNcn#NufVdCQu!b7mEa&CaQ^}CY4O|4@&6(puV&!5!i?-EbtptH zDNXDwfSQhEkeaHy4?|Ad27Q0d?c1a=(f+T`kZd&2>R}N%X+H;xj*pM6MyJOMcrg8O zb(={fqGs2TNQChPquE`Kem<%!qVoWw+$xQlmcc@jZmQJtm#;|}@Vg1U0}^RS3bnA8 z%x&A7nd72)T(885)q8YuJ~xX15-;C~v#of(@QK=^=!$~ntUV0*;B*BqxDe1^F%Em}>Nw(PU3leKIfmN4%^kKeAf+Ds(f*qm!u)G6Y0i0&;r~ z2uhKtEYwx0-un0FK)m6H@N)zYxC1OC><9`X!Kp3*L1`v0zqo+pWv~rbzl;Hp|7p;r zdbVXNco2{qJrEG&{|svK+rr7()5gu()WXf0(bn}^Ur!BP2J@Rv8)>ObVe9XXFu00c zP$=CpF>EDYEX1NM2>~ac7nr%`OCMSkjp~tAYr^U(H#QbeOiJH>lXYTARtol|-* z6INMYn&brcU-$S%{vMGPFSgil@O8Gca!oyv=fK%{ljpT#k5toSU&S$?U5hGxkGz&J z^I&CDVdl-1L?HWJn_AE*JqAu&uj(8h)1qFh+(aLn^eO)qKkZoZN&DkF@J^Oa$5eGH zr{uIm7YH03NPc~B`5WkU0;9t?Bu$!?rly20g`E&EtdznsW__m!&^bioBcM00o&QqAz)JT#kB#_CV2;im& z&-gS2#!fSl3~0W!{b?`=ka=^TWRi_nJ>qnn>$^n=cU$4fEZ_APAETgkNDhf0w=TRP z(21LJjDzgb%5Kyu9grErp|vL1Syo@T?82(-6b z!BbyIa0<+j5D&-=Iit#}`%Nn{c?g5SPAp;{6{)UY5yDH~yQtPMrbfH_=P(iOr`BGV zzX7wiD5O2ocZ=Fl9kHY3hXS5-7|f!^7h6B$2z{f ztK;7Gbl9^qKaGHP0MWS&=<@HzPp}VJW`4#TOSG%&H|IYXQTw`boNU?ou!ufp z)a*Y>SmiV;;-||SJXTJk?e-B5&*$1+f&dt$jgr|ifen0zXMpZ^&p^_AMxZ^-SIV

kPgvJCeYJo;@J-C-8Rh3a2F=%piCd2c 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®7ym{CB5*~x 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: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ô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 z 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 z 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 QB3SCDg5?`OtpV)+0G`BPG5`Po literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kmx b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kmx new file mode 100644 index 0000000000000000000000000000000000000000..27579d2002b0d614022f4689a16692b33258d8e1 GIT binary patch literal 7160 zcmd6reQZ`|8OEPh9_)~hidb0k$2Kj$tjOvRV+4b$}I-VTX({XgWlONDLv% zB*d_eF*aGp5V5eXLqvwG6f()O5JC`HMLs%YbuP`a5JJd83H5j1=Y8n?p0yP9pFMEh z@BO>ZbSqZ;@{!59zgnm$>ucV*os@+5GLAR7z=`!8V+{5$> z=qBSl?jB{?VyFaKh8DRcu8PlUJmG5h7;7xiOs*?%qg)Qkbz|Ka?H%lrw&iq-kK;~Y zYY(wCnQi8cd5iI646EkD2x6nMc^eN64J+{Kqu7)cojCz_B#LXCuBCf*Ea#x{##v2ZgLpE0i&xz$0!>ePt8n`x=tAqE% za!v5@Sgr-W7|UIU(+4K+-%vOQ+5Ibor^j-0;ia+MYIt2Nw*jt=<+j7SV!3_r8?oFG zxH*<O@`|+!x(#y#DY&G}?HB z;K68&@otBQqOr!ygtJhXL-ubtoNYYWzY%Z_y2q@W2j`1#yaISUDllFlT#Q~fUI|=^ z8WWz(Q3g*np6tssxEviwEW@E#Pd1KHkQc)#%^*9ad%^7PbE#Jvl@X*|ij1s_G>8j|fDgHISw zawp+aC|n1UI}NuOPjctsRurx)$-M`+8BcN_z!%Ye7Y(^TF2PrfC%KQ{YsQo9U58Wo zZ&A3`WZhnH9~7=h$@PWPjVIe12xp*hUCFwG;UOqoL*fmEhoL+d4e_$zJJAH=Wy7OT zvGH=?(P*Oa^5Jo)#CYT3BJ?fe6~mK6#w&%Vp!Cjw+4O^O*7tF_}A!r##;|>K+}!45q=)s zZ@kU$7F2G$t?+jAfbr_!dNjj$4e)L>(|CK}eQ1{P_QOr+`^Gy2A4V0%dlNo_&Llj! z){er*jVIUI3Ah=ZHMvv5#*NHxwR*!gVjXEI8YEk{bc% zpl~lpE)Om+p5(^Cg(%z~k}Hyo@gz41E<@p-k=zt`y744e4$ng2K9XDoJjZyFn+sQ> zaBoR&KD^L)l3N5

V%Rt{PruJjpGGSE6taN^TXr#(0u@0$z*4eJQzh@OtA(t_I$S z!o4cFO>nL8B)0|LhQj?Tx$W>y<4LX_-i5+FExFzBUgJq_AKZw-eJ;5s_zmMp?lAlo z3irO`j=;x^C%NPBNfe$3l52*~8c%X9@C6i}5t3_#+l(i<58#U^JU1kF3I515aJjrFix1$*nVn}WXJj{5K%YyGjGbO~3TsE9z zJjvz3`6xV_Bv$~BH=g7Q;bIh?SCT7%%Zw+vDeyEDo?()k4$m^4_js~p1d>5ad+k2>iG`Gb@Ou>&6n2Yl@gZOGxGm` zqqp+y#E(0Z@58x|*DtF-Oluv#vG7KqwN`7r*01VP`2~h&g!W(4`hq%lY5%hJ$F(+T zJ*ah*E=`lK(0yI|%j!q(Inggtypm+aR1n%1!7uSs;5&JvdWO_%*a>)xc? zDWzeVGRX<;`{>y}sr>=1d$fja{axv_)-y><&MKYL+M@Lxt>?A=QR|%1%1&w{@BPuF1P&Qtlr~)U5P#iMf?pf1x$(oBZ0B;?mPI)m^|P z$Upjecct?wZc5^Abdhl_)m&D_e!32$@?YC;$BxAwqcib<=N%7kIxgxXs2Htn*W`mk=8H+=TAURWO14=kUzx{dDE g?aH^?4}E-|uwM8Kx$Zu@TEDyOC&drP_P>7q2hz=VasU7T literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kvk b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/build/alephwithbeth.kvk new file mode 100644 index 0000000000000000000000000000000000000000..7772d84d9e3d4d071d0146ff51a75ba9d1236b62 GIT binary patch literal 1921 zcmZwHM{87J7>423aU#Kmzd-|Hi6xUV$zYAfNzB+wG!{fbP;en42$mmVLj~(jQS2Hu zP0*zaTWl%zg6r&DjL(yC=FY-wCf9kt^D*B!H`{VA;05f+OxVUt(` zmx%YcH!C(UZ5FFxi&zU=BN=^V9c39V<+NfBTqe$i%fHwAbkjA^P1iy5Uh8e8FG@hDq4@eb(3UqB~bS$ruGPW%;9Cw?C~@psUPzl2WwHC!s* zg{|US=-T_CYaf8FeF(btPtdhLgs%M?bnQQ(YySmZ`)BCde?!;)1-ka>JRH~F$JDj| zfUf;LbnS1T^X`HEfvYOMvgAm>Pm9xJIN+<$_x3{fTt2pNb0Qh;x%Bgw)UJuR!D8oq z3OeuW(0QMM&if*C-dCXWz5t!~CFs0QLg#%PI`1dYc|V(6I)d{q{S+j_d5=22^FGGC v?)f%!qPL)%te9BZ*-eh;S-Ht>7CXWZ(A5n>SN9RRx;xO-eT9zU`#=5#snenj literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.ico b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.ico new file mode 100644 index 0000000000000000000000000000000000000000..84b57c5aebc31098a75ea11ed69a4c62add2fc1a GIT binary patch literal 1150 zcmd6iOAdrE3`2u72k445%Q+hNzd%Wmo@7~#_^c>Oo!D_wB9{DG+hUyk7qKS(Gg`)$ zv7C1%srl)>$5%q%=5HFBbF-Qms?9jnHTOMuomUSzz0?Ca%2m1Vc;fY4cztHITY0?9 oRP8Fq%UHq)$ literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.keyman-touch-layout b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.keyman-touch-layout new file mode 100644 index 0000000000..05db57c7f9 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.keyman-touch-layout @@ -0,0 +1,1646 @@ +{ + "tablet": { + "displayUnderlying": false, + "layer": [ + { + "id": "default", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_1", + "text": "1" + }, + { + "id": "K_2", + "text": "2" + }, + { + "id": "K_3", + "text": "3" + }, + { + "id": "K_4", + "text": "4" + }, + { + "id": "K_5", + "text": "5" + }, + { + "id": "K_6", + "text": "6" + }, + { + "id": "K_7", + "text": "7" + }, + { + "id": "K_8", + "text": "8" + }, + { + "id": "K_9", + "text": "9" + }, + { + "id": "K_0", + "text": "0" + }, + { + "id": "K_HYPHEN", + "text": "־" + }, + { + "id": "K_EQUAL", + "text": "=" + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "100", + "sp": "1" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_Q", + "text": "ק", + "pad": "75" + }, + { + "id": "K_W", + "text": "ו" + }, + { + "id": "K_E", + "text": "ֶ" + }, + { + "id": "K_R", + "text": "ר" + }, + { + "id": "K_T", + "text": "ת" + }, + { + "id": "K_Y", + "text": "י" + }, + { + "id": "K_U", + "text": "ע" + }, + { + "id": "K_I", + "text": "ִ" + }, + { + "id": "K_O", + "text": "ֹ" + }, + { + "id": "K_P", + "text": "פ" + }, + { + "id": "K_LBRKT", + "text": "[" + }, + { + "id": "K_RBRKT", + "text": "]" + }, + { + "id": "T_new_138", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_BKQUOTE", + "text": "֑" + }, + { + "id": "K_A", + "text": "ַ" + }, + { + "id": "K_S", + "text": "ס" + }, + { + "id": "K_D", + "text": "ד" + }, + { + "id": "K_F", + "text": "ט" + }, + { + "id": "K_G", + "text": "ג" + }, + { + "id": "K_H", + "text": "ה" + }, + { + "id": "K_J", + "text": "ח" + }, + { + "id": "K_K", + "text": "כ" + }, + { + "id": "K_L", + "text": "ל" + }, + { + "id": "K_COLON", + "text": "ְ" + }, + { + "id": "K_QUOTE", + "text": "'" + }, + { + "id": "K_BKSLASH", + "text": "\\" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "160", + "sp": "1", + "nextlayer": "shift" + }, + { + "id": "K_oE2", + "text": "" + }, + { + "id": "K_Z", + "text": "ז" + }, + { + "id": "K_X", + "text": "צ" + }, + { + "id": "K_C", + "text": "שׂ" + }, + { + "id": "K_V", + "text": "שׁ" + }, + { + "id": "K_B", + "text": "ב" + }, + { + "id": "K_N", + "text": "נ" + }, + { + "id": "K_M", + "text": "מ" + }, + { + "id": "K_COMMA", + "text": "א" + }, + { + "id": "K_PERIOD", + "text": "." + }, + { + "id": "K_SLASH", + "text": "/" + }, + { + "id": "T_new_164", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 5, + "key": [ + { + "id": "K_LCONTROL", + "text": "alt", + "width": "130", + "sp": "1", + "nextlayer": "alt" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "140", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "930" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "145", + "sp": "1" + } + ] + } + ] + }, + { + "id": "shift", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_1", + "text": "!" + }, + { + "id": "K_2", + "text": "֘" + }, + { + "id": "K_3", + "text": "֨" + }, + { + "id": "K_4", + "text": "֜" + }, + { + "id": "K_5", + "text": "֞" + }, + { + "id": "K_6", + "text": "֔" + }, + { + "id": "K_7", + "text": "֬" + }, + { + "id": "K_8", + "text": "֝" + }, + { + "id": "K_9", + "text": "(" + }, + { + "id": "K_0", + "text": ")" + }, + { + "id": "K_HYPHEN", + "text": "_" + }, + { + "id": "K_EQUAL", + "text": "+" + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "100", + "sp": "1" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_Q", + "text": "קּ", + "pad": "75" + }, + { + "id": "K_W", + "text": "וּ" + }, + { + "id": "K_E", + "text": "ֵ" + }, + { + "id": "K_R", + "text": "רּ" + }, + { + "id": "K_T", + "text": "תּ" + }, + { + "id": "K_Y", + "text": "יּ" + }, + { + "id": "K_U", + "text": "ֻ" + }, + { + "id": "K_I", + "text": "" + }, + { + "id": "K_O", + "text": "וֹ" + }, + { + "id": "K_P", + "text": "פּ" + }, + { + "id": "K_LBRKT", + "text": "{" + }, + { + "id": "K_RBRKT", + "text": "}" + }, + { + "id": "T_new_362", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_BKQUOTE", + "text": "" + }, + { + "id": "K_A", + "text": "ָ" + }, + { + "id": "K_S", + "text": "סּ" + }, + { + "id": "K_D", + "text": "דּ" + }, + { + "id": "K_F", + "text": "טּ" + }, + { + "id": "K_G", + "text": "גּ" + }, + { + "id": "K_H", + "text": "הּ" + }, + { + "id": "K_J", + "text": "וַיּ" + }, + { + "id": "K_K", + "text": "כּ" + }, + { + "id": "K_L", + "text": "לּ" + }, + { + "id": "K_COLON", + "text": "״" + }, + { + "id": "K_QUOTE", + "text": "\"" + }, + { + "id": "K_BKSLASH", + "text": "|" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "160", + "sp": "1", + "nextlayer": "default" + }, + { + "id": "K_oE2", + "text": "" + }, + { + "id": "K_Z", + "text": "זּ" + }, + { + "id": "K_X", + "text": "צּ" + }, + { + "id": "K_C", + "text": "שּׂ" + }, + { + "id": "K_V", + "text": "שּׁ" + }, + { + "id": "K_B", + "text": "בּ" + }, + { + "id": "K_N", + "text": "נּ" + }, + { + "id": "K_M", + "text": "מּ" + }, + { + "id": "K_COMMA", + "text": "" + }, + { + "id": "K_PERIOD", + "text": "ּ" + }, + { + "id": "K_SLASH", + "text": "?" + }, + { + "id": "T_new_388", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 5, + "key": [ + { + "id": "K_LCONTROL", + "text": "alt", + "width": "130", + "sp": "1", + "nextlayer": "alt" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "140", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "930" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "145", + "sp": "1" + } + ] + } + ] + }, + { + "id": "alt", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_1", + "text": "֗" + }, + { + "id": "K_2", + "text": "֮" + }, + { + "id": "K_3", + "text": "֙" + }, + { + "id": "K_4", + "text": "֠" + }, + { + "id": "K_5", + "text": "֩" + }, + { + "id": "K_6", + "text": "֟" + }, + { + "id": "K_7", + "text": "֡" + }, + { + "id": "K_8", + "text": "֕" + }, + { + "id": "K_9", + "text": "֓" + }, + { + "id": "K_0", + "text": "֯" + }, + { + "id": "K_HYPHEN", + "text": "ֿ" + }, + { + "id": "K_EQUAL", + "text": "◌" + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "100", + "sp": "1" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_Q", + "text": "", + "pad": "75" + }, + { + "id": "K_W", + "text": "" + }, + { + "id": "K_E", + "text": "ֱ" + }, + { + "id": "K_R", + "text": "" + }, + { + "id": "K_T", + "text": "" + }, + { + "id": "K_Y", + "text": "" + }, + { + "id": "K_U", + "text": "" + }, + { + "id": "K_I", + "text": "ֽ" + }, + { + "id": "K_O", + "text": "ֳ" + }, + { + "id": "K_P", + "text": "ף" + }, + { + "id": "K_LBRKT", + "text": "֔" + }, + { + "id": "K_RBRKT", + "text": "֒" + }, + { + "id": "T_new_138", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_BKQUOTE", + "text": "" + }, + { + "id": "K_A", + "text": "ֲ" + }, + { + "id": "K_S", + "text": "" + }, + { + "id": "K_D", + "text": "" + }, + { + "id": "K_F", + "text": "" + }, + { + "id": "K_G", + "text": "•" + }, + { + "id": "K_H", + "text": "̊" + }, + { + "id": "K_J", + "text": "" + }, + { + "id": "K_K", + "text": "ך" + }, + { + "id": "K_L", + "text": "" + }, + { + "id": "K_COLON", + "text": "׃" + }, + { + "id": "K_QUOTE", + "text": "ׄ" + }, + { + "id": "K_BKSLASH", + "text": "֫" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "160", + "sp": "1", + "nextlayer": "shift", + "layer": "shift" + }, + { + "id": "K_oE2", + "text": "" + }, + { + "id": "K_Z", + "text": "" + }, + { + "id": "K_X", + "text": "ץ" + }, + { + "id": "K_C", + "text": "" + }, + { + "id": "K_V", + "text": "" + }, + { + "id": "K_B", + "text": "" + }, + { + "id": "K_N", + "text": "ן" + }, + { + "id": "K_M", + "text": "ם" + }, + { + "id": "K_COMMA", + "text": "֫" + }, + { + "id": "K_PERIOD", + "text": "̈" + }, + { + "id": "K_SLASH", + "text": "״" + }, + { + "id": "T_new_164", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 5, + "key": [ + { + "id": "K_LCONTROL", + "text": "default", + "width": "130", + "sp": "1", + "nextlayer": "default" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "140", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "930" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "145", + "sp": "1" + } + ] + } + ] + } + ] + }, + "phone": { + "displayUnderlying": false, + "layer": [ + { + "id": "default", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_1", + "text": "1" + }, + { + "id": "K_2", + "text": "2" + }, + { + "id": "K_3", + "text": "3" + }, + { + "id": "K_4", + "text": "4" + }, + { + "id": "K_5", + "text": "5" + }, + { + "id": "K_6", + "text": "6" + }, + { + "id": "K_7", + "text": "7" + }, + { + "id": "K_8", + "text": "8" + }, + { + "id": "K_9", + "text": "9" + }, + { + "id": "K_0", + "text": "0" + }, + { + "id": "K_HYPHEN", + "text": "־" + }, + { + "id": "K_EQUAL", + "text": "=" + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "100", + "sp": "1" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_Q", + "text": "ק", + "pad": "75" + }, + { + "id": "K_W", + "text": "ו" + }, + { + "id": "K_E", + "text": "ֶ" + }, + { + "id": "K_R", + "text": "ר" + }, + { + "id": "K_T", + "text": "ת" + }, + { + "id": "K_Y", + "text": "י" + }, + { + "id": "K_U", + "text": "ע" + }, + { + "id": "K_I", + "text": "ִ" + }, + { + "id": "K_O", + "text": "ֹ" + }, + { + "id": "K_P", + "text": "פ" + }, + { + "id": "K_LBRKT", + "text": "[" + }, + { + "id": "K_RBRKT", + "text": "]" + }, + { + "id": "T_new_138", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_BKQUOTE", + "text": "֑" + }, + { + "id": "K_A", + "text": "ַ" + }, + { + "id": "K_S", + "text": "ס" + }, + { + "id": "K_D", + "text": "ד" + }, + { + "id": "K_F", + "text": "ט" + }, + { + "id": "K_G", + "text": "ג" + }, + { + "id": "K_H", + "text": "ה" + }, + { + "id": "K_J", + "text": "ח" + }, + { + "id": "K_K", + "text": "כ" + }, + { + "id": "K_L", + "text": "ל" + }, + { + "id": "K_COLON", + "text": "ְ" + }, + { + "id": "K_QUOTE", + "text": "'" + }, + { + "id": "K_BKSLASH", + "text": "\\" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "160", + "sp": "1", + "nextlayer": "shift" + }, + { + "id": "K_oE2", + "text": "" + }, + { + "id": "K_Z", + "text": "ז" + }, + { + "id": "K_X", + "text": "צ" + }, + { + "id": "K_C", + "text": "שׂ" + }, + { + "id": "K_V", + "text": "שׁ" + }, + { + "id": "K_B", + "text": "ב" + }, + { + "id": "K_N", + "text": "נ" + }, + { + "id": "K_M", + "text": "מ" + }, + { + "id": "K_COMMA", + "text": "א" + }, + { + "id": "K_PERIOD", + "text": "." + }, + { + "id": "K_SLASH", + "text": "/" + }, + { + "id": "T_new_164", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 5, + "key": [ + { + "id": "K_LCONTROL", + "text": "alt", + "width": "130", + "sp": "1", + "nextlayer": "alt" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "140", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "930" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "145", + "sp": "1" + } + ] + } + ] + }, + { + "id": "shift", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_1", + "text": "!" + }, + { + "id": "K_2", + "text": "֘" + }, + { + "id": "K_3", + "text": "֨" + }, + { + "id": "K_4", + "text": "֜" + }, + { + "id": "K_5", + "text": "֞" + }, + { + "id": "K_6", + "text": "֔" + }, + { + "id": "K_7", + "text": "֬" + }, + { + "id": "K_8", + "text": "֝" + }, + { + "id": "K_9", + "text": "(" + }, + { + "id": "K_0", + "text": ")" + }, + { + "id": "K_HYPHEN", + "text": "_" + }, + { + "id": "K_EQUAL", + "text": "+" + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "100", + "sp": "1" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_Q", + "text": "קּ", + "pad": "75" + }, + { + "id": "K_W", + "text": "וּ" + }, + { + "id": "K_E", + "text": "ֵ" + }, + { + "id": "K_R", + "text": "רּ" + }, + { + "id": "K_T", + "text": "תּ" + }, + { + "id": "K_Y", + "text": "יּ" + }, + { + "id": "K_U", + "text": "ֻ" + }, + { + "id": "K_I", + "text": "" + }, + { + "id": "K_O", + "text": "וֹ" + }, + { + "id": "K_P", + "text": "פּ" + }, + { + "id": "K_LBRKT", + "text": "{" + }, + { + "id": "K_RBRKT", + "text": "}" + }, + { + "id": "T_new_362", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_BKQUOTE", + "text": "" + }, + { + "id": "K_A", + "text": "ָ" + }, + { + "id": "K_S", + "text": "סּ" + }, + { + "id": "K_D", + "text": "דּ" + }, + { + "id": "K_F", + "text": "טּ" + }, + { + "id": "K_G", + "text": "גּ" + }, + { + "id": "K_H", + "text": "הּ" + }, + { + "id": "K_J", + "text": "וַיּ" + }, + { + "id": "K_K", + "text": "כּ" + }, + { + "id": "K_L", + "text": "לּ" + }, + { + "id": "K_COLON", + "text": "״" + }, + { + "id": "K_QUOTE", + "text": "\"" + }, + { + "id": "K_BKSLASH", + "text": "|" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "160", + "sp": "1", + "nextlayer": "default" + }, + { + "id": "K_oE2", + "text": "" + }, + { + "id": "K_Z", + "text": "זּ" + }, + { + "id": "K_X", + "text": "צּ" + }, + { + "id": "K_C", + "text": "שּׂ" + }, + { + "id": "K_V", + "text": "שּׁ" + }, + { + "id": "K_B", + "text": "בּ" + }, + { + "id": "K_N", + "text": "נּ" + }, + { + "id": "K_M", + "text": "מּ" + }, + { + "id": "K_COMMA", + "text": "" + }, + { + "id": "K_PERIOD", + "text": "ּ" + }, + { + "id": "K_SLASH", + "text": "?" + }, + { + "id": "T_new_388", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 5, + "key": [ + { + "id": "K_LCONTROL", + "text": "alt", + "width": "130", + "sp": "1", + "nextlayer": "alt" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "140", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "930" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "145", + "sp": "1" + } + ] + } + ] + }, + { + "id": "alt", + "row": [ + { + "id": 1, + "key": [ + { + "id": "K_1", + "text": "֗" + }, + { + "id": "K_2", + "text": "֮" + }, + { + "id": "K_3", + "text": "֙" + }, + { + "id": "K_4", + "text": "֠" + }, + { + "id": "K_5", + "text": "֩" + }, + { + "id": "K_6", + "text": "֟" + }, + { + "id": "K_7", + "text": "֡" + }, + { + "id": "K_8", + "text": "֕" + }, + { + "id": "K_9", + "text": "֓" + }, + { + "id": "K_0", + "text": "֯" + }, + { + "id": "K_HYPHEN", + "text": "ֿ" + }, + { + "id": "K_EQUAL", + "text": "◌" + }, + { + "id": "K_BKSP", + "text": "*BkSp*", + "width": "100", + "sp": "1" + } + ] + }, + { + "id": 2, + "key": [ + { + "id": "K_Q", + "text": "", + "pad": "75" + }, + { + "id": "K_W", + "text": "" + }, + { + "id": "K_E", + "text": "ֱ" + }, + { + "id": "K_R", + "text": "" + }, + { + "id": "K_T", + "text": "" + }, + { + "id": "K_Y", + "text": "" + }, + { + "id": "K_U", + "text": "" + }, + { + "id": "K_I", + "text": "ֽ" + }, + { + "id": "K_O", + "text": "ֳ" + }, + { + "id": "K_P", + "text": "ף" + }, + { + "id": "K_LBRKT", + "text": "֔" + }, + { + "id": "K_RBRKT", + "text": "֒" + }, + { + "id": "T_new_138", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 3, + "key": [ + { + "id": "K_BKQUOTE", + "text": "" + }, + { + "id": "K_A", + "text": "ֲ" + }, + { + "id": "K_S", + "text": "" + }, + { + "id": "K_D", + "text": "" + }, + { + "id": "K_F", + "text": "" + }, + { + "id": "K_G", + "text": "•" + }, + { + "id": "K_H", + "text": "̊" + }, + { + "id": "K_J", + "text": "" + }, + { + "id": "K_K", + "text": "ך" + }, + { + "id": "K_L", + "text": "" + }, + { + "id": "K_COLON", + "text": "׃" + }, + { + "id": "K_QUOTE", + "text": "ׄ" + }, + { + "id": "K_BKSLASH", + "text": "֫" + } + ] + }, + { + "id": 4, + "key": [ + { + "id": "K_SHIFT", + "text": "*Shift*", + "width": "160", + "sp": "1", + "nextlayer": "shift", + "layer": "shift" + }, + { + "id": "K_oE2", + "text": "" + }, + { + "id": "K_Z", + "text": "" + }, + { + "id": "K_X", + "text": "ץ" + }, + { + "id": "K_C", + "text": "" + }, + { + "id": "K_V", + "text": "" + }, + { + "id": "K_B", + "text": "" + }, + { + "id": "K_N", + "text": "ן" + }, + { + "id": "K_M", + "text": "ם" + }, + { + "id": "K_COMMA", + "text": "֫" + }, + { + "id": "K_PERIOD", + "text": "̈" + }, + { + "id": "K_SLASH", + "text": "״" + }, + { + "id": "T_new_164", + "text": "", + "width": "10", + "sp": "10" + } + ] + }, + { + "id": 5, + "key": [ + { + "id": "K_LCONTROL", + "text": "default", + "width": "130", + "sp": "1", + "nextlayer": "default" + }, + { + "id": "K_LOPT", + "text": "*Menu*", + "width": "140", + "sp": "1" + }, + { + "id": "K_SPACE", + "text": "", + "width": "930" + }, + { + "id": "K_ENTER", + "text": "*Enter*", + "width": "145", + "sp": "1" + } + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kmn b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kmn new file mode 100644 index 0000000000..d4a2b9a993 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kmn @@ -0,0 +1,215 @@ +store(&TARGETS) 'any' +store(&NAME) 'Aleph With Beth' +store(&BITMAP) 'alephwithbeth.ico' +store(&VISUALKEYBOARD) 'alephwithbeth.kvks' + +store(letters-with-final-forms) "כמנפצ" +store(sofit-forms-of-letters) "ךםןףץ" +store(presentation-dageshed-letters-with-final-forms) "כּפּ" +store(presentation-dageshed-sofit-forms-of-letters) "ךּףּ" +store(dagesh) 'ּ' +c store(vowels) "ְֱֲֳִֵֶַׇׇָֹֻׅ" + +store(normal-dageshed-letters-with-final-forms) "מּנּצּ" +store(normal-undageshed-sofit-forms-of-letters) "םןץ" + +store(punctuation) U+0591 .. U+05AF U+05BD .. U+05BF U+05C0 U+05C4 +store(whitespace) [K_SPACE] [K_ENTER] [K_TAB] + +store(&KMW_RTL) '1' +store(&LAYOUTFILE) 'alephwithbeth.keyman-touch-layout' +store(©RIGHT) '© Cameron Briggs' +store(&KEYBOARDVERSION) '1.0.6' +store(&KMW_HELPTEXT) 'Aleph With Beth' + +begin Unicode > use(main) + +group(main) using keys ++ [SHIFT K_I] > nul ++ [ALT K_BKQUOTE] > nul ++ [ALT K_B] > nul ++ [ALT K_V] > nul ++ [ALT K_C] > nul ++ [ALT K_Z] > nul ++ [ALT K_L] > nul ++ [ALT K_J] > nul ++ [ALT K_F] > nul ++ [ALT K_D] > nul ++ [ALT K_S] > nul ++ [ALT K_U] > nul ++ [ALT K_Y] > nul ++ [ALT K_T] > nul ++ [ALT K_R] > nul ++ [ALT K_W] > nul ++ [ALT K_Q] > nul ++ [SHIFT K_BKSLASH] > '|' ++ [SHIFT K_EQUAL] > '+' ++ [SHIFT K_HYPHEN] > '_' ++ [SHIFT K_0] > ')' ++ [SHIFT K_9] > '(' ++ [SHIFT K_SLASH] > '?' ++ [SHIFT K_QUOTE] > '"' ++ [SHIFT K_BKQUOTE] > nul ++ [K_EQUAL] > '=' ++ [K_HYPHEN] > '־' ++ [K_0] > '0' ++ [K_9] > '9' ++ [K_8] > '8' ++ [K_7] > '7' ++ [K_6] > '6' ++ [K_5] > '5' ++ [K_4] > '4' ++ [K_3] > '3' ++ [K_2] > '2' ++ [K_1] > '1' ++ [K_PERIOD] > '.' ++ [K_SLASH] > '/' ++ [K_QUOTE] > U+0027 ++ [SHIFT K_COLON] > '״' ++ [ALT K_A] > 'ֲ' ++ [SHIFT K_RBRKT] > '}' ++ [SHIFT K_LBRKT] > '{' ++ [K_BKSLASH] > '\' ++ [K_RBRKT] > ']' ++ [K_LBRKT] > '[' ++ [SHIFT K_R] > 'רּ' ++ [SHIFT CTRL K_SPACE] > ' ' ++ [SHIFT K_SPACE] > ' ' ++ [K_SPACE] > ' ' ++ [ALT K_SPACE] > ' ' ++ [SHIFT K_8] > '֝' ++ [SHIFT K_7] > '֬' ++ [SHIFT K_6] > '֔' ++ [SHIFT K_5] > '֞' ++ [SHIFT K_4] > '֜' ++ [SHIFT K_3] > '֨' ++ [SHIFT K_2] > '֘' ++ [SHIFT K_1] > '!' ++ [ALT K_SLASH] > '״' ++ [ALT K_PERIOD] > '̈' ++ [ALT K_COMMA] > '֫' ++ [ALT K_QUOTE] > 'ׄ' ++ [ALT K_COLON] > '׃' ++ [ALT K_H] > '̊' ++ [ALT K_G] > '•' ++ [ALT K_BKSLASH] > '֫' ++ [ALT K_RBRKT] > '֒' ++ [ALT K_LBRKT] > '֔' ++ [ALT K_I] > 'ֽ' ++ [ALT K_O] > 'ֳ' ++ [ALT K_E] > 'ֱ' ++ [ALT K_EQUAL] > '◌' ++ [ALT K_HYPHEN] > 'ֿ' ++ [ALT K_0] > '֯' ++ [ALT K_9] > '֓' ++ [ALT K_8] > '֕' ++ [ALT K_7] > '֡' ++ [ALT K_6] > '֟' ++ [ALT K_5] > '֩' ++ [ALT K_4] > '֠' ++ [ALT K_3] > '֙' ++ [ALT K_2] > '֮' ++ [ALT K_1] > '֗' ++ [ALT K_N] > 'ן' ++ [ALT K_P] > 'ף' ++ [ALT K_K] > 'ך' ++ [ALT K_M] > 'ם' ++ [ALT K_X] > 'ץ' ++ [SHIFT K_PERIOD] > 'ּ' ++ [SHIFT K_COMMA] > nul ++ [SHIFT K_M] > 'מּ' ++ [SHIFT K_N] > 'נּ' ++ [SHIFT K_B] > 'בּ' ++ [SHIFT K_V] > 'שּׁ' ++ [SHIFT K_C] > 'שּׂ' ++ [SHIFT K_X] > 'צּ' ++ [SHIFT K_Z] > 'זּ' ++ [SHIFT K_L] > 'לּ' ++ [SHIFT K_K] > 'כּ' ++ [SHIFT K_J] > 'וַיּ' ++ [SHIFT K_H] > 'הּ' ++ [SHIFT K_G] > 'גּ' ++ [SHIFT K_F] > 'טּ' ++ [SHIFT K_D] > 'דּ' ++ [SHIFT K_S] > 'סּ' ++ [SHIFT K_A] > 'ָ' ++ [SHIFT K_P] > 'פּ' ++ [SHIFT K_O] > 'וֹ' ++ [SHIFT K_U] > 'ֻ' ++ [SHIFT K_Y] > 'יּ' ++ [SHIFT K_T] > 'תּ' ++ [SHIFT K_E] > 'ֵ' ++ [SHIFT K_W] > 'וּ' ++ [SHIFT K_Q] > 'קּ' ++ [K_BKQUOTE] > '֑' ++ [K_COMMA] > 'א' ++ [K_M] > 'מ' ++ [K_N] > 'נ' ++ [K_B] > 'ב' ++ [K_V] > 'שׁ' ++ [K_C] > 'שׂ' ++ [K_X] > 'צ' ++ [K_Z] > 'ז' ++ [K_COLON] > 'ְ' ++ [K_L] > 'ל' ++ [K_K] > 'כ' ++ [K_J] > 'ח' ++ [K_H] > 'ה' ++ [K_G] > 'ג' ++ [K_F] > 'ט' ++ [K_D] > 'ד' ++ [K_S] > 'ס' ++ [K_A] > 'ַ' ++ [K_P] > 'פ' ++ [K_O] > 'ֹ' ++ [K_I] > 'ִ' ++ [K_U] > 'ע' ++ [K_Y] > 'י' ++ [K_T] > 'ת' ++ [K_R] > 'ר' ++ [K_E] > 'ֶ' ++ [K_W] > 'ו' ++ [K_Q] > 'ק' +c Transform final letters +any(letters-with-final-forms) + any(whitespace) > index(sofit-forms-of-letters,1) + +c Transform final letters with a dagesh +any(letters-with-final-forms) $dagesh + any(whitespace) > index(sofit-forms-of-letters,1) $dagesh +any(presentation-dageshed-letters-with-final-forms) + any(whitespace) > index(presentation-dageshed-sofit-forms-of-letters,1) +any(normal-dageshed-letters-with-final-forms) + any(whitespace) > index(normal-undageshed-sofit-forms-of-letters,1) $dagesh + +c Transform final letters with a vowel +c any(letters-with-final-forms) any(vowels) + any(whitespace) > index(sofit-forms-of-letters,1) index(vowels,2) + +c Transform final letters with a vowel and a dagesh +c any(letters-with-final-forms) any(vowels) $dagesh + any(whitespace) > index(sofit-forms-of-letters,1) index(vowels,2) $dagesh +c any(letters-with-final-forms) $dagesh any(vowels) + any(whitespace) > index(sofit-forms-of-letters,1) $dagesh index(vowels,3) +c any(presentation-dageshed-letters-with-final-forms) any(vowels) + any(whitespace) > index(presentation-dageshed-sofit-forms-of-letters,1) index(vowels,2) +c any(normal-dageshed-letters-with-final-forms) any(vowels) + any(whitespace) > index(normal-undageshed-sofit-forms-of-letters,1) $dagesh index(vowels,2) + +c Transform final letters with punctuation +any(letters-with-final-forms) any(punctuation) + any(whitespace) > index(sofit-forms-of-letters,1) index(punctuation,2) + +c Transform final letters with punctuation and a dagesh +any(letters-with-final-forms) any(punctuation) $dagesh + any(whitespace) > index(sofit-forms-of-letters,1) index(punctuation,2) $dagesh +any(letters-with-final-forms) $dagesh any(punctuation) + any(whitespace) > index(sofit-forms-of-letters,1) $dagesh index(punctuation,3) +any(presentation-dageshed-letters-with-final-forms) any(punctuation) + any(whitespace) > index(presentation-dageshed-sofit-forms-of-letters,1) index(punctuation,2) +any(normal-dageshed-letters-with-final-forms) any(punctuation) + any(whitespace) > index(normal-undageshed-sofit-forms-of-letters,1) $dagesh index(punctuation,2) + +c Transfrom final letters with a punctuation and a vowel +c any(letters-with-final-forms) any(punctuation) any(vowels) + any(whitespace) > index(sofit-forms-of-letters,1) index(punctuation,2) index(vowels,3) +c any(letters-with-final-forms) any(vowels) any(punctuation) + any(whitespace) > index(sofit-forms-of-letters,1) index(vowels,2) index(punctuation,3) + +c Transform final letters with punctuation, a vowel, and a dagesh (phew!) +c any(letters-with-final-forms) any(punctuation) any(vowels) $dagesh + any(whitespace) > index(sofit-forms-of-letters,1) index(punctuation,2) index(vowels,3) $dagesh +c any(letters-with-final-forms) any(punctuation) $dagesh any(vowels) + any(whitespace) > index(sofit-forms-of-letters,1) index(punctuation,2) $dagesh index(vowels,4) +c any(letters-with-final-forms) any(vowels) any(punctuation) $dagesh + any(whitespace) > index(sofit-forms-of-letters,1) index(vowels,2) index(punctuation,3) $dagesh +c any(letters-with-final-forms) any(vowels) $dagesh any(punctuation) + any(whitespace) > index(sofit-forms-of-letters,1) index(vowels,2) $dagesh index(punctuation,4) +c any(letters-with-final-forms) $dagesh any(punctuation) any(vowels) + any(whitespace) > index(sofit-forms-of-letters,1) $dagesh index(punctuation,3) index(vowels,4) +c any(letters-with-final-forms) $dagesh any(vowels) any(punctuation) + any(whitespace) > index(sofit-forms-of-letters,1) $dagesh index(vowels,3) index(punctuation,4) + + +c any(presentation-dageshed-letters-with-final-forms) any(punctuation) any(vowels) + any(whitespace) > index(presentation-dageshed-sofit-forms-of-letters,1) index(punctuation,2) index(vowels,3) +c any(presentation-dageshed-letters-with-final-forms) any(vowels) any(punctuation) + any(whitespace) > index(presentation-dageshed-sofit-forms-of-letters,1) index(vowels,2) index(punctuation,3) +c any(normal-dageshed-letters-with-final-forms) any(punctuation) any(vowels) + any(whitespace) > index(normal-undageshed-sofit-forms-of-letters,1) $dagesh index(punctuation,2) index(vowels,3) +c any(normal-dageshed-letters-with-final-forms) any(vowels) any(punctuation) + any(whitespace) > index(normal-undageshed-sofit-forms-of-letters,1) $dagesh index(vowels,2) index(punctuation,3) diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kps b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kps new file mode 100644 index 0000000000..9c2b0a1251 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kps @@ -0,0 +1,95 @@ + + + + 17.0.325.0 + 7.0 + + + + readme.htm + ..\LICENSE.md + ..\..\another-folder\welcome\welcome.htm + + + + + + + + + + + Aleph With Beth + © Cameron Briggs + Cameron Briggs + https://freehebrew.online + alephwithbeth keyboard + + + + readme.htm + File readme.htm + 0 + .htm + + + ..\..\another-folder\welcome\welcome.htm + File welcome.htm + 0 + .htm + + + ..\build\alephwithbeth.js + File alephwithbeth.js + 0 + .js + + + ..\build\alephwithbeth.kvk + File alephwithbeth.kvk + 0 + .kvk + + + ..\build\alephwithbeth.kmx + Keyboard alephwithbeth + 0 + .kmx + + + ..\..\another-folder\welcome\KeyboardLayout.png + File KeyboardLayout.png + 0 + .png + + + ..\..\another-folder\welcome\KeyboardLayoutAlt.png + File KeyboardLayoutAlt.png + 0 + .png + + + ..\..\another-folder\welcome\KeyboardLayoutShift.png + File KeyboardLayoutShift.png + 0 + .png + + + ..\LICENSE.md + + 0 + .md + + + + + Aleph With Beth + alephwithbeth + 1.0.4 + + Hebrew + + + + + diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kvks b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kvks new file mode 100644 index 0000000000..6b3cf3eeb9 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/alephwithbeth.kvks @@ -0,0 +1,138 @@ + + +

+ 10.0 + alephwithbeth + +
+ + + ! + " + ֨ + ֜ + ֞ + ֬ + ( + ) + ֝ + + + ״ + ּ + ? + ֘ + ָ + בּ + שּׂ + דּ + ֵ + טּ + גּ + הּ + וַיּ + כּ + לּ + מּ + נּ + וֹ + פּ + קּ + רּ + סּ + תּ + ֻ + שּׁ + וּ + צּ + יּ + זּ + ֔ + _ + { + | + } + + + ' + א + . + / + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + ְ + = + [ + \ + ] + ֑ + ַ + ב + שׂ + ד + ֶ + ט + ג + ה + ִ + ח + כ + ל + מ + נ + ֹ + פ + ק + ר + ס + ת + ע + שׁ + ו + צ + י + ז + ־ + 0 + + + ׄ + ֫ + ֿ + ̈ + ״ + ֯ + ֗ + ֮ + ֙ + ֠ + ֩ + ֟ + ֡ + ֕ + ֓ + ׃ + ◌ + ֔ + ֫ + ֒ + ֲ + ֱ + • + ̊ + ֽ + ך + ם + ן + ֳ + ף + ץ + + + diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayout.png b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayout.png new file mode 100644 index 0000000000000000000000000000000000000000..d0998e288b1e18536d87cee7e0fad5ae3d211bca GIT binary patch literal 97424 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

~ZF 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 gzp17`|ibnP2GkkYu)#Z<}FU2QZ2 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 literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayoutAlt.png b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayoutAlt.png new file mode 100644 index 0000000000000000000000000000000000000000..f740eec1e3fbf840a32b6802240c23b73aebd8e8 GIT binary patch literal 61615 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 literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayoutShift.png b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/KeyboardLayoutShift.png new file mode 100644 index 0000000000000000000000000000000000000000..9b243d4dd2f2ef9e0d75748e615fb72951fcb6bc GIT binary patch literal 85201 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 literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/alephwithbeth.php b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/alephwithbeth.php new file mode 100644 index 0000000000..48a2c2e7c8 --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/help/alephwithbeth.php @@ -0,0 +1,22 @@ + + + +

Start Using Aleph with Beth

+ +

Desktop Layout

+ +

Base layout

+Keyboard layout +

Layout when shift is pressed

+Keyboard layout (when shift key is pressed) +

Layout when alt is pressed

+Keyboard layout (when alt key is pressed) + diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/readme.htm b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/readme.htm new file mode 100644 index 0000000000..f187388c1e --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/alephwithbeth/source/readme.htm @@ -0,0 +1,22 @@ + + + + + + alephwithbeth + + + + +

Aleph With Beth

+ +

A Hebrew keyboard designed to intuitively match the standard QWERTY layout.

+ +

© Cameron Briggs

+ + + diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayout.png b/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayout.png new file mode 100644 index 0000000000000000000000000000000000000000..d0998e288b1e18536d87cee7e0fad5ae3d211bca GIT binary patch literal 97424 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
-!f@lFY8?d3JlD9c$!ml8F-EO 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

~ZF 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 gzp17`|ibnP2GkkYu)#Z<}FU2QZ2 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 literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayoutAlt.png b/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayoutAlt.png new file mode 100644 index 0000000000000000000000000000000000000000..f740eec1e3fbf840a32b6802240c23b73aebd8e8 GIT binary patch literal 61615 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 literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayoutShift.png b/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/KeyboardLayoutShift.png new file mode 100644 index 0000000000000000000000000000000000000000..9b243d4dd2f2ef9e0d75748e615fb72951fcb6bc GIT binary patch literal 85201 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 literal 0 HcmV?d00001 diff --git a/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/welcome.htm b/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/welcome.htm new file mode 100644 index 0000000000..717e7bedeb --- /dev/null +++ b/developer/src/kmc-copy/test/fixtures/projects/external/another-folder/welcome/welcome.htm @@ -0,0 +1,28 @@ + + + + + + Start Using alephwithbeth + + + + +

Start Using Aleph With Beth

+ +

Keyboard Layouts

+ +

Base layout

+Keyboard layout +

Layout when shift is pressed

+Keyboard layout (when shift key is pressed) +

Layout when alt is pressed

+Keyboard layout (when alt key is pressed) + + + diff --git a/developer/src/kmc/src/commands/copy.ts b/developer/src/kmc/src/commands/copy.ts index 1d4ab94dcf..553cb28ca5 100644 --- a/developer/src/kmc/src/commands/copy.ts +++ b/developer/src/kmc/src/commands/copy.ts @@ -20,6 +20,7 @@ export function declareCopy(program: Command) { .description('Copy a Keyman keyboard or lexical model project') .option('-o, --out-path ', 'New name and path for project') .option('-n, --dry-run', 'Show what would happen, without making changes') + .option('-r, --relocate-external', 'Copy external files into "external" folder') .action(copyProject) .addHelpText('before', ` can be: @@ -36,6 +37,7 @@ function commanderOptionsToCopierOptions(options: any): CopierOptions { const result: CopierOptions = { outPath: options.outPath, dryRun: options.dryRun ?? false, + relocateExternalFiles: options.relocateExternal ?? false, }; return result; } From 27bf5355c50e1e027c80b79f62bf64c1cf7c09c5 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 28 Jan 2025 22:51:04 +1000 Subject: [PATCH 026/109] feat(windows): add fmBoot option Add fmBoot option code and update state machine code so that on boot a prompt can let the user the new update is about to install. --- windows/src/desktop/kmshell/main/initprog.pas | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index 9d573b9be1..e4002d5a31 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -233,7 +233,7 @@ begin // package installation. See https://superuser.com/a/1395288/521575 and // https://github.com/keymanapp/keyman/issues/2467 else if s = '-f' then FForce := True - else if s = '-boot' then FMode := fmBoot + else if s = '-boot' then FMode := fmBoot else if s = '-c' then FMode := fmMain else if s = '-m' then FMode := fmMigrate else if s = '-i' then FMode := fmInstall @@ -453,14 +453,14 @@ begin Exit; end; - if not FSilent and (FMode in [fmStart, fmSplash, fmMain, fmAbout]) then // I4773 + if not FSilent and (FMode in [fmStart, fmSplash, fmMain, fmAbout, fmBoot]) then // I4773 begin DoCheckTIPInstallStatus(False); end; // I1818 - remove start mode change - if FMode = fmStart then FIcon := 'appicon.ico' + if (FMode in [fmStart, fmBoot]) then FIcon := 'appicon.ico' else FIcon := 'cfgicon.ico'; FIcon := GetDebugPath(FIcon, ExtractFilePath(ParamStr(0)) + FIcon, False); @@ -511,6 +511,11 @@ begin ////TODO: TUtilExecute.Shell(PChar('hh.exe mk:@MSITStore:'+ExtractFilePath(KMShellExe)+'keyman.chm::/context/keyman_usage.html'), SW_SHOWNORMAL); + fmBoot: + begin + // on boot splash should be suppressed therefore Silent = True + StartKeyman(False, True, FStartWithConfiguration); + end; fmStart: begin // I2720 StartKeyman(False, FSilent, FStartWithConfiguration); @@ -701,8 +706,8 @@ begin // UI elements from the state machine we have bring some of logic here. UserCanceled := False; if BUpdateSM.ReadyToInstall and - (not FSilent and (FMode in [fmStart, fmSplash, fmMain, fmAbout, fmHelp, - fmShowHelp, fmSettings])) then + (not FSilent and (FMode in [fmStart, fmSplash, fmMain, fmAbout, + fmHelp, fmShowHelp, fmSettings, fmBoot])) then begin frmStartInstall := TfrmStartInstall.Create(nil); try From f57f2e744986fa81b98b03657eddf66b671896ef Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 29 Jan 2025 22:17:28 +1000 Subject: [PATCH 027/109] feat(windows): review comments Co-authored-by: Eberhard Beilharz --- windows/src/desktop/kmshell/main/initprog.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index 7f9e3c83b3..0ddf2c771b 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -161,7 +161,7 @@ uses function FirstRun(FQuery, FDisablePackages, FDefaultUILanguage: string): Boolean; forward; // I2562 procedure ShowKeyboardWelcome(PackageName: WideString); forward; // I2569 procedure PrintKeyboard(KeyboardName: WideString); forward; // I2329 -function ProcessBackroundUpdate(FMode: TKMShellMode; FSilent: Boolean): Boolean; forward; +function ProcessBackgroundUpdate(FMode: TKMShellMode; FSilent: Boolean): Boolean; forward; procedure Main(Owner: TComponent = nil); var @@ -689,7 +689,7 @@ begin else begin // Since Package upgrade and Keyman upgrade share the installing state - // the following package related switches are valid in in the installing + // the following package related switches are valid in the installing // state. SkipBUpdate := (BUpdateSM.IsInstallingState and (FMode in [fmInstallTip, fmInstallTipsForPackages, fmRegisterTip, fmUpgradeKeyboards, From 6b40ff86a79abd0a5d9c64a53a42d5481a5f51f1 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 29 Jan 2025 22:24:21 +1000 Subject: [PATCH 028/109] feat(windows): review commments --- windows/src/desktop/kmshell/main/initprog.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index 0ddf2c771b..c298b697b9 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -437,7 +437,7 @@ begin Exit; end; - if ProcessBackroundUpdate(FMode, FSilent) then + if ProcessBackgroundUpdate(FMode, FSilent) then begin Exit; end; @@ -652,7 +652,7 @@ begin end; end; -function ProcessBackroundUpdate(FMode: TKMShellMode; FSilent: Boolean) : Boolean; +function ProcessBackgroundUpdate(FMode: TKMShellMode; FSilent: Boolean) : Boolean; var BUpdateSM : TUpdateStateMachine; frmStartInstall: TfrmStartInstall; From 39b8bb6378ffcd4f7aeaecddb0c1ecb3b03a3bf7 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 29 Jan 2025 22:26:37 +1000 Subject: [PATCH 029/109] feat(windows): update comments for clarity --- .../desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas index 753e08cf92..c85aa92ddf 100644 --- a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas +++ b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas @@ -1091,7 +1091,7 @@ end; function InstallingState.HandleKmShell; begin - // Should not be called while in installing state MSI installer may have + // Should not be possible while called in InstallingState. The MSI installer may have // failed. Clean Up and return to Idle bucStateContext.RemoveCachedFiles; ChangeState(IdleState); From d2aa22ff755f05a6488f474a3c8727a4a7e21c6a Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 09:20:29 +0700 Subject: [PATCH 030/109] fix(developer): make kmc log options consistent across all commands Makes the `--log-format`, `--log-level`, and `--color`/`--no-color` options available for all commands and DRYs out some of the options processing for consistency. This has positive impact in particular on the Generator classes which removes the need for several unit tests as the interface can now be checked at compile time. Fixes: #13072 Unblocks: #13073 --- .../docs/help/reference/kmc/cli/reference.md | 50 ++++++++++--------- .../web/utils/src/compiler-interfaces.ts | 6 +-- .../src/kmc-copy/src/KeymanProjectCopier.ts | 9 +--- .../kmc-generate/src/abstract-generator.ts | 9 +--- developer/src/kmc/src/commands/analyze.ts | 31 ++++++++---- developer/src/kmc/src/commands/build.ts | 10 ++-- .../kmc/src/commands/buildTestData/index.ts | 4 +- .../buildWindowsPackageInstaller/index.ts | 4 +- developer/src/kmc/src/commands/copy.ts | 14 +++--- developer/src/kmc/src/commands/generate.ts | 42 +++++++++------- developer/src/kmc/src/util/baseOptions.ts | 22 +++++++- .../kmc/src/util/extendedCompilerOptions.ts | 28 +++++++---- .../kmc/test/extendedCompilerOptions.tests.ts | 4 +- .../src/kmc/test/generateKmnKeyboard.tests.ts | 34 +++---------- .../kmc/test/generateLdmlKeyboard.tests.ts | 34 +++---------- .../kmc/test/generateLexicalModel.tests.ts | 34 +++---------- 16 files changed, 153 insertions(+), 182 deletions(-) diff --git a/developer/docs/help/reference/kmc/cli/reference.md b/developer/docs/help/reference/kmc/cli/reference.md index 823c65f995..1d5ed9fc20 100644 --- a/developer/docs/help/reference/kmc/cli/reference.md +++ b/developer/docs/help/reference/kmc/cli/reference.md @@ -90,14 +90,33 @@ The following parameters are available: : Prints the version number of kmc -`--no-error-reporting`, `--error-reporting` +`--color`, `--no-color` -: Enable or disable error reporting to keyman.com, overriding [user - settings](../../user-settings). Error reporting is for fatal errors in the - compiler, and not errors in compiled files. No user data is sent in error +: Controls colorization for log messages, using ANSI color controls. If both of + these settings are omitted, kmc will attempt to detect from console, and will + use colorization for interactive terminals, and no colorization when + redirection is being used. + +`--error-reporting`, `--no-error-reporting` + +: Enable or disable error reporting to keyman.com, overriding + [user settings](../../user-settings). Error reporting is for fatal errors in + the compiler, and not errors in compiled files. No user data is sent in error reports, although some filenames and paths may be present in the diagnostic data attached to the report. +`--log-format ` + +: Output log format. The available options are: + * `formatted` (default): emits log messages in a human-readable format + * `tsv`: emits log messages in UTF-8 tab-separated format. This format will be + stable across versions of kmc. The format has the following fields: + * filename + * line number + * severity + * code + * message + `-l `, `--log-level ` : Controls the level of logging to console for messages relating to the @@ -108,9 +127,12 @@ The following parameters are available: * `hint`: emits compilation errors, warnings, and hints * `info` (default): emits compilation errors, warnings, hints, and informational messages + * `verbose`: emits all compilation messages, including verbose + informational messages * `debug`: emits all compilation messages, plus internal debug messages - Logging of specific [messages](messages) can be controlled with `--message`, `-m`. + Logging of specific [messages](messages) can be controlled with `--message`, + `-m` (`build` command only). Note that when warnings are treated as errors (`--compiler-warnings-as-errors`, `-w`), they will still be logged as @@ -118,13 +140,6 @@ The following parameters are available: ## `kmc build` options -`--color`, `--no-color` - -: Controls colorization for log messages, using ANSI color controls. If both of - these settings are omitted, kmc will attempt to detect from console, and will - use colorization for interactive terminals, and no colorization when - redirection is being used. - `-d`, `--debug` : Include debug information in output files. Debug information is used for @@ -167,17 +182,6 @@ The following parameters are available: : Turns off warnings (CWARN_HeaderStatementIsDeprecated, CWARN_LanguageHeadersDeprecatedInKeyman10) for deprecated code styles -`--log-format ` - -: Output log format. The available options are: - * `formatted` (default): emits log messages in a human-readable format - * `tsv`: emits log messages in UTF-8 tab-separated format. This format will be - stable across versions of kmc. The format has the following fields: - * filename - * line number - * severity - * code - * message `-o `, `--out-file ` diff --git a/developer/src/common/web/utils/src/compiler-interfaces.ts b/developer/src/common/web/utils/src/compiler-interfaces.ts index 4cb9ae3c22..2f72982bf8 100644 --- a/developer/src/common/web/utils/src/compiler-interfaces.ts +++ b/developer/src/common/web/utils/src/compiler-interfaces.ts @@ -291,10 +291,8 @@ export interface CompilerMessageOverride { level: CompilerErrorSeverityOverride; }; -export interface CompilerCallbackOptions { - logLevel?: CompilerLogLevel; - logFormat?: CompilerLogFormat; - color?: boolean; // null or undefined == use console default +export interface CompilerCallbackOptions extends CompilerBaseOptions { + // TODO: these overlap with CompilerOptions, should refactor compilerWarningsAsErrors?: boolean; messageOverrides?: CompilerMessageOverrideMap; }; diff --git a/developer/src/kmc-copy/src/KeymanProjectCopier.ts b/developer/src/kmc-copy/src/KeymanProjectCopier.ts index decc773486..0fcae4b514 100644 --- a/developer/src/kmc-copy/src/KeymanProjectCopier.ts +++ b/developer/src/kmc-copy/src/KeymanProjectCopier.ts @@ -4,7 +4,7 @@ * Copy a keyboard or lexical model project */ -import { CloudUrls, GitHubUrls, CompilerCallbacks, CompilerLogLevel, KeymanCompiler, KeymanCompilerArtifact, KeymanCompilerArtifacts, KeymanCompilerResult, KeymanDeveloperProject, KeymanDeveloperProjectOptions, KPJFileReader, KPJFileWriter, KpsFileReader, KpsFileWriter, ValidIds } from "@keymanapp/developer-utils"; +import { CloudUrls, GitHubUrls, CompilerCallbacks, KeymanCompiler, KeymanCompilerArtifact, KeymanCompilerArtifacts, KeymanCompilerResult, KeymanDeveloperProject, KeymanDeveloperProjectOptions, KPJFileReader, KPJFileWriter, KpsFileReader, KpsFileWriter, ValidIds, CompilerBaseOptions } from "@keymanapp/developer-utils"; import { KeymanFileTypes } from "@keymanapp/common-types"; import { CopierMessages } from "./copier-messages.js"; @@ -19,12 +19,7 @@ type CopierFunction = ( * @public * Options for the Keyman Developer project copier */ -export interface CopierOptions /* not inheriting from CompilerBaseOptions */ { - /** - * Reporting level to console, used by NodeCompilerCallbacks (not used in - * compiler modules; all messages are still reported to the internal log) - */ - logLevel?: CompilerLogLevel; +export interface CopierOptions extends CompilerBaseOptions { /** * output path where project folder will be created */ diff --git a/developer/src/kmc-generate/src/abstract-generator.ts b/developer/src/kmc-generate/src/abstract-generator.ts index 5a6ed46cc0..3c56c00e07 100644 --- a/developer/src/kmc-generate/src/abstract-generator.ts +++ b/developer/src/kmc-generate/src/abstract-generator.ts @@ -4,7 +4,7 @@ * Base interfaces and classes for generating Keyman Developer source files */ -import { CompilerCallbacks, CompilerLogLevel, KeymanCompilerArtifact, KeymanCompilerArtifacts, KeymanCompilerResult } from "@keymanapp/developer-utils"; +import { CompilerBaseOptions, CompilerCallbacks, KeymanCompilerArtifact, KeymanCompilerArtifacts, KeymanCompilerResult } from "@keymanapp/developer-utils"; import { GeneratorMessages } from './generator-messages.js'; import { KeymanTargets } from "@keymanapp/common-types"; @@ -13,12 +13,7 @@ import { KeymanTargets } from "@keymanapp/common-types"; * @public * Options for the Keyman Developer project generator */ -export interface GeneratorOptions /* not inheriting from CompilerBaseOptions */ { - /** - * Reporting level to console, used by NodeCompilerCallbacks (not used in - * compiler modules; all messages are still reported to the internal log) - */ - logLevel?: CompilerLogLevel; +export interface GeneratorOptions extends CompilerBaseOptions { /** * identifier (basename) of the keyboard or model */ diff --git a/developer/src/kmc/src/commands/analyze.ts b/developer/src/kmc/src/commands/analyze.ts index 65119c30d9..b0699977c3 100644 --- a/developer/src/kmc/src/commands/analyze.ts +++ b/developer/src/kmc/src/commands/analyze.ts @@ -3,18 +3,14 @@ import * as path from 'path'; import { Command, Option } from 'commander'; import { NodeCompilerCallbacks } from '../util/NodeCompilerCallbacks.js'; import { InfrastructureMessages } from '../messages/infrastructureMessages.js'; -import { CompilerCallbacks, CompilerLogLevel } from '@keymanapp/developer-utils'; +import { CompilerBaseOptions, CompilerCallbacks } from '@keymanapp/developer-utils'; import { AnalyzeOskCharacterUse, AnalyzeOskRewritePua } from '@keymanapp/kmc-analyze'; import { BaseOptions } from '../util/baseOptions.js'; import { runOnFiles } from '../util/projectRunner.js'; import { exitProcess } from '../util/sysexits.js'; +import { commanderOptionsToBaseOptions } from '../util/extendedCompilerOptions.js'; -interface AnalysisActivityOptions /* not inheriting from CompilerBaseOptions */ { - /** - * Reporting level to console, used by NodeCompilerCallbacks (not used in compiler modules; - * all messages are still reported to the internal log) - */ - logLevel?: CompilerLogLevel; +interface AnalysisActivityOptions extends CompilerBaseOptions { base?: string; stripDottedCircle?: boolean; includeCounts?: boolean; @@ -30,7 +26,7 @@ export function declareAnalyze(program: Command) { function declareOskCharUse(command: Command) { let subCommand = command.command('osk-char-use [infile...]'); - BaseOptions.addLogLevel(subCommand); + BaseOptions.addAll(subCommand); subCommand .description('Analyze On Screen Keyboards for character usage') .option('-b, --base', 'First PUA codepoint to use, in hexadecimal (default F100)', 'F100') @@ -75,9 +71,24 @@ function declareOskRewrite(command: Command) { }); } +function commanderOptionsToAnalyzeOptions(options: any): AnalysisActivityOptions { + // TODO: split options per sub-command + const result: AnalysisActivityOptions = { + ...commanderOptionsToBaseOptions(options), + // AnalysisActivityOptions + base: options.base, + includeCounts: options.includeCounts ?? false, + inputMappingFile: options.inputMappingFile, + mappingFile: options.mappingFile, + stripDottedCircle: options.stripDottedCircle ?? false, + }; + return result; +} + async function analyze(action: (callbacks: CompilerCallbacks, filenames: string[], options: AnalysisActivityOptions)=>Promise, - filenames: string[], options: AnalysisActivityOptions): Promise { - let callbacks = new NodeCompilerCallbacks({logLevel: options.logLevel}); + filenames: string[], commanderOptions: any): Promise { + const options = commanderOptionsToAnalyzeOptions(commanderOptions); + let callbacks = new NodeCompilerCallbacks(options); try { return await action(callbacks, filenames, options); } catch(e) { diff --git a/developer/src/kmc/src/commands/build.ts b/developer/src/kmc/src/commands/build.ts index 996e767a77..39e0e20578 100644 --- a/developer/src/kmc/src/commands/build.ts +++ b/developer/src/kmc/src/commands/build.ts @@ -7,20 +7,18 @@ import { NodeCompilerCallbacks } from '../util/NodeCompilerCallbacks.js'; import { InfrastructureMessages } from '../messages/infrastructureMessages.js'; import { KeymanFileTypes } from '@keymanapp/common-types'; import { CompilerOptions, CompilerFileCallbacks } from '@keymanapp/developer-utils'; -import { BaseOptions } from '../util/baseOptions.js'; +import { BuildBaseOptions } from '../util/baseOptions.js'; import { expandFileLists } from '../util/fileLists.js'; import { isProject } from '../util/projectLoader.js'; import { buildTestData } from './buildTestData/index.js'; import { buildWindowsPackageInstaller } from './buildWindowsPackageInstaller/index.js'; -import { commandOptionsToCompilerOptions } from '../util/extendedCompilerOptions.js'; +import { commanderOptionsToCompilerOptions } from '../util/extendedCompilerOptions.js'; import { exitProcess } from '../util/sysexits.js'; export function declareBuild(program: Command) { // TODO: localization? const buildCommand = program .command('build') - .option('--color', 'Force colorization for log messages') - .option('--no-color', 'No colorization for log messages; if both omitted, detects from console') // These options are only used with build file but are included here so that // they are visible in `kmc build --help` @@ -32,7 +30,7 @@ export function declareBuild(program: Command) { .option('--no-compiler-version', 'Exclude compiler version metadata from output') .option('--no-warn-deprecated-code', 'Turn off warnings for deprecated code styles'); - BaseOptions.addAll(buildCommand); + BuildBaseOptions.addAll(buildCommand); buildCommand.command('file [infile...]', {isDefault: true}) .description(`Compile one or more source files or projects ('file' subcommand is default).`) @@ -74,7 +72,7 @@ function initialize(commanderOptions: any) { // We use a default callback instance when validating command line, but throw // it away once we have completed initialization const initializationCallbacks = new NodeCompilerCallbacks({}); - const options = commandOptionsToCompilerOptions(commanderOptions, initializationCallbacks); + const options = commanderOptionsToCompilerOptions(commanderOptions, initializationCallbacks); return options; } diff --git a/developer/src/kmc/src/commands/buildTestData/index.ts b/developer/src/kmc/src/commands/buildTestData/index.ts index 5343c81702..220bc4b26f 100644 --- a/developer/src/kmc/src/commands/buildTestData/index.ts +++ b/developer/src/kmc/src/commands/buildTestData/index.ts @@ -4,13 +4,13 @@ import * as kmcLdml from '@keymanapp/kmc-ldml'; import { CompilerCallbacks, defaultCompilerOptions, LDMLKeyboardTestDataXMLSourceFile, LDMLKeyboardXMLSourceFileReader } from '@keymanapp/developer-utils'; import { NodeCompilerCallbacks } from '../../util/NodeCompilerCallbacks.js'; import { fileURLToPath } from 'url'; -import { CommandLineBaseOptions } from 'src/util/baseOptions.js'; +import { CommandLineBuildBaseOptions } from 'src/util/baseOptions.js'; import { exitProcess } from '../../util/sysexits.js'; import { InfrastructureMessages } from '../../messages/infrastructureMessages.js'; import { dirname } from 'node:path'; export async function buildTestData(infile: string, _options: any, commander: any): Promise { - const options: CommandLineBaseOptions = commander.optsWithGlobals(); + const options: CommandLineBuildBaseOptions = commander.optsWithGlobals(); let compilerOptions: kmcLdml.LdmlCompilerOptions = { ...defaultCompilerOptions, diff --git a/developer/src/kmc/src/commands/buildWindowsPackageInstaller/index.ts b/developer/src/kmc/src/commands/buildWindowsPackageInstaller/index.ts index 06076db929..4dddfac1f2 100644 --- a/developer/src/kmc/src/commands/buildWindowsPackageInstaller/index.ts +++ b/developer/src/kmc/src/commands/buildWindowsPackageInstaller/index.ts @@ -3,10 +3,10 @@ import * as path from 'path'; import { CompilerCallbacks, defaultCompilerOptions } from '@keymanapp/developer-utils'; import { NodeCompilerCallbacks } from '../../util/NodeCompilerCallbacks.js'; import { WindowsPackageInstallerCompiler, WindowsPackageInstallerSources } from '@keymanapp/kmc-package'; -import { CommandLineBaseOptions } from 'src/util/baseOptions.js'; +import { CommandLineBuildBaseOptions } from 'src/util/baseOptions.js'; import { exitProcess } from '../../util/sysexits.js'; -interface WindowsPackageInstallerCommandLineOptions extends CommandLineBaseOptions { +interface WindowsPackageInstallerCommandLineOptions extends CommandLineBuildBaseOptions { msi: string; exe: string; license: string; diff --git a/developer/src/kmc/src/commands/copy.ts b/developer/src/kmc/src/commands/copy.ts index 553cb28ca5..b7d0aef12f 100644 --- a/developer/src/kmc/src/commands/copy.ts +++ b/developer/src/kmc/src/commands/copy.ts @@ -10,12 +10,13 @@ import { InfrastructureMessages } from '../messages/infrastructureMessages.js'; import { BaseOptions } from '../util/baseOptions.js'; import { exitProcess } from '../util/sysexits.js'; import { CopierOptions, KeymanProjectCopier } from '@keymanapp/kmc-copy'; +import { commanderOptionsToBaseOptions } from '../util/extendedCompilerOptions.js'; /* c8 ignore start */ export function declareCopy(program: Command) { const command = program.command('copy '); - BaseOptions.addLogLevel(command); + BaseOptions.addAll(command); command .description('Copy a Keyman keyboard or lexical model project') .option('-o, --out-path ', 'New name and path for project') @@ -35,6 +36,8 @@ export function declareCopy(program: Command) { function commanderOptionsToCopierOptions(options: any): CopierOptions { const result: CopierOptions = { + ...commanderOptionsToBaseOptions(options), + // CopierOptions outPath: options.outPath, dryRun: options.dryRun ?? false, relocateExternalFiles: options.relocateExternal ?? false, @@ -46,15 +49,16 @@ const MaxDryRunCopyLogMessages = 10000; async function copyProject(ids: string | string[], _options: any, commander: any): Promise { const commanderOptions = commander.optsWithGlobals(); - const callbacks = new NodeCompilerCallbacks({logLevel: commanderOptions.logLevel ?? 'info'}); - if(!await doCopy(callbacks, ids, commanderOptions)) { + const options = commanderOptionsToCopierOptions(commanderOptions); + const callbacks = new NodeCompilerCallbacks(options); + if(!await doCopy(callbacks, ids, options)) { return await exitProcess(1); } } /* c8 ignore stop */ -async function doCopy(callbacks: NodeCompilerCallbacks, sources: string | string[], commanderOptions: any): Promise { +async function doCopy(callbacks: NodeCompilerCallbacks, sources: string | string[], options: CopierOptions): Promise { const source = sources; if(!source || typeof source != 'string') { @@ -64,8 +68,6 @@ async function doCopy(callbacks: NodeCompilerCallbacks, sources: string | string return false; } - const options = commanderOptionsToCopierOptions(commanderOptions); - if(options.dryRun) { // For dry run, we may need a lot of log messages, to show // where all the files are copied to diff --git a/developer/src/kmc/src/commands/generate.ts b/developer/src/kmc/src/commands/generate.ts index d5abcec989..d987c2a43d 100644 --- a/developer/src/kmc/src/commands/generate.ts +++ b/developer/src/kmc/src/commands/generate.ts @@ -6,6 +6,7 @@ import { BaseOptions } from '../util/baseOptions.js'; import { exitProcess } from '../util/sysexits.js'; import { GeneratorOptions, KeymanKeyboardGenerator, LdmlKeyboardGenerator, LexicalModelGenerator } from '@keymanapp/kmc-generate'; import { CompilerCallbacks, KeymanCompiler } from '@keymanapp/developer-utils'; +import { commanderOptionsToBaseOptions } from '../util/extendedCompilerOptions.js'; /* c8 ignore start */ @@ -18,7 +19,7 @@ export function declareGenerate(program: Command) { function declareGenerateKmnKeyboard(command: Command) { const subCommand = command.command('keyman-keyboard '); - BaseOptions.addLogLevel(subCommand); + BaseOptions.addAll(subCommand); subCommand .description('Generate a .kmn keyboard project') .option('-t, --target ', 'Target platforms', @@ -38,7 +39,7 @@ function declareGenerateKmnKeyboard(command: Command) { function declareGenerateLdmlKeyboard(command: Command) { const ldmlSubCommand = command.command('ldml-keyboard '); - BaseOptions.addLogLevel(ldmlSubCommand); + BaseOptions.addAll(ldmlSubCommand); ldmlSubCommand .description('Generate an LDML .xml keyboard project') .option('-t, --target ', 'Target platforms', @@ -56,7 +57,7 @@ function declareGenerateLdmlKeyboard(command: Command) { function declareGenerateLexicalModel(command: Command) { const modelSubCommand = command.command('lexical-model '); - BaseOptions.addLogLevel(modelSubCommand); + BaseOptions.addAll(modelSubCommand); modelSubCommand .description('Generate a wordlist lexical model project') .option('-o, --out-path ', 'Output path (may exist)') @@ -74,6 +75,7 @@ function declareGenerateLexicalModel(command: Command) { function commanderOptionsToGeneratorOptions(id: string, options: any): GeneratorOptions { const result: GeneratorOptions = { + ...commanderOptionsToBaseOptions(options), // TODO-GENERATE: icon support // icon: options.icon ?? true, id, @@ -84,7 +86,6 @@ function commanderOptionsToGeneratorOptions(id: string, options: any): Generator version: options.version ?? '1.0', author: options.author ?? id, copyright: options.copyright ?? options.author ?? id, - logLevel: options.logLevel ?? 'info', description: options.description ?? '', }; return result; @@ -99,32 +100,35 @@ const generateLexicalModel = async (ids: string | string[], _options: any, comma async function generate(generator: KeymanCompiler, ids: string | string[], commander: any): Promise { const commanderOptions = commander.optsWithGlobals(); - const callbacks = new NodeCompilerCallbacks({logLevel: commanderOptions.logLevel ?? 'info'}); - if(!await doGenerate(callbacks, generator, ids, commanderOptions)) { + + const id = ids; + + if(!id || typeof id != 'string') { + // Note that commander can pass an array for the ids parameter, so we + // constrain here; as this is a parameter error before we have parsed + // other options, we use a 'default' compiler callback to generate + // the error message + (new NodeCompilerCallbacks({})).reportMessage(InfrastructureMessages.Error_GenerateRequiresId()); + return await exitProcess(1); + } + + const options = commanderOptionsToGeneratorOptions(id, commanderOptions); + + const callbacks = new NodeCompilerCallbacks(options); + if(!await doGenerate(callbacks, generator, commanderOptions)) { return await exitProcess(1); } } /* c8 ignore stop */ -async function doGenerate(callbacks: CompilerCallbacks, generator: KeymanCompiler, ids: string | string[], commanderOptions: any): Promise { - const id = ids; - - if(!id || typeof id != 'string') { - // Note that commander can pass an array for the ids parameter, so we - // constrain here - callbacks.reportMessage(InfrastructureMessages.Error_GenerateRequiresId()); - return false; - } - - const options = commanderOptionsToGeneratorOptions(id, commanderOptions); - +async function doGenerate(callbacks: CompilerCallbacks, generator: KeymanCompiler, options: GeneratorOptions): Promise { try { if(!await generator.init(callbacks, options)) { // errors will have been reported by the generator return false; } - const result = await generator.run(id); // note: id is currently ignored here + const result = await generator.run(options.id); // note: id is currently ignored here if(!result) { // errors will have been reported by the generator return false; diff --git a/developer/src/kmc/src/util/baseOptions.ts b/developer/src/kmc/src/util/baseOptions.ts index ab07921dbd..f3223238ec 100644 --- a/developer/src/kmc/src/util/baseOptions.ts +++ b/developer/src/kmc/src/util/baseOptions.ts @@ -10,9 +10,10 @@ export interface CommandLineBaseOptions { logLevel?: CompilerLogLevel; logFormat?: CompilerLogFormat; color?: boolean; +}; - // This option is not in CompilerBaseOptions - outFile?:string; +export interface CommandLineBuildBaseOptions extends CommandLineBaseOptions { + outFile?: string; } /** @@ -27,6 +28,22 @@ export class BaseOptions { return program.addOption(new Option('--log-format ', 'Log format').choices(ALL_COMPILER_LOG_FORMATS).default('formatted')); } + public static addColor(program: Command) { + return program + .option('--color', 'Force colorization for log messages') + .option('--no-color', 'No colorization for log messages; if both omitted, detects from console'); + } + + public static addAll(program: Command) { + return [ + this.addLogLevel, + this.addLogFormat, + this.addColor, + ].reduce((p,f) => f(p), program); + } +} + +export class BuildBaseOptions extends BaseOptions { public static addOutFile(program: Command) { return program.option('-o, --out-file ', 'Override the default path and filename for the output file') } @@ -35,6 +52,7 @@ export class BaseOptions { return [ this.addLogLevel, this.addLogFormat, + this.addColor, this.addOutFile, ].reduce((p,f) => f(p), program); } diff --git a/developer/src/kmc/src/util/extendedCompilerOptions.ts b/developer/src/kmc/src/util/extendedCompilerOptions.ts index 0d72b5b550..9a2e482f68 100644 --- a/developer/src/kmc/src/util/extendedCompilerOptions.ts +++ b/developer/src/kmc/src/util/extendedCompilerOptions.ts @@ -1,4 +1,4 @@ -import { CompilerCallbacks, CompilerError, CompilerErrorNamespace, CompilerErrorSeverity, CompilerMessageOverride, CompilerMessageOverrideMap, CompilerOptions } from '@keymanapp/developer-utils'; +import { CompilerBaseOptions, CompilerCallbacks, CompilerError, CompilerErrorNamespace, CompilerErrorSeverity, CompilerMessageOverride, CompilerMessageOverrideMap, CompilerOptions } from '@keymanapp/developer-utils'; import { InfrastructureMessages } from '../messages/infrastructureMessages.js'; import { CompilerMessageSource, messageNamespaceKeys, messageSources } from '../messages/messageNamespaces.js'; @@ -27,7 +27,7 @@ export interface ExtendedCompilerOptions extends CompilerOptions { * @returns CompilerMessageOverride map with the new severity level for the * message; or `null` if parameter is invalid. */ -function commandOptionsMessageToCompilerOptionsMessage(message: string, callbacks: CompilerCallbacks): CompilerMessageOverride { +function commanderOptionsMessageToCompilerOptionsMessage(message: string, callbacks: CompilerCallbacks): CompilerMessageOverride { const pattern = /^(KM)?([0-9a-f]+)(:(D|Disable|I|Info|H|Hint|W|Warn|E|Error))?$/i; const result = message.match(pattern); if(!result) { @@ -50,14 +50,14 @@ function commandOptionsMessageToCompilerOptionsMessage(message: string, callback return override; } -function commandOptionsMessagesToCompilerOptionsMessages(messages: any, callbacks: CompilerCallbacks): CompilerMessageOverrideMap { +function commanderOptionsMessagesToCompilerOptionsMessages(messages: any, callbacks: CompilerCallbacks): CompilerMessageOverrideMap { if(!messages || !Array.isArray(messages)) { return {}; } const result: CompilerMessageOverrideMap = {}; for(let message of messages) { - const override = commandOptionsMessageToCompilerOptionsMessage(message, callbacks); + const override = commanderOptionsMessageToCompilerOptionsMessage(message, callbacks); if(!override) { return null; } @@ -165,14 +165,23 @@ function checkMessageOverride(override: CompilerMessageOverride, callbacks: Comp return true; } +export function commanderOptionsToBaseOptions(options: any): CompilerBaseOptions { + return { + // CompilerBaseOptions + logLevel: options.logLevel, + logFormat: options.logFormat, + color: options.color, + }; +} + /** * Maps command line compiler options to the compiler API options. * @param options * @param callbacks * @returns */ -export function commandOptionsToCompilerOptions(options: any, callbacks: CompilerCallbacks): ExtendedCompilerOptions { - const overrides = commandOptionsMessagesToCompilerOptionsMessages(options.message, callbacks); +export function commanderOptionsToCompilerOptions(options: any, callbacks: CompilerCallbacks): ExtendedCompilerOptions { + const overrides = commanderOptionsMessagesToCompilerOptionsMessages(options.message, callbacks); if(!overrides) { return null; } @@ -181,10 +190,7 @@ export function commandOptionsToCompilerOptions(options: any, callbacks: Compile // properties that we have in CompilerOptions, but nor do we want to rename // CompilerOptions properties... return { - // CompilerBaseOptions - logLevel: options.logLevel, - logFormat: options.logFormat, - color: options.color, + ...commanderOptionsToBaseOptions(options), // CompilerOptions shouldAddCompilerVersion: options.compilerVersion, saveDebug: options.debug, @@ -202,5 +208,5 @@ export function commandOptionsToCompilerOptions(options: any, callbacks: Compile */ export const unitTestEndpoints = { checkMessageOverride, - commandOptionsMessageToCompilerOptionsMessage + commanderOptionsMessageToCompilerOptionsMessage }; diff --git a/developer/src/kmc/test/extendedCompilerOptions.tests.ts b/developer/src/kmc/test/extendedCompilerOptions.tests.ts index adda29dfdb..b2f04c81b7 100644 --- a/developer/src/kmc/test/extendedCompilerOptions.tests.ts +++ b/developer/src/kmc/test/extendedCompilerOptions.tests.ts @@ -42,7 +42,7 @@ describe('commandOptionsMessageToCompilerOptionsMessage', function () { ]; for(const test of valid) { it(`should recognize valid message definition ${test.input}`, () => { - const result = unitTestEndpoints.commandOptionsMessageToCompilerOptionsMessage(test.input, callbacks); + const result = unitTestEndpoints.commanderOptionsMessageToCompilerOptionsMessage(test.input, callbacks); callbacks.printMessages(); assert.deepEqual(result, { code: CompilerError.error(test.result.code), level: test.result.level }); assert.isEmpty(callbacks.messages); @@ -58,7 +58,7 @@ describe('commandOptionsMessageToCompilerOptionsMessage', function () { ]; for(const test of invalid) { it(`should reject invalid message definition ${test.input}`, () => { - assert.isNull(unitTestEndpoints.commandOptionsMessageToCompilerOptionsMessage(test.input, callbacks)); + assert.isNull(unitTestEndpoints.commanderOptionsMessageToCompilerOptionsMessage(test.input, callbacks)); assert.isTrue(callbacks.hasMessage(test.code)); }); } diff --git a/developer/src/kmc/test/generateKmnKeyboard.tests.ts b/developer/src/kmc/test/generateKmnKeyboard.tests.ts index 5fd29f5310..811adc49b3 100644 --- a/developer/src/kmc/test/generateKmnKeyboard.tests.ts +++ b/developer/src/kmc/test/generateKmnKeyboard.tests.ts @@ -6,20 +6,21 @@ import 'mocha'; import { assert } from 'chai'; import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; -import { KeymanKeyboardGenerator } from '@keymanapp/kmc-generate'; +import { GeneratorOptions, KeymanKeyboardGenerator } from '@keymanapp/kmc-generate'; import { unitTestEndpoints } from '../src/commands/generate.js'; -import { InfrastructureMessages } from '../src/messages/infrastructureMessages.js'; +import { KeymanTargets } from '@keymanapp/common-types'; describe('generateKeymanKeyboard', function() { - const keyboardOptions = { - icon: true, + const keyboardOptions: GeneratorOptions = { + // icon: true, // id is written by generate functions + id: '', languageTags: ['en'], name: 'Sample Keyboard', outPath: '.', - targets: 'any', + targets: [ KeymanTargets.KeymanTarget.any ], version: '1.0', author: 'Keyman', copyright: 'Keyman', @@ -45,32 +46,11 @@ describe('generateKeymanKeyboard', function() { outPath = null; }); - it('should only allow a single id', async function() { - assert.isFalse(await unitTestEndpoints.doGenerate( - callbacks, - new KeymanKeyboardGenerator(), - ['sample1','sample2'], - {...keyboardOptions} - )); - assert.isTrue(callbacks.hasMessage(InfrastructureMessages.ERROR_GenerateRequiresId)); - }); - - it('should require an id parameter', async function() { - assert.isFalse(await unitTestEndpoints.doGenerate( - callbacks, - new KeymanKeyboardGenerator(), - null, - {...keyboardOptions} - )); - assert.isTrue(callbacks.hasMessage(InfrastructureMessages.ERROR_GenerateRequiresId)); - }); - it('should generate a Keyman keyboard project', async function() { assert.isTrue(await unitTestEndpoints.doGenerate( callbacks, new KeymanKeyboardGenerator(), - 'sample', - {...keyboardOptions, outPath} + {...keyboardOptions, id: 'sample', outPath} )); // Note: we won't test contents of files as this is tested in kmc-generate directly diff --git a/developer/src/kmc/test/generateLdmlKeyboard.tests.ts b/developer/src/kmc/test/generateLdmlKeyboard.tests.ts index ad885c3dab..f28d1fec8f 100644 --- a/developer/src/kmc/test/generateLdmlKeyboard.tests.ts +++ b/developer/src/kmc/test/generateLdmlKeyboard.tests.ts @@ -6,20 +6,21 @@ import 'mocha'; import { assert } from 'chai'; import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; -import { LdmlKeyboardGenerator } from '@keymanapp/kmc-generate'; +import { GeneratorOptions, LdmlKeyboardGenerator } from '@keymanapp/kmc-generate'; import { unitTestEndpoints } from '../src/commands/generate.js'; -import { InfrastructureMessages } from '../src/messages/infrastructureMessages.js'; +import { KeymanTargets } from '@keymanapp/common-types'; describe('generateLdmlKeyboard', function() { - const keyboardOptions = { - icon: true, + const keyboardOptions: GeneratorOptions = { + // icon: true, // id is written by generate functions + id: '', languageTags: ['en'], name: 'Sample Keyboard', outPath: '.', - targets: 'any', + targets: [KeymanTargets.KeymanTarget.any], version: '1.0', author: 'Keyman', copyright: 'Keyman', @@ -45,32 +46,11 @@ describe('generateLdmlKeyboard', function() { outPath = null; }); - it('should only allow a single id', async function() { - assert.isFalse(await unitTestEndpoints.doGenerate( - callbacks, - new LdmlKeyboardGenerator(), - ['sample1','sample2'], - { ...keyboardOptions } - )); - assert.isTrue(callbacks.hasMessage(InfrastructureMessages.ERROR_GenerateRequiresId)); - }); - - it('should require an id parameter', async function() { - assert.isFalse(await unitTestEndpoints.doGenerate( - callbacks, - new LdmlKeyboardGenerator(), - null, - { ...keyboardOptions } - )); - assert.isTrue(callbacks.hasMessage(InfrastructureMessages.ERROR_GenerateRequiresId)); - }); - it('should generate a LDML keyboard project', async function() { assert.isTrue(await unitTestEndpoints.doGenerate( callbacks, new LdmlKeyboardGenerator(), - 'sample', - { ...keyboardOptions, outPath } + { ...keyboardOptions, id: 'sample', outPath } )); // Note: we won't test contents of files as this is tested in kmc-generate directly diff --git a/developer/src/kmc/test/generateLexicalModel.tests.ts b/developer/src/kmc/test/generateLexicalModel.tests.ts index 00b01b489a..47a48098b8 100644 --- a/developer/src/kmc/test/generateLexicalModel.tests.ts +++ b/developer/src/kmc/test/generateLexicalModel.tests.ts @@ -5,20 +5,21 @@ import * as path from 'node:path'; import 'mocha'; import { assert } from 'chai'; -import { LexicalModelGenerator } from '@keymanapp/kmc-generate'; +import { GeneratorOptions, LexicalModelGenerator } from '@keymanapp/kmc-generate'; import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; import { unitTestEndpoints } from '../src/commands/generate.js'; -import { InfrastructureMessages } from '../src/messages/infrastructureMessages.js'; +import { KeymanTargets } from '@keymanapp/common-types'; describe('generateLexicalModel', function() { - const modelOptions = { - icon: true, + const modelOptions: GeneratorOptions = { + // icon: true, // id is written by generate functions + id: '', languageTags: ['en'], name: 'Sample Model', outPath: '.', - targets: 'any', + targets: [KeymanTargets.KeymanTarget.any], version: '1.0', author: 'Keyman', copyright: 'Keyman', @@ -44,32 +45,11 @@ describe('generateLexicalModel', function() { outPath = null; }); - it('should only allow a single id', async function() { - assert.isFalse(await unitTestEndpoints.doGenerate( - callbacks, - new LexicalModelGenerator(), - ['sample1.en.sample','sample2.en.sample'], - { ...modelOptions } - )); - assert.isTrue(callbacks.hasMessage(InfrastructureMessages.ERROR_GenerateRequiresId)); - }); - - it('should require an id parameter', async function() { - assert.isFalse(await unitTestEndpoints.doGenerate( - callbacks, - new LexicalModelGenerator(), - null, - { ...modelOptions } - )); - assert.isTrue(callbacks.hasMessage(InfrastructureMessages.ERROR_GenerateRequiresId)); - }); - it('should generate a lexical model project', async function() { assert.isTrue(await unitTestEndpoints.doGenerate( callbacks, new LexicalModelGenerator(), - 'sample.en.sample', - { ...modelOptions, outPath } + { ...modelOptions, id: 'sample.en.sample', outPath } )); // Note: we won't test contents of files as this is tested in kmc-generate directly From 46fc4d52cf500d8a55fae028729218acc0483fd1 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 11:04:18 +0700 Subject: [PATCH 031/109] feat(developer): add user interface for `kmc copy` to TIKE Adds a new set of 'New Project' dialogs to allow authors to easily copy keyboards from local filesystem, Keyman Cloud (including a keyboard search web page, implemented in keymanapp/keyman.com#536), and directly from a GitHub URL. Adds related documentation. Fixes: #13073 Depends-on: keymanapp/keyman.com#536 --- .../delphi/general/Upload_Settings.pas | 6 + .../windows/delphi/general/utilfiletypes.pas | 24 +- .../clone-github-project-parameters.md | 34 ++ .../clone-keyman-cloud-project-parameters.md | 37 ++ .../context/clone-local-project-parameters.md | 34 ++ developer/docs/help/context/new-project.md | 23 +- .../ui/frmCloneGitHubProjectParameters.png | Bin 0 -> 22860 bytes .../frmCloneKeymanCloudProjectParameters.png | Bin 0 -> 44254 bytes .../ui/frmCloneLocalProjectParameters.png | Bin 0 -> 20202 bytes .../docs/help/images/ui/frmNewProject.png | Bin 44467 -> 9856 bytes .../Keyman.Developer.System.KmcWrapper.pas | 113 ++++-- .../Keyman.Developer.System.HelpTopics.pas | 3 + ...man.Developer.UI.Project.ProjectFileUI.pas | 7 + ...oject.UfrmCloneGitHubProjectParameters.dfm | 156 ++++++++ ...oject.UfrmCloneGitHubProjectParameters.pas | 340 ++++++++++++++++++ ....UfrmCloneKeymanCloudProjectParameters.dfm | 119 ++++++ ....UfrmCloneKeymanCloudProjectParameters.pas | 326 +++++++++++++++++ ...roject.UfrmCloneLocalProjectParameters.dfm | 155 ++++++++ ...roject.UfrmCloneLocalProjectParameters.pas | 262 ++++++++++++++ ...an.Developer.UI.Project.UfrmNewProject.dfm | 18 +- ...an.Developer.UI.Project.UfrmNewProject.pas | 33 +- developer/src/tike/tike.dpr | 7 +- developer/src/tike/tike.dproj | 16 +- 23 files changed, 1669 insertions(+), 44 deletions(-) create mode 100644 developer/docs/help/context/clone-github-project-parameters.md create mode 100644 developer/docs/help/context/clone-keyman-cloud-project-parameters.md create mode 100644 developer/docs/help/context/clone-local-project-parameters.md create mode 100644 developer/docs/help/images/ui/frmCloneGitHubProjectParameters.png create mode 100644 developer/docs/help/images/ui/frmCloneKeymanCloudProjectParameters.png create mode 100644 developer/docs/help/images/ui/frmCloneLocalProjectParameters.png create mode 100644 developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.dfm create mode 100644 developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas create mode 100644 developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.dfm create mode 100644 developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.pas create mode 100644 developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.dfm create mode 100644 developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas diff --git a/common/windows/delphi/general/Upload_Settings.pas b/common/windows/delphi/general/Upload_Settings.pas index d5347f4fb9..bf2051b556 100644 --- a/common/windows/delphi/general/Upload_Settings.pas +++ b/common/windows/delphi/general/Upload_Settings.pas @@ -58,6 +58,8 @@ const URLPath_KeymanDeveloper_KeymanForAndroidDownload = '/go/developer/'+SKeymanVersion+'/android-app'; URLPath_KeymanDeveloper_KeymanForIosDownload = '/go/developer/'+SKeymanVersion+'/ios-app'; + URLPath_KeymanDeveloper_KeyboardSearchForCloneKeymanCloud = '/go/developer/'+SKeymanVersion+'/clone-keyboard'; + URLPath_Support = '/go/'+SKeymanVersion+'/support'; URLPath_Privacy = '/go/'+SKeymanVersion+'/privacy'; URLPath_Privacy_Presentation = '/privacy'; @@ -71,6 +73,10 @@ const UrlPath_RegEx_MatchKeyboardsGo = '^http(?:s)?://keyman(?:-staging)?\.com(?:\.local)?/go/windows/[^/]+/download-keyboards'; // e.g. https://keyman-staging.com/go/windows/14.0/download-keyboards?version=14.0.146.0 + // Cloning keyboards - Keyman Developer + URLSubPath_KeymanDeveloper_Clone_Keyboards = '/keyboards/'; + URLSubPath_KeymanDeveloper_Clone_Keyboards_Custom = '/keyboards/h/'; + function URLPath_PackageDownload(const PackageID, BCP47: string; IsUpdate: Boolean): string; function API_Protocol: string; // = 'https'; diff --git a/common/windows/delphi/general/utilfiletypes.pas b/common/windows/delphi/general/utilfiletypes.pas index 104c10f411..f34be0933d 100644 --- a/common/windows/delphi/general/utilfiletypes.pas +++ b/common/windows/delphi/general/utilfiletypes.pas @@ -1,18 +1,18 @@ (* Name: utilfiletypes Copyright: Copyright (C) SIL International. - Documentation: - Description: + Documentation: + Description: Create Date: 20 Jun 2006 Modified Date: 4 Dec 2006 Authors: mcdurdin - Related Files: - Dependencies: + Related Files: + Dependencies: - Bugs: - Todo: - Notes: + Bugs: + Todo: + Notes: History: 20 Jun 2006 - mcdurdin - Initial version 01 Aug 2006 - mcdurdin - Refactor util functions into multiple units 04 Dec 2006 - mcdurdin - Add XML and HTML filetypes @@ -100,7 +100,15 @@ type end; type - TKeymanProjectType = (kptUnknown, kptBasic, kptLDMLKeyboard, kptImportWindowsKeyboard, kptWordlistLexicalModel); + TKeymanProjectType = ( + kptUnknown, + kptBasic, + kptLDMLKeyboard, + kptImportWindowsKeyboard, + kptWordlistLexicalModel, + kptCloneLocalProject, + kptCloneKeymanCloudProject, + kptCloneGitHubProject); implementation diff --git a/developer/docs/help/context/clone-github-project-parameters.md b/developer/docs/help/context/clone-github-project-parameters.md new file mode 100644 index 0000000000..d2ec5c7aba --- /dev/null +++ b/developer/docs/help/context/clone-github-project-parameters.md @@ -0,0 +1,34 @@ +--- +title: Clone GitHub Project Parameters Dialog +--- + +![Clone GitHub Project Parameters dialog](../images/ui/frmCloneGitHubProjectParameters.png) + +Allows you to clone a project from a GitHub repository, giving the project a +new id, and organizing project files following the +[file layout](/developer/keyboards/) used in the +[Keyman keyboards repository](https://github.com/keymanapp/keyboards). + +Keyboard and lexical model projects can be cloned. + +Projects can also be cloned from the command line with [`kmc copy`](kmc). + +### Parameters + +GitHub URL: +: The full URL to a source project .kpj file to copy, on github.com. + +Destination path +: Specifies the base path where the project folder will be created. + The project folder name will be the keyboard ID. If the folder + already exists, then you will be prompted before Keyman Developer + overwrites files inside it. + +New project ID +: The base filename of the keyboard/model, project and package. This must + conform to the Keyman keyboard or lexical model identifier rules. + +Relocate external files into new project folder +: When selected, if the project references files that are not inside the same + folder as the .kpj file, move these files into an `external` subfolder + diff --git a/developer/docs/help/context/clone-keyman-cloud-project-parameters.md b/developer/docs/help/context/clone-keyman-cloud-project-parameters.md new file mode 100644 index 0000000000..71d1cf8a3a --- /dev/null +++ b/developer/docs/help/context/clone-keyman-cloud-project-parameters.md @@ -0,0 +1,37 @@ +--- +title: Clone Keyman Cloud Project Parameters Dialog +--- + +![Clone Keyman Cloud Project Parameters dialog](../images/ui/frmCloneKeymanCloudProjectParameters.png) + +Allows you to clone a project from Keyman Cloud, giving the project a +new id, and organizing project files following the +[file layout](/developer/keyboards/) used in the +[Keyman keyboards repository](https://github.com/keymanapp/keyboards). + +Projects can also be cloned from the command line with [`kmc copy`](kmc). + +Only keyboard projects can be cloned from Keyman Cloud at this time via this +dialog. Lexical model projects can be cloned from Keyman Cloud via the command +line. + +Search for a keyboard using the standard keyman.com keyboard search in the upper +pane. Once you select a keyboard, and fill in the New Project Details, the OK +button will be enabled to allow you to finish the cloning process. + +### Parameters + +Destination path +: Specifies the base path where the project folder will be created. + The project folder name will be the keyboard ID. If the folder + already exists, then you will be prompted before Keyman Developer + overwrites files inside it. + +New project ID +: The base filename of the keyboard, project and package. This must + conform to the Keyman keyboard identifier rules. + +Relocate external files into new project folder +: When selected, if the project references files that are not inside the same + folder as the .kpj file, move these files into an `external` subfolder + diff --git a/developer/docs/help/context/clone-local-project-parameters.md b/developer/docs/help/context/clone-local-project-parameters.md new file mode 100644 index 0000000000..3b1b5bc2c9 --- /dev/null +++ b/developer/docs/help/context/clone-local-project-parameters.md @@ -0,0 +1,34 @@ +--- +title: Clone Local Project Parameters Dialog +--- + +![Clone Local Project Parameters dialog](../images/ui/frmCloneLocalProjectParameters.png) + +Allows you to clone a project from your local filesystem, giving the project a +new id, and organizing project files following the +[file layout](/developer/keyboards/) used in the +[Keyman keyboards repository](https://github.com/keymanapp/keyboards). + +Keyboard and lexical model projects can be cloned. + +Projects can also be cloned from the command line with [`kmc copy`](kmc). + +### Parameters + +Source project filename +: The full path of the source project .kpj file to copy. + +Destination path +: Specifies the base path where the project folder will be created. + The project folder name will be the keyboard ID. If the folder + already exists, then you will be prompted before Keyman Developer + overwrites files inside it. + +New project ID +: The base filename of the keyboard/model, project and package. This must + conform to the Keyman keyboard or lexical model identifier rules. + +Relocate external files into new project folder +: When selected, if the project references files that are not inside the same + folder as the .kpj file, move these files into an `external` subfolder + diff --git a/developer/docs/help/context/new-project.md b/developer/docs/help/context/new-project.md index 1fd83fcd6f..dbd9af4976 100644 --- a/developer/docs/help/context/new-project.md +++ b/developer/docs/help/context/new-project.md @@ -21,4 +21,25 @@ Creates a keyboard project that matches the folder structure used in the Keyman Creates a lexical model project that matches the folder structure used in the Keyman [lexical models repository](https://github.com/keymanapp/lexical-models) and includes all basic files needed for a lexical model project. Clicking OK will open the [New Lexical Model Project Parameters dialog](new-lm-project-parameters). -The **Basic** and **Import Windows Keyboard** modes can also be driven by command line with [KMConvert](kmconvert). \ No newline at end of file +## Clone local project + +Copies a Keyman keyboard or lexical model project on your local filesystem into +a new folder, giving the project and included files a new name. + +## Clone project from Keyman Cloud + +Copies a Keyman keyboard or lexical model project from keyman.com into a new +folder, giving the project and included files a new name. + +## Clone project from GitHub + +Copies a Keyman keyboard or lexical model project from a GitHub repository into +a new folder, giving the project and included files a new name. + +# Command line access + +[`kmc generate`](kmc) can be used to generate new Keyman keyboards, LDML +keyboards, and Wordlist lexical models from the command line. + +[KMConvert](kmconvert) can also be used to import Windows keyboards from the +command line. diff --git a/developer/docs/help/images/ui/frmCloneGitHubProjectParameters.png b/developer/docs/help/images/ui/frmCloneGitHubProjectParameters.png new file mode 100644 index 0000000000000000000000000000000000000000..71319a3c8a8fbcf1a66dccc5d7c5d1fcce09f3e6 GIT binary patch literal 22860 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 literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/ui/frmCloneKeymanCloudProjectParameters.png b/developer/docs/help/images/ui/frmCloneKeymanCloudProjectParameters.png new file mode 100644 index 0000000000000000000000000000000000000000..a71fd7ed98dda351c2c9251465f950f0ca050c5f GIT binary patch literal 44254 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.RS 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 F{|7)c9)$n^ literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/ui/frmCloneLocalProjectParameters.png b/developer/docs/help/images/ui/frmCloneLocalProjectParameters.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c6e7ac0655a72c36a2aaf5e99f64f8836e3873 GIT binary patch literal 20202 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⁢P$jJGpR{Lad-1J^X?qf>T*<`51z*J}>`p=F2 zY#dtFq`_aa)xMXcuyiFvV0As)CZ~F_@_ocHyjNd$l6I5`Y8f{JPLp{R#sT8U6k~I# zXzCYRWG+Pv+b@A?0N<=Tu#TSUnaoTsa7ldZhheI)y?)vD%SErNyG`MtM`c~=WLYZg zFzdbKKj=!^4<_g&Bql;uY+lc?P&B^k1u_i)2+i-+R8>ECco6mV^-0mjtsL0AOqN~Q z7)XV|ncluW$U+p*hEHWaUT4Y}+>9o6`S7_GG={-2((+(Bzx&O0Aw&-VFKfg6hb;l$ zzq9Qvw(891SAYNh$!*Dppx$=jr)!4z>({R#8G>Hl+z$2krmMu}(|^c6+-{`Wu_YI* z=m7F=A4_`#zuQ4*GjK(}vIV^^mV*fNMWm56_VEMK?-Kt(hH(7XhpBdLJs1?&Fj{~Y z^8d_%7_rF#*C@V*`N;18U@|HyL>lRpKhuU4qf$YBw~RQN*nVePrEBKlp~dv)8?&R| z?=eE{T8@KT|DGoFY|(ucjro)U_OavV|BhDweTx4Fre?8drSs@I7>l6q&k}UfOR?=c zHUB1=%<~D7gndKDH?1kS9NYapE8u}1w{{}!Y-3^{5)$S!%ME34K}F=Ko@lE3`rTf{x6Dc* z6cL0eA;LXI3boe|2Aka~u?)6^3kV_&!BCAeaN4Xo{GtW5%FfM*op{L~SxHfgupQSzL&?jD8)nrS~v{KpTN?O)eZU{kB)3qbEKs&wu}_oo%b#SGgTe&-qxA3osmNQl4o?z}Nk zN<_LaR(Erzqs11bSnf2kBb*R}%bE&j7n?x3Wd6ym8u^VYHxi?>usqigI&07?GRnL@>I?T5``0vV>DD=iB zDQW8(*}~}Tj^8nHxGN#2+H{5dhVeYQo(nDk?x>)SkPlS;;yxa1sj49BOy`39wiVJ5GTm{8}aAhvIQd#>cL5)x<& z=e)tX?JlrIG?9q-^F;Rcc#yS*#0R8wO_A+=N94Xaem)7dK{_AcSar8)imEU#Kklz7 zB;Kmj*eQXU%+Y(2M#JtE3omxJ{vld8{-Nm754+E0uZ(DB_$OS$ko$V=-n{7rJQTp|xm7sb*iOjhPhDbBSR#2=5Bd9;=d2k1E4BRh=U$ac z6uS?0a40>XbS$T&rG53?pYoNPFErltx(Mx;iVZYjW5CCWS^nJ_LeIeP10a06fK*!3 z4XZkLzcG?!RgPcANeet&txi`NhctwTavUtShGPidVVatn!l*87W7m@<@`s}kU3NJL zoiw)V-ZWfdA0(25J3O-89vjO>=wBr8f6h)Le@P>n1cJA$y8vmN!>RGrWOmcFlbck5 z0Em}UG%=O$ZE4-cuKED|QBPtEyxl;C3&tKOfsnXR*|j+PO($kxKG)0WdpL;sl=x?! z*$A~}yL)1yUv^L@@UL%+y4!-#(4HpA!2f>w@!#1A;FGe`kvYr#0XWt;8uF?t4VawI zIXwT7k@l3ht^Q=B2s_}^ZlIH72h`i~OwP^QCrDR;S_b)1zdy3^r;Q{itIcG*Wh z27!JeZGjV32@iIld)C4`kmO72uO?oGPgRZ7{ zo>97#GnfBLz;vH)-4t19aI*_WG7n7W%>nU~^OixG4XuNq3w}0eX8O&Ob0t!Rf$2KK z?^c8kFv>PJ6fSf~Hm42;DF}`tm>z)d>TsZHl%uFuF0#%>WqQ(I&2F*I>Apz8{}uxn z58rY5U(f+GrYu2B1aDEA4TND(5;TA(*k}Kvqb*g8$nd7IS< z_ko=Sv9c=m|1(=V zOJn>U`|rFnDY<1w4M1k2y8pZ zALgkbvmMxqwlJ6=a-@`~_GAM9Kip{>kQ9^*aRrkRypiOc3;fjEW~k0<9d;1m1SdL} zh6~D;j#Qr-qb!~|qQ71j`v@eK1J@5fk5YNhY$jk>kA9Fh6+&GZJ(=(~&C7deNp)*H zPLz_%%T_MQL$-vT9_l_J8i=cUCCqnmC@E>VADE0EpS_jqW;loX* zdqp=ac&!FWTSJ>fYF*xzdutA_JN|I_i=N&tz;GUic8&G;REbcU027O_1!-BGh5~}e zer=uIyL1yeDyrE6-KEEe%lu03bw;DcK|n)*wFWEaSmeQ#D1@A{SvJoRmxWd#xS1Fg@Ru~*}Ej*i2Wu(#R0sHers>K6xaK6A_F+oC0D;db> zp_55~2ys4Tz%tnHY?(0iLC4_VO39f7=e-fgg|4H2M0%1ZLQiLDW;|XsEw7a7sPQEuiAQgqy@aM zFl}sXrdz%08~E1&oh2zFqZ>y-z<)E-Pk$cP^Vfj?IU>e4vLs(!7r=dxCbwI7u`^g+M6+`%0Y97Hv5u*bRDi(YSbpHD) zr+)BCjc~%IMTH!df0n|$g1Go@B(QA9f^Ni4$h^r?{k4YQg+RH;e2(;Ofk>8$>u}4w zpJWoFI;hFwO5aXYC*$T0&02{8dL$qQ&*}=O6^#f*MVo^w(7@#`x3$vlgm429ZWO3p zk}0U*j#a{KA^+Veg{;MWi7_bwuT;!Awdj~RYh{Jd=&YWFz?g;suCGM>F&{?>7FL~w z*GeL9jA$Z6?vZt>HT?5H00g%`UEpK?`Ehd5&&tAFivQo*L#j!dmvWV=RvRoe1MR z=^|m+q=BBuy4Q#DnV7Ob!3{`AK)uU;!_tCZh(ON zMN2zY(-Cy79#xZyKr5>0d?TyDsc0=zX2_wb7s ze`@HMpgaZZNEoYWSg?aZ#4pxj8@dhoRo(^PxVA3IVV@iXocGt_19PF<7$16REcyHu2|-5gBs+q6<@}$_1}%1MHLztDl2YeY+OoiVvMa1D zhg}ZC@}ekH8_IaW5wr3m&;&uUDmwse!UOAc^;L_%eh%$2eCUJxy^5zdGS+^CB{0hx zv2;bZnf#IZFJ+DdmV!6C-y%T`e$b4rGtAC3U$9bq|JoSEsgpVrbxiuBaSW@bd6#v@ z6}@R*+SH}3Kp2x;Lnux@aQ_T~Uabj4!VkjPcp^E2VJaf_aHYOI?Jy|Ogeg8XP+29u z;UXH@O?52YqEcml^Y)fg+i;B7oIPs!Q(Cc@Ac0)_T^9J!Gd^Y-b#+1a4B+FAWnZ9? zNn=eeh*U^VPThj<>QZaY;EREx>UhJ;0Sujr&{jOJSgB#5T)44-T2s)gZl=MZSBY)Y zhJ@i5KLBMfkeu=oL6i0aA+_Q)>X9o`gyI^Js%M6z4o#r_p3V4`O>_Y}?QvOZBt8b# z2>wr#6fO({%rN9Uu-Nb7w*%)mZ}fgp>_xY;h3%&MUI`54q9JTrfN57NWecWKpKQ|z z>7@R0l_m6d{XoU)pMtY+Q`_HI6BDUs;An_1;|=d0)6jxT$r>^?)WhDv%f9Wjqm3Lw z!WOQS+zJV2p&Gpq5I9=C=AyuTlF_5NN{JNm=0cYwgCM#Zr%+1(eEEW7^}|b@xr|ri zx|v;!y)IIEZq@EU6K{717)ay@eHPM_b?R-k{K#ur=qvGDxD9ETD;XkdO3BNxg^>!E z4E%to5+xsZ8J<0TQbo<99;YuqdhaUd$u;E!59M1Ij^mD01zWIJFPyRdaV`Y1Rr4za z;Oub6t<48Ni+*R|2p%O+z_ZWMXQuIk>sQn?pY{R+?x(gm)5VbZ$4w zG!6~p09X$w7Qk_^^l#DuFh4t`m5u{{Z7M4NJA?v5V*kVGl8r4L+r_OSos*Wq+*Yyp-h(j41v{|kPr;=9Kh`lTpqTY65Mo;pMlT08ts^>caI5n zwD1EDfR-o^V8ey{7g&`ZACCv<@~Z$U19l$Zx!ExSXbY$o_3?4Q7|F6@DVkbZq8=W+ zy3C2N3LZ-8d9(~?yVPcrEL#b%V)vIz&_dyR3sqIstUQz3iX%OM;40Uthix?QzNpR| zNKu^Y@w;9MgBf{j3}FlzY;ORtrNL2$ZWN@bto#XZ1^`C`ten>TekhIf-zlmq0XWGY z`>x@TIqi4vo&kOadVKzF6HmcEkd2x-A#U(r&VYRz3qbu1px-F6E^t_qt-{7CPaGXp zt}@qQ1emz3+2b6VF&MBLz()#~oX(TuJCzneQBx3_EM15+Z$e>CWNdYj3zr0e0DioI zSnDf!sC1rkNKf&uF);3|uT9OBbuXctUS`u5r^GHRv&6_#XW$%IGQeD*vu| z5dQ3`RFT@h=%~h5s)B33fNRu6^be1Pm!4rZ>g5r&f_3Q#w=k3e(5UZ_b6>9vy3`4W zzN@th7wspX4@9ozIhYmFgGUET+q0{l|L%Yz={FHJp34u^? zh;%{izZfYnn1|D9zw;ZL8VUJDzFD>ae1|g9EWkz-W}Qh(2{3V#H73xx*VBuXB4> z^F=wDh+`f~eNeP9GNE6YRZ=80&UyIoE3*^^2A!)5cdlg!t;cD<{}(-8)hud#wWj)) zOh9BxvSz-JX@c`N#t^Md01|5ft?SoVZ(>LzN2tVt^&v;oI8*{^wS8eVIC7>yP^je7 zS3@FFp=jjndw(GezUZRpcU*4GjmFO{Zpfhh*%Dl?1hw*-n z^@mJ3J%Aoa6FX9!B+MC@)aq zEIPCWBL1p%U|-3tw`47xKHxln8K+vg0{^^r%UbI1*WH6-TbMw?A6Nn0A<{N%Jc2=|Avz;QuHGdp0IEe)bW>VvCrpEi za$2e17Iu4lLm5*)&%cR(cqu7-U?CGwXz%NXRzjI!hON*?p9i71c#1z|i5w7#2)C{) z9s6ch`486B07ELT#CULvWbWUs8tK9BtN} zD8q8x2z9@A?;8tY;5xSfH)@uKVAg0jLai?U*t`$|6H^LZ5y0@7?;LZ~XB#rn49TZX zR89;BgI&r)hoa?~KCotpp@MAyLPkDtq*`q%yC^Iv28ghjnlLs19e)tWqwx`uRFp%< z19b0I0rV2~1i%E+T0*0p@)9(rvgy#ECXILL)?x5+s@34usYHHYZ~Mn-hqtP&pC2Z4 z+*-w}jzWC<)7y!4bj!@F2)GTb^tvL2IhJ_a`SlsY z#J-@NV|1nx8Lpa5El4ig?idV2hl-Z=hVua{V%p7rK81<|BoQUwiWfl|a@O~!JYHqI zYGf92RLKG%;Qp*RFI*Q&4+MTsSF(o#B49R}tWLaS07a|G4y3{k`W6bb%r8iOX6L#f zF|aRXHzDD(2H4uc;_5dLS2c~`&MDgDf6Q}8yTv$wmr?X;`Hu(fx1?0_8WjOxu-XB7 z$VB~8n<5$BwixNj(=uIbd~;0JE?oXNJYg~ptF%JZGD*@l%he64{6zO$Ok4>KjkNC%E(Qm zhq!TvQ673Z)bfomCpEdj<~!4T0vAB4HtlY@p6BI&<|IL7j!KbRF6k>6kgvg22t765 z(^lLu1b~nlyfBvP|GL_VgbIbb!j$bd%o0srfA(>v=zd9_qZ$IE3oI|g&XKCR%xGEX zw(B#nxN-in3Guw$A56k4lZEi%pG@4?1tuMgRy5*GA!z(qf)ige-Efp%dIrCV(Q6Q< z4toSaNy~nI(5yA4PdVMb(=!0b9hn%CS4| z;4g=$Tfd8ixv;mM08}SJN;0?^aCrP$K`q#@Qqk;) zkhMw>Z_q7NjJxTM!SCZKy?c=)jFBc=?ocJ9KX34&sPo-!DLk|OwwT)F4V!6H zGhVnm;Pix2z}OQvImW4#Z!JuDtnd_y<$IOg?$Booj#;nl^gMk4M=f4=Kd%0)**Ae| z*i$5VoO2>a4){STd~)#ydYL%o(}6`Hk1q;rf0~r?#Ij_)c4R?}^<{C?%3hm?cy^_X zWc|Tx_o~ZEN>b7nZ=qe9(ZNT#wsN3E?mm&Y#`CKCPyWe&l;GM{8WC9U5b_b_npt6* z>G|xEK)0S%6H0{&=XUMnJEbfjg>uCpVvsFg?9b6NGUB-9&o?+c9TK`N)3j!SiL<#4 z39qgY-U61ED74=ll*>QY^*wrQyQ_K~Kp%;m6Eoh*ow0c`!u31no~fecBzh@@0e`(Y zj#Y-VRV(Qpl=oY^Eoog}0nQ|MYM$cB^nC~PMbF*Wdkf7POp{e{kHMXWv|~}gO;j8b z$iRWZ#NRT_UYsZt_-|K8h({xn%hwn-^#v7AqFwonLzIV2X0IFi3P#rXLQkiovo1(Z`i(SBWOeKAN<^$J= zK7pbwb#--nU}LPn{n^+*=GSz$MNus+BG<#k*MH5g&4+E_0Ac~SUcmec_&+}b`s#xl;4>HKam6#@`+0m1g@CkjheULXqEXF#y+`-kQE2pmB! zLIdlZd!PPy)#HEo(vRnWtE7>hy)eK9P=q)Mv@--l3FvWwy|`h`$^bcYXDOhK^S32$ zC})uZh&QTNb+EmZofyJ3cXklKOe+h!zQ6VYa_=MmKV7%^!2WzA4gg}9rPu~I|Az_Q znKJ09ee(kFMhb)jRuy=vnaL#U0CHrQ zm|}mEQ*De9<*X6R^D__FVmTFNA`?{kBB3WOZ=L|+f07IZE1;^fgP}1OiRb{fccWk; zg99C@PAuQdv0nRMNo0*1I_}&6Jd5;PWh8#49MNjUt_q0PO}fR^b%sZQfN{pySXa)J zH*u=dpUK#gA=9av0lXltBMW#_Ih=D`zoX20dx{;OQIH<^OEL{f{)aCX>o|tCVa^{g zL?WA}iu~dcJ-r^`1%G1!(Aou({Lo9xnuoo;S+4_*jq$dDbcsA49NO`f2CG{RxSGuy zgxx=U67J?T&^tro_q9(v%gU{%sL3H^spjDf@@!}l% z!fK$g@r>dLuo;hH2Fn?Mx?n1?$o}zm8{$s~)I#4nbF-%&rr11!1c6+L7ti9M0KL?h z`sIPK3gcmrHPD$`1kgdGYX7xMI+#mu-Jaxx>rJ!NI4D8uP^7 zXq8t;vtPXT>17%S{ZY%d4&1F%A(n@dv{2+q1h5#~b0iWJE|0{dmHBg(ypm(W_pOGC znH2_>q!OzYN7o}B_cmP-gY2IrecFnV8DRvBpQlh; z$X0j?6gal6swzW}YcqfD8tw=jd&r0yZNgSuQGJH%%wB($KdD|4S}X!JeN*zHVsre^!I|^CL?r0KbSqr|y{0 zZeNgRPqZH7BHd%1m1+L%XlOPr<%eYinxDQ{J`jJ1ZS z1f}fSQG@XdH<6+&aHas$T)OZ211FD=ngcK!I7Lc_hhtdR55Wa~mTCKNf#o|g=ZyC< zQNHtIE7UATdyQsmn|TKUaqcj63}E&;R_z# zr(EL@_$JNQmE}ExhMvMZw_guJl$IiIOw}twqeTwtE_}H@cnYF*^Fzuie>RYXB~KZ9 zw3Fzudtg*TyPL>}YVOC|$SiMjy%w=!@Brn9ll}GS`E#p~)o{(>!NvcRn)Q%e42Uw8 z*?*gJge*f)>kf+4zvZk@KVOb;I-vk*^PS#AEq+X+inD?^`+ZcWTf%SO=%aIIFW<8e z*9eoa2T`eEB~j9?^nDf#MFwN^E;^7(6)%G@1&B?6uze=L4Rl8G-c-DT_PkWkg+*; zl;-JI>htO5F7yL~wNhrC!K;OazG^Ta*PO@MB&j@}l?o2MB8%6`T&etkjlgQ|QKA^Y zTEochQrr#}3FVxtK8p{~ zq&Y>Lo!q(%`u6rQ?CqAnN3wgPOh|VfuT1jfm&&8`e{*tm=c89p&O9{d+vpf z#R}X9DW@lTV#zY7d_wRr#NZn^Z+o9PQdJMdB0zjKjVUw8->nEyS|0lU#GI9LSRsR>AQz9ep5i zM_5;AhemZ66BQy3)xX1h9*Ak-rT@1NC-*bOo`T$x^q#K5f~QZ}Ah_S5-h_^zgL1zS=}KrV9s{+y=LD}ly1y9`Sns(q%nG*tuZ5b z)n-D&MR#A9n_7J;Vye@bRPI*0Y!{0hODHZTA7&c8iA)A2%aaZ53Nvj>_E7-lSy~^m zwjDq`7x<$antaKy{9yefRevx$-y2EsfnDH_-Sehy=hlifrYf|biOj>NrcMA8kVtR2Kbbx9)4y-D+#yxVJL0La6G4Zk&Ekf}%es-U8klDqxSwhv^ACe~H zeypVwdwB>(Ku3xyt?UKGi+#~sZAQtddV{RIy>%@uEn)r^z^Z9Q3siD~HP^wR}*w8Io2Z~7i5 zpK0&r{GwDZGzJEEaYAj#*vNocSXFW&xWuZDA$FZ%V6J{#)^nO*e!us(A^Rh3GD74Z zytYSQeg&-dRo*BnZG1&Oa8GlCdCTlzHK@W6FC?WOZi8icVK4KKFaCUtkg2$KsJYVE$w*CQL7 zj*ZLzAQ1u@{{L0TxyLiP$8nsT=!THxI=3XZ6j^dxb(E|!Dyf9XX&f&_u7_Bq3za68 zOImW*t5D_^n-L>~#L2Z`%H=S#Xk*6C@7Z)tuXA4Kb^hLK&+~h}&+~kr-|zEze}1WZ z9;EUxg6QMAJO`7`VgE2g;Y3@;@91}}nQkntR|#ZZ;B-o$kxL~j6H4-In*~^V)B#tI z>Z%LS8h-DV%43mdssu1tL)XOtW? zA&a_5bC(wYelgqbrg5BwIXO+uJd`ytZ9$-ZI~H0Kt8T1l+4ldL;QS8n#54FMH-(n& ztJ(Cj9+WWQd5HNT=kVE40hsi8)BjG$|8*MP69^IQo1;}F+Mvf_G%nw|mLTyQprBND zvT`0}w4t4;D<7(O=Eoo%!zx55i-XjiMZN2-`Sdb?&voQ-XoM}*^ZWsur>wk=DvHXq zYd=St87uL;Vn=dKx!aNsZ#>jG(KN#i9Bh$E!J)C-&iwrRy>?A()hbZtfy&_Z&?*Om zTs-Zv)|B4~6O7HClvKlC{#}PfiOlhYWbz@J)Aj15FXO%jw&?Ms3X3|Ru+MZIM-MmY zqz`-q*eo88e+pJm^78Uv1qBOD>!W2sY0fmaZQ*JZSBfnN*>ROxSRY%__4Ey3%bDnY z2JCKmDUjZQsqA2Y5W=MhGQ(QS@G?`6O29D+u-gqw-PRRcA)3w-JNkjjt^@0wx>1YmvhVf-UkR{ zynA9KRj-DU#5%lW!HTHKYfZ2%dE$n7q`K7nSODTt{p$-$g$3IXK_WR(>UgE(E&Eg6 zoJ8lP3Ko*Ri0I9@RT!hWOk<~y_X0bJHDQN{1Au|11q9g`W$lg}g28_FRxwkyl3*|; zTgN^(a#ML?3U_iatlO2HCcP7}Q;I>p7b>bS_z|i(LPR*C5Nc-1V7DkGMcp~vG1Tz- z0g)OrsfXNa??ddeMeFw~P)@e>*>5%Y@?@`KXi4Cj&zU>^lr}J$wns+IZw{Osij>;Mw8D!k47%KqXb@mffE>` zpNd8RY8Q~s9vzvUyh`DyWMamK2gTKD#0(l%qcj<+wzek-PS*N5t*`q+PZI5|V!e)0 zvc0SZNR(zFEWP+BV9LP%M0q__ysW*q-HG>=@~6mGiL=Y^q_}fV|FsTqeL8+}T~N>?S7vG@dR_^K9_Xx`6=| z;7jVm1!pZ`JX`n*jxkd&hpqt}(>D&5&pBqCS`U~VsOs3|G3>3zky`Xp7uuu!iB(Uj zZ}KT==mF^{n;EJVgT@BNDn)0RMRD`6N@z>g4c<|>wzmJ$r@z zIVS_R47&>aMvvfN`9Grcd)b&o=EBXFGM>N^<@3dZweHo0_pj;pAhWF1^$e0*v|)bc z3v7+S+4UY;_3=ds3B2XB__!V7X&T}{`cFuZ1ufGPTooACW_ZNZ&fk1&?be>%z8R`H bUo5Q7|4^=X1_JC)Ct`QN-llN>x$A!dL}i1< literal 0 HcmV?d00001 diff --git a/developer/docs/help/images/ui/frmNewProject.png b/developer/docs/help/images/ui/frmNewProject.png index 8fc13cd763f254ccb1c869525f0efd630bd38ddc..1c41529b1d47047a9ef55e005a6076376821dbc1 100644 GIT binary patch literal 9856 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 XP{USlc3gIX0sNgYwJ~{Oj7#`GM6f1u diff --git a/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas b/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas index 24c070a5e8..09069b130e 100644 --- a/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas +++ b/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas @@ -1,20 +1,30 @@ +(* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Wrapper functions for the kmc command line tool + *) unit Keyman.Developer.System.KmcWrapper; interface uses - Keyman.Developer.System.Project.ProjectFile; + Keyman.Developer.System.Project.ProjectFile, + utilexecute; type TKmcWrapper = class + private + function Run(const parameters: TArray; const path, logFilename: string; Callback: TUtilExecuteCallbackEvent): Boolean; public - function Compile(ProjectFile: TProjectFile; const infile, outfile: string; debug: Boolean): Boolean; + function Compile(ProjectFile: TProjectFile; const infile, outfile: string; debug: Boolean; Callback: TUtilExecuteCallbackEvent = nil): Boolean; + function Copy(const source, dest, cwd: string; relocateExternal: Boolean; Callback: TUtilExecuteCallbackEvent = nil): Boolean; end; const // TODO: these are still used for messages raised from the IDE, perhaps need to be factored out CERR_ERROR = $00004000; CERR_WARNING = $00002000; + CERR_INFO = $00000000; implementation @@ -24,8 +34,8 @@ uses Keyman.Developer.System.Project.Project, Keyman.Developer.System.Project.ProjectLog, - Keyman.Developer.System.KeymanDeveloperPaths, - utilexecute; + Keyman.Developer.UI.Project.ProjectFileUI, + Keyman.Developer.System.KeymanDeveloperPaths; { TKmcWrapper } @@ -33,9 +43,71 @@ function TKmcWrapper.Compile( ProjectFile: TProjectFile; const infile: string; const outfile: string; - debug: Boolean + debug: Boolean; + Callback: TUtilExecuteCallbackEvent ): Boolean; var + cmdline: TArray; +begin + cmdline := [ + 'build', + '--log-format', 'tsv', + '--log-level', 'info', + infile + ]; + + if outfile <> '' then + cmdline := cmdline + ['--out-file', outfile]; + + if Assigned(FGlobalProject) and (FGlobalProject.Options.CompilerWarningsAsErrors) then + cmdline := cmdline + ['--compiler-warnings-as-errors'] + else + cmdline := cmdline + ['--no-compiler-warnings-as-errors']; + + if FGlobalProject.Options.WarnDeprecatedCode then + cmdline := cmdline + ['--no-warn-deprecated-code']; + + if debug then + cmdline := cmdline + ['--debug']; + + Result := Run(cmdline, ExtractFileDir(infile), infile, Callback); +end; + +function TKmcWrapper.Copy(const source, dest, cwd: string; + relocateExternal: Boolean; + Callback: TUtilExecuteCallbackEvent): Boolean; +var + destFilename, destPath: string; + cmdline: TArray; +begin + if not dest.EndsWith('.kpj') then + raise Exception.Create('Invalid destination "'+dest+'" for TKmcWrapper.copy: must be a filename ending in .kpj'); + destFilename := ChangeFileExt(ExtractFileName(dest), ''); + destPath := ExtractFileDir(dest); + if ExtractFileName(destPath) <> destFilename then + raise Exception.Create('Invalid destination "'+dest+'" for TKmcWrapper.copy: filename must match target folder name'); + + cmdline := [ + 'copy', + '--out-path', destPath, + '--log-format', 'tsv', + '--log-level', 'info', + source + ]; + + if relocateExternal then + cmdline := cmdline + ['--relocate-external']; + + Result := Run(cmdline, cwd, dest, Callback); +end; + +function TKmcWrapper.Run( + const parameters: TArray; + const path, logFilename: string; + Callback: TUtilExecuteCallbackEvent +): Boolean; +var + param: string; s: TStringList; logtext, cmdline: string; ec: Integer; @@ -53,26 +125,23 @@ begin // TODO: log-level as opt? // TODO: embed in server for better performance - cmdline := Format('"%s" build --log-format tsv --log-level info "%s"', [TKeymanDeveloperPaths.KmcPath, infile]); - if outfile <> '' then - cmdline := cmdline + Format(' --out-file "%s"', [outfile]); - if FGlobalProject.Options.CompilerWarningsAsErrors then - cmdline := cmdline + ' --compiler-warnings-as-errors' - else - cmdline := cmdline + ' --no-compiler-warnings-as-errors'; - if FGlobalProject.Options.WarnDeprecatedCode then - cmdline := cmdline + ' --no-warn-deprecated-code'; - if debug then - cmdline := cmdline + ' --debug'; + cmdline := '"'+TKeymanDeveloperPaths.KmcPath+'"'; + for param in parameters do + begin + cmdline := cmdline + ' "'+param+'"'; + end; - Result := TUtilExecute.Console(cmdline, ExtractFileDir(infile), logtext, ec); + // Log the precise command line used + LogMessage(plsInfo, logFilename, cmdline, CERR_INFO, 0); + + Result := TUtilExecute.Console(cmdline, path, logtext, ec, Callback); logtext := UTF8ToString(AnsiString(logtext)); if not Result then begin - FGlobalProject.Log(plsError, infile, - Format('Compiler failed to start with error %d: %s', [GetLastError, SysErrorMessage(GetLastError)]), CERR_ERROR, 0); + LogMessage(plsError, logFilename, + Format('kmc failed to start with error %d: %s', [GetLastError, SysErrorMessage(GetLastError)]), CERR_ERROR, 0); end; Result := Result and (ec = 0); @@ -101,7 +170,7 @@ begin else if msgType = 'warn' then begin state := plsWarning; - if FGlobalProject.Options.CompilerWarningsAsErrors then + if Assigned(FGlobalProject) and FGlobalProject.Options.CompilerWarningsAsErrors then Result := False; end else if msgType = 'error' then @@ -116,10 +185,10 @@ begin end else // assume msgType = 'info' (fine also for 'verbose', 'debug') state := plsInfo; - FGlobalProject.Log(state, msgFilename, msgText, msgCode, msgLine); + LogMessage(state, msgFilename, msgText, msgCode, msgLine); end else - FGlobalProject.Log(plsInfo, infile, line, 0, 0); + LogMessage(plsInfo, logFilename, line, 0, 0); end; finally s.Free; diff --git a/developer/src/tike/help/Keyman.Developer.System.HelpTopics.pas b/developer/src/tike/help/Keyman.Developer.System.HelpTopics.pas index 3e150aa42c..3b9301768e 100644 --- a/developer/src/tike/help/Keyman.Developer.System.HelpTopics.pas +++ b/developer/src/tike/help/Keyman.Developer.System.HelpTopics.pas @@ -7,6 +7,9 @@ const SHelpTopic_Context_BitmapEditorText = 'context/keyboard-editor#toc-icon-tab'; SHelpTopic_Context_CharacterMap = 'context/character-map'; SHelpTopic_Context_CharacterIdentifier = 'context/character-identifier'; + SHelpTopic_Context_CloneGitHubProjectParameters = 'context/clone-github-project-parameters'; + SHelpTopic_Context_CloneKeymanCloudProjectParameters = 'context/clone-keyman-cloud-project-parameters'; + SHelpTopic_Context_CloneLocalProjectParameters = 'context/clone-local-project-parameters'; SHelpTopic_Context_Debug = 'context/debug'; SHelpTopic_Context_LdmlDebug = 'context/ldml-debug'; SHelpTopic_Context_LdmlEditor = 'context/ldml-editor'; diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.ProjectFileUI.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.ProjectFileUI.pas index ee5c4cb126..dccd28a650 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.ProjectFileUI.pas +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.ProjectFileUI.pas @@ -83,6 +83,8 @@ type TProjectFileUIClass = class of TProjectFileUI; +procedure LogMessage(AState: TProjectLogState; Filename, Msg: string; MsgCode, line: Integer); + implementation uses @@ -181,6 +183,11 @@ begin frmMessages.Add(AState, Filename, Msg, MsgCode, line); end; +procedure LogMessage(AState: TProjectLogState; Filename, Msg: string; MsgCode, line: Integer); +begin + frmMessages.Add(AState, Filename, Msg, MsgCode, line); +end; + procedure TProjectUI.Refresh; begin if State = psReady then diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.dfm b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.dfm new file mode 100644 index 0000000000..89c3317276 --- /dev/null +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.dfm @@ -0,0 +1,156 @@ +inherited frmCloneGitHubProjectParameters: TfrmCloneGitHubProjectParameters + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'Clone Project from GitHub' + ClientHeight = 269 + ClientWidth = 601 + Position = poScreenCenter + ExplicitWidth = 607 + ExplicitHeight = 298 + PixelsPerInch = 96 + TextHeight = 13 + object cmdOK: TButton + Left = 441 + Top = 236 + Width = 73 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + TabOrder = 2 + OnClick = cmdOKClick + ExplicitLeft = 449 + ExplicitTop = 218 + end + object cmdCancel: TButton + Left = 520 + Top = 236 + Width = 73 + Height = 25 + Anchors = [akRight, akBottom] + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 3 + ExplicitLeft = 528 + ExplicitTop = 218 + end + object gbNewProjectDetails: TGroupBox + Left = 9 + Top = 103 + Width = 584 + Height = 129 + Caption = 'New Project Details' + TabOrder = 1 + object lblFileName: TLabel + Left = 16 + Top = 24 + Width = 76 + Height = 13 + Caption = '&New project ID:' + FocusControl = editKeyboardID + end + object lblProjectFilename: TLabel + Left = 16 + Top = 102 + Width = 101 + Height = 13 + Caption = 'New project &filename' + FocusControl = editProjectFilename + end + object lblPath: TLabel + Left = 16 + Top = 75 + Width = 83 + Height = 13 + Caption = 'Destination &path:' + FocusControl = editPath + end + object editKeyboardID: TEdit + Left = 148 + Top = 21 + Width = 205 + Height = 21 + TabOrder = 0 + OnChange = editKeyboardIDChange + end + object editProjectFilename: TEdit + Left = 148 + Top = 99 + Width = 429 + Height = 21 + TabStop = False + ParentColor = True + ReadOnly = True + TabOrder = 4 + OnChange = editKeyboardIDChange + end + object cmdBrowse: TButton + Left = 504 + Top = 72 + Width = 73 + Height = 21 + Caption = '&Browse...' + TabOrder = 3 + OnClick = cmdBrowseClick + end + object editPath: TEdit + Left = 148 + Top = 72 + Width = 350 + Height = 21 + TabOrder = 2 + OnChange = editPathChange + end + object chkRelocateExternal: TCheckBox + Left = 148 + Top = 48 + Width = 257 + Height = 17 + Caption = 'Relocate &external files into new project folder' + TabOrder = 1 + end + end + object gbSourceProjectDetails: TGroupBox + Left = 8 + Top = 8 + Width = 585 + Height = 89 + Caption = 'Source Project' + TabOrder = 0 + object Label1: TLabel + Left = 17 + Top = 19 + Width = 58 + Height = 13 + Caption = 'GitHub URL:' + FocusControl = editGitHubURL + end + object Label2: TLabel + Left = 17 + Top = 43 + Width = 512 + Height = 13 + Caption = + 'A URL to a GitHub repository (or subfolder within a repository) ' + + 'that matches the Keyman project file layout' + end + object Label3: TLabel + Left = 17 + Top = 62 + Width = 420 + Height = 13 + Caption = + 'e.g. https://github.com/keyman-keyboards/khmer_angkor/tree/main/' + + 'khmer_angkor.kpj' + end + object editGitHubURL: TEdit + Left = 149 + Top = 16 + Width = 428 + Height = 21 + TabOrder = 0 + OnChange = editPathChange + end + end +end diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas new file mode 100644 index 0000000000..7207214ab8 --- /dev/null +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas @@ -0,0 +1,340 @@ +(* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Parameters dialog for cloning a project from a GitHub repo + *) +unit Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters; + +interface + +uses + System.Classes, + System.SysUtils, + System.UITypes, + System.Variants, + Winapi.Messages, + Winapi.Windows, + Vcl.CheckLst, + Vcl.Controls, + Vcl.Dialogs, + Vcl.ExtCtrls, + Vcl.Forms, + Vcl.Graphics, + Vcl.Grids, + Vcl.StdCtrls, + + kpsfile, + PackageInfo, + UfrmTike, + UKeymanTargets, + UfrmDownloadProgress, + utilfiletypes, + Browse4Folder; + +type + TfrmCloneGitHubProjectParameters = class(TTikeForm) + cmdOK: TButton; + cmdCancel: TButton; + gbNewProjectDetails: TGroupBox; + lblFileName: TLabel; + lblProjectFilename: TLabel; + editKeyboardID: TEdit; + editProjectFilename: TEdit; + lblPath: TLabel; + cmdBrowse: TButton; + editPath: TEdit; + chkRelocateExternal: TCheckBox; + gbSourceProjectDetails: TGroupBox; + Label1: TLabel; + editGitHubURL: TEdit; + Label2: TLabel; + Label3: TLabel; + procedure cmdOKClick(Sender: TObject); + procedure editSourceProjectFilenameChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure editVersionChange(Sender: TObject); + procedure editPathChange(Sender: TObject); + procedure editKeyboardIDChange(Sender: TObject); + procedure cmdBrowseClick(Sender: TObject); + private + dlgBrowse: TBrowse4Folder; + frmDownloadProgress: TfrmDownloadProgress; + function GetBasePath: string; + function GetKeyboardID: string; + function Validate: Boolean; + procedure EnableControls; + procedure SetKeyboardID(const Value: string); + procedure UpdateProjectFilename; + function GetProjectFilename: string; + function GetSourceProjectFilename: string; + function GetRelocateExternal: Boolean; + procedure DownloadCallback(Owner: TfrmDownloadProgress; var Result: Boolean); + procedure DownloadWrapperCallback(var Cancelled: Boolean); + protected + function GetHelpTopic: string; override; + public + property BasePath: string read GetBasePath; + property KeyboardID: string read GetKeyboardID write SetKeyboardID; + property ProjectFilename: string read GetProjectFilename; + property SourceProjectFilename: string read GetSourceProjectFilename; + property RelocateExternal: Boolean read GetRelocateExternal; + end; + +function ShowCloneGitHubProjectParameters(Owner: TComponent): Boolean; + +implementation + +uses + System.Net.UrlClient, + System.RegularExpressions, + Vcl.ComCtrls, + + KeymanDeveloperOptions, + Keyman.Developer.System.KmcWrapper, + Keyman.Developer.System.HelpTopics, + Keyman.Developer.System.Project.Project, + Keyman.Developer.System.Project.ProjectFile, + Keyman.System.KeyboardUtils, + UfrmMain; + +{$R *.dfm} + +function ShowCloneGitHubProjectParameters(Owner: TComponent): Boolean; +var + f: TfrmCloneGitHubProjectParameters; + path: string; + p: TfrmDownloadProgress; +begin + f := TfrmCloneGitHubProjectParameters.Create(Owner); + try + Result := f.ShowModal = mrOk; + if not Result then + Exit; + + path := ExtractFileDir(f.BasePath); + if not ForceDirectories(path) then + begin + ShowMessage('Unable to create path "'+path+'": '+SysErrorMessage(GetLastError)); + Exit; + end; + + p := TfrmDownloadProgress.Create(Owner); + try + p.Callback := f.DownloadCallback; + p.progress.Style := pbstMarquee; + Result := p.ShowModal = mrOk; + finally + p.Free; + end; + finally + f.Free; + end; +end; + +{ TfrmCloneGitHubProjectParameters } + +procedure TfrmCloneGitHubProjectParameters.DownloadWrapperCallback(var Cancelled: Boolean); +begin + Application.ProcessMessages; + Cancelled := frmDownloadProgress.Cancel; +end; + +procedure TfrmCloneGitHubProjectParameters.DownloadCallback( + Owner: TfrmDownloadProgress; var Result: Boolean); +var + wrapper: TKmcWrapper; + path: string; +begin + Result := False; + path := ExtractFileDir(Self.BasePath); + + Update; + frmDownloadProgress := Owner; + wrapper := TKmcWrapper.Create; + try + if wrapper.Copy(Self.SourceProjectFilename, Self.ProjectFilename, path, Self.RelocateExternal, DownloadWrapperCallback) then + begin + frmKeymanDeveloper.OpenProject(Self.ProjectFilename); + Result := True; + end; + finally + wrapper.Free; + end; + frmDownloadProgress := nil; +end; + +procedure TfrmCloneGitHubProjectParameters.FormCreate(Sender: TObject); +begin + inherited; + editPath.Text := FKeymanDeveloperOptions.DefaultProjectPath; + + dlgBrowse := TBrowse4Folder.Create(Self); + dlgBrowse.InitialDir := editPath.Text; + dlgBrowse.Options := [OnlySelectFileSysDir, ShowEditBox, UseNewDialogStyle]; + dlgBrowse.Root := Desktop; + dlgBrowse.Title := 'Select folder to save project to'; + + EnableControls; +end; + +procedure TfrmCloneGitHubProjectParameters.cmdBrowseClick(Sender: TObject); +begin + dlgBrowse.InitialDir := editPath.Text; + + if dlgBrowse.Execute and (dlgBrowse.FileName <> '') then + editPath.Text := ExcludeTrailingPathDelimiter(dlgBrowse.FileName); +end; + +procedure TfrmCloneGitHubProjectParameters.cmdOKClick(Sender: TObject); +begin + if Validate then + ModalResult := mrOk; +end; + +procedure TfrmCloneGitHubProjectParameters.editKeyboardIDChange(Sender: TObject); +begin + UpdateProjectFilename; + EnableControls; +end; + +procedure TfrmCloneGitHubProjectParameters.editSourceProjectFilenameChange(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmCloneGitHubProjectParameters.editPathChange(Sender: TObject); +begin + UpdateProjectFilename; + EnableControls; +end; + +procedure TfrmCloneGitHubProjectParameters.editVersionChange(Sender: TObject); +begin + EnableControls; +end; + +function IsValidGitHubProjectURL(const uri: string): Boolean; +const + // From github-urls.ts (minor RE tweaks to match required format for PCRE + + {** + * Matches only a GitHub permanent raw URI with a commit hash, without any other + * components; note hash is called branch to match other URI formats + *} + GITHUB_STABLE_SOURCE = '^https:\/\/github\.com\/(?[a-zA-Z0-9-]+)\/(?[\w\.-]+)\/raw\/(?[a-f0-9]{40})\/(?.+)$'; + + {** + * Matches any GitHub git resource raw 'user content' URI which can be + * translated to a permanent URI with a commit hash + *} + GITHUB_RAW_URI = '^https:\/\/raw\.githubusercontent\.com\/(?[a-zA-Z0-9-]+)\/(?[\w\.-]+)\/(?:refs\/(?:heads|tags)\/)?(?[^\/]+)\/(?.+)$'; + + {** + * Matches any GitHub git resource raw URI which can be translated to a + * permanent URI with a commit hash + *} + GITHUB_URI = '^https:\/\/github\.com\/(?[a-zA-Z0-9-]+)\/(?[\w\.-]+)\/(?:raw|blob|tree)\/(?:refs\/(?:heads|tags)\/)?(?[^\/]+)\/(?.+)$'; + + {** + * Matches any GitHub git resource raw URI which can be translated to a + * permanent URI with a commit hash, with the http[s] protocol optional, for + * matching user-supplied URLs. groups are: `owner`, `repo`, `branch`, and + * `path`. + *} + GITHUB_URI_OPTIONAL_PROTOCOL = '^(?:http(?:s)?:\/\/)?github\.com\/(?[a-zA-Z0-9-]+)\/(?[\w\.-]+)(?:\/(?:(?:raw|blob|tree)\/(?:refs\/(?:heads|tags)\/)?(?[^\/]+)\/(?.*))?)?$'; + +var + opt: TRegEx; + raw: TRegEx; +begin + opt := TRegEx.Create(GITHUB_URI_OPTIONAL_PROTOCOL); + raw := TRegEx.Create(GITHUB_RAW_URI); + + Result := opt.IsMatch(uri) or raw.IsMatch(uri); +end; + +procedure TfrmCloneGitHubProjectParameters.EnableControls; +var + e: Boolean; +begin + e := + IsValidGitHubProjectURL(editGitHubURL.Text) and + (Trim(editPath.Text) <> '') and + (Trim(editKeyboardID.Text) <> '') and + TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + + cmdOK.Enabled := e; +end; + +function TfrmCloneGitHubProjectParameters.GetBasePath: string; +begin + Result := Trim(editPath.Text); +end; + +function TfrmCloneGitHubProjectParameters.GetHelpTopic: string; +begin + Result := SHelpTopic_Context_CloneGitHubProjectParameters; +end; + +function TfrmCloneGitHubProjectParameters.GetKeyboardID: string; +begin + Result := Trim(LowerCase(editKeyboardID.Text)); +end; + +function TfrmCloneGitHubProjectParameters.GetProjectFilename: string; +begin + Result := editProjectFilename.Text; +end; + +function TfrmCloneGitHubProjectParameters.GetRelocateExternal: Boolean; +begin + Result := chkRelocateExternal.Checked; +end; + +function TfrmCloneGitHubProjectParameters.GetSourceProjectFilename: string; +begin + Result := editGitHubURL.Text; +end; + +function TfrmCloneGitHubProjectParameters.Validate: Boolean; +var + ProjectFolder: string; +begin + Result := TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + + if Result then + begin + if not DirectoryExists(editPath.Text) then + begin + if MessageDlg('The target folder '+editPath.Text+' does not exist. Create it now?', mtConfirmation, mbOkCancel, 0) = mrCancel then + Exit(False); + end; + + ProjectFolder := IncludeTrailingPathDelimiter(editPath.Text) + editKeyboardID.Text; + if DirectoryExists(ProjectFolder) then + begin + if MessageDlg('The project folder '+ProjectFolder+' already exists. Are you sure you want to overwrite it?', mtWarning, + mbOkCancel, 0) = mrCancel then + Exit(False); + end; + end; +end; + +procedure TfrmCloneGitHubProjectParameters.SetKeyboardID(const Value: string); +begin + editKeyboardID.Text := Value; + EnableControls; +end; + +procedure TfrmCloneGitHubProjectParameters.UpdateProjectFilename; +begin + editProjectFilename.Text := + IncludeTrailingPathDelimiter(BasePath) + + KeyboardID + PathDelim + + KeyboardID + Ext_ProjectSource; + // Scroll to the end of the control to show the filename + editProjectFilename.Perform(EM_SETSEL, Length(editProjectFilename.Text), Length(editProjectFilename.Text)); + editProjectFilename.Perform(EM_SCROLLCARET, 0, 0); +end; + +end. diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.dfm b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.dfm new file mode 100644 index 0000000000..fb286bccc3 --- /dev/null +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.dfm @@ -0,0 +1,119 @@ +inherited frmCloneKeymanCloudProjectParameters: TfrmCloneKeymanCloudProjectParameters + BorderIcons = [biSystemMenu, biMaximize] + Caption = 'Clone Project from Keyman Cloud' + ClientHeight = 506 + ClientWidth = 840 + Position = poScreenCenter + ExplicitWidth = 856 + ExplicitHeight = 545 + PixelsPerInch = 96 + TextHeight = 13 + object cmdOK: TButton + Left = 680 + Top = 473 + Width = 73 + Height = 25 + Anchors = [akRight, akBottom] + Caption = 'OK' + Default = True + TabOrder = 2 + OnClick = cmdOKClick + end + object cmdCancel: TButton + Left = 759 + Top = 473 + Width = 73 + Height = 25 + Anchors = [akRight, akBottom] + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 3 + end + object panWebHost: TPanel + Left = 0 + Top = 0 + Width = 842 + Height = 334 + Anchors = [akLeft, akTop, akRight, akBottom] + BevelOuter = bvNone + TabOrder = 0 + end + object gbNewProjectDetails: TGroupBox + Left = 8 + Top = 340 + Width = 823 + Height = 129 + Anchors = [akLeft, akRight, akBottom] + Caption = 'New Project Details' + TabOrder = 1 + object lblFileName: TLabel + Left = 16 + Top = 24 + Width = 76 + Height = 13 + Caption = '&New project ID:' + FocusControl = editKeyboardID + end + object lblProjectFilename: TLabel + Left = 16 + Top = 102 + Width = 101 + Height = 13 + Caption = 'New project &filename' + FocusControl = editProjectFilename + end + object lblPath: TLabel + Left = 16 + Top = 75 + Width = 83 + Height = 13 + Caption = 'Destination &path:' + FocusControl = editPath + end + object editKeyboardID: TEdit + Left = 148 + Top = 21 + Width = 205 + Height = 21 + TabOrder = 0 + OnChange = editKeyboardIDChange + end + object editProjectFilename: TEdit + Left = 148 + Top = 99 + Width = 669 + Height = 21 + TabStop = False + ParentColor = True + ReadOnly = True + TabOrder = 4 + OnChange = editKeyboardIDChange + end + object cmdBrowse: TButton + Left = 744 + Top = 72 + Width = 73 + Height = 21 + Caption = '&Browse...' + TabOrder = 3 + OnClick = cmdBrowseClick + end + object editPath: TEdit + Left = 148 + Top = 72 + Width = 590 + Height = 21 + TabOrder = 2 + OnChange = editPathChange + end + object chkRelocateExternal: TCheckBox + Left = 148 + Top = 48 + Width = 257 + Height = 17 + Caption = 'Relocate &external files into new project folder' + TabOrder = 1 + end + end +end diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.pas new file mode 100644 index 0000000000..557fd24ec2 --- /dev/null +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.pas @@ -0,0 +1,326 @@ +(* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Parameters dialog for cloning a project from Keyman Cloud + *) +unit Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters; + +interface + +uses + System.Classes, + System.SysUtils, + System.UITypes, + System.Variants, + Winapi.Messages, + Winapi.Windows, + Vcl.CheckLst, + Vcl.Controls, + Vcl.Dialogs, + Vcl.ExtCtrls, + Vcl.Forms, + Vcl.Graphics, + Vcl.Grids, + Vcl.StdCtrls, + + kpsfile, + PackageInfo, + UfrmTike, + UKeymanTargets, + UfrmDownloadProgress, + utilfiletypes, + Browse4Folder, + Keyman.UI.UframeCEFHost; + +type + TfrmCloneKeymanCloudProjectParameters = class(TTikeForm) + cmdOK: TButton; + cmdCancel: TButton; + panWebHost: TPanel; + gbNewProjectDetails: TGroupBox; + lblFileName: TLabel; + lblProjectFilename: TLabel; + editKeyboardID: TEdit; + editProjectFilename: TEdit; + lblPath: TLabel; + cmdBrowse: TButton; + editPath: TEdit; + chkRelocateExternal: TCheckBox; + procedure cmdOKClick(Sender: TObject); + procedure editSourceProjectFilenameChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure editVersionChange(Sender: TObject); + procedure editPathChange(Sender: TObject); + procedure editKeyboardIDChange(Sender: TObject); + procedure cmdBrowseClick(Sender: TObject); + private + cef: TframeCEFHost; + dlgBrowse: TBrowse4Folder; + FKeymanID: string; + frmDownloadProgress: TfrmDownloadProgress; + function GetBasePath: string; + function GetKeyboardID: string; + function Validate: Boolean; + procedure EnableControls; + procedure SetKeyboardID(const Value: string); + procedure UpdateProjectFilename; + function GetProjectFilename: string; + function GetSourceProjectFilename: string; + function GetRelocateExternal: Boolean; + procedure RefreshHTML; + procedure cefLoadEnd(Sender: TObject); + procedure DownloadCallback(Owner: TfrmDownloadProgress; var Result: Boolean); + procedure DownloadWrapperCallback(var Cancelled: Boolean); + protected + function GetHelpTopic: string; override; + public + property BasePath: string read GetBasePath; + property KeyboardID: string read GetKeyboardID write SetKeyboardID; + property ProjectFilename: string read GetProjectFilename; + property SourceProjectFilename: string read GetSourceProjectFilename; + property RelocateExternal: Boolean read GetRelocateExternal; + end; + +function ShowCloneKeymanCloudProjectParameters(Owner: TComponent): Boolean; + +implementation + +uses + System.Net.UrlClient, + Vcl.ComCtrls, + + KeymanDeveloperOptions, + Keyman.Developer.System.KmcWrapper, + Keyman.Developer.System.HelpTopics, + Keyman.Developer.System.Project.Project, + Keyman.Developer.System.Project.ProjectFile, + Keyman.System.KeyboardUtils, + UfrmMain, + Upload_Settings; + +{$R *.dfm} + +function ShowCloneKeymanCloudProjectParameters(Owner: TComponent): Boolean; +var + f: TfrmCloneKeymanCloudProjectParameters; + path: string; + p: TfrmDownloadProgress; +begin + f := TfrmCloneKeymanCloudProjectParameters.Create(Owner); + try + Result := f.ShowModal = mrOk; + if not Result then + Exit; + + path := ExtractFileDir(f.BasePath); + if not ForceDirectories(path) then + begin + ShowMessage('Unable to create path "'+path+'": '+SysErrorMessage(GetLastError)); + Exit; + end; + + p := TfrmDownloadProgress.Create(Owner); + try + p.Callback := f.DownloadCallback; + p.progress.Style := pbstMarquee; + Result := p.ShowModal = mrOk; + finally + p.Free; + end; + finally + f.Free; + end; +end; + +{ TfrmCloneKeymanCloudProjectParameters } + +procedure TfrmCloneKeymanCloudProjectParameters.DownloadWrapperCallback(var Cancelled: Boolean); +begin + Application.ProcessMessages; + Cancelled := frmDownloadProgress.Cancel; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.DownloadCallback( + Owner: TfrmDownloadProgress; var Result: Boolean); +var + wrapper: TKmcWrapper; + path: string; +begin + Result := False; + path := ExtractFileDir(Self.BasePath); + + Update; + frmDownloadProgress := Owner; + wrapper := TKmcWrapper.Create; + try + if wrapper.Copy(Self.SourceProjectFilename, Self.ProjectFilename, path, Self.RelocateExternal, DownloadWrapperCallback) then + begin + frmKeymanDeveloper.OpenProject(Self.ProjectFilename); + Result := True; + end; + finally + wrapper.Free; + end; + frmDownloadProgress := nil; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.FormCreate(Sender: TObject); +begin + inherited; + cef := TframeCEFHost.Create(Self); + cef.Parent := panWebHost; + cef.Visible := True; + cef.OnLoadEnd := cefLoadEnd; + RefreshHTML; + + editPath.Text := FKeymanDeveloperOptions.DefaultProjectPath; + + dlgBrowse := TBrowse4Folder.Create(Self); + dlgBrowse.InitialDir := editPath.Text; + dlgBrowse.Options := [OnlySelectFileSysDir, ShowEditBox, UseNewDialogStyle]; + dlgBrowse.Root := Desktop; + dlgBrowse.Title := 'Select folder to save project to'; + + EnableControls; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.RefreshHTML; +begin + cef.Navigate(MakeKeymanURL(URLPath_KeymanDeveloper_KeyboardSearchForCloneKeymanCloud)); +end; + +procedure TfrmCloneKeymanCloudProjectParameters.cefLoadEnd(Sender: TObject); +var + u: TUri; +begin + u := TUri.Create(cef.cef.DocumentURL); + // We want to match on keyman.com/keyboards/ + // but we need to avoid keyman.com/keyboards/h/ + if u.Path.StartsWith(URLSubPath_KeymanDeveloper_Clone_Keyboards) and + not u.Path.StartsWith(URLSubPath_KeymanDeveloper_Clone_Keyboards_Custom) + then FKeymanID := u.Path.Substring(URLSubPath_KeymanDeveloper_Clone_Keyboards.Length) + else FKeymanID := ''; + EnableControls; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.cmdBrowseClick(Sender: TObject); +begin + dlgBrowse.InitialDir := editPath.Text; + + if dlgBrowse.Execute and (dlgBrowse.FileName <> '') then + editPath.Text := ExcludeTrailingPathDelimiter(dlgBrowse.FileName); +end; + +procedure TfrmCloneKeymanCloudProjectParameters.cmdOKClick(Sender: TObject); +begin + if Validate then + ModalResult := mrOk; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.editKeyboardIDChange(Sender: TObject); +begin + UpdateProjectFilename; + EnableControls; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.editSourceProjectFilenameChange(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.editPathChange(Sender: TObject); +begin + UpdateProjectFilename; + EnableControls; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.editVersionChange(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.EnableControls; +var + e: Boolean; +begin + e := + (FKeymanID <> '') and + (Trim(editPath.Text) <> '') and + (Trim(editKeyboardID.Text) <> '') and + TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + + cmdOK.Enabled := e; +end; + +function TfrmCloneKeymanCloudProjectParameters.GetBasePath: string; +begin + Result := Trim(editPath.Text); +end; + +function TfrmCloneKeymanCloudProjectParameters.GetHelpTopic: string; +begin + Result := SHelpTopic_Context_CloneKeymanCloudProjectParameters; +end; + +function TfrmCloneKeymanCloudProjectParameters.GetKeyboardID: string; +begin + Result := Trim(LowerCase(editKeyboardID.Text)); +end; + +function TfrmCloneKeymanCloudProjectParameters.GetProjectFilename: string; +begin + Result := editProjectFilename.Text; +end; + +function TfrmCloneKeymanCloudProjectParameters.GetRelocateExternal: Boolean; +begin + Result := chkRelocateExternal.Checked; +end; + +function TfrmCloneKeymanCloudProjectParameters.GetSourceProjectFilename: string; +begin + Result := 'cloud:'+FKeymanID; +end; + +function TfrmCloneKeymanCloudProjectParameters.Validate: Boolean; +var + ProjectFolder: string; +begin + Result := TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + + if Result then + begin + if not DirectoryExists(editPath.Text) then + begin + if MessageDlg('The target folder '+editPath.Text+' does not exist. Create it now?', mtConfirmation, mbOkCancel, 0) = mrCancel then + Exit(False); + end; + + ProjectFolder := IncludeTrailingPathDelimiter(editPath.Text) + editKeyboardID.Text; + if DirectoryExists(ProjectFolder) then + begin + if MessageDlg('The project folder '+ProjectFolder+' already exists. Are you sure you want to overwrite it?', mtWarning, + mbOkCancel, 0) = mrCancel then + Exit(False); + end; + end; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.SetKeyboardID(const Value: string); +begin + editKeyboardID.Text := Value; + EnableControls; +end; + +procedure TfrmCloneKeymanCloudProjectParameters.UpdateProjectFilename; +begin + editProjectFilename.Text := + IncludeTrailingPathDelimiter(BasePath) + + KeyboardID + PathDelim + + KeyboardID + Ext_ProjectSource; + // Scroll to the end of the control to show the filename + editProjectFilename.Perform(EM_SETSEL, Length(editProjectFilename.Text), Length(editProjectFilename.Text)); + editProjectFilename.Perform(EM_SCROLLCARET, 0, 0); +end; + +end. diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.dfm b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.dfm new file mode 100644 index 0000000000..598b430bf4 --- /dev/null +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.dfm @@ -0,0 +1,155 @@ +inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + Caption = 'Clone Project' + ClientHeight = 231 + ClientWidth = 721 + Position = poScreenCenter + ExplicitWidth = 727 + ExplicitHeight = 260 + PixelsPerInch = 96 + TextHeight = 13 + object cmdOK: TButton + Left = 561 + Top = 198 + Width = 73 + Height = 25 + Caption = 'OK' + Default = True + TabOrder = 2 + OnClick = cmdOKClick + end + object cmdCancel: TButton + Left = 640 + Top = 198 + Width = 73 + Height = 25 + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 3 + end + object gbNewProjectDetails: TGroupBox + Left = 8 + Top = 63 + Width = 705 + Height = 129 + Caption = 'New Project Details' + TabOrder = 1 + object lblFileName: TLabel + Left = 12 + Top = 22 + Width = 76 + Height = 13 + Caption = '&New project ID:' + FocusControl = editKeyboardID + end + object lblProjectFilename: TLabel + Left = 12 + Top = 100 + Width = 101 + Height = 13 + Caption = 'New project &filename' + FocusControl = editProjectFilename + end + object lblPath: TLabel + Left = 12 + Top = 73 + Width = 83 + Height = 13 + Caption = 'Destination &path:' + FocusControl = editPath + end + object editKeyboardID: TEdit + Left = 144 + Top = 19 + Width = 205 + Height = 21 + TabOrder = 0 + OnChange = editKeyboardIDChange + end + object editProjectFilename: TEdit + Left = 144 + Top = 97 + Width = 553 + Height = 21 + TabStop = False + ParentColor = True + ReadOnly = True + TabOrder = 4 + OnChange = editKeyboardIDChange + end + object cmdBrowse: TButton + Left = 624 + Top = 70 + Width = 73 + Height = 21 + Caption = '&Browse...' + TabOrder = 3 + OnClick = cmdBrowseClick + end + object editPath: TEdit + Left = 144 + Top = 70 + Width = 474 + Height = 21 + TabOrder = 2 + OnChange = editPathChange + end + object chkRelocateExternal: TCheckBox + Left = 144 + Top = 46 + Width = 257 + Height = 17 + Caption = 'Relocate &external files into new project folder' + TabOrder = 1 + end + end + object gbSourceProjectDetails: TGroupBox + Left = 8 + Top = 8 + Width = 705 + Height = 49 + Caption = 'Source Project' + TabOrder = 0 + object lblKeyboardName: TLabel + Left = 12 + Top = 19 + Width = 117 + Height = 13 + Caption = '&Source project filename:' + FocusControl = editSourceProjectFilename + end + object editSourceProjectFilename: TEdit + Left = 144 + Top = 16 + Width = 474 + Height = 21 + TabOrder = 0 + OnChange = editSourceProjectFilenameChange + end + object cmdBrowseSourceProject: TButton + Left = 624 + Top = 16 + Width = 73 + Height = 21 + Caption = 'B&rowse...' + TabOrder = 1 + OnClick = cmdBrowseSourceProjectClick + end + end + object dlgBrowseSourceProject: TFileOpenDialog + DefaultExtension = '.kpj' + FavoriteLinks = <> + FileTypes = < + item + DisplayName = 'Keyman Project Files (*.kpj)' + FileMask = '*.kpj' + end> + OkButtonLabel = 'Select' + Options = [fdoPathMustExist, fdoFileMustExist, fdoNoTestFileCreate] + Title = 'Select source project' + Left = 584 + Top = 16 + end +end diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas new file mode 100644 index 0000000000..d651d95a6f --- /dev/null +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas @@ -0,0 +1,262 @@ +(* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Parameters dialog for cloning a project from local filesystem + *) +unit Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters; + +interface + +uses + System.Classes, + System.SysUtils, + System.UITypes, + System.Variants, + Winapi.Messages, + Winapi.Windows, + Vcl.CheckLst, + Vcl.Controls, + Vcl.Dialogs, + Vcl.Forms, + Vcl.Graphics, + Vcl.Grids, + Vcl.StdCtrls, + + kpsfile, + PackageInfo, + UfrmTike, + UKeymanTargets, + utilfiletypes, + Browse4Folder; + +type + TfrmCloneLocalProjectParameters = class(TTikeForm) + cmdOK: TButton; + cmdCancel: TButton; + dlgBrowseSourceProject: TFileOpenDialog; + gbNewProjectDetails: TGroupBox; + lblFileName: TLabel; + lblProjectFilename: TLabel; + lblPath: TLabel; + editKeyboardID: TEdit; + editProjectFilename: TEdit; + cmdBrowse: TButton; + editPath: TEdit; + chkRelocateExternal: TCheckBox; + gbSourceProjectDetails: TGroupBox; + lblKeyboardName: TLabel; + editSourceProjectFilename: TEdit; + cmdBrowseSourceProject: TButton; + procedure cmdOKClick(Sender: TObject); + procedure editSourceProjectFilenameChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure editVersionChange(Sender: TObject); + procedure editPathChange(Sender: TObject); + procedure editKeyboardIDChange(Sender: TObject); + procedure cmdBrowseClick(Sender: TObject); + procedure cmdBrowseSourceProjectClick(Sender: TObject); + private + dlgBrowse: TBrowse4Folder; + function GetBasePath: string; + function GetKeyboardID: string; + function Validate: Boolean; + procedure EnableControls; + procedure SetKeyboardID(const Value: string); + procedure UpdateProjectFilename; + function GetProjectFilename: string; + function GetSourceProjectFilename: string; + function GetRelocateExternal: Boolean; + protected + function GetHelpTopic: string; override; + public + property BasePath: string read GetBasePath; + property KeyboardID: string read GetKeyboardID write SetKeyboardID; + property ProjectFilename: string read GetProjectFilename; + property SourceProjectFilename: string read GetSourceProjectFilename; + property RelocateExternal: Boolean read GetRelocateExternal; + end; + +function ShowCloneLocalProjectParameters(Owner: TComponent): Boolean; + +implementation + +uses + KeymanDeveloperOptions, + Keyman.Developer.System.KmcWrapper, + Keyman.Developer.System.HelpTopics, + Keyman.Developer.System.Project.Project, + Keyman.Developer.System.Project.ProjectFile, + Keyman.System.KeyboardUtils, + UfrmMain; + +{$R *.dfm} + +function ShowCloneLocalProjectParameters(Owner: TComponent): Boolean; +var + f: TfrmCloneLocalProjectParameters; + wrapper: TKmcWrapper; +begin + f := TfrmCloneLocalProjectParameters.Create(Owner); + try + Result := f.ShowModal = mrOk; + if not Result then + Exit; + + wrapper := TKmcWrapper.Create; + if wrapper.Copy(f.SourceProjectFilename, f.ProjectFilename, ExtractFileDir(f.SourceProjectFilename), f.RelocateExternal) then + begin + frmKeymanDeveloper.OpenProject(f.ProjectFilename); + Result := True; + end; + finally + f.Free; + end; +end; + +{ TfrmCloneLocalProjectParameters } + +procedure TfrmCloneLocalProjectParameters.FormCreate(Sender: TObject); +begin + inherited; + editPath.Text := FKeymanDeveloperOptions.DefaultProjectPath; + + dlgBrowse := TBrowse4Folder.Create(Self); + dlgBrowse.InitialDir := editPath.Text; + dlgBrowse.Options := [OnlySelectFileSysDir, ShowEditBox, UseNewDialogStyle]; + dlgBrowse.Root := Desktop; + dlgBrowse.Title := 'Select folder to save project to'; + + EnableControls; +end; + +procedure TfrmCloneLocalProjectParameters.cmdBrowseClick(Sender: TObject); +begin + dlgBrowse.InitialDir := editPath.Text; + + if dlgBrowse.Execute and (dlgBrowse.FileName <> '') then + editPath.Text := ExcludeTrailingPathDelimiter(dlgBrowse.FileName); +end; + +procedure TfrmCloneLocalProjectParameters.cmdBrowseSourceProjectClick( + Sender: TObject); +begin + if dlgBrowseSourceProject.Execute then + begin + editSourceProjectFilename.Text := dlgBrowseSourceProject.Filename; + EnableControls; + end; +end; + +procedure TfrmCloneLocalProjectParameters.cmdOKClick(Sender: TObject); +begin + if Validate then + ModalResult := mrOk; +end; + +procedure TfrmCloneLocalProjectParameters.editKeyboardIDChange(Sender: TObject); +begin + UpdateProjectFilename; + EnableControls; +end; + +procedure TfrmCloneLocalProjectParameters.editSourceProjectFilenameChange(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmCloneLocalProjectParameters.editPathChange(Sender: TObject); +begin + UpdateProjectFilename; + EnableControls; +end; + +procedure TfrmCloneLocalProjectParameters.editVersionChange(Sender: TObject); +begin + EnableControls; +end; + +procedure TfrmCloneLocalProjectParameters.EnableControls; +var + e: Boolean; +begin + e := (Trim(editSourceProjectFilename.Text) <> '') and + FileExists(Trim(editSourceProjectFilename.Text)) and + (Trim(editPath.Text) <> '') and + (Trim(editKeyboardID.Text) <> '') and + TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + + cmdOK.Enabled := e; +end; + +function TfrmCloneLocalProjectParameters.GetBasePath: string; +begin + Result := Trim(editPath.Text); +end; + +function TfrmCloneLocalProjectParameters.GetHelpTopic: string; +begin + Result := SHelpTopic_Context_CloneLocalProjectParameters; +end; + +function TfrmCloneLocalProjectParameters.GetKeyboardID: string; +begin + Result := Trim(LowerCase(editKeyboardID.Text)); +end; + +function TfrmCloneLocalProjectParameters.GetProjectFilename: string; +begin + Result := editProjectFilename.Text; +end; + +function TfrmCloneLocalProjectParameters.GetRelocateExternal: Boolean; +begin + Result := chkRelocateExternal.Checked; +end; + +function TfrmCloneLocalProjectParameters.GetSourceProjectFilename: string; +begin + Result := editSourceProjectFilename.Text; +end; + +function TfrmCloneLocalProjectParameters.Validate: Boolean; +var + ProjectFolder: string; +begin + Result := TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + + if Result then + begin + if not DirectoryExists(editPath.Text) then + begin + if MessageDlg('The target folder '+editPath.Text+' does not exist. Create it now?', mtConfirmation, mbOkCancel, 0) = mrCancel then + Exit(False); + end; + + ProjectFolder := IncludeTrailingPathDelimiter(editPath.Text) + editKeyboardID.Text; + if DirectoryExists(ProjectFolder) then + begin + if MessageDlg('The project folder '+ProjectFolder+' already exists. Are you sure you want to overwrite it?', mtWarning, + mbOkCancel, 0) = mrCancel then + Exit(False); + end; + end; +end; + +procedure TfrmCloneLocalProjectParameters.SetKeyboardID(const Value: string); +begin + editKeyboardID.Text := Value; + EnableControls; +end; + +procedure TfrmCloneLocalProjectParameters.UpdateProjectFilename; +begin + editProjectFilename.Text := + IncludeTrailingPathDelimiter(BasePath) + + KeyboardID + PathDelim + + KeyboardID + Ext_ProjectSource; + // Scroll to the end of the control to show the filename + editProjectFilename.Perform(EM_SETSEL, Length(editProjectFilename.Text), Length(editProjectFilename.Text)); + editProjectFilename.Perform(EM_SCROLLCARET, 0, 0); +end; + +end. diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProject.dfm b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProject.dfm index 5208255bbc..1761e2f1c2 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProject.dfm +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProject.dfm @@ -42,18 +42,26 @@ inherited frmNewProject: TfrmNewProject FullDrag = True HideSelection = False Items.ItemData = { - 05FA0000000400000001000000FFFFFFFFFFFFFFFF00000000FFFFFFFF000000 - 000F4B00650079006D0061006E0020004B006500790062006F00610072006400 + 05DE0100000700000001000000FFFFFFFFFFFFFFFF00000000FFFFFFFF000000 + 000F4B00650079006D0061006E0020006B006500790062006F00610072006400 01000000FFFFFFFFFFFFFFFF00000000FFFFFFFF000000000D4C0044004D004C - 0020004B006500790062006F0061007200640001000000FFFFFFFFFFFFFFFF00 + 0020006B006500790062006F0061007200640001000000FFFFFFFFFFFFFFFF00 000000FFFFFFFF000000001749006D0070006F00720074002000570069006E00 - 64006F007700730020004B006500790062006F0061007200640002000000FFFF + 64006F007700730020006B006500790062006F0061007200640002000000FFFF FFFFFFFFFFFF00000000FFFFFFFF000000001657006F00720064006C00690073 - 00740020004C00650078006900630061006C0020004D006F00640065006C00} + 00740020006C00650078006900630061006C0020006D006F00640065006C0001 + 000000FFFFFFFFFFFFFFFF00000000FFFFFFFF000000001343006C006F006E00 + 650020006C006F00630061006C002000700072006F006A006500630074000100 + 0000FFFFFFFFFFFFFFFF00000000FFFFFFFF000000001F43006C006F006E0065 + 002000700072006F006A006500630074002000660072006F006D0020004B0065 + 0079006D0061006E00200043006C006F007500640001000000FFFFFFFFFFFFFF + FF00000000FFFFFFFF000000001943006C006F006E0065002000700072006F00 + 6A006500630074002000660072006F006D002000470069007400480075006200} LargeImages = ilLarge ReadOnly = True SmallImages = ilSmall TabOrder = 0 + ViewStyle = vsList OnDblClick = lvItemsDblClick OnSelectItem = lvItemsSelectItem end diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProject.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProject.pas index 535a584ad6..36f65bd103 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProject.pas +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewProject.pas @@ -81,6 +81,9 @@ uses Keyman.Developer.System.Project.Project, Keyman.Developer.System.Project.ProjectFile, Keyman.Developer.UI.Project.ProjectUI, + Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters, + Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters, + Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters, Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters, Keyman.Developer.UI.Project.UfrmNewProjectParameters, Keyman.Developer.UI.Project.UfrmNewModelProjectParameters, @@ -115,6 +118,12 @@ begin Result := ShowNewModelProjectParameters(Owner); kptImportWindowsKeyboard: Result := ShowImportWindowsKeyboard(Owner); + kptCloneLocalProject: + Result := ShowCloneLocalProjectParameters(Owner); + kptCloneKeymanCloudProject: + Result := ShowCloneKeymanCloudProjectParameters(Owner); + kptCloneGitHubProject: + Result := ShowCloneGitHubProjectParameters(Owner); end; end; @@ -143,14 +152,20 @@ begin // Overly wordy but clarifies that we may have other types later if not Assigned(lvItems.Selected) then Result := kptUnknown - else if lvItems.Selected.Caption = 'Keyman Keyboard' then + else if lvItems.Selected.Caption = 'Keyman keyboard' then Result := kptBasic - else if lvItems.Selected.Caption = 'LDML Keyboard' then + else if lvItems.Selected.Caption = 'LDML keyboard' then Result := kptLDMLKeyboard - else if lvItems.Selected.Caption = 'Import Windows Keyboard' then + else if lvItems.Selected.Caption = 'Import Windows keyboard' then Result := kptImportWindowsKeyboard - else if lvItems.Selected.Caption = 'Wordlist Lexical Model' then + else if lvItems.Selected.Caption = 'Wordlist lexical model' then Result := kptWordlistLexicalModel + else if lvItems.Selected.Caption = 'Clone local project' then + Result := kptCloneLocalProject + else if lvItems.Selected.Caption = 'Clone project from Keyman Cloud' then + Result := kptCloneKeymanCloudProject + else if lvItems.Selected.Caption = 'Clone project from GitHub' then + Result := kptCloneGitHubProject else Result := kptUnknown; end; @@ -192,6 +207,16 @@ begin 'Creates a new lexical model project that matches the folder structure used in '+ 'the Keyman lexical-models repository and includes all basic files '+ 'needed for a wordlist lexical model.'; + kptCloneLocalProject: lblDescription.Caption := + 'Copies a Keyman keyboard or lexical model project on your local filesystem '+ + 'into a new folder, giving the project and included files a new name.'; + kptCloneKeymanCloudProject: lblDescription.Caption := + 'Copies a Keyman keyboard or lexical model project from keyman.com '+ + 'into a new folder, giving the project and included files a new name.'; + kptCloneGitHubProject: lblDescription.Caption := + 'Copies a Keyman keyboard or lexical model project from a GitHub '+ + 'repository into a new folder, giving the project and included files a '+ + 'new name.'; end; end; diff --git a/developer/src/tike/tike.dpr b/developer/src/tike/tike.dpr index e686949fc0..6724e254f4 100644 --- a/developer/src/tike/tike.dpr +++ b/developer/src/tike/tike.dpr @@ -228,7 +228,7 @@ uses Keyman.Developer.System.VisualKeyboardToTouchLayoutConverter in '..\kmconvert\Keyman.Developer.System.VisualKeyboardToTouchLayoutConverter.pas', Keyman.Developer.System.Project.kmnProjectFileAction in 'project\Keyman.Developer.System.Project.kmnProjectFileAction.pas', Keyman.Developer.System.Project.kpsProjectFileAction in 'project\Keyman.Developer.System.Project.kpsProjectFileAction.pas', - Keyman.Developer.UI.Project.UfrmNewProjectParameters in 'project\Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas' {frmNewProjectParameters}, + Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters in 'project\Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas' {frmCloneGitHubProjectParameters}, Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters in 'project\Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.pas' {frmNewLDMLKeyboardProjectParameters}, Keyman.Developer.UI.Project.UfrmNewProject in 'project\Keyman.Developer.UI.Project.UfrmNewProject.pas' {frmNewProject}, Keyman.Developer.System.KeyboardProjectTemplate in '..\kmconvert\Keyman.Developer.System.KeyboardProjectTemplate.pas', @@ -300,7 +300,10 @@ uses Keyman.Developer.System.Main in 'main\Keyman.Developer.System.Main.pas', Keyman.Developer.System.LaunchProjects in 'main\Keyman.Developer.System.LaunchProjects.pas', Keyman.System.Debug.DebugUtils in 'debug\Keyman.System.Debug.DebugUtils.pas', - Keyman.Developer.UI.RichEdit41 in '..\common\delphi\components\Keyman.Developer.UI.RichEdit41.pas'; + Keyman.Developer.UI.RichEdit41 in '..\common\delphi\components\Keyman.Developer.UI.RichEdit41.pas', + Keyman.Developer.UI.Project.UfrmNewProjectParameters in 'project\Keyman.Developer.UI.Project.UfrmNewProjectParameters.pas' {frmNewProjectParameters}, + Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters in 'project\Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas' {frmCloneLocalProjectParameters}, + Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters in 'project\Keyman.Developer.UI.Project.UfrmCloneKeymanCloudProjectParameters.pas' {frmCloneKeymanCloudProjectParameters}; {$R *.RES} {$R ICONS.RES} diff --git a/developer/src/tike/tike.dproj b/developer/src/tike/tike.dproj index 2a626a30ac..9ee2d83579 100644 --- a/developer/src/tike/tike.dproj +++ b/developer/src/tike/tike.dproj @@ -471,8 +471,8 @@ - -

frmNewProjectParameters
+ +
frmCloneGitHubProjectParameters
dfm
@@ -585,6 +585,18 @@ + +
frmNewProjectParameters
+ dfm +
+ +
frmCloneLocalProjectParameters
+ dfm +
+ +
frmCloneKeymanCloudProjectParameters
+ dfm +
Cfg_2 From fb1d86874e9247843329d330301c0369824f99d4 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Thu, 30 Jan 2025 12:21:15 +0700 Subject: [PATCH 032/109] chore(mac): builds and runs locally with xcode 16 --- .../resources/Keyman.bundle/Contents/Resources/ios-host.js | 2 +- ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js b/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js index bd323b970b..ac07362391 100644 --- a/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js +++ b/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js @@ -131,7 +131,7 @@ function getOskWidth() { function getOskHeight() { var height = oskHeight; - if(keyman.osk.banner._activeType != 'blank') { + if(keyman.osk && keyman.osk.banner && keyman.osk.banner._activeType != 'blank') { height = height - keyman.osk.banner.height; } return height; diff --git a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj index 6211f26573..a8b4f8624b 100644 --- a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj +++ b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj @@ -1004,7 +1004,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = "/usr/bin/env bash"; - shellScript = "\"$KEYMAN_ROOT/resources/build/xcode-wrap.sh\" \"$KEYMAN_ROOT/resources/build/set-bundle-versions-and-settings-tagged.sh\"\n"; + shellScript = "\"$KEYMAN_ROOT/resources/build/xcode-wrap.sh\" \"$KEYMAN_ROOT/resources/build/set-bundle-versions-and-settings-tagged.sh\"\necho \"script - set version complete\"\n"; showEnvVarsInLog = 0; }; CED3CFDA240E49DF001540A1 /* ShellScript */ = { From 2a728b49f86dda02254bf8d0ffd9fdd6a3ad9ba4 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 13:57:13 +0700 Subject: [PATCH 033/109] chore(developer): add verbose logs for project copier --- developer/src/kmc-copy/src/KeymanProjectCopier.ts | 7 ++++++- developer/src/kmc-copy/src/copier-messages.ts | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/developer/src/kmc-copy/src/KeymanProjectCopier.ts b/developer/src/kmc-copy/src/KeymanProjectCopier.ts index 0fcae4b514..a751e46731 100644 --- a/developer/src/kmc-copy/src/KeymanProjectCopier.ts +++ b/developer/src/kmc-copy/src/KeymanProjectCopier.ts @@ -357,6 +357,7 @@ export class KeymanProjectCopier implements KeymanCompiler { const subFilename = this.normalizePath(this.resolveFilename(project.projectFilename, normalizedFilePath)); const copier = this.copiers[ file.fileType] ?? this.copyGenericFile.bind(this); // Ignore errors because we will continue to do a best effort + this.callbacks.reportMessage(CopierMessages.Verbose_CopyingFile({from: normalizedFilePath, to: subFilename})); await copier(project, subFilename, subOutputPath, source, result); } @@ -562,7 +563,10 @@ export class KeymanProjectCopier implements KeymanCompiler { if(this.isLocalOrigin() && !this.options.relocateExternalFiles) { // Reference outside the project structure, do not attempt to normalize or copy, // but we do need to update references for the new output path - return this.normalizePath(this.callbacks.path.relative(result.artifacts[parentFilename].filename, subFilenameAbsolute)); + const destinationFilename = + this.normalizePath(this.callbacks.path.relative(result.artifacts[parentFilename].filename, subFilenameAbsolute)); + this.callbacks.reportMessage(CopierMessages.Verbose_CopyingFile({from: originalSubfilename, to: destinationFilename})); + return destinationFilename; } else { // Reference outside the project structure, we will copy into a subfolder of the project; // should be relative to root of remote repo, e.g. release/k/khmer_angkor references release/shared/fonts/..., @@ -574,6 +578,7 @@ export class KeymanProjectCopier implements KeymanCompiler { subOutputPath = this.normalizePath(this.callbacks.path.join(outputPath, this.callbacks.path.dirname(originalSubfilename))); } + this.callbacks.reportMessage(CopierMessages.Verbose_CopyingFile({from: originalSubfilename, to: subFilename})); await this.copyGenericFile(project, subFilename, subOutputPath, source, result); // Even if the subfile is missing, we'll still continue the overall copy diff --git a/developer/src/kmc-copy/src/copier-messages.ts b/developer/src/kmc-copy/src/copier-messages.ts index 8afff79149..c89b4412b5 100644 --- a/developer/src/kmc-copy/src/copier-messages.ts +++ b/developer/src/kmc-copy/src/copier-messages.ts @@ -231,4 +231,16 @@ export class CopierMessages { `The output file '${def(o.filename)}' has two different possible source files.`, ); + static VERBOSE_CopyingFile = SevVerbose | 0x0021; + static Verbose_CopyingFile = (o:{from: string, to: string}) => m( + this.VERBOSE_CopyingFile, + `Copying file '${def(o.from)}' to '${def(o.to)}'`, + ); + + static VERBOSE_CopyingFolder = SevVerbose | 0x0022; + static Verbose_CopyingFolder = (o:{from: string, to: string}) => m( + this.VERBOSE_CopyingFolder, + `Copying folder '${def(o.from)}' from '${def(o.to)}'`, + ); + }; From 0dc1ef2ac0ccec676cc19d1cdb293268b3c12476 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 13:58:14 +0700 Subject: [PATCH 034/109] chore(developer): handle forward slashes in paths in package editor --- .../src/tike/child/UfrmPackageEditor.dfm | 24 ++++++++++++++++--- .../src/tike/child/UfrmPackageEditor.pas | 9 +++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/developer/src/tike/child/UfrmPackageEditor.dfm b/developer/src/tike/child/UfrmPackageEditor.dfm index 911781c298..884af89ae3 100644 --- a/developer/src/tike/child/UfrmPackageEditor.dfm +++ b/developer/src/tike/child/UfrmPackageEditor.dfm @@ -197,6 +197,9 @@ inherited frmPackageEditor: TfrmPackageEditor object pageFiles: TTabSheet Caption = 'Files' ImageIndex = 3 + ExplicitLeft = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object Panel1: TPanel Left = 0 Top = 0 @@ -261,7 +264,7 @@ inherited frmPackageEditor: TfrmPackageEditor object lblFileType: TLabel Left = 256 Top = 107 - Width = 47 + Width = 46 Height = 13 Caption = 'File Type:' FocusControl = editFilePath @@ -353,6 +356,9 @@ inherited frmPackageEditor: TfrmPackageEditor object pageKeyboards: TTabSheet Caption = 'Keyboards' ImageIndex = 5 + ExplicitLeft = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object Panel5: TPanel Left = 0 Top = 0 @@ -658,6 +664,9 @@ inherited frmPackageEditor: TfrmPackageEditor object pageLexicalModels: TTabSheet Caption = 'Lexical Models' ImageIndex = 17 + ExplicitLeft = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object panLexicalModels: TPanel Left = 0 Top = 0 @@ -944,7 +953,7 @@ inherited frmPackageEditor: TfrmPackageEditor object lblDescriptionMarkdown: TLabel Left = 114 Top = 497 - Width = 215 + Width = 214 Height = 13 Caption = 'Markdown accepted, no embedded HTML' Transparent = True @@ -1157,6 +1166,9 @@ inherited frmPackageEditor: TfrmPackageEditor object pageShortcuts: TTabSheet Caption = 'Shortcuts' ImageIndex = 8 + ExplicitLeft = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object Panel3: TPanel Left = 0 Top = 0 @@ -1320,10 +1332,16 @@ inherited frmPackageEditor: TfrmPackageEditor object pageSource: TTabSheet Caption = 'Source' ImageIndex = 9 + ExplicitLeft = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 end object pageCompile: TTabSheet Caption = 'Build' ImageIndex = 1 + ExplicitLeft = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object sbCompile: TScrollBox Left = 0 Top = 0 @@ -1575,7 +1593,7 @@ inherited frmPackageEditor: TfrmPackageEditor object Label5: TLabel Left = 9 Top = 73 - Width = 82 + Width = 81 Height = 13 Caption = 'Target filename:' end diff --git a/developer/src/tike/child/UfrmPackageEditor.pas b/developer/src/tike/child/UfrmPackageEditor.pas index 5aa02b50b3..4f3a096bd9 100644 --- a/developer/src/tike/child/UfrmPackageEditor.pas +++ b/developer/src/tike/child/UfrmPackageEditor.pas @@ -319,7 +319,7 @@ type procedure UpdateStartMenuPrograms; procedure FillFileList(combo: TComboBox; obj: TObject; FileType: TKMFileType = ftOther); procedure UpdateImagePreviews; - procedure AddFile(FileName: WideString); + procedure AddFile(FileName: string); procedure SourceChanged(Sender: TObject); procedure MovePackageToSource; function MoveSourceToPackage: Boolean; @@ -381,6 +381,7 @@ implementation uses System.Math, + System.StrUtils, Vcl.Clipbrd, Vcl.Imaging.GifImg, @@ -708,7 +709,7 @@ begin mtConfirmation, mbOkCancel, 0) = mrOk; end; -procedure TfrmPackageEditor.AddFile(FileName: WideString); +procedure TfrmPackageEditor.AddFile(FileName: string); var f: TPackageContentFile; ki: TKeyboardInfo; @@ -771,7 +772,7 @@ begin end; pack.Files.Add(f); - lbFiles.ItemIndex := lbFiles.Items.AddObject(ExtractFileName(FileName), f); + lbFiles.ItemIndex := lbFiles.Items.AddObject(ExtractFileName(FileName.Replace('/','\',[rfReplaceAll])), f); lbFilesClick(lbFiles); UpdateWelcomeFile; UpdateReadme; @@ -1315,7 +1316,7 @@ begin lbFiles.Clear; for i := 0 to pack.Files.Count - 1 do - lbFiles.Items.AddObject(ExtractFileName(pack.Files[i].FileName), pack.Files[i]); + lbFiles.Items.AddObject(ExtractFileName(ReplaceStr(pack.Files[i].FileName,'/','\')), pack.Files[i]); UpdateOutPath; UpdateWelcomeFile; From 0d53737d8587cad4484ab0eec6ce7fbb32982fce Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 14:00:34 +0700 Subject: [PATCH 035/109] chore: address review comments --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 800e91d034..ac2a37037b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,8 +5,8 @@ { "path": "./common/tools/hextobin/" }, { "path": "./common/web/keyman-version" }, - { "path": "./common/web/types" }, { "path": "./common/web/langtags" }, + { "path": "./common/web/types" }, { "path": "./developer/src/common/web/test-helpers/tsconfig.json" }, { "path": "./developer/src/common/web/utils/tsconfig.json" }, From ffdbfab775aeda1bb3cf068beec5771f43f18d52 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 14:04:38 +0700 Subject: [PATCH 036/109] chore: add copyright and license to langtags readme --- common/web/langtags/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/web/langtags/README.md b/common/web/langtags/README.md index 8829194fc0..d55707a510 100644 --- a/common/web/langtags/README.md +++ b/common/web/langtags/README.md @@ -31,3 +31,8 @@ Key documents for further reading (from langtags repository): * [Overview of language tags and how this project works with them](https://github.com/silnrsi/langtags/blob/master/doc/tagging.md) * [How to use langtags.json](https://github.com/silnrsi/langtags/blob/master/doc/langtags.md) + +## License + +* Copyright ©️ 2025 SIL Global. +* MIT License ([License text](https://github.com/keymanapp/keyman/tree/master/LICENSE.md)) From 48ac0725989def1f1f4c221e6feb62f06733fb7a Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 14:22:03 +0700 Subject: [PATCH 037/109] fix(common): remove `-b master` from PR creation in version history writer Fixes: #13078 --- resources/build/increment-version.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/build/increment-version.sh b/resources/build/increment-version.sh index 3be11dba1f..e88c1955d6 100755 --- a/resources/build/increment-version.sh +++ b/resources/build/increment-version.sh @@ -192,7 +192,7 @@ if [ "$action" == "commit" ]; then git commit -m "$message (history cherry-pick to master)" # TODO: once we are sure this is stable, add `-l auto` to get the "auto:" # label - hub pull-request -f --no-edit -b master + hub pull-request -f --no-edit fi # Return to our best working branch From bc7cded1f9086f76d9389a3be6de76d19e17d550 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 14:24:00 +0700 Subject: [PATCH 038/109] chore: push the branch when creating PR --- resources/build/increment-version.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/build/increment-version.sh b/resources/build/increment-version.sh index e88c1955d6..9e9ac699b8 100755 --- a/resources/build/increment-version.sh +++ b/resources/build/increment-version.sh @@ -192,7 +192,7 @@ if [ "$action" == "commit" ]; then git commit -m "$message (history cherry-pick to master)" # TODO: once we are sure this is stable, add `-l auto` to get the "auto:" # label - hub pull-request -f --no-edit + hub pull-request -fp --no-edit fi # Return to our best working branch From 30b5c80833640a2ca35f19ef7c82a9db6475be4f Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 30 Jan 2025 15:13:01 +0700 Subject: [PATCH 039/109] feat(windows): report on processor type in tsysinfo --- windows/src/engine/tsysinfo/si_overview.pas | 17 ++++++++ windows/src/engine/tsysinfo/si_overview.xslt | 42 +++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/windows/src/engine/tsysinfo/si_overview.pas b/windows/src/engine/tsysinfo/si_overview.pas index 8eae2fdea8..765e72e13b 100644 --- a/windows/src/engine/tsysinfo/si_overview.pas +++ b/windows/src/engine/tsysinfo/si_overview.pas @@ -45,6 +45,9 @@ begin Result := 'Overview'; end; +type + TIsWow64Process2 = function(hProcess: THandle; out pProcessMachine: USHORT; out pNativeMachine: USHORT): BOOL; stdcall; + function TSI_Overview.DoCollect: Boolean; var n, nn, node: IXMLDOMNode; @@ -55,6 +58,9 @@ var buf: array[0..1023] of char; freespace, totalspace, totalfree: Int64; stat: TMemoryStatus; + processMachine: USHORT; + nativeMachine: USHORT; + IsWow64Process2: TIsWow64Process2; begin { SYSTEM INFO: @@ -85,6 +91,17 @@ SYSTEM INFO: then xmlSetAttribute(n,'x64', 'true') else xmlSetAttribute(n,'x64', 'false'); + IsWow64Process2 := GetProcAddress(GetModuleHandle(kernel32), 'IsWow64Process2'); + if Assigned(IsWow64Process2) then + begin + if IsWow64Process2(GetCurrentProcess, processMachine, nativeMachine) then + begin + // https://learn.microsoft.com/en-us/windows/win32/sysinfo/image-file-machine-constants + xmlSetAttribute(n, 'ProcessMachine', IntToHex(processMachine, 4)); + xmlSetAttribute(n, 'NativeMachine', IntToHex(nativeMachine, 4)); + end; + end; + { Free disk space } n := xmlAddChild(node,'DiskSpace'); diff --git a/windows/src/engine/tsysinfo/si_overview.xslt b/windows/src/engine/tsysinfo/si_overview.xslt index c254a97296..96f583375e 100644 --- a/windows/src/engine/tsysinfo/si_overview.xslt +++ b/windows/src/engine/tsysinfo/si_overview.xslt @@ -33,7 +33,7 @@ - + @@ -128,8 +128,46 @@ + + Native Machine + + + Intel 386 + MIPS R3000 + MIPS R3000 + MIPS R4000 + MIPS R10000 + MIPS WCE v2 + Alpha AXP + SH3 + SH3 DSP + SH3E + SH4 + SH5 + ARM + ARM Thumb + ARM Thumb 2 + TAM33BD + PowerPC + PowerPC FP + Intel IA64 + MIPS 16 + Alpha 64 + MIPSFPU + AXP64 + Infineon + CEF + EBC (EFI Byte Code) + AMD64 + M32R + ARM64 + CEE + + + + - + From 7ba30224ffcc966f15a3159c50e67b47782416e5 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Thu, 30 Jan 2025 16:00:44 +0700 Subject: [PATCH 040/109] fix(mac): resolve build error --- mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m index b7b5830500..5e88d2b59b 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputMethodAppDelegate.m @@ -145,7 +145,7 @@ id _lastServerWithOSKShowing = nil; if ([KMInputMethodLifecycle.shared shouldShowOskOnActivate]) { os_log_debug([KMLogs oskLog], "***KMInputMethodAppDelegate inputMethodActivated, showing OSK"); - [KMSentryHelper addBreadCrumb:@"lifecycle" message:@"opening OSK on input method activation"]; + [KMSentryHelper addDebugBreadCrumb:@"lifecycle" message:@"opening OSK on input method activation"]; [self showOSK]; } } From 85ac98581fc15d452cb24da69d18eea528f3ef16 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Thu, 30 Jan 2025 13:02:12 -0500 Subject: [PATCH 041/109] auto: increment master version to 18.0.182 --- HISTORY.md | 9 +++++++++ VERSION.md | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 1815302cac..8cc14f5dda 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,14 @@ # Keyman Version History +## 18.0.181 alpha 2025-01-30 + +* feat(windows): add localized button captions and form labels (#13025) +* fix(web): disabled correction state should prevent predictive corrections (#13066) +* fix(web): disabled autoaccept should not autohighlight suggestions (#13068) +* chore(common): add 17.0.334 to version history (#13065) +* fix(windows): add api GetContext and TIPProcessKeyEx with IsTextSelected bool (#13023) +* fix(web): keyboard query error states should always provide informative Error objects, reports (#13048) + ## 18.0.180 alpha 2025-01-29 * chore(common): Update crowdin strings for Portuguese (#13056) diff --git a/VERSION.md b/VERSION.md index 3428a04a07..618d162822 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.181 \ No newline at end of file +18.0.182 \ No newline at end of file From 2c32fb7903cae2251ea0fb4b060e930bb00e0676 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 30 Jan 2025 15:41:34 -0600 Subject: [PATCH 042/109] chore(resources, developer,core): CLDR 46 and workaround Fixes: #11307 - import from CLDR 46, mostly unchanged Fixes: #12749 - workaround LDML DTD bug CLDR-18138 where base= does not imply base=cldr --- common/web/types/build.sh | 4 ++-- core/include/ldml/keyman_core_ldml.h | 6 +++--- core/include/ldml/keyman_core_ldml.ts | 2 +- core/src/ldml/C7532_ldml_updating.md | 2 +- core/tests/unit/ldml/keyboards/k_001_tiny-test.xml | 2 +- .../tests/unit/ldml/keyboards/k_006_backspace-test.xml | 2 +- .../unit/ldml/keyboards/k_007_transform_rgx-test.xml | 2 +- .../unit/ldml/keyboards/k_008_transform_norm-test.xml | 2 +- .../unit/ldml/keyboards/k_009_transform_nfc-test.xml | 2 +- core/tests/unit/ldml/keyboards/k_020_fr-test.xml | 2 +- .../ldml/keyboards/k_200_reorder_nod_Lana-test.xml | 2 +- .../unit/ldml/keyboards/k_201_reorder_esk-test.xml | 2 +- core/tests/unit/ldml/keyboards/k_210_marker-test.xml | 2 +- .../unit/ldml/keyboards/k_211_marker_escape-test.xml | 2 +- .../unit/ldml/keyboards/k_212_marker_11057-test.xml | 2 +- core/tests/unit/ldml/keyboards/ldml_test-test.xml | 2 +- core/tests/unit/ldml/keyboards/meson.build | 6 +++--- .../web/utils/test/fixtures/ldml-keyboard/test-fr.xml | 2 +- .../web/utils/test/fixtures/xml/k_020_fr-test.xml | 2 +- developer/src/kmc-ldml/test/fixtures/test-fr.xml | 2 +- .../standards-data/ldml-keyboards/45/cldr_info.json | 5 ----- resources/standards-data/ldml-keyboards/45/readme.md | 3 --- .../ldml-keyboards/{45 => 46}/3.0/bn.xml | 4 ++++ .../ldml-keyboards/{45 => 46}/3.0/fr-t-k0-test.xml | 0 .../ldml-keyboards/{45 => 46}/3.0/fr.xml | 4 ++++ .../{45 => 46}/3.0/ja-Hira-t-k0-flicks.xml | 4 ++++ .../ldml-keyboards/{45 => 46}/3.0/ja-Latn.xml | 4 ++++ .../ldml-keyboards/{45 => 46}/3.0/mt-t-k0-47key.xml | 4 ++++ .../ldml-keyboards/{45 => 46}/3.0/mt.xml | 4 ++++ .../ldml-keyboards/{45 => 46}/3.0/pcm.xml | 4 ++++ .../ldml-keyboards/{45 => 46}/3.0/pt-t-k0-abnt2.xml | 4 ++++ .../standards-data/ldml-keyboards/46/cldr_info.json | 5 +++++ .../ldml-keyboards/{45 => 46}/dtd/ldmlKeyboard3.dtd | 4 ++-- .../ldml-keyboards/{45 => 46}/dtd/ldmlKeyboard3.xsd | 5 +++-- .../{45 => 46}/dtd/ldmlKeyboardTest3.dtd | 0 .../{45 => 46}/dtd/ldmlKeyboardTest3.xsd | 0 .../ldml-keyboards/{45 => 46}/import/README.md | 0 .../{45 => 46}/import/keys-Latn-implied.xml | 0 .../{45 => 46}/import/keys-Zyyy-currency.xml | 0 .../{45 => 46}/import/keys-Zyyy-punctuation.xml | 0 .../{45 => 46}/import/scanCodes-implied.xml | 0 .../{45 => 46}/ldml-keyboard3.schema.json | 10 ++++------ .../{45 => 46}/ldml-keyboardtest3.schema.json | 2 +- .../ldml-keyboards/{45 => 46}/test/README.md | 0 .../ldml-keyboards/{45 => 46}/test/bn-test.xml | 0 .../{45 => 46}/test/fr-t-k0-test-test.xml | 0 .../ldml-keyboards/{45 => 46}/test/ja-Latn-test.xml | 0 .../ldml-keyboards/{45 => 46}/test/pcm-test.xml | 0 .../{45 => 46}/test/pt-t-k0-abnt2-test.xml | 0 .../standards-data/ldml-keyboards/fixup-schema.js | 2 ++ 50 files changed, 74 insertions(+), 44 deletions(-) delete mode 100644 resources/standards-data/ldml-keyboards/45/cldr_info.json delete mode 100644 resources/standards-data/ldml-keyboards/45/readme.md rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/bn.xml (98%) rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/fr-t-k0-test.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/fr.xml (98%) rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/ja-Hira-t-k0-flicks.xml (97%) rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/ja-Latn.xml (88%) rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/mt-t-k0-47key.xml (95%) rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/mt.xml (95%) rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/pcm.xml (92%) rename resources/standards-data/ldml-keyboards/{45 => 46}/3.0/pt-t-k0-abnt2.xml (94%) create mode 100644 resources/standards-data/ldml-keyboards/46/cldr_info.json rename resources/standards-data/ldml-keyboards/{45 => 46}/dtd/ldmlKeyboard3.dtd (98%) rename resources/standards-data/ldml-keyboards/{45 => 46}/dtd/ldmlKeyboard3.xsd (98%) rename resources/standards-data/ldml-keyboards/{45 => 46}/dtd/ldmlKeyboardTest3.dtd (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/dtd/ldmlKeyboardTest3.xsd (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/import/README.md (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/import/keys-Latn-implied.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/import/keys-Zyyy-currency.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/import/keys-Zyyy-punctuation.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/import/scanCodes-implied.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/ldml-keyboard3.schema.json (99%) rename resources/standards-data/ldml-keyboards/{45 => 46}/ldml-keyboardtest3.schema.json (99%) rename resources/standards-data/ldml-keyboards/{45 => 46}/test/README.md (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/test/bn-test.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/test/fr-t-k0-test-test.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/test/ja-Latn-test.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/test/pcm-test.xml (100%) rename resources/standards-data/ldml-keyboards/{45 => 46}/test/pt-t-k0-abnt2-test.xml (100%) diff --git a/common/web/types/build.sh b/common/web/types/build.sh index 597962aeee..a392ec022c 100755 --- a/common/web/types/build.sh +++ b/common/web/types/build.sh @@ -30,8 +30,8 @@ builder_parse "$@" function compile_schemas() { # We need the schema files at runtime and bundled, so always copy it for all actions except `clean` local schemas=( - "$KEYMAN_ROOT/resources/standards-data/ldml-keyboards/45/ldml-keyboard3.schema.json" - "$KEYMAN_ROOT/resources/standards-data/ldml-keyboards/45/ldml-keyboardtest3.schema.json" + "$KEYMAN_ROOT/resources/standards-data/ldml-keyboards/46/ldml-keyboard3.schema.json" + "$KEYMAN_ROOT/resources/standards-data/ldml-keyboards/46/ldml-keyboardtest3.schema.json" "$KEYMAN_ROOT/common/schemas/kvks/kvks.schema.json" "$KEYMAN_ROOT/common/schemas/kpj/kpj.schema.json" "$KEYMAN_ROOT/common/schemas/kpj-9.0/kpj-9.0.schema.json" diff --git a/core/include/ldml/keyman_core_ldml.h b/core/include/ldml/keyman_core_ldml.h index 1d8aaa2575..189b37fc96 100644 --- a/core/include/ldml/keyman_core_ldml.h +++ b/core/include/ldml/keyman_core_ldml.h @@ -16,11 +16,11 @@ #pragma once #define LDML_BKSP_FLAGS_ERROR 0x1 -#define LDML_CLDR_IMPLIED_FORMS_IMPORT "45/scanCodes-implied.xml" -#define LDML_CLDR_IMPLIED_KEYS_IMPORT "45/keys-Latn-implied.xml" +#define LDML_CLDR_IMPLIED_FORMS_IMPORT "46/scanCodes-implied.xml" +#define LDML_CLDR_IMPLIED_KEYS_IMPORT "46/keys-Latn-implied.xml" #define LDML_CLDR_IMPORT_BASE "cldr" #define LDML_CLDR_TEST_VERSION_LATEST "techpreview" -#define LDML_CLDR_VERSION_LATEST "45" +#define LDML_CLDR_VERSION_LATEST "46" #define LDML_ELEM_FLAGS_ORDER_BITSHIFT 0x10 #define LDML_ELEM_FLAGS_ORDER_MASK 0xFF0000 #define LDML_ELEM_FLAGS_PREBASE 0x8 diff --git a/core/include/ldml/keyman_core_ldml.ts b/core/include/ldml/keyman_core_ldml.ts index b649d9424e..2794910764 100644 --- a/core/include/ldml/keyman_core_ldml.ts +++ b/core/include/ldml/keyman_core_ldml.ts @@ -59,7 +59,7 @@ class Constants { /** * The current CLDR version */ - readonly cldr_version_latest = '45'; + readonly cldr_version_latest = '46'; /** * The version for testdata files */ diff --git a/core/src/ldml/C7532_ldml_updating.md b/core/src/ldml/C7532_ldml_updating.md index da6bbcb80c..10d7708ada 100644 --- a/core/src/ldml/C7532_ldml_updating.md +++ b/core/src/ldml/C7532_ldml_updating.md @@ -22,7 +22,7 @@ working on ‘layr’, using ‘disp’ as a model from https://github.com/keyma ## XML changes -- `resources/standards-data/ldml-keyboards/45/` : update / reimport / fix fixup script if needed +- `resources/standards-data/ldml-keyboards/46/` : update / reimport / fix fixup script if needed - E/C: `common/web/types/src/ldml-keyboard/ldml-keyboard-xml.ts` - add to `LKKeyboard` and subproperties as needed to support the structure on the XML side - Now would be a good time to stop and make sure everything compiles. It didn’t, there was an unrelated issue with snprintf! diff --git a/core/tests/unit/ldml/keyboards/k_001_tiny-test.xml b/core/tests/unit/ldml/keyboards/k_001_tiny-test.xml index 827dd54dfa..5494e8f41e 100644 --- a/core/tests/unit/ldml/keyboards/k_001_tiny-test.xml +++ b/core/tests/unit/ldml/keyboards/k_001_tiny-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_006_backspace-test.xml b/core/tests/unit/ldml/keyboards/k_006_backspace-test.xml index c0157f8828..56aa8d8d01 100644 --- a/core/tests/unit/ldml/keyboards/k_006_backspace-test.xml +++ b/core/tests/unit/ldml/keyboards/k_006_backspace-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_007_transform_rgx-test.xml b/core/tests/unit/ldml/keyboards/k_007_transform_rgx-test.xml index f4024275e8..efef244c8b 100644 --- a/core/tests/unit/ldml/keyboards/k_007_transform_rgx-test.xml +++ b/core/tests/unit/ldml/keyboards/k_007_transform_rgx-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_008_transform_norm-test.xml b/core/tests/unit/ldml/keyboards/k_008_transform_norm-test.xml index 52323ea071..e146f5afae 100644 --- a/core/tests/unit/ldml/keyboards/k_008_transform_norm-test.xml +++ b/core/tests/unit/ldml/keyboards/k_008_transform_norm-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_009_transform_nfc-test.xml b/core/tests/unit/ldml/keyboards/k_009_transform_nfc-test.xml index 8d63e86e02..0006f14e27 100644 --- a/core/tests/unit/ldml/keyboards/k_009_transform_nfc-test.xml +++ b/core/tests/unit/ldml/keyboards/k_009_transform_nfc-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_020_fr-test.xml b/core/tests/unit/ldml/keyboards/k_020_fr-test.xml index 22fce78538..662f3ca665 100644 --- a/core/tests/unit/ldml/keyboards/k_020_fr-test.xml +++ b/core/tests/unit/ldml/keyboards/k_020_fr-test.xml @@ -1,6 +1,6 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_200_reorder_nod_Lana-test.xml b/core/tests/unit/ldml/keyboards/k_200_reorder_nod_Lana-test.xml index d23e596bbb..b1eea391af 100644 --- a/core/tests/unit/ldml/keyboards/k_200_reorder_nod_Lana-test.xml +++ b/core/tests/unit/ldml/keyboards/k_200_reorder_nod_Lana-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_201_reorder_esk-test.xml b/core/tests/unit/ldml/keyboards/k_201_reorder_esk-test.xml index fbb3427878..3268aa733e 100644 --- a/core/tests/unit/ldml/keyboards/k_201_reorder_esk-test.xml +++ b/core/tests/unit/ldml/keyboards/k_201_reorder_esk-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_210_marker-test.xml b/core/tests/unit/ldml/keyboards/k_210_marker-test.xml index 22865b12c5..57769f1c18 100644 --- a/core/tests/unit/ldml/keyboards/k_210_marker-test.xml +++ b/core/tests/unit/ldml/keyboards/k_210_marker-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_211_marker_escape-test.xml b/core/tests/unit/ldml/keyboards/k_211_marker_escape-test.xml index 5fb09e7fc5..f1786fb974 100644 --- a/core/tests/unit/ldml/keyboards/k_211_marker_escape-test.xml +++ b/core/tests/unit/ldml/keyboards/k_211_marker_escape-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/k_212_marker_11057-test.xml b/core/tests/unit/ldml/keyboards/k_212_marker_11057-test.xml index 92e2abbf3f..69749bc516 100644 --- a/core/tests/unit/ldml/keyboards/k_212_marker_11057-test.xml +++ b/core/tests/unit/ldml/keyboards/k_212_marker_11057-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/ldml_test-test.xml b/core/tests/unit/ldml/keyboards/ldml_test-test.xml index 2c08741232..0e569ff8c5 100644 --- a/core/tests/unit/ldml/keyboards/ldml_test-test.xml +++ b/core/tests/unit/ldml/keyboards/ldml_test-test.xml @@ -1,5 +1,5 @@ - + diff --git a/core/tests/unit/ldml/keyboards/meson.build b/core/tests/unit/ldml/keyboards/meson.build index 394b8a6811..04a288710c 100644 --- a/core/tests/unit/ldml/keyboards/meson.build +++ b/core/tests/unit/ldml/keyboards/meson.build @@ -5,8 +5,8 @@ # -# keyboards in resources/standards-data/ldml-keyboards/45/3.0/ -# tests in resources/standards-data/ldml-keyboards/45/test/ +# keyboards in resources/standards-data/ldml-keyboards/46/3.0/ +# tests in resources/standards-data/ldml-keyboards/46/test/ tests_from_cldr = [ 'ja-Latn', 'pt-t-k0-abnt2', @@ -57,7 +57,7 @@ tests += tests_from_cldr # Setup kmc kmc_root = meson.global_source_root() / '../developer/src/kmc' -ldml_root = meson.global_source_root() / '../resources/standards-data/ldml-keyboards/45' +ldml_root = meson.global_source_root() / '../resources/standards-data/ldml-keyboards/46' ldml_data = join_paths(ldml_root, '3.0') ldml_testdata = join_paths(ldml_root, 'test') kmc_cmd = [node, '--enable-source-maps', kmc_root] diff --git a/developer/src/common/web/utils/test/fixtures/ldml-keyboard/test-fr.xml b/developer/src/common/web/utils/test/fixtures/ldml-keyboard/test-fr.xml index b92ba41360..fc0224fcb8 100644 --- a/developer/src/common/web/utils/test/fixtures/ldml-keyboard/test-fr.xml +++ b/developer/src/common/web/utils/test/fixtures/ldml-keyboard/test-fr.xml @@ -1,5 +1,5 @@ - + - + diff --git a/developer/src/kmc-ldml/test/fixtures/test-fr.xml b/developer/src/kmc-ldml/test/fixtures/test-fr.xml index a150915901..401a86bdbf 100644 --- a/developer/src/kmc-ldml/test/fixtures/test-fr.xml +++ b/developer/src/kmc-ldml/test/fixtures/test-fr.xml @@ -1,5 +1,5 @@ - + diff --git a/resources/standards-data/ldml-keyboards/45/cldr_info.json b/resources/standards-data/ldml-keyboards/45/cldr_info.json deleted file mode 100644 index c7dd469c87..0000000000 --- a/resources/standards-data/ldml-keyboards/45/cldr_info.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "sha": "dd5776f650183c9172abe2a57313ed41619d41fb", - "description": "release-45", - "date": "Fri, 19 Apr 2024 22:23:26 +0000" -} diff --git a/resources/standards-data/ldml-keyboards/45/readme.md b/resources/standards-data/ldml-keyboards/45/readme.md deleted file mode 100644 index b2265826b7..0000000000 --- a/resources/standards-data/ldml-keyboards/45/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -# ldml-keyboards/techpreview - -See [../readme.md](../readme.md) diff --git a/resources/standards-data/ldml-keyboards/45/3.0/bn.xml b/resources/standards-data/ldml-keyboards/46/3.0/bn.xml similarity index 98% rename from resources/standards-data/ldml-keyboards/45/3.0/bn.xml rename to resources/standards-data/ldml-keyboards/46/3.0/bn.xml index b579e39f38..800f71d7a9 100644 --- a/resources/standards-data/ldml-keyboards/45/3.0/bn.xml +++ b/resources/standards-data/ldml-keyboards/46/3.0/bn.xml @@ -1,4 +1,8 @@ + diff --git a/resources/standards-data/ldml-keyboards/45/3.0/ja-Hira-t-k0-flicks.xml b/resources/standards-data/ldml-keyboards/46/3.0/ja-Hira-t-k0-flicks.xml similarity index 97% rename from resources/standards-data/ldml-keyboards/45/3.0/ja-Hira-t-k0-flicks.xml rename to resources/standards-data/ldml-keyboards/46/3.0/ja-Hira-t-k0-flicks.xml index c10342320a..6448542a26 100644 --- a/resources/standards-data/ldml-keyboards/45/3.0/ja-Hira-t-k0-flicks.xml +++ b/resources/standards-data/ldml-keyboards/46/3.0/ja-Hira-t-k0-flicks.xml @@ -1,4 +1,8 @@ + diff --git a/resources/standards-data/ldml-keyboards/45/3.0/ja-Latn.xml b/resources/standards-data/ldml-keyboards/46/3.0/ja-Latn.xml similarity index 88% rename from resources/standards-data/ldml-keyboards/45/3.0/ja-Latn.xml rename to resources/standards-data/ldml-keyboards/46/3.0/ja-Latn.xml index a2ffda522a..2758d077e8 100644 --- a/resources/standards-data/ldml-keyboards/45/3.0/ja-Latn.xml +++ b/resources/standards-data/ldml-keyboards/46/3.0/ja-Latn.xml @@ -1,4 +1,8 @@ + diff --git a/resources/standards-data/ldml-keyboards/45/3.0/mt-t-k0-47key.xml b/resources/standards-data/ldml-keyboards/46/3.0/mt-t-k0-47key.xml similarity index 95% rename from resources/standards-data/ldml-keyboards/45/3.0/mt-t-k0-47key.xml rename to resources/standards-data/ldml-keyboards/46/3.0/mt-t-k0-47key.xml index 9c7ed0fccc..6a875b37f2 100644 --- a/resources/standards-data/ldml-keyboards/45/3.0/mt-t-k0-47key.xml +++ b/resources/standards-data/ldml-keyboards/46/3.0/mt-t-k0-47key.xml @@ -1,4 +1,8 @@ + diff --git a/resources/standards-data/ldml-keyboards/45/3.0/mt.xml b/resources/standards-data/ldml-keyboards/46/3.0/mt.xml similarity index 95% rename from resources/standards-data/ldml-keyboards/45/3.0/mt.xml rename to resources/standards-data/ldml-keyboards/46/3.0/mt.xml index d552888f7e..b76b08cd9a 100644 --- a/resources/standards-data/ldml-keyboards/45/3.0/mt.xml +++ b/resources/standards-data/ldml-keyboards/46/3.0/mt.xml @@ -4,6 +4,10 @@ Copyright © 1991-2024 Unicode, Inc. SPDX-License-Identifier: Unicode-3.0 CLDR data files are interpreted according to the LDML specification (http://unicode.org/reports/tr35/) --> + diff --git a/resources/standards-data/ldml-keyboards/45/3.0/pcm.xml b/resources/standards-data/ldml-keyboards/46/3.0/pcm.xml similarity index 92% rename from resources/standards-data/ldml-keyboards/45/3.0/pcm.xml rename to resources/standards-data/ldml-keyboards/46/3.0/pcm.xml index 8447330284..cf8002f94d 100644 --- a/resources/standards-data/ldml-keyboards/45/3.0/pcm.xml +++ b/resources/standards-data/ldml-keyboards/46/3.0/pcm.xml @@ -1,4 +1,8 @@ + diff --git a/resources/standards-data/ldml-keyboards/45/3.0/pt-t-k0-abnt2.xml b/resources/standards-data/ldml-keyboards/46/3.0/pt-t-k0-abnt2.xml similarity index 94% rename from resources/standards-data/ldml-keyboards/45/3.0/pt-t-k0-abnt2.xml rename to resources/standards-data/ldml-keyboards/46/3.0/pt-t-k0-abnt2.xml index d612141166..003d1a6af2 100644 --- a/resources/standards-data/ldml-keyboards/45/3.0/pt-t-k0-abnt2.xml +++ b/resources/standards-data/ldml-keyboards/46/3.0/pt-t-k0-abnt2.xml @@ -1,4 +1,8 @@ + diff --git a/resources/standards-data/ldml-keyboards/46/cldr_info.json b/resources/standards-data/ldml-keyboards/46/cldr_info.json new file mode 100644 index 0000000000..8895bf132c --- /dev/null +++ b/resources/standards-data/ldml-keyboards/46/cldr_info.json @@ -0,0 +1,5 @@ +{ + "sha": "e1d37acce5dae468c414172be53b666d58d45be8", + "description": "release-46", + "date": "Thu, 30 Jan 2025 21:17:01 +0000" +} diff --git a/resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboard3.dtd b/resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboard3.dtd similarity index 98% rename from resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboard3.dtd rename to resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboard3.dtd index 618cf1cafd..58f294a37c 100644 --- a/resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboard3.dtd +++ b/resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboard3.dtd @@ -10,7 +10,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + @@ -32,7 +32,7 @@ CLDR data files are interpreted according to the LDML specification (http://unic - + diff --git a/resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboard3.xsd b/resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboard3.xsd similarity index 98% rename from resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboard3.xsd rename to resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboard3.xsd index 6cad096c41..84dc19e492 100644 --- a/resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboard3.xsd +++ b/resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboard3.xsd @@ -35,6 +35,7 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file + @@ -74,10 +75,10 @@ Note: DTD @-annotations are not currently converted to .xsd. For full CLDR file - + - + diff --git a/resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboardTest3.dtd b/resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboardTest3.dtd similarity index 100% rename from resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboardTest3.dtd rename to resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboardTest3.dtd diff --git a/resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboardTest3.xsd b/resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboardTest3.xsd similarity index 100% rename from resources/standards-data/ldml-keyboards/45/dtd/ldmlKeyboardTest3.xsd rename to resources/standards-data/ldml-keyboards/46/dtd/ldmlKeyboardTest3.xsd diff --git a/resources/standards-data/ldml-keyboards/45/import/README.md b/resources/standards-data/ldml-keyboards/46/import/README.md similarity index 100% rename from resources/standards-data/ldml-keyboards/45/import/README.md rename to resources/standards-data/ldml-keyboards/46/import/README.md diff --git a/resources/standards-data/ldml-keyboards/45/import/keys-Latn-implied.xml b/resources/standards-data/ldml-keyboards/46/import/keys-Latn-implied.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/import/keys-Latn-implied.xml rename to resources/standards-data/ldml-keyboards/46/import/keys-Latn-implied.xml diff --git a/resources/standards-data/ldml-keyboards/45/import/keys-Zyyy-currency.xml b/resources/standards-data/ldml-keyboards/46/import/keys-Zyyy-currency.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/import/keys-Zyyy-currency.xml rename to resources/standards-data/ldml-keyboards/46/import/keys-Zyyy-currency.xml diff --git a/resources/standards-data/ldml-keyboards/45/import/keys-Zyyy-punctuation.xml b/resources/standards-data/ldml-keyboards/46/import/keys-Zyyy-punctuation.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/import/keys-Zyyy-punctuation.xml rename to resources/standards-data/ldml-keyboards/46/import/keys-Zyyy-punctuation.xml diff --git a/resources/standards-data/ldml-keyboards/45/import/scanCodes-implied.xml b/resources/standards-data/ldml-keyboards/46/import/scanCodes-implied.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/import/scanCodes-implied.xml rename to resources/standards-data/ldml-keyboards/46/import/scanCodes-implied.xml diff --git a/resources/standards-data/ldml-keyboards/45/ldml-keyboard3.schema.json b/resources/standards-data/ldml-keyboards/46/ldml-keyboard3.schema.json similarity index 99% rename from resources/standards-data/ldml-keyboards/45/ldml-keyboard3.schema.json rename to resources/standards-data/ldml-keyboards/46/ldml-keyboard3.schema.json index fe6496c17e..e6660661fd 100644 --- a/resources/standards-data/ldml-keyboards/45/ldml-keyboard3.schema.json +++ b/resources/standards-data/ldml-keyboards/46/ldml-keyboard3.schema.json @@ -178,9 +178,6 @@ "additionalProperties": false, "properties": { "base": { - "enum": [ - "cldr" - ], "type": "string" }, "path": { @@ -601,7 +598,7 @@ "properties": { "cldrVersion": { "enum": [ - "45" + "46" ], "type": "string" }, @@ -618,7 +615,8 @@ "properties": { "conformsTo": { "enum": [ - "45" + "45", + "46" ], "type": "string" }, @@ -691,6 +689,6 @@ "required": [ "keyboard3" ], - "title": "45/dtd/ldmlKeyboard3.xsd", + "title": "46/dtd/ldmlKeyboard3.xsd", "type": "object" } diff --git a/resources/standards-data/ldml-keyboards/45/ldml-keyboardtest3.schema.json b/resources/standards-data/ldml-keyboards/46/ldml-keyboardtest3.schema.json similarity index 99% rename from resources/standards-data/ldml-keyboards/45/ldml-keyboardtest3.schema.json rename to resources/standards-data/ldml-keyboards/46/ldml-keyboardtest3.schema.json index b386de8882..f3c624a2ce 100644 --- a/resources/standards-data/ldml-keyboards/45/ldml-keyboardtest3.schema.json +++ b/resources/standards-data/ldml-keyboards/46/ldml-keyboardtest3.schema.json @@ -220,6 +220,6 @@ "required": [ "keyboardTest3" ], - "title": "45/dtd/ldmlKeyboardTest3.xsd", + "title": "46/dtd/ldmlKeyboardTest3.xsd", "type": "object" } diff --git a/resources/standards-data/ldml-keyboards/45/test/README.md b/resources/standards-data/ldml-keyboards/46/test/README.md similarity index 100% rename from resources/standards-data/ldml-keyboards/45/test/README.md rename to resources/standards-data/ldml-keyboards/46/test/README.md diff --git a/resources/standards-data/ldml-keyboards/45/test/bn-test.xml b/resources/standards-data/ldml-keyboards/46/test/bn-test.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/test/bn-test.xml rename to resources/standards-data/ldml-keyboards/46/test/bn-test.xml diff --git a/resources/standards-data/ldml-keyboards/45/test/fr-t-k0-test-test.xml b/resources/standards-data/ldml-keyboards/46/test/fr-t-k0-test-test.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/test/fr-t-k0-test-test.xml rename to resources/standards-data/ldml-keyboards/46/test/fr-t-k0-test-test.xml diff --git a/resources/standards-data/ldml-keyboards/45/test/ja-Latn-test.xml b/resources/standards-data/ldml-keyboards/46/test/ja-Latn-test.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/test/ja-Latn-test.xml rename to resources/standards-data/ldml-keyboards/46/test/ja-Latn-test.xml diff --git a/resources/standards-data/ldml-keyboards/45/test/pcm-test.xml b/resources/standards-data/ldml-keyboards/46/test/pcm-test.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/test/pcm-test.xml rename to resources/standards-data/ldml-keyboards/46/test/pcm-test.xml diff --git a/resources/standards-data/ldml-keyboards/45/test/pt-t-k0-abnt2-test.xml b/resources/standards-data/ldml-keyboards/46/test/pt-t-k0-abnt2-test.xml similarity index 100% rename from resources/standards-data/ldml-keyboards/45/test/pt-t-k0-abnt2-test.xml rename to resources/standards-data/ldml-keyboards/46/test/pt-t-k0-abnt2-test.xml diff --git a/resources/standards-data/ldml-keyboards/fixup-schema.js b/resources/standards-data/ldml-keyboards/fixup-schema.js index 4760d24db5..67fdf25753 100644 --- a/resources/standards-data/ldml-keyboards/fixup-schema.js +++ b/resources/standards-data/ldml-keyboards/fixup-schema.js @@ -85,6 +85,8 @@ if (data.title.endsWith('ldmlKeyboard3.xsd')) { delete item.items.type; item.items['$ref'] = `#/definitions/${newName}`; } + // Workaround CLDR-18138 by not making 'cldr' the default for the base + delete data.definitions?.import?.properties?.base?.enum; } if (data.title.endsWith('ldmlKeyboardTest3.xsd')) { From b741a88ca0ac962feafa5414d72fef1445679b23 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 30 Jan 2025 15:42:30 -0600 Subject: [PATCH 043/109] chore(core,developer): treat CLDR v45, 46, 46.1, 47 as 46 Fixes: #11307 --- core/include/ldml/keyman_core_ldml.ts | 8 ++++++++ .../src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts | 3 +++ 2 files changed, 11 insertions(+) diff --git a/core/include/ldml/keyman_core_ldml.ts b/core/include/ldml/keyman_core_ldml.ts index 2794910764..dca18b3c0f 100644 --- a/core/include/ldml/keyman_core_ldml.ts +++ b/core/include/ldml/keyman_core_ldml.ts @@ -564,8 +564,16 @@ class Constants { /** maximum count of markers (not including 'any') */ readonly marker_max_count = this.marker_max_index - this.marker_min_index + 1; + /** + * List of versions to treat as if they were the 'latest' version. + */ + treatAsLatest(version: string): boolean { + return cldrTreatAsLatest.has(version); + } }; +const cldrTreatAsLatest: Set = new Set(['45', '46.1', '47']); + export const constants = new Constants(); // } diff --git a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts index 928bb94bef..4e592f84f2 100644 --- a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts +++ b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts @@ -231,6 +231,9 @@ export class LDMLKeyboardXMLSourceFileReader { this.callbacks.reportMessage(CommonTypesMessages.Error_ImportInvalidPath({base, path, subtag})); return false; } + if (constants.treatAsLatest(paths[0])) { + paths[0] = constants.cldr_version_latest; + } importData = this.readImportFile(paths[0], paths[1]); } else { // local import From b35ba06a2b76e4a37b56ef782357e4c00681930e Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 30 Jan 2025 15:48:02 -0600 Subject: [PATCH 044/109] chore(developer): remove workaround for base="" Fixes: #12749 --- .../web/utils/test/fixtures/ldml-keyboard/import-local.xml | 2 +- .../utils/test/fixtures/ldml-keyboard/invalid-import-local.xml | 2 +- .../src/kmc-ldml/test/fixtures/sections/keys/import-local.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/developer/src/common/web/utils/test/fixtures/ldml-keyboard/import-local.xml b/developer/src/common/web/utils/test/fixtures/ldml-keyboard/import-local.xml index b3cc7cabdf..01bd9f9a43 100644 --- a/developer/src/common/web/utils/test/fixtures/ldml-keyboard/import-local.xml +++ b/developer/src/common/web/utils/test/fixtures/ldml-keyboard/import-local.xml @@ -2,6 +2,6 @@ - + diff --git a/developer/src/common/web/utils/test/fixtures/ldml-keyboard/invalid-import-local.xml b/developer/src/common/web/utils/test/fixtures/ldml-keyboard/invalid-import-local.xml index e8ac9dc964..bb3927a873 100644 --- a/developer/src/common/web/utils/test/fixtures/ldml-keyboard/invalid-import-local.xml +++ b/developer/src/common/web/utils/test/fixtures/ldml-keyboard/invalid-import-local.xml @@ -2,6 +2,6 @@ - + diff --git a/developer/src/kmc-ldml/test/fixtures/sections/keys/import-local.xml b/developer/src/kmc-ldml/test/fixtures/sections/keys/import-local.xml index d97d711301..c3ef2b3ef6 100644 --- a/developer/src/kmc-ldml/test/fixtures/sections/keys/import-local.xml +++ b/developer/src/kmc-ldml/test/fixtures/sections/keys/import-local.xml @@ -4,7 +4,7 @@ - + From 0a8c046c1ae806ba8a1cb59c1a275394b37a095e Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:14:15 +1000 Subject: [PATCH 045/109] feat(windows): remove fmBoot from DoCheckTIPInstallStatus --- windows/src/desktop/kmshell/main/initprog.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index e4002d5a31..e67b542f40 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -453,7 +453,7 @@ begin Exit; end; - if not FSilent and (FMode in [fmStart, fmSplash, fmMain, fmAbout, fmBoot]) then // I4773 + if not FSilent and (FMode in [fmStart, fmSplash, fmMain, fmAbout]) then // I4773 begin DoCheckTIPInstallStatus(False); end; From 7147851b5486983dd18a4fecc7995e1b1812578b Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 31 Jan 2025 08:56:56 +0700 Subject: [PATCH 046/109] chore(developer): remove unused VERBOSE_CopyingFolder message from kmc-copy --- developer/src/kmc-copy/src/copier-messages.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/developer/src/kmc-copy/src/copier-messages.ts b/developer/src/kmc-copy/src/copier-messages.ts index c89b4412b5..c74ab25469 100644 --- a/developer/src/kmc-copy/src/copier-messages.ts +++ b/developer/src/kmc-copy/src/copier-messages.ts @@ -237,10 +237,4 @@ export class CopierMessages { `Copying file '${def(o.from)}' to '${def(o.to)}'`, ); - static VERBOSE_CopyingFolder = SevVerbose | 0x0022; - static Verbose_CopyingFolder = (o:{from: string, to: string}) => m( - this.VERBOSE_CopyingFolder, - `Copying folder '${def(o.from)}' from '${def(o.to)}'`, - ); - }; From 46be7a8b109d97c44ab4df1bac4e8abab3def33d Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 31 Jan 2025 08:58:19 +0700 Subject: [PATCH 047/109] chore(developer): roll back unwanted package editor form changes --- .../src/tike/child/UfrmPackageEditor.dfm | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/developer/src/tike/child/UfrmPackageEditor.dfm b/developer/src/tike/child/UfrmPackageEditor.dfm index 884af89ae3..911781c298 100644 --- a/developer/src/tike/child/UfrmPackageEditor.dfm +++ b/developer/src/tike/child/UfrmPackageEditor.dfm @@ -197,9 +197,6 @@ inherited frmPackageEditor: TfrmPackageEditor object pageFiles: TTabSheet Caption = 'Files' ImageIndex = 3 - ExplicitLeft = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 object Panel1: TPanel Left = 0 Top = 0 @@ -264,7 +261,7 @@ inherited frmPackageEditor: TfrmPackageEditor object lblFileType: TLabel Left = 256 Top = 107 - Width = 46 + Width = 47 Height = 13 Caption = 'File Type:' FocusControl = editFilePath @@ -356,9 +353,6 @@ inherited frmPackageEditor: TfrmPackageEditor object pageKeyboards: TTabSheet Caption = 'Keyboards' ImageIndex = 5 - ExplicitLeft = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 object Panel5: TPanel Left = 0 Top = 0 @@ -664,9 +658,6 @@ inherited frmPackageEditor: TfrmPackageEditor object pageLexicalModels: TTabSheet Caption = 'Lexical Models' ImageIndex = 17 - ExplicitLeft = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 object panLexicalModels: TPanel Left = 0 Top = 0 @@ -953,7 +944,7 @@ inherited frmPackageEditor: TfrmPackageEditor object lblDescriptionMarkdown: TLabel Left = 114 Top = 497 - Width = 214 + Width = 215 Height = 13 Caption = 'Markdown accepted, no embedded HTML' Transparent = True @@ -1166,9 +1157,6 @@ inherited frmPackageEditor: TfrmPackageEditor object pageShortcuts: TTabSheet Caption = 'Shortcuts' ImageIndex = 8 - ExplicitLeft = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 object Panel3: TPanel Left = 0 Top = 0 @@ -1332,16 +1320,10 @@ inherited frmPackageEditor: TfrmPackageEditor object pageSource: TTabSheet Caption = 'Source' ImageIndex = 9 - ExplicitLeft = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 end object pageCompile: TTabSheet Caption = 'Build' ImageIndex = 1 - ExplicitLeft = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 object sbCompile: TScrollBox Left = 0 Top = 0 @@ -1593,7 +1575,7 @@ inherited frmPackageEditor: TfrmPackageEditor object Label5: TLabel Left = 9 Top = 73 - Width = 81 + Width = 82 Height = 13 Caption = 'Target filename:' end From ca2fec729c74ed3b4649bc8a064a82616c33a928 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Fri, 31 Jan 2025 09:44:08 +0700 Subject: [PATCH 048/109] fix(mac): comment changes --- .../Keyman4MacIM/KMInputController.m | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m index 1885f33091..c628311b9f 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMInputController.m @@ -97,16 +97,20 @@ KMInputMethodEventHandler* _eventHandler; os_log_info([KMLogs lifecycleLog], " +++KMInputController, activateServer, self=%p", self); [sender overrideKeyboardWithKeyboardNamed:@"com.apple.keylayout.US"]; - /** - * When this KMInputController becomes the active server for the input method, then immediately update the AppDelegate. - * The duration that this controller is the active server may be extremely short, but, if so, we will receive another - * call to activateServer moments later and can update the AppDelegate again. + /* + When this KMInputController becomes the active server for the input method, + then immediately update the AppDelegate. The duration that this controller is the + active server may be extremely short, but, if so, we will receive another + call to activateServer moments later and can update the AppDelegate again. */ [self attachToAppDelegate]; - /** - * Call the shared lifecycle object so it can evaluate the current state and figure out whether this is a real activation of - * the input method or a change in clients or a false alarm. + /* + Call the shared lifecycle object so it can evaluate the current state + and determine whether this is + 1) a real activation of the input method or + 2) a change in clients or + 3) a false alarm */ [KMInputMethodLifecycle.shared activateClient:sender]; } @@ -121,9 +125,12 @@ KMInputMethodEventHandler* _eventHandler; - (void)deactivateServer:(id)sender { os_log_info([KMLogs lifecycleLog], " +++KMInputController, deactivateServer, self=%p", self); - /** - * Call the shared lifecycle object so it can evaluate the current state and figure out whether this is a real deactivation of - * the input method or a change in clients or a false alarm. + /* + Call the shared lifecycle object so it can evaluate the current state + and determine whether this is + 1) a real deactivation of the input method or + 2) a change in clients or + 3) a false alarm */ [KMInputMethodLifecycle.shared deactivateClient:sender]; } From afa3e3a0b2e2575bf0806365743687244222f834 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 31 Jan 2025 11:01:40 +0700 Subject: [PATCH 049/109] feat(developer): clarify project id format for kmc-copy UI Fixes: #13073 --- developer/docs/help/context/new-project.md | 9 +- .../ui/frmCloneGitHubProjectParameters.png | Bin 22860 -> 24603 bytes .../ui/frmCloneLocalProjectParameters.png | Bin 20202 -> 20230 bytes .../Keyman.System.LexicalModelUtils.pas | 12 ++- ...oject.UfrmCloneGitHubProjectParameters.dfm | 93 +++++++++++------- ...oject.UfrmCloneGitHubProjectParameters.pas | 74 +++++++++----- ...roject.UfrmCloneLocalProjectParameters.dfm | 51 +++++++--- ...roject.UfrmCloneLocalProjectParameters.pas | 65 ++++++++---- 8 files changed, 205 insertions(+), 99 deletions(-) diff --git a/developer/docs/help/context/new-project.md b/developer/docs/help/context/new-project.md index dbd9af4976..8af883788e 100644 --- a/developer/docs/help/context/new-project.md +++ b/developer/docs/help/context/new-project.md @@ -24,17 +24,20 @@ Creates a lexical model project that matches the folder structure used in the Ke ## Clone local project Copies a Keyman keyboard or lexical model project on your local filesystem into -a new folder, giving the project and included files a new name. +a new folder, giving the project and included files a new name. Clicking OK will +open the [Clone Local Project Parameters dialog](clone-local-project-parameters). ## Clone project from Keyman Cloud Copies a Keyman keyboard or lexical model project from keyman.com into a new -folder, giving the project and included files a new name. +folder, giving the project and included files a new name. Clicking OK will +open the [Clone Keyman Cloud Project Parameters dialog](clone-keyman-cloud-project-parameters). ## Clone project from GitHub Copies a Keyman keyboard or lexical model project from a GitHub repository into -a new folder, giving the project and included files a new name. +a new folder, giving the project and included files a new name. Clicking OK will +open the [Clone GitHub Project Parameters dialog](clone-github-project-parameters). # Command line access diff --git a/developer/docs/help/images/ui/frmCloneGitHubProjectParameters.png b/developer/docs/help/images/ui/frmCloneGitHubProjectParameters.png index 71319a3c8a8fbcf1a66dccc5d7c5d1fcce09f3e6..ce7d1c99c3d586e58d9711ade122c7210b4aea30 100644 GIT binary patch literal 24603 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 Xm?%3AAqPRAKh0GGGyR&&x1;|9Wh5#c literal 22860 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 diff --git a/developer/docs/help/images/ui/frmCloneLocalProjectParameters.png b/developer/docs/help/images/ui/frmCloneLocalProjectParameters.png index b9c6e7ac0655a72c36a2aaf5e99f64f8836e3873..705ada692ec2232fe54ee22937822cfcf6368b54 100644 GIT binary patch literal 20230 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 Cv5~a^ literal 20202 zcmbSy1yoeu_wS%cNOww02!eE%AR*liQbTvQNJ|MwcQ=T1qcDtgcS?76zB~H;{r>gV zdvCp2!%~>J=iYnHzI*RaoG?XsNwnw0&p{v%nzWR-G6?i!3D$`6s8TI`6#+-%uFFQf*S$sLWnZK5mqMwdyV!ckNINelYXqf$>uZao zYkGriqQjDad~rXrAaWUSAdw4qbbedBgMI9Ld3u*oNYW9FK`v4uPDKg#kw#imPY-f` zd+D$__+q}<4a4nl5ki;g{e+)J8auo$e_}$dDs&R=P?9Pq61wgf_O1r~xxI=0 zxex`P9ToSp5lJO=b%gr4NWEs)?7Td9=0urA?6AO^rl#l8vG%7Ma(Ao357a`ZEWY@r z(L%vcGB46h&o!(nd8!;Vg?pFYMVWjbS6?|s=hVj0?uNyxqVEtBGu{0+C3DEt?$6a8 z3n2bl!eCDaY<{=>Q8h_%aZh!YQwfhC_m&Y>o#b=_+b-5uxTRbSi0TBP0lK>C zz!@qy&8f|-aK4O`GbY#Ue?q|^n}tdnWI&nPAfAELuOuJN8;3feo%PT&rU z(^@w6W@||%7Ky)p-Rl@g<))Ozet)pk9-Vo&Mt9XXr1lwVhq7V?xiQer8G!USb@%WF zsfTVhU)=xNYVDD~ca37;;IGo!ub(Ysv+NusN#sdbsZ%06x9iiaj4BQ&S*T;Hsszs! zP$JmY&hVPu6Shu8kIa2w-p5;gJ+Zexhg`U6Lo9ELd7QJ(*D-5+9o!;VetbSSnRda&!RIh{Rgfi8Is0(9ErRv*C3%0=2(9(EI9r(nIHNvMGQ3OYYrm+IMzT z@gRytHwh9`ujA2bV(wC()S!#j&K|E{+84r8)6aiMKR(AQOm{7h(z@KdYeM|;)TT_{ z7=H+hypo{G06dovBMCk6S>f}5Q@dMXnOu<+_Ee#lgFfbxw}!EJ|JGX2XO9**K@z%N z!}%J@U-NJ?i`PItmpt2cx!?fm;C|X#oEg5|&40Kx>n5C#d=_peD`Cvh0(`U*Q5jAjZ%4dhZL`KTGb10!ySiKXc=h%{UCT6!T_eaI-~edb`Td+P~V=K7UEOniXS3->JeGb`K`Me$!Dpsb_M};4^a)+BE{7xe)qtw`n zwYx+&_~o3_Nw~oscH1ePUx{?ldiR9*4ZoiwoWb2nV%Hc`@}R6=>uLR$t1V-_nfd^+ zCa6{U;THGtY^h;YQfM6oNoD1;7#aRX(%rxbl8*^jWF|Fu0XMYy3yv{Xy5MuOQc152 ztrt1gE@0#O^qd}ikv8s-ksvomoVB+t#kExgB{t2gl%$11xSiFr);Lh@c~U3RnBcL~ zw7zxMzB+@KbmIid$Sy)*9R0D|hdyqk29FEORny}vg10Eeri8P}#xA^}BSH?y&`7sM z>HX@HvoSIettM7rneBz^*g2i<21F`<$6`9TUUTdC3A*$z&)60AMkdsH12=V)E=(45 zTa|vbYo(zK#U9zHQ(BVWYa=pI=_jmxej&u78Qpa9g1vdajJL{o#aJ8Xx@BW4FT>i% zG0g^tC|;}Q+#M~11yiDsFn(Qrlx95S0pJvwv!N7%Me8O}i)nFG=9qHHzvjVu~R<|X*aMacd zOF|#X_GHgHFCWR{8>{Vn!X={H>hU3i>k^E|BaFu{?~5jgmRSUDJ;v5a4qI>(hV++0 zcN0>)cZJdOe0@(N$ycTyy{TMUeOC=!K)t99le?8cKt^18KXDDj*4_Tn;7a@5xxwxZ zbxt|U5`jVKCE~H*+#V0(3JZ2)TcJ)ZLpRvPn%Oaog`~8hi9@Y`O zH=`vXMsou3Gmlm$mA(Uosn6t*cB|E9F(`cPc32<_d=iPbP71=W@qf3sp07p_Z5d%M z74_E{Vb8J6hIV=V>;bDTffYl!`5c(~Zc_}mipSF z$n)DdXDB82nlEYVZ*eN0-Aa3Z`m8e&hE`#*nlO$Ok<+uUE;B_@5i`krZ6B+c=v}h= zRWrC%K{&GV(N?3I4LR4Y_G)L!yU7LW$Kj4|aC1_*9fft@+a}R+VcC#n^`-r4-JtXF zJfu)1y8Us%K~K3-|6`^1M2Il4KxUP^-}*F{3o_vF#a3 zS|oP67I$P*8aIFZdk_sn>kOa83%s>w96rzTT5eN?3}o}vu4%?!w%_rt#*;0fqi3JG z`D$GHw_Nz$S3)|ET8rDerZevxb_nU0nqmfIuUt58+hX~K=#_@vEsfZ%IC%-WuT-VO zet6Eym!NK(>@z!@_pbIxmF@VG=P2(#J*HO)_t8HlzF#@?wWh1UdviV2d+W=-Tq9q& zIYUXy;L7zX;+(MW+`O9b^8!Yp9oCA|yLqlxh4%yTJY*z}x?RhYY$B{W{dB_BpO=cP zao(WJm8HR7&ntW^k4x7@k&Zp`YQH>W!?uV|QGC4hTcSSrzIFpKxO=x9$v6c$k?XPE zg3YsTt2ggvuvM%MkBk;!#>rK{rCT~?D(O6g#z zB~f}JMy*_~CkkG4x+fP$PacjdpIxHTea_oD4O!P4WhvfhnL#>hqi!D;-X^J=CK~Ba zed~E-##0q7{;|S$ox-?%+^=)99pJ8pSRNTJ$ayFZ9Q&`ZNt{e)Lb+1B5Bt1_mVR|@ z+ELzGo;6VseGQK;U&G0qt!p4+Wz;a8I}B74aGfS1sXDx_sb}7Ej(z@U!bPR%`}z5!apjPrdr2f+6+>^6$cY6md%IhuFTLspLrxT zZEmq*NZf2W_FWy7-Q`~HHdq&ZmhE#oXj*9j!Jj88K^UwMPjjm9OU8z5fa$6Pu|#=yzW+QQHbRFP8jia9#`U=I3Dj4 zS0dXS7fQ9&cTwxJ>>4tmQ$dn2D^E}D*?PN7O?h$H3%^3Ixvmym5Ecr&Cb8ozs9>*< zBv~9R;Kkczk^=kS7bWf3pRc2{Cey;c;27G&0sBIXnC#y}Nmu;n{*1WRk#Kw1^>;XB z!`SVsH{Q0~^Sv7+QQ?whFDUWr`9FShm*qM(yz=h+)kq*eL=6m=BUen(g3Q~gg=#3LWI4K6e-;0=8FsV{HEllH7;xJP2>s+;u_R4qF_I)3c@-+ z5j`{GJ6?IYCjc9>99e@NHxWy$jOJb6W4kyX|qV>jjyr z*ZauImqf;H+|Wl2c{oTgX~bFNI35gC@r*&*8`($CVx(lVoS44ehCJ+zR)omYd>N)4m4L3L zPS09I!xp+O{}atv+eccLC>EpaAK~v6I4#X?S@ZTj56K$Ujj_<>R4WycD@6>+K4))# zuE0L~MaY18Y$}Jlr3HTpL^3 z+VOEj$(Of(Y;`=DjbClfsWr!Bga^3~v!@6dJbcM)lV3o5<^;yhgs^U3L>R@jKU;I( zB%Hm56Nd$gP4+jdg8I+)paXV&kMi1vzgI25e{J`BO4iP^cWR-Q<->=sVSl1i%b2Zv zRqRcS2o;tD2K%4T?)~&X0v8dpc#B5*En6~fI1sk<7#QS2;?mN{uKTku4|1M-i+jX> z@Drh7`yxwwe6<>F42^oR!VG%^whk7WuZ}t~0Mt)=Fsh}c_2cA(jZDZp6yORRF6)%l z)q_t?9CdiZ{w{$1{kp+JzVmVioI_?*dT(fdSy@?DOA9GL6U@H@77AU^{RmWVw^S!v zprNjQ^l*E)I+pps@#@tpMdj~48dnt+6)OOwZ}2#!6}p`n0?QTcueB$#7;L1#ZY-yK z2l&u^r?~KFEl$C9SDYC1{{4GJB_;pQpPw_au!J|im|M(!51gkaXaPW|w)Hwpi<7|M zM@PTKs-{_K$95S=hacV6fCrQG@p4ONX!HX$F=ArZ3Ys**?kEK@31Za<6^naBP*G_m=!uN44`a0vWuGO_PPPKm5aIJbY(p##D^wLP&K71u@?N|6VR{8n)&-D29(@gk; zP%~p`nig!Yg1J3Bw>Wxg1y~|PZl54*U`zF*efS+Q}oL?c|NXHi-Cs$y>AUvuSp zjrQ=GDAZN0P7^4wLMxJ7?6|8aN$Fp|D+cdoU|~=xDaBe8NmEfg5-f;j-sReM^L_lL zU69_YM$Y(%j>rL}iuefb=C9?TQri&grg8Ts6fyw8W&ZFmx|cXEmSG(yl$*mb4mWNn zC9kf&FB(cp$DmeRiq?wA))SOW`@v-?Nl;zD0$S;8Q%!!ja$b7+n-kjPgEFKVCmUIW1* zYCz}@BwNO494DKkJvL2d)@IOQkz>C&UH5FfxRyq{w09c?w$oE{&{rYCS~J{KM8Vvr z=H`SQx>Wx5(XNX#A5uD0cI;u4zAg`8B_Hq((IX zvu^|er##b~Xf+XUwNZ_PDcZkiNZPY;iY@vdiv?)@#6}>&c+%S#OJi7*|J;Y*({yG3 zXM^JqdwRu?@ZN`Tm+fhGBR%3k-37cewd7i@ptiUW2YsK*jEtYxopd7_Xv;eSmdsLL zn8~`Y142OOX6uR3C2fqwJo(`+NG(OZGM)<5`J0}-TR zZ`>>i+%#Uw@esrxddh2vo4I>J7Il9U>4RVcENQB$pL6BDs(my4!Mezh{XyE?7SpD#?GIXw&c<$-3v&;m;ro#4+6R zMWnAQ5z@t4A}z7{c>Lw=ZCQV4gD$gbwA%-z`|8C9il}0iZW*P1D>991{%;0%)%(i0 zr##UCJN;5FAPwM=Y{31=!{I_ye3FB{>7bY#WI^=e-Htu$CoTm`Q7&~jx>7C52hZ<>I&2G_}s~oqI+$upkiJvCk^zhCB{CSpWc;PeV_yXzQb)c zW|=gdEVRCjG~)dHqXgZ?T4J*V8k&|y%|;?QO-fzuNI1{0&T)yPt?fW~8Y-_dPyMRe zOTKSMzuJ>bQ*es+Vwd|uTjHK$CmL+~@%h@UlKVv0q;PaKG(}}SW|Ahh$H}}KwW(E7 zi6GYOTdvvW@52nZSFJ_Ov`eK`!#q1}aIyoS4l1f5Q5S2Zkf=$@yngSH9V*Q(;25kl z*@0lU4|l^GDQGP3+0s`~sA7^t3X{I#$MQ9&&VHg-mA5i4pY6*}2l~iammMPZ1$;+~ zLc)ZcBn`8qNY(2Re}_Q)AkMMtis-S)m&MiMt~DQ2V=1J|lN=k*{HXAZTImO`lIn^d zEIf!+HZeN4d>A`{q*w|asVW-Ook>g9>LYw7Z!BNMdqFiOq_xK#IYEPv%Qt>AF`Xbg z$hopcI$}gqD?rOwef7GR{UH4lV~5}-JkiY60-+GWY=kMr)z(h-RW zz*K=0pZOtThFSJ8sd^~6ae`dVJCw~yH8ART;^=-SIX9BOctei}8n8BR!aVG!vOc;3M7fx3Kn%6uUK{} zqNwvCtachmyMGR&Mfbvb23we?g$knn}3)N9VI&yy+rCB0T(CQjEeMz(jIo6&@RA$p`c z_*f#tzcIWTAfi3iB8{^hqUZ7`?s71_cegdbFrSPYiou#B%Ysrt_t zX_A(nTSzXskH~x8zrxKpm6qJ(h8p`K{({#Jv%x(dLk)Zx`fDp=Oo%+lYqBN-m3GL* zg$3%n(5?SKAU}~erA-jj zshNl{;*QjyI6keKN-04{dSNBU6E@Jpi(k;ZoMIVd!uXrvi}zu&_mEqJapvW95EySL zrKQeJ7K2QnV}GvxPdop<(P0%K!{?jLP9_t zTSSsCaWV5s3#ec8MDe;jzzcWTTWc4-8HxT}-A~Qg$6%cred6M_k3vXjO4aJCJ?zPo ziIGBY(CKVX_5%gtTjhekdlsIu⁢P$jJGpR{Lad-1J^X?qf>T*<`51z*J}>`p=F2 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 bUo5Q7|4^=X1_JC)Ct`QN-llN>x$A!dL}i1< diff --git a/developer/src/common/delphi/lexicalmodels/Keyman.System.LexicalModelUtils.pas b/developer/src/common/delphi/lexicalmodels/Keyman.System.LexicalModelUtils.pas index c367331eee..44120f9cf9 100644 --- a/developer/src/common/delphi/lexicalmodels/Keyman.System.LexicalModelUtils.pas +++ b/developer/src/common/delphi/lexicalmodels/Keyman.System.LexicalModelUtils.pas @@ -4,7 +4,6 @@ interface type TLexicalModelUtils = class - private public const SPackageNameDoesNotFollowLexicalModelConventions_Message: string = 'The package file %0:s does not follow the recommended model filename conventions. The name should be all lower case, '+ @@ -31,6 +30,8 @@ type class function CleanLexicalModelIDComponent(const Name: string): string; static; class function IsCleanLexicalModelIDComponent(const Name: string): Boolean; static; + class function IsValidLexicalModelID(ID: string; EnforceCaseAndWhitespace: Boolean): Boolean; static; + class function ExtractFileExt(filename: string): string; static; class function RemoveFileExt(filename: string): string; static; class function ChangeFileExt(filename, ext: string): string; static; @@ -51,11 +52,20 @@ const // The model ID SHOULD adhere to this pattern (see also developer/src/kmc-model): // author .bcp47 .uniq + MODEL_ID_PATTERN = '^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*$'; MODEL_ID_PATTERN_JS = '^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*\.model\.js$'; MODEL_ID_PATTERN_TS = '^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*\.model\.ts$'; MODEL_ID_PATTERN_PACKAGE = '^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*\.model\.(kps|kmp)$'; MODEL_ID_PATTERN_PROJECT = '^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*\.model\.kpj$'; +class function TLexicalModelUtils.IsValidLexicalModelID(ID: string; + EnforceCaseAndWhitespace: Boolean): Boolean; +begin + if not EnforceCaseAndWhitespace then + ID := LowerCase(Trim(ID)); + Result := TRegEx.IsMatch(ID, MODEL_ID_PATTERN); +end; + class function TLexicalModelUtils.DoesJSFilenameFollowLexicalModelConventions( const Name: string): Boolean; begin diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.dfm b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.dfm index 89c3317276..006aa4b07f 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.dfm +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.dfm @@ -2,16 +2,16 @@ inherited frmCloneGitHubProjectParameters: TfrmCloneGitHubProjectParameters BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Clone Project from GitHub' - ClientHeight = 269 - ClientWidth = 601 + ClientHeight = 297 + ClientWidth = 738 Position = poScreenCenter - ExplicitWidth = 607 - ExplicitHeight = 298 + ExplicitWidth = 744 + ExplicitHeight = 326 PixelsPerInch = 96 TextHeight = 13 object cmdOK: TButton - Left = 441 - Top = 236 + Left = 578 + Top = 264 Width = 73 Height = 25 Anchors = [akRight, akBottom] @@ -19,12 +19,12 @@ inherited frmCloneGitHubProjectParameters: TfrmCloneGitHubProjectParameters Default = True TabOrder = 2 OnClick = cmdOKClick - ExplicitLeft = 449 - ExplicitTop = 218 + ExplicitLeft = 441 + ExplicitTop = 236 end object cmdCancel: TButton - Left = 520 - Top = 236 + Left = 657 + Top = 264 Width = 73 Height = 25 Anchors = [akRight, akBottom] @@ -32,14 +32,14 @@ inherited frmCloneGitHubProjectParameters: TfrmCloneGitHubProjectParameters Caption = 'Cancel' ModalResult = 2 TabOrder = 3 - ExplicitLeft = 528 - ExplicitTop = 218 + ExplicitLeft = 520 + ExplicitTop = 236 end object gbNewProjectDetails: TGroupBox Left = 9 Top = 103 - Width = 584 - Height = 129 + Width = 720 + Height = 154 Caption = 'New Project Details' TabOrder = 1 object lblFileName: TLabel @@ -48,63 +48,82 @@ inherited frmCloneGitHubProjectParameters: TfrmCloneGitHubProjectParameters Width = 76 Height = 13 Caption = '&New project ID:' - FocusControl = editKeyboardID + FocusControl = editProjectID end object lblProjectFilename: TLabel - Left = 16 - Top = 102 + Left = 15 + Top = 126 Width = 101 Height = 13 Caption = 'New project &filename' FocusControl = editProjectFilename end object lblPath: TLabel - Left = 16 - Top = 75 + Left = 15 + Top = 99 Width = 83 Height = 13 Caption = 'Destination &path:' FocusControl = editPath end - object editKeyboardID: TEdit + object lblSourceProjectLexicalModel: TLabel + Left = 15 + Top = 48 + Width = 531 + Height = 13 + Caption = + 'The source project appears to be a lexical model. The new projec' + + 't ID must use the author.bcp47.uniq pattern.' + end + object lblSourceProjectKeyboard: TLabel + Left = 16 + Top = 48 + Width = 682 + Height = 13 + Caption = + 'The source project appears to be a keyboard project. The new pro' + + 'ject ID must be a valid keyboard id pattern (alphanumeric and un' + + 'derscore).' + end + object editProjectID: TEdit Left = 148 Top = 21 Width = 205 Height = 21 TabOrder = 0 - OnChange = editKeyboardIDChange + OnChange = editProjectIDChange end object editProjectFilename: TEdit - Left = 148 - Top = 99 - Width = 429 + Left = 147 + Top = 123 + Width = 564 Height = 21 TabStop = False ParentColor = True ReadOnly = True TabOrder = 4 - OnChange = editKeyboardIDChange + OnChange = editProjectIDChange end object cmdBrowse: TButton - Left = 504 - Top = 72 - Width = 73 + Left = 644 + Top = 96 + Width = 67 Height = 21 Caption = '&Browse...' TabOrder = 3 OnClick = cmdBrowseClick end object editPath: TEdit - Left = 148 - Top = 72 - Width = 350 + Left = 147 + Top = 96 + Width = 491 Height = 21 TabOrder = 2 - OnChange = editPathChange + OnChange = editGitHubURLChange end object chkRelocateExternal: TCheckBox - Left = 148 - Top = 48 + Left = 147 + Top = 72 Width = 257 Height = 17 Caption = 'Relocate &external files into new project folder' @@ -114,7 +133,7 @@ inherited frmCloneGitHubProjectParameters: TfrmCloneGitHubProjectParameters object gbSourceProjectDetails: TGroupBox Left = 8 Top = 8 - Width = 585 + Width = 721 Height = 89 Caption = 'Source Project' TabOrder = 0 @@ -147,10 +166,10 @@ inherited frmCloneGitHubProjectParameters: TfrmCloneGitHubProjectParameters object editGitHubURL: TEdit Left = 149 Top = 16 - Width = 428 + Width = 563 Height = 21 TabOrder = 0 - OnChange = editPathChange + OnChange = editGitHubURLChange end end end diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas index 7207214ab8..ad042fc872 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneGitHubProjectParameters.pas @@ -38,7 +38,7 @@ type gbNewProjectDetails: TGroupBox; lblFileName: TLabel; lblProjectFilename: TLabel; - editKeyboardID: TEdit; + editProjectID: TEdit; editProjectFilename: TEdit; lblPath: TLabel; cmdBrowse: TButton; @@ -49,32 +49,35 @@ type editGitHubURL: TEdit; Label2: TLabel; Label3: TLabel; + lblSourceProjectLexicalModel: TLabel; + lblSourceProjectKeyboard: TLabel; procedure cmdOKClick(Sender: TObject); procedure editSourceProjectFilenameChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure editVersionChange(Sender: TObject); - procedure editPathChange(Sender: TObject); - procedure editKeyboardIDChange(Sender: TObject); + procedure editGitHubURLChange(Sender: TObject); + procedure editProjectIDChange(Sender: TObject); procedure cmdBrowseClick(Sender: TObject); private dlgBrowse: TBrowse4Folder; frmDownloadProgress: TfrmDownloadProgress; function GetBasePath: string; - function GetKeyboardID: string; + function GetProjectID: string; function Validate: Boolean; procedure EnableControls; - procedure SetKeyboardID(const Value: string); procedure UpdateProjectFilename; function GetProjectFilename: string; function GetSourceProjectFilename: string; function GetRelocateExternal: Boolean; procedure DownloadCallback(Owner: TfrmDownloadProgress; var Result: Boolean); procedure DownloadWrapperCallback(var Cancelled: Boolean); + function IsSourceProjectALexicalModelProject: Boolean; + procedure UpdateSourceProjectNote; protected function GetHelpTopic: string; override; public property BasePath: string read GetBasePath; - property KeyboardID: string read GetKeyboardID write SetKeyboardID; + property ProjectID: string read GetProjectID; property ProjectFilename: string read GetProjectFilename; property SourceProjectFilename: string read GetSourceProjectFilename; property RelocateExternal: Boolean read GetRelocateExternal; @@ -95,6 +98,7 @@ uses Keyman.Developer.System.Project.Project, Keyman.Developer.System.Project.ProjectFile, Keyman.System.KeyboardUtils, + Keyman.System.LexicalModelUtils, UfrmMain; {$R *.dfm} @@ -174,6 +178,7 @@ begin dlgBrowse.Root := Desktop; dlgBrowse.Title := 'Select folder to save project to'; + UpdateSourceProjectNote; EnableControls; end; @@ -191,7 +196,13 @@ begin ModalResult := mrOk; end; -procedure TfrmCloneGitHubProjectParameters.editKeyboardIDChange(Sender: TObject); +procedure TfrmCloneGitHubProjectParameters.UpdateSourceProjectNote; +begin + lblSourceProjectLexicalModel.Visible := IsSourceProjectALexicalModelProject; + lblSourceProjectKeyboard.Visible := (editGitHubURL.Text <> '') and not IsSourceProjectALexicalModelProject; +end; + +procedure TfrmCloneGitHubProjectParameters.editProjectIDChange(Sender: TObject); begin UpdateProjectFilename; EnableControls; @@ -202,9 +213,10 @@ begin EnableControls; end; -procedure TfrmCloneGitHubProjectParameters.editPathChange(Sender: TObject); +procedure TfrmCloneGitHubProjectParameters.editGitHubURLChange(Sender: TObject); begin UpdateProjectFilename; + UpdateSourceProjectNote; EnableControls; end; @@ -256,12 +268,20 @@ end; procedure TfrmCloneGitHubProjectParameters.EnableControls; var e: Boolean; + id: string; begin e := IsValidGitHubProjectURL(editGitHubURL.Text) and (Trim(editPath.Text) <> '') and - (Trim(editKeyboardID.Text) <> '') and - TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + (Trim(editProjectID.Text) <> ''); + + if e then + begin + id := Trim(editProjectID.Text); + if IsSourceProjectALexicalModelProject + then e := TLexicalModelUtils.IsValidLexicalModelID(id, True) + else e := TKeyboardUtils.IsValidKeyboardID(id, True); + end; cmdOK.Enabled := e; end; @@ -276,9 +296,9 @@ begin Result := SHelpTopic_Context_CloneGitHubProjectParameters; end; -function TfrmCloneGitHubProjectParameters.GetKeyboardID: string; +function TfrmCloneGitHubProjectParameters.GetProjectID: string; begin - Result := Trim(LowerCase(editKeyboardID.Text)); + Result := Trim(LowerCase(editProjectID.Text)); end; function TfrmCloneGitHubProjectParameters.GetProjectFilename: string; @@ -296,11 +316,27 @@ begin Result := editGitHubURL.Text; end; +function TfrmCloneGitHubProjectParameters.IsSourceProjectALexicalModelProject: Boolean; +var + components: TArray; + sourceId: string; +begin + sourceId := editGitHubURL.Text; + components := sourceId.Split(['\','/']); + if Length(components) = 0 then + Exit(False); + sourceId := components[Length(components) - 1]; + sourceId := ChangeFileExt(sourceId, '').ToLower; + Result := TLexicalModelUtils.IsValidLexicalModelID(sourceId, False); +end; + function TfrmCloneGitHubProjectParameters.Validate: Boolean; var ProjectFolder: string; begin - Result := TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + if IsSourceProjectALexicalModelProject + then Result := TLexicalModelUtils.IsValidLexicalModelID(Trim(editProjectID.Text), True) + else Result := TKeyboardUtils.IsValidKeyboardID(Trim(editProjectID.Text), True); if Result then begin @@ -310,7 +346,7 @@ begin Exit(False); end; - ProjectFolder := IncludeTrailingPathDelimiter(editPath.Text) + editKeyboardID.Text; + ProjectFolder := IncludeTrailingPathDelimiter(editPath.Text) + editProjectID.Text; if DirectoryExists(ProjectFolder) then begin if MessageDlg('The project folder '+ProjectFolder+' already exists. Are you sure you want to overwrite it?', mtWarning, @@ -320,18 +356,12 @@ begin end; end; -procedure TfrmCloneGitHubProjectParameters.SetKeyboardID(const Value: string); -begin - editKeyboardID.Text := Value; - EnableControls; -end; - procedure TfrmCloneGitHubProjectParameters.UpdateProjectFilename; begin editProjectFilename.Text := IncludeTrailingPathDelimiter(BasePath) + - KeyboardID + PathDelim + - KeyboardID + Ext_ProjectSource; + ProjectID + PathDelim + + ProjectID + Ext_ProjectSource; // Scroll to the end of the control to show the filename editProjectFilename.Perform(EM_SETSEL, Length(editProjectFilename.Text), Length(editProjectFilename.Text)); editProjectFilename.Perform(EM_SCROLLCARET, 0, 0); diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.dfm b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.dfm index 598b430bf4..c60a3bcab6 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.dfm +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.dfm @@ -2,16 +2,16 @@ inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters BorderIcons = [biSystemMenu] BorderStyle = bsDialog Caption = 'Clone Project' - ClientHeight = 231 + ClientHeight = 257 ClientWidth = 721 Position = poScreenCenter ExplicitWidth = 727 - ExplicitHeight = 260 + ExplicitHeight = 286 PixelsPerInch = 96 TextHeight = 13 object cmdOK: TButton Left = 561 - Top = 198 + Top = 222 Width = 73 Height = 25 Caption = 'OK' @@ -21,7 +21,7 @@ inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters end object cmdCancel: TButton Left = 640 - Top = 198 + Top = 222 Width = 73 Height = 25 Cancel = True @@ -33,7 +33,7 @@ inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters Left = 8 Top = 63 Width = 705 - Height = 129 + Height = 153 Caption = 'New Project Details' TabOrder = 1 object lblFileName: TLabel @@ -42,11 +42,11 @@ inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters Width = 76 Height = 13 Caption = '&New project ID:' - FocusControl = editKeyboardID + FocusControl = editProjectID end object lblProjectFilename: TLabel Left = 12 - Top = 100 + Top = 124 Width = 101 Height = 13 Caption = 'New project &filename' @@ -54,34 +54,53 @@ inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters end object lblPath: TLabel Left = 12 - Top = 73 + Top = 97 Width = 83 Height = 13 Caption = 'Destination &path:' FocusControl = editPath end - object editKeyboardID: TEdit + object lblSourceProjectLexicalModel: TLabel + Left = 12 + Top = 46 + Width = 531 + Height = 13 + Caption = + 'The source project appears to be a lexical model. The new projec' + + 't ID must use the author.bcp47.uniq pattern.' + end + object lblSourceProjectKeyboard: TLabel + Left = 12 + Top = 46 + Width = 682 + Height = 13 + Caption = + 'The source project appears to be a keyboard project. The new pro' + + 'ject ID must be a valid keyboard id pattern (alphanumeric and un' + + 'derscore).' + end + object editProjectID: TEdit Left = 144 Top = 19 Width = 205 Height = 21 TabOrder = 0 - OnChange = editKeyboardIDChange + OnChange = editProjectIDChange end object editProjectFilename: TEdit Left = 144 - Top = 97 + Top = 121 Width = 553 Height = 21 TabStop = False ParentColor = True ReadOnly = True TabOrder = 4 - OnChange = editKeyboardIDChange + OnChange = editProjectIDChange end object cmdBrowse: TButton Left = 624 - Top = 70 + Top = 94 Width = 73 Height = 21 Caption = '&Browse...' @@ -90,7 +109,7 @@ inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters end object editPath: TEdit Left = 144 - Top = 70 + Top = 94 Width = 474 Height = 21 TabOrder = 2 @@ -98,7 +117,7 @@ inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters end object chkRelocateExternal: TCheckBox Left = 144 - Top = 46 + Top = 70 Width = 257 Height = 17 Caption = 'Relocate &external files into new project folder' @@ -150,6 +169,6 @@ inherited frmCloneLocalProjectParameters: TfrmCloneLocalProjectParameters Options = [fdoPathMustExist, fdoFileMustExist, fdoNoTestFileCreate] Title = 'Select source project' Left = 584 - Top = 16 + Top = 8 end end diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas index d651d95a6f..dc75f96d1f 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas @@ -38,7 +38,7 @@ type lblFileName: TLabel; lblProjectFilename: TLabel; lblPath: TLabel; - editKeyboardID: TEdit; + editProjectID: TEdit; editProjectFilename: TEdit; cmdBrowse: TButton; editPath: TEdit; @@ -47,30 +47,33 @@ type lblKeyboardName: TLabel; editSourceProjectFilename: TEdit; cmdBrowseSourceProject: TButton; + lblSourceProjectLexicalModel: TLabel; + lblSourceProjectKeyboard: TLabel; procedure cmdOKClick(Sender: TObject); procedure editSourceProjectFilenameChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure editVersionChange(Sender: TObject); procedure editPathChange(Sender: TObject); - procedure editKeyboardIDChange(Sender: TObject); + procedure editProjectIDChange(Sender: TObject); procedure cmdBrowseClick(Sender: TObject); procedure cmdBrowseSourceProjectClick(Sender: TObject); private dlgBrowse: TBrowse4Folder; function GetBasePath: string; - function GetKeyboardID: string; + function GetProjectID: string; function Validate: Boolean; procedure EnableControls; - procedure SetKeyboardID(const Value: string); procedure UpdateProjectFilename; function GetProjectFilename: string; function GetSourceProjectFilename: string; function GetRelocateExternal: Boolean; + function IsSourceProjectALexicalModelProject: Boolean; + procedure UpdateSourceProjectNote; protected function GetHelpTopic: string; override; public property BasePath: string read GetBasePath; - property KeyboardID: string read GetKeyboardID write SetKeyboardID; + property ProjectID: string read GetProjectID; property ProjectFilename: string read GetProjectFilename; property SourceProjectFilename: string read GetSourceProjectFilename; property RelocateExternal: Boolean read GetRelocateExternal; @@ -87,6 +90,7 @@ uses Keyman.Developer.System.Project.Project, Keyman.Developer.System.Project.ProjectFile, Keyman.System.KeyboardUtils, + Keyman.System.LexicalModelUtils, UfrmMain; {$R *.dfm} @@ -126,6 +130,7 @@ begin dlgBrowse.Root := Desktop; dlgBrowse.Title := 'Select folder to save project to'; + UpdateSourceProjectNote; EnableControls; end; @@ -143,17 +148,24 @@ begin if dlgBrowseSourceProject.Execute then begin editSourceProjectFilename.Text := dlgBrowseSourceProject.Filename; + UpdateSourceProjectNote; EnableControls; end; end; +procedure TfrmCloneLocalProjectParameters.UpdateSourceProjectNote; +begin + lblSourceProjectLexicalModel.Visible := IsSourceProjectALexicalModelProject; + lblSourceProjectKeyboard.Visible := (editSourceProjectFilename.Text <> '') and not IsSourceProjectALexicalModelProject; +end; + procedure TfrmCloneLocalProjectParameters.cmdOKClick(Sender: TObject); begin if Validate then ModalResult := mrOk; end; -procedure TfrmCloneLocalProjectParameters.editKeyboardIDChange(Sender: TObject); +procedure TfrmCloneLocalProjectParameters.editProjectIDChange(Sender: TObject); begin UpdateProjectFilename; EnableControls; @@ -162,6 +174,7 @@ end; procedure TfrmCloneLocalProjectParameters.editSourceProjectFilenameChange(Sender: TObject); begin EnableControls; + UpdateSourceProjectNote; end; procedure TfrmCloneLocalProjectParameters.editPathChange(Sender: TObject); @@ -175,15 +188,31 @@ begin EnableControls; end; +function TfrmCloneLocalProjectParameters.IsSourceProjectALexicalModelProject: Boolean; +var + sourceId: string; +begin + sourceId := ChangeFileExt(ExtractFileName(editSourceProjectFilename.Text), '').ToLower; + Result := TLexicalModelUtils.IsValidLexicalModelID(sourceId, False); +end; + procedure TfrmCloneLocalProjectParameters.EnableControls; var e: Boolean; + sourceId, id: string; begin e := (Trim(editSourceProjectFilename.Text) <> '') and FileExists(Trim(editSourceProjectFilename.Text)) and (Trim(editPath.Text) <> '') and - (Trim(editKeyboardID.Text) <> '') and - TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + (Trim(editProjectID.Text) <> ''); + + if e then + begin + id := Trim(editProjectID.Text); + if IsSourceProjectALexicalModelProject + then e := TLexicalModelUtils.IsValidLexicalModelID(id, True) + else e := TKeyboardUtils.IsValidKeyboardID(id, True); + end; cmdOK.Enabled := e; end; @@ -198,9 +227,9 @@ begin Result := SHelpTopic_Context_CloneLocalProjectParameters; end; -function TfrmCloneLocalProjectParameters.GetKeyboardID: string; +function TfrmCloneLocalProjectParameters.GetProjectID: string; begin - Result := Trim(LowerCase(editKeyboardID.Text)); + Result := Trim(LowerCase(editProjectID.Text)); end; function TfrmCloneLocalProjectParameters.GetProjectFilename: string; @@ -222,7 +251,9 @@ function TfrmCloneLocalProjectParameters.Validate: Boolean; var ProjectFolder: string; begin - Result := TKeyboardUtils.IsValidKeyboardID(Trim(editKeyboardID.Text), True); + if IsSourceProjectALexicalModelProject + then Result := TLexicalModelUtils.IsValidLexicalModelID(Trim(editProjectID.Text), True) + else Result := TKeyboardUtils.IsValidKeyboardID(Trim(editProjectID.Text), True); if Result then begin @@ -232,7 +263,7 @@ begin Exit(False); end; - ProjectFolder := IncludeTrailingPathDelimiter(editPath.Text) + editKeyboardID.Text; + ProjectFolder := IncludeTrailingPathDelimiter(editPath.Text) + editProjectID.Text; if DirectoryExists(ProjectFolder) then begin if MessageDlg('The project folder '+ProjectFolder+' already exists. Are you sure you want to overwrite it?', mtWarning, @@ -242,18 +273,12 @@ begin end; end; -procedure TfrmCloneLocalProjectParameters.SetKeyboardID(const Value: string); -begin - editKeyboardID.Text := Value; - EnableControls; -end; - procedure TfrmCloneLocalProjectParameters.UpdateProjectFilename; begin editProjectFilename.Text := IncludeTrailingPathDelimiter(BasePath) + - KeyboardID + PathDelim + - KeyboardID + Ext_ProjectSource; + ProjectID + PathDelim + + ProjectID + Ext_ProjectSource; // Scroll to the end of the control to show the filename editProjectFilename.Perform(EM_SETSEL, Length(editProjectFilename.Text), Length(editProjectFilename.Text)); editProjectFilename.Perform(EM_SCROLLCARET, 0, 0); From 595f4864140964c59a1825422ef15efea4fa6fd5 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 31 Jan 2025 05:05:23 +0100 Subject: [PATCH 050/109] chore: Apply suggestions from code review Co-authored-by: rc-swag <58423624+rc-swag@users.noreply.github.com> --- .../src/tike/compile/Keyman.Developer.System.KmcWrapper.pas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas b/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas index 09069b130e..168ea8c77d 100644 --- a/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas +++ b/developer/src/tike/compile/Keyman.Developer.System.KmcWrapper.pas @@ -64,7 +64,7 @@ begin else cmdline := cmdline + ['--no-compiler-warnings-as-errors']; - if FGlobalProject.Options.WarnDeprecatedCode then + if not FGlobalProject.Options.WarnDeprecatedCode then cmdline := cmdline + ['--no-warn-deprecated-code']; if debug then From b54ea4077080661b3ed97d19165181ab69198565 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 30 Jan 2025 23:13:36 -0600 Subject: [PATCH 051/109] chore(developer): update comments per review - note that 45,46,47 are the same data and so aliased Fixes: #11307 --- core/include/ldml/keyman_core_ldml.ts | 1 + .../utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/core/include/ldml/keyman_core_ldml.ts b/core/include/ldml/keyman_core_ldml.ts index dca18b3c0f..093ad839c0 100644 --- a/core/include/ldml/keyman_core_ldml.ts +++ b/core/include/ldml/keyman_core_ldml.ts @@ -572,6 +572,7 @@ class Constants { } }; +/** There's no data or DTD change in 45, 46, 46.1, 47 so map them all to 46 at present. */ const cldrTreatAsLatest: Set = new Set(['45', '46.1', '47']); export const constants = new Constants(); diff --git a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts index 4e592f84f2..0a5abf6355 100644 --- a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts +++ b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts @@ -232,6 +232,7 @@ export class LDMLKeyboardXMLSourceFileReader { return false; } if (constants.treatAsLatest(paths[0])) { + /** There's no data or DTD change in 45, 46, 46.1, 47 so map them all to 46 at present. */ paths[0] = constants.cldr_version_latest; } importData = this.readImportFile(paths[0], paths[1]); From 622900a5d84be3c0b6148654dd2e65cae1ace6da Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 30 Jan 2025 23:42:10 -0600 Subject: [PATCH 052/109] chore(developer): LDML update issue - test needed to be updated Fixes: #11307 --- .../common/web/utils/test/kmx/ldml-keyboard-xml-reader.tests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer/src/common/web/utils/test/kmx/ldml-keyboard-xml-reader.tests.ts b/developer/src/common/web/utils/test/kmx/ldml-keyboard-xml-reader.tests.ts index e3e6fc1e9f..fcb3628144 100644 --- a/developer/src/common/web/utils/test/kmx/ldml-keyboard-xml-reader.tests.ts +++ b/developer/src/common/web/utils/test/kmx/ldml-keyboard-xml-reader.tests.ts @@ -32,7 +32,7 @@ describe('ldml keyboard xml reader tests', function () { instancePath: '/keyboard3/conformsTo', keyword: 'enum', message: `must be equal to one of the allowed values`, - params: 'allowedValues="45"', + params: 'allowedValues="45,46"', // this has to be kept in sync with the DTD })], }, { From 5b4df8e47d3eb6ea35c0a6312e17d5a4ea859800 Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Fri, 31 Jan 2025 14:42:15 +0700 Subject: [PATCH 053/109] change(ios): set host-app bundle identifier in embedded Web debug-report --- .../Keyboard/KeymanWebViewController.swift | 24 +++++++++++-------- .../Contents/Resources/ios-host.js | 5 ++++ web/src/app/webview/src/configuration.ts | 4 ++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/ios/engine/KMEI/KeymanEngine/Classes/Keyboard/KeymanWebViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/Keyboard/KeymanWebViewController.swift index c101ebd832..a7ba6916e2 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/Keyboard/KeymanWebViewController.swift +++ b/ios/engine/KMEI/KeymanEngine/Classes/Keyboard/KeymanWebViewController.swift @@ -137,7 +137,7 @@ class KeymanWebViewController: UIViewController { webView!.backgroundColor = UIColor.clear webView!.navigationDelegate = self webView!.scrollView.isScrollEnabled = false - + if #available(iOSApplicationExtension 16.4, *) { if(Version.current.tier != .stable) { webView!.isInspectable = true @@ -600,6 +600,10 @@ extension KeymanWebViewController: KeymanWebDelegate { os_log("%{public}s", log: KeymanEngineLogger.engine, type: .info, message) SentryManager.breadcrumb(message, sentryLevel: .debug) + // Overwrites the baseline "embeddingApp" text available before Web engine init with the + // active bundle identifier. + webView!.evaluateJavaScript("setHostAppName(\"\(Bundle.main.infoDictionary!["CFBundleIdentifier"]!)\")") + self.setSentryState() resizeKeyboard() @@ -696,7 +700,7 @@ extension KeymanWebViewController: KeymanWebDelegate { // MARK: - Manage views extension KeymanWebViewController { // MARK: - Sizing - + @objc func menuKeyHeld(_ keymanWeb: KeymanWebViewController) { self.delegate?.menuKeyHeld(self) } @@ -713,10 +717,10 @@ extension KeymanWebViewController { let width: CGFloat width = UIScreen.main.bounds.width var height: CGFloat - + // get orientation differently if system or in-app keyboard let portrait = Util.isSystemKeyboard ? InputViewController.isPortrait : UIDevice.current.orientation.isPortrait - + /** * If keyboard height is saved in UserDefaults, then use it */ @@ -728,17 +732,17 @@ extension KeymanWebViewController { */ height = self.determineDefaultKeyboardHeight(isPortrait: portrait) self.writeKeyboardHeightIfDoesNotExist(isPortrait: portrait, height: height) - + /** * If we need to write out the keyboard height for one orientation, then we - * expect that the other must be written also. + * expect that the other must be written also. * Write it out now, but only if a value for keyboard height does not already exist. */ height = self.determineDefaultKeyboardHeight(isPortrait: !portrait) self.writeKeyboardHeightIfDoesNotExist(isPortrait: !portrait, height: height) } - - /** + + /** * no need to check for Util.isSystemKeyboard because this is shared storage * the UserDefaults are readable and writeable by both system and in-app */ @@ -768,7 +772,7 @@ extension KeymanWebViewController { return height; } - + /** * Write out the keyboard height to the UserDefaults but only if it does not exist there yet. * If it exists, then we assume it was configured by the user and do not want to @@ -789,7 +793,7 @@ extension KeymanWebViewController { } } } - + var keyboardSize: CGSize { get { if kbSize.equalTo(CGSize.zero) { diff --git a/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js b/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js index bd323b970b..bdbcd705fc 100644 --- a/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js +++ b/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js @@ -149,6 +149,11 @@ function setKeymanLanguage(stub) { }); } +function setHostAppName(name) { + // Sentry will capture this in a breadcrumb for Web errors. + keyman.config.embeddingApp = name; +} + var fragmentToggle = 0; /** * Inserts the selected string s diff --git a/web/src/app/webview/src/configuration.ts b/web/src/app/webview/src/configuration.ts index d5b7079e6d..507442e6bb 100644 --- a/web/src/app/webview/src/configuration.ts +++ b/web/src/app/webview/src/configuration.ts @@ -47,6 +47,10 @@ export class WebviewConfiguration extends EngineConfiguration { return this._embeddingApp; } + set embeddingApp(name: string) { + this._embeddingApp = name; + } + get oninserttext() { return this._oninserttext; } From 72928c19ef2f595e5b616300f1d61c61726470d1 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 31 Jan 2025 09:04:45 -0600 Subject: [PATCH 054/109] chore(developer): LDML update issue - missed a windows installer location Fixes: #11307 --- developer/src/inst/kmdev.wxs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/developer/src/inst/kmdev.wxs b/developer/src/inst/kmdev.wxs index 832d8c55de..1602f624ff 100644 --- a/developer/src/inst/kmdev.wxs +++ b/developer/src/inst/kmdev.wxs @@ -59,7 +59,7 @@ - + @@ -198,7 +198,7 @@ - + From 00a00f6dda513cc943636d6b7df174e71ba015de Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Thu, 30 Jan 2025 20:27:13 +0100 Subject: [PATCH 055/109] chore(linux): preserve log files when running tests under Docker This change copies the log files that get created during a test run to the `build/docker-linux/tmp` directory. Also fixes a bug when not running in docker. Also create log file for test server. --- linux/ibus-keyman/tests/scripts/run-tests.sh | 6 +++++- linux/ibus-keyman/tests/scripts/test-helper.inc.sh | 13 +++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/linux/ibus-keyman/tests/scripts/run-tests.sh b/linux/ibus-keyman/tests/scripts/run-tests.sh index 012dee996f..4b28327259 100755 --- a/linux/ibus-keyman/tests/scripts/run-tests.sh +++ b/linux/ibus-keyman/tests/scripts/run-tests.sh @@ -65,7 +65,11 @@ function run_tests() { setup "$DISPLAY_SERVER" "$ENV_FILE" "$CLEANUP_FILE" "$PID_FILE" --standalone - echo "# NOTE: When the tests fail check /tmp/ibus-engine-keyman.log and /tmp/ibus-daemon.log!" + if [[ "${DOCKER_RUNNING:-false}" == "true" ]]; then + echo "# NOTE: When the tests fail check ibus-engine-keyman.log, ibus-daemon.log and km-test-server.log in build/docker-linux/tmp/!" + else + echo "# NOTE: When the tests fail check /tmp/ibus-engine-keyman.log, /tmp/ibus-daemon.log and /tmp/km-test-server.log!" + fi echo "" if [ $# -gt 0 ]; then diff --git a/linux/ibus-keyman/tests/scripts/test-helper.inc.sh b/linux/ibus-keyman/tests/scripts/test-helper.inc.sh index 940c5ad310..3287acd05c 100755 --- a/linux/ibus-keyman/tests/scripts/test-helper.inc.sh +++ b/linux/ibus-keyman/tests/scripts/test-helper.inc.sh @@ -140,7 +140,7 @@ function _setup_test_dbus_server() { CLEANUP_FILE=$2 # Start test dbus server. This will create `/tmp/km-test-server.env`. - "${TOP_BINDIR}/tests/km-dbus-test-server" &> /dev/null & + "${TOP_BINDIR}/tests/km-dbus-test-server" &> /tmp/km-test-server.log & sleep 1 cat /tmp/km-test-server.env >> "$ENV_FILE" @@ -251,7 +251,7 @@ function _setup_ibus() { #shellcheck disable=SC2086 ibus-daemon ${ARG_VERBOSE-} --daemonize --panel=disable --address=unix:abstract="${TEMP_DATA_DIR}/test-ibus" ${IBUS_CONFIG-} &> /tmp/ibus-daemon.log PID=$(pgrep -f "${TEMP_DATA_DIR}/test-ibus") - if [[ "${STANDALONE}" == "--standalone" ]] && [[ ! "${DOCKER_RUNNING:-false}" ]]; then + if [[ "${STANDALONE}" == "--standalone" ]] && [[ "${DOCKER_RUNNING:-false}" != "true" ]]; then # manual test run echo "if kill -9 ${PID}; then ibus restart || ibus start; fi # ibus-daemon" >> "${CLEANUP_FILE}" else @@ -321,6 +321,15 @@ function cleanup() { rm "$CLEANUP_FILE" echo "# Finished shutdown of processes." fi + + if [[ "${DOCKER_RUNNING:-false}" == "true" ]]; then + # Note: build/tmp is build/docker-linux/tmp on the host! + BUILD_TMP="$(dirname "$0")/../../../build/tmp" + mkdir -p "${BUILD_TMP}" + [[ -f /tmp/ibus-engine-keyman.log ]] && mv /tmp/ibus-engine-keyman.log "${BUILD_TMP}/ibus-engine-keyman.log" + [[ -f /tmp/ibus-daemon.log ]] && mv /tmp/ibus-daemon.log "${BUILD_TMP}/ibus-daemon.log" + [[ -f /tmp/km-test-server.log ]] && mv /tmp/km-test-server.log "${BUILD_TMP}/km-test-server.log" + fi } function exit_on_package_build() { From 74a615250ba5a5e88fe2239926b27f0796af4ebb Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Fri, 31 Jan 2025 13:03:33 -0500 Subject: [PATCH 056/109] auto: increment master version to 18.0.183 --- HISTORY.md | 16 ++++++++++++++++ VERSION.md | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 8cc14f5dda..fa9c9865f7 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,21 @@ # Keyman Version History +## 18.0.182 alpha 2025-01-31 + +* feat(windows): report on processor type in tsysinfo (#13084) +* fix(common): push branch when creating PR in version history writer (#13082) +* refactor: move langtags to @keymanapp/langtags npm module (#13046) +* chore(developer): use langtags.json for kmc-generate language names (#13047) +* feat(developer): support relocation of external files in kmc-copy (#13061) +* feat(windows): kmshell switch handling for the installing state (#12956) +* feat(windows): add boot switch (#12995) +* docs(web): remove `.md` in help links (#13051) +* chore: add android platform to titles (#13033) +* chore: add the windows platform to titles (#13026) +* fix(mac): properly manage Input Method lifecycle (#13006) +* chore(developer): handle forward slashes in paths in package editor (#13081) +* chore(developer,core,resources): LDML v46 update and remove workaround for import base (#13099) + ## 18.0.181 alpha 2025-01-30 * feat(windows): add localized button captions and form labels (#13025) diff --git a/VERSION.md b/VERSION.md index 618d162822..ecc4c49c5d 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.182 \ No newline at end of file +18.0.183 \ No newline at end of file From 05c17e34390217cac9678ce5e1d733454c2dc511 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 3 Feb 2025 09:53:45 +0700 Subject: [PATCH 057/109] feat(developer): include command line in kmc sentry reports In order to reproduce kmc errors, it's very helpful to know how it was instantiated. This change includes the command line call for kmc. This includes things such as a keyboard filename and may include file paths, but does not include private personal information or secrets. --- .../src/common/web/utils/src/utils/KeymanSentry.ts | 10 ++++++++-- developer/src/kmc/src/util/TestKeymanSentry.ts | 2 +- developer/src/kmc/src/util/kmcSentryOptions.ts | 6 ++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/developer/src/common/web/utils/src/utils/KeymanSentry.ts b/developer/src/common/web/utils/src/utils/KeymanSentry.ts index 94409eafc8..dfe62bfa3d 100644 --- a/developer/src/common/web/utils/src/utils/KeymanSentry.ts +++ b/developer/src/common/web/utils/src/utils/KeymanSentry.ts @@ -64,11 +64,17 @@ export class KeymanSentry { } } - static async captureException(e: any): Promise { + /** + * capture an exception for Sentry; note that in local environments, this will normally + * throw the exception rather than sending to Sentry + * @param e + * @param force if true, reports to Sentry even in local environments + */ + static async captureException(e: any, force?: boolean): Promise { if(isInit) { // For local development, we don't want to bury the trace; we need the cast to avoid // TS2367 (comparison appears to be unintentional) - if((KEYMAN_VERSION.VERSION_ENVIRONMENT as string) == 'local') { + if(!force && (KEYMAN_VERSION.VERSION_ENVIRONMENT as string) == 'local') { throw e; } diff --git a/developer/src/kmc/src/util/TestKeymanSentry.ts b/developer/src/kmc/src/util/TestKeymanSentry.ts index 430ab73d68..b8572516bd 100644 --- a/developer/src/kmc/src/util/TestKeymanSentry.ts +++ b/developer/src/kmc/src/util/TestKeymanSentry.ts @@ -43,7 +43,7 @@ export class TestKeymanSentry { try { throw new Error('Test error from -sentry-client-test-exception event'); } catch(e: any) { - await KeymanSentry.captureException(e); + await KeymanSentry.captureException(e, true); } } } diff --git a/developer/src/kmc/src/util/kmcSentryOptions.ts b/developer/src/kmc/src/util/kmcSentryOptions.ts index bbb5c09a87..4b87990777 100644 --- a/developer/src/kmc/src/util/kmcSentryOptions.ts +++ b/developer/src/kmc/src/util/kmcSentryOptions.ts @@ -1,5 +1,11 @@ +import Sentry from "@sentry/node"; +import * as process from "node:process"; import { SentryNodeOptions } from "@keymanapp/developer-utils"; +Sentry.setContext('Command Line', { + argv: process.argv.join(' ') +}); + /** * Rewrites sourcemap paths for the esbuild distribution of kmc (as used in * Keyman Developer itself) //kmc.mjs to /dist/kmc.mjs, so that From 072c47b853a54e0c37eb87fdc23a74539f10c016 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 3 Feb 2025 10:13:36 +0700 Subject: [PATCH 058/109] fix(developer): pass correct generator options from kmc Also add some resilience to option usage in kmc-generate; more work may need to be done here in future. Fixes: #13110 --- developer/src/kmc/src/commands/generate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer/src/kmc/src/commands/generate.ts b/developer/src/kmc/src/commands/generate.ts index d987c2a43d..b362d01125 100644 --- a/developer/src/kmc/src/commands/generate.ts +++ b/developer/src/kmc/src/commands/generate.ts @@ -115,7 +115,7 @@ async function generate(generator: KeymanCompiler, ids: string | string[], comma const options = commanderOptionsToGeneratorOptions(id, commanderOptions); const callbacks = new NodeCompilerCallbacks(options); - if(!await doGenerate(callbacks, generator, commanderOptions)) { + if(!await doGenerate(callbacks, generator, options)) { return await exitProcess(1); } } From 6a2c01e71faaecc078effc122d44075f2eb08eb9 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Mon, 3 Feb 2025 10:19:46 +0700 Subject: [PATCH 059/109] chore(mac): suppress verbose bash script logging --- mac/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mac/build.sh b/mac/build.sh index 8f17ba868d..00e577a45d 100755 --- a/mac/build.sh +++ b/mac/build.sh @@ -109,7 +109,7 @@ execBuildCommand() { set +e local ret_code=0 eval "$cmnd" || ret_code=$? - set -ex + set -e printXCodeBuildScriptLogs From adf4b80bc0e60bc7cc40b6ce07f5c26b0e884409 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 3 Feb 2025 10:30:13 +0700 Subject: [PATCH 060/109] chore(developer): make kmc-generate more resilient with nullish options --- developer/src/kmc-generate/src/basic-generator.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/developer/src/kmc-generate/src/basic-generator.ts b/developer/src/kmc-generate/src/basic-generator.ts index 4aee4e3c07..9975615523 100644 --- a/developer/src/kmc-generate/src/basic-generator.ts +++ b/developer/src/kmc-generate/src/basic-generator.ts @@ -27,13 +27,13 @@ export class BasicGenerator extends AbstractGenerator { protected preGenerate() { const dt = new Date(); - this.languageTags = this.options.languageTags.length + this.languageTags = this.options.languageTags?.length ? this.options.languageTags.map(tag => new Intl.Locale(tag).minimize().toString()) : [this.DEFAULT_LOCALE]; // Verify that targets passed in are valid let failed = false; - for(const target of this.options.targets) { + for(const target of this.options.targets ?? []) { if(!KeymanTargets.AllKeymanTargets.includes(target)) { this.callbacks.reportMessage(GeneratorMessages.Error_InvalidTarget({target})); failed = true; @@ -43,7 +43,7 @@ export class BasicGenerator extends AbstractGenerator { return false; } - if(this.options.targets.includes(KeymanTargets.KeymanTarget.any) || this.options.targets.length == 0) { + if(this.options.targets?.includes(KeymanTargets.KeymanTarget.any) || !this.options.targets?.length) { this.resolvedTargets = KeymanTargets.AllKeymanTargets.filter(target => target != KeymanTargets.KeymanTarget.any); } else { this.resolvedTargets = [].concat(this.options.targets); From 9eec271011d729ced3c2c524011cd9d7083b7d20 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:25:44 +1000 Subject: [PATCH 061/109] feat(windows): check updates and automatic update merged Check updates meaning has slightly changed it is now automatic updates and it will now check, download and when possible start the install. Previously it just meant a check for upates was made and notified the user of updates. Fixes:#13114 --- common/windows/delphi/general/RegistryKeys.pas | 1 - oem/firstvoices/windows/src/xml/strings.xml | 2 +- windows/src/desktop/kmshell/locale/am-ET/strings.xml | 5 +---- windows/src/desktop/kmshell/locale/az-AZ/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/bwr-NG/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/ckl-NG/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/cs-CZ/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/de/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/el-polyton/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/es-419/strings.xml | 4 ++-- windows/src/desktop/kmshell/locale/ff-NG/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/fr/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/hia-NG/strings.xml | 8 -------- windows/src/desktop/kmshell/locale/id-ID/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/it-IT/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/km-KH/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/kn/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/kr-NG/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/mfi-NG/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/mnw-MM/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/my/strings.xml | 1 - windows/src/desktop/kmshell/locale/nl-NL/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/pl-PL/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/pt-BR/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/pt-PT/strings.xml | 6 +++--- windows/src/desktop/kmshell/locale/qqq/strings.xml | 1 - windows/src/desktop/kmshell/locale/ru-RU/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/shu-latn/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/sv-SE/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/ta/strings.xml | 2 -- windows/src/desktop/kmshell/locale/tr/strings.xml | 1 - windows/src/desktop/kmshell/locale/uk-UA/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/vec/strings.xml | 1 - windows/src/desktop/kmshell/locale/zh-CN/strings.xml | 4 ---- .../kmshell/main/Keyman.System.UpdateStateMachine.pas | 4 ++-- .../desktop/kmshell/main/UImportOlderVersionSettings.pas | 1 - windows/src/desktop/setup/UfrmRunDesktop.pas | 7 +++---- windows/src/engine/kmcomapi/util/utilkeymanoption.pas | 5 ++--- windows/src/global/delphi/general/KeymanOptionNames.pas | 3 +-- windows/src/test/manual-tests/test_i2605/locale-tam.xml | 2 -- 40 files changed, 15 insertions(+), 131 deletions(-) diff --git a/common/windows/delphi/general/RegistryKeys.pas b/common/windows/delphi/general/RegistryKeys.pas index bacca938c6..b40c309ddd 100644 --- a/common/windows/delphi/general/RegistryKeys.pas +++ b/common/windows/delphi/general/RegistryKeys.pas @@ -314,7 +314,6 @@ const SRegValue_ActiveProject_Filename = 'project filename'; SRegValue_ActiveProject_SourcePath = 'source path'; - SRegValue_AutomaticUpdates = 'automatic updates'; //CU SRegValue_CheckForUpdates = 'check for updates'; // CU SRegValue_LastUpdateCheckTime = 'last update check time'; // CU SRegValue_ApplyNow = 'apply now'; // CU Start the install now even though it will require an restart diff --git a/oem/firstvoices/windows/src/xml/strings.xml b/oem/firstvoices/windows/src/xml/strings.xml index 692a582dd7..749dacb8cc 100644 --- a/oem/firstvoices/windows/src/xml/strings.xml +++ b/oem/firstvoices/windows/src/xml/strings.xml @@ -391,7 +391,7 @@ - Automatically download updates in the background, for installation later + Automatically check for updates and download diff --git a/windows/src/desktop/kmshell/locale/am-ET/strings.xml b/windows/src/desktop/kmshell/locale/am-ET/strings.xml index 20e21edee6..cb11dbc397 100644 --- a/windows/src/desktop/kmshell/locale/am-ET/strings.xml +++ b/windows/src/desktop/kmshell/locale/am-ET/strings.xml @@ -321,10 +321,7 @@ የእንኳን ደህና መጡ ምስልን አሳይ - - - - የተሻሻሉ መረጃዎችን ለማግኘት በየሳምንቱ keyman.com ይመልከቱ + diff --git a/windows/src/desktop/kmshell/locale/az-AZ/strings.xml b/windows/src/desktop/kmshell/locale/az-AZ/strings.xml index 26898fe496..68a6aa00b9 100644 --- a/windows/src/desktop/kmshell/locale/az-AZ/strings.xml +++ b/windows/src/desktop/kmshell/locale/az-AZ/strings.xml @@ -303,10 +303,6 @@ Xoş gəldiniz ekranını göstərin - - Yeniləmələr üçün həftəlik keyman.com-u avtomatik olaraq yoxlamaq - - Keyman başlayanda ziddiyyətli tətbiqetmələr üçün test et diff --git a/windows/src/desktop/kmshell/locale/bwr-NG/strings.xml b/windows/src/desktop/kmshell/locale/bwr-NG/strings.xml index 5b45800b3b..76aaaac053 100644 --- a/windows/src/desktop/kmshell/locale/bwr-NG/strings.xml +++ b/windows/src/desktop/kmshell/locale/bwr-NG/strings.xml @@ -303,10 +303,6 @@ Cangtǝ lale ata screen ni - - Pakǝ ka kǝrni akwa keyman.com kǝlara sati kamnyar wutǝ labar na bǝlin - - Ngkǝrha kamnyar sǝndǝr applicationyeri aɗi kǝɓa wa sakatǝ Keyman baɗita diff --git a/windows/src/desktop/kmshell/locale/ckl-NG/strings.xml b/windows/src/desktop/kmshell/locale/ckl-NG/strings.xml index c854c08137..454936a6ee 100644 --- a/windows/src/desktop/kmshell/locale/ckl-NG/strings.xml +++ b/windows/src/desktop/kmshell/locale/ckl-NG/strings.xml @@ -323,10 +323,6 @@ Tsanti welcome screen - - Chakǝnta keyman.com kǝlara sati akuya ka gǝ wulba updatyere - - Nkǝrti ka ngaba suyere kura kal kal akwa applicationyere ma Keyman badicini kǝthlǝr diff --git a/windows/src/desktop/kmshell/locale/cs-CZ/strings.xml b/windows/src/desktop/kmshell/locale/cs-CZ/strings.xml index ef99e2a77f..e1967680c1 100644 --- a/windows/src/desktop/kmshell/locale/cs-CZ/strings.xml +++ b/windows/src/desktop/kmshell/locale/cs-CZ/strings.xml @@ -327,10 +327,6 @@ Zobrazit úvodní obrazovku - - Automaticky kontrolovat aktualizace na keyman.com každý týden - - Test pro protichůdné aplikace při spuštění klíče diff --git a/windows/src/desktop/kmshell/locale/de/strings.xml b/windows/src/desktop/kmshell/locale/de/strings.xml index cf5713f09a..aa4f02dd81 100644 --- a/windows/src/desktop/kmshell/locale/de/strings.xml +++ b/windows/src/desktop/kmshell/locale/de/strings.xml @@ -323,10 +323,6 @@ Willkommensbildschirm anzeigen - - keyman.com wöchentlich auf Updates überprüfen - - Beim Start von Keyman nach inkompatiblen Anwendungen suchen diff --git a/windows/src/desktop/kmshell/locale/el-polyton/strings.xml b/windows/src/desktop/kmshell/locale/el-polyton/strings.xml index 04263b7013..a11a89da39 100644 --- a/windows/src/desktop/kmshell/locale/el-polyton/strings.xml +++ b/windows/src/desktop/kmshell/locale/el-polyton/strings.xml @@ -323,10 +323,6 @@ Προβάλετε τὴν ὀθόνης καλωσορίσματος - - Νὰ ἐλέγχετε σὲ ἑβδομαδιαία βάση τὸ keyman.com γιὰ ἐνημερώσεις - - Κατὰ τὴν ἔναρξη τοῦ Keyman, νὰ ἐξετάζετε ἂν ὑπάρχουν μὴ συμβατὲς ἐφαρμογές diff --git a/windows/src/desktop/kmshell/locale/es-419/strings.xml b/windows/src/desktop/kmshell/locale/es-419/strings.xml index 24ef2431e7..7e8e914711 100644 --- a/windows/src/desktop/kmshell/locale/es-419/strings.xml +++ b/windows/src/desktop/kmshell/locale/es-419/strings.xml @@ -331,8 +331,8 @@ Buscar actualizaciones y descargar automáticamente - - Buscar actualizaciones automáticamente en keyman.com cada semana + + Buscar actualizaciones y descargar automáticamente diff --git a/windows/src/desktop/kmshell/locale/ff-NG/strings.xml b/windows/src/desktop/kmshell/locale/ff-NG/strings.xml index eb5cdbd335..ccb18cebfe 100644 --- a/windows/src/desktop/kmshell/locale/ff-NG/strings.xml +++ b/windows/src/desktop/kmshell/locale/ff-NG/strings.xml @@ -323,10 +323,6 @@ Holla yeeso jaɓɓol - - Yaha ha keyman.com kala ɓaawo asaweere fuu ngam kesitiggo - - Foondu manhajaji ko mari miijo to Keyman fuɗɗi diff --git a/windows/src/desktop/kmshell/locale/fr/strings.xml b/windows/src/desktop/kmshell/locale/fr/strings.xml index ce98e272b3..0274bf3f41 100644 --- a/windows/src/desktop/kmshell/locale/fr/strings.xml +++ b/windows/src/desktop/kmshell/locale/fr/strings.xml @@ -323,10 +323,6 @@ Montrer l\'écran de bienvenue - - Rechercher automatiquement chaque semaine les mises à jour sur www.tavultesoft.com - - Vérifier qu\'il n\'y a pas d\'applications en conflit lorsque Keyman démarre diff --git a/windows/src/desktop/kmshell/locale/hia-NG/strings.xml b/windows/src/desktop/kmshell/locale/hia-NG/strings.xml index af15f87e56..cdcacd422a 100644 --- a/windows/src/desktop/kmshell/locale/hia-NG/strings.xml +++ b/windows/src/desktop/kmshell/locale/hia-NG/strings.xml @@ -299,14 +299,6 @@ Show splash screen - - An marat welcome screen - - - - Automatically check keyman.com weekly for updates - - Test for conflicting applications when Keyman starts diff --git a/windows/src/desktop/kmshell/locale/id-ID/strings.xml b/windows/src/desktop/kmshell/locale/id-ID/strings.xml index 393ed26f61..50f2fe6979 100644 --- a/windows/src/desktop/kmshell/locale/id-ID/strings.xml +++ b/windows/src/desktop/kmshell/locale/id-ID/strings.xml @@ -303,10 +303,6 @@ Tampilkan layar selamat datang - - Cek pembaruan mingguan di keyman.com secara otomatis - - Uji aplikasi yang berkonflik ketika Keyman dinyalakan diff --git a/windows/src/desktop/kmshell/locale/it-IT/strings.xml b/windows/src/desktop/kmshell/locale/it-IT/strings.xml index 797fb76633..a5666fe892 100644 --- a/windows/src/desktop/kmshell/locale/it-IT/strings.xml +++ b/windows/src/desktop/kmshell/locale/it-IT/strings.xml @@ -327,10 +327,6 @@ Mostra schermata di benvenuto - - Controlla automaticamente keyman.com settimanalmente per aggiornamenti - - Prova le applicazioni in conflitto all\'avvio di Keyman diff --git a/windows/src/desktop/kmshell/locale/km-KH/strings.xml b/windows/src/desktop/kmshell/locale/km-KH/strings.xml index ff07459141..c005d5d6ab 100644 --- a/windows/src/desktop/kmshell/locale/km-KH/strings.xml +++ b/windows/src/desktop/kmshell/locale/km-KH/strings.xml @@ -327,10 +327,6 @@ បង្ហាញ​អេក្រង់​ស្វាគមន៍ - - ពិនិត្យ​រក​អាប់ដេតនៅលើ keyman.com ដោយស្វ័យប្រវត្តិ​រៀងរាល់​សប្ដាហ៍ - - តេស្ត​រក​កម្មវិធីដែល​ប្រឆាំងគ្នា ពេល Keyman ចាប់ផ្ដើម diff --git a/windows/src/desktop/kmshell/locale/kn/strings.xml b/windows/src/desktop/kmshell/locale/kn/strings.xml index 35c78b0a04..e013bff77f 100644 --- a/windows/src/desktop/kmshell/locale/kn/strings.xml +++ b/windows/src/desktop/kmshell/locale/kn/strings.xml @@ -323,10 +323,6 @@ ಸ್ವಾಗತ ಪರದೆಯನ್ನು ತೋರಿಸು - - ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನವೀಕರಣಗಳನ್ನು www.keyman.com ನಲ್ಲಿ ಸಾಪ್ತಾಹಿಕವಾಗಿ ಪರಿಶೀಲಿಸು - - ಕೀಮ್ಯಾನ್ ಪ್ರಾರಂಭವಾದಾಗ ವೈಫಲ್ಯದ ಅನ್ವಯಗಳನ್ನು ಪರೀಕ್ಷಿಸು diff --git a/windows/src/desktop/kmshell/locale/kr-NG/strings.xml b/windows/src/desktop/kmshell/locale/kr-NG/strings.xml index 1c3d7cdeef..6bb0b1bf79 100644 --- a/windows/src/desktop/kmshell/locale/kr-NG/strings.xml +++ b/windows/src/desktop/kmshell/locale/kr-NG/strings.xml @@ -303,10 +303,6 @@ Scren wushe kǝnshero fulejin dǝ fulene - - Magǝwo son keyman.com dǝ kulasne waneye awo laa bulin mbejiwa ro - - Applications do sha Keyman dǝa tawaktanyi mebjiwa ro kulasne kawu badijin dǝro diff --git a/windows/src/desktop/kmshell/locale/mfi-NG/strings.xml b/windows/src/desktop/kmshell/locale/mfi-NG/strings.xml index afa391d75b..608abb0f26 100644 --- a/windows/src/desktop/kmshell/locale/mfi-NG/strings.xml +++ b/windows/src/desktop/kmshell/locale/mfi-NG/strings.xml @@ -303,10 +303,6 @@ Mara maraba sikirin - - Zharanahe keyman.com a ba at lokte ba ko mar gé make gé sha updates - - Gé gwadanahe applications na ɓáaka a jemhe an Keyman ma seke fantufe slera diff --git a/windows/src/desktop/kmshell/locale/mnw-MM/strings.xml b/windows/src/desktop/kmshell/locale/mnw-MM/strings.xml index bcb2195dca..24e47fedc1 100644 --- a/windows/src/desktop/kmshell/locale/mnw-MM/strings.xml +++ b/windows/src/desktop/kmshell/locale/mnw-MM/strings.xml @@ -323,10 +323,6 @@ ထ္ၜးမုက်လိက် ဒုၚ်တၠုၚ် - - စၟဳစၟတ် keyman.com သွက် သမၠုၚ်က္ဆံၚ် ဇၟာပ်သတ္တဟ - - စၟဳစၟတ် အပလဳကေယှေန် ပဠပထုဲမာန် အဃောစ ကဳမာန် diff --git a/windows/src/desktop/kmshell/locale/my/strings.xml b/windows/src/desktop/kmshell/locale/my/strings.xml index c0c10c1066..7830d9473a 100644 --- a/windows/src/desktop/kmshell/locale/my/strings.xml +++ b/windows/src/desktop/kmshell/locale/my/strings.xml @@ -11,7 +11,6 @@ Simulate AltGr with Ctrl+Alt ကီးမန်းကီးဘုတ်ကို ရွေးသည့်အခါတိုင်း Screenမှာပေါ်မှာမြင်ရမည့်ကီးဘုတ် ကိုပြပါ ကီးဘုတ်ကိုရွေးချယ်ပြီးပါက သင့်လျော်သော Screenမှာပေါ်မှာမြင်ရမည့်ကီးဘုတ်/အကူအညီကို အလိုအလျောက်ပြပါ - www.tavultesoft.com ကိုအပတ်စဉ် အဆင့်မြှင့်တင်နိုင်ရန်စစ်ဆေးပါ Debugging အဆင့်မြင့် General diff --git a/windows/src/desktop/kmshell/locale/nl-NL/strings.xml b/windows/src/desktop/kmshell/locale/nl-NL/strings.xml index d4e609e7ca..5c14f42c13 100644 --- a/windows/src/desktop/kmshell/locale/nl-NL/strings.xml +++ b/windows/src/desktop/kmshell/locale/nl-NL/strings.xml @@ -303,10 +303,6 @@ Toon welkomstscherm - - Controleer keyman.com wekelijks automatisch op updates - - Test op tegenstrijdige toepassingen wanneer Keyman start diff --git a/windows/src/desktop/kmshell/locale/pl-PL/strings.xml b/windows/src/desktop/kmshell/locale/pl-PL/strings.xml index 234602108a..b815f87e7d 100644 --- a/windows/src/desktop/kmshell/locale/pl-PL/strings.xml +++ b/windows/src/desktop/kmshell/locale/pl-PL/strings.xml @@ -303,10 +303,6 @@ Pokaż ekran powitalny - - Automatycznie sprawdzaj cotygodniowe aktualizacje z keyman.com - - Wyszukaj konfliktujące aplikacje przy starcie Keyman diff --git a/windows/src/desktop/kmshell/locale/pt-BR/strings.xml b/windows/src/desktop/kmshell/locale/pt-BR/strings.xml index 7c7b31dd4a..85a112112a 100644 --- a/windows/src/desktop/kmshell/locale/pt-BR/strings.xml +++ b/windows/src/desktop/kmshell/locale/pt-BR/strings.xml @@ -323,10 +323,6 @@ Show welcome screen - - Automatically check keyman.com weekly for updates - - Test for conflicting applications when Keyman starts diff --git a/windows/src/desktop/kmshell/locale/pt-PT/strings.xml b/windows/src/desktop/kmshell/locale/pt-PT/strings.xml index f6b601a2a1..2886b80d5e 100644 --- a/windows/src/desktop/kmshell/locale/pt-PT/strings.xml +++ b/windows/src/desktop/kmshell/locale/pt-PT/strings.xml @@ -331,8 +331,8 @@ Verificar automaticamente por atualizações e download - - Procurar semanal e automaticamente por atualizações no site www.tavultesoft.com + + Verificar automaticamente por atualizações e download @@ -522,7 +522,7 @@ - Selecione o teclado latino básico + Selecione o teclado latino básico que utiliza no Windows. O teclado Keyman irá se adaptar automaticamente ao seu layout preferido. diff --git a/windows/src/desktop/kmshell/locale/qqq/strings.xml b/windows/src/desktop/kmshell/locale/qqq/strings.xml index a4fb9cbc51..6f1d8b0aaa 100644 --- a/windows/src/desktop/kmshell/locale/qqq/strings.xml +++ b/windows/src/desktop/kmshell/locale/qqq/strings.xml @@ -101,7 +101,6 @@ Create a user interface translation for Keyman Desktop at http://www.tavultesoft [!!Šţářţ ŵĥēń Ŵīŋďơŵš ŝŧâřťš!!] [!!Ŝĥơŵ ŝƥļąšħ šćŕęȅņ!!] [!!Šħơŵ ŵěļĉōmė şĉŕĕěņ!!] - [!!Āűŧőmȁŧĩĉáĺłŷ ćħȅčķ ķěɏmąń.čőm ŵȅėķļȳ ƒőŗ ūƿđȃťėŝ!!] [!!Ţēśŧ ƒőŗ ćōńƒłĭćţıņġ ȃƥƿŀīčäťīōňş ŵĥēƞ !!]Keyman[!! şťǻřţš!!] [!!Ŕěŀęàšĕ Şĥıƒţ/Ĉţřŀ/Ȁľŧ ōň Őņ Ŝčŗėěń Ķēŷƃơâŕđ ȃƒţēŕ ćŀĭċĸīňģ å ĸȅȳ!!] [!!Äľŵȁƴŝ ŝĥŏŵ Őƞ Šċŕėěń ĶĕƴƄōãřđ Ŵīƞďơŵ ŵĥėń Ķěɏmàƞ ķȇƴƃőáŗď ĩš śēļĕĉţěď!!] diff --git a/windows/src/desktop/kmshell/locale/ru-RU/strings.xml b/windows/src/desktop/kmshell/locale/ru-RU/strings.xml index 78f40b158d..9c7520b401 100644 --- a/windows/src/desktop/kmshell/locale/ru-RU/strings.xml +++ b/windows/src/desktop/kmshell/locale/ru-RU/strings.xml @@ -323,10 +323,6 @@ Показать приветственный экран - - Автоматически еженедельно проверять keyman.com на наличие обновлений - - Тестировать конфликтующие приложения при запуске Keyman diff --git a/windows/src/desktop/kmshell/locale/shu-latn/strings.xml b/windows/src/desktop/kmshell/locale/shu-latn/strings.xml index 2fb8f2d7fa..62de6067a1 100644 --- a/windows/src/desktop/kmshell/locale/shu-latn/strings.xml +++ b/windows/src/desktop/kmshell/locale/shu-latn/strings.xml @@ -323,10 +323,6 @@ Waar kan fakkal komfita - - Matakula eishif keyman.com ley shu\'ul judad kan fi - - Eihawul ley shof kan shaba wahid tineyn fi kan Keyman bada bas diff --git a/windows/src/desktop/kmshell/locale/sv-SE/strings.xml b/windows/src/desktop/kmshell/locale/sv-SE/strings.xml index 25bee40aa0..074b88dc4b 100644 --- a/windows/src/desktop/kmshell/locale/sv-SE/strings.xml +++ b/windows/src/desktop/kmshell/locale/sv-SE/strings.xml @@ -323,10 +323,6 @@ Visa välkomstskärm - - Kontrollera automatiskt keyman.com varje vecka efter uppdateringar - - Testa för motstridiga applikationer när Keyman startar diff --git a/windows/src/desktop/kmshell/locale/ta/strings.xml b/windows/src/desktop/kmshell/locale/ta/strings.xml index 9cdbf8494a..63214c2104 100644 --- a/windows/src/desktop/kmshell/locale/ta/strings.xml +++ b/windows/src/desktop/kmshell/locale/ta/strings.xml @@ -255,8 +255,6 @@ Entries not in this file will be sourced from the default locale.xml file in the வரவேற்பு முகப்பு திரையை காண்பிக்க - வாராந்திர மேம்பாட்டிற்கு www.tavultesoft.comல் சோதனையிட - தட்டச்சுப்பலகைக்கான ஹாட் கீ Simulate AltGr with Ctrl+Alt diff --git a/windows/src/desktop/kmshell/locale/tr/strings.xml b/windows/src/desktop/kmshell/locale/tr/strings.xml index 61fd6111e5..688bc45dcb 100644 --- a/windows/src/desktop/kmshell/locale/tr/strings.xml +++ b/windows/src/desktop/kmshell/locale/tr/strings.xml @@ -11,7 +11,6 @@ AltGr'yi Ctrl+Alt ile simüle edin Keyman klavye seçildiğinde daima Ekran Klavyesi Penceresini gösterin Bir klavye seçildiğinde uygun Ekran Klavyesi/ Yardım'a otomatik olarak geçin - Güncellemeler için www.tavultesoft.com adresini haftalık olarak otomatik olarak kontrol edin. Harf imleme tuşlarına düz tuşlar gibi davran Hata Ayıklama Gelişmiş diff --git a/windows/src/desktop/kmshell/locale/uk-UA/strings.xml b/windows/src/desktop/kmshell/locale/uk-UA/strings.xml index 6ef0b34cb5..57d4fb1ab4 100644 --- a/windows/src/desktop/kmshell/locale/uk-UA/strings.xml +++ b/windows/src/desktop/kmshell/locale/uk-UA/strings.xml @@ -323,10 +323,6 @@ Показувати екран привітання - - Автоматично перевіряти файли keyman.com щотижня на наявність оновлень - - Тест на конфліктуючі програми при запуску Keyman diff --git a/windows/src/desktop/kmshell/locale/vec/strings.xml b/windows/src/desktop/kmshell/locale/vec/strings.xml index fbde213e3b..2b2dcc477d 100644 --- a/windows/src/desktop/kmshell/locale/vec/strings.xml +++ b/windows/src/desktop/kmshell/locale/vec/strings.xml @@ -11,7 +11,6 @@ Ìmita AltGr co' Ctrl+Alt Mostra senpre ƚa finèstra de ƚa Mapa Tastièra co xé desernìo ƚa tastièra Keyman Pasa a ƚa pàxena pì pròpia de Mapa Tastièra so Schèrmo co xé desernìo na tastièra - Serca axornamenti so www.tavultesoft.com da to pòsta ògni stimana Debugging Avansà Xeneral diff --git a/windows/src/desktop/kmshell/locale/zh-CN/strings.xml b/windows/src/desktop/kmshell/locale/zh-CN/strings.xml index 086843462d..8a2aeeb020 100644 --- a/windows/src/desktop/kmshell/locale/zh-CN/strings.xml +++ b/windows/src/desktop/kmshell/locale/zh-CN/strings.xml @@ -323,10 +323,6 @@ 显示欢迎屏幕 - - 每周自动检查 keyman.com 上的更新 - - 当Keyman启动时测试相互冲突的应用程序 diff --git a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas index 2347b06f9a..a09a9e5068 100644 --- a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas +++ b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas @@ -359,8 +359,8 @@ begin Registry.RootKey := HKEY_CURRENT_USER; try Result := not Registry.OpenKeyReadOnly(SRegKey_KeymanEngine_CU) or - not Registry.ValueExists(SRegValue_AutomaticUpdates) or - Registry.ReadBool(SRegValue_AutomaticUpdates); + not Registry.ValueExists(SRegValue_CheckForUpdates) or + Registry.ReadBool(SRegValue_CheckForUpdates); except on E: ERegistryException do begin diff --git a/windows/src/desktop/kmshell/main/UImportOlderVersionSettings.pas b/windows/src/desktop/kmshell/main/UImportOlderVersionSettings.pas index 48a8293f50..2eb69f85e3 100644 --- a/windows/src/desktop/kmshell/main/UImportOlderVersionSettings.pas +++ b/windows/src/desktop/kmshell/main/UImportOlderVersionSettings.pas @@ -146,7 +146,6 @@ begin if DoStartWithWindows then kmcom.Options['koStartWithWindows'].Value := True; // I2753 if DoCheckForUpdates then kmcom.Options['koCheckForUpdates'].Value := True; // I2753 - if DoAutomaticUpdates then kmcom.Options['koAutomaticUpdate'].Value := True; if DoAutomaticallyReportUsage then kmcom.Options['koAutomaticallyReportUsage'].Value := True; diff --git a/windows/src/desktop/setup/UfrmRunDesktop.pas b/windows/src/desktop/setup/UfrmRunDesktop.pas index ded19ae75c..436c73e59f 100644 --- a/windows/src/desktop/setup/UfrmRunDesktop.pas +++ b/windows/src/desktop/setup/UfrmRunDesktop.pas @@ -113,7 +113,7 @@ type FCanUpgrade9: Boolean; FCanUpgrade10: Boolean; FCheckForUpdates: Boolean; - FAutomaticUpdates: Boolean; + FStartAfterInstall: Boolean; FStartWithWindows: Boolean; FAutomaticallyReportUsage: Boolean; @@ -524,7 +524,7 @@ begin SetupMSI; // I2644 if GetRunTools.DoInstall(Handle, FStartAfterInstall, FStartWithWindows, FCheckForUpdates, - FAutomaticUpdates, FInstallInfo.StartDisabled, FInstallInfo.StartWithConfiguration, FInstallDefaults, + FInstallInfo.StartDisabled, FInstallInfo.StartWithConfiguration, FInstallDefaults, FAutomaticallyReportUsage, FContinueSetup) then begin if not Silent and not FStartAfterInstall then // I2610 @@ -1033,7 +1033,6 @@ procedure TfrmRunDesktop.GetDefaultSettings; // I2651 begin FStartWithWindows := True; // I2607 FCheckForUpdates := True; // I2609 - FAutomaticUpdates := True; try with CreateHKCURegistry do // I2749 @@ -1043,7 +1042,7 @@ begin FCheckForUpdates := ValueExists(SRegValue_CheckForUpdates) and ReadBool(SRegValue_CheckForUpdates); FStartWithWindows := ValueExists(SRegValue_UpgradeRunKeyman) or (OpenKeyReadOnly('\' + SRegKey_WindowsRun_CU) and ValueExists(SRegValue_WindowsRun_Keyman)); - FAutomaticUpdates := not ValueExists(SRegValue_AutomaticUpdates) or ReadBool(SRegValue_AutomaticUpdates); +// FAutomaticUpdates := not ValueExists(SRegValue_AutomaticUpdates) or ReadBool(SRegValue_AutomaticUpdates); end else if FCanUpgrade10 and OpenKeyReadOnly(SRegKey_KeymanEngine100_ProductOptions_Desktop_CU) then // I4293 diff --git a/windows/src/engine/kmcomapi/util/utilkeymanoption.pas b/windows/src/engine/kmcomapi/util/utilkeymanoption.pas index a7962094c2..144f761fa2 100644 --- a/windows/src/engine/kmcomapi/util/utilkeymanoption.pas +++ b/windows/src/engine/kmcomapi/util/utilkeymanoption.pas @@ -121,7 +121,7 @@ type GroupName: string; end; -const KeymanOptionInfo: array[0..17] of TKeymanOptionInfo = ( // I3331 // I3620 // I4552 +const KeymanOptionInfo: array[0..16] of TKeymanOptionInfo = ( // I3331 // I3620 // I4552 // Global options (opt: koKeyboardHotkeysAreToggle; RegistryName: SRegValue_KeyboardHotkeysAreToggle; OptionType: kotBool; BoolValue: False; GroupName: 'kogGeneral'), @@ -130,7 +130,7 @@ const KeymanOptionInfo: array[0..17] of TKeymanOptionInfo = ( // I3331 // I36 (opt: koRightModifierHK; RegistryName: SRegValue_AllowRightModifierHotKey; OptionType: kotBool; BoolValue: False; GroupName: 'kogGeneral'), (opt: koShowHints; RegistryName: SRegValue_EnableHints; OptionType: kotBool; BoolValue: True; GroupName: 'kogGeneral'), (opt: koBaseLayout; RegistryName: SRegValue_UnderlyingLayout; OptionType: kotLong; IntValue: 0; GroupName: 'kogGeneral'), - (opt: koAutomaticUpdate; RegistryName: SRegValue_AutomaticUpdates; OptionType: kotBool; BoolValue: True; GroupName: 'kogGeneral'), + (opt: koCheckForUpdates; RegistryName: SRegValue_CheckForUpdates; OptionType: kotBool; BoolValue: True; GroupName: 'kogGeneral'), (opt: koAutomaticallyReportErrors; RegistryName: SRegValue_AutomaticallyReportErrors; OptionType: kotBool; BoolValue: True; GroupName: 'kogGeneral'), // I4393 (opt: koAutomaticallyReportUsage; RegistryName: SRegValue_AutomaticallyReportUsage; OptionType: kotBool; BoolValue: True; GroupName: 'kogGeneral'), // I4393 @@ -145,7 +145,6 @@ const KeymanOptionInfo: array[0..17] of TKeymanOptionInfo = ( // I3331 // I36 (opt: koStartWithWindows; RegistryName: ''; OptionType: kotBool; BoolValue: False; GroupName: 'kogStartup'), (opt: koShowStartup; RegistryName: SRegValue_ShowStartup; OptionType: kotBool; BoolValue: True; GroupName: 'kogStartup'), - (opt: koCheckForUpdates; RegistryName: SRegValue_CheckForUpdates; OptionType: kotBool; BoolValue: True; GroupName: 'kogStartup'), (opt: koTestKeymanFunctioning; RegistryName: SRegValue_TestKeymanFunctioning; OptionType: kotBool; BoolValue: True; GroupName: 'kogStartup'), // Advanced options diff --git a/windows/src/global/delphi/general/KeymanOptionNames.pas b/windows/src/global/delphi/general/KeymanOptionNames.pas index 2d4be34c0a..c3cbe423c6 100644 --- a/windows/src/global/delphi/general/KeymanOptionNames.pas +++ b/windows/src/global/delphi/general/KeymanOptionNames.pas @@ -10,12 +10,11 @@ type koRightModifierHK, koReleaseShiftKeysAfterKeyPress, koShowHints, // I1256 - koAutomaticUpdate, + koCheckForUpdates, // Startup options koTestKeymanFunctioning, koStartWithWindows, koShowStartup, - koCheckForUpdates, // Windows options koDebugging, koSwitchLanguageForAllApplications, // I1089 diff --git a/windows/src/test/manual-tests/test_i2605/locale-tam.xml b/windows/src/test/manual-tests/test_i2605/locale-tam.xml index 03e3b94423..3154776c3c 100644 --- a/windows/src/test/manual-tests/test_i2605/locale-tam.xml +++ b/windows/src/test/manual-tests/test_i2605/locale-tam.xml @@ -344,8 +344,6 @@ Entries not in this file will be sourced from the default locale.xml file in the வரவேற்பு முகப்பு திரையை காண்பிக்க - வாராந்திர மேம்பாட்டிற்கு www.tavultesoft.comல் சோதனையிட - தட்டச்சுப்பலகைக்கான ஹாட் கீ Simulate AltGr with Ctrl+Alt From 175bfcaf415144e22442e05602f9fcd597adac45 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 3 Feb 2025 14:44:04 +1000 Subject: [PATCH 062/109] feat(windows): remove old translations check for updates --- windows/src/desktop/kmshell/locale/es-ES/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/ha-HG/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/mrt-NG/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/qqq/locale.xml | 1 - 4 files changed, 13 deletions(-) diff --git a/windows/src/desktop/kmshell/locale/es-ES/strings.xml b/windows/src/desktop/kmshell/locale/es-ES/strings.xml index af321bec5c..ef40f75150 100644 --- a/windows/src/desktop/kmshell/locale/es-ES/strings.xml +++ b/windows/src/desktop/kmshell/locale/es-ES/strings.xml @@ -327,10 +327,6 @@ Mostrar pantalla de bienvenida - - Comprobar automáticamente por actualizaciones semanales en keyman.com - - Comprobar por aplicaciones conflictivas cuando Keyman inicie diff --git a/windows/src/desktop/kmshell/locale/ha-HG/strings.xml b/windows/src/desktop/kmshell/locale/ha-HG/strings.xml index 95246e571c..f65e132d35 100644 --- a/windows/src/desktop/kmshell/locale/ha-HG/strings.xml +++ b/windows/src/desktop/kmshell/locale/ha-HG/strings.xml @@ -303,10 +303,6 @@ Shafin farko na kwamfuta - - A dinga duba keyman.com duk sati domin samun sabbin labarai - - Gwada ayyuka musu cin karo da juna lokacin da keyman ya fara diff --git a/windows/src/desktop/kmshell/locale/mrt-NG/strings.xml b/windows/src/desktop/kmshell/locale/mrt-NG/strings.xml index 13c2abab83..8dda7d33c2 100644 --- a/windows/src/desktop/kmshell/locale/mrt-NG/strings.xml +++ b/windows/src/desktop/kmshell/locale/mrt-NG/strings.xml @@ -303,10 +303,6 @@ Kuga ncha welcome screen - - Kuga kutu keyman.com u kowani magu gadibar su bilin yer - - Ngilaba jili application kuku nanda acitu iu thlir anwa tutuku u latu mai ma Keyman a baditsini diff --git a/windows/src/desktop/kmshell/locale/qqq/locale.xml b/windows/src/desktop/kmshell/locale/qqq/locale.xml index 277dd6a34d..1ab2abe0a7 100644 --- a/windows/src/desktop/kmshell/locale/qqq/locale.xml +++ b/windows/src/desktop/kmshell/locale/qqq/locale.xml @@ -143,7 +143,6 @@ Create a user interface translation for Keyman Desktop at http://www.tavultesoft [!!Šţářţ ŵĥēń Ŵīŋďơŵš ŝŧâřťš!!] [!!Ŝĥơŵ ŝƥļąšħ šćŕęȅņ!!] [!!Šħơŵ ŵěļĉōmė şĉŕĕěņ!!] -[!!Āűŧőmȁŧĩĉáĺłŷ ćħȅčķ ķěɏmąń.čőm ŵȅėķļȳ ƒőŗ ūƿđȃťėŝ!!] [!!Ţēśŧ ƒőŗ ćōńƒłĭćţıņġ ȃƥƿŀīčäťīōňş ŵĥēƞ !!]&Name;[!! şťǻřţš!!] [!!Ŕěŀęàšĕ Şĥıƒţ/Ĉţřŀ/Ȁľŧ ōň Őņ Ŝčŗėěń Ķēŷƃơâŕđ ȃƒţēŕ ćŀĭċĸīňģ å ĸȅȳ!!] From 5fea5b32cd5f364207508e1aae55e18fb052ed9a Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 3 Feb 2025 12:40:10 +0700 Subject: [PATCH 063/109] fix(common): handle undefined input in `@keymanapp/langtags` lookups Matches prior behaviour when langtags was part of kmc-keyboard-info. Fixes: #13116 --- common/web/langtags/src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/web/langtags/src/main.ts b/common/web/langtags/src/main.ts index 44c0a69041..410bae313a 100644 --- a/common/web/langtags/src/main.ts +++ b/common/web/langtags/src/main.ts @@ -114,7 +114,7 @@ function preinit(): void { * @returns LangTag or undefined if not found */ function getLangtagByTag(tag: string): LangTag { - return langtagsByTag.get(tag.toLowerCase()); + return langtagsByTag.get(tag?.toLowerCase()); } preinit(); From 125ebe76f0c04377d539ed0f3a8dc0f27ef66cf5 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 3 Feb 2025 16:25:50 +1000 Subject: [PATCH 064/109] feat(windows): merge check for update part 2 --- .../kmshell/main/UImportOlderVersionSettings.pas | 4 ++-- windows/src/desktop/kmshell/main/initprog.pas | 1 - windows/src/desktop/setup/RunTools.pas | 11 +++++------ windows/src/desktop/setup/UfrmRunDesktop.pas | 1 - 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/windows/src/desktop/kmshell/main/UImportOlderVersionSettings.pas b/windows/src/desktop/kmshell/main/UImportOlderVersionSettings.pas index 2eb69f85e3..9b56a08500 100644 --- a/windows/src/desktop/kmshell/main/UImportOlderVersionSettings.pas +++ b/windows/src/desktop/kmshell/main/UImportOlderVersionSettings.pas @@ -24,7 +24,7 @@ unit UImportOlderVersionSettings; interface -function FirstRunInstallDefaults(DoDefaults,DoStartWithWindows,DoCheckForUpdates,DoAutomaticUpdates: Boolean; FDisablePackages, FDefaultUILanguage: string; DoAutomaticallyReportUsage: Boolean): Boolean; // I2753 +function FirstRunInstallDefaults(DoDefaults,DoStartWithWindows,DoCheckForUpdates: Boolean; FDisablePackages, FDefaultUILanguage: string; DoAutomaticallyReportUsage: Boolean): Boolean; // I2753 implementation @@ -44,7 +44,7 @@ uses Keyman.System.UpdateStateMachine, UImportOlderKeyboardUtils; -function FirstRunInstallDefaults(DoDefaults,DoStartWithWindows,DoCheckForUpdates,DoAutomaticUpdates: Boolean; FDisablePackages, FDefaultUILanguage: string; DoAutomaticallyReportUsage: Boolean): Boolean; // I2753 +function FirstRunInstallDefaults(DoDefaults,DoStartWithWindows,DoCheckForUpdates: Boolean; FDisablePackages, FDefaultUILanguage: string; DoAutomaticallyReportUsage: Boolean): Boolean; // I2753 var n, I: Integer; v: Integer; diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index 70028f79d3..3d0ea7675a 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -629,7 +629,6 @@ begin Pos('installdefaults', FQuery) > 0, Pos('startwithwindows', FQuery) > 0, Pos('checkforupdates', FQuery) > 0, - Pos('automaticupdates', FQuery) > 0, FDisablePackages, FDefaultUILanguage, Pos('automaticallyreportusage', FQuery) > 0); // I2651, I2753 diff --git a/windows/src/desktop/setup/RunTools.pas b/windows/src/desktop/setup/RunTools.pas index 0b654cfeec..341f036c6c 100644 --- a/windows/src/desktop/setup/RunTools.pas +++ b/windows/src/desktop/setup/RunTools.pas @@ -82,7 +82,7 @@ type InstallSuccess: Boolean); function InstallMSI(msiLocation: TInstallInfoFileLocation; var InstallDefaults: Boolean; ContinueSetup: Boolean): Boolean; procedure ConfigFirstRun(StartKeyman,StartWithWindows, - CheckForUpdates,AutomaticUpdates,StartDisabled,StartWithConfiguration,InstallDefaults, + CheckForUpdates,StartDisabled,StartWithConfiguration,InstallDefaults, AutomaticallyReportUsage: Boolean); procedure PrepareForReboot(res: Cardinal; InstallDefaults: Boolean); function RestartWindows: Boolean; @@ -101,7 +101,7 @@ type destructor Destroy; override; procedure CheckInternetConnectedState; function DoInstall(Handle: THandle; - StartAfterInstall, StartWithWindows, CheckForUpdates, AutomaticUpdates, StartDisabled, + StartAfterInstall, StartWithWindows, CheckForUpdates, StartDisabled, StartWithConfiguration, InstallDefaults, AutomaticallyReportUsage, ContinueSetup: Boolean): Boolean; procedure LogError(const msg: WideString; ShowDialogIfNotSilent: Boolean = True); procedure LogInfo(const msg: string; ShowDialogIfNotSilent: Boolean = False); @@ -194,7 +194,7 @@ begin end; function TRunTools.DoInstall(Handle: THandle; - StartAfterInstall, StartWithWindows, CheckForUpdates, AutomaticUpdates, StartDisabled, + StartAfterInstall, StartWithWindows, CheckForUpdates, StartDisabled, StartWithConfiguration, InstallDefaults, AutomaticallyReportUsage, ContinueSetup: Boolean): Boolean; var msiLocation: TInstallInfoFileLocation; @@ -224,7 +224,7 @@ begin Exit(False); end; - ConfigFirstRun(StartAfterInstall,StartWithWindows,CheckForUpdates,AutomaticUpdates, + ConfigFirstRun(StartAfterInstall,StartWithWindows,CheckForUpdates, StartDisabled,StartWithConfiguration,InstallDefaults,AutomaticallyReportUsage); Result := True; @@ -588,7 +588,7 @@ begin end; end; -procedure TRunTools.ConfigFirstRun(StartKeyman,StartWithWindows,CheckForUpdates,AutomaticUpdates, +procedure TRunTools.ConfigFirstRun(StartKeyman,StartWithWindows,CheckForUpdates, StartDisabled,StartWithConfiguration,InstallDefaults,AutomaticallyReportUsage: Boolean); var i: Integer; @@ -686,7 +686,6 @@ begin if StartWithWindows then s := s + 'StartWithWindows,'; if CheckForUpdates then s := s + 'CheckForUpdates,'; - if AutomaticUpdates then s := s + 'AutomaticUpdates,'; if AutomaticallyReportUsage then s := s + 'AutomaticallyReportUsage,'; if InstallDefaults then diff --git a/windows/src/desktop/setup/UfrmRunDesktop.pas b/windows/src/desktop/setup/UfrmRunDesktop.pas index 436c73e59f..170d142a28 100644 --- a/windows/src/desktop/setup/UfrmRunDesktop.pas +++ b/windows/src/desktop/setup/UfrmRunDesktop.pas @@ -1042,7 +1042,6 @@ begin FCheckForUpdates := ValueExists(SRegValue_CheckForUpdates) and ReadBool(SRegValue_CheckForUpdates); FStartWithWindows := ValueExists(SRegValue_UpgradeRunKeyman) or (OpenKeyReadOnly('\' + SRegKey_WindowsRun_CU) and ValueExists(SRegValue_WindowsRun_Keyman)); -// FAutomaticUpdates := not ValueExists(SRegValue_AutomaticUpdates) or ReadBool(SRegValue_AutomaticUpdates); end else if FCanUpgrade10 and OpenKeyReadOnly(SRegKey_KeymanEngine100_ProductOptions_Desktop_CU) then // I4293 From 6dbc20f87bc180c8a310dd8f03a5e4ce9cb50379 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 3 Feb 2025 14:00:58 +0700 Subject: [PATCH 065/109] feat(developer): verify package version number format in kmc-package Ensures that version number field is not blank, and is a recognized format matching the pattern 'number[.number[.number]]'. Each number component should be an integer, without leading zeroes. The format chosen is more restrictive than semver, because much of our existing infrastructure assumes this format anyway. This does lead to a mismatch in version number format for LDML keyboards, which do support semver according to the spec, so this may need to be revisited in the future to allow for full semver formats. Fixes: #13067 --- .../src/compiler/package-compiler-messages.ts | 7 ++++ .../src/compiler/package-version-validator.ts | 13 +++++++ ...package_version_is_unrecognized_format.kps | 32 +++++++++++++++++ .../src/kmc-package/test/messages.tests.ts | 5 +++ .../src/kmc-package/test/versioning.tests.ts | 34 +++++++++++++++++-- 5 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 developer/src/kmc-package/test/fixtures/invalid/warn_package_version_is_unrecognized_format.kps diff --git a/developer/src/kmc-package/src/compiler/package-compiler-messages.ts b/developer/src/kmc-package/src/compiler/package-compiler-messages.ts index 6545b7d963..ca23b2c376 100644 --- a/developer/src/kmc-package/src/compiler/package-compiler-messages.ts +++ b/developer/src/kmc-package/src/compiler/package-compiler-messages.ts @@ -184,5 +184,12 @@ export class PackageCompilerMessages { static Warn_VisualKeyboardFileIsInvalid = (o:{filename: string}) => m( this.WARN_VisualKeyboardFileIsInvalid, `Visual keyboard file '${def(o.filename)}' is invalid.` ); + + static WARN_PackageVersionIsUnrecognizedFormat = SevWarn | 0x0027; + static Warn_PackageVersionIsUnrecognizedFormat = (o:{version: string}) => m( + this.WARN_PackageVersionIsUnrecognizedFormat, `Package version '${def(o.version)}' has an unrecognized format.`, + `The format for version numbers should be number[.number[.number]]. Each + number component should be an integer, without leading zeroes.` + ); } diff --git a/developer/src/kmc-package/src/compiler/package-version-validator.ts b/developer/src/kmc-package/src/compiler/package-version-validator.ts index b20e086aec..b614503829 100644 --- a/developer/src/kmc-package/src/compiler/package-version-validator.ts +++ b/developer/src/kmc-package/src/compiler/package-version-validator.ts @@ -91,6 +91,11 @@ export class PackageVersionValidator { kmp.info.version = {description: kmp.keyboards[0].version}; } + if(result && !isValidVersionNumber(kmp.info.version.description)) { + this.callbacks.reportMessage(PackageCompilerMessages.Warn_PackageVersionIsUnrecognizedFormat({version: kmp.info.version.description})); + return false; + } + return result; } @@ -109,3 +114,11 @@ export class PackageVersionValidator { return true; } } + +function isValidVersionNumber(version: string) { + return /^[0-9]+(\.(0|[1-9]+[0-9]*)){0,2}$/.test(version); +} + +export const unitTestEndpoints = { + isValidVersionNumber, +}; diff --git a/developer/src/kmc-package/test/fixtures/invalid/warn_package_version_is_unrecognized_format.kps b/developer/src/kmc-package/test/fixtures/invalid/warn_package_version_is_unrecognized_format.kps new file mode 100644 index 0000000000..30e310bc6e --- /dev/null +++ b/developer/src/kmc-package/test/fixtures/invalid/warn_package_version_is_unrecognized_format.kps @@ -0,0 +1,32 @@ + + + + 15.0.266.0 + 7.0 + + + + warn_package_version_is_unrecognized_format + © 2019 National Research Council Canada + Eddie Antonio Santos + 1.0-invalid + + + + basic.kmx + Keyboard Basic + 0 + .kmx + + + + + Basic + basic + 1.0 + + Central Khmer (Khmer, Cambodia) + + + + diff --git a/developer/src/kmc-package/test/messages.tests.ts b/developer/src/kmc-package/test/messages.tests.ts index ba5ec56b08..fe41bbb522 100644 --- a/developer/src/kmc-package/test/messages.tests.ts +++ b/developer/src/kmc-package/test/messages.tests.ts @@ -241,4 +241,9 @@ describe('PackageCompilerMessages', function () { await testForMessage(this, ['invalid', 'error_package_file_has_empty_version.kps'], PackageCompilerMessages.ERROR_PackageFileHasEmptyVersion); }); + + it('should generate Warn_PackageVersionIsUnrecognizedFormat if package version field is not a valid format', async function() { + await testForMessage(this, ['invalid', 'warn_package_version_is_unrecognized_format.kps'], + PackageCompilerMessages.WARN_PackageVersionIsUnrecognizedFormat); + }); }); diff --git a/developer/src/kmc-package/test/versioning.tests.ts b/developer/src/kmc-package/test/versioning.tests.ts index 98d00b853c..cbd210750a 100644 --- a/developer/src/kmc-package/test/versioning.tests.ts +++ b/developer/src/kmc-package/test/versioning.tests.ts @@ -1,9 +1,10 @@ import 'mocha'; import { assert } from 'chai'; import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers'; -import { makePathToFixture } from './helpers/index.js'; -import { KmpCompiler } from '../src/compiler/kmp-compiler.js'; import { KmpJsonFile } from '@keymanapp/common-types'; +import { KmpCompiler } from '../src/compiler/kmp-compiler.js'; +import { unitTestEndpoints } from '../src/compiler/package-version-validator.js'; +import { makePathToFixture } from './helpers/index.js'; // This unit test was translated from a Delphi test // Keyman.Test.System.CompilePackageVersioningTest, but note the difference in @@ -41,4 +42,33 @@ describe('package versioning', function () { assert.isTrue(kmpJson !== null); }); } + + it('should validate recognized version numbers', function() { + const goodVersions = [ + '1.0', + '1', + '1.0.2', + '2.2.3', + '9', + '0', + ], badVersions = [ + '0.1m', + '2.3.4.5', + '1.03.4', + 'test', + '1.0-beta', + '', + null, + undefined, + 'xxx', + ]; + + for(const v of goodVersions) { + assert.isTrue(unitTestEndpoints.isValidVersionNumber(v), `'${v}' should be recognized as a valid version number`); + } + + for(const v of badVersions) { + assert.isFalse(unitTestEndpoints.isValidVersionNumber(v), `'${v}' should be recognized as an invalid version number`); + } + }); }); From 706f3996c2c5b685a1f6518a78486e3fd92877b9 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 3 Feb 2025 14:07:38 +0700 Subject: [PATCH 066/109] chore(developer): prevent leading zeroes in initial component of version number --- .../src/kmc-package/src/compiler/package-version-validator.ts | 2 +- developer/src/kmc-package/test/versioning.tests.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/developer/src/kmc-package/src/compiler/package-version-validator.ts b/developer/src/kmc-package/src/compiler/package-version-validator.ts index b614503829..7250b6bef4 100644 --- a/developer/src/kmc-package/src/compiler/package-version-validator.ts +++ b/developer/src/kmc-package/src/compiler/package-version-validator.ts @@ -116,7 +116,7 @@ export class PackageVersionValidator { } function isValidVersionNumber(version: string) { - return /^[0-9]+(\.(0|[1-9]+[0-9]*)){0,2}$/.test(version); + return /^(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*)){0,2}$/.test(version); } export const unitTestEndpoints = { diff --git a/developer/src/kmc-package/test/versioning.tests.ts b/developer/src/kmc-package/test/versioning.tests.ts index cbd210750a..adcba30019 100644 --- a/developer/src/kmc-package/test/versioning.tests.ts +++ b/developer/src/kmc-package/test/versioning.tests.ts @@ -52,6 +52,7 @@ describe('package versioning', function () { '9', '0', ], badVersions = [ + '0001', '0.1m', '2.3.4.5', '1.03.4', From bdfa21128ed1ebeeadd8c17c4fbd8289858a2032 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 3 Feb 2025 11:57:05 +0000 Subject: [PATCH 067/109] fix(common/web): initial boiler plate for kmx-plus-tests.ts --- .../tests/kmx/kmx-plus/kmx-plus.tests.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts diff --git a/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts b/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts new file mode 100644 index 0000000000..0ee2eeefb7 --- /dev/null +++ b/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts @@ -0,0 +1,20 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Created by Dr Mark C. Sinclair on 2025-02-03 + * + * Test code for kmx-plus.ts + */ + +import 'mocha'; +import { assert } from 'chai'; + +describe('Test of KMX Plus file', () => { + describe('Test of Strs', () => { + describe('Test of allocString()', () => { + it('can allocate a StrsItem', () => { + assert.isTrue(true); + }); + }); + }); +}); \ No newline at end of file From 0fabe6614a9640b20a75c857e0acd21b2a3ce737 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 3 Feb 2025 12:47:58 +0000 Subject: [PATCH 068/109] fix(common/web): add test cases for Strs implicit constructor and allocString for a one-character string --- .../tests/kmx/kmx-plus/kmx-plus.tests.ts | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts b/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts index 0ee2eeefb7..c906e0af50 100644 --- a/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts +++ b/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts @@ -8,13 +8,31 @@ import 'mocha'; import { assert } from 'chai'; +import { Strs, StrsItem, StrsOptions, DependencySections } from '../../../src/kmx/kmx-plus/kmx-plus.js'; + +const GOTHIC_A = new StrsItem("𐌰", 0x10330); describe('Test of KMX Plus file', () => { describe('Test of Strs', () => { + describe('Test of implicit constructor', () => { + it('can construct a Strs', () => { + const strs = new Strs(); + assert.isNotNull(strs); + assert.deepEqual(strs.strings, [ new StrsItem('') ]); + assert.deepEqual(strs.allProcessedStrings, new Set()); + }); + }); describe('Test of allocString()', () => { - it('can allocate a StrsItem', () => { - assert.isTrue(true); + it('can allocate a one-character StrsItem', () => { + const strs = new Strs(); + strs['processString'] = stubStrsProcessString; + const csi = strs.allocString("𐌰", { singleOk: true }); + assert.deepEqual(csi, GOTHIC_A); }); }); }); -}); \ No newline at end of file +}); + +function stubStrsProcessString(s: string, opts: StrsOptions, sections: DependencySections) { + return s; +} From 6d060df60159a543c1312cd6c493dc07c7324270 Mon Sep 17 00:00:00 2001 From: "Dr Mark C. Sinclair" Date: Mon, 3 Feb 2025 15:02:05 +0000 Subject: [PATCH 069/109] fix(common/web): add two test cases for Strs.allocString() --- .../tests/kmx/kmx-plus/kmx-plus.tests.ts | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts b/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts index c906e0af50..e1ce5b456c 100644 --- a/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts +++ b/common/web/types/tests/kmx/kmx-plus/kmx-plus.tests.ts @@ -18,17 +18,34 @@ describe('Test of KMX Plus file', () => { it('can construct a Strs', () => { const strs = new Strs(); assert.isNotNull(strs); - assert.deepEqual(strs.strings, [ new StrsItem('') ]); + assert.deepEqual(strs.strings, [new StrsItem('')]); assert.deepEqual(strs.allProcessedStrings, new Set()); }); }); describe('Test of allocString()', () => { - it('can allocate a one-character StrsItem', () => { + it('can allocate a one-character string', () => { const strs = new Strs(); strs['processString'] = stubStrsProcessString; const csi = strs.allocString("𐌰", { singleOk: true }); assert.deepEqual(csi, GOTHIC_A); }); + it('can allocate an unknown string', () => { + const strs = new Strs(); + strs['processString'] = stubStrsProcessString; + const si = strs.allocString("𐌰𐌱𐌲"); + assert.deepEqual(si, new StrsItem("𐌰𐌱𐌲")); + assert.deepEqual(strs.strings, [new StrsItem(''), new StrsItem("𐌰𐌱𐌲")]); + }); + it('can allocate a known string', () => { + const strs = new Strs(); + strs['processString'] = stubStrsProcessString; + const one = strs.allocString("𐌰𐌱𐌲"); + assert.deepEqual(one, new StrsItem("𐌰𐌱𐌲")); + assert.deepEqual(strs.strings, [new StrsItem(''), new StrsItem("𐌰𐌱𐌲")]); + const two = strs.allocString("𐌰𐌱𐌲"); + assert.isTrue(two === one); + assert.deepEqual(strs.strings, [new StrsItem(''), new StrsItem("𐌰𐌱𐌲")]); + }); }); }); }); From 0398f06ca2c9d8bed7e406a26b1a41f31a774381 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Mon, 3 Feb 2025 13:02:12 -0500 Subject: [PATCH 070/109] auto: increment master version to 18.0.184 --- HISTORY.md | 9 +++++++++ VERSION.md | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index fa9c9865f7..cfe47846c1 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,14 @@ # Keyman Version History +## 18.0.183 alpha 2025-02-03 + +* change(ios): set host-app bundle identifier in embedded Web debug-report (#13105) +* fix(ios): prevent message-handler collision (#13037) +* change(web): add context tracker bksp handling, alignment-offset calculations (#12911) +* fix(web): correct edit-path ordering at source (#12925) +* fix(web): correctly track context transitions caused by applying suggestions (#12927) +* chore(linux): preserve log files when running tests under Docker (#13107) + ## 18.0.182 alpha 2025-01-31 * feat(windows): report on processor type in tsysinfo (#13084) diff --git a/VERSION.md b/VERSION.md index ecc4c49c5d..03a1053603 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.183 \ No newline at end of file +18.0.184 \ No newline at end of file From 439c091c9e79c6f11b0da2910335dbc87ebf61e4 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 4 Feb 2025 07:58:52 +0700 Subject: [PATCH 071/109] chore: update docs to reference node 20.0 Relates-to: keyman-keyboards/khmer_angkor#1 --- developer/docs/help/reference/kmc/cli/get-started.md | 2 +- developer/src/inst/node/dist/Keyman_README.md | 2 +- developer/src/kmc/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/developer/docs/help/reference/kmc/cli/get-started.md b/developer/docs/help/reference/kmc/cli/get-started.md index 9147eebda2..cb3e9073e2 100644 --- a/developer/docs/help/reference/kmc/cli/get-started.md +++ b/developer/docs/help/reference/kmc/cli/get-started.md @@ -26,7 +26,7 @@ configuration or installation is required. kmc is also available as an npm package, [@keymanapp/kmc](https://npmjs.com/package/@keymanapp/kmc). -You'll need [node.js](https://nodejs.org/), version 18.0 or later. +You'll need [node.js](https://nodejs.org/), version 20.0 or later. ```shell npm install -g @keymanapp/kmc diff --git a/developer/src/inst/node/dist/Keyman_README.md b/developer/src/inst/node/dist/Keyman_README.md index faf95051f5..6d4ce63744 100644 --- a/developer/src/inst/node/dist/Keyman_README.md +++ b/developer/src/inst/node/dist/Keyman_README.md @@ -1,6 +1,6 @@ # Bundled node.js -We are bundling node 18.14.1 here as of Keyman 17.0.52. +We are bundling node 20.16.1 here as of Keyman 18.0.156-alpha Note that if we change the node version, we will need to rebuild the binary modules in /developer/src/server/src/win32/ diff --git a/developer/src/kmc/README.md b/developer/src/kmc/README.md index 5e5183bff5..cd63fbb7c5 100644 --- a/developer/src/kmc/README.md +++ b/developer/src/kmc/README.md @@ -25,7 +25,7 @@ configuration or installation is required. kmc is also available as an npm package, [@keymanapp/kmc](https://npmjs.com/package/@keymanapp/kmc). -You'll need [node.js](https://nodejs.org/), version 18.0 or later. +You'll need [node.js](https://nodejs.org/), version 20.0 or later. ```shell npm install -g @keymanapp/kmc From 4a879acd9d510c72d0ee3ce5d297c35c0915c4d1 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 4 Feb 2025 10:12:23 +0700 Subject: [PATCH 072/109] chore(developer): minimize PII in sentry cmdline report --- developer/src/kmc/src/util/kmcSentryOptions.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/developer/src/kmc/src/util/kmcSentryOptions.ts b/developer/src/kmc/src/util/kmcSentryOptions.ts index 4b87990777..c6c47f732f 100644 --- a/developer/src/kmc/src/util/kmcSentryOptions.ts +++ b/developer/src/kmc/src/util/kmcSentryOptions.ts @@ -3,7 +3,15 @@ import * as process from "node:process"; import { SentryNodeOptions } from "@keymanapp/developer-utils"; Sentry.setContext('Command Line', { - argv: process.argv.join(' ') + // obfusate parameters with longer paths e.g. from 'c:/users/name/a/b' to + // '…/a/b' to minimize PII risk without losing all command line data. + // Also normalizes backslashes to slashes for simplicity. + argv: process.argv.map(param => { + const p = param.replaceAll('\\', '/').split('/'); + return (p.length < 3) + ? param + : ("…/" + p.slice(-2).join('/')); + }).join(' ') }); /** From d923fe87352c1905b5f5012a6d3e10cc2f2985af Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Tue, 4 Feb 2025 14:12:00 +1000 Subject: [PATCH 073/109] feat(windows): fix localistion check --- windows/src/desktop/kmshell/locale/hia-NG/strings.xml | 4 ++++ windows/src/desktop/kmshell/locale/qqq/locale.xml | 1 + windows/src/desktop/kmshell/locale/qqq/strings.xml | 1 + 3 files changed, 6 insertions(+) diff --git a/windows/src/desktop/kmshell/locale/hia-NG/strings.xml b/windows/src/desktop/kmshell/locale/hia-NG/strings.xml index cdcacd422a..ed2542b71b 100644 --- a/windows/src/desktop/kmshell/locale/hia-NG/strings.xml +++ b/windows/src/desktop/kmshell/locale/hia-NG/strings.xml @@ -299,6 +299,10 @@ Show splash screen + + An marat welcome screen + + Test for conflicting applications when Keyman starts diff --git a/windows/src/desktop/kmshell/locale/qqq/locale.xml b/windows/src/desktop/kmshell/locale/qqq/locale.xml index 1ab2abe0a7..0dfef8f9c7 100644 --- a/windows/src/desktop/kmshell/locale/qqq/locale.xml +++ b/windows/src/desktop/kmshell/locale/qqq/locale.xml @@ -139,6 +139,7 @@ Create a user interface translation for Keyman Desktop at http://www.tavultesoft [!!Şīmũŀàťȇ ĄŀťĞř ŵīţĥ Ćţřľ+Āĺŧ!!] [!!Ťŕėāţ ħȁŗđŵāřĕ ďěãđĸęŷş ǻş ƥľȃįŋ ĸēɏş!!] [!!Ŝĥőŵ ĥĩʼnţ měššàĝȇś!!] +[!!Āűŧőmȁŧĩĉáĺłŷ ćħȅčķ ƒőŗ ūƿđȃťėŝ àńď đōŵʼnłőǻđ!!] [!!Šţářţ ŵĥēń Ŵīŋďơŵš ŝŧâřťš!!] [!!Ŝĥơŵ ŝƥļąšħ šćŕęȅņ!!] diff --git a/windows/src/desktop/kmshell/locale/qqq/strings.xml b/windows/src/desktop/kmshell/locale/qqq/strings.xml index 6f1d8b0aaa..86fbece584 100644 --- a/windows/src/desktop/kmshell/locale/qqq/strings.xml +++ b/windows/src/desktop/kmshell/locale/qqq/strings.xml @@ -98,6 +98,7 @@ Create a user interface translation for Keyman Desktop at http://www.tavultesoft [!!Şīmũŀàťȇ ĄŀťĞř ŵīţĥ Ćţřľ+Āĺŧ!!] [!!Ťŕėāţ ħȁŗđŵāřĕ ďěãđĸęŷş ǻş ƥľȃįŋ ĸēɏş!!] [!!Ŝĥőŵ ĥĩʼnţ měššàĝȇś!!] + [!!Āűŧőmȁŧĩĉáĺłŷ ćħȅčķ ƒőŗ ūƿđȃťėŝ àńď đōŵʼnłőǻđ!!] [!!Šţářţ ŵĥēń Ŵīŋďơŵš ŝŧâřťš!!] [!!Ŝĥơŵ ŝƥļąšħ šćŕęȅņ!!] [!!Šħơŵ ŵěļĉōmė şĉŕĕěņ!!] From a17e8fb4f8c177541c9a86ff77a2ee0a0f6bc793 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Tue, 4 Feb 2025 13:02:14 -0500 Subject: [PATCH 074/109] auto: increment master version to 18.0.185 --- HISTORY.md | 7 +++++++ VERSION.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index cfe47846c1..e7d26f96e5 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ # Keyman Version History +## 18.0.184 alpha 2025-02-04 + +* fix(common): handle undefined input in `@keymanapp/langtags` lookups (#13117) +* chore: update docs to reference node 20.0 (#13124) +* feat(developer): include command line in kmc sentry reports (#13113) +* fix(common/web): replace invalid StrsItem identity checks with isEqual() (#13122) + ## 18.0.183 alpha 2025-02-03 * change(ios): set host-app bundle identifier in embedded Web debug-report (#13105) diff --git a/VERSION.md b/VERSION.md index 03a1053603..c94b2147ac 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.184 \ No newline at end of file +18.0.185 \ No newline at end of file From 698a32f9e05b63bc63b2af2fb2e1e28356379166 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:55:35 +1000 Subject: [PATCH 075/109] feat(windows): remove koAutomaticUpdate strings --- oem/firstvoices/windows/src/xml/strings.xml | 5 ----- windows/src/desktop/kmshell/locale/es-419/strings.xml | 4 ---- windows/src/desktop/kmshell/locale/pt-PT/strings.xml | 4 ---- windows/src/desktop/kmshell/xml/strings.xml | 5 ----- 4 files changed, 18 deletions(-) diff --git a/oem/firstvoices/windows/src/xml/strings.xml b/oem/firstvoices/windows/src/xml/strings.xml index 749dacb8cc..fbd099c8c7 100644 --- a/oem/firstvoices/windows/src/xml/strings.xml +++ b/oem/firstvoices/windows/src/xml/strings.xml @@ -388,11 +388,6 @@ Show welcome screen - - - - Automatically check for updates and download - diff --git a/windows/src/desktop/kmshell/locale/es-419/strings.xml b/windows/src/desktop/kmshell/locale/es-419/strings.xml index 7e8e914711..116683e5bf 100644 --- a/windows/src/desktop/kmshell/locale/es-419/strings.xml +++ b/windows/src/desktop/kmshell/locale/es-419/strings.xml @@ -327,10 +327,6 @@ Mostrar pantalla de bienvenida - - Buscar actualizaciones y descargar automáticamente - - Buscar actualizaciones y descargar automáticamente diff --git a/windows/src/desktop/kmshell/locale/pt-PT/strings.xml b/windows/src/desktop/kmshell/locale/pt-PT/strings.xml index 2886b80d5e..d7a37da3dc 100644 --- a/windows/src/desktop/kmshell/locale/pt-PT/strings.xml +++ b/windows/src/desktop/kmshell/locale/pt-PT/strings.xml @@ -327,10 +327,6 @@ Mostrar ecrã de bem-vindo - - Verificar automaticamente por atualizações e download - - Verificar automaticamente por atualizações e download diff --git a/windows/src/desktop/kmshell/xml/strings.xml b/windows/src/desktop/kmshell/xml/strings.xml index 3c8f20a369..e189103ea3 100644 --- a/windows/src/desktop/kmshell/xml/strings.xml +++ b/windows/src/desktop/kmshell/xml/strings.xml @@ -414,11 +414,6 @@ Show welcome screen - - - - Automatically check for updates and download - From 78520fa32a4604c5100b0cd03d78f97f6915ebf5 Mon Sep 17 00:00:00 2001 From: sgschantz Date: Wed, 5 Feb 2025 12:12:57 +0700 Subject: [PATCH 076/109] chore(mac): update sentry version for firstvoices --- ios/Cartfile.resolved | 2 +- oem/firstvoices/ios/Cartfile | 2 +- oem/firstvoices/ios/Cartfile.resolved | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/Cartfile.resolved b/ios/Cartfile.resolved index 4e1a058a51..ca05da1ae9 100644 --- a/ios/Cartfile.resolved +++ b/ios/Cartfile.resolved @@ -1,4 +1,4 @@ github "ashleymills/Reachability.swift" "v5.2.4" github "devicekit/DeviceKit" "5.5.0" -github "getsentry/sentry-cocoa" "8.38.0" +github "getsentry/sentry-cocoa" "8.44.0" github "weichsel/ZIPFoundation" "0.9.19" diff --git a/oem/firstvoices/ios/Cartfile b/oem/firstvoices/ios/Cartfile index 0dae92f36b..9ffc07d330 100644 --- a/oem/firstvoices/ios/Cartfile +++ b/oem/firstvoices/ios/Cartfile @@ -1,4 +1,4 @@ github "weichsel/ZIPFoundation" ~> 0.9 github "devicekit/DeviceKit" ~> 5.0 github "ashleymills/Reachability.swift" -github "getsentry/sentry-cocoa" ~> 8.7.0 +github "getsentry/sentry-cocoa" ~> 8.38.0 diff --git a/oem/firstvoices/ios/Cartfile.resolved b/oem/firstvoices/ios/Cartfile.resolved index 95e608b932..ca05da1ae9 100644 --- a/oem/firstvoices/ios/Cartfile.resolved +++ b/oem/firstvoices/ios/Cartfile.resolved @@ -1,4 +1,4 @@ -github "ashleymills/Reachability.swift" "v5.1.0" -github "devicekit/DeviceKit" "5.1.0" -github "getsentry/sentry-cocoa" "8.15.2" -github "weichsel/ZIPFoundation" "0.9.17" +github "ashleymills/Reachability.swift" "v5.2.4" +github "devicekit/DeviceKit" "5.5.0" +github "getsentry/sentry-cocoa" "8.44.0" +github "weichsel/ZIPFoundation" "0.9.19" From 432f975283eb4e0e3941fbb7048af13e0bb0984c Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Wed, 5 Feb 2025 15:22:24 +0700 Subject: [PATCH 077/109] fix(developer): support non-US base keyboard layouts in debuggers Keyman Core expects US English virtual key codes, so make sure that the debuggers translate the key codes they receive from Windows to the hard- coded values for US English, as defined in ScanCodeMap. Fixes: #13052 --- .../child/Keyman.Developer.UI.Debug.UfrmLdmlKeyboardDebug.pas | 4 ++-- developer/src/tike/child/UfrmDebug.pas | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/developer/src/tike/child/Keyman.Developer.UI.Debug.UfrmLdmlKeyboardDebug.pas b/developer/src/tike/child/Keyman.Developer.UI.Debug.UfrmLdmlKeyboardDebug.pas index 1712523026..1e22070ad7 100644 --- a/developer/src/tike/child/Keyman.Developer.UI.Debug.UfrmLdmlKeyboardDebug.pas +++ b/developer/src/tike/child/Keyman.Developer.UI.Debug.UfrmLdmlKeyboardDebug.pas @@ -39,7 +39,7 @@ uses UframeTextEditor, UfrmMDIEditor, UfrmTike, - UserMessages; + UserMessages, Keyman.Developer.UI.RichEdit41; type TLdmlDebugUIStatus = ( @@ -340,7 +340,7 @@ begin if not SetKeyEventContext then Exit(False); - if km_core_process_event(FDebugCore.State, Message.WParam, modifier, 1, KM_CORE_EVENT_FLAG_DEFAULT) = KM_CORE_STATUS_OK then + if km_core_process_event(FDebugCore.State, VKToScanCodeToVK(Message.WParam, GetKeyboardLayout(0)), modifier, 1, KM_CORE_EVENT_FLAG_DEFAULT) = KM_CORE_STATUS_OK then begin // Process keystroke -- true = swallow keystroke Result := True; diff --git a/developer/src/tike/child/UfrmDebug.pas b/developer/src/tike/child/UfrmDebug.pas index d322d406a7..36ef51d291 100644 --- a/developer/src/tike/child/UfrmDebug.pas +++ b/developer/src/tike/child/UfrmDebug.pas @@ -41,7 +41,7 @@ uses UfrmDebugStatus, UfrmMDIEditor, UfrmTike, - UserMessages; + UserMessages, Keyman.Developer.UI.RichEdit41; type TDebugLineEvent = procedure(Sender: TObject; ALine: Integer) of object; @@ -465,7 +465,7 @@ begin if not SetKeyEventContext then Exit(False); - if km_core_process_event(FDebugCore.State, Message.WParam, modifier, 1, KM_CORE_EVENT_FLAG_DEFAULT) = KM_CORE_STATUS_OK then + if km_core_process_event(FDebugCore.State, VKToScanCodeToVK(Message.WParam, GetKeyboardLayout(0)), modifier, 1, KM_CORE_EVENT_FLAG_DEFAULT) = KM_CORE_STATUS_OK then begin // Process keystroke -- true = swallow keystroke Result := True; From f23dd7563f0e8c1096b8b40e2fa57b8f0cfc0119 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 22 May 2024 17:34:33 +0200 Subject: [PATCH 078/109] refactor(linux): Implement ordered output sentinel in keyman-system-service This change allows to press F24 as ordered output sentinel from keyman-system-service. This is part of implementing serialized output with keyman-system-service instead of requiring a patched ibus. The problem both approaches try to solve is that with non-compliant apps it is not possible to directly delete characters from the context. Instead we have to emit a backspace key before we can commit the new characters. However, the backspace key press goes through a different code path in ibus and so it can happen that the commit gets processed before the backspace which then deletes from the characters we just added instead of from the old content. The previous implementation solved this by forwarding a F24 ordered output sentinel key to ibus and relying on the patched ibus to send that back to us. When we received the F24 key we committed the characters that we queued when we forwarded the F24 key (implemented in #7079). The new approach implemented in this change instead sends the F24 ordered output sentinel key through keyman-system-service and so follows the regular key processing without requiring a patched ibus to send the key back to us. The rest of the algorithm stays mostly the same: when we receive the F24 key we commit the characters previously queued. The difference to the previous implementation is that we now also queue the backspace keys that we generate. Part-of: #10799 --- .../src/KeyboardDevice.cpp | 15 +++- .../src/KeyboardDevice.h | 3 + .../src/KeymanSystemService.cpp | 41 ++++++++++ .../src/KeymanSystemService.h | 12 ++- .../src/OrderedOutputDevice.cpp | 79 +++++++++++++++++++ .../src/OrderedOutputDevice.h | 24 ++++++ .../src/com.keyman.SystemService1.System.xml | 9 +++ linux/keyman-system-service/src/meson.build | 1 + .../tests/KeyboardDeviceMock.cpp | 3 + linux/keyman-system-service/tests/meson.build | 1 + 10 files changed, 180 insertions(+), 8 deletions(-) create mode 100644 linux/keyman-system-service/src/OrderedOutputDevice.cpp create mode 100644 linux/keyman-system-service/src/OrderedOutputDevice.h diff --git a/linux/keyman-system-service/src/KeyboardDevice.cpp b/linux/keyman-system-service/src/KeyboardDevice.cpp index a744a96b82..783902acaf 100644 --- a/linux/keyman-system-service/src/KeyboardDevice.cpp +++ b/linux/keyman-system-service/src/KeyboardDevice.cpp @@ -10,19 +10,26 @@ using namespace std; KeyboardDevice::KeyboardDevice() { - dev = nullptr; - fd = -1; + dev = nullptr; + fd = -1; hasCapsLockLed = -1; debug = false; } KeyboardDevice::~KeyboardDevice() +{ + Close(); +} + +void KeyboardDevice::Close() { if (dev) { libevdev_free(dev); + dev = nullptr; } if (fd != -1) { close(fd); + fd = -1; } } @@ -34,14 +41,14 @@ bool KeyboardDevice::Initialize(const char* name) fd = open(path.c_str(), O_RDWR); if (fd < 0) { std::cerr << "Failed to open device " << path << ": " << strerror(errno) << std::endl; + Close(); return false; } int rc = libevdev_new_from_fd(fd, &dev); if (rc < 0) { std::cerr << "Failed to init libevdev for " << path << ": " << strerror(-rc) << std::endl; - close(fd); - fd = -1; + Close(); return false; } diff --git a/linux/keyman-system-service/src/KeyboardDevice.h b/linux/keyman-system-service/src/KeyboardDevice.h index af9ce119f3..87310db15e 100644 --- a/linux/keyman-system-service/src/KeyboardDevice.h +++ b/linux/keyman-system-service/src/KeyboardDevice.h @@ -3,6 +3,7 @@ #include +// Any keyboard device available on the system class KeyboardDevice { public: @@ -20,6 +21,8 @@ class KeyboardDevice int fd; int hasCapsLockLed; bool debug; + + void Close(); }; #endif // __KEYBOARDDEVICE_H__ diff --git a/linux/keyman-system-service/src/KeymanSystemService.cpp b/linux/keyman-system-service/src/KeymanSystemService.cpp index 03d7add533..5e5b4f6e3e 100644 --- a/linux/keyman-system-service/src/KeymanSystemService.cpp +++ b/linux/keyman-system-service/src/KeymanSystemService.cpp @@ -63,10 +63,24 @@ on_get_caps_lock_indicator( return sd_bus_reply_method_return(msg, "b", state); } +static int32_t +on_call_ordered_output_sentinel( + sd_bus_message *msg, + void *user_data, + sd_bus_error *ret_error +) { + *ret_error = SD_BUS_ERROR_NULL; + + KeymanSystemService *service = static_cast(user_data); + service->CallOrderedOutputSentinel(); + return sd_bus_reply_method_return(msg, ""); +} + static const sd_bus_vtable system_service_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_METHOD("SetCapsLockIndicator", "b", "", on_set_caps_lock_indicator, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("GetCapsLockIndicator", "", "b", on_get_caps_lock_indicator, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("CallOrderedOutputSentinel", "", "", on_call_ordered_output_sentinel, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_VTABLE_END }; @@ -75,6 +89,7 @@ KeymanSystemService::KeymanSystemService() int ret; GetKbdDevices(); + CreateOrderedOutputDevice(); #ifdef KEYMAN_TESTING ret = sd_bus_open_user(&bus); @@ -120,6 +135,12 @@ KeymanSystemService::~KeymanSystemService() delete device; } delete kbd_devices; + kbd_devices = nullptr; + } + + if (kbd_ordered_output) { + delete kbd_ordered_output; + kbd_ordered_output = nullptr; } } @@ -171,6 +192,16 @@ void KeymanSystemService::GetKbdDevices() { } } +void KeymanSystemService::CreateOrderedOutputDevice() { + if (!kbd_ordered_output) { + kbd_ordered_output = new OrderedOutputDevice(); + if (!kbd_ordered_output->Initialize()) { + delete kbd_ordered_output; + kbd_ordered_output = nullptr; + } + } +} + // Set the CapsLock indicator on all keyboard devices. void KeymanSystemService::SetCapsLockIndicatorOnDevices(uint32_t state) { @@ -198,3 +229,13 @@ KeymanSystemService::GetCapsLockIndicatorOnDevices() { } return state; } + +// Emit a ordered output sentinel key event +void +KeymanSystemService::CallOrderedOutputSentinel() { + if (!kbd_ordered_output) { + syslog(LOG_USER | LOG_ERR, "%s: No keyboard initialized", __FUNCTION__); + return; + } + kbd_ordered_output->PressSentinelKey(); +} diff --git a/linux/keyman-system-service/src/KeymanSystemService.h b/linux/keyman-system-service/src/KeymanSystemService.h index 86637f27a9..19c7efe6cc 100644 --- a/linux/keyman-system-service/src/KeymanSystemService.h +++ b/linux/keyman-system-service/src/KeymanSystemService.h @@ -8,18 +8,21 @@ #else #include #endif +#include "OrderedOutputDevice.h" #include "KeyboardDevice.h" using namespace std; class KeymanSystemService { private: - std::list* kbd_devices = NULL; - sd_bus_slot *slot = NULL; - sd_bus *bus = NULL; - bool failed = false; + std::list* kbd_devices = nullptr; + OrderedOutputDevice *kbd_ordered_output = nullptr; + sd_bus_slot *slot = nullptr; + sd_bus *bus = nullptr; + bool failed = false; void GetKbdDevices(); + void CreateOrderedOutputDevice(); public: KeymanSystemService(); @@ -33,6 +36,7 @@ public: int Loop(); void SetCapsLockIndicatorOnDevices(uint32_t state); uint32_t GetCapsLockIndicatorOnDevices(); + void CallOrderedOutputSentinel(); }; #endif // __KEYMANSYSTEMSERVICE_H__ diff --git a/linux/keyman-system-service/src/OrderedOutputDevice.cpp b/linux/keyman-system-service/src/OrderedOutputDevice.cpp new file mode 100644 index 0000000000..cf90ffa2f1 --- /dev/null +++ b/linux/keyman-system-service/src/OrderedOutputDevice.cpp @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include +#include "OrderedOutputDevice.h" + +using namespace std; + +#define KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL 194 // 0xC2 + +OrderedOutputDevice::OrderedOutputDevice() { + uinput_dev = nullptr; +} + +OrderedOutputDevice::~OrderedOutputDevice() { + Close(); +} + +void +OrderedOutputDevice::Close() { + if (uinput_dev) { + libevdev_uinput_destroy(uinput_dev); + uinput_dev = nullptr; + } +} + +bool +OrderedOutputDevice::Initialize() { + struct libevdev* dev; + + syslog(LOG_USER | LOG_ALERT, "%s: creating fake device", __FUNCTION__); + + dev = libevdev_new(); + libevdev_set_name(dev, "Ordered Output Keyman Keyboard Device"); + + libevdev_enable_event_type(dev, EV_KEY); + + // F24 is the only key we support. + libevdev_enable_event_code(dev, EV_KEY, KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL, NULL); + + int rc = libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uinput_dev); + if (rc < 0) { + syslog(LOG_USER | LOG_ERR, "%s: Failed to create Ordered Output keyman keyboard device: %s", + __FUNCTION__, strerror(-rc)); + libevdev_free(dev); + Close(); + return false; + } + + return true; +} + +bool +OrderedOutputDevice::PressSentinelKey() { + int error = libevdev_uinput_write_event(uinput_dev, EV_KEY, KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL, 1); + if (error < 0) { + syslog(LOG_USER | LOG_ERR, + "%s: Error writing send key event for sentinel key (down): %s", + __FUNCTION__, strerror(-error)); + return false; + } + error = libevdev_uinput_write_event(uinput_dev, EV_KEY, KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL, 0); + if (error < 0) { + syslog(LOG_USER | LOG_ERR, "%s: Error writing send key event for sentinel key (up): %s", __FUNCTION__, strerror(-error)); + return false; + } + // process the key event immediately + error = libevdev_uinput_write_event(uinput_dev, EV_SYN, SYN_REPORT, 0); + if (error < 0) { + syslog(LOG_USER | LOG_ERR, + "%s: Error writing syn event for sentinel key: %s", __FUNCTION__, + strerror(-error)); + return false; + } + return true; +} diff --git a/linux/keyman-system-service/src/OrderedOutputDevice.h b/linux/keyman-system-service/src/OrderedOutputDevice.h new file mode 100644 index 0000000000..0fb2d15a3f --- /dev/null +++ b/linux/keyman-system-service/src/OrderedOutputDevice.h @@ -0,0 +1,24 @@ +#ifndef __ORDEREDOUTPUTDEVICE_H__ +#define __ORDEROUTPUTDEVICE_H__ + +#include + +// The fake keyboard we use to force the serializing of the output (#10799/#7079) +// Generate a fake key event to get the correct order of events so that any backspace key we +// generate will be processed before the character we're adding. We need to send a +// valid keycode so that it doesn't get swallowed by GTK but which isn't very likely used +// in real keyboards. F24 seems to work for that. +class OrderedOutputDevice { +public: + OrderedOutputDevice(); + virtual ~OrderedOutputDevice(); + + bool Initialize(); + bool PressSentinelKey(); + +private: + void Close(); + struct libevdev_uinput *uinput_dev; +}; + +#endif // __ORDEROUTPUTDEVICE_H__ diff --git a/linux/keyman-system-service/src/com.keyman.SystemService1.System.xml b/linux/keyman-system-service/src/com.keyman.SystemService1.System.xml index b75a1f2390..b93bcffa3a 100644 --- a/linux/keyman-system-service/src/com.keyman.SystemService1.System.xml +++ b/linux/keyman-system-service/src/com.keyman.SystemService1.System.xml @@ -25,5 +25,14 @@ + + + + + diff --git a/linux/keyman-system-service/src/meson.build b/linux/keyman-system-service/src/meson.build index 3c3dd27fa6..a99c977efb 100644 --- a/linux/keyman-system-service/src/meson.build +++ b/linux/keyman-system-service/src/meson.build @@ -1,6 +1,7 @@ service_files = files( 'KeyboardDevice.cpp', 'KeymanSystemService.cpp', + 'OrderedOutputDevice.cpp', 'main.cpp', ) diff --git a/linux/keyman-system-service/tests/KeyboardDeviceMock.cpp b/linux/keyman-system-service/tests/KeyboardDeviceMock.cpp index dbaa6aafab..c909e13025 100644 --- a/linux/keyman-system-service/tests/KeyboardDeviceMock.cpp +++ b/linux/keyman-system-service/tests/KeyboardDeviceMock.cpp @@ -24,6 +24,9 @@ KeyboardDeviceMock::KeyboardDeviceMock() { KeyboardDeviceMock::~KeyboardDeviceMock() { } +void KeyboardDeviceMock::Close() { +} + bool KeyboardDeviceMock::Initialize(const char* name) { return true; diff --git a/linux/keyman-system-service/tests/meson.build b/linux/keyman-system-service/tests/meson.build index 749e098591..917f0b15e6 100644 --- a/linux/keyman-system-service/tests/meson.build +++ b/linux/keyman-system-service/tests/meson.build @@ -1,6 +1,7 @@ test_service_files = files( '../src/main.cpp', '../src/KeymanSystemService.cpp', + '../src/OrderedOutputDevice.cpp', 'KeyboardDeviceMock.cpp', ) From ec0ca04805ccd4e62e6d5da454354c4758671acd Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Fri, 24 May 2024 18:02:17 +0200 Subject: [PATCH 079/109] refactor(linux): Implement ordered output without patched ibus This change implements things on the ibus-keyman side. Fixes: #10799 --- .../src/KeymanSystemServiceClient.cpp | 31 ++- .../src/KeymanSystemServiceClient.h | 1 + linux/ibus-keyman/src/engine.c | 182 ++++++++++-------- linux/ibus-keyman/tests/ibusimcontext.c | 28 +-- 4 files changed, 132 insertions(+), 110 deletions(-) diff --git a/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp b/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp index 50dbccba8d..1742ddfaba 100644 --- a/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp +++ b/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp @@ -25,6 +25,7 @@ public: void SetCapsLockIndicator(guint32 capsLock); gint32 GetCapsLockIndicator(); + void CallOrderedOutputSentinel(); }; KeymanSystemServiceClient::KeymanSystemServiceClient() { @@ -98,9 +99,26 @@ gint32 KeymanSystemServiceClient::GetCapsLockIndicator() { return capsLock; } -void set_capslock_indicator( - guint32 capsLock -) { +void +KeymanSystemServiceClient::CallOrderedOutputSentinel() { + assert(error == NULL); + + if (!bus) { + // we already reported the error, so just return + return; + } + + int result = sd_bus_call_method(bus, KEYMAN_BUS_NAME, KEYMAN_OBJECT_PATH, + KEYMAN_INTERFACE_NAME, "CallOrderedOutputSentinel", error, &msg, ""); + if (result < 0) { + g_error("%s: Failed to call method CallOrderedOutputSentinel: %s. %s. %s.", + __FUNCTION__, strerror(-result), error ? error->name : "-", error ? error->message : "-"); + return; + } +} + +void +set_capslock_indicator(guint32 capsLock) { KeymanSystemServiceClient client; client.SetCapsLockIndicator(capsLock); } @@ -109,3 +127,10 @@ gint32 get_capslock_indicator() { KeymanSystemServiceClient client; return client.GetCapsLockIndicator(); } + +void +call_ordered_output_sentinel() { + g_message("%s: Calling order output sentinel on keyman-system-service", __FUNCTION__); + KeymanSystemServiceClient client; + client.CallOrderedOutputSentinel(); +} diff --git a/linux/ibus-keyman/src/KeymanSystemServiceClient.h b/linux/ibus-keyman/src/KeymanSystemServiceClient.h index 746974df51..bf5766434f 100644 --- a/linux/ibus-keyman/src/KeymanSystemServiceClient.h +++ b/linux/ibus-keyman/src/KeymanSystemServiceClient.h @@ -9,6 +9,7 @@ extern "C" { void set_capslock_indicator(guint32 capsLockState); gint32 get_capslock_indicator(); +void call_ordered_output_sentinel(); #ifdef __cplusplus } diff --git a/linux/ibus-keyman/src/engine.c b/linux/ibus-keyman/src/engine.c index 296467e863..ab304a4039 100644 --- a/linux/ibus-keyman/src/engine.c +++ b/linux/ibus-keyman/src/engine.c @@ -39,29 +39,18 @@ #include "engine.h" #include "keycodes.h" -// Fallback for older ibus versions that don't define IBUS_PREFILTER_MASK -#ifndef IBUS_HAS_PREFILTER -#ifdef KEYMAN_PKG_BUILD -// When building packages on Ubuntu and Debian servers we probably don't have -// a patched ibus available and additionally treat warnings as errors, but -// still want to build packages. -#pragma message "Compiling against ibus version that does not include prefilter mask patch\n(https://github.com/ibus/ibus/pull/2440). Output ordering guarantees will be disabled." -#else -#warning Compiling against ibus version that does not include prefilter mask patch (https://github.com/ibus/ibus/pull/2440). Output ordering guarantees will be disabled. -#endif - -#define IBUS_PREFILTER_MASK (1 << 23) -#endif - #define MAXCONTEXT_ITEMS 128 + +// Values from /usr/include/linux/input-event-codes.h #define KEYMAN_BACKSPACE 14 #define KEYMAN_BACKSPACE_KEYSYM IBUS_KEY_BackSpace -#define KEYMAN_LCTRL 29 // 0x1D -#define KEYMAN_LALT 56 // 0x38 -#define KEYMAN_RCTRL 97 // 0x61 -#define KEYMAN_RALT 100 // 0x64 -#define KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL 202 -#define KEYMAN_NOCHAR_KEYSYM (0xfdd0 | 0x1000000) // Unicode NOCHAR +#define KEYMAN_LCTRL 29 // 0x1D +#define KEYMAN_LSHIFT 42 // 0x2A +#define KEYMAN_RSHIFT 54 // 0x36 +#define KEYMAN_LALT 56 // 0x38 +#define KEYMAN_RCTRL 97 // 0x61 +#define KEYMAN_RALT 100 // 0x64 +#define KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL 194 // 0xC2 typedef struct _IBusKeymanEngine IBusKeymanEngine; typedef struct _IBusKeymanEngineClass IBusKeymanEngineClass; @@ -69,11 +58,12 @@ typedef struct _IBusKeymanEngineClass IBusKeymanEngineClass; #define MAX_QUEUE_SIZE 100 typedef struct _commit_queue_item { - // char_buffer and emitting_keystroke as well as more than one queue - // item are only used if ibus supports prefilter but the client - // doesn't support surrounding text (non-compliant app) + // char_buffer, emitting_keystroke and code_points_to_delete as well as + // more than one queue item are only used if the client doesn't + // support surrounding text (non-compliant app) gchar *char_buffer; gboolean emitting_keystroke; + guint code_points_to_delete; guint keyval; guint keycode; @@ -253,17 +243,6 @@ debug_utf8_with_codepoints(const gchar *utf8) { #endif } -static gboolean -client_supports_prefilter(IBusEngine *engine) -{ - g_assert(engine != NULL); -#ifdef IBUS_HAS_PREFILTER - return (engine->client_capabilities & IBUS_CAP_PREFILTER) != 0; -#else - return FALSE; -#endif -} - static gboolean client_supports_surrounding_text(IBusEngine *engine) { g_assert(engine != NULL); @@ -660,14 +639,14 @@ process_output_action(IBusEngine *engine, const km_core_usv* output_utf32) { IBusKeymanEngine *keyman = (IBusKeymanEngine *)engine; gchar *output_utf8 = g_ucs4_to_utf8(output_utf32, -1, NULL, NULL, NULL); g_autofree gchar *debug = NULL; - if (client_supports_prefilter(engine) && !client_supports_surrounding_text(engine)) { - // non-compliant app with patched ibus + if (!client_supports_surrounding_text(engine)) { + // non-compliant app g_message("%s: Adding to commit queue: %s", __FUNCTION__, debug = debug_utf8_with_codepoints(output_utf8)); g_assert(keyman->commit_item->char_buffer == NULL); keyman->commit_item->char_buffer = output_utf8; // don't free output_utf8 - assigned to char_buffer! } else { - // compliant app or unpatched ibus + // compliant app g_message("%s: Outputing %s", __FUNCTION__, debug = debug_utf8_with_codepoints(output_utf8)); commit_string(keyman, output_utf8); g_free(output_utf8); @@ -695,11 +674,9 @@ process_backspace_action(IBusEngine *engine, unsigned int code_points_to_delete) g_message("%s: compliant app: deleting surrounding text %d codepoints", __FUNCTION__, code_points_to_delete); ibus_engine_delete_surrounding_text(engine, -code_points_to_delete, code_points_to_delete); } else { - g_message("%s: non-compliant app: forwarding %d backspaces", __FUNCTION__, code_points_to_delete); - while (code_points_to_delete > 0) { - ibus_engine_forward_key_event(engine, KEYMAN_BACKSPACE_KEYSYM, KEYMAN_BACKSPACE, 0); - code_points_to_delete--; - } + g_message("%s: non-compliant app: queueing %d backspaces", __FUNCTION__, code_points_to_delete); + IBusKeymanEngine *keyman = (IBusKeymanEngine *)engine; + keyman->commit_item->code_points_to_delete = code_points_to_delete; } } @@ -723,8 +700,8 @@ process_emit_keystroke_action(IBusEngine *engine, km_core_bool emit_keystroke) { return; } IBusKeymanEngine *keyman = (IBusKeymanEngine *)engine; - if (!client_supports_prefilter(engine) || client_supports_surrounding_text(engine)) { - // compliant app or unpatched ibus version + if (client_supports_surrounding_text(engine)) { + // compliant app ibus_engine_forward_key_event(engine, keyman->commit_item->keyval, keyman->commit_item->keycode, keyman->commit_item->state); return; @@ -745,21 +722,42 @@ process_capslock_action(km_core_caps_state caps_state) { static void commit_current_queue_item(IBusKeymanEngine *keyman) { - // only called for non-compliant apps with patched ibus + // only called for non-compliant apps g_assert(keyman != NULL); - g_assert(client_supports_prefilter((IBusEngine *)keyman)); - g_assert(!client_supports_surrounding_text((IBusEngine *)keyman)); + IBusEngine* engine = (IBusEngine *)keyman; + g_assert(!client_supports_surrounding_text(engine)); - if (keyman->commit_item <= keyman->commit_queue) + if (keyman->commit_item <= keyman->commit_queue){ + g_message("%s: queue is empty", __FUNCTION__); return; + } commit_queue_item *current_item = &keyman->commit_queue[0]; + g_message("%s:", __FUNCTION__); + if (current_item->code_points_to_delete > 0) { + g_message("%s: Forwarding %d backspaces from commit queue", __FUNCTION__, current_item->code_points_to_delete); + while (current_item->code_points_to_delete > 0) { + ibus_engine_forward_key_event(engine, KEYMAN_BACKSPACE_KEYSYM, KEYMAN_BACKSPACE, 0); + current_item->code_points_to_delete--; + } + // don't remove the item from the queue yet - we need to process it + // again for the output and keystrokes. Instead emit the sentinel key + // again. + g_message("%s: Forcing ordered output", __FUNCTION__); + call_ordered_output_sentinel(); + return; + } if (current_item->char_buffer != NULL) { + g_autofree gchar *debug = NULL; + g_message("%s: Committing from commit queue: %s", __FUNCTION__, + debug = debug_utf8_with_codepoints(current_item->char_buffer)); commit_string(keyman, current_item->char_buffer); g_free(current_item->char_buffer); } if (current_item->emitting_keystroke) { - ibus_engine_forward_key_event((IBusEngine*)keyman, current_item->keyval, current_item->keycode, current_item->state); + g_message("%s: Forwarding key from commit queue: keyval=0x%02x, keycode=0x%02x, state=0x%02x", + __FUNCTION__, current_item->keyval, current_item->keycode, current_item->state); + ibus_engine_forward_key_event(engine, current_item->keyval, current_item->keycode, current_item->state); } keyman->commit_item--; memmove(keyman->commit_queue, &keyman->commit_queue[1], sizeof(commit_queue_item) * MAX_QUEUE_SIZE - 1); @@ -770,30 +768,41 @@ static void finish_process_actions(IBusEngine *engine) { g_assert(engine != NULL); IBusKeymanEngine *keyman = (IBusKeymanEngine *)engine; - if (!client_supports_prefilter(engine) || client_supports_surrounding_text(engine)) { - // compliant app or unpatched ibus + if (client_supports_surrounding_text(engine)) { + // compliant app return; } - // non-compliant app with patched ibus - guint state = keyman->commit_item->state; - keyman->commit_item++; - if (keyman->commit_item > &keyman->commit_queue[MAX_QUEUE_SIZE-1]) { - g_error("Overflow of keyman commit_queue!"); - // TODO: log to Sentry - keyman->commit_item--; - } + // non-compliant app + guint keycode = keyman->commit_item->keycode; - // Forward a fake key event to get the correct order of events so that any backspace key we - // generated will be processed before the character we're adding. We need to send a - // valid keyval/keycode combination so that it doesn't get swallowed by GTK but which - // isn't very likely used in real keyboards. F24 seems to work for that. - ibus_engine_forward_key_event(engine, - KEYMAN_NOCHAR_KEYSYM, - KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL, - (state & IBUS_RELEASE_MASK) - ? IBUS_PREFILTER_MASK | IBUS_RELEASE_MASK - : IBUS_PREFILTER_MASK); + switch (keycode) { + case KEYMAN_LSHIFT: + case KEYMAN_RSHIFT: + case KEYMAN_LCTRL: + case KEYMAN_RCTRL: + case KEYMAN_LALT: + case KEYMAN_RALT: + // we don't forward modifier keys that the user holds while pressing another + // key. + g_message("%s: Ignoring modifier key", __FUNCTION__); + break; + default: + keyman->commit_item++; + if (keyman->commit_item > &keyman->commit_queue[MAX_QUEUE_SIZE - 1]) { + g_error("Overflow of keyman commit_queue!"); + // TODO: log to Sentry + keyman->commit_item--; + } + + // Forward a fake key event to get the correct order of events so that any backspace key we + // generated will be processed before the character we're adding. We need to send a + // valid keycode so that it doesn't get swallowed by GTK but which isn't very likely used + // in real keyboards. F24 seems to work for that. + g_message("%s: Forcing ordered output", __FUNCTION__); + call_ordered_output_sentinel(); + break; + } } static void @@ -826,13 +835,25 @@ ibus_keyman_engine_process_key_event( g_message("-----------------------------------------------------------------------------------------------------------------"); g_message( - "DAR: %s - keyval=0x%02x keycode=0x%02x, state=0x%02x, isKeyDown=%d, supports_prefilter=%d, compliant=%d", __FUNCTION__, keyval, keycode, - state, isKeyDown, client_supports_prefilter(engine), client_supports_surrounding_text(engine)); + "DAR: %s - keyval=0x%02x keycode=0x%02x, state=0x%02x, isKeyDown=%d, compliant=%d", __FUNCTION__, keyval, keycode, + state, isKeyDown, client_supports_surrounding_text(engine)); // This keycode is a fake keycode that we send when it's time to commit the text, ensuring the // correct output order of backspace and text. - if (client_supports_prefilter(engine) && !client_supports_surrounding_text(engine) && - keycode == KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL && (state & IBUS_PREFILTER_MASK)) { + if (!client_supports_surrounding_text(engine) && keycode == KEYMAN_F24_KEYCODE_OUTPUT_SENTINEL) { + if (!isKeyDown) { + g_message("%s: got F24 Sentinel, ignore keyup", __FUNCTION__); + return TRUE; + } + g_message("%s: got F24 Sentinel, queue content:", __FUNCTION__); + for (int i = 0; i < MAX_QUEUE_SIZE && &keyman->commit_queue[i] != keyman->commit_item; i++) { + commit_queue_item *item = &keyman->commit_queue[i]; + g_message( + " queue item %d: keyval=0x%02x keycode=0x%02x, state=0x%02x, char_buffer=%s, " + "emitting_keystroke=%d, code_points_to_delete=%d", + i, item->keyval, item->keycode, item->state, item->char_buffer, + item->emitting_keystroke, item->code_points_to_delete); + } commit_current_queue_item(keyman); return TRUE; } @@ -869,7 +890,7 @@ ibus_keyman_engine_process_key_event( // #10476: Core currently doesn't handle IBUS_MOD{2-4}_MASK modifiers. // On Ubuntu 23.10/24.04 we get IBUS_MOD4_MASK set on keycode 0x39 (space) when // the user tries to switch keyboards. Since this is not a regular keypress - // and Core doesn't handle it, we need to just return and let the Gnome deal + // and Core doesn't handle it, we need to just return and let GTK deal // with it. We could consider to add it to Core and let Core ignore it. // As for IBUS_MOD3_MASK it's unclear when/how that gets set, so we // just not deal with that for now until we notice problems. @@ -883,7 +904,7 @@ ibus_keyman_engine_process_key_event( // it. At the moment however we let Core process the keypress and since // it doesn't have rules for the numeric keypad keys we eventually // forward the key to ibus (in process_emit_keystroke_action) and let - // Gnome deal with it. + // GTK deal with it. // keyman modifiers are different from X11/ibus uint16_t km_mod_state = 0; @@ -929,15 +950,14 @@ ibus_keyman_engine_process_key_event( process_actions(engine, core_actions); - // If we have a new ibus version that supports prefilter and a non-compliant - // client, i.e. a client that doesn't support surrounding text (e.g. - // Chromium as of v104) we forwarded the key event with IBUS_PREFILTER_MASK - // set and now stop further processing by returning TRUE. - // With an old ibus version without prefilter support as well as with - // a compliant client (i.e. it does support surrounding text), we return + // If we have a non-compliant client, i.e. a client that doesn't support + // surrounding text (e.g. Chromium as of v104) we sent the key event + // to the system service and now stop further processing by returning TRUE. + // With a compliant client (i.e. it does support surrounding text), we return // TRUE because we completely processed the event and no further // processing should happen. g_message("%s: after processing all actions: %s", __FUNCTION__, debug_context2 = get_context_debug(engine)); + return TRUE; } diff --git a/linux/ibus-keyman/tests/ibusimcontext.c b/linux/ibus-keyman/tests/ibusimcontext.c index c6d7af1e98..d3181727ce 100644 --- a/linux/ibus-keyman/tests/ibusimcontext.c +++ b/linux/ibus-keyman/tests/ibusimcontext.c @@ -23,26 +23,13 @@ */ // This file is based on https://github.com/ibus/ibus/blob/master/client/gtk2/ibusimcontext.c -// commit 506ac9993d5166196b7c4e9bfa9fb0f9d3792ffa plus our two prefilter commits. +// commit 506ac9993d5166196b7c4e9bfa9fb0f9d3792ffa. // It simulates the GTK2 client, leaving out code for GTK3 and GTK4 and // simplyfying the code a bit by replacing async calls with direct synchronous // method calls. #include -#ifndef IBUS_HAS_PREFILTER -#ifdef KEYMAN_PKG_BUILD -// When building packages on Ubuntu and Debian servers we probably don't have -// a patched ibus available and additionally treat warnings as errors, but -// still want to build packages. -#pragma message "Compiling against ibus version that does not include prefilter mask patch\n(https://github.com/ibus/ibus/pull/2440). Output ordering guarantees will be disabled." -#else -#warning Compiling against ibus version that does not include prefilter mask patch (https://github.com/ibus/ibus/pull/2440). Output ordering guarantees will be disabled. -#endif - -#define IBUS_PREFILTER_MASK (1 << 23) -#endif - #include "ibusimcontext.h" #include #include @@ -249,7 +236,6 @@ _process_key_event_done(GObject *object, GAsyncResult *res, gpointer user_data) if (retval == FALSE) { ((GdkEventKey *)event)->state |= IBUS_IGNORED_MASK; - ((GdkEventKey *)event)->state &= ~IBUS_PREFILTER_MASK; gdk_event_put(event); } gdk_event_free(event); @@ -401,10 +387,6 @@ ibus_im_context_init(GObject *obj) { ibusimcontext->caps |= IBUS_CAP_SURROUNDING_TEXT; } -#ifdef IBUS_HAS_PREFILTER - ibusimcontext->caps |= IBUS_CAP_PREFILTER; -#endif - ibusimcontext->events_queue = g_queue_new(); if (ibus_bus_is_connected(_bus)) { @@ -463,7 +445,7 @@ ibus_im_context_filter_keypress(GtkIMContext *context, GdkEventKey *event) { /* Do not call gtk_im_context_filter_keypress() because * gtk_im_context_simple_filter_keypress() binds Ctrl-Shift-u */ - if (event->state & IBUS_IGNORED_MASK && !(event->state & IBUS_PREFILTER_MASK)) + if (event->state & IBUS_IGNORED_MASK) return ibus_im_context_commit_event(ibusimcontext, event); /* XXX it is a workaround for some applications do not set client @@ -956,10 +938,6 @@ _ibus_context_forward_key_event_cb( /* _create_gdk_event() will add 8 to keycode. */ if (keycode != 0) keycode -= 8; - } else if (state & IBUS_PREFILTER_MASK) { - // _create_gdk_event() will add 8 to keycode - if (keycode != 0) - keycode -= 8; } GdkEventKey *event = _create_gdk_event(ibusimcontext, keyval, keycode, state); @@ -983,8 +961,6 @@ _ibus_context_forward_key_event_cb( } } while (index >= 0); g_string_erase(ibusimcontext->text, index, len); - } else if (state & IBUS_PREFILTER_MASK) { - gtk_im_context_filter_keypress((GtkIMContext *)ibusimcontext, event); } else { gdk_event_put((GdkEvent *)event); } From 3a72e56c752a8d1e58bb15f7c10334e4e92b361d Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 5 Feb 2025 11:47:58 +0100 Subject: [PATCH 080/109] refactor(linux): temporarily ignore integration tests The setup for the integration tests is still wrong, so ignoring them allows us to start the users tests and move forward. The integration tests will be fixed in a follow-up commit. --- linux/ibus-keyman/tests/meson.build | 190 ++++++++++++++-------------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/linux/ibus-keyman/tests/meson.build b/linux/ibus-keyman/tests/meson.build index 5ae10ae211..69977c602e 100644 --- a/linux/ibus-keyman/tests/meson.build +++ b/linux/ibus-keyman/tests/meson.build @@ -66,103 +66,103 @@ find_tests = find_program('find-tests.sh', dirs: [meson.current_source_dir() / ' mutter = find_program('mutter', required: false, version: '>=40') can_build_wayland = mutter.found() -test( - 'setup-x11', - setup_tests, - args: ['--x11', env_file, cleanup_file, pid_file], - env: test_env, - priority: -10, - is_parallel: false, - protocol: 'exitcode' -) +# test( +# 'setup-x11', +# setup_tests, +# args: ['--x11', env_file, cleanup_file, pid_file], +# env: test_env, +# priority: -10, +# is_parallel: false, +# protocol: 'exitcode' +# ) -test( - 'teardown-x11', - teardown_tests, - args: [cleanup_file], - priority: -19, - is_parallel: false, - protocol: 'exitcode' -) +# test( +# 'teardown-x11', +# teardown_tests, +# args: [cleanup_file], +# priority: -19, +# is_parallel: false, +# protocol: 'exitcode' +# ) -if can_build_wayland - test( - 'setup-wayland', - setup_tests, - args: ['--wayland', env_file, cleanup_file, pid_file], - env: test_env, - priority: -20, - is_parallel: false, - protocol: 'exitcode' - ) +# if can_build_wayland +# test( +# 'setup-wayland', +# setup_tests, +# args: ['--wayland', env_file, cleanup_file, pid_file], +# env: test_env, +# priority: -20, +# is_parallel: false, +# protocol: 'exitcode' +# ) - test( - 'teardown-wayland', - teardown_tests, - args: [cleanup_file], - priority: -29, - is_parallel: false, - protocol: 'exitcode' - ) -endif +# test( +# 'teardown-wayland', +# teardown_tests, +# args: [cleanup_file], +# priority: -29, +# is_parallel: false, +# protocol: 'exitcode' +# ) +# endif -kmxtest_files = run_command( - find_tests, - [ common_dir / 'test/keyboards/baseline' ], - check: true, -).stdout().split('\n') +# kmxtest_files = run_command( +# find_tests, +# [ common_dir / 'test/keyboards/baseline' ], +# check: true, +# ).stdout().split('\n') -foreach kmx: kmxtest_files - filename = kmx.split('\t') - if filename[0] == '' - continue - endif - testname = filename[1].split('.kmx')[0] - test_args = [ '--tap', '-k', '--env', env_file, '--cleanup', cleanup_file, '--check', pid_file, '--', filename] - test( - 'X11-' + testname + '__surrounding-text', - run_test, - args: [ '--testname', testname, '--x11', '--surrounding-text', test_args], - env: test_env, - depends: [test_exe], - priority: -11, - is_parallel: false, - timeout: 120, - protocol: 'tap', - ) - test( - 'X11-' + testname + '__no-surrounding-text', - run_test, - args: [ '--testname', testname, '--x11', '--no-surrounding-text', test_args], - env: test_env, - depends: [test_exe], - priority: -12, - is_parallel: false, - timeout: 120, - protocol: 'tap', - ) - if can_build_wayland - test( - 'Wayland-' + testname + '__surrounding-text', - run_test, - args: [ '--testname', testname, '--wayland', '--surrounding-text', test_args], - env: test_env, - depends: [test_exe], - priority: -21, - is_parallel: false, - timeout: 120, - protocol: 'tap', - ) - test( - 'Wayland-' + testname + '__no-surrounding-text', - run_test, - args: [ '--testname', testname, '--wayland', '--no-surrounding-text', test_args], - env: test_env, - depends: [test_exe], - priority: -22, - is_parallel: false, - timeout: 120, - protocol: 'tap', - ) - endif -endforeach +# foreach kmx: kmxtest_files +# filename = kmx.split('\t') +# if filename[0] == '' +# continue +# endif +# testname = filename[1].split('.kmx')[0] +# test_args = [ '--tap', '-k', '--env', env_file, '--cleanup', cleanup_file, '--check', pid_file, '--', filename] +# test( +# 'X11-' + testname + '__surrounding-text', +# run_test, +# args: [ '--testname', testname, '--x11', '--surrounding-text', test_args], +# env: test_env, +# depends: [test_exe], +# priority: -11, +# is_parallel: false, +# timeout: 120, +# protocol: 'tap', +# ) +# test( +# 'X11-' + testname + '__no-surrounding-text', +# run_test, +# args: [ '--testname', testname, '--x11', '--no-surrounding-text', test_args], +# env: test_env, +# depends: [test_exe], +# priority: -12, +# is_parallel: false, +# timeout: 120, +# protocol: 'tap', +# ) +# if can_build_wayland +# test( +# 'Wayland-' + testname + '__surrounding-text', +# run_test, +# args: [ '--testname', testname, '--wayland', '--surrounding-text', test_args], +# env: test_env, +# depends: [test_exe], +# priority: -21, +# is_parallel: false, +# timeout: 120, +# protocol: 'tap', +# ) +# test( +# 'Wayland-' + testname + '__no-surrounding-text', +# run_test, +# args: [ '--testname', testname, '--wayland', '--no-surrounding-text', test_args], +# env: test_env, +# depends: [test_exe], +# priority: -22, +# is_parallel: false, +# timeout: 120, +# protocol: 'tap', +# ) +# endif +# endforeach From 57e82b70db822b82e081eb7e8c26173dd9f1146b Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Wed, 5 Feb 2025 13:01:47 -0500 Subject: [PATCH 081/109] auto: increment master version to 18.0.186 --- HISTORY.md | 7 +++++++ VERSION.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index e7d26f96e5..8332bef35d 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,12 @@ # Keyman Version History +## 18.0.185 alpha 2025-02-05 + +* fix(developer): make kmc log options consistent across all commands (#13075) +* feat(developer): add user interface for `kmc copy` to TIKE (#13076) +* chore(developer): add verbose logs for project copier (#13080) +* chore(mac, ios): build and run with xcode 16 (#13077) + ## 18.0.184 alpha 2025-02-04 * fix(common): handle undefined input in `@keymanapp/langtags` lookups (#13117) diff --git a/VERSION.md b/VERSION.md index c94b2147ac..8d9054ff04 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.185 \ No newline at end of file +18.0.186 \ No newline at end of file From e369121cba224a5e11b6e4b6ceeb966de5c905b2 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Wed, 5 Feb 2025 21:53:27 -0500 Subject: [PATCH 082/109] auto: increment stable-17.0 version to 17.0.336 (history cherry-pick to master) --- HISTORY.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/HISTORY.md b/HISTORY.md index e7d26f96e5..cead2a2bc4 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,17 @@ # Keyman Version History +## 18.0.185 alpha 2025-02-06 + +* fix(android): improve resource-update tool handling of host Activity's closure (#13057) +* fix(ios): prevent message-handler collision (#13058) +* chore(linux): improve compatibility with Gentoo Linux (#12889) +* chore(linux): Update debian changelog (#13062) +* fix(web): keyboard query error states should always provide informative Error objects, reports (#13079) +* chore: push the branch when creating PR in version history writer (#13085) +* fix(web): disabled correction state should prevent predictive corrections (#13074) +* change(ios): set host-app bundle identifier in embedded Web debug-report (#13112) +* chore(mac, ios): build and run with xcode 16 (#13121) + ## 18.0.184 alpha 2025-02-04 * fix(common): handle undefined input in `@keymanapp/langtags` lookups (#13117) From c3cd0493ffc402b0d07f013157a5e7edcbc06cea Mon Sep 17 00:00:00 2001 From: Joshua Horton Date: Thu, 6 Feb 2025 10:33:28 +0700 Subject: [PATCH 083/109] docs(web): relocate gesture docs to web/docs/internal --- .../internal/gestures}/host-page-viz.png | Bin .../internal/gestures}/recognizer-configuration.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename web/{src/engine/osk/gesture-processor/docs => docs/internal/gestures}/host-page-viz.png (100%) rename web/{src/engine/osk/gesture-processor/docs => docs/internal/gestures}/recognizer-configuration.md (100%) diff --git a/web/src/engine/osk/gesture-processor/docs/host-page-viz.png b/web/docs/internal/gestures/host-page-viz.png similarity index 100% rename from web/src/engine/osk/gesture-processor/docs/host-page-viz.png rename to web/docs/internal/gestures/host-page-viz.png diff --git a/web/src/engine/osk/gesture-processor/docs/recognizer-configuration.md b/web/docs/internal/gestures/recognizer-configuration.md similarity index 100% rename from web/src/engine/osk/gesture-processor/docs/recognizer-configuration.md rename to web/docs/internal/gestures/recognizer-configuration.md From 62b34c06e4f15919abdf2fb2ea4558abde96c70c Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Thu, 6 Feb 2025 10:33:09 +0100 Subject: [PATCH 084/109] chore(linux): Update debian changelog (cherry picked from commit 77c19aaacf6ef71262ea9d7403521c9714392757) --- linux/debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/linux/debian/changelog b/linux/debian/changelog index 99ce27f238..a15c962527 100644 --- a/linux/debian/changelog +++ b/linux/debian/changelog @@ -1,3 +1,9 @@ +keyman (17.0.335-1) unstable; urgency=medium + + * New upstream release. + + -- Eberhard Beilharz Thu, 06 Feb 2025 10:33:00 +0100 + keyman (17.0.334-1) unstable; urgency=medium * New upstream release. From b1c818338f39490c4ba0fa14f420731633681a1a Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Thu, 6 Feb 2025 16:57:52 +0100 Subject: [PATCH 085/109] refactor(linux): address code review comments --- .../src/KeymanSystemServiceClient.cpp | 24 +++++++------------ linux/ibus-keyman/src/engine.c | 2 +- linux/ibus-keyman/tests/meson.build | 1 + 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp b/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp index 1742ddfaba..ab5b8a977d 100644 --- a/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp +++ b/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp @@ -15,7 +15,6 @@ extern gboolean testing; class KeymanSystemServiceClient { private: - sd_bus_error *error = NULL; sd_bus_message *msg = NULL; sd_bus *bus = NULL; @@ -41,18 +40,13 @@ KeymanSystemServiceClient::KeymanSystemServiceClient() { } KeymanSystemServiceClient::~KeymanSystemServiceClient() { - if (error) { sd_bus_error_free(error); } if (msg) { sd_bus_message_unref(msg); } if (bus) { sd_bus_unref(bus); } } void KeymanSystemServiceClient::SetCapsLockIndicator(guint32 capsLock) { - // If Set/GetCapsLockIndicator is called more than once and previously - // failed, we will leak `error`. - assert(error == NULL); - if (!bus) { - // we already reported the error, so just return + // we already reported the error in the c'tor, so just return return; } @@ -61,30 +55,30 @@ void KeymanSystemServiceClient::SetCapsLockIndicator(guint32 capsLock) { return; } + sd_bus_error *error; int result = sd_bus_call_method(bus, KEYMAN_BUS_NAME, KEYMAN_OBJECT_PATH, KEYMAN_INTERFACE_NAME, "SetCapsLockIndicator", error, &msg, "b", capsLock); if (result < 0) { g_error("%s: Failed to call method SetCapsLockIndicator: %s. %s. %s.", __FUNCTION__, strerror(-result), error ? error->name : "-", error ? error->message : "-"); + sd_bus_error_free(error); return; } } gint32 KeymanSystemServiceClient::GetCapsLockIndicator() { - // If Set/GetCapsLockIndicator is called more than once and previously - // failed, we will leak `error`. - assert(error == NULL); - if (!bus) { - // we already reported the error, so just return + // we already reported the error in the c'tor, so just return return -1; } + sd_bus_error *error; int result = sd_bus_call_method(bus, KEYMAN_BUS_NAME, KEYMAN_OBJECT_PATH, KEYMAN_INTERFACE_NAME, "GetCapsLockIndicator", error, &msg, ""); if (result < 0) { g_error("%s: Failed to call method GetCapsLockIndicator: %s. %s. %s.", __FUNCTION__, strerror(-result), error ? error->name : "-", error ? error->message : "-"); + sd_bus_error_free(error); return -1; } @@ -101,18 +95,18 @@ gint32 KeymanSystemServiceClient::GetCapsLockIndicator() { void KeymanSystemServiceClient::CallOrderedOutputSentinel() { - assert(error == NULL); - if (!bus) { - // we already reported the error, so just return + // we already reported the error in the c'tor, so just return return; } + sd_bus_error *error; int result = sd_bus_call_method(bus, KEYMAN_BUS_NAME, KEYMAN_OBJECT_PATH, KEYMAN_INTERFACE_NAME, "CallOrderedOutputSentinel", error, &msg, ""); if (result < 0) { g_error("%s: Failed to call method CallOrderedOutputSentinel: %s. %s. %s.", __FUNCTION__, strerror(-result), error ? error->name : "-", error ? error->message : "-"); + sd_bus_error_free(error); return; } } diff --git a/linux/ibus-keyman/src/engine.c b/linux/ibus-keyman/src/engine.c index ab304a4039..29d1be00d2 100644 --- a/linux/ibus-keyman/src/engine.c +++ b/linux/ibus-keyman/src/engine.c @@ -733,7 +733,6 @@ commit_current_queue_item(IBusKeymanEngine *keyman) { } commit_queue_item *current_item = &keyman->commit_queue[0]; - g_message("%s:", __FUNCTION__); if (current_item->code_points_to_delete > 0) { g_message("%s: Forwarding %d backspaces from commit queue", __FUNCTION__, current_item->code_points_to_delete); while (current_item->code_points_to_delete > 0) { @@ -753,6 +752,7 @@ commit_current_queue_item(IBusKeymanEngine *keyman) { debug = debug_utf8_with_codepoints(current_item->char_buffer)); commit_string(keyman, current_item->char_buffer); g_free(current_item->char_buffer); + current_item->char_buffer = NULL; } if (current_item->emitting_keystroke) { g_message("%s: Forwarding key from commit queue: keyval=0x%02x, keycode=0x%02x, state=0x%02x", diff --git a/linux/ibus-keyman/tests/meson.build b/linux/ibus-keyman/tests/meson.build index 69977c602e..6e3c4355a4 100644 --- a/linux/ibus-keyman/tests/meson.build +++ b/linux/ibus-keyman/tests/meson.build @@ -66,6 +66,7 @@ find_tests = find_program('find-tests.sh', dirs: [meson.current_source_dir() / ' mutter = find_program('mutter', required: false, version: '>=40') can_build_wayland = mutter.found() +# TODO: re-enable and fix test setup # test( # 'setup-x11', # setup_tests, From 4d3d371a88f9ebb830011fd157eb91f535214fa8 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Thu, 6 Feb 2025 17:03:16 +0100 Subject: [PATCH 086/109] refactor(linux): fix build failure --- linux/ibus-keyman/src/KeymanSystemServiceClient.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp b/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp index ab5b8a977d..b411e808f7 100644 --- a/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp +++ b/linux/ibus-keyman/src/KeymanSystemServiceClient.cpp @@ -55,7 +55,7 @@ void KeymanSystemServiceClient::SetCapsLockIndicator(guint32 capsLock) { return; } - sd_bus_error *error; + sd_bus_error *error = NULL; int result = sd_bus_call_method(bus, KEYMAN_BUS_NAME, KEYMAN_OBJECT_PATH, KEYMAN_INTERFACE_NAME, "SetCapsLockIndicator", error, &msg, "b", capsLock); if (result < 0) { @@ -72,7 +72,7 @@ gint32 KeymanSystemServiceClient::GetCapsLockIndicator() { return -1; } - sd_bus_error *error; + sd_bus_error *error = NULL; int result = sd_bus_call_method(bus, KEYMAN_BUS_NAME, KEYMAN_OBJECT_PATH, KEYMAN_INTERFACE_NAME, "GetCapsLockIndicator", error, &msg, ""); if (result < 0) { @@ -100,7 +100,7 @@ KeymanSystemServiceClient::CallOrderedOutputSentinel() { return; } - sd_bus_error *error; + sd_bus_error *error = NULL; int result = sd_bus_call_method(bus, KEYMAN_BUS_NAME, KEYMAN_OBJECT_PATH, KEYMAN_INTERFACE_NAME, "CallOrderedOutputSentinel", error, &msg, ""); if (result < 0) { From 60c5d2a8a5861591f28c8738c8b42e535c57224b Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Thu, 6 Feb 2025 13:01:21 -0500 Subject: [PATCH 087/109] auto: increment master version to 18.0.187 --- HISTORY.md | 4 ++++ VERSION.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index ae36fcfded..e92b844c29 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,9 @@ # Keyman Version History +## 18.0.186 alpha 2025-02-06 + +* feat(windows): check updates and automatic update merged (#13115) + ## 18.0.185 alpha 2025-02-05 * fix(developer): make kmc log options consistent across all commands (#13075) diff --git a/VERSION.md b/VERSION.md index 8d9054ff04..1f2afde79b 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.186 \ No newline at end of file +18.0.187 \ No newline at end of file From 7be7d9a1f91aed89a30c87db4cfb80b9f782fa31 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 7 Feb 2025 09:29:36 +1000 Subject: [PATCH 088/109] fix(windows): check params status before download In the case when a Keyboard was available for update but the keyman version wasn't the state machine correctly didn't try to install it. However the back ground download loop would try to download and empty Params.InstallURL. This commit now checks the Params.Status. This commit also removes the dead code for TDownloadUpdateParams record type. This code is left over from a progress ui callback. It was initially left for when UI callback maybe added back in. However, it is currently confusing deadcode so has been removed. Fixes: #13153 --- .../main/Keyman.System.DownloadUpdate.pas | 45 +++++++++---------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/windows/src/desktop/kmshell/main/Keyman.System.DownloadUpdate.pas b/windows/src/desktop/kmshell/main/Keyman.System.DownloadUpdate.pas index 40cc86b3b0..76724f95c3 100644 --- a/windows/src/desktop/kmshell/main/Keyman.System.DownloadUpdate.pas +++ b/windows/src/desktop/kmshell/main/Keyman.System.DownloadUpdate.pas @@ -14,16 +14,12 @@ uses KeymanPaths; type - TDownloadUpdateParams = record - TotalSize: Integer; - TotalDownloads: Integer; - StartPosition: Integer; - end; + TDownloadUpdate = class private FShowErrors: Boolean; - FDownload: TDownloadUpdateParams; + FSuccessfulDownloadCount: Integer; (** * * Performs updates download in the background. @@ -135,35 +131,38 @@ var begin Result := False; - - FDownload.TotalSize := 0; - FDownload.TotalDownloads := 0; - + FSuccessfulDownloadCount := 0; // Keyboard Packages - FDownload.StartPosition := 0; for i := 0 to High(Params.Packages) do begin - Inc(FDownload.TotalDownloads); - Inc(FDownload.TotalSize, Params.Packages[i].DownloadSize); Params.Packages[i].SavePath := SavePath + Params.Packages[i].FileName; - if not DownloadFile(Params.Packages[i].DownloadURL, Params.Packages[i].SavePath) then // I2742 + if DownloadFile(Params.Packages[i].DownloadURL, Params.Packages[i].SavePath) then + begin + Inc(FSuccessfulDownloadCount); + end + else begin Params.Packages[i].Install := False; // Download failed but install other files end; - FDownload.StartPosition := FDownload.StartPosition + Params.Packages[i].DownloadSize; end; // Keyman Installer - Inc(FDownload.TotalDownloads); - Inc(FDownload.TotalSize, Params.InstallSize); - if not DownloadFile(Params.InstallURL, SavePath + Params.FileName) then // I2742 + // + if Params.Status = ucrsUpdateReady then begin - ErrorLogMessage('DoDownloadUpdates Failed to download' + Params.InstallURL); - end - else + if DownloadFile(Params.InstallURL, SavePath + Params.FileName) then + begin + Inc(FSuccessfulDownloadCount); + end + else + begin + ErrorLogMessage('DoDownloadUpdates Failed to download' + Params.InstallURL); + end; + end; + // If there is at least one keyboard package or version of keyman downloaded then + // the result is true + if (FSuccessfulDownloadCount > 0) then begin - // If installer has downloaded that is success even - // if zero packages were downloaded. Result := True; end; end; From bd4633333bcdb75632f8c29a75bdb4733ca7cc9a Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 7 Feb 2025 08:42:23 +0700 Subject: [PATCH 089/109] feat(developer): improve compiler messages and user interface * Add unit test to verify the format of message detail strings (max line length of 80 chars) * Add unit test to verify non-null, non-empty message strings * Tidy up a number of messages (to pass unit tests) * Add message details for all kmw compiler messages * Add a clickable link for the TIKE message window for each message so that explanations and further message details are more accessible to authors (`kmc message` is already available for command-line users) * Fixes a number of minor issues with the messages window in TIKE, mostly relating to when popup menu commands are enabled and how messages are selected. Fixes: #13134 --- .../delphi/general/Upload_Settings.pas | 9 +- common/windows/delphi/general/VersionInfo.pas | 7 + .../verifyCompilerMessagesObject.ts | 20 +- .../web/utils/src/compiler-interfaces.ts | 13 ++ developer/src/common/web/utils/src/index.ts | 2 +- developer/src/kmc-copy/src/copier-messages.ts | 92 ++++---- .../kmc-generate/src/generator-messages.ts | 5 +- .../src/kmw-compiler/kmw-compiler-messages.ts | 66 ++++-- .../src/compiler/ldml-compiler-messages.ts | 42 ++-- .../src/kmc/src/commands/messageCommand.ts | 4 +- developer/src/tike/main/UfrmMessages.dfm | 7 +- developer/src/tike/main/UfrmMessages.pas | 209 ++++++++++++++++-- ...roject.UfrmCloneLocalProjectParameters.pas | 2 +- 13 files changed, 372 insertions(+), 106 deletions(-) diff --git a/common/windows/delphi/general/Upload_Settings.pas b/common/windows/delphi/general/Upload_Settings.pas index bf2051b556..5015f13942 100644 --- a/common/windows/delphi/general/Upload_Settings.pas +++ b/common/windows/delphi/general/Upload_Settings.pas @@ -92,6 +92,8 @@ function MakeAPIURL(path: string): string; function MakeKeymanURL(const path: string): string; +function URL_KmcMessage(id: string): string; + implementation uses @@ -108,6 +110,7 @@ const S_UserAgent_Developer = 'Keyman Developer'; S_UserAgent_Diagnostics = 'Keyman for Windows Diagnostics'; + S_HelpKeymanCom = 'https://help.keyman.com'; S_KeymanCom = 'https://keyman.com'; S_APIProtocol = 'https'; S_APIServer = 'api.keyman.com'; @@ -136,7 +139,6 @@ begin Result := S_UserAgent_Diagnostics + '/' + GetVersionString; end; - function MakeKeymanURL(const path: string): string; begin Result := KeymanCom_Protocol_Server + path; @@ -179,4 +181,9 @@ begin Result := Format(URLPath_PackageDownload_Format, [URLEncode(PackageID), URLEncode(CKeymanVersionInfo.Tier), URLEncode(BCP47), IsUpdateInt]); end; +function URL_KmcMessage(id: string): string; +begin + Result := S_HelpKeymanCom + '/developer/'+GetMajorMinorVersionString+'/reference/messages/'+id.ToLower; +end; + end. diff --git a/common/windows/delphi/general/VersionInfo.pas b/common/windows/delphi/general/VersionInfo.pas index 7567279196..3e399f2f0c 100644 --- a/common/windows/delphi/general/VersionInfo.pas +++ b/common/windows/delphi/general/VersionInfo.pas @@ -27,6 +27,7 @@ uses Winapi.Windows; function GetVersionString: WideString; +function GetMajorMinorVersionString: string; procedure GetVersionBuild(var vMajor, vMinor: Integer); function GetVersionCopyright: WideString; function GetFileVersionString(const FileName: WideString): WideString; @@ -54,6 +55,12 @@ begin IntToStr(LoWord(VersionMinor)); end; +function GetMajorMinorVersionString: string; +begin + Result := IntToStr(HiWord(VersionMajor)) + '.' + // I3310 + IntToStr(LoWord(VersionMajor)); +end; + procedure GetVersionBuild(var vMajor, vMinor: Integer); begin vMajor := VersionMajor; diff --git a/developer/src/common/web/test-helpers/verifyCompilerMessagesObject.ts b/developer/src/common/web/test-helpers/verifyCompilerMessagesObject.ts index 8a16de6bf1..6c004d101c 100644 --- a/developer/src/common/web/test-helpers/verifyCompilerMessagesObject.ts +++ b/developer/src/common/web/test-helpers/verifyCompilerMessagesObject.ts @@ -1,4 +1,4 @@ -import { CompilerError, CompilerErrorMask } from '@keymanapp/developer-utils'; +import { CompilerError, CompilerErrorMask, CompilerEvent, dedentCompilerMessageDetail } from '@keymanapp/developer-utils'; import {assert, expect} from 'chai'; // @@ -37,8 +37,24 @@ export function verifyCompilerMessagesObject(source: Record, namespa const c = o[1].toUpperCase() + '_' + o[2]; expect(m[c]).to.be.a('number', `Expected constant name ${c} to exist`); - const v = m[key]('','','','','','','','','','','','' /* ignore arguments*/); + const v: CompilerEvent = m[key]('','','','','','','','','','','','' /* ignore arguments*/); expect(v.code).to.equal(m[c], `Function ${key} returns the wrong code`); + + assert.isNotNull(v.message, `Function ${key} returns an invalid message: '${v.message}'`); + assert.isNotEmpty(v.message, `Function ${key} returns an empty message: '${v.message}'`); + + // Verify layout of compiler detail lines + + if(v.detail) { + const detail = dedentCompilerMessageDetail(v).split('\n'); + for(const line of detail) { + // Prevent lines over 80 characters -- we don't rewrap at this stage + // Don't check lines with URLs because they may be forced to go long + if(!line.includes('http')) { + assert.isAtMost(line.length, 80, `Function ${key} returns a message detail with at least one line longer than 80 characters: '${line}'`); + } + } + } } else if(typeof m[key] == 'number') { const o = /^(DEBUG|VERBOSE|INFO|HINT|WARN|ERROR|FATAL)_([A-Za-z0-9_]+)$/.exec(key); diff --git a/developer/src/common/web/utils/src/compiler-interfaces.ts b/developer/src/common/web/utils/src/compiler-interfaces.ts index 2f72982bf8..869e0165da 100644 --- a/developer/src/common/web/utils/src/compiler-interfaces.ts +++ b/developer/src/common/web/utils/src/compiler-interfaces.ts @@ -399,6 +399,19 @@ export const CompilerMessageSpec = (code: number, message: string, detail?: stri detail, }); +/** + * Remove initial whitespace from compiler detail messages, to enable + * indented formatting of message detail strings inside the message + * definitions + * @param event + * @returns dedented event detail + */ +export function dedentCompilerMessageDetail(event: CompilerEvent) { + // TODO(lowpri): dedent may be too naive -- should use least + // non-zero whitespace line as amount to dedent + return (event.detail ?? '').replace(/^[ ]+/gm, ''); +} + export const CompilerMessageDef = (param: any) => String(param ?? ``); export const CompilerMessageSpecWithException = (code: number, message: string, exceptionVar: any, detail?: string) : CompilerEvent => ({ diff --git a/developer/src/common/web/utils/src/index.ts b/developer/src/common/web/utils/src/index.ts index f8ee6246da..f3e23e79f2 100644 --- a/developer/src/common/web/utils/src/index.ts +++ b/developer/src/common/web/utils/src/index.ts @@ -52,7 +52,7 @@ export { defaultCompilerOptions, CompilerBaseOptions, CompilerOptions, CompilerE ALL_COMPILER_LOG_FORMATS, CompilerLogFormat, CompilerMessageOverride, CompilerMessageOverrideMap, - + dedentCompilerMessageDetail, KeymanCompilerArtifact, KeymanCompilerArtifactOptional, KeymanCompilerArtifacts, diff --git a/developer/src/kmc-copy/src/copier-messages.ts b/developer/src/kmc-copy/src/copier-messages.ts index c74ab25469..d4751474b9 100644 --- a/developer/src/kmc-copy/src/copier-messages.ts +++ b/developer/src/kmc-copy/src/copier-messages.ts @@ -19,9 +19,10 @@ const SevFatal = CompilerErrorSeverity.Fatal | Namespace; */ export class CopierMessages { static FATAL_UnexpectedException = SevFatal | 0x0001; - static Fatal_UnexpectedException = (o:{e: any}) => m( + static Fatal_UnexpectedException = (o:{e: any}) => CompilerMessageSpecWithException( this.FATAL_UnexpectedException, - null, o.e ?? 'unknown error' + null, + o.e ?? 'unknown error' ); static INFO_CopyingProject = SevInfo | 0x0002; @@ -123,81 +124,90 @@ export class CopierMessages { static ERROR_CannotDownloadFolderFromGitHub = SevError | 0x0012; static Error_CannotDownloadFolderFromGitHub = (o:{ref: string, message?: string, cause?: string}) => m( this.ERROR_CannotDownloadFolderFromGitHub, - `The folder '${def(o.ref)}' could not be downloaded: ${def(o.message)} ${def(o.cause)}`, - `An error was encountered attempting to download a folder from GitHub API. Check the - provided error details for the cause.` - ); + `The folder '${def(o.ref)}' could not be downloaded: ${def(o.message)} ${def(o.cause)}`, ` + An error was encountered attempting to download a folder from GitHub API. Check + the provided error details for the cause. + `); static ERROR_FolderDownloadedFromGitHubIsNotAValidFolder = SevError | 0x0013; static Error_FolderDownloadedFromGitHubIsNotAValidFolder = (o:{ref: string}) => m( this.ERROR_FolderDownloadedFromGitHubIsNotAValidFolder, - `The path '${def(o.ref)}' does not appear to be a folder on GitHub`, - `The provided path may be a file or may not exist. Check the reference - before trying again.` - ); + `The path '${def(o.ref)}' does not appear to be a folder on GitHub`, ` + The provided path may be a file or may not exist. Check the reference + before trying again. + `); static WARN_CannotDownloadFileFromGitHub = SevWarn | 0x0014; static Warn_CannotDownloadFileFromGitHub = (o:{ref: string, message?: string, cause?: string}) => m( this.WARN_CannotDownloadFileFromGitHub, - `The file '${def(o.ref)}' could not be downloaded: ${def(o.message)} ${def(o.cause)}`, - `An error was encountered attempting to download a file from GitHub. Check the - provided error details for the cause.` - ); + `The file '${def(o.ref)}' could not be downloaded: ${def(o.message)} ${def(o.cause)}`, ` + An error was encountered attempting to download a file from GitHub. Check the + provided error details for the cause. + `); static ERROR_InvalidCloudKeyboardId = SevError | 0x0015; static Error_InvalidCloudKeyboardId = (o:{id: string}) => m( this.ERROR_InvalidCloudKeyboardId, - `The keyboard identifier '${def(o.id)}' is not a valid keyboard identifier`, - `Keyboard identifiers on Keyman Cloud can only use the characters a-z, 0-9, and _.` - ); + `The keyboard identifier '${def(o.id)}' is not a valid keyboard identifier`, ` + Keyboard identifiers on Keyman Cloud can only use the characters + \`a\`-\`z\`, \`0\`-\`9\`, and \`_\`. + `); static ERROR_CouldNotRetrieveFromCloud = SevError | 0x0016; static Error_CouldNotRetrieveFromCloud = (o:{id: string, message?: string, cause?: string}) => m( this.ERROR_CouldNotRetrieveFromCloud, - `Details for keyboard or model identified by '${def(o.id)}' could not be downloaded: ${def(o.message)} ${def(o.cause)}`, - `An error was encountered attempting to retrieve keyboard or model details from Keyman Cloud API. Check the - provided error details for the cause.` - ); + `Details for keyboard or model identified by '${def(o.id)}' could not be `+ + `downloaded: ${def(o.message)} ${def(o.cause)}`, ` + An error was encountered attempting to retrieve keyboard or model details from + Keyman Cloud API. Check the provided error details for the cause. + `); static ERROR_KeymanCloudReturnedInvalidData = SevError | 0x0017; static Error_KeymanCloudReturnedInvalidData = (o:{id: string}) => m( this.ERROR_KeymanCloudReturnedInvalidData, - `Keyman Cloud API returned invalid data for keyboard or model identified by '${def(o.id)}'`, - `There may be a network error or a server error. Retry your request later or contact - Keyman Support for assistance.` - ); + `Keyman Cloud API returned invalid data for keyboard or model identified by '${def(o.id)}'`, ` + There may be a network error or a server error. Retry your request later or + contact Keyman Support for assistance. + `); static ERROR_CloudDoesNotHaveSource = SevError | 0x0018; static Error_CloudDoesNotHaveSource = (o:{id: string}) => m( this.ERROR_CloudDoesNotHaveSource, - `The keyboard or model identified by '${def(o.id)}' does not have source available`, - `Legacy keyboards in Keyman Cloud do not have source available. Check the Keyman keyboard catalog - at keyman.com for further details. Some new keyboards or models may be available as binary-only.` - ); + `The keyboard or model identified by '${def(o.id)}' does not have source available`, ` + Legacy keyboards in Keyman Cloud do not have source available. Check the Keyman + keyboard catalog at https://keyman.com/keyboards for further details. Some new + keyboards or models may be available as binary-only. + `); static ERROR_CannotDownloadRepoFromGitHub = SevError | 0x0019 ; static Error_CannotDownloadRepoFromGitHub = (o:{ref: string, message?: string, cause?: string}) => m( this.ERROR_CannotDownloadRepoFromGitHub, - `The repository at '${def(o.ref)}' could not be accessed: ${def(o.message)} ${def(o.cause)}`, - `An error was encountered attempting to download details about a repository from GitHub API. - Check the provided error details for the cause.` - ); + `The repository at '${def(o.ref)}' could not be accessed: ${def(o.message)} ${def(o.cause)}`, ` + An error was encountered attempting to download details about a repository + from GitHub API. Check the provided error details for the cause. + `); + + //------------------------------------------------------------------------------| + // max length of detail message lines (checked by verifyCompilerMessagesObject) | + //------------------------------------------------------------------------------| static ERROR_CouldNotFindDefaultBranchOnGitHub = SevError | 0x001A; static Error_CouldNotFindDefaultBranchOnGitHub = (o:{ref: string}) => m( this.ERROR_CouldNotFindDefaultBranchOnGitHub, - `The default branch could not be found for the GitHub repository '${def(o.ref)}'`, - `The repository may be private, or you may have a typo in the owner or repository name.` - ); + `The default branch could not be found for the GitHub repository '${def(o.ref)}'`, ` + The repository may be private, or you may have a typo in the owner or + repository name. + `); static INFO_CannotDownloadBinaryFileFromGitHub = SevInfo | 0x001B; static Info_CannotDownloadBinaryFileFromGitHub = (o:{ref: string, message?: string, cause?: string}) => m( this.INFO_CannotDownloadBinaryFileFromGitHub, - `The Keyman binary file '${def(o.ref)}' could not be downloaded: ${def(o.message)} ${def(o.cause)}. This is not normally a problem`, - `In most repositories, Keyman binary files such as .kmx, .kmp, .js are not included. - This is not normally a problem, as the files can be built from the source. Check - the provided error details for more details.` - ); + `The Keyman binary file '${def(o.ref)}' could not be downloaded: ${def(o.message)} `+ + `${def(o.cause)}. This is not normally a problem`, ` + In most repositories, Keyman binary files such as .kmx, .kmp, .js are not + included. This is not normally a problem, as the files can be built from the + source. Check the provided error details for more details. + `); static VERBOSE_DownloadingFile = SevVerbose | 0x001C; static Verbose_DownloadingFile = (o:{filename: string, url: string}) => m( diff --git a/developer/src/kmc-generate/src/generator-messages.ts b/developer/src/kmc-generate/src/generator-messages.ts index 6c9ccfa7d8..185f68cbe6 100644 --- a/developer/src/kmc-generate/src/generator-messages.ts +++ b/developer/src/kmc-generate/src/generator-messages.ts @@ -18,8 +18,9 @@ const SevFatal = CompilerErrorSeverity.Fatal | Namespace; */ export class GeneratorMessages { static FATAL_UnexpectedException = SevFatal | 0x0001; - static Fatal_UnexpectedException = (o:{e: any}) => m( - this.FATAL_UnexpectedException, null, o.e ?? 'unknown error' + static Fatal_UnexpectedException = (o:{e: any}) => CompilerMessageSpecWithException( + this.FATAL_UnexpectedException, null, + o.e ?? 'unknown error', ); static INFO_GeneratingProject = SevInfo | 0x0002; diff --git a/developer/src/kmc-kmn/src/kmw-compiler/kmw-compiler-messages.ts b/developer/src/kmc-kmn/src/kmw-compiler/kmw-compiler-messages.ts index 8d8b8ca6ed..e58b5fb9bf 100644 --- a/developer/src/kmc-kmn/src/kmw-compiler/kmw-compiler-messages.ts +++ b/developer/src/kmc-kmn/src/kmw-compiler/kmw-compiler-messages.ts @@ -1,6 +1,5 @@ import { keyAddress, KmnCompilerMessages } from "../compiler/kmn-compiler-messages.js"; -import { CompilerErrorNamespace, CompilerErrorSeverity, CompilerEvent, CompilerMessageDef as def, CompilerMessageSpec } from "@keymanapp/developer-utils"; -import { kmnfile } from "./compiler-globals.js"; +import { CompilerErrorNamespace, CompilerErrorSeverity, CompilerMessageDef as def, CompilerMessageSpec as m } from "@keymanapp/developer-utils"; import { KeyAddress } from "./validate-layout-file.js"; const Namespace = CompilerErrorNamespace.KmwCompiler; @@ -10,12 +9,6 @@ const SevHint = CompilerErrorSeverity.Hint | Namespace; const SevError = CompilerErrorSeverity.Error | Namespace; // const SevFatal = CompilerErrorSeverity.Fatal | Namespace; -const m = (code: number, message: string, o?: {filename?: string, line?: number}) : CompilerEvent => ({ - ...CompilerMessageSpec(code, message), - filename: o?.filename ?? kmnfile, - line: o?.line, -}); - /** * @internal * Error messages reported by the KeymanWeb .kmn compiler. @@ -34,25 +27,62 @@ export class KmwCompilerMessages extends KmnCompilerMessages { // 0x0001 - Reserved for removed identifier ERROR_NotAnyRequiresVersion14 = // SevError | 0x0001, added in 17.0, removed in 18.0 + //------------------------------------------------------------------------------| + // max length of detail message lines (checked by verifyCompilerMessagesObject) | + //------------------------------------------------------------------------------| + static ERROR_TouchLayoutIdentifierRequires15 = SevError | 0x0002; - static Error_TouchLayoutIdentifierRequires15 = (o:{keyId:string, platformName:string, layerId:string, address:KeyAddress}) => m(this.ERROR_TouchLayoutIdentifierRequires15, - `Key "${def(o.keyId)}" on "${def(o.platformName)}", layer "${def(o.layerId)}" (${keyAddress(o.address)}) has a multi-part identifier which requires version 15.0 or newer.`); + static Error_TouchLayoutIdentifierRequires15 = (o:{keyId:string, platformName:string, layerId:string, address:KeyAddress}) => m( + this.ERROR_TouchLayoutIdentifierRequires15, + `Key "${def(o.keyId)}" on "${def(o.platformName)}", layer "${def(o.layerId)}" (${keyAddress(o.address)}) has a `+ + `multi-part identifier which requires version 15.0 or newer`, ` + The Unicode key format \`U_xxxx_yyyy\` is supported in Keyman 15.0 and later + versions. + + For example, \`U_0041_0300\` means the key will by default emit + \`U+0041 U+0300\` (À); earlier versions allow only a single Unicode value in + the identifier, e.g. \`U_0300\`. + `); static ERROR_InvalidTouchLayoutFileFormat = SevError | 0x0003; - static Error_InvalidTouchLayoutFileFormat = (o:{msg: string}) => m(this.ERROR_InvalidTouchLayoutFileFormat, - `Invalid touch layout file: ${def(o.msg)}`); + static Error_InvalidTouchLayoutFileFormat = (o:{msg: string}) => m( + this.ERROR_InvalidTouchLayoutFileFormat, + `Invalid touch layout file: ${def(o.msg)}`, ` + The referenced .keyman-touch-layout file contained invalid JSON content. The + touch layout file format is documented at + https://help.keyman.com/developer/current-version/reference/file-types/keyman-touch-layout. + `); static ERROR_TouchLayoutFileDoesNotExist = SevError | 0x0004; - static Error_TouchLayoutFileDoesNotExist = (o:{filename:string}) => m(this.ERROR_TouchLayoutFileDoesNotExist, - `Touch layout file ${def(o.filename)} does not exist`); + static Error_TouchLayoutFileDoesNotExist = (o:{filename:string}) => m( + this.ERROR_TouchLayoutFileDoesNotExist, + `Touch layout file ${def(o.filename)} does not exist`, ` + The compiler was unable to load the referenced .keyman-touch-layout file. + Verify that the referenced file does exist and is accessible to the compiler. + `); static HINT_TouchLayoutUsesUnsupportedGesturesDownlevel = SevHint | 0x0005; - static Hint_TouchLayoutUsesUnsupportedGesturesDownlevel = (o:{keyId:string}) => m(this.HINT_TouchLayoutUsesUnsupportedGesturesDownlevel, - `The touch layout uses a flick or multi-tap gesture on key ${def(o.keyId)}, which is only available on version 17.0+ of Keyman`); + static Hint_TouchLayoutUsesUnsupportedGesturesDownlevel = (o:{keyId:string}) => m( + this.HINT_TouchLayoutUsesUnsupportedGesturesDownlevel, + `The touch layout uses a flick or multi-tap gesture on key ${def(o.keyId)}, which `+ + `is only available on version 17.0+ of Keyman`, ` + Flick and multi-tap gesture support was added to Keyman mobile platforms in + version 17.0. Keyboards which include these gestures can still work in earlier + versions of Keyman, but any flick and multi-tap gestures will not be available, + which may make some characters inaccesssible. + `); static INFO_MinimumWebEngineVersion = SevInfo | 0x0006; static Info_MinimumWebEngineVersion = (o:{version:string}) => m( this.INFO_MinimumWebEngineVersion, - `The compiler has assigned a minimum web engine version of ${o.version} based on features used in this keyboard` - ); + `The compiler has assigned a minimum web engine version of ${o.version} based on `+ + `features used in this keyboard`, ` + If the [\`&version\` store](https://help.keyman.com/developer/language/reference/version) + is not present in the keyboard source, the compiler attempts to assign the + lowest possible Keyman version that can support the features found in the + keyboard. Details on the history of language features and supported versions + can be found at https://help.keyman.com/developer/language/guide/history. + `); + + //------------------------------------------------------------------------------| }; diff --git a/developer/src/kmc-ldml/src/compiler/ldml-compiler-messages.ts b/developer/src/kmc-ldml/src/compiler/ldml-compiler-messages.ts index 5df0da4b73..3577a2e110 100644 --- a/developer/src/kmc-ldml/src/compiler/ldml-compiler-messages.ts +++ b/developer/src/kmc-ldml/src/compiler/ldml-compiler-messages.ts @@ -217,33 +217,45 @@ export class LdmlCompilerMessages { static Error_UnparseableTransformFrom = (o: { from: string, message: string }) => m(this.ERROR_UnparseableTransformFrom, `Invalid transform from="${def(o.from)}": "${def(o.message)}"`); + //------------------------------------------------------------------------------| + // max length of detail message lines (checked by verifyCompilerMessagesObject) | + //------------------------------------------------------------------------------| + static ERROR_IllegalTransformDollarsign = SevErrorTransform | 0x01; static Error_IllegalTransformDollarsign = (o: { from: string }) => m( this.ERROR_IllegalTransformDollarsign, - `Invalid transform from="${def(o.from)}": Unescaped dollar-sign ($) is not valid transform syntax.`, - `**Hint**: Use \`\\$\` to match a literal dollar-sign. If this precedes a variable name, `+ - `the variable name may not be valid (A-Z, a-z, 0-9, _, 32 character maximum).` - ); + `Invalid transform from="${def(o.from)}": Unescaped dollar-sign ($) is not valid transform syntax.`, ` + **Hint**: Use \`\\$\` to match a literal dollar-sign. If this precedes a + variable name, the variable name may not be valid (A-Z, a-z, 0-9, _, 32 + character maximum). + `); static ERROR_TransformFromMatchesNothing = SevErrorTransform | 0x02; - static Error_TransformFromMatchesNothing = (o: { from: string }) => - m(this.ERROR_TransformFromMatchesNothing, `Invalid transfom from="${def(o.from)}": Matches an empty string.`); + static Error_TransformFromMatchesNothing = (o: { from: string }) => m( + this.ERROR_TransformFromMatchesNothing, + `Invalid transfom from="${def(o.from)}": Matches an empty string.` + ); static ERROR_IllegalTransformPlus = SevErrorTransform | 0x03; - static Error_IllegalTransformPlus = (o: { from: string }) => - m(this.ERROR_IllegalTransformPlus, `Invalid transform from="${def(o.from)}": Unescaped plus (+) is not valid transform syntax.`, - '**Hint**: Use `\\+` to match a literal plus.'); + static Error_IllegalTransformPlus = (o: { from: string }) => m( + this.ERROR_IllegalTransformPlus, + `Invalid transform from="${def(o.from)}": Unescaped plus (+) is not valid transform syntax.`, ` + **Hint**: Use \`\\+\` to match a literal plus. + `); static ERROR_IllegalTransformAsterisk = SevErrorTransform | 0x04; - static Error_IllegalTransformAsterisk = (o: { from: string }) => - m(this.ERROR_IllegalTransformAsterisk, `Invalid transform from="${def(o.from)}": Unescaped asterisk (*) is not valid transform syntax.`, - '**Hint**: Use `\\*` to match a literal asterisk.'); + static Error_IllegalTransformAsterisk = (o: { from: string }) =>m( + this.ERROR_IllegalTransformAsterisk, + `Invalid transform from="${def(o.from)}": Unescaped asterisk (*) is not valid transform syntax.`, ` + **Hint**: Use \`\\*\` to match a literal asterisk. + `); static ERROR_IllegalTransformToUset = SevErrorTransform | 0x05; static Error_IllegalTransformToUset = (o: { to: string }) => m( this.ERROR_IllegalTransformToUset, - `Invalid transform to="${def(o.to)}": Set variable (\\$[…]) cannot be used in 'to=' unless part of a map.`, - '**Hint**: If a map was meant, must use the form ``.' - ); + `Invalid transform to="${def(o.to)}": Set variable (\\$[…]) cannot be used in 'to=' unless part of a map.`, ` + **Hint**: If a map was meant, must use the form + \`\`. + `); } diff --git a/developer/src/kmc/src/commands/messageCommand.ts b/developer/src/kmc/src/commands/messageCommand.ts index 257eacc913..d0feac380e 100644 --- a/developer/src/kmc/src/commands/messageCommand.ts +++ b/developer/src/kmc/src/commands/messageCommand.ts @@ -2,7 +2,7 @@ import * as fs from 'fs'; import * as path from 'path'; import { Command, Option } from 'commander'; -import { escapeMarkdownChar, KeymanUrls, CompilerBaseOptions, CompilerCallbacks, CompilerError, CompilerErrorNamespace, CompilerEvent } from '@keymanapp/developer-utils'; +import { escapeMarkdownChar, KeymanUrls, CompilerBaseOptions, CompilerCallbacks, CompilerError, CompilerErrorNamespace, CompilerEvent, dedentCompilerMessageDetail } from '@keymanapp/developer-utils'; import { CompilerMessageSource, messageNamespaceKeys, messageSources } from '../messages/messageNamespaces.js'; import { NodeCompilerCallbacks } from '../util/NodeCompilerCallbacks.js'; import { exitProcess } from '../util/sysexits.js'; @@ -189,7 +189,7 @@ function getMessageDetail(cls: any, id: string, escapeMarkdown: boolean): Compil throw new Error(`Call to ${cls.name}.${f} returned null`); } - event.detail = (event.detail ?? '').replace(/^[ ]+/gm, ''); // TODO(lowpri): dedent may be too naive? + event.detail = dedentCompilerMessageDetail(event); event.message = event.message ?? ''; event.message = event?.exceptionVar ? 'This is an internal error; the message will vary' diff --git a/developer/src/tike/main/UfrmMessages.dfm b/developer/src/tike/main/UfrmMessages.dfm index bed2632463..aed03fb40c 100644 --- a/developer/src/tike/main/UfrmMessages.dfm +++ b/developer/src/tike/main/UfrmMessages.dfm @@ -26,7 +26,6 @@ inherited frmMessages: TfrmMessages Font.Name = 'Courier New' Font.Style = [] ParentFont = False - PopupMenu = mnuPopup ReadOnly = True ScrollBars = ssBoth TabOrder = 0 @@ -35,6 +34,8 @@ inherited frmMessages: TfrmMessages OnClick = memoMessageClick OnDblClick = memoMessageDblClick OnKeyDown = memoMessageKeyDown + OnMouseDown = memoMessageMouseDown + OnMouseMove = memoMessageMouseMove end object dlgSave: TSaveDialog DefaultExt = 'txt' @@ -51,6 +52,10 @@ inherited frmMessages: TfrmMessages Default = True OnClick = mnuViewItemClick end + object mnuOpenDocumentation: TMenuItem + Caption = 'Open &documentation on selected message' + OnClick = mnuOpenDocumentationClick + end object mnuSeparator1: TMenuItem Caption = '-' end diff --git a/developer/src/tike/main/UfrmMessages.pas b/developer/src/tike/main/UfrmMessages.pas index f57e097fc4..9a76254c96 100644 --- a/developer/src/tike/main/UfrmMessages.pas +++ b/developer/src/tike/main/UfrmMessages.pas @@ -33,7 +33,7 @@ interface uses System.Classes, - System.Contnrs, + System.Generics.Collections, System.SysUtils, Vcl.Controls, Vcl.Dialogs, @@ -54,12 +54,24 @@ uses UfrmTike, Vcl.ComCtrls; type + TMessageItemSegment = record + text: string; + color: TColor; + underline: Boolean; + index: Integer; + end; + TMessageItem = class FileName: string; Msg: string; MsgCode, Line: Integer; + + Segments: TArray; + LineLength: Integer; end; + TMessageItemList = class(TObjectList); + TfrmMessages = class(TTikeDockForm) dlgSave: TSaveDialog; memoMessage: TRichEdit; @@ -71,6 +83,7 @@ type cmdmNextMessage: TMenuItem; mnuViewItem: TMenuItem; mnuSeparator1: TMenuItem; + mnuOpenDocumentation: TMenuItem; procedure memoMessageDblClick(Sender: TObject); procedure cmdmSaveToFileClick(Sender: TObject); procedure cmdmClearClick(Sender: TObject); @@ -83,8 +96,13 @@ type procedure mnuPopupPopup(Sender: TObject); procedure mnuViewItemClick(Sender: TObject); procedure FormDestroy(Sender: TObject); + procedure memoMessageMouseMove(Sender: TObject; Shift: TShiftState; X, + Y: Integer); + procedure mnuOpenDocumentationClick(Sender: TObject); + procedure memoMessageMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); private - FMessageItems: TObjectList; + FMessageItems: TMessageItemList; function GetSelLine: Integer; procedure SetSelLine(Value: Integer); protected @@ -107,6 +125,8 @@ var implementation uses + System.RegularExpressions, + System.Types, Winapi.RichEdit, UfrmMain, @@ -116,7 +136,9 @@ uses Keyman.Developer.System.Project.Project, Keyman.Developer.System.Project.ProjectFile, Keyman.Developer.UI.Project.ProjectFileUI, - Keyman.Developer.UI.Project.ProjectUI; + Keyman.Developer.UI.Project.ProjectUI, + Upload_Settings, + utilexecute; {$R *.DFM} @@ -149,24 +171,29 @@ const // ABGR - text on white bg, Colors similar to Light+ VSCode color theme INFO_ProjectBuiltSuccessfully = NAMESPACE_Infrastructure or $000B; INFO_ProjectNotBuiltSuccessfully = NAMESPACE_Infrastructure or $000C; + Segment_Filename = 0; + Segment_Filename_Separator = 1; + Segment_Line = 2; + Segment_Line_Separator = 3; + Segment_State = 4; + Segment_Code = 5; + Segment_Code_Separator = 6; + Segment_Message = 7; procedure TfrmMessages.Add(state: TProjectLogState; filename, msg: WideString; MsgCode, line: Integer); -type - TSegment = record - text: string; - color: TColor; - end; var mi: TMessageItem; FColor: TColor; FTextColor: TColor; - Segments: array of TSegment; + Segments: TArray; + i, x: Integer; - procedure AddText(const text: string; color: TColor); + procedure AddText(const text: string; color: TColor; underline: Boolean = false); var - s: TSegment; + s: TMessageItemSegment; begin s.text := text; + s.underline := underline; s.color := color; SetLength(Segments, Length(Segments)+1); Segments[High(Segments)] := s; @@ -175,7 +202,7 @@ var procedure AddLine; var t: string; - s: TSegment; + s: TMessageItemSegment; cr: TCharRange; cf: TCharFormat; gtle: TGetTextLengthEx; @@ -184,7 +211,7 @@ var // use direct messages to the RichEdit control to emit formatted text FillChar(cf, sizeof(TCharFormat), 0); cf.cbSize := sizeof(TCharFormat); - cf.dwMask := CFM_COLOR; + cf.dwMask := CFM_COLOR or CFM_UNDERLINE; gtle.flags := GTL_PRECISE or GTL_NUMCHARS; gtle.codepage := 1200; @@ -198,10 +225,13 @@ var for s in Segments do begin + if s.Text.Length = 0 then + Continue; cr.cpMin := cr.cpMax; cr.cpMax := cr.cpMax + s.text.Length; SendMessage(memoMessage.Handle, EM_EXSETSEL, 0, NativeUint(@cr)); cf.crTextColor := ColorToRGB(s.color); + if s.underline then cf.dwEffects := CFE_UNDERLINE else cf.dwEffects := 0; SendMessage(memoMessage.Handle, EM_SETCHARFORMAT, SCF_SELECTION, NativeUint(@cf)); end; cr.cpMin := cr.cpMax; @@ -251,15 +281,45 @@ begin begin AddText(':', Color_Text); AddText(IntToStr(Line), Color_Line); + end + else + begin + // Keep same number of segments + AddText('', Color_Text); + AddText('', Color_Text); end; AddText(' - ', Color_Text); - AddText(ProjectLogStateTitle[state], FColor); - AddText(' KM'+IntToHex(MsgCode, 5), Color_Code); + + if MsgCode = 0 then + begin + AddText(ProjectLogStateTitle[state], FColor); + AddText('', Color_Text); + end + else + begin + AddText(ProjectLogStateTitle[state]+' ', FColor); + AddText('KM'+IntToHex(MsgCode, 5), Color_Code, True); + end; + AddText(': ', Color_Text); AddText(StringReplace(msg, #13#10, ' ', [rfReplaceAll]), FTextColor); AddText(#13#10, clBlack); + + // Calculate segment lengths for later cursor + link calculations + + x := 0; + for i := 0 to High(Segments) - 1 do + begin + Segments[i].index := x; Inc(x, Segments[i].text.Length); + end; + mi.Segments := Segments; + mi.LineLength := x; + AddLine; + + // Strip #$D#$A from segments for further calculations + SetLength(mi.Segments, Length(mi.Segments) - 1); finally SendMessage(memoMessage.Handle, WM_SETREDRAW, 1, 0); SendMessage(memoMessage.Handle, EM_SETEVENTMASK, 0, eventMask); @@ -293,7 +353,7 @@ begin SelLine := line; - mi := FMessageItems[line] as TMessageItem; + mi := FMessageItems[line]; FFilename := mi.FileName; if FFileName = FGlobalProject.FileName then @@ -333,6 +393,74 @@ begin Key := 0; end; +procedure TfrmMessages.memoMessageMouseDown(Sender: TObject; + Button: TMouseButton; Shift: TShiftState; X, Y: Integer); +var + pt: TPointL; + ch: Integer; + px: TPoint; +begin + if Button = mbRight then + begin + pt.x := X; + pt.y := Y; + ch := SendMessage(memoMessage.Handle, EM_CHARFROMPOS, 0, NativeInt(@pt)); + memoMessage.SelStart := ch; + memoMessage.SelLength := 0; + px := memoMessage.ClientToScreen(Point(X, Y)); + mnuPopup.Popup(px.X, px.Y); + end; +end; + +procedure TfrmMessages.memoMessageMouseMove(Sender: TObject; Shift: TShiftState; + X, Y: Integer); +var + pt: TPOINTL; + ch: Integer; + Row, Col, i: Integer; + mi: TMessageItem; + seg: TMessageItemSegment; +begin + pt.x := X; + pt.y := Y; + ch := SendMessage(memoMessage.Handle, EM_CHARFROMPOS, 0, NativeInt(@pt)); + + x := 0; + Row := -1; + for I := 0 to FMessageItems.Count - 1 do + begin + if x + FMessageItems[i].LineLength >= ch then + begin + Row := i; + Break; + end; + Inc(x, FMessageItems[i].LineLength + 1); + end; + + if Row < 0 then + begin + // Mouse is outside bounds of text + memoMessage.Cursor := crDefault; + Exit; + end; + + Col := ch - x; + mi := FMessageItems[Row]; + + if Length(mi.Segments) <= Segment_Code then + begin + // Safety check + memoMessage.Cursor := crDefault; + Exit; + end; + + seg := mi.Segments[Segment_Code]; + + if (Col >= seg.index) and (Col < seg.index + seg.text.Length) + then memoMessage.Cursor := crHandPoint + else memoMessage.Cursor := crDefault; +end; + procedure TfrmMessages.cmdmSaveToFileClick(Sender: TObject); begin if dlgSave.Execute then @@ -433,16 +561,37 @@ begin memoMessage.SelLength := Length(memoMessage.Lines[Value]); end; +procedure TfrmMessages.mnuOpenDocumentationClick(Sender: TObject); +var + line: Integer; + mi: TMessageItem; +begin + line := SelLine; + if line < 0 then Exit; + mi := FMessageItems[line]; + if Length(mi.Segments) <= Segment_Code then + Exit; + + TUtilExecute.URL(URL_KmcMessage(mi.Segments[Segment_Code].text)); +end; + procedure TfrmMessages.mnuPopupPopup(Sender: TObject); var e: Boolean; + line: Integer; begin e := memoMessage.Lines.Count > 0; - cmdmNextMessage.Enabled := e and (SelLine < memoMessage.Lines.Count - 1); - cmdmPreviousMessage.Enabled := e and (SelLine > 0); + if e + then line := SelLine + else line := -1; + cmdmNextMessage.Enabled := e and (line < memoMessage.Lines.Count - 1); + cmdmPreviousMessage.Enabled := e and (line > 0); + e := e and (line >= 0) and (line < FMessageItems.Count); + mnuViewItem.Enabled := e; - cmdmClear.Enabled := e; - cmdmSaveToFile.Enabled := e; + mnuOpenDocumentation.Enabled := e; + cmdmClear.Enabled := FMessageItems.Count > 0; + cmdmSaveToFile.Enabled := FMessageItems.Count > 0; end; procedure TfrmMessages.mnuViewItemClick(Sender: TObject); @@ -451,14 +600,30 @@ begin end; procedure TfrmMessages.memoMessageClick(Sender: TObject); +var + p: TPoint; + mi: TMessageItem; + seg: TMessageItemSegment; begin - ; + p := memoMessage.CaretPos; + if (p.Y < 0) or (p.Y >= FMessageItems.Count) then + Exit; + + mi := FMessageItems[p.Y]; + if Length(mi.Segments) <= Segment_Code then + Exit; + + seg := mi.Segments[Segment_Code]; + if (p.X >= seg.index) and (p.X < seg.index + seg.text.Length) then + begin + TUtilExecute.URL(URL_KmcMessage(seg.text)); + end; end; procedure TfrmMessages.FormCreate(Sender: TObject); begin inherited; - FMessageItems := TObjectList.Create; + FMessageItems := TMessageItemList.Create; end; procedure TfrmMessages.FormDestroy(Sender: TObject); diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas index dc75f96d1f..cfc24801b3 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmCloneLocalProjectParameters.pas @@ -199,7 +199,7 @@ end; procedure TfrmCloneLocalProjectParameters.EnableControls; var e: Boolean; - sourceId, id: string; + id: string; begin e := (Trim(editSourceProjectFilename.Text) <> '') and FileExists(Trim(editSourceProjectFilename.Text)) and From 4509aca88a085099e30d5539f3f5ddd817556757 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 7 Feb 2025 09:30:07 +0700 Subject: [PATCH 090/109] feat(developer): verify that packages do not contain themselves in kmc-package Fixes: #13109 --- .../kmc-package/src/compiler/kmp-compiler.ts | 6 ++- .../src/compiler/package-compiler-messages.ts | 19 ++++++++++ .../src/compiler/package-validation.ts | 21 ++++++++--- .../error_package_must_not_contain_itself.kps | 37 +++++++++++++++++++ .../src/kmc-package/test/messages.tests.ts | 2 + .../test/package-compiler.tests.ts | 16 +++++++- 6 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 developer/src/kmc-package/test/fixtures/invalid/error_package_must_not_contain_itself.kps diff --git a/developer/src/kmc-package/src/compiler/kmp-compiler.ts b/developer/src/kmc-package/src/compiler/kmp-compiler.ts index cd6cf6df36..04eae4afd8 100644 --- a/developer/src/kmc-package/src/compiler/kmp-compiler.ts +++ b/developer/src/kmc-package/src/compiler/kmp-compiler.ts @@ -105,12 +105,14 @@ export class KmpCompiler implements KeymanCompiler { return null; } + outputFilename = outputFilename ?? inputFilename.replace(/\.kps$/, '.kmp'); + // // Validate the package file // const validation = new PackageValidation(this.callbacks, this.options); - if(!validation.validate(inputFilename, kmpJsonData)) { + if(!validation.validate(inputFilename, outputFilename, kmpJsonData)) { return null; } @@ -127,7 +129,7 @@ export class KmpCompiler implements KeymanCompiler { artifacts: { kmp: { data, - filename: outputFilename ?? inputFilename.replace(/\.kps$/, '.kmp') + filename: outputFilename } } } diff --git a/developer/src/kmc-package/src/compiler/package-compiler-messages.ts b/developer/src/kmc-package/src/compiler/package-compiler-messages.ts index 6545b7d963..4ebf070468 100644 --- a/developer/src/kmc-package/src/compiler/package-compiler-messages.ts +++ b/developer/src/kmc-package/src/compiler/package-compiler-messages.ts @@ -184,5 +184,24 @@ export class PackageCompilerMessages { static Warn_VisualKeyboardFileIsInvalid = (o:{filename: string}) => m( this.WARN_VisualKeyboardFileIsInvalid, `Visual keyboard file '${def(o.filename)}' is invalid.` ); + + static ERROR_PackageMustNotContainItself = SevError | 0x0027; + static Error_PackageMustNotContainItself = (o:{outputFilename: string}) => m( + this.ERROR_PackageMustNotContainItself, `The package may not include a .kmp file of the same name '${def(o.outputFilename)}'.`, ` + While it is possible for a package file to contain other .kmp package files, + it is an error for a package file to contain a package with the same name as + itself. + + **Note:** it is not recommended to include other package files within a + package, as the user experience for installation and uninstallation is + complex, and not consistent across all platforms. + + **Note**: Nested packages are not checked for validity or whether or not they + may violate this rule transitively. + `); + + //------------------------------------------------------------------------------| + // max length of detail message lines (checked by verifyCompilerMessagesObject) | + //------------------------------------------------------------------------------| } diff --git a/developer/src/kmc-package/src/compiler/package-validation.ts b/developer/src/kmc-package/src/compiler/package-validation.ts index 3f98f7d830..ae5fd331f5 100644 --- a/developer/src/kmc-package/src/compiler/package-validation.ts +++ b/developer/src/kmc-package/src/compiler/package-validation.ts @@ -12,7 +12,7 @@ export class PackageValidation { constructor(private callbacks: CompilerCallbacks, private options: CompilerOptions) { } - public validate(filename: string, kmpJson: KmpJsonFile.KmpJsonFile) { + public validate(filename: string, outputFilename: string, kmpJson: KmpJsonFile.KmpJsonFile) { if(!this.checkForModelsAndKeyboardsInSamePackage(kmpJson)) { return false; } @@ -22,7 +22,7 @@ export class PackageValidation { if(!this.checkLexicalModels(filename, kmpJson)) { return false; } - if(!this.checkContentFiles(kmpJson)) { + if(!this.checkContentFiles(kmpJson, outputFilename)) { return false; } if(!this.checkPackageInfo(kmpJson)) { @@ -130,9 +130,9 @@ export class PackageValidation { return true; } - private checkContentFiles(kmpJson: KmpJsonFile.KmpJsonFile): boolean { + private checkContentFiles(kmpJson: KmpJsonFile.KmpJsonFile, outputFilename: string): boolean { for(let file of kmpJson.files) { - if(!this.checkContentFile(file)) { + if(!this.checkContentFile(file, outputFilename)) { return false; } } @@ -140,7 +140,7 @@ export class PackageValidation { return true; } - private checkContentFile(file: KmpJsonFile.KmpJsonFileContentFile): boolean { + private checkContentFile(file: KmpJsonFile.KmpJsonFileContentFile, outputFilename: string): boolean { const filename = this.callbacks.path.basename(file.name); const ext = this.callbacks.path.extname(filename); const base = filename.substring(0, filename.length-ext.length); @@ -155,9 +155,20 @@ export class PackageValidation { return false; } + if(this.doesContentFileEqualOutputFilename(file, outputFilename)) { + this.callbacks.reportMessage(PackageCompilerMessages.Error_PackageMustNotContainItself({outputFilename})); + return false; + } + return true; } + private doesContentFileEqualOutputFilename(file: KmpJsonFile.KmpJsonFileContentFile, outputFilename: string): boolean { + // case-insensitive comparison because Windows has case-insensitive filenames + return this.callbacks.path.basename(file.name).toLowerCase() == + this.callbacks.path.basename(outputFilename).toLowerCase(); + } + private checkIfContentFileIsDangerous(file: KmpJsonFile.KmpJsonFileContentFile): boolean { const filename = this.callbacks.path.basename(file.name).toLowerCase(); diff --git a/developer/src/kmc-package/test/fixtures/invalid/error_package_must_not_contain_itself.kps b/developer/src/kmc-package/test/fixtures/invalid/error_package_must_not_contain_itself.kps new file mode 100644 index 0000000000..299d7ca9cd --- /dev/null +++ b/developer/src/kmc-package/test/fixtures/invalid/error_package_must_not_contain_itself.kps @@ -0,0 +1,37 @@ + + + + 15.0.266.0 + 7.0 + + + error_package_must_not_contain_itself + © 2019 National Research Council Canada + Eddie Antonio Santos + 1.0 + + + + error_package_must_not_contain_itself.kmp + error_package_must_not_contain_itself + 0 + .kmx + + + basic.kmx + Keyboard Basic + 0 + .kmx + + + + + Basic + basic + 1.0 + + Central Khmer (Khmer, Cambodia) + + + + diff --git a/developer/src/kmc-package/test/messages.tests.ts b/developer/src/kmc-package/test/messages.tests.ts index ba5ec56b08..0e95bc9ebd 100644 --- a/developer/src/kmc-package/test/messages.tests.ts +++ b/developer/src/kmc-package/test/messages.tests.ts @@ -241,4 +241,6 @@ describe('PackageCompilerMessages', function () { await testForMessage(this, ['invalid', 'error_package_file_has_empty_version.kps'], PackageCompilerMessages.ERROR_PackageFileHasEmptyVersion); }); + + // ERROR_PackageMustNotContainItself test in package-compiler.tests.ts }); diff --git a/developer/src/kmc-package/test/package-compiler.tests.ts b/developer/src/kmc-package/test/package-compiler.tests.ts index 16c523bda9..a9777a2a08 100644 --- a/developer/src/kmc-package/test/package-compiler.tests.ts +++ b/developer/src/kmc-package/test/package-compiler.tests.ts @@ -294,18 +294,30 @@ describe('KmpCompiler', function () { it(`should handle a range of valid BCP47 tags`, function () { const inputFilename = makePathToFixture('bcp47', 'valid_bcp47.kps'); + const outputFilename = makePathToFixture('bcp47', 'valid_bcp47.kmp'); const kmpJson = kmpCompiler.transformKpsToKmpObject(inputFilename); assert.isNotNull(kmpJson); const validation = new PackageValidation(callbacks, {}); - assert.isTrue(validation.validate(inputFilename, kmpJson)); + assert.isTrue(validation.validate(inputFilename, outputFilename, kmpJson)); }); it(`should reject an invalid BCP47 tag`, function () { const inputFilename = makePathToFixture('bcp47', 'invalid_bcp47_1.kps'); + const outputFilename = makePathToFixture('bcp47', 'invalid_bcp47_1.kmp'); const kmpJson = kmpCompiler.transformKpsToKmpObject(inputFilename); assert.isNotNull(kmpJson); const validation = new PackageValidation(callbacks, {}); - assert.isFalse(validation.validate(inputFilename, kmpJson)); + assert.isFalse(validation.validate(inputFilename, outputFilename, kmpJson)); + }); + + it(`should reject an package that contains itself`, function () { + const inputFilename = makePathToFixture('invalid', 'error_package_must_not_contain_itself.kps'); + const outputFilename = makePathToFixture('invalid', 'error_package_must_not_contain_itself.kmp'); + const kmpJson = kmpCompiler.transformKpsToKmpObject(inputFilename); + assert.isNotNull(kmpJson); + const validation = new PackageValidation(callbacks, {}); + assert.isFalse(validation.validate(inputFilename, outputFilename, kmpJson)); + assert.equal(callbacks.messages[0].code, PackageCompilerMessages.ERROR_PackageMustNotContainItself); }); }); From 85b8a72be61ea065de0568e7beb0effc447db7f1 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 7 Feb 2025 13:24:13 +1000 Subject: [PATCH 091/109] feat(windows): change condition at the end of download Only go to the installing state if apply now has been set. Otherwise go to WaitingRestart. Can revist in stage 2 --- .../main/Keyman.System.UpdateStateMachine.pas | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas index a09a9e5068..750f2a4616 100644 --- a/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas +++ b/windows/src/desktop/kmshell/main/Keyman.System.UpdateStateMachine.pas @@ -778,19 +778,17 @@ begin end else begin - if HasKeymanRun then + // TODO: #8993 for stage 2 we can got to the InstallingState + // or even have a call back to notify the user to installation + // is about to begin. + if bucStateContext.GetApplyNow then begin - if bucStateContext.GetApplyNow then - begin - bucStateContext.SetApplyNow(False); - ChangeState(InstallingState); - end - else - ChangeState(WaitingRestartState); + bucStateContext.SetApplyNow(False); + ChangeState(InstallingState); end else begin - ChangeState(InstallingState); + ChangeState(WaitingRestartState); end; end From a00e446ee7f91e11c5239c871585f97201059bd3 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 7 Feb 2025 05:11:47 +0100 Subject: [PATCH 092/109] chore(developer): use correct .kmp file extension in fixture Co-authored-by: Darcy Wong --- .../fixtures/invalid/error_package_must_not_contain_itself.kps | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/developer/src/kmc-package/test/fixtures/invalid/error_package_must_not_contain_itself.kps b/developer/src/kmc-package/test/fixtures/invalid/error_package_must_not_contain_itself.kps index 299d7ca9cd..430ccd3b71 100644 --- a/developer/src/kmc-package/test/fixtures/invalid/error_package_must_not_contain_itself.kps +++ b/developer/src/kmc-package/test/fixtures/invalid/error_package_must_not_contain_itself.kps @@ -15,7 +15,7 @@ error_package_must_not_contain_itself.kmp error_package_must_not_contain_itself 0 - .kmx + .kmp basic.kmx From 0fd03cbdc636857b328e5b462a62417e6d637ed6 Mon Sep 17 00:00:00 2001 From: Shawn Schantz Date: Fri, 7 Feb 2025 11:55:20 +0700 Subject: [PATCH 093/109] chore(mac): remove empty options tab from configuration --- .../KMConfiguration/Base.lproj/preferences.xib | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib index e6cc0173aa..a257c34419 100644 --- a/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib +++ b/mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/Base.lproj/preferences.xib @@ -1,9 +1,9 @@ - + - - + + @@ -203,12 +203,6 @@ - - - - - - From d4ecd83459713dd4faf8d08e97419a5d2f729173 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 7 Feb 2025 12:50:38 +0700 Subject: [PATCH 094/109] chore(developer): use kmn.sh instead of deeplink into help.keyman.com for message links --- common/windows/delphi/general/Upload_Settings.pas | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/common/windows/delphi/general/Upload_Settings.pas b/common/windows/delphi/general/Upload_Settings.pas index 5015f13942..e1e8ce4294 100644 --- a/common/windows/delphi/general/Upload_Settings.pas +++ b/common/windows/delphi/general/Upload_Settings.pas @@ -92,7 +92,7 @@ function MakeAPIURL(path: string): string; function MakeKeymanURL(const path: string): string; -function URL_KmcMessage(id: string): string; +function URL_KmcMessage(const id: string): string; implementation @@ -110,7 +110,7 @@ const S_UserAgent_Developer = 'Keyman Developer'; S_UserAgent_Diagnostics = 'Keyman for Windows Diagnostics'; - S_HelpKeymanCom = 'https://help.keyman.com'; + S_Host_KmnSh = 'https://kmn.sh'; S_KeymanCom = 'https://keyman.com'; S_APIProtocol = 'https'; S_APIServer = 'api.keyman.com'; @@ -123,6 +123,7 @@ const const URLPath_PackageDownload_Format = '/go/package/download/%0:s?platform=windows&tier=%1:s&bcp47=%2:s&update=%3:d'; + URL_KeymanDeveloper_HelpKmcMessage_Format = S_Host_KmnSh+'/%0:s'; function API_UserAgent: string; begin @@ -181,9 +182,9 @@ begin Result := Format(URLPath_PackageDownload_Format, [URLEncode(PackageID), URLEncode(CKeymanVersionInfo.Tier), URLEncode(BCP47), IsUpdateInt]); end; -function URL_KmcMessage(id: string): string; +function URL_KmcMessage(const id: string): string; begin - Result := S_HelpKeymanCom + '/developer/'+GetMajorMinorVersionString+'/reference/messages/'+id.ToLower; + Result := Format(URL_KeymanDeveloper_HelpKmcMessage_Format, [id.ToLower]); end; end. From 503d045fee15eedd23bb01e98e1444758b32d581 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Fri, 7 Feb 2025 13:50:11 +0700 Subject: [PATCH 095/109] fix(developer): for new projects, link welcome.htm in package; use v17 project format for new models * Links welcome.htm in the package details for all project types * Uses v17 project file format for new lexical model projects * Nit: changes shortcut key for 'supported languages' from 'l' to 's' to fix conflict with 'full copyright'. Fixes: #13135 --- ...eveloper.System.KeyboardProjectTemplate.pas | 1 + ...oper.System.LdmlKeyboardProjectTemplate.pas | 1 + ...n.Developer.System.ModelProjectTemplate.pas | 18 ++++-------------- ...ct.UfrmNewLDMLKeyboardProjectParameters.dfm | 2 +- 4 files changed, 7 insertions(+), 15 deletions(-) diff --git a/developer/src/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas b/developer/src/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas index ce4add7717..1ba224d50b 100644 --- a/developer/src/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas +++ b/developer/src/kmconvert/Keyman.Developer.System.KeyboardProjectTemplate.pas @@ -258,6 +258,7 @@ begin f := TPackageContentFile.Create(kps); f.FileName := BasePath + ID + '\' + SFolder_Source + '\' + SFile_WelcomeHTM; kps.Files.Add(f); + kps.Options.WelcomeFile := f; // Add readme f := TPackageContentFile.Create(kps); diff --git a/developer/src/kmconvert/Keyman.Developer.System.LdmlKeyboardProjectTemplate.pas b/developer/src/kmconvert/Keyman.Developer.System.LdmlKeyboardProjectTemplate.pas index d8cfa9cd8f..77d93d8df9 100644 --- a/developer/src/kmconvert/Keyman.Developer.System.LdmlKeyboardProjectTemplate.pas +++ b/developer/src/kmconvert/Keyman.Developer.System.LdmlKeyboardProjectTemplate.pas @@ -217,6 +217,7 @@ begin f := TPackageContentFile.Create(kps); f.FileName := BasePath + ID + '\' + SFolder_Source + '\' + SFile_WelcomeHTM; kps.Files.Add(f); + kps.Options.WelcomeFile := f; // Add readme f := TPackageContentFile.Create(kps); diff --git a/developer/src/kmconvert/Keyman.Developer.System.ModelProjectTemplate.pas b/developer/src/kmconvert/Keyman.Developer.System.ModelProjectTemplate.pas index b5b64f6b86..6edd42dfa2 100644 --- a/developer/src/kmconvert/Keyman.Developer.System.ModelProjectTemplate.pas +++ b/developer/src/kmconvert/Keyman.Developer.System.ModelProjectTemplate.pas @@ -19,13 +19,11 @@ type procedure WriteWordlist; procedure WriteKPS; procedure WriteKPJ; - procedure WriteModelInfo; function GetModelFilename: string; function GetWordlistFilename: string; protected const - SFileTemplate_ModelInfo = '%s.model_info'; // in root SFileTemplate_Package = '%s.model.kps'; SFilename_Model = 'model.ts'; // Only for source SFilename_Wordlist = 'wordlist.tsv'; @@ -82,8 +80,6 @@ begin WriteKPJ; WriteRepositoryMetadata; - - WriteModelInfo; end; function TModelProjectTemplate.GetModelFilename: string; @@ -107,15 +103,6 @@ begin Format(SFolder_Source + '\' + SFileTemplate_Model, [ID])); end; -procedure TModelProjectTemplate.WriteModelInfo; -begin - // Write modelid.model_info - Transform( - Format(SFileTemplate_ModelInfo, ['model']), - Format(SFileTemplate_ModelInfo, [ID]) - ); -end; - procedure TModelProjectTemplate.WriteWordlist; begin Transform(SFolder_Source + '\' + SFilename_Wordlist); @@ -127,10 +114,13 @@ var begin kpj := TProject.Create(ptLexicalModel, GetProjectFilename, False); try + kpj.Options.Version := pv20; kpj.Options.BuildPath := '$PROJECTPATH\' + SFolder_Build; + kpj.Options.SourcePath := '$PROJECTPATH\' + SFolder_Source; kpj.Options.WarnDeprecatedCode := True; kpj.Options.CompilerWarningsAsErrors := True; kpj.Options.CheckFilenameConventions := True; + kpj.Options.SkipMetadataFiles := False; // Add model and package to project kpj.Files.Add(TmodelTsProjectFile.Create(kpj, GetModelFilename, nil)); @@ -140,7 +130,6 @@ begin kpj.Files.Add(TOpenableProjectFile.Create(kpj, BasePath + ID + '\' + SFile_HistoryMD, nil)); kpj.Files.Add(TOpenableProjectFile.Create(kpj, BasePath + ID + '\' + SFile_LicenseMD, nil)); kpj.Files.Add(TOpenableProjectFile.Create(kpj, BasePath + ID + '\' + SFile_ReadmeMD, nil)); - kpj.Files.Add(TOpenableProjectFile.Create(kpj, BasePath + ID + '\' + Format(SFileTemplate_ModelInfo, [ID]), nil)); kpj.Save; finally @@ -173,6 +162,7 @@ begin f := TPackageContentFile.Create(kps); f.FileName := BasePath + ID + '\' + SFolder_Source + '\' + SFile_WelcomeHTM; kps.Files.Add(f); + kps.Options.WelcomeFile := f; // Add readme f := TPackageContentFile.Create(kps); diff --git a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.dfm b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.dfm index 3942364fd8..6ef44a8f7a 100644 --- a/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.dfm +++ b/developer/src/tike/project/Keyman.Developer.UI.Project.UfrmNewLDMLKeyboardProjectParameters.dfm @@ -94,7 +94,7 @@ inherited frmNewLDMLKeyboardProjectParameters: TfrmNewLDMLKeyboardProjectParamet Top = 260 Width = 102 Height = 13 - Caption = 'Supported &languages' + Caption = '&Supported languages' FocusControl = memoLanguages end object Label4: TLabel From 51aeb8dcc079e9f4abb644ca5e86fea544bf46aa Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Fri, 7 Feb 2025 18:49:11 +1000 Subject: [PATCH 096/109] fix(windows): use automatic update for old koCheckForUpdates I missed the english phrase being copied over to the koCheckForUpdates flag --- oem/firstvoices/windows/src/xml/strings.xml | 4 ++-- windows/src/desktop/kmshell/xml/strings.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/oem/firstvoices/windows/src/xml/strings.xml b/oem/firstvoices/windows/src/xml/strings.xml index fbd099c8c7..51b19c060d 100644 --- a/oem/firstvoices/windows/src/xml/strings.xml +++ b/oem/firstvoices/windows/src/xml/strings.xml @@ -390,8 +390,8 @@ - - Automatically check keyman.com weekly for updates + + Automatically check for updates and download diff --git a/windows/src/desktop/kmshell/xml/strings.xml b/windows/src/desktop/kmshell/xml/strings.xml index e189103ea3..73b9831c3b 100644 --- a/windows/src/desktop/kmshell/xml/strings.xml +++ b/windows/src/desktop/kmshell/xml/strings.xml @@ -416,8 +416,8 @@ - - Automatically check keyman.com weekly for updates + + Automatically check for updates and download From ce3f8d51881dbade94f235875c3a2b9d86756916 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Fri, 7 Feb 2025 13:01:36 -0500 Subject: [PATCH 097/109] auto: increment master version to 18.0.188 --- HISTORY.md | 6 ++++++ VERSION.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index e92b844c29..6ec38b285e 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,11 @@ # Keyman Version History +## 18.0.187 alpha 2025-02-07 + +* docs(web): relocate gesture docs to web/docs/internal (#13139) +* chore(mac): remove empty options tab from configuration (#13160) +* chore(linux): Update debian changelog (#13143) + ## 18.0.186 alpha 2025-02-06 * feat(windows): check updates and automatic update merged (#13115) diff --git a/VERSION.md b/VERSION.md index 1f2afde79b..09b5711cea 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.187 \ No newline at end of file +18.0.188 \ No newline at end of file From b074c2c0ef472fc4ae5476edc6b8ea316970baf2 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 10 Feb 2025 13:50:18 +1000 Subject: [PATCH 098/109] feat(windows): add release ownership rename mutex owned Add a ReleaseOwnership member to TKeymanMutex. Rename MutexOwned to TakeOwnership. Fixes: #13167 --- windows/src/desktop/kmshell/main/initprog.pas | 4 ++-- windows/src/desktop/kmshell/startup/UfrmSplash.pas | 2 +- .../src/engine/kmcomapi/com/system/keymancontrol.pas | 4 ++-- windows/src/global/delphi/general/KeymanMutex.pas | 10 ++++++++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index 3d0ea7675a..efc69cfe70 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -526,12 +526,12 @@ begin fmMain, fmAbout: begin // I2720 FMutex := TKeymanMutex.Create('KeymanConfiguration'); - if FMutex.MutexOwned then Main else FocusConfiguration; + if FMutex.TakeOwnership then Main else FocusConfiguration; end; fmTextEditor: begin // I2720 FMutex := TKeymanMutex.Create('KeymanTextEditor'); - if FMutex.MutexOwned then OpenTextEditor else FocusTextEditor; + if FMutex.TakeOwnership then OpenTextEditor else FocusTextEditor; end; fmBaseKeyboard: // I4169 diff --git a/windows/src/desktop/kmshell/startup/UfrmSplash.pas b/windows/src/desktop/kmshell/startup/UfrmSplash.pas index 5a6cccd529..d10379fc3e 100644 --- a/windows/src/desktop/kmshell/startup/UfrmSplash.pas +++ b/windows/src/desktop/kmshell/startup/UfrmSplash.pas @@ -220,7 +220,7 @@ begin begin FMutex := TKeymanMutex.Create('KeymanSplash'); try - if not FMutex.MutexOwned then + if not FMutex.TakeOwnership then begin FocusSplash; // I2562 Exit; diff --git a/windows/src/engine/kmcomapi/com/system/keymancontrol.pas b/windows/src/engine/kmcomapi/com/system/keymancontrol.pas index 6b429b985e..9bca81482c 100644 --- a/windows/src/engine/kmcomapi/com/system/keymancontrol.pas +++ b/windows/src/engine/kmcomapi/com/system/keymancontrol.pas @@ -281,7 +281,7 @@ function TKeymanControl.IsConfigurationOpen: WordBool; begin with TKeymanMutex.Create('KeymanConfiguration') do try - Result := MutexOwned; + Result := TakeOwnership; finally Free; end; @@ -302,7 +302,7 @@ function TKeymanControl.IsTextEditorOpen: WordBool; begin with TKeymanMutex.Create('KeymanTextEditor') do try - Result := MutexOwned; + Result := TakeOwnership; finally Free; end; diff --git a/windows/src/global/delphi/general/KeymanMutex.pas b/windows/src/global/delphi/general/KeymanMutex.pas index 4e9d92921a..4be88a189f 100644 --- a/windows/src/global/delphi/general/KeymanMutex.pas +++ b/windows/src/global/delphi/general/KeymanMutex.pas @@ -29,7 +29,8 @@ type public constructor Create(FName: string); destructor Destroy; override; - function MutexOwned: Boolean; + function TakeOwnership: Boolean; + function ReleaseOwnership: Boolean; end; implementation @@ -52,9 +53,14 @@ begin inherited Destroy; end; -function TKeymanMutex.MutexOwned: Boolean; +function TKeymanMutex.TakeOwnership: Boolean; begin Result := WaitForSingleObject(hMutex, 0) = WAIT_OBJECT_0; end; +function TKeymanMutex.ReleaseOwnership: Boolean; +begin + Result := ReleaseMutex(hMutex); +end; + end. From 96b3c4f983284695f57a924e7c672411716b8418 Mon Sep 17 00:00:00 2001 From: rc-swag <58423624+rc-swag@users.noreply.github.com> Date: Mon, 10 Feb 2025 15:00:17 +1000 Subject: [PATCH 099/109] feat(windows): review suggestions Co-authored-by: Marc Durdin --- windows/src/desktop/kmshell/main/initprog.pas | 8 ++++++-- windows/src/engine/kmcomapi/com/system/keymancontrol.pas | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/windows/src/desktop/kmshell/main/initprog.pas b/windows/src/desktop/kmshell/main/initprog.pas index efc69cfe70..27d1ea95b5 100644 --- a/windows/src/desktop/kmshell/main/initprog.pas +++ b/windows/src/desktop/kmshell/main/initprog.pas @@ -526,12 +526,16 @@ begin fmMain, fmAbout: begin // I2720 FMutex := TKeymanMutex.Create('KeymanConfiguration'); - if FMutex.TakeOwnership then Main else FocusConfiguration; + if FMutex.TakeOwnership + then Main + else FocusConfiguration; end; fmTextEditor: begin // I2720 FMutex := TKeymanMutex.Create('KeymanTextEditor'); - if FMutex.TakeOwnership then OpenTextEditor else FocusTextEditor; + if FMutex.TakeOwnership + then OpenTextEditor + else FocusTextEditor; end; fmBaseKeyboard: // I4169 diff --git a/windows/src/engine/kmcomapi/com/system/keymancontrol.pas b/windows/src/engine/kmcomapi/com/system/keymancontrol.pas index 9bca81482c..4adf198844 100644 --- a/windows/src/engine/kmcomapi/com/system/keymancontrol.pas +++ b/windows/src/engine/kmcomapi/com/system/keymancontrol.pas @@ -281,7 +281,7 @@ function TKeymanControl.IsConfigurationOpen: WordBool; begin with TKeymanMutex.Create('KeymanConfiguration') do try - Result := TakeOwnership; + Result := not TakeOwnership; finally Free; end; @@ -302,7 +302,7 @@ function TKeymanControl.IsTextEditorOpen: WordBool; begin with TKeymanMutex.Create('KeymanTextEditor') do try - Result := TakeOwnership; + Result := not TakeOwnership; finally Free; end; From 87da9ce6d40e95763a30d478f6dad87deb100de7 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Mon, 10 Feb 2025 13:02:44 -0500 Subject: [PATCH 100/109] auto: increment master version to 18.0.189 --- HISTORY.md | 12 ++++++++++++ VERSION.md | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 6ec38b285e..ca5fe2101f 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,17 @@ # Keyman Version History +## 18.0.188 alpha 2025-02-10 + +* fix(windows): check the params status flag equals ucrsUpdateReady before attempting to download the keyman setup file (#13154) +* feat(windows): background updates go from downloading to waiting for a restart except if the `apply now` flag is set (#13159) +* feat(developer): verify package version number format in kmc-package (#13118) +* fix(developer): support non-US base keyboard layouts in debuggers (#13131) +* feat(developer): improve compiler messages and user interface (#13156) +* feat(developer): verify that packages do not contain themselves in kmc-package (#13157) +* fix(developer): link welcome.htm in package for new projects; use v17 project format for new models (#13161) +* fix(windows): use Automatically check for updates and download for the english xml (#13162) +* change(linux): Implement ordered output without patched ibus (#11535) + ## 18.0.187 alpha 2025-02-07 * docs(web): relocate gesture docs to web/docs/internal (#13139) diff --git a/VERSION.md b/VERSION.md index 09b5711cea..b9cdf8a8b6 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.188 \ No newline at end of file +18.0.189 \ No newline at end of file From 342f216291a5608162098c3940f953bb44a6c493 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 11 Feb 2025 14:14:15 +0700 Subject: [PATCH 101/109] chore: increment to alpha 19.0 --- VERSION.md | 2 +- android/docs/engine/guides/in-app/index.md | 6 ++-- android/docs/engine/index.md | 2 +- android/docs/engine/whatsnew.md | 7 +--- android/docs/help/about/whatsnew.md | 7 ++-- android/docs/help/index.md | 2 +- developer/docs/help/index.md | 4 +-- developer/docs/help/whats-new.md | 42 ++-------------------- developer/src/kmc/src/kmlmp.ts | 2 +- docs/minimum-versions.md | 2 +- docs/minimum-versions.md.in | 2 +- ios/docs/engine/index.md | 2 +- ios/docs/help/about/whatsnew.md | 7 ++-- ios/docs/help/index.md | 2 +- linux/docs/help/about/whatsnew.md | 4 +-- linux/docs/help/index.md | 2 +- mac/docs/help/about/whatsnew.md | 4 +-- mac/docs/help/index.md | 2 +- resources/build/minimum-versions.inc.sh | 2 +- web/docs/engine/guide/index.md | 6 ++-- web/docs/engine/index.md | 12 +++---- web/docs/engine/reference/core/version.md | 2 +- web/docs/engine/reference/index.md | 2 +- web/docs/engine/whats-new.md | 2 +- windows/docs/engine/api/index.md | 6 ++-- windows/docs/engine/index.md | 4 +-- windows/docs/help/about/whatsnew.md | 4 +-- windows/docs/help/index.md | 2 +- 28 files changed, 47 insertions(+), 96 deletions(-) diff --git a/VERSION.md b/VERSION.md index b9cdf8a8b6..b2c7e01f85 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -18.0.189 \ No newline at end of file +19.0.1 \ No newline at end of file diff --git a/android/docs/engine/guides/in-app/index.md b/android/docs/engine/guides/in-app/index.md index d788e267bb..538094ddbb 100644 --- a/android/docs/engine/guides/in-app/index.md +++ b/android/docs/engine/guides/in-app/index.md @@ -6,8 +6,8 @@ Keyman Engine for Android allows you to use any Keyman touch keyboard in your An system keyboard app for purchase in the Play Store.
This guide will walk you through the steps for creating your first Android app with Keyman Engine for Android. -If you are not familiar with Android development, you will find the -[Android Developer online training](https://developer.android.com/training/index.html) an invaluable +If you are not familiar with Android development, you will find the +[Android Developer online training](https://developer.android.com/training/index.html) an invaluable resource, and working through some of their tutorials first will help you with the rest of this guide. ### 1. Install Free Tools @@ -131,5 +131,5 @@ And there you have it: your first Keyman Engine for Android app! ## See Also * [Guide: Build a system keyboard app](../system-keyboard/) * [Keyman Developer Documentation](/developer/17.0/) -* [Keyman Engine for Android Documentation](/developer/engine/android/18.0/) +* [Keyman Engine for Android Documentation](/developer/engine/android/19.0/) * [Android Developer Home](https://developer.android.com/index.html) diff --git a/android/docs/engine/index.md b/android/docs/engine/index.md index fa549e4b34..38f255592b 100644 --- a/android/docs/engine/index.md +++ b/android/docs/engine/index.md @@ -4,7 +4,7 @@ title: Keyman Engine for Android ## Overview -Keyman Engine for Android 18.0 is a Java library for Android 5.0 and later versions which enables a fully customisable keyboard layout, both within an app and system-wide. +Keyman Engine for Android 19.0 is a Java library for Android 5.0 and later versions which enables a fully customisable keyboard layout, both within an app and system-wide. Keyboard layouts for Keyman Engine can be created with [Keyman Developer](/developer/17.0), and a [library of existing keyboard layouts](http://keyman.com/developer/keymanweb/keyboards) is also available.

diff --git a/android/docs/engine/whatsnew.md b/android/docs/engine/whatsnew.md index af3f8932d6..5d6f717f8a 100644 --- a/android/docs/engine/whatsnew.md +++ b/android/docs/engine/whatsnew.md @@ -1,11 +1,6 @@ --- -title: What's New in Keyman Engine 18.0 for Android +title: What's New in Keyman Engine 19.0 for Android --- -## Keyman Engine for Android Breaking Changes: ## - -* Change package name from `com.tavultesoft.kmea` to `com.keyman.engine` #7881 -* Update to Java 11 #8543 - ## See Also * [Keyman Engine for Android Documentation](index) \ No newline at end of file diff --git a/android/docs/help/about/whatsnew.md b/android/docs/help/about/whatsnew.md index 0f0e891e42..d0ca85e93f 100644 --- a/android/docs/help/about/whatsnew.md +++ b/android/docs/help/about/whatsnew.md @@ -1,9 +1,6 @@ --- -title: What's New in Keyman 18.0 for Android +title: What's New in Keyman 19.0 for Android --- -Here are some of the new features we have added to Keyman 18.0 for Android: +Here are some of the new features we have added to Keyman 19.0 for Android: -* New menu to adjust longpress delay time (#12170, #12185) -* Support localizations for right-to-left languages (#12215) -* Handle additional actions for ENTER key (#12125, #12315) diff --git a/android/docs/help/index.md b/android/docs/help/index.md index 62df93195b..360af91e6d 100644 --- a/android/docs/help/index.md +++ b/android/docs/help/index.md @@ -1,5 +1,5 @@ --- -title: Keyman for Android 18.0 Help +title: Keyman for Android 19.0 Help --- ## [About Keyman](about/) diff --git a/developer/docs/help/index.md b/developer/docs/help/index.md index 9e9c250abb..d7fbc4098d 100644 --- a/developer/docs/help/index.md +++ b/developer/docs/help/index.md @@ -1,5 +1,5 @@ --- -title: Keyman Developer 18.0 User Guide +title: Keyman Developer 19.0 User Guide --- Need help using Keyman Developer to create your keyboard layouts? You'll @@ -8,7 +8,7 @@ and tutorials, and full reference information. ## Guides and Tutorials - [What is Keyman Developer?](guides/intro) -- [What's new in 18.0](whats-new) +- [What's new in 19.0](whats-new) - [Developing Keyman keyboard layouts](guides/develop) - [Testing Keyman keyboards](guides/test) - [Distributing Keyman keyboards](guides/distribute) diff --git a/developer/docs/help/whats-new.md b/developer/docs/help/whats-new.md index d1dce092c3..1005476c3d 100644 --- a/developer/docs/help/whats-new.md +++ b/developer/docs/help/whats-new.md @@ -1,43 +1,5 @@ --- -title: What's new in Keyman Developer 18.0 +title: What's new in Keyman Developer 19.0 --- -Keyman Developer 17 has a number of significant changes: - -* `kmcomp` has been removed and replaced with `kmc`. Learn more in our [kmcomp migration guide](reference/kmc/cli/kmcomp-migration). - -* Windows installer packages should now be built with - `kmc build windows-package-installer` and can no longer be built within - the Keyman Developer IDE. More details on how to use this are in the - [`kmc` reference documentation](reference/kmc/cli/reference#toc-kmc-build-windows-package-installer-additional-options). - -* `.keyboard_info` files are now generated entirely from the package and - keyboard files. Extra fields are available in packages for license file, - welcome file, typing examples, related packages (including deprecated - packages), and additional font files. Keyboards in the Keyman Cloud - keyboard repository have already been updated; if you are an author of - one of these keyboards, you should pull the changes from the repository - before submitting future updates. - -* Keyboard project files (.kpj) now have a new format which does not list - individual files, but instead includes all files in the same folder and - subfolders relative to the project file. This prevents projects from - including unrelated files, and reduces the number of files that change - when keyboards are updated. - -* Keyman Developer will now open each project in a new window, allowing - the user to rapidly switch between multiple projects at the same time. - -* The Keyman Keyboard and Lexical Model Cloud repositories have new build - scripts which run `kmc`. These run much, much faster than previously! - -* The [`&displayMap`](/developer/language/reference/displaymap) store allows - keyboard developers to specify a font mapping to PUA for the On Screen - Keyboard and Touch Layout to resolve diacritic rendering issues. - -* Keyman Developer has been updated to support Unicode 15.1. - -* Additional non-printing characters have been added to the Touch Layout Editor. - -* Virtual keys in output of rules have never worked properly or been officially - supported; Keyman Developer will now warn if you attempt to use this pattern. +Keyman Developer 19 has the following significant changes: diff --git a/developer/src/kmc/src/kmlmp.ts b/developer/src/kmc/src/kmlmp.ts index bb0cda5e53..a1346ac0d3 100644 --- a/developer/src/kmc/src/kmlmp.ts +++ b/developer/src/kmc/src/kmlmp.ts @@ -3,7 +3,7 @@ * kmlmp - Keyman Lexical Model Package Compiler */ -// Note: this is a deprecated package and will be removed in Keyman 18.0 +// Note: this is a deprecated package and will be removed in Keyman 19.0 import { Command } from 'commander'; import { KmpCompiler } from '@keymanapp/kmc-package'; diff --git a/docs/minimum-versions.md b/docs/minimum-versions.md index 174f4b518e..beb542e408 100644 --- a/docs/minimum-versions.md +++ b/docs/minimum-versions.md @@ -4,7 +4,7 @@ title: Keyman Minimum Versions Changes in [minimum-versions.inc.sh](minimum-versions.inc.sh) should manually be propagated to the linked help files below: -## Keyman 18.0 +## Keyman 19.0 Target Operating System and Platform Versions diff --git a/docs/minimum-versions.md.in b/docs/minimum-versions.md.in index ffe508e12f..41a664d454 100644 --- a/docs/minimum-versions.md.in +++ b/docs/minimum-versions.md.in @@ -4,7 +4,7 @@ title: Keyman Minimum Versions Changes in [minimum-versions.inc.sh](minimum-versions.inc.sh) should manually be propagated to the linked help files below: -## Keyman 18.0 +## Keyman 19.0 Target Operating System and Platform Versions diff --git a/ios/docs/engine/index.md b/ios/docs/engine/index.md index b87af4e260..bdba88b741 100644 --- a/ios/docs/engine/index.md +++ b/ios/docs/engine/index.md @@ -4,7 +4,7 @@ title: Keyman for iPhone and iPad Developer Support ## Overview -The Keyman Engine for iPhone and iPad 18.0 SDK is designed to provide +The Keyman Engine for iPhone and iPad 19.0 SDK is designed to provide advanced international keyboard support to iOS apps. As a developer, you simply need to use (or subclass) TextView or diff --git a/ios/docs/help/about/whatsnew.md b/ios/docs/help/about/whatsnew.md index aa4cf6b333..b123b1f23c 100644 --- a/ios/docs/help/about/whatsnew.md +++ b/ios/docs/help/about/whatsnew.md @@ -1,8 +1,5 @@ --- -title: What's New in Keyman 18.0 for iPhone and iPad +title: What's New in Keyman 19.0 for iPhone and iPad --- -Here are some of the new features we have added to Keyman for iPhone and iPad 18.0: -Additional changes: - -* Performance improvements +Here are some of the new features we have added to Keyman for iPhone and iPad 19.0: diff --git a/ios/docs/help/index.md b/ios/docs/help/index.md index 994bbbda9e..cd0f81300e 100644 --- a/ios/docs/help/index.md +++ b/ios/docs/help/index.md @@ -1,5 +1,5 @@ --- -title: Keyman for iPhone and iPad 18.0 Help +title: Keyman for iPhone and iPad 19.0 Help --- ## [About Keyman](about/) diff --git a/linux/docs/help/about/whatsnew.md b/linux/docs/help/about/whatsnew.md index 4a4d5a30e1..5521261b96 100644 --- a/linux/docs/help/about/whatsnew.md +++ b/linux/docs/help/about/whatsnew.md @@ -1,5 +1,5 @@ --- -title: What's New in Keyman 18.0 for Linux +title: What's New in Keyman 19.0 for Linux --- -Here are some of the new features we have added to Keyman for Linux 18.0: +Here are some of the new features we have added to Keyman for Linux 19.0: diff --git a/linux/docs/help/index.md b/linux/docs/help/index.md index 58d245063a..329c66f69b 100644 --- a/linux/docs/help/index.md +++ b/linux/docs/help/index.md @@ -1,5 +1,5 @@ --- -title: Keyman for Linux 18.0 Help +title: Keyman for Linux 19.0 Help --- Need help using Keyman for Linux? In time, this product documentation will grow and explain frequently asked questions. diff --git a/mac/docs/help/about/whatsnew.md b/mac/docs/help/about/whatsnew.md index 73ccb4d49b..8cc29bdadb 100644 --- a/mac/docs/help/about/whatsnew.md +++ b/mac/docs/help/about/whatsnew.md @@ -1,5 +1,5 @@ --- -title: What's New in Keyman 18.0 for macOS +title: What's New in Keyman 19.0 for macOS --- -Here are some of the new features we have added to Keyman 18.0 for macOS: +Here are some of the new features we have added to Keyman 19.0 for macOS: diff --git a/mac/docs/help/index.md b/mac/docs/help/index.md index aa507a531e..12397a903d 100644 --- a/mac/docs/help/index.md +++ b/mac/docs/help/index.md @@ -1,5 +1,5 @@ --- -title: Keyman 18.0 for macOS Help +title: Keyman 19.0 for macOS Help --- Need help using Keyman for macOS? You'll find everything you need here, including product documentation, diff --git a/resources/build/minimum-versions.inc.sh b/resources/build/minimum-versions.inc.sh index 41a7c3690f..f57ebff419 100644 --- a/resources/build/minimum-versions.inc.sh +++ b/resources/build/minimum-versions.inc.sh @@ -1,4 +1,4 @@ -# Required minimum versions as of Keyman 18.0 +# Required minimum versions as of Keyman 19.0 # # This is a list of minimum, maximum, and specific versions of any external # components or dependencies found in Keyman. diff --git a/web/docs/engine/guide/index.md b/web/docs/engine/guide/index.md index 26e2e42b47..4f59a4ebf0 100644 --- a/web/docs/engine/guide/index.md +++ b/web/docs/engine/guide/index.md @@ -1,8 +1,8 @@ --- -title: KeymanWeb 18.0 - The Guide +title: KeymanWeb - The Guide --- -Welcome to the guide for using KeymanWeb 18.0. +Welcome to the guide for using KeymanWeb. - [Getting Started with Keyman Web](get-started) - [User Interface Design](user-interface-design) @@ -10,4 +10,4 @@ Welcome to the guide for using KeymanWeb 18.0. - [Installing Keyboards](adding-keyboards) - [Additional Examples](examples/) -[Return to the main KeymanWeb 18.0 page](../) \ No newline at end of file +[Return to the main KeymanWeb page](../) \ No newline at end of file diff --git a/web/docs/engine/index.md b/web/docs/engine/index.md index 63d14e2fd1..5515112f88 100644 --- a/web/docs/engine/index.md +++ b/web/docs/engine/index.md @@ -1,27 +1,27 @@ --- -title: Keyman Engine for Web 18.0 Developer Help +title: Keyman Engine for Web 19.0 Developer Help --- -Keyman Engine for Web 18.0 is the current version of KeymanWeb and +Keyman Engine for Web 19.0 is the current version of KeymanWeb and supports touch devices with custom touch-layouts as well as desktop computer browsers. [Download](https://keyman.com/developer/keymanweb/) -: Downloading Keyman Engine for Web 18.0 +: Downloading Keyman Engine for Web [Guide](guide/) -: Keyman Engine for Web 18.0 Guide +: Keyman Engine for Web Guide [Reference](reference) -: Keyman Engine for Web 18.0 Developer Reference +: Keyman Engine for Web Developer Reference [What's New](whats-new) -: What's new in Keyman Engine for Web 18.0 +: What's new in Keyman Engine for Web 19.0 diff --git a/web/docs/engine/reference/core/version.md b/web/docs/engine/reference/core/version.md index 7df0978ac8..40b9db4529 100644 --- a/web/docs/engine/reference/core/version.md +++ b/web/docs/engine/reference/core/version.md @@ -22,7 +22,7 @@ Read only ### Return Value -`'18.0'` (for KeymanWeb 18.0) +`'19.0'` (for KeymanWeb 19.0) ## Description diff --git a/web/docs/engine/reference/index.md b/web/docs/engine/reference/index.md index 74d83c3931..f6e5a3a8de 100644 --- a/web/docs/engine/reference/index.md +++ b/web/docs/engine/reference/index.md @@ -1,5 +1,5 @@ --- -title: KeymanWeb 18.0 Reference +title: KeymanWeb Reference --- [KeymanWeb Overview](overview) diff --git a/web/docs/engine/whats-new.md b/web/docs/engine/whats-new.md index 49fa337fe0..e220fb9c13 100644 --- a/web/docs/engine/whats-new.md +++ b/web/docs/engine/whats-new.md @@ -1,3 +1,3 @@ --- -title: What's New in KeymanWeb 18.0 +title: What's New in KeymanWeb 19.0 --- diff --git a/windows/docs/engine/api/index.md b/windows/docs/engine/api/index.md index 7032aa0cd2..f95332c45a 100644 --- a/windows/docs/engine/api/index.md +++ b/windows/docs/engine/api/index.md @@ -1,13 +1,13 @@ --- -title: Keyman Engine for Windows 18.0 API +title: Keyman Engine for Windows API --- ## Introduction -The Keyman Engine for Windows 18.0 API is implemented in COM. It can be +The Keyman Engine for Windows API is implemented in COM. It can be instantiated with `CreateObject("keymanapi.Keyman")`. -> [!Note] +> [!Note] > This documentation applies to Keyman Engine for Windows versions 14.0 and up. ## Interface Hierarchy diff --git a/windows/docs/engine/index.md b/windows/docs/engine/index.md index acdd77d877..0687433412 100644 --- a/windows/docs/engine/index.md +++ b/windows/docs/engine/index.md @@ -1,8 +1,8 @@ --- -title: Keyman Engine for Windows 18.0 +title: Keyman Engine for Windows --- -Keyman Engine for Windows 18.0 gives you the tools to build a customised +Keyman Engine for Windows gives you the tools to build a customised desktop keyboarding product for Windows. **Note:** This documentation applies to Keyman Engine for Windows diff --git a/windows/docs/help/about/whatsnew.md b/windows/docs/help/about/whatsnew.md index 4f11c82ec2..ee917f3870 100644 --- a/windows/docs/help/about/whatsnew.md +++ b/windows/docs/help/about/whatsnew.md @@ -1,8 +1,8 @@ --- -title: What's New in Keyman 18.0 for Windows +title: What's New in Keyman 19.0 for Windows --- -Here are some of the new features we have added to Keyman 18.0 for Windows: +Here are some of the new features we have added to Keyman 19.0 for Windows: ## Related Topics diff --git a/windows/docs/help/index.md b/windows/docs/help/index.md index c7cccc7695..231ed5fc7d 100644 --- a/windows/docs/help/index.md +++ b/windows/docs/help/index.md @@ -1,5 +1,5 @@ --- -title: Keyman for Windows 18.0 Help +title: Keyman for Windows 19.0 Help --- Need help using Keyman for Windows? You'll find everything you need here, including product documentation, From 7ab4c67383dac487e23818b9aebd6ad753ec354b Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Tue, 11 Feb 2025 02:52:18 -0500 Subject: [PATCH 102/109] auto: increment master version to 19.0.2 --- HISTORY.md | 5 +++++ VERSION.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index ca5fe2101f..e907cc12dd 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,10 @@ # Keyman Version History +## 19.0.1 alpha 2025-02-11 + +* refactor(windows): rename `TKeymanMutex.MutexOwned` to `TakeOwnership` and add `ReleaseOwnership` (#13168) +* chore: increment to alpha 19.0 (#13187) + ## 18.0.188 alpha 2025-02-10 * fix(windows): check the params status flag equals ucrsUpdateReady before attempting to download the keyman setup file (#13154) diff --git a/VERSION.md b/VERSION.md index b2c7e01f85..fc1a009252 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.1 \ No newline at end of file +19.0.2 \ No newline at end of file From f2747be553bfc587226f847fb4ad193e839315e7 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 11 Feb 2025 19:24:22 +0100 Subject: [PATCH 103/109] chore(linux): remove support of Ubuntu 20.04 Focal Ubuntu 20.04 Focal will reach EOL in April and GitHub removes the runner images, so we no longer will be able to build packages for Focal. --- .github/workflows/deb-packaging.yml | 2 +- linux/scripts/launchpad.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deb-packaging.yml b/.github/workflows/deb-packaging.yml index 52c485aa65..bf1bfca2fa 100644 --- a/.github/workflows/deb-packaging.yml +++ b/.github/workflows/deb-packaging.yml @@ -116,7 +116,7 @@ jobs: strategy: fail-fast: true matrix: - dist: [focal, jammy, noble, oracular] + dist: [jammy, noble, oracular] steps: - name: Checkout diff --git a/linux/scripts/launchpad.sh b/linux/scripts/launchpad.sh index 98ab9238f0..4b89980994 100755 --- a/linux/scripts/launchpad.sh +++ b/linux/scripts/launchpad.sh @@ -33,7 +33,7 @@ else fi echo "ppa: ${ppa}" -distributions="${DIST:-focal jammy noble oracular plucky}" +distributions="${DIST:-jammy noble oracular plucky}" packageversion="${PACKAGEVERSION:-1~sil1}" BASEDIR=$(pwd) From 02a3a1a66c121c1e42535ca943ec5a8b6c6d7f17 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Tue, 11 Feb 2025 19:32:29 +0100 Subject: [PATCH 104/109] chore(linux): cleanup code Now that we no longer support Focal we can use more modern tools for packaging. --- docs/linux/README.md | 2 +- linux/debian/rules | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/linux/README.md b/docs/linux/README.md index 80c1a78434..64ef6c967f 100644 --- a/docs/linux/README.md +++ b/docs/linux/README.md @@ -147,7 +147,7 @@ Run `ibus restart` after installing any of them. Keyman tries to activate the keyboard automatically. If you want to activate it for a different language, you can do so by following the steps below. -#### GNOME3 (focal and bionic default, also newer Ubuntu versions) +#### GNOME3 (Ubuntu default) - Click the connection/sound/shutdown section in the top right. Then the tools icon for Settings. diff --git a/linux/debian/rules b/linux/debian/rules index 8da37f40e4..5138b58330 100755 --- a/linux/debian/rules +++ b/linux/debian/rules @@ -66,10 +66,7 @@ override_dh_auto_install: rm $(CURDIR)/debian/keyman/usr/share/locale/*.po* # Don't call `build.sh install` - dh_auto_install does some extra smarts dh_auto_install --sourcedir=linux/keyman-config --buildsystem=pybuild $@ - # Unfortunately bash-completion 2.10 (focal) doesn't yet provide dh-sequence-bash-completion, - # which we could add as build-dependency, so we'll have to explicitly call - # dh_bash_completion here instead of using `dh $@ --with-python3 --with bash-completion` - dh_bash-completion -O--buildsystem=pybuild + dh $@ --with-python3 --with bash-completion dh_python3 -O--buildsystem=pybuild override_dh_missing: From ef824dcfa6dbbe13c18d6fcd7bb4420708eca0a4 Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 12 Feb 2025 11:32:37 +0100 Subject: [PATCH 105/109] chore(linux): update minimum version --- docs/build/linux-ubuntu.md | 2 +- docs/minimum-versions.md | 2 +- linux/docs/help/common/index.md | 4 ++-- resources/build/minimum-versions.inc.sh | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/build/linux-ubuntu.md b/docs/build/linux-ubuntu.md index 0f531acb59..9c0b195474 100644 --- a/docs/build/linux-ubuntu.md +++ b/docs/build/linux-ubuntu.md @@ -23,7 +23,7 @@ The following projects **cannot** be built on Linux: ### System Requirements -- Minimum Ubuntu version: Ubuntu 20.04 +- Minimum Ubuntu version: Ubuntu 22.04 Other Linux distributions will also work if appropriate dependencies are installed. diff --git a/docs/minimum-versions.md b/docs/minimum-versions.md index beb542e408..4f67d5a626 100644 --- a/docs/minimum-versions.md +++ b/docs/minimum-versions.md @@ -53,7 +53,7 @@ https://help.keyman.com/developer/engine/android/latest-version/ | KEYMAN_MIN_TARGET_VERSION_ANDROID_CHROME | 53.0 | | KEYMAN_MIN_TARGET_VERSION_IOS | 12.2 | | KEYMAN_MIN_TARGET_VERSION_MAC | 10.13 | -| KEYMAN_MIN_TARGET_VERSION_UBUNTU | 20.04 | +| KEYMAN_MIN_TARGET_VERSION_UBUNTU | 22.04 | | KEYMAN_MIN_TARGET_VERSION_WEB_CHROME | 95.0 | | KEYMAN_MIN_TARGET_VERSION_WEB_FIREFOX | 79.0 | | KEYMAN_MIN_TARGET_VERSION_WEB_OPERA | 47.0 | diff --git a/linux/docs/help/common/index.md b/linux/docs/help/common/index.md index b2d606b38d..a7f9e786bf 100644 --- a/linux/docs/help/common/index.md +++ b/linux/docs/help/common/index.md @@ -59,8 +59,8 @@ no on-screen keyboard for Wayland that works with Keyman. **A.** Keyman runs on Debian, Ubuntu, Wasta Linux and can be compiled to run from source in most distributions. -**Note:** Ubuntu versions before Ubuntu 20.04 LTS are no longer supported with -Keyman 17. If you are still running an older version and require Keyman you'll +**Note:** Ubuntu versions before Ubuntu 22.04 LTS are no longer supported with +Keyman 18. If you are still running an older version and require Keyman you'll have to install an older Keyman version. ## Q. Will my existing Windows Keyman keyboard work with Keyman for Linux? diff --git a/resources/build/minimum-versions.inc.sh b/resources/build/minimum-versions.inc.sh index f57ebff419..2e1a2914b1 100644 --- a/resources/build/minimum-versions.inc.sh +++ b/resources/build/minimum-versions.inc.sh @@ -14,7 +14,7 @@ KEYMAN_MIN_TARGET_VERSION_ANDROID=5.0 # Lollipop KEYMAN_MIN_TARGET_VERSION_IOS=12.2 # iOS 12.2 KEYMAN_MIN_TARGET_VERSION_WINDOWS=10 # Windows 10 KEYMAN_MIN_TARGET_VERSION_MAC=10.13 # MacOS 10.13 (High Sierra) -KEYMAN_MIN_TARGET_VERSION_UBUNTU=20.04 # Ubuntu 20.04 Focal +KEYMAN_MIN_TARGET_VERSION_UBUNTU=22.04 # Ubuntu 22.04 Jammy KEYMAN_MIN_TARGET_VERSION_ANDROID_CHROME=53.0 # min version of Chrome for Keyman for Android # Target web browsers for KeymanWeb -- we do not have polyfills for From 53bb152bef5497e7029b303a1141963a4533e17a Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 12 Feb 2025 11:47:21 +0100 Subject: [PATCH 106/109] docs(linux): update `welcome.md` --- linux/docs/help/about/welcome.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/linux/docs/help/about/welcome.md b/linux/docs/help/about/welcome.md index eacc8c449c..dfd410b46e 100644 --- a/linux/docs/help/about/welcome.md +++ b/linux/docs/help/about/welcome.md @@ -6,6 +6,6 @@ Thank you for installing Keyman for Linux. Whether you're a new or returning use ## What is Keyman for Linux? -Keyman for Linux makes it possible to type in over 1,000 languages in any Linux application. +Keyman for Linux makes it possible to type in over 2,000 languages in any Linux application. [Click here](../start/) to get started. From f1b32a1439c4943b757c75d2d456cde3523e898a Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 12 Feb 2025 11:58:45 +0100 Subject: [PATCH 107/109] chore(linux): additional code cleanup after Focal removal --- linux/debian/control | 4 +-- linux/ibus-keyman/src/keymanutil.c | 5 ++-- linux/ibus-keyman/src/test/keymanutil.tests.c | 30 +++++-------------- .../keyman_config/downloadkeyboard.py | 7 +---- .../keyman_config/install_window.py | 7 +---- .../keyman_config/keyboard_options_view.py | 7 +---- linux/keyman-config/keyman_config/welcome.py | 6 +--- 7 files changed, 15 insertions(+), 51 deletions(-) diff --git a/linux/debian/control b/linux/debian/control index fbe7066f5c..e12da18aa3 100644 --- a/linux/debian/control +++ b/linux/debian/control @@ -10,7 +10,7 @@ Build-Depends: debhelper-compat (= 12), dh-python, gawk, - gir1.2-webkit2-4.1 | gir1.2-webkit2-4.0, + gir1.2-webkit2-4.1, ibus, libevdev-dev, libgtk-3-dev, @@ -88,7 +88,7 @@ Architecture: all Depends: dbus-x11, dconf-cli, - gir1.2-webkit2-4.1 | gir1.2-webkit2-4.0, + gir1.2-webkit2-4.1, keyman-engine, python3-bs4, python3-fonttools, diff --git a/linux/ibus-keyman/src/keymanutil.c b/linux/ibus-keyman/src/keymanutil.c index 9f48f0ffce..4bb0ac4078 100644 --- a/linux/ibus-keyman/src/keymanutil.c +++ b/linux/ibus-keyman/src/keymanutil.c @@ -649,9 +649,8 @@ _ptr_array_new_from_array( } // `g_ptr_array_new_from_null_terminated_array` is only available in GLib 2.76, but we're still -// stuck to 2.64 (Ubuntu 20.04 Focal) and 2.72 (Ubuntu 22.04 Jammy). Therefore we -// copy the implementation here (slightly simplified). Once we're past 2.76 we can use the GLib method -// directly. +// stuck to 2.72 (Ubuntu 22.04 Jammy). Therefore we copy the implementation here (slightly +// simplified). Once we're past 2.76 we can use the GLib method directly. GPtrArray * _g_ptr_array_new_from_null_terminated_array( gpointer *data, diff --git a/linux/ibus-keyman/src/test/keymanutil.tests.c b/linux/ibus-keyman/src/test/keymanutil.tests.c index 13636857d8..56965a41ad 100644 --- a/linux/ibus-keyman/src/test/keymanutil.tests.c +++ b/linux/ibus-keyman/src/test/keymanutil.tests.c @@ -123,22 +123,6 @@ _free_tst_kb_data(add_keyboard_data* kb_data) { G_DEFINE_AUTOPTR_CLEANUP_FUNC(add_keyboard_data, _free_tst_kb_data) -// Newer glib versions have g_assert_cmpstrv which would allow to do -// g_assert_cmpstrv(result, keyboards); -// but unfortunately Ubuntu 20.04 Focal doesn't have that, so we roll -// our own -void -_kmn_assert_cmpstrv(gchar** result, gchar** expected) { - g_assert_nonnull(result); - g_assert_nonnull(expected); - int i = 0; - for (; result[i] && expected[i]; i++) { - g_assert_cmpstr(result[i], ==, expected[i]); - } - g_assert_null(result[i]); - g_assert_null(expected[i]); -} - //---------------------------------------------------------------------------------------------- void test_keyman_put_keyboard_options_todconf__invalid() { @@ -526,7 +510,7 @@ test_keyman_set_custom_keyboards__new_key() { // Verify g_auto(GStrv) result = _get_tst_kbds_key(); g_assert_nonnull(result); - _kmn_assert_cmpstrv(result, keyboards); + g_assert_cmpstrv(result, keyboards); // Cleanup _delete_tst_kbds_key(); @@ -546,7 +530,7 @@ test_keyman_set_custom_keyboards__overwrite_key() { // Verify g_auto(GStrv) result = _get_tst_kbds_key(); g_assert_nonnull(result); - _kmn_assert_cmpstrv(result, keyboards); + g_assert_cmpstrv(result, keyboards); // Cleanup _delete_tst_kbds_key(); @@ -565,7 +549,7 @@ test_keyman_set_custom_keyboards__delete_key_NULL() { g_auto(GStrv) result = _get_tst_kbds_key(); gchar* expected[] = {NULL}; g_assert_nonnull(result); - _kmn_assert_cmpstrv(result, expected); + g_assert_cmpstrv(result, expected); // Cleanup _delete_tst_kbds_key(); @@ -585,7 +569,7 @@ test_keyman_set_custom_keyboards__delete_key_empty_array() { // Verify g_auto(GStrv) result = _get_tst_kbds_key(); g_assert_nonnull(result); - _kmn_assert_cmpstrv(result, keyboards); + g_assert_cmpstrv(result, keyboards); // Cleanup _delete_tst_kbds_key(); @@ -604,7 +588,7 @@ test_keyman_set_custom_keyboards__invalid_values() { g_auto(GStrv) result = _get_tst_kbds_key(); g_assert_nonnull(result); gchar* expected[] = {"fr:/tmp/test/test.kmx", NULL}; - _kmn_assert_cmpstrv(result, expected); + g_assert_cmpstrv(result, expected); // Cleanup _delete_tst_kbds_key(); @@ -622,7 +606,7 @@ test_keyman_get_custom_keyboards__value() { // Verify g_assert_nonnull(result); - _kmn_assert_cmpstrv(result, keyboards); + g_assert_cmpstrv(result, keyboards); // Cleanup _delete_tst_kbds_key(); @@ -640,7 +624,7 @@ test_keyman_get_custom_keyboards__invalid_values() { // Verify gchar* expected[] = {"fr:/tmp/test/test.kmx", NULL}; g_assert_nonnull(result); - _kmn_assert_cmpstrv(result, expected); + g_assert_cmpstrv(result, expected); // Cleanup _delete_tst_kbds_key(); diff --git a/linux/keyman-config/keyman_config/downloadkeyboard.py b/linux/keyman-config/keyman_config/downloadkeyboard.py index 42ff74308d..ca3b091f92 100755 --- a/linux/keyman-config/keyman_config/downloadkeyboard.py +++ b/linux/keyman-config/keyman_config/downloadkeyboard.py @@ -7,12 +7,7 @@ import urllib.parse import gi gi.require_version('Gtk', '3.0') -try: - gi.require_version('WebKit2', '4.1') -except ValueError: - # TODO: Remove once we drop support for Ubuntu 20.04 Focal - gi.require_version('WebKit2', '4.0') - +gi.require_version('WebKit2', '4.1') from gi.repository import Gtk, WebKit2 from keyman_config import KeymanComUrl, _, __releaseversion__, __tier__ diff --git a/linux/keyman-config/keyman_config/install_window.py b/linux/keyman-config/keyman_config/install_window.py index dda242c7e1..1342dd44f6 100755 --- a/linux/keyman-config/keyman_config/install_window.py +++ b/linux/keyman-config/keyman_config/install_window.py @@ -15,12 +15,7 @@ import packaging.version import gi gi.require_version('Gtk', '3.0') -try: - gi.require_version('WebKit2', '4.1') -except ValueError: - # TODO: Remove once we drop support for Ubuntu 20.04 Focal - gi.require_version('WebKit2', '4.0') - +gi.require_version('WebKit2', '4.1') from gi.repository import Gtk, WebKit2 from keyman_config import _, secure_lookup diff --git a/linux/keyman-config/keyman_config/keyboard_options_view.py b/linux/keyman-config/keyman_config/keyboard_options_view.py index 795386d7bf..38499a558a 100644 --- a/linux/keyman-config/keyman_config/keyboard_options_view.py +++ b/linux/keyman-config/keyman_config/keyboard_options_view.py @@ -8,12 +8,7 @@ from urllib.parse import parse_qsl, urlencode import gi gi.require_version('Gtk', '3.0') -try: - gi.require_version('WebKit2', '4.1') -except ValueError: - # TODO: Remove once we drop support for Ubuntu 20.04 Focal - gi.require_version('WebKit2', '4.0') - +gi.require_version('WebKit2', '4.1') from gi.repository import Gtk, WebKit2 from keyman_config import _ diff --git a/linux/keyman-config/keyman_config/welcome.py b/linux/keyman-config/keyman_config/welcome.py index af001ea464..a14d747c6a 100644 --- a/linux/keyman-config/keyman_config/welcome.py +++ b/linux/keyman-config/keyman_config/welcome.py @@ -7,11 +7,7 @@ import webbrowser import gi gi.require_version('Gtk', '3.0') -try: - gi.require_version('WebKit2', '4.1') -except ValueError: - # TODO: Remove once we drop support for Ubuntu 20.04 Focal - gi.require_version('WebKit2', '4.0') +gi.require_version('WebKit2', '4.1') from gi.repository import Gtk, WebKit2 from keyman_config import _ From 67d26a9d3f9074c11cb4a6b5a504d346c89b9e79 Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Wed, 12 Feb 2025 13:01:06 -0500 Subject: [PATCH 108/109] auto: increment master version to 19.0.3 --- HISTORY.md | 4 ++++ VERSION.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index e907cc12dd..544a275dea 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,9 @@ # Keyman Version History +## 19.0.2 alpha 2025-02-12 + +* chore(linux): remove support of Ubuntu 20.04 Focal (#13203) + ## 19.0.1 alpha 2025-02-11 * refactor(windows): rename `TKeymanMutex.MutexOwned` to `TakeOwnership` and add `ReleaseOwnership` (#13168) diff --git a/VERSION.md b/VERSION.md index fc1a009252..dd7d796646 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.2 \ No newline at end of file +19.0.3 \ No newline at end of file From 91ed7e040bc91d68d894b3877ec4dd09b6b58033 Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Thu, 13 Feb 2025 01:22:50 -0800 Subject: [PATCH 109/109] docs: update keyboard processor build source Signed-off-by: Emmanuel Ferdman --- docs/build/linux-ubuntu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/linux-ubuntu.md b/docs/build/linux-ubuntu.md index 0f531acb59..20770733f4 100644 --- a/docs/build/linux-ubuntu.md +++ b/docs/build/linux-ubuntu.md @@ -113,7 +113,7 @@ All dependencies are already installed if you followed the instructions under Keyman Core can be built with the `core/build.sh` script. -- [Building Keyman Core](../../core/doc/BUILDING.md) +- [Building Keyman Core](../../core/docs/BUILDING.md) ## Keyman for Linux