]> git.wincent.com - docvim.git/blob - lib/Text/Docvim/CLI.hs
Add additional blank line above headings
[docvim.git] / lib / Text / Docvim / CLI.hs
1 {-# LANGUAGE MultiWayIf #-}
2
3 -- | The runnable part of the docvim executable.
4 module Text.Docvim.CLI (run) where
5
6 import Control.Monad
7 import Data.List
8 import Data.Maybe
9 import System.FilePath hiding (hasExtension)
10 import System.IO
11 import Text.Docvim.Compile
12 import Text.Docvim.Options
13 import Text.Docvim.Parse
14 import Text.Docvim.Printer.Markdown
15 import Text.Docvim.Printer.Vim
16 import Text.Docvim.ReadDir
17 import Text.Show.Pretty
18
19 hasExtension :: String -> FilePath -> Bool
20 hasExtension ext fp = takeExtension fp == ext
21
22 isMarkdown :: FilePath -> Bool
23 isMarkdown = hasExtension ".md"
24
25 isText :: FilePath -> Bool
26 isText = hasExtension ".txt"
27
28 isVimScript :: FilePath -> Bool
29 isVimScript = hasExtension ".vim"
30
31 run :: IO ()
32 run = do
33   opts <- options
34   paths <- readDir (directory opts)
35   let filtered = filter isVimScript $ sort paths
36   parsed <- mapM (\path -> do
37       when (verbose opts) (hPutStrLn stderr ("Parsing " ++ path))
38       parse path
39     ) filtered
40   let project = compile parsed
41   when (debug opts) (hPutStrLn stderr ("Compiled:\n" ++ ppShow project))
42   let targets = fromMaybe [""] (outfiles opts)
43   mapM_ (\target ->
44       if | target == "" -> do
45             when (verbose opts) (hPutStrLn stderr "No output target: defaulting to standard out")
46             putStrLn $ markdown project
47          | isText target -> do
48             when (verbose opts) (hPutStrLn stderr ("Outputting in text format to " ++ target))
49             writeFile target (vimHelp project)
50          | isMarkdown target -> do
51             when (verbose opts) (hPutStrLn stderr ("Outputting in markdown format to " ++ target))
52             writeFile target (markdown project)
53          | otherwise -> hPutStrLn stderr ("Unrecognized output format for " ++ target)
54     ) targets
55   return ()