要在使用com.atlassian.commonmark:commonmark:0.13.1库时实现代码块主题高亮,可以通过使用highlight.js库来实现。以下是实现的示例代码:

  1. 添加highlight.js库的依赖:
<dependency>
    <groupId>org.webjars.npm</groupId>
    <artifactId>highlight.js</artifactId>
    <version>10.6.0</version>
</dependency>
  1. 创建自定义的代码块渲染器:
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>";
    }
}

  1. 创建自定义的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);
    }
}

  1. 创建自定义的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);
        }
    }
}

  1. 使用自定义的代码块渲染器和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时,就能够实现代码块主题高亮了。

comatlassiancommonmarkcommonmark0131库实现代码块主题高亮

原文地址: https://www.cveoy.top/t/topic/brji 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录