-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmary.hs
113 lines (101 loc) · 4.22 KB
/
mary.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
module Main where
import Control.Exception as E
import Data.Maybe
import Data.Semigroup ((<>))
import Data.Text
import qualified Data.Text.IO as TIO
import Text.Pandoc.JSON (toJSONFilter)
import System.IO as SIO
import System.Environment
import Options.Applicative
import Shonkier
import Mary.Interpreter
import Mary.ServePage
import Mary.Find
import Mary.Version
import Paths_mary (getDataFileName)
defaultUser :: IO String
defaultUser = do
u <- lookupEnv "LOGNAME"
pure $ fromMaybe "Shelley" u
main :: IO ()
main = customExecParser pp opts >>= \ o -> E.handle h $ case o of
Pandoc -> toJSONFilter process
Version -> putStrLn version
Shonkier filename -> interpretShonkier filename
Shonkierjs filename -> do
shonkierjs <- getDataFileName "src/data-dir/Shonkier.js"
compileShonkier shonkierjs filename >>= TIO.putStrLn
Page filename postString getString siteRoot baseURL user -> do
let postArray = parseRequests (pack postString)
let getArray' = parseRequests (pack getString)
-- make sure there is a page
let getArray = case lookup "page" getArray' of
Just _ -> getArray'
Nothing -> ("page", pack filename):getArray'
let mary = "mary"
let pandoc = "pandoc"
servePage Config{..} postArray getArray filename >>= TIO.putStrLn
Find{..} -> maryFind sitesRoot baseURL user page
where
pp = prefs showHelpOnEmpty
opts = info (optsParser <**> helper)
( fullDesc <> header "Mary - a content delivery and assessment engine")
h :: SomeException -> IO ()
h e = SIO.hPutStrLn stderr $ "mary ERROR " ++ displayException e
data Options
= Pandoc
| Version
| Shonkier { filename :: String }
| Shonkierjs { filename :: String }
| Page { filename :: String
, baseURL :: String
, postArray :: String
, getArray :: String
, siteRoot :: String
, user :: Maybe String
}
| Find { user :: Maybe String
, sitesRoot :: String
, baseURL :: String
, page :: String
}
optsParser :: Parser Options
optsParser = subparser
( command' "pandoc"
(pure Pandoc)
"Act as a Pandoc filter"
<> command' "version"
(pure Version)
"Print version and exit"
<> command' "shonkier"
(Shonkier <$> strArgument
(metavar "FILE" <> action "file" <> help "Input Shonkier program."))
"Interpret shonkier program"
<> command' "shonkierjs"
(Shonkierjs <$> strArgument
(metavar "FILE" <> action "file" <> help "Source Shonkier program."))
"Compile shonkier program to javascript"
<> command' "page"
(Page <$> strArgument (metavar "FILE" <> action "file" <> help "Input Mary file")
<*> strArgument (metavar "URL" <> help "Base URL")
<*> option str (long "post" <> value ""
<> metavar "STRING" <> help "POST input string (&-separated)")
<*> option str (long "get" <> value ""
<> metavar "STRING" <> help "GET input string (&-separated)")
<*> option str (long "siteRoot" <> value "."
<> metavar "STRING" <> action "directory" <> help "Site root.")
<*> optional (strOption (long "user"
<> metavar "STRING" <> action "user" <> help "Username")))
"Generate HTML from Mary file"
<> command' "find"
(Find <$> optional (strOption (long "user"
<> metavar "STRING" <> action "user" <> help "Username."))
<*> strArgument (metavar "ROOT" <> action "directory" <> help "Path to site root.")
<*> strArgument (metavar "URL" <> help "Base URL.")
<*> strArgument (metavar "PAGE" <> action "file" <> help "Page to serve."))
"Find webpage and output markdown")
where
command' :: String -> Parser a -> String -> Mod CommandFields a
command' label parser description =
command label (info parser (progDesc description))