blob: 75f6c8df6eb02cb331637f6d726aa12eb95e6f97 [file] [log] [blame]
package eu.mulk.mulkcms2.common.markdown;
import com.vladsch.flexmark.ext.abbreviation.AbbreviationExtension;
import com.vladsch.flexmark.ext.autolink.AutolinkExtension;
import com.vladsch.flexmark.ext.definition.DefinitionExtension;
import com.vladsch.flexmark.ext.footnotes.FootnoteExtension;
import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension;
import com.vladsch.flexmark.ext.tables.TablesExtension;
import com.vladsch.flexmark.ext.typographic.TypographicExtension;
import com.vladsch.flexmark.html.HtmlRenderer;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.util.data.MutableDataSet;
import java.util.Arrays;
import javax.enterprise.context.ApplicationScoped;
import org.jsoup.Jsoup;
import org.jsoup.safety.Safelist;
@ApplicationScoped
public class MarkdownConverter {
private final Parser parser;
private final HtmlRenderer renderer;
public MarkdownConverter() {
var options = new MutableDataSet();
options.set(
Parser.EXTENSIONS,
Arrays.asList(
TablesExtension.create(),
StrikethroughExtension.create(),
AbbreviationExtension.create(),
AutolinkExtension.create(),
DefinitionExtension.create(),
TypographicExtension.create(),
FootnoteExtension.create()));
options.set(Parser.FENCED_CODE_BLOCK_PARSER, true);
options.set(HtmlRenderer.SOFT_BREAK, "\n");
options.set(HtmlRenderer.HARD_BREAK, "<br />\n");
options.set(TypographicExtension.ENABLE_SMARTS, true);
options.set(TypographicExtension.ENABLE_QUOTES, true);
options.set(FootnoteExtension.FOOTNOTE_BACK_REF_STRING, "");
this.parser = Parser.builder(options).build();
this.renderer = HtmlRenderer.builder(options).build();
}
public String htmlify(String markdown) {
var parsedDocument = parser.parse(markdown);
var unsanitizedHtml = renderer.render(parsedDocument);
return Jsoup.clean(unsanitizedHtml, Safelist.relaxed());
}
}