В 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:
- однострочный скрипт (который хорошо работает для простого HTML),
- html2hamlet.
Эквивалент 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")