]> git.wincent.com - docvim.git/blob - lib/Text/Docvim/Compile.hs
Add additional blank line above headings
[docvim.git] / lib / Text / Docvim / Compile.hs
1 module Text.Docvim.Compile (compile) where
2
3 import Text.Docvim.AST
4 import Text.Docvim.Optimize
5 import Text.Docvim.Visitor
6 import Text.Docvim.Visitor.Command
7 import Text.Docvim.Visitor.Commands
8 import Text.Docvim.Visitor.Footer
9 import Text.Docvim.Visitor.Function
10 import Text.Docvim.Visitor.Functions
11 import Text.Docvim.Visitor.Heading
12 import Text.Docvim.Visitor.Mapping
13 import Text.Docvim.Visitor.Mappings
14 import Text.Docvim.Visitor.Option
15 import Text.Docvim.Visitor.Options
16 import Text.Docvim.Visitor.Plugin
17 import Text.Docvim.Visitor.Section
18
19 -- | "Compile" a set of translation units into a project.
20 compile :: [Node] -> Node
21 compile ns = do
22     let ast = foldr ($) (Project ns) [ injectCommands
23                                      , injectFunctions
24                                      , injectMappings
25                                      , injectOptions
26                                      ]
27     let steps = [ extract extractPlugin
28                 , extract extractCommands
29                 , extract extractCommand
30                 , extract extractMappings
31                 , extract extractMapping
32                 , extract extractOptions
33                 , extract extractOption
34                 , extract extractFunctions
35                 , extract extractFunction
36                 , extract extractFooter
37                 ]
38     let (remainder, sections) = foldl reduce (ast, []) steps
39     let (beginning, rest) = splitAt 1 sections
40     optimize $ injectTOC $ Project $ (concat . concat) [beginning, [[remainder]], rest]
41   where
42     reduce (remainder', sections') step = do
43       let (r', s') = step remainder'
44       (r', sections' ++ [s'])