Blame trypandoc/trypandoc.hs

Packit dda32d
{-# LANGUAGE OverloadedStrings #-}
Packit dda32d
module Main where
Packit dda32d
import Network.Wai.Handler.CGI
Packit dda32d
import Network.Wai
Packit dda32d
import Control.Applicative ((<$>))
Packit dda32d
import Data.Maybe (fromMaybe)
Packit dda32d
import Network.HTTP.Types.Status (status200)
Packit dda32d
import Network.HTTP.Types.Header (hContentType)
Packit dda32d
import Network.HTTP.Types.URI (queryToQueryText)
Packit dda32d
import Text.Pandoc
Packit dda32d
import Text.Pandoc.Writers.Math (defaultMathJaxURL)
Packit dda32d
import Text.Pandoc.Highlighting (pygments)
Packit dda32d
import Text.Pandoc.Readers (getReader, Reader(..))
Packit dda32d
import Text.Pandoc.Writers (getWriter, Writer(..))
Packit dda32d
import Text.Pandoc.Shared (tabFilter)
Packit dda32d
import Data.Aeson
Packit dda32d
import qualified Data.Text as T
Packit dda32d
import Data.Text (Text)
Packit dda32d
Packit dda32d
main :: IO ()
Packit dda32d
main = run app
Packit dda32d
Packit dda32d
app :: Application
Packit dda32d
app req respond = do
Packit dda32d
  let query = queryToQueryText $ queryString req
Packit dda32d
  let getParam x = maybe (error $ T.unpack x ++ " paramater not set")
Packit dda32d
                       return $ lookup x query
Packit dda32d
  text <- getParam "text" >>= checkLength . fromMaybe T.empty
Packit dda32d
  fromFormat <- fromMaybe "" <$> getParam "from"
Packit dda32d
  toFormat <- fromMaybe "" <$> getParam "to"
Packit dda32d
  let reader = case getReader (T.unpack fromFormat) of
Packit dda32d
                    Right (TextReader r, es) -> r readerOpts{
Packit dda32d
                       readerExtensions = es }
Packit dda32d
                    _ -> error $ "could not find reader for "
Packit dda32d
                                  ++ T.unpack fromFormat
Packit dda32d
  let writer = case getWriter (T.unpack toFormat) of
Packit dda32d
                    Right (TextWriter w, es) -> w writerOpts{
Packit dda32d
                       writerExtensions = es }
Packit dda32d
                    _ -> error $ "could not find writer for " ++
Packit dda32d
                           T.unpack toFormat
Packit dda32d
  let result = case runPure $ reader (tabFilter 4 text) >>= writer of
Packit dda32d
                    Right s   -> s
Packit dda32d
                    Left  err -> error (show err)
Packit dda32d
  let output = encode $ object [ T.pack "html" .= result
Packit dda32d
                               , T.pack "name" .=
Packit dda32d
                                  if fromFormat == "markdown_strict"
Packit dda32d
                                     then T.pack "pandoc (strict)"
Packit dda32d
                                     else T.pack "pandoc"
Packit dda32d
                               , T.pack "version" .= pandocVersion]
Packit dda32d
  respond $ responseLBS status200 [(hContentType,"text/json; charset=UTF-8")] output
Packit dda32d
Packit dda32d
checkLength :: Text -> IO Text
Packit dda32d
checkLength t =
Packit dda32d
  if T.length t > 10000
Packit dda32d
     then error "exceeds length limit of 10,000 characters"
Packit dda32d
     else return t
Packit dda32d
Packit dda32d
writerOpts :: WriterOptions
Packit dda32d
writerOpts = def { writerReferenceLinks = True,
Packit dda32d
                   writerEmailObfuscation = NoObfuscation,
Packit dda32d
                   writerHTMLMathMethod = MathJax (defaultMathJaxURL ++
Packit dda32d
                       "MathJax.js?config=TeX-AMS_CHTML-full"),
Packit dda32d
                   writerHighlightStyle = Just pygments }
Packit dda32d
Packit dda32d
readerOpts :: ReaderOptions
Packit dda32d
readerOpts = def