From ffa7ceb70e056d5914787c73c7906a140beeb0ff Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 29 Sep 2020 14:15:20 +0100 Subject: [PATCH 1/2] Trim range when formatting so that it excludes leading/trailing spaces Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../views/rooms/BasicMessageComposer.tsx | 9 +++++---- src/editor/range.ts | 9 +++++++++ test/editor/range-test.js | 15 +++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index 7c2eb83a94..d9b34b93ef 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -619,13 +619,14 @@ export default class BasicMessageEditor extends React.Component } private onFormatAction = (action: Formatting) => { - const range = getRangeForSelection( - this.editorRef.current, - this.props.model, - document.getSelection()); + const range = getRangeForSelection(this.editorRef.current, this.props.model, document.getSelection()); + // trim the range as we want it to exclude leading/trailing spaces + range.trim(); + if (range.length === 0) { return; } + this.historyManager.ensureLastChangesPushed(this.props.model); this.modifiedFlag = true; switch (action) { diff --git a/src/editor/range.ts b/src/editor/range.ts index 27f59f34a9..1d9c75e238 100644 --- a/src/editor/range.ts +++ b/src/editor/range.ts @@ -18,6 +18,10 @@ import EditorModel from "./model"; import DocumentPosition, {Predicate} from "./position"; import {Part} from "./parts"; +const whileSpacePredicate: Predicate = (index, offset, part) => { + return part.text[offset] === " "; +}; + export default class Range { private _start: DocumentPosition; private _end: DocumentPosition; @@ -35,6 +39,11 @@ export default class Range { }); } + trim() { + this._start = this._start.forwardsWhile(this.model, whileSpacePredicate); + this._end = this._end.backwardsWhile(this.model, whileSpacePredicate); + } + expandBackwardsWhile(predicate: Predicate) { this._start = this._start.backwardsWhile(this.model, predicate); } diff --git a/test/editor/range-test.js b/test/editor/range-test.js index b69ed9eb53..60055af824 100644 --- a/test/editor/range-test.js +++ b/test/editor/range-test.js @@ -88,4 +88,19 @@ describe('editor/range', function() { expect(model.parts[1].text).toBe("man"); expect(model.parts.length).toBe(2); }); + it('range trim spaces off both ends', () => { + const renderer = createRenderer(); + const pc = createPartCreator(); + const model = new EditorModel([ + pc.plain("abc abc abc"), + ], pc, renderer); + const range = model.startRange( + model.positionForOffset(3, false), // at end of first `abc` + model.positionForOffset(8, false), // at start of last `abc` + ); + + expect(range.parts[0].text).toBe(" abc "); + range.trim(); + expect(range.parts[0].text).toBe("abc"); + }); }); From af4c95e267809efefa268d031dd193f4f2282a3e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 29 Sep 2020 14:17:44 +0100 Subject: [PATCH 2/2] apply to whitespace in general Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/editor/range.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/editor/range.ts b/src/editor/range.ts index 1d9c75e238..838dfd8b98 100644 --- a/src/editor/range.ts +++ b/src/editor/range.ts @@ -18,8 +18,8 @@ import EditorModel from "./model"; import DocumentPosition, {Predicate} from "./position"; import {Part} from "./parts"; -const whileSpacePredicate: Predicate = (index, offset, part) => { - return part.text[offset] === " "; +const whitespacePredicate: Predicate = (index, offset, part) => { + return part.text[offset].trim() === ""; }; export default class Range { @@ -40,8 +40,8 @@ export default class Range { } trim() { - this._start = this._start.forwardsWhile(this.model, whileSpacePredicate); - this._end = this._end.backwardsWhile(this.model, whileSpacePredicate); + this._start = this._start.forwardsWhile(this.model, whitespacePredicate); + this._end = this._end.backwardsWhile(this.model, whitespacePredicate); } expandBackwardsWhile(predicate: Predicate) {