pandoc/trypandoc/trypandoc.hs

77 lines
3 KiB
Haskell
Raw Normal View History

2015-05-28 06:19:59 +02:00
{-# LANGUAGE OverloadedStrings #-}
{- |
Module : Main
Copyright : © 2014-2021 John MacFarlane <jgm@berkeley.edu>
License : GNU GPL, version 2 or above
Maintainer : John MacFarlane <jgm@berkeley.edu>
Stability : alpha
Portability : portable
Provides a webservice which allows to try pandoc in the browser.
-}
module Main where
import Network.Wai.Handler.CGI
2021-02-28 18:24:37 +01:00
import Network.Wai.Middleware.Timeout (timeout)
import Network.Wai
import Data.Maybe (fromMaybe)
import Network.HTTP.Types.Status (status200)
import Network.HTTP.Types.Header (hContentType)
import Network.HTTP.Types.URI (queryToQueryText)
import Text.Pandoc
2017-06-10 21:38:08 +02:00
import Text.Pandoc.Highlighting (pygments)
import Text.Pandoc.Shared (tabFilter)
import Data.Aeson
import qualified Data.Text as T
import Data.Text (Text)
main :: IO ()
2021-02-28 18:24:37 +01:00
main = run $ timeout 2 app
app :: Application
app req respond = do
let query = queryToQueryText $ queryString req
2018-07-02 17:51:51 +02:00
let getParam x = maybe (error $ T.unpack x ++ " parameter not set")
return $ lookup x query
text <- getParam "text" >>= checkLength . fromMaybe T.empty
fromFormat <- fromMaybe "" <$> getParam "from"
toFormat <- fromMaybe "" <$> getParam "to"
standalone <- (==) "1" . fromMaybe "" <$> getParam "standalone"
compiledTemplate <- runIO . compileDefaultTemplate $ toFormat
let template = if standalone then either (const Nothing) Just compiledTemplate else Nothing
2019-11-22 18:45:10 +01:00
let reader = case runPure $ getReader fromFormat of
Right (TextReader r, es) -> r readerOpts{
readerExtensions = es }
2017-06-10 21:38:08 +02:00
_ -> error $ "could not find reader for "
++ T.unpack fromFormat
2019-11-22 18:45:10 +01:00
let writer = case runPure $ getWriter toFormat of
Right (TextWriter w, es) -> w writerOpts{
writerExtensions = es, writerTemplate = template }
2017-06-10 21:38:08 +02:00
_ -> error $ "could not find writer for " ++
T.unpack toFormat
let result = case runPure $ reader (tabFilter 4 text) >>= writer of
Right s -> s
2015-05-28 06:18:17 +02:00
Left err -> error (show err)
let output = encode $ object [ T.pack "html" .= result
, T.pack "name" .=
if fromFormat == "markdown_strict"
then T.pack "pandoc (strict)"
else T.pack "pandoc"
, T.pack "version" .= pandocVersion]
respond $ responseLBS status200 [(hContentType,"text/json; charset=UTF-8")] output
checkLength :: Text -> IO Text
checkLength t =
if T.length t > 10000
then error "exceeds length limit of 10,000 characters"
else return t
writerOpts :: WriterOptions
writerOpts = def { writerReferenceLinks = True,
writerEmailObfuscation = NoObfuscation,
writerHTMLMathMethod = MathJax defaultMathJaxURL,
2017-06-10 21:38:08 +02:00
writerHighlightStyle = Just pygments }
readerOpts :: ReaderOptions
2017-06-10 21:38:08 +02:00
readerOpts = def