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