1 import Base 2 import ./type.bend as M 3 4 # Printing markup: text and attribute values are escaped; Raw is printed as it is (a stylesheet or a 5 # script, whose own language has no markup in it). 6 7 def escape.go(cs: List<&2, Char>) -> String: 8 match cs: 9 case []: 10 "" 11 case +c <> rest: 12 Bool.pick(String, Char.is_eq(c, '&'), "&", 13 Bool.pick(String, Char.is_eq(c, '<'), "<", 14 Bool.pick(String, Char.is_eq(c, '>'), ">", 15 Bool.pick(String, Char.is_eq(c, '"'), """, String.from_list([c]))))) ++ escape.go(rest) 16 17 def escape(s: String) -> String: 18 escape.go(String.to_list(s)) 19 20 def attributes(xs: List<&2, M.Attribute>) -> String: 21 match xs: 22 case []: 23 "" 24 case M.Attribute{n, v} <> rest: 25 " " ++ n ++ "=\"" ++ escape(v) ++ "\"" ++ attributes(rest) 26 27 def print(ns: List<&2, M.Node>) -> String: 28 match ns: 29 case []: 30 "" 31 case M.Element{+tag, xs, children} <> rest: 32 "<" ++ tag ++ attributes(xs) ++ ">" ++ print(children) ++ "" ++ print(rest) 33 case M.Void{tag, xs} <> rest: 34 "<" ++ tag ++ attributes(xs) ++ ">" ++ print(rest) 35 case M.Text{t} <> rest: 36 escape(t) ++ print(rest) 37 case M.Raw{t} <> rest: 38 t ++ print(rest)