mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
92 lines
3.1 KiB
Haskell
92 lines
3.1 KiB
Haskell
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' allCommands opts = unlines $
|
|
commandHelp' opts (isOpt "full" opts) `map` Map.toList allCommands
|
|
|
|
commandHelp' opts = if isOpt "t2t" opts then commandHelpTags else commandHelp
|
|
|
|
--commandHelp :: Bool -> (String,CommandInfo env) -> String
|
|
commandHelp full (co,info) = unlines . compact $ [
|
|
co ++ optionally (", " ++) (longname info),
|
|
synopsis info] ++ if full then [
|
|
"",
|
|
optionally (("syntax:" ++++).(" "++).(++"\n")) (syntax info),
|
|
explanation info,
|
|
section "options:" [" -" ++ o ++ "\t" ++ e | (o,e) <- options info],
|
|
section "flags:" [" -" ++ o ++ "\t" ++ e | (o,e) <- flags info],
|
|
section "examples:" [" " ++ o ++ "\t--" ++ e | (o,e) <- examples info]
|
|
] else []
|
|
|
|
-- for printing with txt2tags formatting
|
|
|
|
--commandHelpTags :: Bool -> (String,CommandInfo env) -> String
|
|
commandHelpTags full (co,info) = unlines . compact $ [
|
|
"#VSPACE","",
|
|
"===="++hdrname++"====",
|
|
"#NOINDENT",
|
|
name ++ ": " ++
|
|
"//" ++ synopsis info ++ ".//"] ++ if full then [
|
|
"","#TINY","",
|
|
explanation info,
|
|
optionally ("- Syntax: "++) (lit (syntax info)),
|
|
section "- Options:\n" [" | ``-" ++ o ++ "`` | " ++ e | (o,e) <- options info],
|
|
section "- Flags:\n" [" | ``-" ++ o ++ "`` | " ++ e | (o,e) <- flags info],
|
|
section "- Examples:\n" [" | ``" ++ o ++ "`` | " ++ e | (o,e) <- examples info],
|
|
"", "#NORMAL", ""
|
|
] else []
|
|
where
|
|
hdrname = co ++ equal (longname info)
|
|
name = lit co ++ equal (lit (longname info))
|
|
|
|
lit = optionally (wrap "``")
|
|
equal = optionally (" = "++)
|
|
-- verbatim = optionally (wrap ["```"])
|
|
wrap d s = d++s++d
|
|
|
|
section hdr = optionally ((hdr++++).unlines)
|
|
|
|
optionally f [] = []
|
|
optionally f s = f s
|
|
|
|
compact [] = []
|
|
compact ([]:xs@([]:_)) = compact xs
|
|
compact (x:xs) = x:compact xs
|
|
|
|
helpCommand allCommands =
|
|
("h", emptyCommandInfo {
|
|
longname = "help",
|
|
syntax = "h (-full)? COMMAND?",
|
|
synopsis = "get description of a command, or a the full list of commands",
|
|
explanation = unlines [
|
|
"Displays information concerning the COMMAND.",
|
|
"Without argument, shows the synopsis of all commands."
|
|
],
|
|
options = [
|
|
("changes","give a summary of changes from GF 2.9"),
|
|
("coding","give advice on character encoding"),
|
|
("full","give full information of the commands"),
|
|
("license","show copyright and license information"),
|
|
("t2t","output help in txt2tags format")
|
|
],
|
|
exec = \opts args ->
|
|
let
|
|
msg = case toStrings args of
|
|
_ | isOpt "changes" opts -> changesMsg
|
|
_ | isOpt "coding" opts -> codingMsg
|
|
_ | isOpt "license" opts -> licenseMsg
|
|
[s] -> let co = getCommandOp s in
|
|
case Map.lookup co allCommands of
|
|
Just info -> commandHelp' opts True (co,info)
|
|
_ -> "command not found"
|
|
_ -> commandHelpAll' allCommands opts
|
|
in return (fromString msg),
|
|
needsTypeCheck = False
|
|
})
|