Improve HeadingEditHandler (WiP)

This commit is contained in:
Stefan Niedermann 2020-11-28 12:51:33 +01:00
parent 0ec8584c9e
commit a46df8fa66

View File

@ -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.Editable;
import android.text.Spanned; import android.text.Spanned;
import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -13,6 +14,15 @@ import io.noties.markwon.editor.PersistedSpans;
public class HeadingEditHandler implements EditHandler<HeadingSpan> { public class HeadingEditHandler implements EditHandler<HeadingSpan> {
private static final String[] MARKERS = new String[]{
"#",
"##",
"###",
"####",
"#####",
"######",
};
private MarkwonTheme theme; private MarkwonTheme theme;
@Override @Override
@ -22,9 +32,12 @@ public class HeadingEditHandler implements EditHandler<HeadingSpan> {
@Override @Override
public void configurePersistedSpans(@NonNull PersistedSpans.Builder builder) { public void configurePersistedSpans(@NonNull PersistedSpans.Builder builder) {
builder builder.persistSpan(Heading1Span.class, () -> new Heading1Span(theme));
.persistSpan(Head1.class, () -> new Head1(theme)) builder.persistSpan(Heading2Span.class, () -> new Heading2Span(theme));
.persistSpan(Head2.class, () -> new Head2(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 @Override
@ -34,49 +47,99 @@ public class HeadingEditHandler implements EditHandler<HeadingSpan> {
@NonNull String input, @NonNull String input,
@NonNull HeadingSpan span, @NonNull HeadingSpan span,
int spanStart, int spanStart,
int spanTextLength int spanTextLength) {
) { HeadingSpan newSpan;
final Class<?> type;
switch (span.getLevel()) { switch (span.getLevel()) {
case 1: case 1:
type = Head1.class; newSpan = persistedSpans.get(Heading1Span.class);
break; break;
case 2: 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; break;
default: 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)+"\"");
if (type != null) {
final int index = input.indexOf('\n', spanStart + spanTextLength);
final int end = index < 0
? input.length()
: index;
editable.setSpan( editable.setSpan(
persistedSpans.get(type), newSpan,
spanStart, newStart,
end, newEnd,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 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;
} }
int start = spanStart;
while (start >= 0 && input.charAt(start) != '\n') {
start--;
}
start += 1;
return start;
}
@NonNull @NonNull
@Override @Override
public Class<HeadingSpan> markdownSpanType() { public Class<HeadingSpan> markdownSpanType() {
return HeadingSpan.class; return HeadingSpan.class;
} }
private static class Head1 extends HeadingSpan { private static class Heading1Span extends HeadingSpan {
Head1(@NonNull MarkwonTheme theme) { public Heading1Span(@NonNull MarkwonTheme theme) {
super(theme, 1); super(theme, 1);
} }
} }
private static class Head2 extends HeadingSpan { private static class Heading2Span extends HeadingSpan {
Head2(@NonNull MarkwonTheme theme) { public Heading2Span(@NonNull MarkwonTheme theme) {
super(theme, 2); 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);
}
}
} }