使用 CSS 或模板自定义 Pandoc 的 HTML 输出

daf*_*daf 4 haskell pandoc

我有一个 Happstack 程序,它使用Text.Pandoc以下命令将 Markdown 文档动态转换为 HTML :

import qualified Text.Pandoc as Pandoc
...
    return $ toResponse $ Pandoc.writeHtml Pandoc.def contents
Run Code Online (Sandbox Code Playgroud)

即 Pandoc 正在返回一个Text.Blaze.Html.Html值。(这有一个ToMessage实例,这意味着它可以用作对请求的响应。)

如何在 Pandoc 的输出中插入自定义 CSS 样式表?如果我想自定义 HTML,例如通过<body>用一些其他元素包装内容怎么办?

daf*_*daf 5

当启用 Pandoc 的“独立模式”选项时,它使用模板来格式化输出。模板及其替换变量可以在writerTemplate和 的writerVariables成员中设置WriterOptions

命令行工具有一组它使用的默认模板。您可以使用例如查看格式的默认模板pandoc -D html

使用库时,默认使用空模板。您可以使用 以编程方式获取默认模板getDefaultTemplate

下面是一些示例代码:

import Text.Blaze.Html.Renderer.String
import Text.Pandoc

getHtmlOpts = do
    template <- either (error . show) id
        `fmap` getDefaultTemplate Nothing "html"
    return $ def
        { writerStandalone = True
        , writerTemplate = template
        , writerVariables = [
            ("css", "/path/to/style.css"),
            ("header-includes",
             "<style>p { background-color: magenta; }</style>")]
        }

main = do
    opts <- getHtmlOpts
    putStrLn $ renderHtml $ writeHtml opts $ readMarkdown def "..."
Run Code Online (Sandbox Code Playgroud)

  • 我正在与 &lt;h1 class="title"&gt; 块作斗争,因为我不想修改我的 Markdown 文件,但仍然想正确添加 &lt;title&gt; 元素...使用 `pandoc -D html &gt; template.html ` 然后根据我的口味修改模板(主要是在 `title-block-header` 元素中添加 `style="display:none"` ,并使用 `pandoc -s --template ./template.html --metadata 进行编译title="$title" "$oldname" -o "$newname"` 解决了我所有的戏剧。 (2认同)