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'))