diff --git a/lib/markdown_formatter.dart b/lib/markdown_formatter.dart index 360d702..2c01df7 100644 --- a/lib/markdown_formatter.dart +++ b/lib/markdown_formatter.dart @@ -40,6 +40,19 @@ extension on TextEditingValue { ), ); } + + /// cuts [characterCount] number of chars from before the cursor + TextEditingValue trimBeforeCursor(int characterCount) { + final beg = text.substring(0, selection.baseOffset); + final end = text.substring(selection.baseOffset); + + return copyWith( + text: beg.substring(0, beg.length - characterCount - 1) + end, + selection: selection.copyWith( + baseOffset: selection.baseOffset - characterCount, + extentOffset: selection.extentOffset - characterCount, + )); + } } /// Provides convenience formatting in markdown text fields @@ -59,27 +72,43 @@ class MarkdownFormatter extends TextInputFormatter { TextEditingValue unorderedListContinuation( String listChar, TextEditingValue tev) { - final regex = RegExp(r'(\s*)' '${RegExp.escape(listChar)} '); + final regex = RegExp(r'(\s*)' '${RegExp.escape(listChar)} (.*)'); final match = regex.matchAsPrefix(lineBefore); + if (match == null) { return tev; } + + final listItemBody = match.group(2); final indent = match.group(1); + if (listItemBody == null || listItemBody.isEmpty) { + return tev.trimBeforeCursor(listChar.length + (indent?.length ?? 1)); + } + return tev.append('$indent$listChar '); } TextEditingValue orderedListContinuation( String afterNumberChar, TextEditingValue tev) { final regex = - RegExp(r'(\s*)(\d+)' '${RegExp.escape(afterNumberChar)} '); + RegExp(r'(\s*)(\d+)' '${RegExp.escape(afterNumberChar)} (.*)'); final match = regex.matchAsPrefix(lineBefore); + if (match == null) { return tev; } - final indent = match.group(1); - final number = int.tryParse(match.group(2)!) ?? 0 + 1; + final listItemBody = match.group(3)!; + final indent = match.group(1)!; + final numberStr = match.group(2)!; + + if (listItemBody.isEmpty) { + return tev.trimBeforeCursor( + indent.length + numberStr.length + afterNumberChar.length + 1); + } + + final number = (int.tryParse(match.group(2)!) ?? 0) + 1; return tev.append('$indent$number$afterNumberChar '); }