]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Wiki/Interpreter/Outline.hs
Chucked the Data.Generics to get ugly but 2x faster code.
[Rakka.git] / Rakka / Wiki / Interpreter / Outline.hs
index 16ed0c5f7999ad52670df7398ca10e41f8a7b647..ef9c32058b03de0a69476090f2a7e8df07aa7d7e 100644 (file)
@@ -3,7 +3,7 @@ module Rakka.Wiki.Interpreter.Outline
     )
     where
 
-import           Data.Generics
+import           Data.Maybe
 import           Rakka.Wiki
 import           Rakka.Wiki.Interpreter
 
@@ -24,16 +24,24 @@ outlineInterp = BlockCommandInterpreter {
 
 
 mkOutline :: WikiPage -> BlockElement
-mkOutline tree
-    = let headings = listify query tree
-      in
-        fst (mkOutline' emptyOutline 1 headings)
-
-
-query :: Typeable a => a -> Bool
-query = mkQ False $ \ x -> case x of
-                             Heading _ _ -> True
-                             _           -> False
+mkOutline tree = fst (mkOutline' emptyOutline 1 headings)
+    where
+      headings :: [BlockElement]
+      headings = concat (map collectInBlock tree)
+
+      collectInBlock :: BlockElement -> [BlockElement]
+      collectInBlock hd@(Heading _ _)
+          = [hd]
+      collectInBlock (Div _ xs)
+          = concat $ map collectInBlock $ catMaybes (map castToBlock xs)
+      collectInBlock (BlockCmd (BlockCommand _ _ xs))
+          = concat $ map collectInBlock xs
+      collectInBlock _
+          = []
+
+      castToBlock :: Element -> Maybe BlockElement
+      castToBlock (Block e) = Just e
+      castToBlock _         = Nothing
 
 
 emptyOutline :: BlockElement