diff --git a/markwon-editor/src/main/java/io/noties/markwon/editor/handler/HeadingEditHandler.java b/markwon-editor/src/main/java/io/noties/markwon/editor/handler/HeadingEditHandler.java index 990d3995..2af54951 100644 --- a/markwon-editor/src/main/java/io/noties/markwon/editor/handler/HeadingEditHandler.java +++ b/markwon-editor/src/main/java/io/noties/markwon/editor/handler/HeadingEditHandler.java @@ -1,7 +1,8 @@ -package io.noties.markwon.app.samples.editor.shared; +package it.niedermann.android.markdown.markwon.handler; import android.text.Editable; import android.text.Spanned; +import android.util.Log; import androidx.annotation.NonNull; @@ -13,6 +14,15 @@ import io.noties.markwon.editor.PersistedSpans; public class HeadingEditHandler implements EditHandler { + private static final String[] MARKERS = new String[]{ + "#", + "##", + "###", + "####", + "#####", + "######", + }; + private MarkwonTheme theme; @Override @@ -22,61 +32,114 @@ public class HeadingEditHandler implements EditHandler { @Override public void configurePersistedSpans(@NonNull PersistedSpans.Builder builder) { - builder - .persistSpan(Head1.class, () -> new Head1(theme)) - .persistSpan(Head2.class, () -> new Head2(theme)); + builder.persistSpan(Heading1Span.class, () -> new Heading1Span(theme)); + builder.persistSpan(Heading2Span.class, () -> new Heading2Span(theme)); + builder.persistSpan(Heading3Span.class, () -> new Heading3Span(theme)); + builder.persistSpan(Heading4Span.class, () -> new Heading4Span(theme)); + builder.persistSpan(Heading5Span.class, () -> new Heading5Span(theme)); + builder.persistSpan(Heading6Span.class, () -> new Heading6Span(theme)); } @Override public void handleMarkdownSpan( - @NonNull PersistedSpans persistedSpans, - @NonNull Editable editable, - @NonNull String input, - @NonNull HeadingSpan span, - int spanStart, - int spanTextLength - ) { - final Class type; + @NonNull PersistedSpans persistedSpans, + @NonNull Editable editable, + @NonNull String input, + @NonNull HeadingSpan span, + int spanStart, + int spanTextLength) { + HeadingSpan newSpan; + switch (span.getLevel()) { case 1: - type = Head1.class; + newSpan = persistedSpans.get(Heading1Span.class); break; case 2: - type = Head2.class; + newSpan = persistedSpans.get(Heading2Span.class); + break; + case 3: + newSpan = persistedSpans.get(Heading3Span.class); + break; + case 4: + newSpan = persistedSpans.get(Heading4Span.class); + break; + case 5: + newSpan = persistedSpans.get(Heading5Span.class); + break; + case 6: + newSpan = persistedSpans.get(Heading6Span.class); break; default: - type = null; + return; + + } + int newStart = getNewSpanStart(input, spanStart, newSpan.getLevel()); + int newEnd = input.indexOf("\n", newStart); + Log.w("deck", "found heading lv "+span.getLevel()+": \""+input.substring(newStart, newEnd)+"\""); + + editable.setSpan( + newSpan, + newStart, + newEnd, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ); + } + + private int getNewSpanStart(String input, int spanStart, int level) { + String marker = MARKERS[level-1]; + if (input.substring(spanStart, spanStart + level).equals(marker)) { + return spanStart; } - if (type != null) { - final int index = input.indexOf('\n', spanStart + spanTextLength); - final int end = index < 0 - ? input.length() - : index; - editable.setSpan( - persistedSpans.get(type), - spanStart, - end, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE - ); + int start = spanStart; + + while (start >= 0 && input.charAt(start) != '\n') { + start--; } + start += 1; + return start; } + @NonNull @Override public Class markdownSpanType() { return HeadingSpan.class; } - private static class Head1 extends HeadingSpan { - Head1(@NonNull MarkwonTheme theme) { + private static class Heading1Span extends HeadingSpan { + public Heading1Span(@NonNull MarkwonTheme theme) { super(theme, 1); } } - private static class Head2 extends HeadingSpan { - Head2(@NonNull MarkwonTheme theme) { + private static class Heading2Span extends HeadingSpan { + public Heading2Span(@NonNull MarkwonTheme theme) { super(theme, 2); } } -} + + private static class Heading3Span extends HeadingSpan { + public Heading3Span(@NonNull MarkwonTheme theme) { + super(theme, 3); + } + } + + private static class Heading4Span extends HeadingSpan { + public Heading4Span(@NonNull MarkwonTheme theme) { + super(theme, 4); + } + } + + private static class Heading5Span extends HeadingSpan { + public Heading5Span(@NonNull MarkwonTheme theme) { + super(theme, 5); + } + } + + private static class Heading6Span extends HeadingSpan { + public Heading6Span(@NonNull MarkwonTheme theme) { + super(theme, 6); + } + } +} \ No newline at end of file