)
where
-import Data.Generics
+import Data.Maybe
import Rakka.Wiki
import Rakka.Wiki.Interpreter
bciName = "outline"
, bciInterpret
= \ ctx _ ->
- case ctxMainTree ctx of
- Just tree -> return $ Div [("class", "outline")] [List $ mkOutline tree]
+ case ctxMainWiki ctx of
+ Just tree -> return $ Div [("class", "outline")] [Block $ mkOutline tree]
Nothing -> return EmptyBlock
}
-mkOutline :: WikiPage -> ListElement
-mkOutline tree
- = let headings = listify query tree
- in
- fst (mkOutline' emptyOutline 1 headings)
+mkOutline :: WikiPage -> BlockElement
+mkOutline tree = fst (mkOutline' emptyOutline 1 headings)
+ where
+ headings :: [BlockElement]
+ headings = concatMap collectInBlock tree
+ collectInBlock :: BlockElement -> [BlockElement]
+ collectInBlock hd@(Heading _ _)
+ = [hd]
+ collectInBlock (Div _ xs)
+ = concatMap collectInBlock $ catMaybes (map castToBlock xs)
+ collectInBlock (BlockCmd (BlockCommand _ _ xs))
+ = concatMap collectInBlock xs
+ collectInBlock _
+ = []
-query :: Typeable a => a -> Bool
-query = mkQ False $ \ x -> case x of
- Heading _ _ -> True
- _ -> False
+ castToBlock :: Element -> Maybe BlockElement
+ castToBlock (Block e) = Just e
+ castToBlock _ = Nothing
-emptyOutline :: ListElement
-emptyOutline = ListElement Bullet []
+emptyOutline :: BlockElement
+emptyOutline = List Bullet []
-mkOutline' :: ListElement -> Int -> [BlockElement] -> (ListElement, [BlockElement])
+mkOutline' :: BlockElement -> Int -> [BlockElement] -> (BlockElement, [BlockElement])
mkOutline' soFar _ [] = (soFar, [])
mkOutline' soFar level (x:xs)
= case x of
, linkFragment = Just text
, linkText = Just text
}
- item = [Right link]
+ item = [Inline link]
in
mkOutline' (soFar { listItems = listItems soFar ++ [item] }) n xs
lastItem' :: ListItem
lastItem' = case lastItem of
- [] -> [Left nested]
- i:[] -> i ++ [Left nested]
+ [] -> [Block nested]
+ i:[] -> i ++ [Block nested]
+ _ -> undefined
soFar' = soFar { listItems = nonLastItems ++ [lastItem'] }
in
mkOutline' soFar' level ys
+ _ -> undefined
\ No newline at end of file