module Text.Pandoc.Filter.EmphasizeCode.Html
  ( 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 Html =
  Html

emphasizeChunkHtml :: LineChunk -> Html.Html ()
emphasizeChunkHtml chunk =
  case chunk of
    Literal t -> Html.toHtml t
    Emphasized t -> Html.em_ (Html.toHtml t)

instance Renderable Html where
  renderEmphasized _ (_, 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.br_ []) (map (foldMap emphasizeChunkHtml) lines'))