| Author | DaveJarvis <email> |
|---|---|
| Date | 2020-09-13 14:23:16 GMT-0700 |
| Commit | 4605e31c79ff888d1e9d68dab577b3db705bd2f4 |
| Parent | 8171250 |
| Delta | 132 lines added, 41 lines removed, 91-line increase |
| +package com.scrivenvar.processors.markdown.tex; | ||
| + | ||
| +import com.vladsch.flexmark.parser.InlineParser; | ||
| +import com.vladsch.flexmark.parser.core.delimiter.Delimiter; | ||
| +import com.vladsch.flexmark.parser.delimiter.DelimiterProcessor; | ||
| +import com.vladsch.flexmark.parser.delimiter.DelimiterRun; | ||
| +import com.vladsch.flexmark.util.ast.Node; | ||
| + | ||
| +public class TeXInlineDelimiterProcessor implements DelimiterProcessor { | ||
| + | ||
| + @Override | ||
| + public void process( final Delimiter opener, final Delimiter closer, | ||
| + final int delimitersUsed ) { | ||
| + final var node = new TeXNode(); | ||
| + opener.moveNodesBetweenDelimitersTo(node, closer); | ||
| + } | ||
| + | ||
| + @Override | ||
| + public char getOpeningCharacter() { | ||
| + return '$'; | ||
| + } | ||
| + | ||
| + @Override | ||
| + public char getClosingCharacter() { | ||
| + return '$'; | ||
| + } | ||
| + | ||
| + @Override | ||
| + public int getMinLength() { | ||
| + return 1; | ||
| + } | ||
| + | ||
| + /** | ||
| + * Allow for $ or $$. | ||
| + * | ||
| + * @param opener One or more opening delimiter characters. | ||
| + * @param closer One or more closing delimiter characters. | ||
| + * @return The number of delimiters to use to determine whether a valid | ||
| + * opening delimiter expression is found. | ||
| + */ | ||
| + @Override | ||
| + public int getDelimiterUse( | ||
| + final DelimiterRun opener, final DelimiterRun closer ) { | ||
| + return 1; | ||
| + } | ||
| + | ||
| + @Override | ||
| + public boolean canBeOpener( final String before, | ||
| + final String after, | ||
| + final boolean leftFlanking, | ||
| + final boolean rightFlanking, | ||
| + final boolean beforeIsPunctuation, | ||
| + final boolean afterIsPunctuation, | ||
| + final boolean beforeIsWhitespace, | ||
| + final boolean afterIsWhiteSpace ) { | ||
| + return leftFlanking; | ||
| + } | ||
| + | ||
| + @Override | ||
| + public boolean canBeCloser( final String before, | ||
| + final String after, | ||
| + final boolean leftFlanking, | ||
| + final boolean rightFlanking, | ||
| + final boolean beforeIsPunctuation, | ||
| + final boolean afterIsPunctuation, | ||
| + final boolean beforeIsWhitespace, | ||
| + final boolean afterIsWhiteSpace ) { | ||
| + return rightFlanking; | ||
| + } | ||
| + | ||
| + @Override | ||
| + public Node unmatchedDelimiterNode( | ||
| + final InlineParser inlineParser, final DelimiterRun delimiter ) { | ||
| + return null; | ||
| + } | ||
| + | ||
| + @Override | ||
| + public boolean skipNonOpenerCloser() { | ||
| + return false; | ||
| + } | ||
| +} | ||
| +package com.scrivenvar.processors.markdown.tex; | ||
| + | ||
| +import com.vladsch.flexmark.ast.DelimitedNodeImpl; | ||
| + | ||
| +public class TeXNode extends DelimitedNodeImpl { | ||
| + | ||
| + public TeXNode() { | ||
| + } | ||
| + | ||
| +} | ||
| +package com.scrivenvar.processors.markdown.tex; | ||
| + | ||
| +import com.vladsch.flexmark.html.HtmlWriter; | ||
| +import com.vladsch.flexmark.html.renderer.NodeRenderer; | ||
| +import com.vladsch.flexmark.html.renderer.NodeRendererContext; | ||
| +import com.vladsch.flexmark.html.renderer.NodeRendererFactory; | ||
| +import com.vladsch.flexmark.html.renderer.NodeRenderingHandler; | ||
| +import com.vladsch.flexmark.util.data.DataHolder; | ||
| +import org.jetbrains.annotations.NotNull; | ||
| +import org.jetbrains.annotations.Nullable; | ||
| + | ||
| +import java.util.HashSet; | ||
| +import java.util.Set; | ||
| + | ||
| +public class TeXNodeRenderer implements NodeRenderer { | ||
| + | ||
| + public static class Factory implements NodeRendererFactory { | ||
| + @NotNull | ||
| + @Override | ||
| + public NodeRenderer apply( @NotNull DataHolder options ) { | ||
| + return new TeXNodeRenderer(); | ||
| + } | ||
| + } | ||
| + | ||
| + @Override | ||
| + public @Nullable Set<NodeRenderingHandler<?>> getNodeRenderingHandlers() { | ||
| + final Set<NodeRenderingHandler<?>> set = new HashSet<>(); | ||
| + set.add( new NodeRenderingHandler<>( | ||
| + TeXNode.class, this::render ) ); | ||
| + | ||
| + return set; | ||
| + } | ||
| + | ||
| + private void render( final TeXNode node, | ||
| + final NodeRendererContext context, | ||
| + final HtmlWriter html ) { | ||
| + html.tag( "tex" ); | ||
| + html.raw( node.getText() ); | ||
| + html.closeTag( "tex" ); | ||
| + } | ||
| +} | ||
| -package com.scrivenvar.processors.markdown; | ||
| - | ||
| -import com.vladsch.flexmark.html.HtmlWriter; | ||
| -import com.vladsch.flexmark.html.renderer.NodeRenderer; | ||
| -import com.vladsch.flexmark.html.renderer.NodeRendererContext; | ||
| -import com.vladsch.flexmark.html.renderer.NodeRendererFactory; | ||
| -import com.vladsch.flexmark.html.renderer.NodeRenderingHandler; | ||
| -import com.vladsch.flexmark.util.data.DataHolder; | ||
| -import org.jetbrains.annotations.NotNull; | ||
| -import org.jetbrains.annotations.Nullable; | ||
| - | ||
| -import java.util.HashSet; | ||
| -import java.util.Set; | ||
| - | ||
| -public class TeXNodeRenderer implements NodeRenderer { | ||
| - | ||
| - public static class Factory implements NodeRendererFactory { | ||
| - @NotNull | ||
| - @Override | ||
| - public NodeRenderer apply( @NotNull DataHolder options ) { | ||
| - return new TeXNodeRenderer(); | ||
| - } | ||
| - } | ||
| - | ||
| - @Override | ||
| - public @Nullable Set<NodeRenderingHandler<?>> getNodeRenderingHandlers() { | ||
| - final Set<NodeRenderingHandler<?>> set = new HashSet<>(); | ||
| - set.add( new NodeRenderingHandler<>( | ||
| - TeXNode.class, this::render ) ); | ||
| - | ||
| - return set; | ||
| - } | ||
| - | ||
| - private void render( final TeXNode node, | ||
| - final NodeRendererContext context, | ||
| - final HtmlWriter html ) { | ||
| - html.tag( "tex" ); | ||
| - html.raw( node.getText() ); | ||
| - html.closeTag( "tex" ); | ||
| - } | ||
| -} | ||