1. commonmark-javaJava 的 Markdown 解析器

        聯(lián)合創(chuàng)作 · 2023-09-30 14:40

        commonmark-java 是一個(gè) Markdown 解析器,一個(gè)基于 CommonMark 規(guī)范解析和渲染 Markdown 文本的 Java 庫(kù)。具有以下特性:

        • ?。ㄗ钚』囊蕾嚕?/p>

        • 快 (比 pegdown 快 10-20 倍,在倉(cāng)庫(kù)中可查看 benchmarks)

        • 靈活 (解析后可操作 AST,自定義 HTML 渲染)

        • 可擴(kuò)展(表格,刪除線,自動(dòng)鏈接等等)

        Maven:

        <dependency>
            <groupId>com.atlassian.commonmark</groupId>
            <artifactId>commonmark</artifactId>
            <version>0.9.0</version>
        </dependency>

        解析和渲染成 HTML

        import org.commonmark.node.*;
        import org.commonmark.parser.Parser;
        import org.commonmark.renderer.html.HtmlRenderer;
        
        Parser parser = Parser.builder().build();
        Node document = parser.parse("This is *Sparta*");
        HtmlRenderer renderer = HtmlRenderer.builder().build();
        renderer.render(document);  // "<p>This is <em>Sparta</em></p>\n"

        你也可以對(duì)輸出 HTML 進(jìn)行屬性定制:

        Parser parser = Parser.builder().build();
        HtmlRenderer renderer = HtmlRenderer.builder()
                .attributeProviderFactory(new AttributeProviderFactory() {
                    public AttributeProvider create(AttributeProviderContext context) {
                        return new ImageAttributeProvider();
                    }
                })
                .build();
        
        Node document = parser.parse("![text](/url.png)");
        renderer.render(document);
        // "<p><img src=\"/url.png\" alt=\"text\" class=\"border\" /></p>\n"
        
        class ImageAttributeProvider implements AttributeProvider {
            @Override
            public void setAttributes(Node node, String tagName, Map<String, String> attributes) {
                if (node instanceof Image) {
                    attributes.put("class", "border");
                }
            }
        }

        對(duì)輸出的 HTML 進(jìn)行渲染定制:

        Parser parser = Parser.builder().build();
        HtmlRenderer renderer = HtmlRenderer.builder()
                .nodeRendererFactory(new HtmlNodeRendererFactory() {
                    public NodeRenderer create(HtmlNodeRendererContext context) {
                        return new IndentedCodeBlockNodeRenderer(context);
                    }
                })
                .build();
        
        Node document = parser.parse("Example:\n\n    code");
        renderer.render(document);
        // "<p>Example:</p>\n<pre>code\n</pre>\n"
        
        class IndentedCodeBlockNodeRenderer implements NodeRenderer {
        
            private final HtmlWriter html;
        
            IndentedCodeBlockNodeRenderer(HtmlNodeRendererContext context) {
                this.html = context.getWriter();
            }
        
            @Override
            public Set<Class<? extends Node>> getNodeTypes() {
                // Return the node types we want to use this renderer for.
                return Collections.<Class<? extends Node>>singleton(IndentedCodeBlock.class);
            }
        
            @Override
            public void render(Node node) {
                // We only handle one type as per getNodeTypes, so we can just cast it here.
                IndentedCodeBlock codeBlock = (IndentedCodeBlock) node;
                html.line();
                html.tag("pre");
                html.text(codeBlock.getLiteral());
                html.tag("/pre");
                html.line();
            }
        }
        瀏覽 37
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
          
          

            1. 一区视频在线播放 | 在线视频日本 | 成人黄片免费视频 | 丰满少妇在线观看bd | 婷婷五月激情丁香爱中文 |