[英]Replace HTML tags using Pandoc Lua filter when converting from markdown to HTML
[英]Convertng Markdown admonition syntax to HTML, using Lua for Pandoc
Markdown 警告语法基于https://python-markdown.github.io/extensions/admonition/ :
!!! note Important note
You should note that the title will be automatically capitalized.
Pandoc 文档的解释和编写都很糟糕。 我用以下问题训练了自己:
我尝试在 Lua 中构建:
function Para (para)
if para.content[1].text == "!!!" and para.content[1].text == "note" then
return pandoc.Plain(
{pandoc.RawInline('html', '<div class="admonition note">')} ..
{pandoc.RawInline('html', '<p class="admonition-title">')} ..
para.content[2].text ..
{pandoc.RawInline('html', '</p>')} ..
para.content[3].text ..
{pandoc.RawInline('html', '</div>')}
)
elseif para.content[1].text == "!!!" and para.content[1].text == "danger" then
return pandoc.Plain(
{pandoc.RawInline('html', '<div class="admonition danger">')} ..
{pandoc.RawInline('html', '<p class="admonition-title">')} ..
para.content[2].text ..
{pandoc.RawInline('html', '</p>')} ..
para.content[3].text ..
{pandoc.RawInline('html', '</div>')}
)
end
end
我希望:
<div class="admonition note">
<p class="admonition-title">Important note</p>
<p>You should note that the title will be automatically capitalized.</p>
</div>
它几乎奏效了,我只是不喜欢para.content[number].text
因为我需要将“重要说明”括起来作为警告标题,并在段落的警告标题之后捕捉整个句子。
function Para(para)
if para.content[1].text == '!!!' and para.content[2].tag == 'Space' and para.content[3].text == 'note' then
return pandoc.RawInline('html',
'<div class="admonition note">'
.. '\n\t' ..
'<p class="admonition-title">'
.. para.content[5].text ..
'</p>'
.. '\n\t' ..
para.content[5].text ..
'\n' ..
'</div>')
elseif para.content[1].text == '!!!' and para.content[2].tag == 'Space' and para.content[3].text == 'danger' then
return pandoc.Emph {pandoc.Str "Danger"}
end
end
这是一个 lua 过滤器,类似于 Python-Markdown 的 Admonition 扩展语法。
您可以使用许多标签(CSS class 名称),并引用标题""
此过滤器的不同之处在于您不能使用缩进,因为 pandoc 不认为应该有缩进,所以如果你使用缩进,pandoc 会渲染得很糟糕。
!!! danger notes "title"
You should note that the title will be automatically capitalized.
```haskell
--code will be rendered
main::IO ()
main = main
```
*Emph string* and **strong string**
!!! important ""
admonition with no title
lua 过滤器
function Para(para)
if para.content[1] and para.content[1].text == '!!!' and
para.content[2] and para.content[2].tag == 'Space' and
para.content[3] and para.content[3].tag == 'Str' then
local text = para.content[3].text -- default title is tag
tags = text
title = string.upper(text)
i = 4
-- parse tags
while para.content[i] and para.content[i].tag ~= 'SoftBreak'
do
-- tags can only be string or spaces
if para.content[i].tag == 'Str' then
tags = tags .. para.content[i].text
elseif para.content[i].tag == 'Space' then
tags = tags .. ' '
-- Quoted is title
elseif para.content[i].tag == 'Quoted' then
title = pandoc.utils.stringify(para.content[i].content)
end
i = i + 1
end
if para.content[i] and para.content[i].tag == 'SoftBreak' then
body = pandoc.List({table.unpack(para.content, i+1)})
else
body = '' -- no body
end
return pandoc.Blocks( -- merge into blocks
{
pandoc.RawInline(
'html','<div class="admonition ' .. tags .. '">' ..
'<p class="admonition-title">' .. title .. '</p>'
),
pandoc.Plain(body),
pandoc.RawInline('html', '</div>')
}
)
end
end
预览输出(第一段)
$ pandoc test.md --lua-filter f.lua
<div class="admonition danger notes "><p class="admonition-title">title</p>
You should note that the title will be automatically capitalized.
</div>
您可以添加样式表,例如H.html
<style>
div.note {
background-color: #24502426;
}
div.danger {
background-color: #8c24047a;
}
p.admonition-title {
font-family: cursive;
}
</style>
然后运行
$ pandoc test.md --lua-filter f.lua -s -o main.html -H H.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.