Improve HeadingEditHandler (WiP)
This commit is contained in:
parent
0ec8584c9e
commit
a46df8fa66
@ -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<HeadingSpan> {
|
||||
|
||||
private static final String[] MARKERS = new String[]{
|
||||
"#",
|
||||
"##",
|
||||
"###",
|
||||
"####",
|
||||
"#####",
|
||||
"######",
|
||||
};
|
||||
|
||||
private MarkwonTheme theme;
|
||||
|
||||
@Override
|
||||
@ -22,9 +32,12 @@ public class HeadingEditHandler implements EditHandler<HeadingSpan> {
|
||||
|
||||
@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
|
||||
@ -34,49 +47,99 @@ public class HeadingEditHandler implements EditHandler<HeadingSpan> {
|
||||
@NonNull String input,
|
||||
@NonNull HeadingSpan span,
|
||||
int spanStart,
|
||||
int spanTextLength
|
||||
) {
|
||||
final Class<?> type;
|
||||
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)+"\"");
|
||||
|
||||
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,
|
||||
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;
|
||||
}
|
||||
|
||||
int start = spanStart;
|
||||
|
||||
while (start >= 0 && input.charAt(start) != '\n') {
|
||||
start--;
|
||||
}
|
||||
start += 1;
|
||||
return start;
|
||||
}
|
||||
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Class<HeadingSpan> 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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user