diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-12-16 22:18:26 +0300 |
---|---|---|
committer | Niedermann IT-Dienstleistungen <stefan-niedermann@users.noreply.github.com> | 2020-12-17 18:14:29 +0300 |
commit | 6d4838a22cb542f89de9593e0c984d4c5c9dbe1b (patch) | |
tree | 9679678bd31ec42b33ae56ad98e2921f8274b295 | |
parent | 85052118971741c5fb144ed4a43773f7578586f9 (diff) |
Cover more test cases for Markdown formatting
Signed-off-by: Stefan Niedermann <info@niedermann.it>
2 files changed, 32 insertions, 25 deletions
diff --git a/markdown/src/androidTest/java/it/niedermann/android/markdown/MarkwonMarkdownUtilTest.java b/markdown/src/androidTest/java/it/niedermann/android/markdown/MarkwonMarkdownUtilTest.java index b7557c116..8489bba98 100644 --- a/markdown/src/androidTest/java/it/niedermann/android/markdown/MarkwonMarkdownUtilTest.java +++ b/markdown/src/androidTest/java/it/niedermann/android/markdown/MarkwonMarkdownUtilTest.java @@ -129,9 +129,9 @@ public class MarkwonMarkdownUtilTest extends TestCase { assertEquals("Lorem **ipsum** dolor sit amet.", builder.toString()); // Remove bold -// builder = new StringBuilder("Lorem **ipsum** dolor sit amet."); -// assertEquals(11, MarkwonMarkdownUtil.togglePunctuation(builder, 7, 12, "**")); -// assertEquals("Lorem ipsum dolor sit amet.", builder.toString()); + builder = new StringBuilder("Lorem **ipsum** dolor sit amet."); + assertEquals(11, MarkwonMarkdownUtil.togglePunctuation(builder, 8, 13, "**")); + assertEquals("Lorem ipsum dolor sit amet.", builder.toString()); // Add strike builder = new StringBuilder("Lorem ipsum dolor sit amet."); @@ -139,9 +139,9 @@ public class MarkwonMarkdownUtilTest extends TestCase { assertEquals("Lorem ~~ipsum~~ dolor sit amet.", builder.toString()); // Remove strike -// builder = new StringBuilder("Lorem ~~ipsum~~ dolor sit amet."); -// assertEquals(11, MarkwonMarkdownUtil.togglePunctuation(builder, 7, 12, "~~")); -// assertEquals("Lorem ipsum dolor sit amet.", builder.toString()); + builder = new StringBuilder("Lorem ~~ipsum~~ dolor sit amet."); + assertEquals(11, MarkwonMarkdownUtil.togglePunctuation(builder, 8, 13, "~~")); + assertEquals("Lorem ipsum dolor sit amet.", builder.toString()); // Add italic at first position builder = new StringBuilder("Lorem ipsum dolor sit amet."); @@ -149,9 +149,9 @@ public class MarkwonMarkdownUtilTest extends TestCase { assertEquals("*Lorem* ipsum dolor sit amet.", builder.toString()); // Remove italic from first position -// builder = new StringBuilder("*Lorem* ipsum dolor sit amet."); -// assertEquals(5, MarkwonMarkdownUtil.togglePunctuation(builder, 1, 6, "*")); -// assertEquals("Lorem ipsum dolor sit amet.", builder.toString()); + builder = new StringBuilder("*Lorem* ipsum dolor sit amet."); + assertEquals(5, MarkwonMarkdownUtil.togglePunctuation(builder, 1, 6, "*")); + assertEquals("Lorem ipsum dolor sit amet.", builder.toString()); // Add italic at last position builder = new StringBuilder("Lorem ipsum dolor sit amet."); @@ -159,21 +159,21 @@ public class MarkwonMarkdownUtilTest extends TestCase { assertEquals("Lorem ipsum dolor sit *amet.*", builder.toString()); // Remove italic from last position -// builder = new StringBuilder("Lorem ipsum dolor sit *amet.*"); -// assertEquals(27, MarkwonMarkdownUtil.togglePunctuation(builder, 23, 28, "*")); -// assertEquals("Lorem ipsum dolor sit amet.", builder.toString()); + builder = new StringBuilder("Lorem ipsum dolor sit *amet.*"); + assertEquals(27, MarkwonMarkdownUtil.togglePunctuation(builder, 23, 28, "*")); + assertEquals("Lorem ipsum dolor sit amet.", builder.toString()); // Special use-case: toggle from italic to bold and back // Toggle italic on bold text // builder = new StringBuilder("Lorem **ipsum** dolor sit amet."); -// assertEquals(13, MarkwonMarkdownUtil.togglePunctuation(builder, 8, 13, "*")); -// assertEquals("Lorem *ipsum* dolor sit amet.", builder.toString()); +// assertEquals(17, MarkwonMarkdownUtil.togglePunctuation(builder, 8, 13, "*")); +// assertEquals("Lorem ***ipsum*** dolor sit amet.", builder.toString()); // Toggle bold on italic text // builder = new StringBuilder("Lorem *ipsum* dolor sit amet."); -// assertEquals(15, MarkwonMarkdownUtil.togglePunctuation(builder, 7, 12, "**")); -// assertEquals("Lorem **ipsum** dolor sit amet.", builder.toString()); +// assertEquals(17, MarkwonMarkdownUtil.togglePunctuation(builder, 7, 12, "**")); +// assertEquals("Lorem ***ipsum*** dolor sit amet.", builder.toString()); } public void testInsertLink() { diff --git a/markdown/src/main/java/it/niedermann/android/markdown/markwon/MarkwonMarkdownUtil.java b/markdown/src/main/java/it/niedermann/android/markdown/markwon/MarkwonMarkdownUtil.java index d5053f804..465ec678a 100644 --- a/markdown/src/main/java/it/niedermann/android/markdown/markwon/MarkwonMarkdownUtil.java +++ b/markdown/src/main/java/it/niedermann/android/markdown/markwon/MarkwonMarkdownUtil.java @@ -120,16 +120,18 @@ public class MarkwonMarkdownUtil { public static int togglePunctuation(@NonNull StringBuilder builder, int selectionStart, int selectionEnd, @NonNull String punctuation) { switch (punctuation) { case "**": + case "__": case "*": + case "_": case "~~": { - final boolean hasAlreadyMarkdown = hasAlreadyMarkdown(builder.toString(), selectionStart, selectionEnd, punctuation); - if (hasAlreadyMarkdown) { + final boolean selectionIsSurroundedByPunctuation = selectionIsSurroundedByPunctuation(builder.toString(), selectionStart, selectionEnd, punctuation); + if (selectionIsSurroundedByPunctuation) { removeMarkdown(builder, selectionStart, selectionEnd, punctuation); } else { builder.insert(selectionEnd, punctuation); builder.insert(selectionStart, punctuation); } - return hasAlreadyMarkdown ? selectionEnd - punctuation.length() : selectionEnd + punctuation.length() * 2; + return selectionIsSurroundedByPunctuation ? selectionEnd - punctuation.length() : selectionEnd + punctuation.length() * 2; } default: throw new UnsupportedOperationException("This kind of punctuation is not yet supported: " + punctuation); @@ -167,14 +169,19 @@ public class MarkwonMarkdownUtil { : selectionEnd + 3; } - private static boolean hasAlreadyMarkdown(@Nullable CharSequence text, int start, int end, String punctuation) { - return text != null && (start > punctuation.length() && punctuation.contentEquals(text.subSequence(start - punctuation.length(), start)) && - text.length() > end + punctuation.length() && punctuation.contentEquals(text.subSequence(end, end + punctuation.length()))); + private static boolean selectionIsSurroundedByPunctuation(@NonNull CharSequence text, int start, int end, @NonNull String punctuation) { + if (text.length() < end + punctuation.length()) { + return false; + } + if (start - punctuation.length() < 0 || end + punctuation.length() > text.length()) { + return false; + } + return punctuation.contentEquals(text.subSequence(start - punctuation.length(), start)) + && punctuation.contentEquals(text.subSequence(end, end + punctuation.length())); } - private static void removeMarkdown(StringBuilder ssb, int start, int end, String punctuation) { - // FIXME disabled, because it does not work properly and might cause data loss + private static void removeMarkdown(@NonNull StringBuilder ssb, int start, int end, @NonNull String punctuation) { + ssb.delete(end, end + punctuation.length()); ssb.delete(start - punctuation.length(), start); - ssb.delete(end - punctuation.length(), end); } } |