comatlassiancommonmarkcommonmark0131库实现代码块主题高亮
要在使用com.atlassian.commonmark:commonmark:0.13.1库时实现代码块主题高亮,可以通过使用highlight.js库来实现。以下是实现的示例代码:
- 添加highlight.js库的依赖:
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>highlight.js</artifactId>
<version>10.6.0</version>
</dependency>
- 创建自定义的代码块渲染器:
import org.commonmark.node.Code;
import org.commonmark.renderer.html.HtmlNodeRendererContext;
import org.commonmark.renderer.html.HtmlWriter;
import org.commonmark.renderer.html.HtmlWriterFactory;
import org.commonmark.renderer.html.NodeRenderer;
import org.commonmark.renderer.html.NodeRendererContext;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class CodeBlockRenderer implements NodeRenderer {
private final HtmlWriter html;
private final Set<String> languages;
public CodeBlockRenderer(HtmlNodeRendererContext context) {
this.html = context.getWriter();
this.languages = new HashSet<>(Arrays.asList("java", "python", "javascript"));
}
@Override
public Set<Class<? extends Code>> getNodeTypes() {
return new HashSet<>(Arrays.asList(Code.class));
}
@Override
public void render(Code node, NodeRendererContext context) {
String language = node.getInfo();
if (language == null || !languages.contains(language.toLowerCase())) {
language = "plaintext";
}
html.line();
html.tag("pre");
html.tag("code", "class", "hljs " + language);
html.raw(highlight(node.getLiteral()));
html.tag("/code");
html.tag("/pre");
html.line();
}
private String highlight(String code) {
return "<script>hljs.highlightBlock(document.currentScript.previousElementSibling);</script>"
+ "<pre>" + code + "</pre>";
}
}
- 创建自定义的HtmlWriter工厂类:
import org.commonmark.renderer.html.HtmlNodeRendererContext;
import org.commonmark.renderer.html.HtmlWriter;
import org.commonmark.renderer.html.HtmlWriterFactory;
public class CodeBlockWriterFactory implements HtmlWriterFactory {
@Override
public HtmlWriter create(HtmlNodeRendererContext context) {
return new CodeBlockWriter(context);
}
}
- 创建自定义的HtmlWriter类:
import org.commonmark.renderer.html.HtmlNodeRendererContext;
import org.commonmark.renderer.html.HtmlWriter;
public class CodeBlockWriter extends HtmlWriter {
public CodeBlockWriter(HtmlNodeRendererContext context) {
super(context.getHtmlWriterFactory().create(context));
}
@Override
public void tag(String tagName, HtmlRenderer.TagType type) {
if (tagName.equals("pre")) {
super.tag(tagName, type, "class", "hljs");
} else {
super.tag(tagName, type);
}
}
}
- 使用自定义的代码块渲染器和HtmlWriter工厂类渲染Markdown:
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
public class MarkdownRenderer {
public static String render(String markdown) {
Parser parser = Parser.builder().build();
Node document = parser.parse(markdown);
HtmlRenderer renderer = HtmlRenderer.builder()
.nodeRendererFactory(context -> new CodeBlockRenderer(context))
.escapeHtml(true)
.softbreak("<br/>")
.build();
return renderer.render(document);
}
}
现在,使用MarkdownRenderer.render()方法渲染Markdown时,就能够实现代码块主题高亮了。
原文地址: https://www.cveoy.top/t/topic/brji 著作权归作者所有。请勿转载和采集!