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.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user