我需要一种开放格式来以通用方式(使用占位符/变量)编写故事。为了使故事具体化,我想设置一个键/值对列表并在发布时应用它们。我还想将样式与内容分开,这样我就可以轻松发布到网络、pdf 等。
示例:
@varname@ is a great place.
我选择 Markdown 来解决内容/样式分离的问题,但我不知道一种简单的方法来参数化文本的某些部分,并在使用 pandoc 这样的工具生成 html/pdf 输出时填充它们。
有什么建议吗?这可以用 markdown 来完成吗?或者有合适的 markdown 扩展吗?
就我个人而言,我会使用类似
sed
,甚至funnelweb
之类的东西,但你可以使用pandoc过滤器来做到这一点,无论是在haskell中还是(可能更容易)使用pandocfilters
可用的python库这里
对于网络,您可以使用 Jekyll 模板与 Liquid。转换为 HTML 时,会解释由双括号
{{}}
包围的复杂表达式。示例(来自链接):
{{ site.time | date_to_string }}
2008 年 11 月 7 日
我认为也可以定义自定义变量。
Pandoc 的 Markdown 允许嵌入原始 LaTeX,甚至替换简单的定义,可以使用 Lua 过滤器 来利用。例如;
\def\varname{Berlin}
\varname is a great place.
生成 PDF 输出时将立即工作。
下面是一个 Lua 过滤器,它使这个技巧适用于所有输出格式:
-- file: tex-macros.lua
function RawInline (r)
-- Inline expanded TeX commands.
if r.format == 'tex' and r.text:match '^[^\\]' then
return pandoc.Str(r.text)
end
end
通过
--lua-filter
(或 -L
)命令行选项传递它来使用它:
pandoc --lua-filter tex-macros.lua ...
一个简单的方法是使用 CSS 类作为定义,使用 HTML 标签作为占位符。只需在文档中的任意位置编写自定义样式或将其添加到渲染器中即可:
<style>
area.varname1::after{content: "Berlin";}
area.varname2::after{content: "Budapest";}
...
</style>
style
块不会被渲染,但在文档中使用空 content
HTML 标记和正确的 area
时,它将显示变量的 class
。例如,如果你写:
<area class="varname1"> is a great place.
You should also see <area class="varname2"> one day.
Trains go to <area class="varname2"> from <area class="varname1"> regularly.
将渲染为:
Berlin is a great place.
You should also see Budapest one day.
Trains go to Budapest from Berlin regularly.
这个技巧之所以有效,是因为 Markdown 处理器使用 HTML。
area
标签非常适合此目的,因为它受到广泛支持,很少在 Markdown 中使用,很短并且可以为空。 ::after
CSS 选择器会插入 content
,就像它最初写在那里一样,因此所有 Markdown 格式都应该有效。例如:**<area class="varname1">**
应变为粗体:Berlin
这个简单的解决方案对于偶尔使用的模板来说有点像黑客,但可能适用于几乎所有开箱即用的 Markdown 设置的任何环境。