@@ -30,21 +30,37 @@ import qualified Paths_purescript as Paths
3030import System.Exit (exitSuccess, exitFailure)
3131import System.IO (hPutStrLn, stderr)
3232
33+import Etags
34+import Ctags
35+
36+-- Available output formats
37+data Format = Markdown -- Output documentation in Markdown format
38+ | Ctags -- Output ctags symbol index suitable for use with vi
39+ | Etags -- Output etags symbol index suitable for use with emacs
40+
3341data PSCDocsOptions = PSCDocsOptions
34− { pscdInputFiles :: [FilePath]
42+ { pscdFormat :: Format
43+ , pscdInputFiles :: [FilePath]
3544 }
3645
3746docgen :: PSCDocsOptions -> IO ()
38−docgen (PSCDocsOptions input) = do
47+docgen (PSCDocsOptions fmt input) = do
3948 e <- P.parseModulesFromFiles (fromMaybe "") <$> mapM (fmap (first Just) . parseFile) (nub input)
4049 case e of
4150 Left err -> do
4251 hPutStrLn stderr $ show err
4352 exitFailure
4453 Right ms -> do
45− putStrLn . runDocs $ renderModules (map snd ms)
54+ case fmt of
55+ Markdown -> putStrLn . runDocs $ renderModules (map snd ms)
56+ Etags -> ldump $ dumpEtags $ pairs ms
57+ Ctags -> ldump $ dumpCtags $ pairs ms
4658 exitSuccess
47−
59+ where pairs :: [(Maybe String, m)] -> [(String, m)]
60+ pairs = map (\(k,m) -> (fromMaybe "" k,m))
61+ ldump :: [String] -> IO ()
62+ ldump = mapM_ putStrLn
63+
4864parseFile :: FilePath -> IO (FilePath, String)
4965parseFile input = (,) input <$> readFile input
5066
@@ -222,8 +238,20 @@ inputFile = strArgument $
222238 metavar "FILE"
223239 <> help "The input .purs file(s)"
224240
241+instance Read Format where
242+ readsPrec _ "etags" = [(Etags, "")]
243+ readsPrec _ "ctags" = [(Ctags, "")]
244+ readsPrec _ "markdown" = [(Markdown, "")]
245+ readsPrec _ _ = []
246+
247+format :: Parser Format
248+format = option auto $ value Markdown
249+ <> long "format"
250+ <> metavar "FORMAT"
251+ <> help "Set output FORMAT (markdown | etags | ctags)"
252+
225253pscDocsOptions :: Parser PSCDocsOptions
226−pscDocsOptions = PSCDocsOptions <$> many inputFile
254+pscDocsOptions = PSCDocsOptions <$> format <*> many inputFile
227255
228256main :: IO ()
229257main = execParser opts >>= docgen