1 module Rakka.Wiki.Formatter
7 import Control.Arrow.ArrowList
14 import Text.XML.HXT.Arrow.XmlArrow
15 import Text.XML.HXT.DOM.TypeDefs
18 formatWikiBlocks :: (ArrowXml a, ArrowChoice a) => a (URI, [BlockElement]) XmlTree
20 = proc (baseURI, blocks)
21 -> do block <- arrL id -< blocks
22 formatBlock -< (baseURI, block)
25 formatBlock :: (ArrowXml a, ArrowChoice a) => a (URI, BlockElement) XmlTree
27 = proc (baseURI, block)
30 -> formatHeading -< (level, text)
36 -> formatListElement -< (baseURI, list)
39 -> formatLeadingSpaced -< (baseURI, inlines)
42 -> formatParagraph -< (baseURI, inlines)
45 formatHeading :: ArrowXml a => a (Int, String) XmlTree
48 -> selem ("h" ++ show level) [txt text] -<< ()
51 formatListElement :: (ArrowXml a, ArrowChoice a) => a (URI, ListElement) XmlTree
53 = proc (baseURI, list)
54 -> let tag = case listType list of
59 += ( (constA baseURI &&& constL (listItems list))
65 formatListItem :: (ArrowXml a, ArrowChoice a) => a (URI, ListItem) XmlTree
67 = proc (baseURI, item)
69 += ( (arr fst &&& arrL snd)
74 formatListItem' :: (ArrowXml a, ArrowChoice a) => a (URI, Either ListElement InlineElement) XmlTree
78 Left nestedList -> formatListElement -< (baseURI, nestedList)
79 Right inline -> formatInline -< (baseURI, inline )
82 formatLeadingSpaced :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
85 += ( (arr fst &&& arrL snd)
91 formatParagraph :: (ArrowXml a, ArrowChoice a) => a (URI, [InlineElement]) XmlTree
94 += ( (arr fst &&& arrL snd)
100 formatInline :: (ArrowXml a, ArrowChoice a) => a (URI, InlineElement) XmlTree
107 link@(PageLink _ _ _)
108 -> formatPageLink -< (baseURI, link)
111 formatPageLink :: (ArrowXml a) => a (URI, InlineElement) XmlTree
113 = proc (baseURI, PageLink page fragment text)
114 -> let uri = case (page, fragment) of
115 (Just x, Just y) -> mkPageFragmentURI baseURI (fix x) y
116 (Just x, Nothing) -> mkPageURI baseURI (fix x)
117 (Nothing, Just y) -> nullURI { uriFragment = ('#':y) }
118 fix = (\ (x:xs) -> toUpper x : xs) . map (\ c -> if c == ' ' then '_' else c)
119 href = uriToString id uri ""
120 dLabel = fromMaybe "" page ++ fromMaybe "" (fmap ('#':) fragment)
121 label = fromMaybe dLabel text
124 += attr "href" (arr fst >>> mkText)
125 += (arr snd >>> mkText)