Null-context suggestion whitespace preservation

This commit is contained in:
jahorton 2019-07-22 11:53:25 +07:00
parent 989dc881fc
commit 9137eca2e7
2 changed files with 23 additions and 0 deletions

View file

@ -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<Suggestion>) {
// 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;

View file

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