用于解析 markdown 的 Commonmarks 库:如何解析三个刻度
Commonmarks library for parsing markdown: how to parse three ticks
我有这个代码:
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>
}
}
所以可以看出,它用 <code>
标签替换了 one-tick 和 three-ticks。但是,我希望它用 <pre>
标记替换三刻度。有什么办法可以做到这一点?我只在他们的 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
的字符串是否符合 <pre>
标记。
怎么转
"*`Yes.` This* **is** ```\nSparta```"
进入
<p><em><code>Yes.</code> This</em> <strong>is</strong> <pre> Sparta</pre></p>
?
请注意,有两种不同类型的内容可以用 3 个刻度包围:
- Code spans 可以用任意数量的反引号分隔,包括三个,只要开始和结束数字匹配。代码跨度不是块级的,只包含在
<code>
标签中
- Fenced code blocks,这需要三个或更多的反引号,并且必须被换行符包围并且分隔符必须单独在行上。受防护的代码块是块级别的,并被包裹在
<pre><code>
标签中。
我想您指的是受保护的代码块。请注意,它们需要您在字符串中拥有的更多换行符。因此,您的字符串被正确地解析为代码跨度。如果您希望被 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>
请注意,如果您删除任何一个换行符,则它会被视为一个代码跨度,而不是一个围栏代码块。
我有这个代码:
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>
}
}
所以可以看出,它用 <code>
标签替换了 one-tick 和 three-ticks。但是,我希望它用 <pre>
标记替换三刻度。有什么办法可以做到这一点?我只在他们的 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
的字符串是否符合 <pre>
标记。
怎么转
"*`Yes.` This* **is** ```\nSparta```"
进入
<p><em><code>Yes.</code> This</em> <strong>is</strong> <pre> Sparta</pre></p>
?
请注意,有两种不同类型的内容可以用 3 个刻度包围:
- Code spans 可以用任意数量的反引号分隔,包括三个,只要开始和结束数字匹配。代码跨度不是块级的,只包含在
<code>
标签中 - Fenced code blocks,这需要三个或更多的反引号,并且必须被换行符包围并且分隔符必须单独在行上。受防护的代码块是块级别的,并被包裹在
<pre><code>
标签中。
我想您指的是受保护的代码块。请注意,它们需要您在字符串中拥有的更多换行符。因此,您的字符串被正确地解析为代码跨度。如果您希望被 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>
请注意,如果您删除任何一个换行符,则它会被视为一个代码跨度,而不是一个围栏代码块。