1
+ package dotty .tools .scaladoc
2
+ package utils
3
+
4
+ import scala .scalajs .js
5
+ import org .scalajs .dom .{html => domhtml , _ }
6
+
7
+ object HTML {
8
+ type TagArg = domhtml.Element | Seq [domhtml.Element | String ] | String
9
+
10
+ type AttrArg = AppliedAttr | Seq [AppliedAttr ]
11
+
12
+ case class Tag [T <: domhtml.Element ](private val elemFactory : () => T ):
13
+ private def textNode (s : String ): Text = document.createTextNode(s)
14
+
15
+ def apply (tags : TagArg * ): T = apply()(tags:_* )
16
+ def apply (first : AttrArg , rest : AttrArg * ): T = apply((first +: rest):_* )()
17
+ def apply (attrs : AttrArg * )(tags : TagArg * ): T =
18
+ val elem : T = elemFactory()
19
+ def unpackTags (tags : TagArg * ): Unit = tags.foreach {
20
+ case e : domhtml.Element => elem.appendChild(e)
21
+ case s : String => elem.appendChild(textNode(s.escapeReservedTokens))
22
+ case elemSeq : (Seq [domhtml.Element | String ] @ unchecked) => unpackTags(elemSeq* )
23
+ }
24
+
25
+ def unpackAttributes (attrs : AttrArg * ): Unit = attrs.foreach {
26
+ case (" id" , id) => elem.id = id
27
+ case (" class" , value) => value.split(" \\ s+" ).foreach(cls => elem.classList.add(cls))
28
+ case (attr, value) => elem.setAttribute(attr, value)
29
+ case s : Seq [AppliedAttr ] => unpackAttributes(s* )
30
+ }
31
+
32
+ unpackTags(tags:_* )
33
+ unpackAttributes(attrs:_* )
34
+ elem
35
+
36
+ object Tag :
37
+ def apply [T <: domhtml.Element ](s : String ): Tag [T ] =
38
+ Tag [T ](() => document.createElement(s).asInstanceOf [T ])
39
+
40
+ extension (s : String ) def escapeReservedTokens : String =
41
+ s.replace(" &" , " &" )
42
+ .replace(" <" , " <" )
43
+ .replace(" >" , " >" )
44
+ .replace(" \" " , " "" )
45
+ .replace(" '" , " '" )
46
+
47
+ case class Attr (name : String ):
48
+ def := (value : String ): AppliedAttr = new AppliedAttr (name, value)
49
+
50
+ opaque type AppliedAttr = (String , String )
51
+
52
+ val div = Tag [domhtml.Div ](" div" )
53
+ val span = Tag [domhtml.Span ](" span" )
54
+ val a = Tag [domhtml.Anchor ](" a" )
55
+ val p = Tag [domhtml.Paragraph ](" p" )
56
+ val h1 = Tag [domhtml.Heading ](" h1" )
57
+ val h2 = Tag [domhtml.Heading ](" h2" )
58
+ val h3 = Tag [domhtml.Heading ](" h3" )
59
+ val h4 = Tag [domhtml.Heading ](" h4" )
60
+ val h5 = Tag [domhtml.Heading ](" h5" )
61
+ val h6 = Tag [domhtml.Heading ](" h6" )
62
+ val dl = Tag [domhtml.DList ](" dl" )
63
+ val dd = Tag [domhtml.Element ](" dd" )
64
+ val dt = Tag [domhtml.Element ](" dt" )
65
+ val svg = Tag [domhtml.Element ](" svg" )
66
+ val button = Tag [domhtml.Button ](" button" )
67
+ val input = Tag [domhtml.Input ](" input" )
68
+ val label = Tag [domhtml.Label ](" label" )
69
+ val script = Tag [domhtml.Script ](" script" )
70
+ val link = Tag [domhtml.Link ](" link" )
71
+ val footer = Tag [domhtml.Element ](" footer" )
72
+ val htmlelem = Tag [domhtml.Html ](" html" )
73
+ val head = Tag [domhtml.Head ](" head" )
74
+ val meta = Tag [domhtml.Element ](" meta" )
75
+ val main = Tag [domhtml.Element ](" main" )
76
+ val title = Tag [domhtml.Title ](" title" )
77
+ val body = Tag [domhtml.Body ](" body" )
78
+ val nav = Tag [domhtml.Element ](" nav" )
79
+ val img = Tag [domhtml.Image ](" img" )
80
+ val ul = Tag [domhtml.UList ](" ul" )
81
+ val ol = Tag [domhtml.OList ](" ol" )
82
+ val li = Tag [domhtml.LI ](" li" )
83
+ val code = Tag [domhtml.Element ](" code" )
84
+ val pre = Tag [domhtml.Pre ](" pre" )
85
+ val table = Tag [domhtml.Table ](" table" )
86
+ val thead = Tag [domhtml.Element ](" thead" )
87
+ val tbody = Tag [domhtml.Element ](" tbody" )
88
+ val th = Tag [domhtml.TableCell ](" th" )
89
+ val tr = Tag [domhtml.TableRow ](" tr" )
90
+ val td = Tag [domhtml.TableCell ](" td" )
91
+
92
+ val cls = Attr (" class" )
93
+ val href = Attr (" href" )
94
+ val style = Attr (" style" )
95
+ val id = Attr (" id" )
96
+ val `type` = Attr (" type" )
97
+ val placeholder = Attr (" placeholder" )
98
+ val defer = Attr (" defer" )
99
+ val src = Attr (" src" )
100
+ val rel = Attr (" rel" )
101
+ val charset = Attr (" charset" )
102
+ val name = Attr (" name" )
103
+ val content = Attr (" content" )
104
+ val testId = Attr (" data-test-id" )
105
+ val alt = Attr (" alt" )
106
+ val value = Attr (" value" )
107
+ val onclick = Attr (" onclick" )
108
+ val titleAttr = Attr (" title" )
109
+ val onkeyup = Attr (" onkeyup" )
110
+
111
+ }
0 commit comments