настройка вывода HTML Pandoc с помощью CSS или шаблона


У меня есть программа Happstack, которая динамически преобразует документы Markdown в HTML с помощью Text.Pandoc:

import qualified Text.Pandoc as Pandoc
...
    return $ toResponse $ Pandoc.writeHtml Pandoc.def contents

То есть Pandoc возвращает значение Text.Blaze.Html.Html. (У этого есть экземпляр ToMessage, который означает, что его можно использовать в качестве ответа на запрос.)

Как вставить пользовательскую таблицу стилей CSS в вывод Pandoc? Что делать, если я хочу настроить HTML, например, обернув содержимое <body> с некоторыми другими элементами?

2 2

2 ответа:

Когда опция 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 "..."

Pandoc, при запуске из командной строки, принимает некоторые аргументы, которые позволяют вставить что-то в тег<head> (-H), Перед content (-B) и после content ( - A ). Я не знаю о Happstack, но наверняка должен быть способ передать эти параметры в Pandoc.writeHtml