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 -> (String,CommandInfo env) -> String
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 []

-- for printing with txt2tags formatting

--commandHelpTags :: Bool -> (String,CommandInfo env) -> String
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]
++)
-- verbatim = optionally (wrap ["```"])
   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
     })