module GF.Command.Help where
import GF.Command.Messages
import GF.Command.Abstract(isOpt,getCommandOp)
import GF.Command.CommandInfo
import GF.Data.Operations((++++))
import qualified Data.Map as Map
commandHelpAll' :: Map [Char] (CommandInfo m) -> [Option] -> [Char]
commandHelpAll' Map [Char] (CommandInfo m)
allCommands [Option]
opts = [[Char]] -> [Char]
unlines ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$
[Option] -> Bool -> ([Char], CommandInfo m) -> [Char]
forall (m :: * -> *).
[Option] -> Bool -> ([Char], CommandInfo m) -> [Char]
commandHelp' [Option]
opts ([Char] -> [Option] -> Bool
isOpt [Char]
"full" [Option]
opts) (([Char], CommandInfo m) -> [Char])
-> [([Char], CommandInfo m)] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
`map` Map [Char] (CommandInfo m) -> [([Char], CommandInfo m)]
forall k a. Map k a -> [(k, a)]
Map.toList Map [Char] (CommandInfo m)
allCommands
commandHelp' :: [Option] -> Bool -> ([Char], CommandInfo m) -> [Char]
commandHelp' [Option]
opts = if [Char] -> [Option] -> Bool
isOpt [Char]
"t2t" [Option]
opts then Bool -> ([Char], CommandInfo m) -> [Char]
forall (m :: * -> *). Bool -> ([Char], CommandInfo m) -> [Char]
commandHelpTags else Bool -> ([Char], CommandInfo m) -> [Char]
forall (m :: * -> *). Bool -> ([Char], CommandInfo m) -> [Char]
commandHelp
commandHelp :: Bool -> ([Char], CommandInfo m) -> [Char]
commandHelp Bool
full ([Char]
co,CommandInfo m
info) = [[Char]] -> [Char]
unlines ([[Char]] -> [Char])
-> ([[Char]] -> [[Char]]) -> [[Char]] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Char]] -> [[Char]]
forall a. [[a]] -> [[a]]
compact ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ [
[Char]
co [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ ([Char] -> [Char]) -> [Char] -> [Char]
forall a a. ([a] -> [a]) -> [a] -> [a]
optionally ([Char]
", " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++) (CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
longname CommandInfo m
info),
CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
synopsis CommandInfo m
info] [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ if Bool
full then [
[Char]
"",
([Char] -> [Char]) -> [Char] -> [Char]
forall a a. ([a] -> [a]) -> [a] -> [a]
optionally (([Char]
"syntax:" [Char] -> [Char] -> [Char]
++++)([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([Char]
" "[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++)([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++[Char]
"\n")) (CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
syntax CommandInfo m
info),
CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
explanation CommandInfo m
info,
[Char] -> [[Char]] -> [Char]
section [Char]
"options:" [[Char]
" -" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
o [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"\t" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
e | ([Char]
o,[Char]
e) <- CommandInfo m -> [([Char], [Char])]
forall (m :: * -> *). CommandInfo m -> [([Char], [Char])]
options CommandInfo m
info],
[Char] -> [[Char]] -> [Char]
section [Char]
"flags:" [[Char]
" -" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
o [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"\t" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
e | ([Char]
o,[Char]
e) <- CommandInfo m -> [([Char], [Char])]
forall (m :: * -> *). CommandInfo m -> [([Char], [Char])]
flags CommandInfo m
info],
[Char] -> [[Char]] -> [Char]
section [Char]
"examples:" [[Char]
" " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
o [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"\t--" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
e | ([Char]
o,[Char]
e) <- CommandInfo m -> [([Char], [Char])]
forall (m :: * -> *). CommandInfo m -> [([Char], [Char])]
examples CommandInfo m
info]
] else []
commandHelpTags :: Bool -> ([Char], CommandInfo m) -> [Char]
commandHelpTags Bool
full ([Char]
co,CommandInfo m
info) = [[Char]] -> [Char]
unlines ([[Char]] -> [Char])
-> ([[Char]] -> [[Char]]) -> [[Char]] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Char]] -> [[Char]]
forall a. [[a]] -> [[a]]
compact ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ [
[Char]
"#VSPACE",[Char]
"",
[Char]
"===="[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++[Char]
hdrname[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++[Char]
"====",
[Char]
"#NOINDENT",
[Char]
name [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
": " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
[Char]
"//" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
synopsis CommandInfo m
info [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
".//"] [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ if Bool
full then [
[Char]
"",[Char]
"#TINY",[Char]
"",
CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
explanation CommandInfo m
info,
([Char] -> [Char]) -> [Char] -> [Char]
forall a a. ([a] -> [a]) -> [a] -> [a]
optionally ([Char]
"- Syntax: "[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++) ([Char] -> [Char]
lit (CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
syntax CommandInfo m
info)),
[Char] -> [[Char]] -> [Char]
section [Char]
"- Options:\n" [[Char]
" | ``-" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
o [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"`` | " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
e | ([Char]
o,[Char]
e) <- CommandInfo m -> [([Char], [Char])]
forall (m :: * -> *). CommandInfo m -> [([Char], [Char])]
options CommandInfo m
info],
[Char] -> [[Char]] -> [Char]
section [Char]
"- Flags:\n" [[Char]
" | ``-" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
o [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"`` | " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
e | ([Char]
o,[Char]
e) <- CommandInfo m -> [([Char], [Char])]
forall (m :: * -> *). CommandInfo m -> [([Char], [Char])]
flags CommandInfo m
info],
[Char] -> [[Char]] -> [Char]
section [Char]
"- Examples:\n" [[Char]
" | ``" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
o [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"`` | " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
e | ([Char]
o,[Char]
e) <- CommandInfo m -> [([Char], [Char])]
forall (m :: * -> *). CommandInfo m -> [([Char], [Char])]
examples CommandInfo m
info],
[Char]
"", [Char]
"#NORMAL", [Char]
""
] else []
where
hdrname :: [Char]
hdrname = [Char]
co [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
equal (CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
longname CommandInfo m
info)
name :: [Char]
name = [Char] -> [Char]
lit [Char]
co [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
equal ([Char] -> [Char]
lit (CommandInfo m -> [Char]
forall (m :: * -> *). CommandInfo m -> [Char]
longname CommandInfo m
info))
lit :: [Char] -> [Char]
lit = ([Char] -> [Char]) -> [Char] -> [Char]
forall a a. ([a] -> [a]) -> [a] -> [a]
optionally ([Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
wrap [Char]
"``")
equal :: [Char] -> [Char]
equal = ([Char] -> [Char]) -> [Char] -> [Char]
forall a a. ([a] -> [a]) -> [a] -> [a]
optionally ([Char]
" = "[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++)
wrap :: [a] -> [a] -> [a]
wrap [a]
d [a]
s = [a]
d[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
s[a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++[a]
d
section :: [Char] -> [[Char]] -> [Char]
section [Char]
hdr = ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a a. ([a] -> [a]) -> [a] -> [a]
optionally (([Char]
hdr[Char] -> [Char] -> [Char]
++++)([Char] -> [Char]) -> ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[[Char]] -> [Char]
unlines)
optionally :: ([a] -> [a]) -> [a] -> [a]
optionally [a] -> [a]
f [] = []
optionally [a] -> [a]
f [a]
s = [a] -> [a]
f [a]
s
compact :: [[a]] -> [[a]]
compact [] = []
compact ([]:xs :: [[a]]
xs@([]:[[a]]
_)) = [[a]] -> [[a]]
compact [[a]]
xs
compact ([a]
x:[[a]]
xs) = [a]
x[a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
:[[a]] -> [[a]]
compact [[a]]
xs
helpCommand :: Map [Char] (CommandInfo m) -> ([Char], CommandInfo m)
helpCommand Map [Char] (CommandInfo m)
allCommands =
([Char]
"h", CommandInfo Any
forall (m :: * -> *). CommandInfo m
emptyCommandInfo {
longname :: [Char]
longname = [Char]
"help",
syntax :: [Char]
syntax = [Char]
"h (-full)? COMMAND?",
synopsis :: [Char]
synopsis = [Char]
"get description of a command, or a the full list of commands",
explanation :: [Char]
explanation = [[Char]] -> [Char]
unlines [
[Char]
"Displays information concerning the COMMAND.",
[Char]
"Without argument, shows the synopsis of all commands."
],
options :: [([Char], [Char])]
options = [
([Char]
"changes",[Char]
"give a summary of changes from GF 2.9"),
([Char]
"coding",[Char]
"give advice on character encoding"),
([Char]
"full",[Char]
"give full information of the commands"),
([Char]
"license",[Char]
"show copyright and license information"),
([Char]
"t2t",[Char]
"output help in txt2tags format")
],
exec :: [Option] -> CommandArguments -> m CommandOutput
exec = \[Option]
opts CommandArguments
args ->
let
msg :: [Char]
msg = case CommandArguments -> [[Char]]
toStrings CommandArguments
args of
[[Char]]
_ | [Char] -> [Option] -> Bool
isOpt [Char]
"changes" [Option]
opts -> [Char]
changesMsg
[[Char]]
_ | [Char] -> [Option] -> Bool
isOpt [Char]
"coding" [Option]
opts -> [Char]
codingMsg
[[Char]]
_ | [Char] -> [Option] -> Bool
isOpt [Char]
"license" [Option]
opts -> [Char]
licenseMsg
[[Char]
s] -> let co :: [Char]
co = [Char] -> [Char]
getCommandOp [Char]
s in
case [Char] -> Map [Char] (CommandInfo m) -> Maybe (CommandInfo m)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup [Char]
co Map [Char] (CommandInfo m)
allCommands of
Just CommandInfo m
info -> [Option] -> Bool -> ([Char], CommandInfo m) -> [Char]
forall (m :: * -> *).
[Option] -> Bool -> ([Char], CommandInfo m) -> [Char]
commandHelp' [Option]
opts Bool
True ([Char]
co,CommandInfo m
info)
Maybe (CommandInfo m)
_ -> [Char]
"command not found"
[[Char]]
_ -> Map [Char] (CommandInfo m) -> [Option] -> [Char]
forall (m :: * -> *).
Map [Char] (CommandInfo m) -> [Option] -> [Char]
commandHelpAll' Map [Char] (CommandInfo m)
allCommands [Option]
opts
in CommandOutput -> m CommandOutput
forall (m :: * -> *) a. Monad m => a -> m a
return ([Char] -> CommandOutput
fromString [Char]
msg),
needsTypeCheck :: Bool
needsTypeCheck = Bool
False
})