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"
]