1 module Rakka.Wiki.Formatter
7 import Control.Arrow.ArrowList
14 import Text.XML.HXT.Arrow.XmlArrow
15 import Text.XML.HXT.DOM.TypeDefs
19 packParagraph :: [WikiElement] -> [Either BlockElement [InlineElement]]
20 packParagraph elems = map pack grp
22 grp :: [[WikiElement]]
23 grp = groupBy criteria elems
25 criteria :: WikiElement -> WikiElement -> Bool
26 criteria (Inline _) (Inline _) = True
29 pack :: [WikiElement] -> Either BlockElement [InlineElement]
30 pack (Block b : []) = Left b
31 pack xs = Right [ case x of
32 Inline i -> i | x <- xs ]
35 formatWikiElements :: (ArrowXml a, ArrowChoice a) => a (URI, [WikiElement]) XmlTree
37 = proc (baseURI, elems)
38 -> do chunk <- arrL id -< packParagraph elems
40 Left x -> formatBlock -< x
41 Right xs -> formatParagraph -< (baseURI, xs)
44 formatBlock :: (ArrowXml a, ArrowChoice a) => a BlockElement XmlTree
49 -> formatHeading -< (level, text)
54 formatHeading :: ArrowXml a => a (Int, String) XmlTree
57 -> selem ("h" ++ show level) [txt text] -<< ()
60 formatParagraph :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
63 += ( (arr fst &&& arrL snd)
69 formatInline :: (ArrowXml a, ArrowChoice a) => a (URI, InlineElement) XmlTree
77 -> formatPageLink -< (baseURI, link)
80 formatPageLink :: (ArrowXml a) => a (URI, InlineElement) XmlTree
82 = proc (baseURI, PageLink page fragment text)
83 -> let uri = case (page, fragment) of
84 (Just x, Just y) -> mkPageFragmentURI baseURI (fix x) y
85 (Just x, Nothing) -> mkPageURI baseURI (fix x)
86 (Nothing, Just y) -> nullURI { uriFragment = ('#':y) }
87 fix = (\ (x:xs) -> toUpper x : xs) . map (\ c -> if c == ' ' then '_' else c)
88 href = uriToString id uri ""
89 dLabel = fromMaybe "" page ++ fromMaybe "" (fmap ('#':) fragment)
90 label = fromMaybe dLabel text
93 += attr "href" (arr fst >>> mkText)
94 += (arr snd >>> mkText)