From 9137eca2e7809690bb4e86e9e1bd44dc00dd734f Mon Sep 17 00:00:00 2001 From: jahorton Date: Mon, 22 Jul 2019 11:53:25 +0700 Subject: [PATCH] Null-context suggestion whitespace preservation --- common/predictive-text/worker/model-compositor.ts | 15 +++++++++++++++ common/predictive-text/worker/models/common.ts | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/common/predictive-text/worker/model-compositor.ts b/common/predictive-text/worker/model-compositor.ts index dbf6204c75..ab6faeb634 100644 --- a/common/predictive-text/worker/model-compositor.ts +++ b/common/predictive-text/worker/model-compositor.ts @@ -58,8 +58,17 @@ class ModelCompositor { } else if(this.isBackspace(transform) && !allowBksp) { continue; } + + let preserveWhitespace: boolean = false; + if(this.isWhitespace(transform)) { + // Detect start of new word; prevent whitespace loss here. + let postContext = models.applyTransform(transform, context); + preserveWhitespace = (this.lexicalModel.wordbreak(postContext) == ''); + } + let distribution = this.lexicalModel.predict(transform, context); + let mc = this; distribution.forEach(function(pair: ProbabilityMass) { // Let's not rely on the model to copy transform IDs. // Only bother is there IS an ID to copy. @@ -67,6 +76,12 @@ class ModelCompositor { pair.sample.transformId = transform.id; } + // Prepends the original whitespace, ensuring it is preserved if + // the suggestion is accepted. + if(preserveWhitespace) { + models.prependTransform(pair.sample.transform, transform); + } + // Combine duplicate samples. let displayText = pair.sample.displayAs; diff --git a/common/predictive-text/worker/models/common.ts b/common/predictive-text/worker/models/common.ts index 12c9a995ad..309c8a53e9 100644 --- a/common/predictive-text/worker/models/common.ts +++ b/common/predictive-text/worker/models/common.ts @@ -20,4 +20,12 @@ namespace models { endOfBuffer: context.endOfBuffer }; } + + export function prependTransform(transform: Transform, prefix: Transform) { + transform.insert = prefix.insert + transform.insert; + transform.deleteLeft += prefix.deleteLeft; + if(prefix.deleteRight) { + transform.deleteRight = (transform.deleteRight || 0) + prefix.deleteRight; + } + } } \ No newline at end of file