Update syntax highlight to use SpannableStringBuilder

This commit is contained in:
Dimitry Ivanov 2018-07-16 18:24:40 +03:00
parent 6e2a064304
commit 2ac6090a3d
5 changed files with 19 additions and 17 deletions

View File

@ -2,9 +2,9 @@ package ru.noties.markwon.syntax;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils; import android.text.TextUtils;
import ru.noties.markwon.SpannableBuilder;
import ru.noties.markwon.SyntaxHighlight; import ru.noties.markwon.SyntaxHighlight;
import ru.noties.prism4j.Prism4j; import ru.noties.prism4j.Prism4j;
@ -82,10 +82,10 @@ public class Prism4jSyntaxHighlight implements SyntaxHighlight {
@NonNull @NonNull
protected CharSequence highlight(@NonNull String language, @NonNull Prism4j.Grammar grammar, @NonNull String code) { protected CharSequence highlight(@NonNull String language, @NonNull Prism4j.Grammar grammar, @NonNull String code) {
final SpannableBuilder builder = new SpannableBuilder(); final SpannableStringBuilder builder = new SpannableStringBuilder();
final Prism4jSyntaxVisitor visitor = new Prism4jSyntaxVisitor(language, theme, builder); final Prism4jSyntaxVisitor visitor = new Prism4jSyntaxVisitor(language, theme, builder);
visitor.visit(prism4j.tokenize(code, grammar)); visitor.visit(prism4j.tokenize(code, grammar));
return builder.text(); return builder;
} }
@NonNull @NonNull

View File

@ -1,8 +1,8 @@
package ru.noties.markwon.syntax; package ru.noties.markwon.syntax;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.text.SpannableStringBuilder;
import ru.noties.markwon.SpannableBuilder;
import ru.noties.prism4j.AbsVisitor; import ru.noties.prism4j.AbsVisitor;
import ru.noties.prism4j.Prism4j; import ru.noties.prism4j.Prism4j;
@ -10,12 +10,12 @@ class Prism4jSyntaxVisitor extends AbsVisitor {
private final String language; private final String language;
private final Prism4jTheme theme; private final Prism4jTheme theme;
private final SpannableBuilder builder; private final SpannableStringBuilder builder;
Prism4jSyntaxVisitor( Prism4jSyntaxVisitor(
@NonNull String language, @NonNull String language,
@NonNull Prism4jTheme theme, @NonNull Prism4jTheme theme,
@NonNull SpannableBuilder builder) { @NonNull SpannableStringBuilder builder) {
this.language = language; this.language = language;
this.theme = theme; this.theme = theme;
this.builder = builder; this.builder = builder;

View File

@ -2,8 +2,8 @@ package ru.noties.markwon.syntax;
import android.support.annotation.ColorInt; import android.support.annotation.ColorInt;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.text.SpannableStringBuilder;
import ru.noties.markwon.SpannableBuilder;
import ru.noties.prism4j.Prism4j; import ru.noties.prism4j.Prism4j;
public interface Prism4jTheme { public interface Prism4jTheme {
@ -14,7 +14,7 @@ public interface Prism4jTheme {
void apply( void apply(
@NonNull String language, @NonNull String language,
@NonNull Prism4j.Syntax syntax, @NonNull Prism4j.Syntax syntax,
@NonNull SpannableBuilder builder, @NonNull SpannableStringBuilder builder,
int start, int start,
int end int end
); );

View File

@ -5,11 +5,12 @@ import android.support.annotation.FloatRange;
import android.support.annotation.IntRange; import android.support.annotation.IntRange;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan; import android.text.style.ForegroundColorSpan;
import java.util.HashMap; import java.util.HashMap;
import ru.noties.markwon.SpannableBuilder;
import ru.noties.prism4j.Prism4j; import ru.noties.prism4j.Prism4j;
public abstract class Prism4jThemeBase implements Prism4jTheme { public abstract class Prism4jThemeBase implements Prism4jTheme {
@ -55,7 +56,7 @@ public abstract class Prism4jThemeBase implements Prism4jTheme {
public void apply( public void apply(
@NonNull String language, @NonNull String language,
@NonNull Prism4j.Syntax syntax, @NonNull Prism4j.Syntax syntax,
@NonNull SpannableBuilder builder, @NonNull SpannableStringBuilder builder,
int start, int start,
int end) { int end) {
@ -74,10 +75,10 @@ public abstract class Prism4jThemeBase implements Prism4jTheme {
@NonNull String type, @NonNull String type,
@Nullable String alias, @Nullable String alias,
@ColorInt int color, @ColorInt int color,
@NonNull SpannableBuilder builder, @NonNull SpannableStringBuilder builder,
int start, int start,
int end) { int end) {
builder.setSpan(new ForegroundColorSpan(color), start, end); builder.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
protected static class Color { protected static class Color {

View File

@ -3,9 +3,10 @@ package ru.noties.markwon.syntax;
import android.support.annotation.ColorInt; import android.support.annotation.ColorInt;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.BackgroundColorSpan; import android.text.style.BackgroundColorSpan;
import ru.noties.markwon.SpannableBuilder;
import ru.noties.markwon.spans.EmphasisSpan; import ru.noties.markwon.spans.EmphasisSpan;
import ru.noties.markwon.spans.StrongEmphasisSpan; import ru.noties.markwon.spans.StrongEmphasisSpan;
@ -36,13 +37,13 @@ public class Prism4jThemeDefault extends Prism4jThemeBase {
@NonNull String type, @NonNull String type,
@Nullable String alias, @Nullable String alias,
@ColorInt int color, @ColorInt int color,
@NonNull SpannableBuilder builder, @NonNull SpannableStringBuilder builder,
int start, int start,
int end) { int end) {
if ("css".equals(language) && isOfType("string", type, alias)) { if ("css".equals(language) && isOfType("string", type, alias)) {
super.applyColor(language, type, alias, 0xFF9a6e3a, builder, start, end); super.applyColor(language, type, alias, 0xFF9a6e3a, builder, start, end);
builder.setSpan(new BackgroundColorSpan(0x80ffffff), start, end); builder.setSpan(new BackgroundColorSpan(0x80ffffff), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return; return;
} }
@ -54,11 +55,11 @@ public class Prism4jThemeDefault extends Prism4jThemeBase {
if (isOfType("important", type, alias) if (isOfType("important", type, alias)
|| isOfType("bold", type, alias)) { || isOfType("bold", type, alias)) {
builder.setSpan(new StrongEmphasisSpan(), start, end); builder.setSpan(new StrongEmphasisSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
if (isOfType("italic", type, alias)) { if (isOfType("italic", type, alias)) {
builder.setSpan(new EmphasisSpan(), start, end); builder.setSpan(new EmphasisSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
} }