Pandoc能否标记代码块内的文本?

3

我在Markdown文档中使用<mark>...</mark>来突出显示文本,例如Google Python风格指南。 我很难强调代码。 例如,我想突出显示如何用类型注释:

```python
<mark>def func(a: int) -> List[int]:</mark>
```

但是这个Pandoc命令:

pandoc -s -t html5 -o "Google Python style guide.html" "Google Python style guide.md"

显示 <mark></mark> 作为代码,而不呈现HTML高亮。

一种解决方法是使用 pre 标签,例如:

<pre><mark>def func(a: int) -> List[int]:</mark></pre>

这个功能可以渲染HTML高亮显示。

在不将所有```python块转换为pre标签的情况下,Pandoc是否可以渲染HTML高亮显示?

2个回答

3
不,pandoc默认情况下无法识别<mark>是否是您代码的一部分。
但是,您可以编写一个pandoc过滤器,匹配每个代码块并将其转换为原始HTML块。例如(未经测试):
function CodeBlock(elem)
  html = "<pre>" .. elem.text .. "</pre>"
  return pandoc.RawBlock("html", html)
end

请注意,您需要确保代码块中没有其他未转义的HTML内容。 更新 如果您还想要语法高亮显示,可能需要尝试pandoc-emphasize-code过滤器

我测试了一下,它可以正常工作,谢谢!这个结果就像我将三引号代码块转换为 pre 标签一样,所以 HTML 就失去了语法高亮。我从未编写过 Lua 代码:它能过滤标记并仍然突出显示块中的代码吗? - miguelmorin
1
那似乎很难做,因为您不希望语法突出显示器考虑<mark>。也许您应该采用另一种方法,如 https://owickstrom.github.io/pandoc-emphasize-code/。 - mb21
这非常优雅,可以用于位置(尽管还不能用于整行,请参见GitHub问题)。您能否同时使其与Python语法高亮显示一起工作?我可以获得Pandoc语法高亮显示或HTML标记标签,但不能同时获得两者。 - miguelmorin
我决定使用 pandoc-emphasize 代码过滤器,因为这种方法保持了语法高亮,可以精确地在一行内进行高亮,并且是最易维护的。 - miguelmorin

1
如果您想始终标记整行,则可以使用CSS来实现。
应该给代码块分配一个ID,以便更容易地定位它。
``` {#types-demo .python}
def func(a: int) -> List[int]:
   return [a]
```

要突出显示第一行,在您的文档中包含以下内容:

```{=html}
<style>
#types-demo-1 {
    background-color: #ff0;
} 
</style>
```

语法高亮应该继续工作。


这是一种优雅的方法,如果想要保持尽可能多的CSS样式来突出显示不同的行,比如使用样式#types-demo-N来突出显示第N行。 - miguelmorin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接