Рендеринг статического 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
вместо String
Text.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.