1 {-# LANGUAGE FlexibleInstances #-}
2 {-# LANGUAGE OverloadedStrings #-}
3 {-# OPTIONS_GHC -fno-warn-orphans #-}
4 module Hdoc.DTC.Write.XML where
6 import Control.Monad (forM_)
8 import Data.Foldable (Foldable(..))
9 import Data.Function (($), (.))
10 import Data.Functor ((<$>))
11 import Data.Maybe (Maybe(..))
12 import Data.Monoid (Monoid(..))
13 import Data.Sequence (Seq)
14 import Data.TreeSeq.Strict (Tree(..))
15 import Text.Blaze ((!))
16 import Text.Blaze.Utils
17 import Text.Blaze.XML (XML)
18 import qualified Data.Function as Fun
19 import qualified Data.Text.Lazy as TL
20 import qualified Text.Blaze as B
21 import qualified Text.Blaze.DTC as XML
22 import qualified Text.Blaze.DTC.Attributes as XA
23 import qualified Text.Blaze.Internal as B
26 import Hdoc.DTC.Analyze.Index (plainifyWords)
27 import Hdoc.DTC.Document as DTC
29 writeXML :: Locales ls => LocaleIn ls -> Document -> XML
30 writeXML _loc Document{..} = do
31 XML.xmlModel "./schema/dtc.rnc"
33 let lang = Text.takeWhile Char.isAlphaNum $ textLocales Map.! loc
34 XML.xmlStylesheet $ "./xsl/document.html5."<>lang<>".xsl"
35 XML.html5Stylesheet $ "./xsl/document.html5."<>lang<>".xsl"
36 XML.atomStylesheet $ "./xsl/document.atom."<>lang<>".xsl"
39 forM_ document_head xmlify
46 instance Xmlify TL.Text where
48 instance Xmlify Head where
51 -- TODO: xmlify head_section
52 instance Xmlify (Tree BodyNode) where
55 BodyBlock b -> xmlify b
56 BodySection Section{..} ->
57 xmlCommonAttrs section_attrs $
61 instance Xmlify Block where
63 BlockPara para -> xmlify para
65 xmlCommonAttrs attrs $
68 xmlCommonAttrs attrs $
70 !?? mayAttr XA.depth depth
72 xmlCommonAttrs attrs $
78 xmlCommonAttrs attrs $
81 forM_ index $ \aliases ->
85 plainifyWords <$> aliases
87 xmlCommonAttrs attrs $
91 xmlCommonAttrs attrs $
93 ! XA.type_ (attrify type_) $ do
96 BlockReferences{..} ->
97 xmlCommonAttrs attrs $
98 XML.references $ xmlify refs
99 instance Xmlify Para where
101 ParaItem{..} -> xmlify item
102 ParaItems{..} -> xmlCommonAttrs attrs $ XML.para $ xmlify items
103 instance Xmlify ParaItem where
105 ParaPlain p -> XML.p $ xmlify p
107 XML.comment $ TL.toStrict c
110 ! XA.type_ (attrify type_) $ do
114 ! XA.type_ (attrify type_) $ do
116 ParaOL items -> XML.ol $ forM_ items xmlify
117 ParaUL items -> XML.ul $ forM_ items $ XML.li . xmlify
118 ParaJudgment j -> xmlify j
119 instance Xmlify Judgment where
123 ! XA.judges (attrify judgment_judgesId)
124 ! XA.grades (attrify judgment_gradesId) $
125 xmlify judgment_question
126 -- TODO: xmlify judgment_choices
127 instance Xmlify ListItem where
128 xmlify ListItem{..} =
129 XML.li ! XA.name (attrify name) $ xmlify paras
130 instance Xmlify (Tree PlainNode) where
133 PlainText t -> xmlify t
135 PlainGroup -> xmlify ts
136 PlainB -> XML.b $ xmlify ts
137 PlainCode -> XML.code $ xmlify ts
138 PlainDel -> XML.del $ xmlify ts
139 PlainI -> XML.i $ xmlify ts
140 PlainNote{..} -> XML.note $ xmlify note_paras
141 PlainQ -> XML.q $ xmlify ts
142 PlainSpan{..} -> xmlCommonAttrs attrs $ XML.span $ xmlify ts
143 PlainSC -> XML.sc $ xmlify ts
144 PlainSub -> XML.sub $ xmlify ts
145 PlainSup -> XML.sup $ xmlify ts
146 PlainU -> XML.u $ xmlify ts
147 PlainEref to -> XML.eref ! XA.to (attrify to) $ xmlify ts
148 PlainIref{..} -> XML.iref ! XA.term (attrify $ plainifyWords iref_term) $ xmlify ts
149 PlainAt{..} -> (if at_back then XML.at_back else XML.at)
150 ! XA.to (attrify at_ident) $ xmlify ts
151 PlainTag{..} -> (if tag_back then XML.tag_back else XML.at)
152 ! XA.to (attrify tag_ident) $ xmlify ts
153 PlainRef{..} -> XML.ref ! XA.to (attrify ref_ident) $ xmlify ts
155 instance Xmlify About where
156 xmlify About{..} = do
160 forM_ about_authors xmlify
161 forM_ about_dates xmlify
162 forM_ about_tags $ XML.tag . xmlify
163 forM_ about_links xmlify
164 xmlify about_description
165 xmlify about_judgments
166 instance Xmlify Include where
169 ! XA.href (attrify include_href)
170 instance Xmlify Date where
173 ! XA.year (attrify date_year)
174 !?? mayAttr XA.rel date_rel
175 !?? mayAttr XA.role date_role
176 !?? mayAttr XA.month date_month
177 !?? mayAttr XA.day date_day
178 instance Xmlify Link where
181 !?? mayAttr XA.rel link_rel
182 !?? mayAttr XA.role link_role
183 !?? mayAttr XA.href link_url
184 -- !?? mayAttr XA.type_ link_type
186 instance Xmlify Entity where
189 !?? mayAttr XA.rel entity_rel
190 !?? mayAttr XA.role entity_role
191 !?? mayAttr XA.name entity_name
192 !?? mayAttr XA.street entity_street
193 !?? mayAttr XA.zipcode entity_zipcode
194 !?? mayAttr XA.city entity_city
195 !?? mayAttr XA.region entity_region
196 !?? mayAttr XA.country entity_country
197 !?? mayAttr XA.email entity_email
198 !?? mayAttr XA.tel entity_tel
199 !?? mayAttr XA.fax entity_fax
201 instance Xmlify Title where
202 xmlify (Title t) = XML.title $ xmlify t
203 instance Xmlify Alias where
205 xmlCommonAttrs alias_attrs $
208 instance Xmlify Reference where
209 xmlify Reference{..} = XML.reference mempty -- TODO: to be coded
211 instance Xmlify a => Xmlify (Maybe a) where
212 xmlify = foldMap xmlify
213 instance Xmlify a => Xmlify [a] where
214 xmlify = foldMap xmlify
215 instance Xmlify a => Xmlify (Seq a) where
216 xmlify = foldMap xmlify
218 xmlId :: Ident -> B.Attribute
219 xmlId (Ident i) = XA.id $ attrify i
221 xmlCommonAttrs :: CommonAttrs -> XML -> XML
222 xmlCommonAttrs CommonAttrs{..} =
226 B.AddCustomAttribute "id" $
227 B.String $ TL.unpack i) .
228 case attrs_classes of
231 B.AddCustomAttribute "class" $
232 B.String $ TL.unpack $ TL.unwords attrs_classes