Рендеринг статического HTML с помощью hamlet

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

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


person Uli Köhler    schedule 23.01.2014    source источник


Ответы (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-код приветствия.

person Uli Köhler    schedule 23.01.2014