Я хотел бы добавить Lucid в defaultLayout Yesod

Я пытаюсь иметь динамический HTML-идентификатор для использования модалов.

В основном мои проблемы были бы решены, если бы Гамлет принял что-то вроде [hamlet| <div .modal .fade ##{modalIdFunction i}> |]

Так как я не смог сделать это в Гамлете, я пытаюсь сделать это с Lucid, но это несовместимо с defaultLayout Yesod.

вот мое намерение:

getSupportR :: CustomerId -> Handler LucidHtml
getSupportR customerId = do
 defaultLayout $ do
    setTitle "Your Licenses"
    toWidget . lucid $ \url ->
      p_ $ a_ [href_ "\\"] "Link to root"

это сообщение об ошибке:

• Couldn't match type ‘blaze-markup-0.8.2.1:Text.Blaze.Internal.MarkupM
                             ()’
                     with ‘HtmlT Identity ()’
      Expected type: HandlerFor App LucidHtml
        Actual type: HandlerFor App Html

Есть ли способ преобразовать LucidHtml Lucid в Blaze's Html?

Весь мой код находится по адресу: https://github.com/hhefesto/laurus-nobilis а соответствующие файлы: /src/Yesod/Lucid.hs и /src/Handler/Support.hs

2 ответа

Решение

С ясным Html и пылают Html это совершенно разные типы, ваш единственный способ - это отобразить один как текст и вставить его как предварительно экранированный HTML в другой. Что-то вроде Blaze.preEscapedToHtml . Lucid.renderText,

Просто для полноты, вот ответ arrowd, интегрированный в код:

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}

module Handler.Support where

import           Import hiding
import           Yesod.Lucid
import           Lucid hiding (Html)
import qualified Lucid as L
import           Text.Blaze.Html

getSupportR :: CustomerId -> Handler Html
getSupportR customerId = do
  lucidHtml <- lucid $ \url ->
    p_ $ a_ [href_ "\\"] "link to root"
  defaultLayout $ do
    setTitle "Your Licenses"
    toWidget . preEscapedToHtml . renderText $ lucidHtml
Другие вопросы по тегам