В yesod (haskell), как мне загрузить простой файл в формате html (не деревню) как виджет?

Как загрузить простой файл в формате html (не в формате деревушки) как виджет? Другими словами, я ищу HTML-эквивалент:

toWidget $(whamletFile "test.hamlet")

1 ответ

Решение

Для этого вы используете sendFile в вашей функции обработчика ( см. ее определение)

Первый аргумент - Mime Type, а второй - путь к файлу.

Например, вы можете написать что-то вроде:

getMyFileR :: Handler ()
getMyFileR = sendFile "text/html" "myfile.html"

Вот еще один пример. Скажем, у меня есть следующая модель:

Resource
    filename    FilePath
    mimetype    ContentType

    deriving    Typeable

Обработчик может выглядеть так:

resourceDirectory :: FilePath
resourceDirectory = "resource"

getResourceGetR :: ResourceId -> Handler ()
getResourceGetR resourceId = do
    resource <- runDB $ get404 resourceId

    sendFile (resourceMimetype resource)
             (resourceDirectory </> unpack (resourceFilename resource))

Редактировать 2015-06-05

sendFile работает на низком уровне, в то время как addScript или же $(widgetFile …) работает на более высоком уровне.

$(widgetFile …) использует TemplateHaskell для преобразования ваших шаблонов Hamlet/Cassius/Lucius/Julius в реальный исходный код Haskell до компиляции вашего проекта. То же самое относится и к [hamlet|…|],

addScriptработает с Route в то время как sendFile работает с FilePath, Это означает addScript сможет обнаружить отсутствующие файлы во время компиляции. sendFile обнаружит отсутствующие файлы во время выполнения.

Есть несколько инструментов для преобразования Html в Hamlet:

Эквивалент addScript для html файлов не имеет смысла: addScript будет генерировать script тег, чтобы сообщить браузеру о загрузке внешнего ресурса. Это не относится к HTML-файлу.

import Import
import Text.Blaze.Html       (preEscapedToHtml)
import Text.Shakespeare.Text (stextFile)

myWidget :: Widget
myWidget = toWidget . preEscapedToHtml $ $(stextFile "templates/some-file.html")
Другие вопросы по тегам