Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git

Adds ability to parse Markdown caption syntax

AuthorDaveJarvis <email>
Date2023-11-24 20:51:15 GMT-0800
Commit11a1060f0de88d1b735412fd834d4d2ca6ffd7ef
Parent29c774d
Delta80 lines added, 78 lines removed, 2-line increase
src/test/java/com/keenwrite/processors/markdown/extensions/references/CrossReferencesExtensionTest.java
package com.keenwrite.processors.markdown.extensions.references;
-import com.keenwrite.processors.ProcessorContext;
+import com.keenwrite.processors.markdown.extensions.captions.CaptionExtension;
import com.keenwrite.processors.markdown.extensions.fences.FencedDivExtension;
import com.keenwrite.processors.markdown.extensions.tex.TexExtension;
import static com.keenwrite.ExportFormat.XHTML_TEX;
+import static com.keenwrite.processors.ProcessorContext.Mutator;
+import static com.keenwrite.processors.ProcessorContext.builder;
import static org.junit.jupiter.api.Assertions.assertEquals;
final var hBuilder = HtmlRenderer.builder();
final var extensions = createExtensions();
-
- pBuilder.extensions( extensions );
- hBuilder.extensions( extensions );
-
- final var parser = pBuilder.build();
- final var renderer = hBuilder.build();
+ final var parser = pBuilder.extensions( extensions ).build();
+ final var renderer = hBuilder.extensions( extensions ).build();
final var document = parser.parse( input );
{#fig:cats} [@fig:cats]
{#table:dogs} [@table:dogs]
- {#life:dolphins} [@life:dolphins]
+ {#ocean:whale-01} [@ocean:whale-02]
""",
"""
<p><a data-type="fig" name="cats" /> <a data-type="fig" href="#cats" />
<a data-type="table" name="dogs" /> <a data-type="table" href="#dogs" />
- <a data-type="life" name="dolphins" /> <a data-type="life" href="#dolphins" /></p>
+ <a data-type="ocean" name="whale-01" /> <a data-type="ocean" href="#whale-02" /></p>
+ """
+ ),
+ args(
+ """
+ {#日本:w0mbatß}
+ [@日本:w0mbatß]
+ """,
+ """
+ <p><a data-type="日本" name="w0mbatß" />
+ <a data-type="日本" href="#w0mbatß" /></p>
"""
),
quis nostrud exercitation ullamco laboris nisi ut aliquip
ex ea commodo consequat. <a data-type="fig" href="#cats" /></p>
- """
- ),
- args(
- """
- {#日本:w0mbatß}
- [@日本:w0mbatß]
- """,
- """
- <p><a data-type="日本" name="w0mbatß" />
- <a data-type="日本" href="#w0mbatß" /></p>
"""
),
<p><a data-type="note" href="#advancement" /></p>
<p>To what end?</p>
- """
- ),
- args(
- """
- ![alt text](tunnel)
-
- : Caption {#fig:label}
- """,
- """
- <p><img src="tunnel" alt="alt text" /><a data-type="fig" name="label" /></p>
"""
),
$$E=mc^2$$
- : Caption {#eqn:energy}
+ :: Caption {#eqn:energy}
""",
"""
- <p><tex>$$E=mc^2$$</tex> <a data-type="eqn" name="energy" /></p>
+ <p><tex>$$E=mc^2$$</tex></p>
+ <p><span class="caption">Caption <a data-type="eqn" name="energy" /></span></p>
"""
),
args(
"""
``` haskell
main :: IO ()
```
- : Source code caption {#listing:haskell1}
+ :: Source code caption {#listing:haskell1}
""",
"""
<pre><code class="language-haskell">main :: IO ()
</code></pre>
- <p>: Source code caption <a data-type="listing" name="haskell1" /></p>
+ <p><span class="caption">Source code caption <a data-type="listing" name="haskell1" /></span></p>
+ """
+ ),
+ args(
+ """
+ ::: warning
+ Do not eat processed sugar.
+ :::
+
+ :: Caption {#warning:sugar}
+ """,
+ """
+ <div class="warning">
+ <p>Do not eat processed sugar.</p>
+ </div><p><span class="caption">Caption <a data-type="warning" name="sugar" /></span></p>
+ """
+ ),
+ args(
+ """
+ ![alt text](tunnel)
+
+ :: Caption {#fig:label}
+ """,
+ """
+ <p><img src="tunnel" alt="alt text" /></p>
+ <p><span class="caption">Caption <a data-type="fig" name="label" /></span></p>
+ """
+ ),
+ args(
+ """
+ ![kitteh](placekitten)
+
+ :: Caption **bold** {#fig:label} *italics*
+ """,
+ """
+ <p><img src="placekitten" alt="kitteh" /></p>
+ <p><span class="caption">Caption <strong>bold</strong> <a data-type="fig" name="label" /> <em>italics</em></span></p>
"""
),
> I've traded my halo for horns and a whip.
- : Meschiya Lake - Lucky Devil {#lyrics:blues}
+ :: Meschiya Lake - Lucky Devil {#lyrics:blues}
""",
"""
<blockquote>
<p>I'd like to be the lucky devil who gets to burn with you.</p>
<p>Well, I'm no angel, my wings have been clipped;</p>
<p>I've traded my halo for horns and a whip.</p>
</blockquote>
- <p>: Meschiya Lake - Lucky Devil <a data-type="lyrics" name="blues" /></p>
+ <p><span class="caption">Meschiya Lake - Lucky Devil <a data-type="lyrics" name="blues" /></span></p>
"""
),
args(
"""
| a | b | c |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 5 | 6 |
- : Caption {#tbl:label}
+ :: Caption {#tbl:label}
""",
"""
</tbody>
</table>
- <dd>
- Caption <a data-type="tbl" name="label" />
- </dd>
- """
- ),
- args(
- """
- This is a paragraph of text.
-
- : Defintion list, not a caption. {@note:advancement}
- """,
- """
- <dl>
- <dt>This is a paragraph of text.</dt>
- <dd>
- <p>Caption title. <a data-type="null" name="null" /></p>
- </dd>
- </dl>
+ <p><span class="caption">Caption <a data-type="tbl" name="label" /></span></p>
"""
)
private List<ParserExtension> createExtensions() {
final var extensions = new LinkedList<ParserExtension>();
- final var context = ProcessorContext
- .builder()
- .with( ProcessorContext.Mutator::setExportFormat, XHTML_TEX )
+ final var context = builder()
+ .with( Mutator::setExportFormat, XHTML_TEX )
.build();
extensions.add( TexExtension.create( s -> s, context ) );
extensions.add( CrossReferenceExtension.create() );
extensions.add( DefinitionExtension.create() );
extensions.add( StrikethroughSubscriptExtension.create() );
extensions.add( SuperscriptExtension.create() );
extensions.add( TablesExtension.create() );
extensions.add( FencedDivExtension.create() );
+ extensions.add( CaptionExtension.create() );
return extensions;
src/main/java/com/keenwrite/processors/markdown/extensions/references/AnchorXrefNode.java
* @see AnchorNameNode
*/
-class AnchorXrefNode extends Node implements CrossReferenceNode {
+public class AnchorXrefNode extends Node implements CrossReferenceNode {
private final String mTypeName;
private final String mIdName;
src/main/java/com/keenwrite/processors/markdown/extensions/references/BasedSequenceParser.java
*/
static final String REGEX_INNER =
- "(\\p{Alpha}\\p{Alnum}+):(\\p{Alpha}\\p{Alnum}+)";
+ "(\\p{Alpha}[\\p{Alnum}-_]+):(\\p{Alpha}[\\p{Alnum}-_]+)";
private final String mTypeName;
src/main/java/com/keenwrite/processors/markdown/extensions/fences/FencedDivRenderer.java
/**
- * Responsible for rendering opening and closing fenced div blocks as HTMl
- * div elements.
+ * Responsible for rendering opening and closing fenced div blocks as HTML
+ * {@code div} elements.
*/
class FencedDivRenderer implements NodeRenderer {
+ @Nullable
@Override
- public @Nullable Set<NodeRenderingHandler<?>> getNodeRenderingHandlers() {
+ public Set<NodeRenderingHandler<?>> getNodeRenderingHandlers() {
return Set.of(
new NodeRenderingHandler<>( OpeningDivBlock.class, this::render ),
new NodeRenderingHandler<>( ClosingDivBlock.class, this::render )
);
- }
-
- /**
- * Renders the opening fenced div block as an HTML {@code <div>} element.
- */
- void render( final OpeningDivBlock node,
- final NodeRendererContext context,
- final HtmlWriter html ) {
- node.export( html );
}
/**
- * Renders the closing fenced div block as an HTML {@code </div>} element.
+ * Renders the fenced div block as an HTML {@code <div></div>} element.
*/
- void render( final ClosingDivBlock node,
- final NodeRendererContext context,
- final HtmlWriter html ) {
- node.export( html );
+ void render(
+ final DivBlock node,
+ final NodeRendererContext context,
+ final HtmlWriter html ) {
+ node.write( html );
}
static class Factory implements NodeRendererFactory {
+ @NotNull
@Override
- public @NotNull NodeRenderer apply( @NotNull final DataHolder options ) {
+ public NodeRenderer apply( @NotNull final DataHolder options ) {
return new FencedDivRenderer();
}
src/main/java/com/keenwrite/processors/markdown/extensions/fences/OpeningDivBlock.java
}
- void export( final HtmlWriter html ) {
+ void write( final HtmlWriter html ) {
mAttributes.forEach( html::attr );
html.withAttr().tag( HTML_DIV );