1 module Rakka.Wiki.Formatter
7 import Control.Arrow.ArrowList
13 import Text.XML.HXT.Arrow.XmlArrow
14 import Text.XML.HXT.DOM.TypeDefs
18 packParagraph :: [WikiElement] -> [Either BlockElement [InlineElement]]
19 packParagraph elems = map pack grp
21 grp :: [[WikiElement]]
22 grp = groupBy criteria elems
24 criteria :: WikiElement -> WikiElement -> Bool
25 criteria (Inline _) (Inline _) = True
28 pack :: [WikiElement] -> Either BlockElement [InlineElement]
29 pack (Block b : []) = Left b
30 pack xs = Right [ case x of
31 Inline i -> i | x <- xs ]
34 formatWikiElements :: (ArrowXml a, ArrowChoice a) => a (URI, [WikiElement]) XmlTree
36 = proc (baseURI, elems)
37 -> do chunk <- arrL id -< packParagraph elems
39 Left x -> formatBlock -< x
40 Right xs -> formatParagraph -< (baseURI, xs)
43 formatBlock :: (ArrowXml a, ArrowChoice a) => a BlockElement XmlTree
48 -> formatHeading -< (level, text)
53 formatHeading :: ArrowXml a => a (Int, String) XmlTree
56 -> selem ("h" ++ show level) [txt text] -<< ()
59 formatParagraph :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
62 += ( (arr fst &&& arrL snd)
68 formatInline :: (ArrowXml a, ArrowChoice a) => a (URI, InlineElement) XmlTree
76 -> formatPageLink -< (baseURI, link)
79 formatPageLink :: (ArrowXml a) => a (URI, InlineElement) XmlTree
81 = proc (baseURI, PageLink page fragment text)
82 -> let uri = case (page, fragment) of
83 (Just x, Just y) -> mkPageFragmentURI baseURI x y
84 (Just x, Nothing) -> mkPageURI baseURI x
85 (Nothing, Just y) -> nullURI { uriFragment = ('#':y) }
86 href = uriToString id uri ""
87 dLabel = fromMaybe "" page ++ fromMaybe "" (fmap ('#':) fragment)
88 label = fromMaybe dLabel text
91 += attr "href" (arr fst >>> mkText)
92 += (arr snd >>> mkText)