1 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
2 {-# LANGUAGE NoMonomorphismRestriction #-}
3 {-# LANGUAGE OverloadedStrings #-}
4 {-# LANGUAGE StandaloneDeriving #-}
5 module Language.DTC.Sym where
7 import Control.Applicative (Applicative(..), (<$>), (<$))
8 import Control.Monad (void)
9 import Data.Default.Class (Default(..))
10 import Data.Foldable (Foldable(..), concat)
11 import Data.Function (($), (.), flip)
12 import Data.Maybe (Maybe(..), maybe)
13 import Data.Text (Text)
14 import Data.TreeSeq.Strict (Tree(..))
15 import qualified Data.Sequence as Seq
16 import qualified Data.Text as Text
19 import Language.RNC.Sym as RNC
20 import Language.DTC.Index (wordify)
21 import qualified Language.DTC.Document as DTC
22 import qualified Language.RNC.Write as RNC
24 foldlApp :: (Default a, Foldable t) => t (a -> a) -> a
25 foldlApp = foldl' (flip ($)) def
26 foldrApp :: (Default a, Foldable t) => t (a -> a) -> a
27 foldrApp = foldr ($) def
29 class RNC.Sym_RNC repr => Sym_DTC repr where
30 position :: repr DTC.Pos
31 document :: repr DTC.Document
34 about :: repr DTC.About
36 version :: repr MayText
37 author :: repr DTC.Entity
38 editor :: repr DTC.Entity
40 entity :: repr DTC.Entity
41 address :: repr DTC.Address
43 serie :: repr DTC.Serie
44 alias :: repr DTC.Alias
47 bodyValue :: repr DTC.BodyValue
48 toc :: repr DTC.BodyValue
49 tof :: repr DTC.BodyValue
50 index :: repr DTC.BodyValue
51 figure :: repr DTC.BodyValue
52 reference :: repr DTC.Reference
53 include :: repr DTC.Include
55 block :: repr DTC.Block
57 lines :: repr (Tree DTC.LineKey DTC.LineValue)
59 commonAttrs :: repr DTC.CommonAttrs
61 title :: repr DTC.Title
72 <$?> (def, Just <$> id)
73 <|?> (def, rule "class" $ attribute "class" $ Text.words <$> text)
75 document = rule "document" $
81 <$> optional (rule "about" $ element "about" about)
87 [ element "section" $ TreeN <$> section <*> body
103 , DTC.Block <$> block
105 title = rule "title" $ DTC.Title <$> element "title" para
106 name = rule "name" $ attribute "name" text
107 url = rule "url" $ URL <$> text
108 path = rule "path" $ Path <$> text
109 ident = rule "ident" $ Ident <$> text
110 to = rule "to" $ attribute "to" ident
111 id = rule "id" $ attribute "id" ident
116 <$?> (0, attribute "year" int)
117 <|?> (Nothing, Just <$> attribute "month" nat1)
118 <|?> (Nothing, Just <$> attribute "day" nat1)
119 include = rule "include" $
123 <$?> (def, attribute "href" path)
124 block = rule "block" $
126 [ DTC.Comment <$> comment
136 <*> many (element "li" $ many block)
141 <*> many (element "li" $ many block)
148 , anyElem $ \n@XmlName{..} ->
159 <*> optional (attribute "depth" nat)
184 (wordify <$>) . Text.lines <$> text)
191 <*> attribute "type" text
194 para = rule "para" $ (Seq.fromList <$>) $ many lines
197 [ element "b" $ TreeN DTC.B <$> para
198 , element "code" $ TreeN DTC.Code <$> para
199 , element "del" $ TreeN DTC.Del <$> para
200 , element "i" $ TreeN DTC.I <$> para
201 , element "note" $ TreeN DTC.Note <$> para
202 , element "q" $ TreeN DTC.Q <$> para
203 , element "sc" $ TreeN DTC.SC <$> para
204 , element "sub" $ TreeN DTC.Sub <$> para
205 , element "sup" $ TreeN DTC.Sup <$> para
206 , element "u" $ TreeN DTC.U <$> para
207 , element "eref" $ TreeN . DTC.Eref <$> attribute "to" url <*> para
208 , element "iref" $ TreeN . DTC.Iref (-1) . wordify <$> attribute "to" text <*> para
209 , element "ref" $ TreeN . DTC.Ref <$> to <*> para
210 , element "rref" $ TreeN . DTC.Rref <$> to <*> para
211 , element "br" $ Tree0 DTC.BR <$ none
212 , Tree0 . DTC.Plain <$> text
214 keyword = rule "keyword" $
215 element "keyword" text
216 version = rule "version" $
218 element "version" text
224 <|?> (Nothing, Just <$> editor)
225 <|?> (Nothing, Just <$> date)
231 author = rule "author" $ element "author" entity
232 editor = rule "editor" $ element "editor" entity
233 entity = rule "entity" $
237 address = rule "address" $
241 <$?> (def, attribute "street" text)
242 <|?> (def, attribute "zipcode" text)
243 <|?> (def, attribute "city" text)
244 <|?> (def, attribute "region" text)
245 <|?> (def, attribute "country" text)
246 <|?> (def, attribute "email" text)
247 <|?> (def, attribute "tel" text)
248 <|?> (def, attribute "fax" text)
249 serie = rule "serie" $
253 <$?> (def, attribute "name" text)
254 <|?> (def, attribute "key" text)
258 (\n h r ls -> DTC.Link n h r (Seq.fromList ls))
259 <$?> (def, attribute "name" text)
260 <|?> (def, attribute "href" url)
261 <|?> (def, attribute "rel" text)
263 alias = rule "alias" $
268 reference = rule "reference" $
269 element "reference" $
272 <*> optional (attribute "to" url)
275 instance Sym_DTC RNC.Writer where
276 position = RNC.writeText ""
277 deriving instance Sym_DTC RNC.RuleWriter
279 dtcRNC :: [RNC.RuleWriter ()]
284 , void $ rule "about" $ element "about" about