module Main where
import Network.CGI
import Text.XML.Light
import Text.TeXMath
import Text.TeXMath.Macros
import Data.Maybe (fromMaybe)
import Control.Monad
import Text.JSON
import Codec.Binary.UTF8.String (decodeString, encodeString)

cgiMain :: CGI CGIResult
cgiMain = do
  setHeader "Content-type" "text/xhtml; charset=UTF-8"
  latexFormula <- liftM (decodeString . fromMaybe "") $ getInput "latexFormula"
  rawMacros <- liftM (decodeString . fromMaybe "") $ getInput "macros"
  let (ms, _) = parseMacroDefinitions rawMacros
  output . encodeStrict $
    case texMathToMathML DisplayBlock (applyMacros (reverse ms) latexFormula) of
         Left e  -> toJSObject [("success", JSBool False)
                               , ("error", JSString $ toJSString e)]
         Right v -> toJSObject [("success", JSBool True)
                               , ("mathml", JSString $ toJSString $ encodeString $
                                     ppElement v)]

main :: IO ()
main = runCGI $ handleErrors cgiMain

