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