module Text.Pandoc.Filter.EmphasizeCode.Html ( EmphasisTag (..) , Html(Html) ) where import Data.List (intersperse) import qualified Data.Text as Text import qualified Data.Text.Lazy as TextLazy import qualified Lucid as Html import qualified Text.Pandoc.Definition as Pandoc import Text.Pandoc.Filter.EmphasizeCode.Chunking import Text.Pandoc.Filter.EmphasizeCode.Renderable data EmphasisTag = Em | Mark newtype Html = Html EmphasisTag emphasisElement :: EmphasisTag -> Html.Html () -> Html.Html () emphasisElement Em = Html.em_ emphasisElement Mark = Html.mark_ emphasizeChunkHtml :: EmphasisTag -> LineChunk -> Html.Html () emphasizeChunkHtml tag chunk = case chunk of Literal t -> Html.toHtml t Emphasized t -> emphasisElement tag (Html.toHtml t) instance Renderable Html where renderEmphasized (Html tag) (_, classes, _) lines' = Pandoc.RawBlock (Pandoc.Format "html") (TextLazy.unpack (Html.renderText emphasized)) where classAttrs = if null classes then [] else [Html.class_ (Text.pack (unwords classes))] emphasized = Html.pre_ classAttrs $ Html.code_ $ mconcat (intersperse (Html.toHtmlRaw "\n") (map (foldMap (emphasizeChunkHtml tag)) lines'))