{-# LANGUAGE TemplateHaskell, OverloadedStrings, PackageImports #-}
module Hledger.Cli.DocFiles (
Topic
,printHelpForTopic
,runManForTopic
,runInfoForTopic
,runPagerForTopic
) where
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BC
import Data.Maybe (fromMaybe, isNothing)
import Data.String
import System.IO
import System.IO.Temp
import System.Process
import Hledger.Utils (first3, second3, third3, embedFileRelative)
import Text.Printf (printf)
import System.Environment (lookupEnv)
import Hledger.Utils.Debug
type Tool = String
type Topic = String
toolDocs :: [(Tool, (ByteString, ByteString, ByteString))]
toolDocs :: [([Char], (ByteString, ByteString, ByteString))]
toolDocs = [
([Char]
"hledger",
($(embedFileRelative "embeddedfiles/hledger.1")
,$(embedFileRelative "embeddedfiles/hledger.txt")
,$(embedFileRelative "embeddedfiles/hledger.info")
))
,([Char]
"hledger-ui",
($(embedFileRelative "embeddedfiles/hledger-ui.1")
,$(embedFileRelative "embeddedfiles/hledger-ui.txt")
,$(embedFileRelative "embeddedfiles/hledger-ui.info")
))
,([Char]
"hledger-web",
($(embedFileRelative "embeddedfiles/hledger-web.1")
,$(embedFileRelative "embeddedfiles/hledger-web.txt")
,$(embedFileRelative "embeddedfiles/hledger-web.info")
))
]
toolDocTxt :: Tool -> ByteString
toolDocTxt :: [Char] -> ByteString
toolDocTxt [Char]
name =
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall a. IsString a => [Char] -> a
fromString forall a b. (a -> b) -> a -> b
$ [Char]
"No text manual found for tool: "forall a. [a] -> [a] -> [a]
++[Char]
name) forall {a} {b} {c}. (a, b, c) -> b
second3 forall a b. (a -> b) -> a -> b
$ forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup [Char]
name [([Char], (ByteString, ByteString, ByteString))]
toolDocs
toolDocMan :: Tool -> ByteString
toolDocMan :: [Char] -> ByteString
toolDocMan [Char]
name =
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall a. IsString a => [Char] -> a
fromString forall a b. (a -> b) -> a -> b
$ [Char]
"No man page found for tool: "forall a. [a] -> [a] -> [a]
++[Char]
name) forall {a} {b} {c}. (a, b, c) -> a
first3 forall a b. (a -> b) -> a -> b
$ forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup [Char]
name [([Char], (ByteString, ByteString, ByteString))]
toolDocs
toolDocInfo :: Tool -> ByteString
toolDocInfo :: [Char] -> ByteString
toolDocInfo [Char]
name =
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall a. IsString a => [Char] -> a
fromString forall a b. (a -> b) -> a -> b
$ [Char]
"No info manual found for tool: "forall a. [a] -> [a] -> [a]
++[Char]
name) forall {a} {b} {c}. (a, b, c) -> c
third3 forall a b. (a -> b) -> a -> b
$ forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup [Char]
name [([Char], (ByteString, ByteString, ByteString))]
toolDocs
printHelpForTopic :: Tool -> Maybe Topic -> IO ()
printHelpForTopic :: [Char] -> Maybe [Char] -> IO ()
printHelpForTopic [Char]
tool Maybe [Char]
_mtopic =
ByteString -> IO ()
BC.putStr ([Char] -> ByteString
toolDocTxt [Char]
tool)
runPagerForTopic :: Tool -> Maybe Topic -> IO ()
[Char]
tool Maybe [Char]
mtopic = do
forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
[Char] -> ([Char] -> Handle -> m a) -> m a
withSystemTempFile ([Char]
"hledger-"forall a. [a] -> [a] -> [a]
++[Char]
toolforall a. [a] -> [a] -> [a]
++[Char]
".txt") forall a b. (a -> b) -> a -> b
$ \[Char]
f Handle
h -> do
Handle -> ByteString -> IO ()
BC.hPutStrLn Handle
h forall a b. (a -> b) -> a -> b
$ [Char] -> ByteString
toolDocTxt [Char]
tool
Handle -> IO ()
hClose Handle
h
let defpager :: [Char]
defpager = [Char]
"less -is"
[Char]
envpager <- forall a. a -> Maybe a -> a
fromMaybe [Char]
defpager forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> IO (Maybe [Char])
lookupEnv [Char]
"PAGER"
let pager :: [Char]
pager = if forall a. Maybe a -> Bool
isNothing Maybe [Char]
mtopic then [Char]
envpager else [Char]
defpager
[Char] -> IO ()
callCommand forall a b. (a -> b) -> a -> b
$ forall a. Show a => [Char] -> a -> a
dbg1 [Char]
"pager command" forall a b. (a -> b) -> a -> b
$
[Char]
pager forall a. [a] -> [a] -> [a]
++ forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Char]
"" (forall r. PrintfType r => [Char] -> r
printf [Char]
" +'/^( )?%s'") Maybe [Char]
mtopic forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ [Char]
f
runManForTopic :: Tool -> Maybe Topic -> IO ()
runManForTopic :: [Char] -> Maybe [Char] -> IO ()
runManForTopic [Char]
tool Maybe [Char]
mtopic =
forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
[Char] -> ([Char] -> Handle -> m a) -> m a
withSystemTempFile ([Char]
"hledger-"forall a. [a] -> [a] -> [a]
++[Char]
toolforall a. [a] -> [a] -> [a]
++[Char]
".nroff") forall a b. (a -> b) -> a -> b
$ \[Char]
f Handle
h -> do
Handle -> ByteString -> IO ()
BC.hPutStrLn Handle
h forall a b. (a -> b) -> a -> b
$ [Char] -> ByteString
toolDocMan [Char]
tool
Handle -> IO ()
hClose Handle
h
[Char] -> IO ()
callCommand forall a b. (a -> b) -> a -> b
$ forall a. Show a => [Char] -> a -> a
dbg1 [Char]
"man command" forall a b. (a -> b) -> a -> b
$
[Char]
"man " forall a. [a] -> [a] -> [a]
++ [Char]
f forall a. [a] -> [a] -> [a]
++ forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Char]
"" (forall r. PrintfType r => [Char] -> r
printf [Char]
" -P \"less -is +'/^( )?%s'\"") Maybe [Char]
mtopic
runInfoForTopic :: Tool -> Maybe Topic -> IO ()
runInfoForTopic :: [Char] -> Maybe [Char] -> IO ()
runInfoForTopic [Char]
tool Maybe [Char]
mtopic =
forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
[Char] -> ([Char] -> Handle -> m a) -> m a
withSystemTempFile ([Char]
"hledger-"forall a. [a] -> [a] -> [a]
++[Char]
toolforall a. [a] -> [a] -> [a]
++[Char]
".info") forall a b. (a -> b) -> a -> b
$ \[Char]
f Handle
h -> do
Handle -> ByteString -> IO ()
BC.hPutStrLn Handle
h forall a b. (a -> b) -> a -> b
$ [Char] -> ByteString
toolDocInfo [Char]
tool
Handle -> IO ()
hClose Handle
h
[Char] -> IO ()
callCommand forall a b. (a -> b) -> a -> b
$ forall a. Show a => [Char] -> a -> a
dbg1 [Char]
"info command" forall a b. (a -> b) -> a -> b
$
[Char]
"info -f " forall a. [a] -> [a] -> [a]
++ [Char]
f forall a. [a] -> [a] -> [a]
++ forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Char]
"" (forall r. PrintfType r => [Char] -> r
printf [Char]
" -n '%s'") Maybe [Char]
mtopic