【问题标题】:Commonmarks library for parsing markdown: how to parse three ticks解析markdown的Commonmarks库:如何解析三个刻度
【发布时间】:2020-01-07 19:57:17
【问题描述】:

我有这个代码:

public class TestCommons {
    public static void main(String[] args) {

        Parser parser = Parser.builder().build();
        Node document = parser.parse("*`Yes.` This* **is** ```\nSparta```");
        HtmlRenderer renderer = HtmlRenderer.builder().build();
        System.out.println(renderer.render(document));  //<p><em><code>Yes.</code> This</em> <strong>is</strong> <code> Sparta</code></p>
        }
}

因此可以看出,它用&lt;code&gt; 标记替换了一个标记和三个标记。但是,我希望它用&lt;pre&gt; 标签替换三个刻度。有什么办法可以做到这一点?我只在他们的 github 上找到了这个例子:

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("*`Yes.` This* **is** ```\nSparta```");
renderer.render(document);
//<p><em><code>Yes.</code> This</em> <strong>is</strong> <code> Sparta</code></p>

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();
    }
}

但它给出了相同的结果,并且似乎只区分前面有多个 /n 的字符串作为 &lt;pre&gt; 标记的限定符。

怎么转

"*`Yes.` This* **is** ```\nSparta```"

进入

<p><em><code>Yes.</code> This</em> <strong>is</strong> <pre> Sparta</pre></p>

?

【问题讨论】:

    标签: java parsing markdown commonmark


    【解决方案1】:

    请注意,有两种不同类型的内容可以被 3 个刻度包围:

    1. Code spans 可以由任意数量的反引号分隔,包括三个,只要开头和结尾的数字匹配。代码跨度不是块级的,仅包含在 &lt;code&gt; 标记中
    2. Fenced code blocks,需要三个或更多反引号,并且必须被换行符包围,并且分隔符必须自己在线。 Fenced 代码块是块级的,并被包裹在 &lt;pre&gt;&lt;code&gt; 标记中。

    我想您指的是围栏代码块。请注意,它们需要您在字符串中拥有的更多换行符。因此,您的字符串被正确地解析为代码跨度。如果您希望被 3 个反引号包围的代码被识别为受保护的代码块,您需要添加一些额外的换行符:

    "*`Yes.` This* **is** \n```\nSparta\n```"
    

    或者,作为格式化字符串:

    *`Yes.` This* **is** 
    ```
    Sparta
    ```
    

    上面的内容会被 Commonmark 解析为:

    <p><em><code>Yes.</code> This</em>  <strong>is</strong>
    </p>
    <pre><code>Sparta
    </code></pre>
    

    请注意,如果您删除了任何一个换行符,那么它将被视为代码跨度而不是受保护的代码块。

    【讨论】:

    • 感谢您的回答。我正在尝试解析不和谐的消息,这允许 3-ticks 代码块不从新行开始。很遗憾,commonmarks 不允许这样做,但是您的回答帮助我更好地理解了该库。
    • 据我了解,discord 的语法是 not Markdown。然而,它足够接近人们认为它是。 Markdown 比 Discord 要老得多。不幸的是 DIScord 的选择,而不是 Markdown 的选择。
    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2021-12-18
    • 2016-09-20
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多