{-# LANGUAGE OverloadedStrings #-} module Text.Pandoc.Writers.Math ( texMathToInlines , convertMath , defaultMathJaxURL , defaultKaTeXURL ) where import qualified Data.Text as T import Text.Pandoc.Class.PandocMonad import Text.Pandoc.Definition import Text.Pandoc.Logging import Text.TeXMath (DisplayType (..), Exp, readTeX, writePandoc) import Text.Pandoc.Options (defaultMathJaxURL, defaultKaTeXURL) -- | Converts a raw TeX math formula to a list of 'Pandoc' inlines. -- Defaults to raw formula between @$@ or @$$@ characters if entire formula -- can't be converted. texMathToInlines :: PandocMonad m => MathType -> T.Text -- ^ String to parse (assumes @'\n'@ line endings) -> m [Inline] texMathToInlines mt inp = do res <- convertMath writePandoc mt inp case res of Right (Just ils) -> return ils Right Nothing -> do report $ CouldNotConvertTeXMath inp "" return [mkFallback mt inp] Left il -> return [il] mkFallback :: MathType -> T.Text -> Inline mkFallback mt str = Str (delim <> str <> delim) where delim = case mt of DisplayMath -> "$$" InlineMath -> "$" -- | Converts a raw TeX math formula using a writer function, -- issuing a warning and producing a fallback (a raw string) -- on failure. convertMath :: PandocMonad m => (DisplayType -> [Exp] -> a) -> MathType -> T.Text -> m (Either Inline a) convertMath writer mt str = case writer dt <$> readTeX str of Right r -> return (Right r) Left e -> do report $ CouldNotConvertTeXMath str e return (Left $ mkFallback mt str) where dt = case mt of DisplayMath -> DisplayBlock InlineMath -> DisplayInline