From a298016ac2c795e3b6b9ba61285aa1a89106b13b Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Sun, 2 Feb 2020 17:46:18 +0300 Subject: [PATCH] Working with inline latex parsing --- markwon-ext-latex/build.gradle | 2 + .../ext/latex/JLatexMathBlockParser.java | 2 + .../markwon/ext/latex/JLatexMathInline.java | 19 ++++ .../markwon/ext/latex/JLatexMathPlugin.java | 94 ++++++++++++++++++- sample/build.gradle | 1 + 5 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathInline.java diff --git a/markwon-ext-latex/build.gradle b/markwon-ext-latex/build.gradle index 6e684440..9d5f50b0 100644 --- a/markwon-ext-latex/build.gradle +++ b/markwon-ext-latex/build.gradle @@ -19,6 +19,8 @@ dependencies { api deps['jlatexmath-android'] + debugImplementation project(':markwon-inline-parser') + deps['test'].with { testImplementation it['junit'] testImplementation it['robolectric'] diff --git a/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParser.java b/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParser.java index 8f54f245..ba941c35 100644 --- a/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParser.java +++ b/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParser.java @@ -60,6 +60,8 @@ public class JLatexMathBlockParser extends AbstractBlockParser { @Override public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) { + // ^\s{0,3}\$\$\s*$ as a regex to star the block + final CharSequence line = state.getLine(); final int length = line != null ? line.length() diff --git a/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathInline.java b/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathInline.java new file mode 100644 index 00000000..b5d6810d --- /dev/null +++ b/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathInline.java @@ -0,0 +1,19 @@ +package io.noties.markwon.ext.latex; + +import org.commonmark.node.CustomNode; + +/** + * @since 4.2.1-SNAPSHOT + */ +public class JLatexMathInline extends CustomNode { + + private String latex; + + public String latex() { + return latex; + } + + public void latex(String latex) { + this.latex = latex; + } +} diff --git a/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathPlugin.java b/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathPlugin.java index 5d136ece..10c4865b 100644 --- a/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathPlugin.java +++ b/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathPlugin.java @@ -14,6 +14,8 @@ import androidx.annotation.Nullable; import androidx.annotation.Px; import androidx.annotation.VisibleForTesting; +import org.commonmark.node.Node; +import org.commonmark.parser.InlineParserFactory; import org.commonmark.parser.Parser; import java.util.HashMap; @@ -30,6 +32,9 @@ import io.noties.markwon.image.AsyncDrawableLoader; import io.noties.markwon.image.AsyncDrawableScheduler; import io.noties.markwon.image.AsyncDrawableSpan; import io.noties.markwon.image.ImageSizeResolver; +import io.noties.markwon.image.ImageSizeResolverDef; +import io.noties.markwon.inlineparser.InlineProcessor; +import io.noties.markwon.inlineparser.MarkwonInlineParser; import ru.noties.jlatexmath.JLatexMathDrawable; /** @@ -120,7 +125,17 @@ public class JLatexMathPlugin extends AbstractMarkwonPlugin { @Override public void configureParser(@NonNull Parser.Builder builder) { - builder.customBlockParserFactory(new JLatexMathBlockParser.Factory()); + + // what we can do: + // [0-3] spaces before block start/end + // if it's $$\n -> block + // if it's $$\\dhdsfjh$$ -> inline + +// builder.customBlockParserFactory(new JLatexMathBlockParser.Factory()); + final InlineParserFactory factory = MarkwonInlineParser.factoryBuilderNoDefaults() + .addInlineProcessor(new LatexInlineProcessor()) + .build(); + builder.inlineParserFactory(factory); } @Override @@ -145,9 +160,9 @@ public class JLatexMathPlugin extends AbstractMarkwonPlugin { new AsyncDrawable( latex, jLatextAsyncDrawableLoader, - jLatexImageSizeResolver, + new ImageSizeResolverDef(), null), - AsyncDrawableSpan.ALIGN_BOTTOM, + AsyncDrawableSpan.ALIGN_CENTER, false); visitor.setSpans(length, span); @@ -155,6 +170,77 @@ public class JLatexMathPlugin extends AbstractMarkwonPlugin { }); } + private static class LatexInlineProcessor extends InlineProcessor { + + @Override + public char specialCharacter() { + return '$'; + } + + @Nullable + @Override + protected Node parse() { + + final int start = index; + + index += 1; + if (peek() != '$') { + index = start; + return null; + } + + // must be not $ + index += 1; + if (peek() == '$') { + return text("$"); + } + + // find next '$$', but not broken with 2(or more) new lines + + boolean dollar = false; + boolean newLine = false; + boolean found = false; + + index += 1; + final int length = input.length(); + + while (index < length) { + final char c = peek(); + if (c == '\n') { + if (newLine) { + // second new line + break; + } + newLine = true; + dollar = false; // cannot be on another line + } else { + newLine = false; + if (c == '$') { + if (dollar) { + found = true; + // advance + index += 1; + break; + } + dollar = true; + } else { + dollar = false; + } + } + index += 1; + } + + if (found) { + final JLatexMathBlock block = new JLatexMathBlock(); + block.latex(input.substring(start + 2, index - 2)); + index += 1; + return block; + } + + return null; + } + } + @Override public void beforeSetText(@NonNull TextView textView, @NonNull Spanned markdown) { AsyncDrawableScheduler.unschedule(textView); @@ -182,7 +268,7 @@ public class JLatexMathPlugin extends AbstractMarkwonPlugin { @JLatexMathDrawable.Align private int align = JLatexMathDrawable.ALIGN_CENTER; - private boolean fitCanvas = true; + private boolean fitCanvas = false; // @since 4.0.0 private int paddingHorizontal; diff --git a/sample/build.gradle b/sample/build.gradle index d2a9e27f..595fd54b 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -49,6 +49,7 @@ dependencies { implementation project(':markwon-syntax-highlight') implementation project(':markwon-image-picasso') + implementation project(':markwon-image-glide') deps.with { implementation it['x-recycler-view']