/* * Copyright 2020 White Magic Software, Ltd. * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * o Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.scrivenvar.processors.markdown; import com.scrivenvar.processors.markdown.tex.TeXInlineDelimiterProcessor; import com.scrivenvar.processors.markdown.tex.TeXNodeRenderer; import com.vladsch.flexmark.html.HtmlRenderer; import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.util.data.MutableDataHolder; import org.jetbrains.annotations.NotNull; import static com.vladsch.flexmark.html.HtmlRenderer.HtmlRendererExtension; import static com.vladsch.flexmark.parser.Parser.ParserExtension; /** * Responsible for wrapping delimited TeX code in Markdown into an XML element * that the HTML renderer can handle. For example, {@code $E=mc^2$} becomes * {@code <tex>E=mc^2</tex>} when passed to HTML renderer. The HTML renderer * is responsible for converting the TeX code for display. This avoids inserting * SVG code into the Markdown document, which the parser would then have to * iterate---a <em>very</em> wasteful operation that impacts front-end * performance. */ public class TeXExtension implements ParserExtension, HtmlRendererExtension { /** * Creates an extension capable of handling delimited TeX code in Markdown. * * @return The new {@link TeXExtension}, never {@code null}. */ public static TeXExtension create() { return new TeXExtension(); } /** * Force using the {@link #create()} method for consistency. */ private TeXExtension() { } /** * Adds the TeX extension for HTML document export types. * * @param builder The document builder. * @param rendererType Indicates the document type to be built. */ @Override public void extend( @NotNull final HtmlRenderer.Builder builder, @NotNull final String rendererType ) { if( "HTML".equalsIgnoreCase( rendererType ) ) { builder.nodeRendererFactory( new TeXNodeRenderer.Factory() ); } } @Override public void extend( final Parser.Builder builder ) { builder.customDelimiterProcessor( new TeXInlineDelimiterProcessor() ); } @Override public void rendererOptions( @NotNull final MutableDataHolder options ) { } @Override public void parserOptions( final MutableDataHolder options ) { } }