]> git.wincent.com - docvim.git/blob - lib/Text/Docvim/Visitor/Symbol.hs
Fix remaining warnings
[docvim.git] / lib / Text / Docvim / Visitor / Symbol.hs
1 module Text.Docvim.Visitor.Symbol (getSymbols) where
2
3 import Data.List
4 import Text.Docvim.AST
5 import Text.Docvim.Visitor.Plugin
6 import qualified Data.Set as Set
7
8 -- TODO: return Set instead of [String]
9 -- TODO: use Either instead of dying unceremoniously with `error`
10 getSymbols :: Node -> [String]
11 getSymbols node = if length symbols == Set.size set
12                   then symbols
13                   -- BUG: validation doesn't seem to run at all for:
14                   --   ppm "\"\" @plugin ZZZZ thing\n\" # thing\n\" # thingz\n\" # thingy\n\" thing\n\"\n\" # thingz\n\" # thingz\n"
15                   -- but it does run for:
16                   --   ppm "\"\" @plugin ZZZZ thing\n\" # thing\n\" # thingz\n\" # thingy\n\" |thing|\n\"\n\" # thingz\n\" # thingz\n"
17                   -- yet the AST for the first tree does trip us up in here:
18                   --   let x (Right y) = y
19                   --   let y = parseUnit "\"\" @plugin ZZZZ thing\n\" # thing\n\" # thingz\n\" # thingy\n\" thing\n\"\n\" # thingz\n\" # thingz\n"
20                   --   getSymbols (x y) -- BOOM!
21                   -- what's making the expection get swallowed in the ppm case?
22                   else error $ "Duplicate symbol table entries: " ++ show duplicates
23   where
24     set                                     = Set.fromList symbols
25     symbols                                 = walk gatherSymbols [] node
26     gatherSymbols (CommandAnnotation n _)   = [":" ++ n]
27     gatherSymbols CommandsAnnotation        = genHeading "commands"
28     gatherSymbols FunctionsAnnotation       = genHeading "functions"
29     gatherSymbols (HeadingAnnotation h)     = genHeading h
30     gatherSymbols (LinkTargets ts)          = ts
31     -- TODO: probably don't want this target to exist in the symbol table when
32     -- emitting Markdown
33     gatherSymbols (PluginAnnotation name _) = [name, name ++ ".txt"]
34     gatherSymbols (MappingAnnotation m)     = [m]
35     gatherSymbols MappingsAnnotation        = genHeading "mappings"
36     gatherSymbols OptionsAnnotation         = genHeading "options"
37     gatherSymbols _                         = []
38     genHeading h                            = maybe [] (\x -> [sanitizeAnchor $ x ++ "-" ++ h]) (getPluginName node)
39     duplicates                              = nub $ f (sort symbols)
40       where
41         f [] = []
42         f [_] = []
43         f (x:xs) = if x == head xs
44                    then x : f xs
45                    else f xs