0 | module Text.HTML.Node
4 | import Text.HTML.Attribute
5 | import Text.HTML.Event
12 | data Node : (event : Type) -> Type where
15 | -> (0 tpe : HTMLTag tag)
16 | -> List (Attribute tpe ev)
20 | Raw : String -> Node ev
22 | Text : String -> Node ev
27 | FromString (Node ev) where
32 | map f (El tpe xs ys) = El tpe (map f <$> xs) (assert_total $
map f <$> ys)
33 | map f (Raw str) = Raw str
34 | map f (Text str) = Text str
39 | nodeIf : Bool -> Lazy (Node e) -> Node e
41 | nodeIf False _ = Empty
46 | ({0 s : _} -> {0 t : HTMLTag s} -> Attribute t e)
49 | withAttribute a (El tp as ns) = El tp (a ::as) ns
50 | withAttribute a n = n
54 | withId : String -> Node e -> Node e
55 | withId s (El tp as ns) = El tp (Id (Id s) :: as) ns
60 | withEv : DOMEvent e -> Node e -> Node e
61 | withEv ev (El tp as ns) = El tp (Event ev :: as) ns
65 | a : List (Attribute A ev) -> List (Node ev) -> Node ev
69 | address : List (Attribute Address ev) -> List (Node ev) -> Node ev
73 | area : List (Attribute Area ev) -> List (Node ev) -> Node ev
77 | article : List (Attribute Article ev) -> List (Node ev) -> Node ev
81 | aside : List (Attribute Aside ev) -> List (Node ev) -> Node ev
85 | audio : List (Attribute Audio ev) -> List (Node ev) -> Node ev
89 | base : List (Attribute Base ev) -> List (Node ev) -> Node ev
93 | blockquote : List (Attribute Blockquote ev) -> List (Node ev) -> Node ev
97 | body : List (Attribute Tag.Body ev) -> List (Node ev) -> Node ev
101 | br : List (Attribute Br ev) -> List (Node ev) -> Node ev
105 | button : List (Attribute Tag.Button ev) -> List (Node ev) -> Node ev
109 | canvas : List (Attribute Canvas ev) -> List (Node ev) -> Node ev
113 | caption : List (Attribute Caption ev) -> List (Node ev) -> Node ev
117 | col : List (Attribute Col ev) -> List (Node ev) -> Node ev
121 | colgroup : List (Attribute Colgroup ev) -> List (Node ev) -> Node ev
125 | data_ : List (Attribute Data ev) -> List (Node ev) -> Node ev
129 | datalist : List (Attribute Datalist ev) -> List (Node ev) -> Node ev
133 | del : List (Attribute Del ev) -> List (Node ev) -> Node ev
137 | details : List (Attribute Details ev) -> List (Node ev) -> Node ev
141 | dialog : List (Attribute Dialog ev) -> List (Node ev) -> Node ev
145 | div : List (Attribute Div ev) -> List (Node ev) -> Node ev
149 | dl : List (Attribute Dl ev) -> List (Node ev) -> Node ev
153 | embed : List (Attribute Embed ev) -> List (Node ev) -> Node ev
157 | fieldset : List (Attribute FieldSet ev) -> List (Node ev) -> Node ev
161 | footer : List (Attribute Footer ev) -> List (Node ev) -> Node ev
165 | form : List (Attribute Form ev) -> List (Node ev) -> Node ev
169 | h1 : List (Attribute H1 ev) -> List (Node ev) -> Node ev
173 | h2 : List (Attribute H2 ev) -> List (Node ev) -> Node ev
177 | h3 : List (Attribute H3 ev) -> List (Node ev) -> Node ev
181 | h4 : List (Attribute H4 ev) -> List (Node ev) -> Node ev
185 | h5 : List (Attribute H5 ev) -> List (Node ev) -> Node ev
189 | h6 : List (Attribute H6 ev) -> List (Node ev) -> Node ev
193 | header : List (Attribute Header ev) -> List (Node ev) -> Node ev
197 | hr : List (Attribute HR ev) -> List (Node ev) -> Node ev
201 | html : List (Attribute Html ev) -> List (Node ev) -> Node ev
205 | iframe : List (Attribute IFrame ev) -> List (Node ev) -> Node ev
209 | img : List (Attribute Img ev) -> List (Node ev) -> Node ev
213 | input : List (Attribute Tag.Input ev) -> List (Node ev) -> Node ev
217 | ins : List (Attribute Ins ev) -> List (Node ev) -> Node ev
221 | label : List (Attribute Label ev) -> List (Node ev) -> Node ev
225 | legend : List (Attribute Legend ev) -> List (Node ev) -> Node ev
229 | li : List (Attribute Li ev) -> List (Node ev) -> Node ev
233 | link : List (Attribute Link ev) -> List (Node ev) -> Node ev
237 | map : List (Attribute Tag.Map ev) -> List (Node ev) -> Node ev
241 | menu : List (Attribute Menu ev) -> List (Node ev) -> Node ev
245 | meta : List (Attribute Meta ev) -> List (Node ev) -> Node ev
249 | meter : List (Attribute Meter ev) -> List (Node ev) -> Node ev
253 | object : List (Attribute Tag.Object ev) -> List (Node ev) -> Node ev
257 | ol : List (Attribute Ol ev) -> List (Node ev) -> Node ev
261 | optgroup : List (Attribute OptGroup ev) -> List (Node ev) -> Node ev
265 | option : List (Attribute Option ev) -> List (Node ev) -> Node ev
269 | output : List (Attribute Output ev) -> List (Node ev) -> Node ev
273 | p : List (Attribute P ev) -> List (Node ev) -> Node ev
277 | param : List (Attribute Param ev) -> List (Node ev) -> Node ev
281 | picture : List (Attribute Picture ev) -> List (Node ev) -> Node ev
285 | pre : List (Attribute Pre ev) -> List (Node ev) -> Node ev
289 | progress : List (Attribute Progress ev) -> List (Node ev) -> Node ev
293 | q : List (Attribute Q ev) -> List (Node ev) -> Node ev
297 | script : List (Attribute Script ev) -> List (Node ev) -> Node ev
301 | section : List (Attribute Section ev) -> List (Node ev) -> Node ev
305 | select : List (Attribute Select ev) -> List (Node ev) -> Node ev
309 | slot : List (Attribute Slot ev) -> List (Node ev) -> Node ev
313 | source : List (Attribute Source ev) -> List (Node ev) -> Node ev
317 | span : List (Attribute Span ev) -> List (Node ev) -> Node ev
321 | style : List (Attribute Style ev) -> List (Node ev) -> Node ev
325 | table : List (Attribute Table ev) -> List (Node ev) -> Node ev
329 | tbody : List (Attribute Tbody ev) -> List (Node ev) -> Node ev
333 | td : List (Attribute Td ev) -> List (Node ev) -> Node ev
337 | template : List (Attribute Template ev) -> List (Node ev) -> Node ev
341 | textarea : List (Attribute TextArea ev) -> List (Node ev) -> Node ev
345 | tfoot : List (Attribute Tfoot ev) -> List (Node ev) -> Node ev
349 | th : List (Attribute Th ev) -> List (Node ev) -> Node ev
353 | thead : List (Attribute Thead ev) -> List (Node ev) -> Node ev
357 | time : List (Attribute Tag.Time ev) -> List (Node ev) -> Node ev
361 | title : List (Attribute Title ev) -> List (Node ev) -> Node ev
365 | tr : List (Attribute Tr ev) -> List (Node ev) -> Node ev
369 | track : List (Attribute Track ev) -> List (Node ev) -> Node ev
373 | ul : List (Attribute Ul ev) -> List (Node ev) -> Node ev
377 | video : List (Attribute Video ev) -> List (Node ev) -> Node ev
385 | escape : String -> String
386 | escape = fastConcat . map esc . unpack
389 | esc : Char -> String
398 | esc c = if c < ' ' then "" else singleton c
400 | attrs : List (Attribute t ev) -> String
401 | attrs as = let s = displayAttributes as in if null s then "" else " " ++ s
404 | render : Node ev -> String
405 | render n = case n of
408 | El {tag} _ as ns => "<\{tag}\{attrs as}>\{go [<] ns}</\{tag}>"
412 | go : SnocList String -> List (Node ev) -> String
413 | go ss (n :: ns) = go (ss :< render n) ns
414 | go ss [] = concat $
ss <>> []
417 | renderMany : List (Node ev) -> String
418 | renderMany = fastConcat . map render