-
Notifications
You must be signed in to change notification settings - Fork 0
/
htmltags.go
255 lines (215 loc) · 8.25 KB
/
htmltags.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
package lwdx
import "fmt"
// MAIN REFERENCE:
// https://html.spec.whatwg.org/
// var's defined in this file:
// var AllHtmlBlockTags map[string]void
// var AllHtmlInlineTags map[string]void
// var AllHtmlHiddenTags map[string]void
// var AllHtmlVoidTags map[string]void
// var AllHtmlEmbeddedContentTags []string
// var AllHtmlInteractiveContentTags []string
var AllHtmlTags map[string]BlockInlineOther
func init() {
AllHtmlTags = make(map[string]BlockInlineOther)
AllHtmlBlockTags = make(map[string]void)
for _, s := range allHtmlBlockTags {
AllHtmlBlockTags[s] = aVoid
AddToAllHtmlTags(s, BIO(true, false))
}
AllHtmlInlineTags = make(map[string]void)
for _, s := range allHtmlInlineTags {
AllHtmlInlineTags[s] = aVoid
AddToAllHtmlTags(s, BIO(false, true))
}
AllHtmlHiddenTags = make(map[string]void)
for _, s := range allHtmlHiddenTags {
AllHtmlHiddenTags[s] = aVoid
AddToAllHtmlTags(s, BIO(false, false))
}
}
func AddToAllHtmlTags(tag string, bio BlockInlineOther) {
prevBio, ok := AllHtmlTags[tag]
if !ok {
// Not in the map yet
AllHtmlTags[tag] = bio
} else {
// Is already in map
// Is value a dupe ?
if bio.IsBlock == prevBio.IsBlock &&
bio.IsInline == prevBio.IsInline {
fmt.Printf("Html dupeVal <%s>\t %t,%t \n",
tag, bio.IsBlock, prevBio.IsBlock)
} else {
fmt.Printf("Html conflict <%s>\t B,%t,%t I,%t,%t \n", tag,
bio.IsBlock, prevBio.IsBlock,
bio.IsInline, prevBio.IsInline)
}
}
}
// Two general rules:
// - An inline element cannot contain a block-level element.
// - Most elements categorized as phrasing content [i.e. inline]
// can only contain elements that are themselves categorized
// as phrasing content, not any flow content.
// ==========
// Some notes
// ==========
//
// About links:
// Note that now <a ...> can wrap a lot.
// http://html5doctor.com/block-level-links-in-html-5/
// One new and exciting thing you can do in HTML 5 is
// wrap links round “block-level” elements.
//
// About CSS "display: inline-block"
// Unlike inline, "display: inline-block" lets
// you set a width and height on the element.
// Unlike block, "display: inline-block" does
// not add line-break after the element, so
// the element can sit next to other elements.
//
// About <li>:
// WhatWG: An li element's end tag can be omitted if
// - another li element immediately follows it, or
// - there is no more content in the parent element
//
// Tags with differing Modes:
// map: html = image map, lwdita = ToC
// body: lwdita = topic
// video:
// = = = = = = = = =
// =======
// BLOCK
// =======
// AllHtmlBlockTags are in a few places:
// - https://html.spec.whatwg.org/#the-page
// html, body { display: block; }
// - https://html.spec.whatwg.org/#sections-and-headings
// article, aside, h1, h2, h3, h4, h5, h6, hgroup, nav, section {
// display: block; }
// - https://html.spec.whatwg.org/#flow-content-3
// address, blockquote, center, dialog, div, figure,
// figcaption, footer, form, header, hr, legend,
// listing, main, p, plaintext, pre, search, xmp {
// display: block; }
// - https://html.spec.whatwg.org/#lists
// dir, dd, dl, dt, menu, ol, ul { display: block; }
// li { display: list-item; text-align: match-parent; }
var AllHtmlBlockTags map[string]void
var allHtmlBlockTags = []string{
"address", "article", "aside",
"body", "blockquote", "center",
"dd", "dialog", "dir", "div", "dl", "dt",
"fieldset", "figcaption", "figure", "footer", "form",
"header", "hgroup", "hr", "html",
"h1", "h2", "h3", "h4", "h5", "h6",
"legend", "li", "listing",
"main" /* "menu", */, "nav", "ol",
"p", "plaintext", "pre",
"search", "section",
"table", "tfoot", "ul", "xmp",
}
// ============
// INLINE
// ("phrasing")
// ============
// AllHtmlInlineTags are listed
// [here](https://html.spec.whatwg.org/#phrasing-content) and
// [here](https://html.spec.whatwg.org/#phrasing-content-3)
var AllHtmlInlineTags map[string]void
var allHtmlInlineTags = []string{
"a", "abbr", "acronym", "map>area", "audio",
"b", "bdi", "bdo", "big", "br", "button",
"canvas", "cite", "code", "col", "command",
"data" /* "datalist", */, "del", "dfn", "em", "embed",
"i", "iframe", "img", "input", "ins",
"kbd", "label", /* "link", */
"map", "mark", "math", /* "menu", */
"meta+itemprop", "meter",
"nobr", "noscript", "object", "output",
"picture", "progress", "q", "rt", "ruby",
"s", "samp" /* "script", */, "select", "slot", "small",
"span", "strike", "strong", "sub", "sup", "svg",
/* "template", */ "textarea", "time", "tt",
"u", "var", "video", "wbr",
}
// ======
// HIDDEN
// ======
// AllHtmlHiddenTags are listed
// [here](https://html.spec.whatwg.org/#hidden-elements):
// area, base, basefont, datalist, head, link, meta, noembed,
// noframes, param, rp, script, style, template, title {
// display: none; }
var AllHtmlHiddenTags map[string]void
var allHtmlHiddenTags = []string{
"area", "base", "basefont", "datalist", "head",
"link", "menu", "meta", "noembed", "noframes", "param",
"rp", "script", "style", "template", "title",
}
// AllHtmlVoidTags are start tags that do not take end tags:
// "endless", "slashless". All are
// [here](https://html.spec.whatwg.org/multipage/syntax.html#elements-2):
// area, base, br, col, embed, hr, img, input, link, meta, source, track, wbr
//
// (Quoting) Void elements only have a start tag;
// end tags must not be specified for void elements.
// .
var AllHtmlVoidTags map[string]void
var allHtmlVoidTags = []string{
"area", "base", "br", "col", "command", "embed",
"hr", "img", "input", "keygen", "link", "meta",
"param", "source", "track", "wbr"}
func init() {
AllHtmlVoidTags = make(map[string]void)
for _, s := range allHtmlVoidTags {
AllHtmlVoidTags[s] = aVoid
}
}
// = = = = = = = = =
/*
4.4 Grouping content
https://html.spec.whatwg.org/#flow-content-2
3.2.5.2.2 Flow content
Most elements that are used in the body of documents and applications are categorized as flow content.
aabbraddressarea (if it is a descendant of a map element)articleasideaudiobbdibdoblockquotebrbuttoncanvascitecodedatadatalistdeldetailsdfndialogdivdlemembedfieldsetfigurefooterformh1h2h3h4h5h6headerhgrouphriiframeimginputinskbdlabellink (if it is allowed in the body)main (if it is a hierarchically correct main element)mapmarkMathML mathmenumeta (if the itemprop attribute is present)meternavnoscriptobjectoloutputppicturepreprogressqrubyssampscriptsearchsectionselectslotsmallspanstrongsubsupSVG svgtabletemplatetextareatimeuulvarvideowbrautonomous custom elementstext
4.5 Text-level semantics
3.2.5.2.2 Flow content [AS ABOVE]
https://html.spec.whatwg.org/#phrasing-content
3.2.5.2.5 Phrasing content
Phrasing content is the text of the document, as well as elements that mark up
that text at the intra-paragraph level. Runs of phrasing content form paragraphs.
a abbr map>area audio b bdi bdo br button canvas cite code data datalist del dfn
em embed i iframe img input ins kbd label link map mark math meta+itemprop meter
noscript object output picture progress q ruby s samp script select slot small
span strong sub sup svg template textarea time u var video wbr text
Most elements that are categorized as phrasing content can only contain elements
that are themselves categorized as phrasing content, not any flow content.
https://html.spec.whatwg.org/#embedded-content-2
3.2.5.2.6 Embedded content
Embedded content is content that imports another resource into the document,
or content from another vocabulary that is inserted into the document.
*/
var AllHtmlEmbeddedContentTags = []string{
"audio", "canvas", "embed", "iframe", "img",
"math", "object", "picture", "svg", "video",
}
/*
https://html.spec.whatwg.org/#interactive-content
Interactive content is content that is specifically intended for user interaction.
*/
var AllHtmlInteractiveContentTags = []string{
"a+href", "audio+controls", "button", "details",
"embed", "iframe", "input", "label", "select",
"textarea", "video+controls",
}
// = = = = = = = = =
/*
https://html.spec.whatwg.org/multipage/syntax.html#syntax-tag-omission
Certain tags can be omitted. Omitting an element's start tag
in the situations described below does not mean the element
is not present; it is implied, but it is still there. For
example, an HTML document always has a root html element,
even if the string <html> doesn't appear anywhere in the markup.
*/