{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Applicative
import Snap.Core
import Snap.Util.FileServe
import Snap.Http.Server
import Data.Aeson
import Text.Pandoc
import qualified Codec.Binary.UTF8.String as W8
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as C8
main :: IO ()
main = quickHttpServe site
data SMResult = SMResult {
msg :: String
} deriving Show
instance ToJSON SMResult where
toJSON (SMResult msg) = object ["msg" .= msg]
instance FromJSON SMResult where
parseJSON (Object v) = SMResult <$>
v .: "msg"
-- A non-Object value is of the wrong type, so fail.
writerOption :: WriterOptions
writerOption = def { writerHtml5 = True,
writerSlideVariant=RevealJsSlides }
myPandoc :: String -> Pandoc
myPandoc mkd = readMarkdown def mkd
mkd2html :: C8.ByteString -> String
mkd2html mkd = writeHtmlString writerOption (myPandoc mkd')
where mkd' = W8.decode $ BS.unpack mkd
site :: Snap ()
site =
ifTop (writeBS "/slideme") <|>
route [ ("help", writeBS "me")
, ("slideme/", method POST slideMe)
, ("slideme/:mkd", slideMe)
] <|>
dir "static" (serveDirectory ".")
slideMe :: Snap ()
slideMe = do
param <- getParam "mkd"
case param of
Just p -> writeBS $ BS.concat $ BL.toChunks $ Data.Aeson.encode $ SMResult (mkd2html p)
Nothing -> writeBS "{'msg':'error'}"