LatexPlugin now depens on inline-parser plugin

This commit is contained in:
Dimitry Ivanov 2020-02-26 16:10:20 +03:00
parent 74682ae605
commit 1c08e3f240
3 changed files with 66 additions and 32 deletions

View File

@ -16,11 +16,10 @@ android {
dependencies {
api project(':markwon-core')
api project(':markwon-inline-parser')
api deps['jlatexmath-android']
debugImplementation project(':markwon-inline-parser')
deps['test'].with {
testImplementation it['junit']
testImplementation it['robolectric']

View File

@ -14,7 +14,6 @@ import androidx.annotation.Nullable;
import androidx.annotation.Px;
import androidx.annotation.VisibleForTesting;
import org.commonmark.parser.InlineParserFactory;
import org.commonmark.parser.Parser;
import java.util.HashMap;
@ -31,7 +30,7 @@ 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.inlineparser.MarkwonInlineParser;
import io.noties.markwon.inlineparser.MarkwonInlineParserPlugin;
import ru.noties.jlatexmath.JLatexMathDrawable;
/**
@ -153,10 +152,19 @@ public class JLatexMathPlugin extends AbstractMarkwonPlugin {
this.inlineImageSizeResolver = new InlineImageSizeResolver();
}
@Override
public void configure(@NonNull Registry registry) {
if (RenderMode.BLOCKS_AND_INLINES == config.renderMode) {
registry.require(MarkwonInlineParserPlugin.class)
.factoryBuilder()
.addInlineProcessor(new JLatexMathInlineProcessor());
}
}
@Override
public void configureParser(@NonNull Parser.Builder builder) {
// TODO: depending on renderMode we should register our parsing here
// depending on renderMode we should register our parsing here
// * for LEGACY -> just add custom block parser
// * for INLINE.. -> require InlinePlugin, add inline processor + add block parser
@ -169,11 +177,7 @@ public class JLatexMathPlugin extends AbstractMarkwonPlugin {
case BLOCKS_AND_INLINES: {
builder.customBlockParserFactory(new JLatexMathBlockParser.Factory());
final InlineParserFactory factory = MarkwonInlineParser.factoryBuilder()
.addInlineProcessor(new JLatexMathInlineProcessor())
.build();
builder.inlineParserFactory(factory);
// inline processor is added through `registry`
}
break;

View File

@ -11,12 +11,41 @@ import androidx.annotation.Nullable;
import io.noties.markwon.Markwon;
import io.noties.markwon.ext.latex.JLatexMathPlugin;
import io.noties.markwon.ext.latex.JLatexMathTheme;
import io.noties.markwon.inlineparser.MarkwonInlineParserPlugin;
import io.noties.markwon.sample.ActivityWithMenuOptions;
import io.noties.markwon.sample.MenuOptions;
import io.noties.markwon.sample.R;
public class LatexActivity extends ActivityWithMenuOptions {
private static final String LATEX_ARRAY;
static {
String latex = "\\begin{array}{l}";
latex += "\\forall\\varepsilon\\in\\mathbb{R}_+^*\\ \\exists\\eta>0\\ |x-x_0|\\leq\\eta\\Longrightarrow|f(x)-f(x_0)|\\leq\\varepsilon\\\\";
latex += "\\det\\begin{bmatrix}a_{11}&a_{12}&\\cdots&a_{1n}\\\\a_{21}&\\ddots&&\\vdots\\\\\\vdots&&\\ddots&\\vdots\\\\a_{n1}&\\cdots&\\cdots&a_{nn}\\end{bmatrix}\\overset{\\mathrm{def}}{=}\\sum_{\\sigma\\in\\mathfrak{S}_n}\\varepsilon(\\sigma)\\prod_{k=1}^n a_{k\\sigma(k)}\\\\";
latex += "\\sideset{_\\alpha^\\beta}{_\\gamma^\\delta}{\\begin{pmatrix}a&b\\\\c&d\\end{pmatrix}}\\\\";
latex += "\\int_0^\\infty{x^{2n} e^{-a x^2}\\,dx} = \\frac{2n-1}{2a} \\int_0^\\infty{x^{2(n-1)} e^{-a x^2}\\,dx} = \\frac{(2n-1)!!}{2^{n+1}} \\sqrt{\\frac{\\pi}{a^{2n+1}}}\\\\";
latex += "\\int_a^b{f(x)\\,dx} = (b - a) \\sum\\limits_{n = 1}^\\infty {\\sum\\limits_{m = 1}^{2^n - 1} {\\left( { - 1} \\right)^{m + 1} } } 2^{ - n} f(a + m\\left( {b - a} \\right)2^{-n} )\\\\";
latex += "\\int_{-\\pi}^{\\pi} \\sin(\\alpha x) \\sin^n(\\beta x) dx = \\textstyle{\\left \\{ \\begin{array}{cc} (-1)^{(n+1)/2} (-1)^m \\frac{2 \\pi}{2^n} \\binom{n}{m} & n \\mbox{ odd},\\ \\alpha = \\beta (2m-n) \\\\ 0 & \\mbox{otherwise} \\\\ \\end{array} \\right .}\\\\";
latex += "L = \\int_a^b \\sqrt{ \\left|\\sum_{i,j=1}^ng_{ij}(\\gamma(t))\\left(\\frac{d}{dt}x^i\\circ\\gamma(t)\\right)\\left(\\frac{d}{dt}x^j\\circ\\gamma(t)\\right)\\right|}\\,dt\\\\";
latex += "\\begin{array}{rl} s &= \\int_a^b\\left\\|\\frac{d}{dt}\\vec{r}\\,(u(t),v(t))\\right\\|\\,dt \\\\ &= \\int_a^b \\sqrt{u'(t)^2\\,\\vec{r}_u\\cdot\\vec{r}_u + 2u'(t)v'(t)\\, \\vec{r}_u\\cdot\\vec{r}_v+ v'(t)^2\\,\\vec{r}_v\\cdot\\vec{r}_v}\\,\\,\\, dt. \\end{array}\\\\";
latex += "\\end{array}";
LATEX_ARRAY = latex;
}
private static final String LATEX_LONG_DIVISION = "\\text{A long division \\longdiv{12345}{13}";
private static final String LATEX_BANGLE = "{a \\bangle b} {c \\brace d} {e \\brack f} {g \\choose h}";
private static final String LATEX_BOXES;
static {
String latex = "\\begin{array}{cc}";
latex += "\\fbox{\\text{A framed box with \\textdbend}}&\\shadowbox{\\text{A shadowed box}}\\cr";
latex += "\\doublebox{\\text{A double framed box}}&\\ovalbox{\\text{An oval framed box}}\\cr";
latex += "\\end{array}";
LATEX_BOXES = latex;
}
private TextView textView;
@NonNull
@ -27,7 +56,8 @@ public class LatexActivity extends ActivityWithMenuOptions {
.add("longDivision", this::longDivision)
.add("bangle", this::bangle)
.add("boxes", this::boxes)
.add("insideBlockQuote", this::insideBlockQuote);
.add("insideBlockQuote", this::insideBlockQuote)
.add("legacy", this::legacy);
}
@Override
@ -42,36 +72,19 @@ public class LatexActivity extends ActivityWithMenuOptions {
}
private void array() {
String latex = "\\begin{array}{l}";
latex += "\\forall\\varepsilon\\in\\mathbb{R}_+^*\\ \\exists\\eta>0\\ |x-x_0|\\leq\\eta\\Longrightarrow|f(x)-f(x_0)|\\leq\\varepsilon\\\\";
latex += "\\det\\begin{bmatrix}a_{11}&a_{12}&\\cdots&a_{1n}\\\\a_{21}&\\ddots&&\\vdots\\\\\\vdots&&\\ddots&\\vdots\\\\a_{n1}&\\cdots&\\cdots&a_{nn}\\end{bmatrix}\\overset{\\mathrm{def}}{=}\\sum_{\\sigma\\in\\mathfrak{S}_n}\\varepsilon(\\sigma)\\prod_{k=1}^n a_{k\\sigma(k)}\\\\";
latex += "\\sideset{_\\alpha^\\beta}{_\\gamma^\\delta}{\\begin{pmatrix}a&b\\\\c&d\\end{pmatrix}}\\\\";
latex += "\\int_0^\\infty{x^{2n} e^{-a x^2}\\,dx} = \\frac{2n-1}{2a} \\int_0^\\infty{x^{2(n-1)} e^{-a x^2}\\,dx} = \\frac{(2n-1)!!}{2^{n+1}} \\sqrt{\\frac{\\pi}{a^{2n+1}}}\\\\";
latex += "\\int_a^b{f(x)\\,dx} = (b - a) \\sum\\limits_{n = 1}^\\infty {\\sum\\limits_{m = 1}^{2^n - 1} {\\left( { - 1} \\right)^{m + 1} } } 2^{ - n} f(a + m\\left( {b - a} \\right)2^{-n} )\\\\";
latex += "\\int_{-\\pi}^{\\pi} \\sin(\\alpha x) \\sin^n(\\beta x) dx = \\textstyle{\\left \\{ \\begin{array}{cc} (-1)^{(n+1)/2} (-1)^m \\frac{2 \\pi}{2^n} \\binom{n}{m} & n \\mbox{ odd},\\ \\alpha = \\beta (2m-n) \\\\ 0 & \\mbox{otherwise} \\\\ \\end{array} \\right .}\\\\";
latex += "L = \\int_a^b \\sqrt{ \\left|\\sum_{i,j=1}^ng_{ij}(\\gamma(t))\\left(\\frac{d}{dt}x^i\\circ\\gamma(t)\\right)\\left(\\frac{d}{dt}x^j\\circ\\gamma(t)\\right)\\right|}\\,dt\\\\";
latex += "\\begin{array}{rl} s &= \\int_a^b\\left\\|\\frac{d}{dt}\\vec{r}\\,(u(t),v(t))\\right\\|\\,dt \\\\ &= \\int_a^b \\sqrt{u'(t)^2\\,\\vec{r}_u\\cdot\\vec{r}_u + 2u'(t)v'(t)\\, \\vec{r}_u\\cdot\\vec{r}_v+ v'(t)^2\\,\\vec{r}_v\\cdot\\vec{r}_v}\\,\\,\\, dt. \\end{array}\\\\";
latex += "\\end{array}";
render(wrapLatexInSampleMarkdown(latex));
render(wrapLatexInSampleMarkdown(LATEX_ARRAY));
}
private void longDivision() {
String latex = "\\text{A long division \\longdiv{12345}{13}";
render(wrapLatexInSampleMarkdown(latex));
render(wrapLatexInSampleMarkdown(LATEX_LONG_DIVISION));
}
private void bangle() {
String latex = "{a \\bangle b} {c \\brace d} {e \\brack f} {g \\choose h}";
render(wrapLatexInSampleMarkdown(latex));
render(wrapLatexInSampleMarkdown(LATEX_BANGLE));
}
private void boxes() {
String latex = "\\begin{array}{cc}";
latex += "\\fbox{\\text{A framed box with \\textdbend}}&\\shadowbox{\\text{A shadowed box}}\\cr";
latex += "\\doublebox{\\text{A double framed box}}&\\ovalbox{\\text{An oval framed box}}\\cr";
latex += "\\end{array}";
render(wrapLatexInSampleMarkdown(latex));
render(wrapLatexInSampleMarkdown(LATEX_BOXES));
}
private void insideBlockQuote() {
@ -82,6 +95,22 @@ public class LatexActivity extends ActivityWithMenuOptions {
render(md);
}
private void legacy() {
final String md = wrapLatexInSampleMarkdown(LATEX_BANGLE);
final Markwon markwon = Markwon.builder(this)
// LEGACY does not require inline parser
.usePlugin(JLatexMathPlugin.create(textView.getTextSize(), builder -> {
builder.renderMode(JLatexMathPlugin.RenderMode.LEGACY);
builder.theme()
.backgroundProvider(() -> new ColorDrawable(0x100000ff))
.padding(JLatexMathTheme.Padding.all(48));
}))
.build();
markwon.setMarkdown(textView, md);
}
@NonNull
private static String wrapLatexInSampleMarkdown(@NonNull String latex) {
return "" +
@ -99,6 +128,8 @@ public class LatexActivity extends ActivityWithMenuOptions {
final Resources r = getResources();
final Markwon markwon = Markwon.builder(this)
// NB! `MarkwonInlineParserPlugin` is required in order to parse inlines
.usePlugin(MarkwonInlineParserPlugin.create())
.usePlugin(JLatexMathPlugin.create(textSize, textSize * 1.25F, builder -> {
builder.theme()
.inlineBackgroundProvider(() -> new ColorDrawable(0x1000ff00))