From 6e2a064304eb3be329197b6a77c97269d1d24513 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Mon, 16 Jul 2018 17:51:08 +0300 Subject: [PATCH] Add syntax highlight to sample app --- app/build.gradle | 4 ++++ .../main/java/ru/noties/markwon/AppModule.java | 18 ++++++++++++++++++ .../ru/noties/markwon/MarkdownRenderer.java | 18 ++++++++++++++++++ .../markwon/syntax/Prism4jSyntaxHighlight.java | 4 ++-- .../ru/noties/markwon/syntax/Prism4jTheme.java | 4 ++++ .../markwon/syntax/Prism4jThemeBase.java | 1 - .../markwon/syntax/Prism4jThemeDefault.java | 5 +++++ 7 files changed, 51 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4b761b94..9fb02274 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,7 @@ dependencies { implementation project(':library') implementation project(':library-image-loader') + implementation project(':library-syntax') implementation 'ru.noties:debug:3.0.0@jar' implementation 'me.saket:better-link-movement-method:2.2.0' @@ -38,4 +39,7 @@ dependencies { implementation 'com.google.dagger:dagger:2.10' annotationProcessor 'com.google.dagger:dagger-compiler:2.10' + + implementation PRISM_4J + annotationProcessor PRISM_4J_BUNDLER } diff --git a/app/src/main/java/ru/noties/markwon/AppModule.java b/app/src/main/java/ru/noties/markwon/AppModule.java index 09c5e230..9fdd7f58 100644 --- a/app/src/main/java/ru/noties/markwon/AppModule.java +++ b/app/src/main/java/ru/noties/markwon/AppModule.java @@ -16,8 +16,14 @@ import okhttp3.Cache; import okhttp3.OkHttpClient; import ru.noties.markwon.il.AsyncDrawableLoader; import ru.noties.markwon.spans.AsyncDrawable; +import ru.noties.markwon.syntax.Prism4jTheme; +import ru.noties.markwon.syntax.Prism4jThemeDefault; +import ru.noties.prism4j.Prism4j; +import ru.noties.prism4j.annotations.PrismBundle; @Module +@PrismBundle(include = {"c", "clojure", "cpp", "csharp", "css", "dart", "git", "go", "java", + "javascript", "json", "kotlin", "latex", "makefile", "markup", "python", "sql", "yaml"}) class AppModule { private final App app; @@ -75,4 +81,16 @@ class AppModule { .resources(resources) .build(); } + + @Provides + @Singleton + Prism4j prism4j() { + return new Prism4j(new GrammarLocatorDef()); + } + + @Singleton + @Provides + Prism4jTheme prism4jTheme() { + return Prism4jThemeDefault.create(); + } } diff --git a/app/src/main/java/ru/noties/markwon/MarkdownRenderer.java b/app/src/main/java/ru/noties/markwon/MarkdownRenderer.java index f276dfe2..0e78d5d5 100644 --- a/app/src/main/java/ru/noties/markwon/MarkdownRenderer.java +++ b/app/src/main/java/ru/noties/markwon/MarkdownRenderer.java @@ -14,6 +14,10 @@ import javax.inject.Inject; import ru.noties.debug.Debug; import ru.noties.markwon.spans.AsyncDrawable; +import ru.noties.markwon.spans.SpannableTheme; +import ru.noties.markwon.syntax.Prism4jSyntaxHighlight; +import ru.noties.markwon.syntax.Prism4jTheme; +import ru.noties.prism4j.Prism4j; @ActivityScope public class MarkdownRenderer { @@ -31,6 +35,12 @@ public class MarkdownRenderer { @Inject Handler handler; + @Inject + Prism4j prism4j; + + @Inject + Prism4jTheme prism4jTheme; + private Future task; @Inject @@ -42,7 +52,11 @@ public class MarkdownRenderer { @Nullable final Uri uri, @NonNull final String markdown, @NonNull final MarkdownReadyListener listener) { + + // todo: create prism4j theme factory (accepting light/dark argument) + cancel(); + task = service.submit(new Runnable() { @Override public void run() { @@ -57,6 +71,10 @@ public class MarkdownRenderer { final SpannableConfiguration configuration = SpannableConfiguration.builder(context) .asyncDrawableLoader(loader) .urlProcessor(urlProcessor) + .syntaxHighlight(Prism4jSyntaxHighlight.create(prism4j, prism4jTheme)) + .theme(SpannableTheme.builderWithDefaults(context) + .codeBackgroundColor(prism4jTheme.background()) + .build()) .build(); final long start = SystemClock.uptimeMillis(); diff --git a/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jSyntaxHighlight.java b/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jSyntaxHighlight.java index adfb81dd..cc57b56a 100644 --- a/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jSyntaxHighlight.java +++ b/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jSyntaxHighlight.java @@ -14,7 +14,7 @@ public class Prism4jSyntaxHighlight implements SyntaxHighlight { public static Prism4jSyntaxHighlight create( @NonNull Prism4j prism4j, @NonNull Prism4jTheme theme) { - return null; + return new Prism4jSyntaxHighlight(prism4j, theme, null); } @NonNull @@ -22,7 +22,7 @@ public class Prism4jSyntaxHighlight implements SyntaxHighlight { @NonNull Prism4j prism4j, @NonNull Prism4jTheme theme, @Nullable String fallback) { - return null; + return new Prism4jSyntaxHighlight(prism4j, theme, fallback); } private final Prism4j prism4j; diff --git a/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jTheme.java b/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jTheme.java index b80c152b..0f456cb1 100644 --- a/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jTheme.java +++ b/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jTheme.java @@ -1,5 +1,6 @@ package ru.noties.markwon.syntax; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import ru.noties.markwon.SpannableBuilder; @@ -7,6 +8,9 @@ import ru.noties.prism4j.Prism4j; public interface Prism4jTheme { + @ColorInt + int background(); + void apply( @NonNull String language, @NonNull Prism4j.Syntax syntax, diff --git a/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jThemeBase.java b/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jThemeBase.java index 77428b7b..fe915cc8 100644 --- a/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jThemeBase.java +++ b/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jThemeBase.java @@ -64,7 +64,6 @@ public abstract class Prism4jThemeBase implements Prism4jTheme { final int color = color(language, type, alias); if (color != 0) { - builder.setSpan(new ForegroundColorSpan(color), start, end); applyColor(language, type, alias, color, builder, start, end); } } diff --git a/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jThemeDefault.java b/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jThemeDefault.java index 2099842e..7b9728a5 100644 --- a/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jThemeDefault.java +++ b/library-syntax/src/main/java/ru/noties/markwon/syntax/Prism4jThemeDefault.java @@ -61,4 +61,9 @@ public class Prism4jThemeDefault extends Prism4jThemeBase { builder.setSpan(new EmphasisSpan(), start, end); } } + + @Override + public int background() { + return 0xFFf5f2f0; + } }