Рендеринг статического HTML с деревом

Как я могу использовать hamlet фреймворк для генерации статических HTML-страниц изнутри Haskell?

Примечание: этот вопрос намеренно не показывает исследовательские усилия. Что касается моих исследований, см. Ответ в стиле вопросов и ответов ниже.

1 ответ

Решение

hamlet дает QuasiQuoters, которые оцениваются в blaze выражения. С помощью Text.Blaze.Html.Renderer.String.renderHtml Вы можете отобразить их в строку.

Давайте начнем с простого не-HTML примера:

{-# LANGUAGE QuasiQuotes #-}
import Text.Blaze.Html.Renderer.String (renderHtml)
import Text.Hamlet

greet name = [shamlet|Hello world #{name}|]
-- This prints "Hello world John Foo"
main = putStrLn $ renderHtml $ greet "John Foo"

Для повышения эффективности вы также можете использовать Text вместо StringText.Blaze.Html.Renderer.Text.renderHtml

Запись этого в файл не отличается от стандартного подхода на Haskell. Вы можете сделать это, например, с помощью writeFile вместо putStrLn, Вам нужно только изменить последнюю строку

main = do writeFile "greet.txt" $ renderHtml $ greet "John Foo"

Теперь нам нужно только добавить разметку HTML вместо использования простого текста. См. Документацию Шекспира для дальнейшего использования.

{-# LANGUAGE QuasiQuotes #-}
import Text.Blaze.Html.Renderer.String (renderHtml)
import Text.Hamlet

greet name = [shamlet|
                $doctype 5
                <html>
                    <head>
                        <title>Greeting for #{name}
                    <body>
                        <h2>
                            Hello world #{name}|]

main = writeFile "greet.html" $ renderHtml $ greet "John Foo"

greet.html теперь содержит статически отображаемое приветствие HTML.

Другие вопросы по тегам