0 | module Text.HTML.Node
4 | import FS.Concurrent.Signal
5 | import Text.HTML.Attribute
6 | import Text.HTML.Event
13 | data HTMLNode : Type where
15 | -> (0 tpe : HTMLTag tag)
16 | -> List (Attribute tpe)
21 | EEl : {tag : String}
22 | -> (0 tpe : HTMLTag tag)
23 | -> List (Attribute tpe)
26 | Raw : String -> HTMLNode
28 | Text : String -> HTMLNode
34 | HTMLNodes = List HTMLNode
37 | FromString HTMLNode where
42 | isEmpty : HTMLNode -> Bool
43 | isEmpty Empty = True
48 | nonEmpty : HTMLNode -> Bool
49 | nonEmpty = not . isEmpty
53 | nodeIf : Bool -> Lazy HTMLNode -> HTMLNode
55 | nodeIf False _ = Empty
59 | nodeMaybe : (a -> HTMLNode) -> Maybe a -> HTMLNode
60 | nodeMaybe f = maybe Empty f
65 | ({0 s : _} -> {0 t : HTMLTag s} -> List (Attribute t))
68 | withAttributes a (El tp as ns) = El tp (a ++ as) ns
69 | withAttributes a (EEl tp as) = EEl tp (a ++ as)
70 | withAttributes a n = n
75 | ({0 s : _} -> {0 t : HTMLTag s} -> Attribute t)
78 | withAttribute a = withAttributes [a]
82 | withId : String -> HTMLNode -> HTMLNode
83 | withId s (El tp as ns) = El tp (Id (Id s) :: as) ns
84 | withId s (EEl tp as) = EEl tp (Id (Id s) :: as)
89 | withEv : Sink e => DOMEvent e -> HTMLNode -> HTMLNode
90 | withEv ev (El tp as ns) = El tp (Event ev :: as) ns
91 | withEv ev (EEl tp as) = EEl tp (Event ev :: as)
95 | a : List (Attribute A) -> HTMLNodes -> HTMLNode
99 | address : List (Attribute Address) -> HTMLNodes -> HTMLNode
103 | area : List (Attribute Area) -> HTMLNode
107 | article : List (Attribute Article) -> HTMLNodes -> HTMLNode
111 | aside : List (Attribute Aside) -> HTMLNodes -> HTMLNode
115 | audio : List (Attribute Audio) -> HTMLNodes -> HTMLNode
119 | base : List (Attribute Base) -> HTMLNode
123 | blockquote : List (Attribute Blockquote) -> HTMLNodes -> HTMLNode
127 | body : List (Attribute Tag.Body) -> HTMLNodes -> HTMLNode
131 | br : List (Attribute Br) -> HTMLNode
135 | button : List (Attribute Tag.Button) -> HTMLNodes -> HTMLNode
139 | canvas : List (Attribute Canvas) -> HTMLNodes -> HTMLNode
143 | caption : List (Attribute Caption) -> HTMLNodes -> HTMLNode
147 | col : List (Attribute Col) -> HTMLNode
151 | colgroup : List (Attribute Colgroup) -> HTMLNodes -> HTMLNode
155 | data_ : List (Attribute Data) -> HTMLNodes -> HTMLNode
159 | datalist : List (Attribute Datalist) -> HTMLNodes -> HTMLNode
163 | del : List (Attribute Del) -> HTMLNodes -> HTMLNode
167 | details : List (Attribute Details) -> HTMLNodes -> HTMLNode
171 | dialog : List (Attribute Dialog) -> HTMLNodes -> HTMLNode
175 | div : List (Attribute Div) -> HTMLNodes -> HTMLNode
179 | dl : List (Attribute Dl) -> HTMLNodes -> HTMLNode
183 | embed : List (Attribute Embed) -> HTMLNode
184 | embed as = El _ as []
187 | fieldset : List (Attribute FieldSet) -> HTMLNodes -> HTMLNode
191 | footer : List (Attribute Footer) -> HTMLNodes -> HTMLNode
195 | form : List (Attribute Form) -> HTMLNodes -> HTMLNode
199 | h1 : List (Attribute H1) -> HTMLNodes -> HTMLNode
203 | h2 : List (Attribute H2) -> HTMLNodes -> HTMLNode
207 | h3 : List (Attribute H3) -> HTMLNodes -> HTMLNode
211 | h4 : List (Attribute H4) -> HTMLNodes -> HTMLNode
215 | h5 : List (Attribute H5) -> HTMLNodes -> HTMLNode
219 | h6 : List (Attribute H6) -> HTMLNodes -> HTMLNode
223 | header : List (Attribute Header) -> HTMLNodes -> HTMLNode
227 | hr : List (Attribute HR) -> HTMLNode
231 | html : List (Attribute Html) -> HTMLNodes -> HTMLNode
235 | iframe : List (Attribute IFrame) -> HTMLNodes -> HTMLNode
239 | img : List (Attribute Img) -> HTMLNode
243 | input : List (Attribute Tag.Input) -> HTMLNode
247 | ins : List (Attribute Ins) -> HTMLNodes -> HTMLNode
251 | label : List (Attribute Label) -> HTMLNodes -> HTMLNode
255 | legend : List (Attribute Legend) -> HTMLNodes -> HTMLNode
259 | li : List (Attribute Li) -> HTMLNodes -> HTMLNode
263 | link : List (Attribute Link) -> HTMLNode
267 | map : List (Attribute Tag.Map) -> HTMLNodes -> HTMLNode
271 | menu : List (Attribute Menu) -> HTMLNodes -> HTMLNode
275 | meta : List (Attribute Meta) -> HTMLNode
279 | meter : List (Attribute Meter) -> HTMLNodes -> HTMLNode
283 | object : List (Attribute Tag.Object) -> HTMLNodes -> HTMLNode
287 | ol : List (Attribute Ol) -> HTMLNodes -> HTMLNode
291 | optgroup : List (Attribute OptGroup) -> HTMLNodes -> HTMLNode
295 | option : List (Attribute Option) -> HTMLNodes -> HTMLNode
299 | output : List (Attribute Output) -> HTMLNodes -> HTMLNode
303 | p : List (Attribute P) -> HTMLNodes -> HTMLNode
307 | param : List (Attribute Param) -> HTMLNode
311 | picture : List (Attribute Picture) -> HTMLNodes -> HTMLNode
315 | pre : List (Attribute Pre) -> HTMLNodes -> HTMLNode
319 | progress : List (Attribute Progress) -> HTMLNodes -> HTMLNode
323 | q : List (Attribute Q) -> HTMLNodes -> HTMLNode
327 | script : List (Attribute Script) -> HTMLNodes -> HTMLNode
331 | section : List (Attribute Section) -> HTMLNodes -> HTMLNode
335 | select : List (Attribute Select) -> HTMLNodes -> HTMLNode
339 | slot : List (Attribute Slot) -> HTMLNodes -> HTMLNode
343 | source : List (Attribute Source) -> HTMLNode
344 | source as = El _ as []
347 | span : List (Attribute Span) -> HTMLNodes -> HTMLNode
351 | style : List (Attribute Style) -> HTMLNodes -> HTMLNode
355 | table : List (Attribute Table) -> HTMLNodes -> HTMLNode
359 | tbody : List (Attribute Tbody) -> HTMLNodes -> HTMLNode
363 | td : List (Attribute Td) -> HTMLNodes -> HTMLNode
367 | template : List (Attribute Template) -> HTMLNodes -> HTMLNode
371 | textarea : List (Attribute TextArea) -> HTMLNodes -> HTMLNode
375 | tfoot : List (Attribute Tfoot) -> HTMLNodes -> HTMLNode
379 | th : List (Attribute Th) -> HTMLNodes -> HTMLNode
383 | thead : List (Attribute Thead) -> HTMLNodes -> HTMLNode
387 | time : List (Attribute Tag.Time) -> HTMLNodes -> HTMLNode
391 | title : List (Attribute Title) -> HTMLNodes -> HTMLNode
395 | tr : List (Attribute Tr) -> HTMLNodes -> HTMLNode
399 | track : List (Attribute Track) -> HTMLNode
403 | ul : List (Attribute Ul) -> HTMLNodes -> HTMLNode
407 | video : List (Attribute Video) -> HTMLNodes -> HTMLNode
415 | escape : String -> String
416 | escape = fastConcat . map esc . unpack
419 | esc : Char -> String
428 | esc c = if c < ' ' then "" else singleton c
430 | attrs : List (Attribute t) -> String
431 | attrs as = let s = displayAttributes as in if null s then "" else " " ++ s
434 | render : HTMLNode -> String
435 | render n = case n of
438 | EEl {tag} _ as => "<\{tag}\{attrs as}>"
439 | El {tag} _ as ns => "<\{tag}\{attrs as}>\{go [<] ns}</\{tag}>"
443 | go : SnocList String -> HTMLNodes -> String
444 | go ss (n :: ns) = go (ss :< render n) ns
445 | go ss [] = concat $
ss <>> []
448 | renderMany : HTMLNodes -> String
449 | renderMany = fastConcat . map render