{-# LANGUAGE CPP               #-}
{-# LANGUAGE OverloadedStrings #-}

module Text.Pandoc.Filter.EmphasizeCode.Latex
  ( Latex(Latex)
  ) where
#if MIN_VERSION_base(4,8,0)
import           Data.Semigroup                              ((<>))
#else
import           Control.Applicative
import           Data.Monoid
#endif
import           Data.Char                                   (isSpace)
import qualified Data.Text                                   as Text
import qualified Text.Pandoc.Definition                      as Pandoc

import           Text.Pandoc.Filter.EmphasizeCode.Chunking
import           Text.Pandoc.Filter.EmphasizeCode.Renderable

data Latex =
  Latex

instance Renderable Latex where
  renderEmphasized _ (_, classes, _) lines' =
    Pandoc.RawBlock
      (Pandoc.Format "latex")
      (Text.unpack (encloseInVerbatim emphasized))
    where
      languageAttr =
        case classes of
          [lang] -> ",language=" <> Text.pack lang
          _      -> ""
      encloseInTextIt t
        | Text.null t = t
        | otherwise = "£\\CodeEmphasis{" <> t <> "}£"
      emphasizeNonSpace t
        | Text.null t = t
        | otherwise =
          let (nonSpace, rest) = Text.break isSpace t
              (spaces, rest') = Text.span isSpace rest
          in mconcat [encloseInTextIt nonSpace, spaces, emphasizeNonSpace rest']
      emphasizeChunk chunk =
        case chunk of
          Literal t    -> t
          Emphasized t -> emphasizeNonSpace t
      emphasized = Text.unlines (map (foldMap emphasizeChunk) lines')
      encloseInVerbatim t =
        mconcat
          [ "\\begin{lstlisting}[escapechar=£"
          , languageAttr
          , "]\n"
          , t
          , "\\end{lstlisting}\n"
          ]