From f47124a2acdf3e3557f098e5bb5e9d17d66ccb22 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Thu, 26 Mar 2020 16:16:54 +0300 Subject: [PATCH] Sample, add heading handler --- .../markwon/sample/editor/EditorActivity.java | 13 +++- .../sample/editor/HeadingEditHandler.java | 78 +++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 sample/src/main/java/io/noties/markwon/sample/editor/HeadingEditHandler.java diff --git a/sample/src/main/java/io/noties/markwon/sample/editor/EditorActivity.java b/sample/src/main/java/io/noties/markwon/sample/editor/EditorActivity.java index e1181a7f..31a4370e 100644 --- a/sample/src/main/java/io/noties/markwon/sample/editor/EditorActivity.java +++ b/sample/src/main/java/io/noties/markwon/sample/editor/EditorActivity.java @@ -64,7 +64,8 @@ public class EditorActivity extends ActivityWithMenuOptions { .add("multipleEditSpans", this::multiple_edit_spans) .add("multipleEditSpansPlugin", this::multiple_edit_spans_plugin) .add("pluginRequire", this::plugin_require) - .add("pluginNoDefaults", this::plugin_no_defaults); + .add("pluginNoDefaults", this::plugin_no_defaults) + .add("heading", this::heading); } @Override @@ -317,6 +318,16 @@ public class EditorActivity extends ActivityWithMenuOptions { editor, Executors.newSingleThreadExecutor(), editText)); } + private void heading() { + final Markwon markwon = Markwon.create(this); + final MarkwonEditor editor = MarkwonEditor.builder(markwon) + .useEditHandler(new HeadingEditHandler()) + .build(); + + editText.addTextChangedListener(MarkwonEditorTextWatcher.withPreRender( + editor, Executors.newSingleThreadExecutor(), editText)); + } + private void initBottomBar() { // all except block-quote wraps if have selection, or inserts at current cursor position diff --git a/sample/src/main/java/io/noties/markwon/sample/editor/HeadingEditHandler.java b/sample/src/main/java/io/noties/markwon/sample/editor/HeadingEditHandler.java new file mode 100644 index 00000000..f76499db --- /dev/null +++ b/sample/src/main/java/io/noties/markwon/sample/editor/HeadingEditHandler.java @@ -0,0 +1,78 @@ +package io.noties.markwon.sample.editor; + +import android.text.Editable; +import android.text.Spanned; + +import androidx.annotation.NonNull; + +import io.noties.markwon.Markwon; +import io.noties.markwon.core.MarkwonTheme; +import io.noties.markwon.core.spans.HeadingSpan; +import io.noties.markwon.editor.EditHandler; +import io.noties.markwon.editor.PersistedSpans; + +public class HeadingEditHandler implements EditHandler { + + private MarkwonTheme theme; + + @Override + public void init(@NonNull Markwon markwon) { + this.theme = markwon.configuration().theme(); + } + + @Override + public void configurePersistedSpans(@NonNull PersistedSpans.Builder builder) { + builder + .persistSpan(Head1.class, () -> new Head1(theme)) + .persistSpan(Head2.class, () -> new Head2(theme)); + } + + @Override + public void handleMarkdownSpan( + @NonNull PersistedSpans persistedSpans, + @NonNull Editable editable, + @NonNull String input, + @NonNull HeadingSpan span, + int spanStart, + int spanTextLength + ) { + final Class type; + switch (span.getLevel()) { + case 1: type = Head1.class; break; + case 2: type = Head2.class; break; + default: + type = null; + } + + 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 + ); + } + } + + @NonNull + @Override + public Class markdownSpanType() { + return HeadingSpan.class; + } + + private static class Head1 extends HeadingSpan { + Head1(@NonNull MarkwonTheme theme) { + super(theme, 1); + } + } + + private static class Head2 extends HeadingSpan { + Head2(@NonNull MarkwonTheme theme) { + super(theme, 2); + } + } +}