{-# LANGUAGE OverloadedStrings #-}

-- | Provides a function to convert PreLaTeX into LaTeX
module Language.Ltml.ToLaTeX.ToLaTeX (toLaTeX)
where

import qualified Data.Map as Map
import qualified Data.Text as T
import Language.Ltml.AST.Label (Label (Label))
import Language.Ltml.ToLaTeX.LaTeXType (LaTeX (..))
import Language.Ltml.ToLaTeX.PreLaTeXType (PreLaTeX (..))

-- | function to convert the intermediate structure PreLaTeX into actual LaTeX
toLaTeX :: Map.Map Label T.Text -> PreLaTeX -> LaTeX
toLaTeX :: Map Label Text -> PreLaTeX -> LaTeX
toLaTeX Map Label Text
_ (IText Text
t) = Text -> LaTeX
Text Text
t
toLaTeX Map Label Text
_ (IRaw Text
r) = Text -> LaTeX
Raw Text
r
toLaTeX Map Label Text
_ (ICommandS Text
n) = Text -> LaTeX
CommandS Text
n
toLaTeX Map Label Text
m (ICommand Text
n [Text]
opts [PreLaTeX]
args) = Text -> [Text] -> [LaTeX] -> LaTeX
Command Text
n [Text]
opts ((PreLaTeX -> LaTeX) -> [PreLaTeX] -> [LaTeX]
forall a b. (a -> b) -> [a] -> [b]
map (Map Label Text -> PreLaTeX -> LaTeX
toLaTeX Map Label Text
m) [PreLaTeX]
args)
toLaTeX Map Label Text
m (IEnvironment Text
n [Text]
opts [PreLaTeX]
content) = Text -> [Text] -> [LaTeX] -> LaTeX
Environment Text
n [Text]
opts ((PreLaTeX -> LaTeX) -> [PreLaTeX] -> [LaTeX]
forall a b. (a -> b) -> [a] -> [b]
map (Map Label Text -> PreLaTeX -> LaTeX
toLaTeX Map Label Text
m) [PreLaTeX]
content)
toLaTeX Map Label Text
m (IBraced PreLaTeX
content) = LaTeX -> LaTeX
Braced (LaTeX -> LaTeX) -> LaTeX -> LaTeX
forall a b. (a -> b) -> a -> b
$ Map Label Text -> PreLaTeX -> LaTeX
toLaTeX Map Label Text
m PreLaTeX
content
toLaTeX Map Label Text
m (ISequence [PreLaTeX]
content) = [LaTeX] -> LaTeX
Sequence ([LaTeX] -> LaTeX) -> [LaTeX] -> LaTeX
forall a b. (a -> b) -> a -> b
$ (PreLaTeX -> LaTeX) -> [PreLaTeX] -> [LaTeX]
forall a b. (a -> b) -> [a] -> [b]
map (Map Label Text -> PreLaTeX -> LaTeX
toLaTeX Map Label Text
m) [PreLaTeX]
content
toLaTeX Map Label Text
m (MissingRef l :: Label
l@(Label Text
t)) =
    case Label -> Map Label Text -> Maybe Text
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Label
l Map Label Text
m of
        Maybe Text
Nothing -> LaTeX -> LaTeX
Braced (LaTeX -> LaTeX) -> LaTeX -> LaTeX
forall a b. (a -> b) -> a -> b
$ Text -> [Text] -> [LaTeX] -> LaTeX
Command Text
"Large" [] [Text -> LaTeX
Text Text
"??"]
        Just Text
ref ->
            Text -> [Text] -> [LaTeX] -> LaTeX
Command
                Text
"hyperlink"
                []
                [ Text -> LaTeX
Raw Text
t
                , Text -> LaTeX
Text Text
ref
                ]