From 9a726ba8db4472edf5e029285c1a9839d84ded30 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Mon, 1 Jun 2020 17:55:42 +0200 Subject: [PATCH] MarkdownEditor: Improve auto-bullet points This patch scares me quite a bit. It's taken forever, and even now we don't add a bullet point if we edit the middle of a list. --- lib/editors/markdown_editor.dart | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/editors/markdown_editor.dart b/lib/editors/markdown_editor.dart index ce96a2cf..7c34dab3 100644 --- a/lib/editors/markdown_editor.dart +++ b/lib/editors/markdown_editor.dart @@ -152,7 +152,11 @@ class MarkdownEditorState extends State implements EditorState { } void _noteTextChanged() { - _insertExtraCharactersOnEnter(); + try { + _insertExtraCharactersOnEnter(); + } catch (e) { + print(e); + } if (_noteModified && !widget.isNewNote) return; var newState = !(widget.isNewNote && _textController.text.trim().isEmpty); @@ -170,12 +174,19 @@ class MarkdownEditorState extends State implements EditorState { return; } _textLength = text.length; - if (!text.endsWith('\n')) { + + var selection = _textController.selection; + if (selection.baseOffset != selection.extentOffset) { return; } - var prevLineStart = text.lastIndexOf('\n', text.length - 2); + + var cursorPos = selection.baseOffset; + if (cursorPos != _textLength || text[cursorPos - 1] != '\n') { + return; + } + var prevLineStart = text.lastIndexOf('\n', cursorPos - 2); prevLineStart = prevLineStart == -1 ? 0 : prevLineStart + 1; - var prevLine = text.substring(prevLineStart, text.length - 2); + var prevLine = text.substring(prevLineStart, cursorPos - 1); var pattern = RegExp(r'^(\s*)([*\-])'); var match = pattern.firstMatch(prevLine); @@ -183,8 +194,9 @@ class MarkdownEditorState extends State implements EditorState { return; } - var indentation = match.group(1) ?? ""; - _textController.text = text + indentation + match.group(2) + ' '; + var indent = match.group(1) ?? ""; + _textController.text = + text.substring(0, cursorPos) + indent + match.group(2) + ' '; _textLength = _textController.text.length; _textController.selection = TextSelection.collapsed(offset: _textLength); }