Skip to content

Commit d34942d

Browse files
pikinier20jchyb
authored andcommitted
Introduce framework to generate html
1 parent 90766d4 commit d34942d

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
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("&", "&amp;")
42+
.replace("<", "&lt;")
43+
.replace(">", "&gt;")
44+
.replace("\"", "&quot;")
45+
.replace("'", "&apos;")
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

Comments
 (0)