From 66bfad16cab5fa908662f04e25cb1750d582dca4 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Wed, 6 Feb 2019 17:31:59 +0300 Subject: [PATCH 1/2] Fix deep nested bullet lists for Nougat --- gradle.properties | 2 +- .../markwon/spans/BulletListItemSpan.java | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 7865eb58..846081f0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.configureondemand=true android.enableBuildCache=true android.buildCacheDir=build/pre-dex-cache -VERSION_NAME=2.0.1 +VERSION_NAME=2.0.2-SNAPSHOT GROUP=ru.noties POM_DESCRIPTION=Markwon diff --git a/markwon/src/main/java/ru/noties/markwon/spans/BulletListItemSpan.java b/markwon/src/main/java/ru/noties/markwon/spans/BulletListItemSpan.java index 368f13a9..dfa244c1 100644 --- a/markwon/src/main/java/ru/noties/markwon/spans/BulletListItemSpan.java +++ b/markwon/src/main/java/ru/noties/markwon/spans/BulletListItemSpan.java @@ -58,14 +58,28 @@ public class BulletListItemSpan implements LeadingMarginSpan { final int marginLeft = (width - side) / 2; + // @since 2.0.2 + // There is a bug in Android Nougat, when this span receives an `x` that + // doesn't correspond to what it should be (text is placed correctly though). + // Let's make this a general rule -> manually calculate difference between expected/actual + // and add this difference to resulting left/right values. If everything goes well + // we do not encounter a bug -> this `diff` value will be 0 + final int diff; + if (dir < 0) { + // rtl + diff = x - (layout.getWidth() - (width * level)); + } else { + diff = (width * level) - x; + } + // in order to support RTL final int l; final int r; { final int left = x + (dir * marginLeft); final int right = left + (dir * side); - l = Math.min(left, right); - r = Math.max(left, right); + l = Math.min(left, right) + (dir * diff); + r = Math.max(left, right) + (dir * diff); } final int t = baseline + (int) ((paint.descent() + paint.ascent()) / 2.F + .5F) - (side / 2); From 1d3255ed591076cd485339a15e3f3e2749f9ea44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Rutkowski?= Date: Mon, 18 Feb 2019 12:36:53 +0100 Subject: [PATCH 2/2] Extend task list parsing (#99) * Handle task lists that start with * or + symbol * Handle task lists that start with numbers * Limit numbers valid for task lists to 9 digits --- .../markwon/tasklist/TaskListBlockParser.java | 6 +- .../src/test/resources/tests/task-list.yaml | 57 +++++++++++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 markwon/src/test/resources/tests/task-list.yaml diff --git a/markwon/src/main/java/ru/noties/markwon/tasklist/TaskListBlockParser.java b/markwon/src/main/java/ru/noties/markwon/tasklist/TaskListBlockParser.java index 4c2ab99a..436de188 100644 --- a/markwon/src/main/java/ru/noties/markwon/tasklist/TaskListBlockParser.java +++ b/markwon/src/main/java/ru/noties/markwon/tasklist/TaskListBlockParser.java @@ -23,7 +23,7 @@ import java.util.regex.Pattern; @SuppressWarnings("WeakerAccess") class TaskListBlockParser extends AbstractBlockParser { - private static final Pattern PATTERN = Pattern.compile("\\s*-\\s+\\[(x|X|\\s)\\]\\s+(.*)"); + private static final Pattern PATTERN = Pattern.compile("\\s*([-*+]|\\d{1,9}[.)])\\s+\\[(x|X|\\s)]\\s+(.*)"); private final TaskListBlock block = new TaskListBlock(); @@ -88,9 +88,9 @@ class TaskListBlockParser extends AbstractBlockParser { continue; } listItem = new TaskListItem() - .done(isDone(matcher.group(1))) + .done(isDone(matcher.group(2))) .indent(item.indent / 2); - inlineParser.parse(matcher.group(2), listItem); + inlineParser.parse(matcher.group(3), listItem); block.appendChild(listItem); } } diff --git a/markwon/src/test/resources/tests/task-list.yaml b/markwon/src/test/resources/tests/task-list.yaml new file mode 100644 index 00000000..1663940c --- /dev/null +++ b/markwon/src/test/resources/tests/task-list.yaml @@ -0,0 +1,57 @@ +input: |- + - [ ] First + - [x] Second + - [X] Third + * [ ] First star + * [x] Second star + * [X] Third star + + [ ] First plus + + [x] Second plus + + [X] Third plus + 1. [x] Number with dot + 3) [ ] Number + +output: + - task-list: "First" + blockIdent: 1 + done: false + - text: "\n" + - task-list: "Second" + blockIdent: 1 + done: true + - text: "\n" + - task-list: "Third" + blockIdent: 1 + done: true + - text: "\n" + - task-list: "First star" + blockIdent: 1 + done: false + - text: "\n" + - task-list: "Second star" + blockIdent: 1 + done: true + - text: "\n" + - task-list: "Third star" + blockIdent: 1 + done: true + - text: "\n" + - task-list: "First plus" + blockIdent: 1 + done: false + - text: "\n" + - task-list: "Second plus" + blockIdent: 1 + done: true + - text: "\n" + - task-list: "Third plus" + blockIdent: 1 + done: true + - text: "\n" + - task-list: "Number with dot" + blockIdent: 1 + done: true + - text: "\n" + - task-list: "Number" + blockIdent: 1 + done: false