Skip to main content

marked/dom/html/
meta.rs

1//! Static metadata for HTML elements and attributes.
2//!
3//! This file is generated via build/generate.rb and the build/meta.rs.erb
4//! template. It should not be manually edited. To avoid any rust build-time
5//! dependency however, the resulting source file (src/dom/html/meta.rs) is
6//! also checked in.
7
8use std::collections::HashMap;
9
10use lazy_static::lazy_static;
11
12use crate::dom::LocalName;
13
14lazy_static! {
15    /// A static lookup table for metadata on known HTML tags.
16    pub static ref TAG_META: HashMap<LocalName, TagMeta> = init_tag_metadata();
17}
18
19/// Metadata about HTML tags and their attributes.
20pub struct TagMeta {
21    is_empty: bool,
22    is_deprecated: bool,
23    is_inline: bool,
24    is_meta: bool,
25    is_banned: bool,
26    basic_attrs: Vec<LocalName>,
27}
28
29impl TagMeta {
30    /// Return true if the element is defined to be empty: having no contents
31    /// or end tag.
32    ///
33    /// Tags include: `area base basefont br col embed frame hr img input link menuitem meta param source wbr`.
34    pub fn is_empty(&self) -> bool {
35        self.is_empty
36    }
37
38    /// Return true if the tag is deprecated as of html5.
39    ///
40    /// Tags include: `acronym applet basefont big blink center content dir font frame frameset isindex listing menu menuitem nobr noframes plaintext s strike tt u xmp`.
41    pub fn is_deprecated(&self) -> bool {
42        self.is_deprecated
43    }
44
45    /// Return true if the tag reprsents an _inline_ element: is not a block
46    /// layout producing element under normal use.
47    ///
48    /// Because HTML 5 no longer specifies this property, this is a
49    /// somewhat arbitrary distinction maintained here, loosely based on HTML 4
50    /// but extending for new tags. One noteworthy exception is that `<br>` is
51    /// not considered inline.
52    ///
53    /// Tags include: `a abbr acronym audio b basefont bdi bdo big blink button canvas cite code data datalist del dfn em embed font i iframe img input ins kbd label map mark meter nobr noscript object output picture progress q ruby s samp script select slot small span strike strong sub sup textarea time tt u var video wbr`.
54    pub fn is_inline(&self) -> bool {
55        self.is_inline
56    }
57
58    /// Return true if the tag represents metadata only, where any content is
59    /// not displayed text. e.g. `<head>`.
60    ///
61    /// Tags include: `base basefont head link meta title`.
62    pub fn is_meta(&self) -> bool {
63        self.is_meta
64    }
65
66    /// Return true if the tag is banned/blacklisted: where no content should
67    /// be extracted, displayed, or otherwise used.
68    ///
69    /// Tags include: `button content datalist fieldset frame frameset input label legend noframes noscript object optgroup option script select slot style template textarea`.
70    pub fn is_banned(&self) -> bool {
71        self.is_banned
72    }
73
74    /// Return true if the given name is part of the _basic_ set of known
75    /// attributes for this element.
76    ///
77    /// This _basic set_ of attributes excludes, among other things, attributes
78    /// that are used exclusively for styling purposes.
79    pub fn has_basic_attr(&self, name: &LocalName) -> bool {
80        self.basic_attrs.binary_search(name).is_ok()
81    }
82}
83
84impl Default for TagMeta {
85    fn default() -> TagMeta {
86        TagMeta {
87            is_empty: false,
88            is_deprecated: false,
89            is_inline: false,
90            is_meta: false,
91            is_banned: false,
92            basic_attrs: vec![],
93        }
94    }
95}
96
97/// `Namespace` constants
98pub mod ns {
99    use html5ever::ns;
100    use crate::dom::Namespace;
101
102    pub const HTML:           Namespace = ns!(html);
103}
104
105/// HTML tag constants
106pub mod t {
107    use html5ever::local_name as lname;
108    use crate::dom::LocalName;
109
110    /// Tag `<a>`: anchor.
111    /// (meta: inline)
112    pub const A:             LocalName = lname!("a");
113    /// Tag `<abbr>`: abbreviation.
114    /// (meta: inline)
115    pub const ABBR:          LocalName = lname!("abbr");
116    /// Tag `<acronym>`: acronym.
117    /// (meta: deprecated inline)
118    pub const ACRONYM:       LocalName = lname!("acronym");
119    /// Tag `<address>`: contact information for the author or owner.
120    pub const ADDRESS:       LocalName = lname!("address");
121    /// Tag `<applet>`: embedded applet.
122    /// (meta: deprecated)
123    pub const APPLET:        LocalName = lname!("applet");
124    /// Tag `<area>`: area inside an image-map.
125    /// (meta: empty)
126    pub const AREA:          LocalName = lname!("area");
127    /// Tag `<article>`: Structure: an independent content element.
128    pub const ARTICLE:       LocalName = lname!("article");
129    /// Tag `<aside>`: Structure: tengentially related content.
130    pub const ASIDE:         LocalName = lname!("aside");
131    /// Tag `<audio>`: Sound content.
132    /// (meta: inline)
133    pub const AUDIO:         LocalName = lname!("audio");
134    /// Tag `<b>`: bold text.
135    /// (meta: inline)
136    pub const B:             LocalName = lname!("b");
137    /// Tag `<base>`: default address or target for all links on a page.
138    /// (meta: empty meta)
139    pub const BASE:          LocalName = lname!("base");
140    /// Tag `<basefont>`: default font; color; or size for the text in a page.
141    /// (meta: empty deprecated inline meta)
142    pub const BASEFONT:      LocalName = lname!("basefont");
143    /// Tag `<bdi>`: Text isolated from surrounding for BIDI formatting.
144    /// (meta: inline)
145    pub const BDI:           LocalName = lname!("bdi");
146    /// Tag `<bdo>`: the text direction.
147    /// (meta: inline)
148    pub const BDO:           LocalName = lname!("bdo");
149    /// Tag `<big>`: big text.
150    /// (meta: deprecated inline)
151    pub const BIG:           LocalName = lname!("big");
152    /// Tag `<blink>`: blinking text.
153    /// (meta: deprecated inline)
154    pub const BLINK:         LocalName = lname!("blink");
155    /// Tag `<blockquote>`: long quotation.
156    pub const BLOCKQUOTE:    LocalName = lname!("blockquote");
157    /// Tag `<body>`: the document's body.
158    pub const BODY:          LocalName = lname!("body");
159    /// Tag `<br>`: single line break.
160    /// (meta: empty)
161    pub const BR:            LocalName = lname!("br");
162    /// Tag `<button>`: push button.
163    /// (meta: inline banned)
164    pub const BUTTON:        LocalName = lname!("button");
165    /// Tag `<canvas>`: canvas for drawing graphics and animations.
166    /// (meta: inline)
167    pub const CANVAS:        LocalName = lname!("canvas");
168    /// Tag `<caption>`: table caption.
169    pub const CAPTION:       LocalName = lname!("caption");
170    /// Tag `<center>`: centered text.
171    /// (meta: deprecated)
172    pub const CENTER:        LocalName = lname!("center");
173    /// Tag `<cite>`: citation.
174    /// (meta: inline)
175    pub const CITE:          LocalName = lname!("cite");
176    /// Tag `<code>`: computer code text.
177    /// (meta: inline)
178    pub const CODE:          LocalName = lname!("code");
179    /// Tag `<col>`: attribute values for one or more columns in a table.
180    /// (meta: empty)
181    pub const COL:           LocalName = lname!("col");
182    /// Tag `<colgroup>`: group of columns in a table for formatting.
183    pub const COLGROUP:      LocalName = lname!("colgroup");
184    /// Tag `<content>`: Shadow DOM content placeholder element.
185    /// (meta: deprecated banned)
186    pub const CONTENT:       LocalName = lname!("content");
187    /// Tag `<data>`: adds machine-oriented data representation.
188    /// (meta: inline)
189    pub const DATA:          LocalName = lname!("data");
190    /// Tag `<datalist>`: container for option elements.
191    /// (meta: inline banned)
192    pub const DATALIST:      LocalName = lname!("datalist");
193    /// Tag `<dd>`: description of a term in a definition list.
194    pub const DD:            LocalName = lname!("dd");
195    /// Tag `<del>`: deleted text.
196    /// (meta: inline)
197    pub const DEL:           LocalName = lname!("del");
198    /// Tag `<details>`: optional additional details (also: summary).
199    pub const DETAILS:       LocalName = lname!("details");
200    /// Tag `<dfn>`: definition term.
201    /// (meta: inline)
202    pub const DFN:           LocalName = lname!("dfn");
203    /// Tag `<dialog>`: dialog box or other interactive component.
204    pub const DIALOG:        LocalName = lname!("dialog");
205    /// Tag `<dir>`: directory list.
206    /// (meta: deprecated)
207    pub const DIR:           LocalName = lname!("dir");
208    /// Tag `<div>`: section in a document.
209    pub const DIV:           LocalName = lname!("div");
210    /// Tag `<dl>`: definition list.
211    pub const DL:            LocalName = lname!("dl");
212    /// Tag `<dt>`: term (an item) in a definition list.
213    pub const DT:            LocalName = lname!("dt");
214    /// Tag `<em>`: emphasized text.
215    /// (meta: inline)
216    pub const EM:            LocalName = lname!("em");
217    /// Tag `<embed>`: embed content by external app or plug-in.
218    /// (meta: empty inline)
219    pub const EMBED:         LocalName = lname!("embed");
220    /// Tag `<fieldset>`: border around elements in a form.
221    /// (meta: banned)
222    pub const FIELDSET:      LocalName = lname!("fieldset");
223    /// Tag `<figcaption>`: Structure: a figure caption.
224    pub const FIGCAPTION:    LocalName = lname!("figcaption");
225    /// Tag `<figure>`: Structure: self contained content that can be moved.
226    pub const FIGURE:        LocalName = lname!("figure");
227    /// Tag `<font>`: font; color; or size for text.
228    /// (meta: deprecated inline)
229    pub const FONT:          LocalName = lname!("font");
230    /// Tag `<footer>`: Structure: a footer of a section.
231    pub const FOOTER:        LocalName = lname!("footer");
232    /// Tag `<form>`: form for user input.
233    pub const FORM:          LocalName = lname!("form");
234    /// Tag `<frame>`: window (a frame) in a frameset.
235    /// (meta: empty deprecated banned)
236    pub const FRAME:         LocalName = lname!("frame");
237    /// Tag `<frameset>`: set of frames.
238    /// (meta: deprecated banned)
239    pub const FRAMESET:      LocalName = lname!("frameset");
240    /// Tag `<h1>`: heading level 1.
241    pub const H1:            LocalName = lname!("h1");
242    /// Tag `<h2>`: heading level 2.
243    pub const H2:            LocalName = lname!("h2");
244    /// Tag `<h3>`: heading level 3.
245    pub const H3:            LocalName = lname!("h3");
246    /// Tag `<h4>`: heading level 4.
247    pub const H4:            LocalName = lname!("h4");
248    /// Tag `<h5>`: heading level 5.
249    pub const H5:            LocalName = lname!("h5");
250    /// Tag `<h6>`: heading level 6.
251    pub const H6:            LocalName = lname!("h6");
252    /// Tag `<head>`: information about the document.
253    /// (meta: meta)
254    pub const HEAD:          LocalName = lname!("head");
255    /// Tag `<header>`: Structure: a header of a section.
256    pub const HEADER:        LocalName = lname!("header");
257    /// Tag `<hgroup>`: Structure: a group of headings.
258    pub const HGROUP:        LocalName = lname!("hgroup");
259    /// Tag `<hr>`: horizontal line.
260    /// (meta: empty)
261    pub const HR:            LocalName = lname!("hr");
262    /// Tag `<html>`: document.
263    pub const HTML:          LocalName = lname!("html");
264    /// Tag `<i>`: italic text.
265    /// (meta: inline)
266    pub const I:             LocalName = lname!("i");
267    /// Tag `<iframe>`: inline frame.
268    /// (meta: inline)
269    pub const IFRAME:        LocalName = lname!("iframe");
270    /// Tag `<img>`: image.
271    /// (meta: empty inline)
272    pub const IMG:           LocalName = lname!("img");
273    /// Tag `<input>`: input control.
274    /// (meta: empty inline banned)
275    pub const INPUT:         LocalName = lname!("input");
276    /// Tag `<ins>`: inserted text.
277    /// (meta: inline)
278    pub const INS:           LocalName = lname!("ins");
279    /// Tag `<isindex>`: searchable index related to a document.
280    /// (meta: deprecated)
281    pub const ISINDEX:       LocalName = lname!("isindex");
282    /// Tag `<kbd>`: keyboard text.
283    /// (meta: inline)
284    pub const KBD:           LocalName = lname!("kbd");
285    /// Tag `<label>`: label for input or other element.
286    /// (meta: inline banned)
287    pub const LABEL:         LocalName = lname!("label");
288    /// Tag `<legend>`: caption for a fieldset element.
289    /// (meta: banned)
290    pub const LEGEND:        LocalName = lname!("legend");
291    /// Tag `<li>`: list item.
292    pub const LI:            LocalName = lname!("li");
293    /// Tag `<link>`: relationship with an external resource.
294    /// (meta: empty meta)
295    pub const LINK:          LocalName = lname!("link");
296    /// Tag `<listing>`: preformated text.
297    /// (meta: deprecated)
298    pub const LISTING:       LocalName = lname!("listing");
299    /// Tag `<main>`: identify central topic/functional content.
300    pub const MAIN:          LocalName = lname!("main");
301    /// Tag `<map>`: image-map.
302    /// (meta: inline)
303    pub const MAP:           LocalName = lname!("map");
304    /// Tag `<mark>`: Text marked/highlighted for reference purposes.
305    /// (meta: inline)
306    pub const MARK:          LocalName = lname!("mark");
307    /// Tag `<menu>`: menu list.
308    /// (meta: deprecated)
309    pub const MENU:          LocalName = lname!("menu");
310    /// Tag `<menuitem>`: a command in a menu.
311    /// (meta: empty deprecated)
312    pub const MENUITEM:      LocalName = lname!("menuitem");
313    /// Tag `<meta>`: metadata.
314    /// (meta: empty meta)
315    pub const META:          LocalName = lname!("meta");
316    /// Tag `<meter>`: a linear guage for a scaler value.
317    /// (meta: inline)
318    pub const METER:         LocalName = lname!("meter");
319    /// Tag `<nav>`: Structure: container for navigational links.
320    pub const NAV:           LocalName = lname!("nav");
321    /// Tag `<nobr>`: contained text; white-space: nowrap.
322    /// (meta: deprecated inline)
323    pub const NOBR:          LocalName = lname!("nobr");
324    /// Tag `<noframes>`: alternate content where frames not supported.
325    /// (meta: deprecated banned)
326    pub const NOFRAMES:      LocalName = lname!("noframes");
327    /// Tag `<noscript>`: alternate content script not supported.
328    /// (meta: inline banned)
329    pub const NOSCRIPT:      LocalName = lname!("noscript");
330    /// Tag `<object>`: embedded object.
331    /// (meta: inline banned)
332    pub const OBJECT:        LocalName = lname!("object");
333    /// Tag `<ol>`: ordered list.
334    pub const OL:            LocalName = lname!("ol");
335    /// Tag `<optgroup>`: group of related options in a select list.
336    /// (meta: banned)
337    pub const OPTGROUP:      LocalName = lname!("optgroup");
338    /// Tag `<option>`: option in a select list.
339    /// (meta: banned)
340    pub const OPTION:        LocalName = lname!("option");
341    /// Tag `<output>`: content is (scripted) outcome of a user action..
342    /// (meta: inline)
343    pub const OUTPUT:        LocalName = lname!("output");
344    /// Tag `<p>`: paragraph.
345    pub const P:             LocalName = lname!("p");
346    /// Tag `<param>`: parameter for an object.
347    /// (meta: empty)
348    pub const PARAM:         LocalName = lname!("param");
349    /// Tag `<picture>`: container for multiple img/source DPI.
350    /// (meta: inline)
351    pub const PICTURE:       LocalName = lname!("picture");
352    /// Tag `<plaintext>`: like xmp; no close tag.
353    /// (meta: deprecated)
354    pub const PLAINTEXT:     LocalName = lname!("plaintext");
355    /// Tag `<pre>`: preformatted text.
356    pub const PRE:           LocalName = lname!("pre");
357    /// Tag `<progress>`: a progress bar.
358    /// (meta: inline)
359    pub const PROGRESS:      LocalName = lname!("progress");
360    /// Tag `<q>`: short quotation.
361    /// (meta: inline)
362    pub const Q:             LocalName = lname!("q");
363    /// Tag `<rb>`: ruby base text.
364    pub const RB:            LocalName = lname!("rb");
365    lazy_static::lazy_static! {
366        /// Tag `<rbc>`: ruby base container (complex).
367        /// (meta: undefined)
368        ///
369        /// This is a lazy static (struct) as its not defined by html5ever.
370        pub static ref RBC: LocalName = "rbc".into();
371    }
372    /// Tag `<rp>`: ruby simple text container.
373    pub const RP:            LocalName = lname!("rp");
374    /// Tag `<rt>`: ruby annotation text.
375    pub const RT:            LocalName = lname!("rt");
376    /// Tag `<rtc>`: ruby text container (complex).
377    pub const RTC:           LocalName = lname!("rtc");
378    /// Tag `<ruby>`: ruby pronunciation aid.
379    /// (meta: inline)
380    pub const RUBY:          LocalName = lname!("ruby");
381    /// Tag `<s>`: strikethrough text.
382    /// (meta: deprecated inline)
383    pub const S:             LocalName = lname!("s");
384    /// Tag `<samp>`: sample computer code.
385    /// (meta: inline)
386    pub const SAMP:          LocalName = lname!("samp");
387    /// Tag `<script>`: client-side script.
388    /// (meta: inline banned)
389    pub const SCRIPT:        LocalName = lname!("script");
390    /// Tag `<section>`: Structure: generic document/application section.
391    pub const SECTION:       LocalName = lname!("section");
392    /// Tag `<select>`: select list (drop-down list).
393    /// (meta: inline banned)
394    pub const SELECT:        LocalName = lname!("select");
395    /// Tag `<slot>`: (Shadow) DOM placeholder element.
396    /// (meta: inline banned)
397    pub const SLOT:          LocalName = lname!("slot");
398    /// Tag `<small>`: small text.
399    /// (meta: inline)
400    pub const SMALL:         LocalName = lname!("small");
401    /// Tag `<source>`: source for picture/audio/video elements.
402    /// (meta: empty)
403    pub const SOURCE:        LocalName = lname!("source");
404    /// Tag `<span>`: section in a document.
405    /// (meta: inline)
406    pub const SPAN:          LocalName = lname!("span");
407    /// Tag `<strike>`: strikethrough text.
408    /// (meta: deprecated inline)
409    pub const STRIKE:        LocalName = lname!("strike");
410    /// Tag `<strong>`: strong text.
411    /// (meta: inline)
412    pub const STRONG:        LocalName = lname!("strong");
413    /// Tag `<style>`: style information for a document.
414    /// (meta: banned)
415    pub const STYLE:         LocalName = lname!("style");
416    /// Tag `<sub>`: subscripted text.
417    /// (meta: inline)
418    pub const SUB:           LocalName = lname!("sub");
419    /// Tag `<summary>`: summary of details element.
420    pub const SUMMARY:       LocalName = lname!("summary");
421    /// Tag `<sup>`: superscripted text.
422    /// (meta: inline)
423    pub const SUP:           LocalName = lname!("sup");
424    /// Tag `<svg>`: inline scalable vector graphics.
425    pub const SVG:           LocalName = lname!("svg");
426    /// Tag `<table>`: table.
427    pub const TABLE:         LocalName = lname!("table");
428    /// Tag `<tbody>`: Groups the body content in a table.
429    pub const TBODY:         LocalName = lname!("tbody");
430    /// Tag `<td>`: cell in a table.
431    pub const TD:            LocalName = lname!("td");
432    /// Tag `<template>`: html sub-tree notrenderered except by script.
433    /// (meta: banned)
434    pub const TEMPLATE:      LocalName = lname!("template");
435    /// Tag `<textarea>`: multi-line text input control.
436    /// (meta: inline banned)
437    pub const TEXTAREA:      LocalName = lname!("textarea");
438    /// Tag `<tfoot>`: Groups the footer content in a table.
439    pub const TFOOT:         LocalName = lname!("tfoot");
440    /// Tag `<th>`: header cell in a table.
441    pub const TH:            LocalName = lname!("th");
442    /// Tag `<thead>`: Groups the header content in a table.
443    pub const THEAD:         LocalName = lname!("thead");
444    /// Tag `<time>`: A date or time.
445    /// (meta: inline)
446    pub const TIME:          LocalName = lname!("time");
447    /// Tag `<title>`: the title of a document.
448    /// (meta: meta)
449    pub const TITLE:         LocalName = lname!("title");
450    /// Tag `<tr>`: row in a table.
451    pub const TR:            LocalName = lname!("tr");
452    /// Tag `<tt>`: teletype text.
453    /// (meta: deprecated inline)
454    pub const TT:            LocalName = lname!("tt");
455    /// Tag `<u>`: underlined text.
456    /// (meta: deprecated inline)
457    pub const U:             LocalName = lname!("u");
458    /// Tag `<ul>`: unordered list.
459    pub const UL:            LocalName = lname!("ul");
460    /// Tag `<var>`: variable part of a text.
461    /// (meta: inline)
462    pub const VAR:           LocalName = lname!("var");
463    /// Tag `<video>`: video container.
464    /// (meta: inline)
465    pub const VIDEO:         LocalName = lname!("video");
466    /// Tag `<wbr>`: A line break opportunity.
467    /// (meta: empty inline)
468    pub const WBR:           LocalName = lname!("wbr");
469    /// Tag `<xmp>`: preformatted text.
470    /// (meta: deprecated)
471    pub const XMP:           LocalName = lname!("xmp");
472}
473
474/// HTML attribute constants
475pub mod a {
476    use html5ever::local_name as lname;
477    use crate::dom::LocalName;
478
479    pub const ABBR:              LocalName = lname!("abbr");
480    /// Attribute accept: (file) types accepted.
481    pub const ACCEPT:            LocalName = lname!("accept");
482    pub const ACCEPT_CHARSET:    LocalName = lname!("accept-charset");
483    pub const ALIGN:             LocalName = lname!("align");
484    pub const ALT:               LocalName = lname!("alt");
485    pub const AXIS:              LocalName = lname!("axis");
486    /// Attribute base: inherited from xml:base (deprecated).
487    pub const BASE:              LocalName = lname!("base");
488    pub const BGCOLOR:           LocalName = lname!("bgcolor");
489    pub const BORDER:            LocalName = lname!("border");
490    pub const CELLPADDING:       LocalName = lname!("cellpadding");
491    pub const CELLSPACING:       LocalName = lname!("cellspacing");
492    pub const CHAR:              LocalName = lname!("char");
493    pub const CHAROFF:           LocalName = lname!("charoff");
494    /// Attribute charset: encoding of link or (meta) document.
495    pub const CHARSET:           LocalName = lname!("charset");
496    pub const CITE:              LocalName = lname!("cite");
497    pub const CLASS:             LocalName = lname!("class");
498    pub const COLOR:             LocalName = lname!("color");
499    pub const COLSPAN:           LocalName = lname!("colspan");
500    /// Attribute content: text.
501    pub const CONTENT:           LocalName = lname!("content");
502    pub const CONTROLS:          LocalName = lname!("controls");
503    /// Attribute coords: coordinates; i.e. image map.
504    pub const COORDS:            LocalName = lname!("coords");
505    pub const DATA:              LocalName = lname!("data");
506    pub const DATETIME:          LocalName = lname!("datetime");
507    lazy_static::lazy_static! {
508        /// Attribute decoding: preferred method to decode.
509        ///
510        /// This is a lazy static (struct) as its not defined by html5ever.
511        pub static ref DECODING: LocalName = "decoding".into();
512    }
513    /// Attribute dir: Text direction; ltr or rtl.
514    pub const DIR:               LocalName = lname!("dir");
515    pub const FRAME:             LocalName = lname!("frame");
516    pub const HEADERS:           LocalName = lname!("headers");
517    pub const HEIGHT:            LocalName = lname!("height");
518    /// Attribute hidden: hidden element.
519    pub const HIDDEN:            LocalName = lname!("hidden");
520    /// Attribute href: URL.
521    pub const HREF:              LocalName = lname!("href");
522    /// Attribute hreflang: language_code of referent.
523    pub const HREFLANG:          LocalName = lname!("hreflang");
524    /// Attribute http-equiv: HTTP Header name.
525    pub const HTTP_EQUIV:        LocalName = lname!("http-equiv");
526    pub const ID:                LocalName = lname!("id");
527    pub const LABEL:             LocalName = lname!("label");
528    /// Attribute lang: language_code; also xml:lang.
529    pub const LANG:              LocalName = lname!("lang");
530    pub const MEDIA:             LocalName = lname!("media");
531    /// Attribute name: section_name anchor.
532    pub const NAME:              LocalName = lname!("name");
533    pub const NOWRAP:            LocalName = lname!("nowrap");
534    pub const REL:               LocalName = lname!("rel");
535    pub const REV:               LocalName = lname!("rev");
536    pub const ROWSPAN:           LocalName = lname!("rowspan");
537    pub const RULES:             LocalName = lname!("rules");
538    /// Attribute scheme: format URI.
539    pub const SCHEME:            LocalName = lname!("scheme");
540    pub const SCOPE:             LocalName = lname!("scope");
541    pub const SHAPE:             LocalName = lname!("shape");
542    pub const SPAN:              LocalName = lname!("span");
543    pub const SRC:               LocalName = lname!("src");
544    pub const STYLE:             LocalName = lname!("style");
545    pub const SUMMARY:           LocalName = lname!("summary");
546    pub const TARGET:            LocalName = lname!("target");
547    /// Attribute title: extra title.
548    pub const TITLE:             LocalName = lname!("title");
549    pub const TYPE:              LocalName = lname!("type");
550    pub const VALIGN:            LocalName = lname!("valign");
551    pub const VALUE:             LocalName = lname!("value");
552    pub const WIDTH:             LocalName = lname!("width");
553}
554
555fn init_tag_metadata() -> HashMap<LocalName, TagMeta> {
556    let mut tag_meta = HashMap::with_capacity(135);
557
558    tag_meta.insert(t::A, TagMeta {
559        is_inline: true,
560        basic_attrs: vec![
561            a::BASE, a::CHARSET, a::DIR, a::HREF, a::HREFLANG, a::ID, a::LANG, a::MEDIA, a::NAME, a::REL, a::REV, a::TITLE, a::TYPE
562        ],
563        .. TagMeta::default()
564    });
565    tag_meta.insert(t::ABBR, TagMeta {
566        is_inline: true,
567        basic_attrs: vec![
568            a::BASE, a::DIR, a::LANG, a::TITLE
569        ],
570        .. TagMeta::default()
571    });
572    tag_meta.insert(t::ACRONYM, TagMeta {
573        is_deprecated: true,
574        is_inline: true,
575        basic_attrs: vec![
576            a::BASE, a::DIR, a::LANG, a::TITLE
577        ],
578        .. TagMeta::default()
579    });
580    tag_meta.insert(t::ADDRESS, TagMeta {
581        basic_attrs: vec![
582            a::BASE, a::DIR, a::LANG, a::TITLE
583        ],
584        .. TagMeta::default()
585    });
586    tag_meta.insert(t::APPLET, TagMeta {
587        is_deprecated: true,
588        basic_attrs: vec![
589            a::BASE, a::DIR, a::LANG, a::TITLE
590        ],
591        .. TagMeta::default()
592    });
593    tag_meta.insert(t::AREA, TagMeta {
594        is_empty: true,
595        basic_attrs: vec![
596            a::ALT, a::BASE, a::DIR, a::LANG, a::MEDIA, a::TITLE
597        ],
598        .. TagMeta::default()
599    });
600    tag_meta.insert(t::ARTICLE, TagMeta {
601        basic_attrs: vec![
602            a::BASE, a::DIR, a::LANG, a::TITLE
603        ],
604        .. TagMeta::default()
605    });
606    tag_meta.insert(t::ASIDE, TagMeta {
607        basic_attrs: vec![
608            a::BASE, a::DIR, a::LANG, a::TITLE
609        ],
610        .. TagMeta::default()
611    });
612    tag_meta.insert(t::AUDIO, TagMeta {
613        is_inline: true,
614        basic_attrs: vec![
615            a::BASE, a::DIR, a::LANG, a::SRC, a::TITLE
616        ],
617        .. TagMeta::default()
618    });
619    tag_meta.insert(t::B, TagMeta {
620        is_inline: true,
621        basic_attrs: vec![
622            a::BASE, a::DIR, a::LANG, a::TITLE
623        ],
624        .. TagMeta::default()
625    });
626    tag_meta.insert(t::BASE, TagMeta {
627        is_empty: true,
628        is_meta: true,
629        basic_attrs: vec![
630            a::BASE, a::HREF
631        ],
632        .. TagMeta::default()
633    });
634    tag_meta.insert(t::BASEFONT, TagMeta {
635        is_empty: true,
636        is_deprecated: true,
637        is_inline: true,
638        is_meta: true,
639        basic_attrs: vec![
640            a::BASE, a::DIR, a::LANG, a::TITLE
641        ],
642        .. TagMeta::default()
643    });
644    tag_meta.insert(t::BDI, TagMeta {
645        is_inline: true,
646        basic_attrs: vec![
647            a::BASE, a::DIR, a::LANG, a::TITLE
648        ],
649        .. TagMeta::default()
650    });
651    tag_meta.insert(t::BDO, TagMeta {
652        is_inline: true,
653        basic_attrs: vec![
654            a::BASE, a::DIR, a::LANG, a::TITLE
655        ],
656        .. TagMeta::default()
657    });
658    tag_meta.insert(t::BIG, TagMeta {
659        is_deprecated: true,
660        is_inline: true,
661        basic_attrs: vec![
662            a::BASE, a::DIR, a::LANG, a::TITLE
663        ],
664        .. TagMeta::default()
665    });
666    tag_meta.insert(t::BLINK, TagMeta {
667        is_deprecated: true,
668        is_inline: true,
669        basic_attrs: vec![
670            a::BASE, a::DIR, a::LANG, a::TITLE
671        ],
672        .. TagMeta::default()
673    });
674    tag_meta.insert(t::BLOCKQUOTE, TagMeta {
675        basic_attrs: vec![
676            a::BASE, a::CITE, a::DIR, a::LANG, a::TITLE
677        ],
678        .. TagMeta::default()
679    });
680    tag_meta.insert(t::BODY, TagMeta {
681        basic_attrs: vec![
682            a::BASE, a::DIR, a::LANG, a::TITLE
683        ],
684        .. TagMeta::default()
685    });
686    tag_meta.insert(t::BR, TagMeta {
687        is_empty: true,
688        basic_attrs: vec![
689            a::BASE, a::TITLE
690        ],
691        .. TagMeta::default()
692    });
693    tag_meta.insert(t::BUTTON, TagMeta {
694        is_inline: true,
695        is_banned: true,
696        basic_attrs: vec![
697            a::BASE, a::DIR, a::LANG, a::TITLE
698        ],
699        .. TagMeta::default()
700    });
701    tag_meta.insert(t::CANVAS, TagMeta {
702        is_inline: true,
703        basic_attrs: vec![
704            a::BASE, a::DIR, a::LANG, a::TITLE
705        ],
706        .. TagMeta::default()
707    });
708    tag_meta.insert(t::CAPTION, TagMeta {
709        basic_attrs: vec![
710            a::BASE, a::DIR, a::LANG, a::TITLE
711        ],
712        .. TagMeta::default()
713    });
714    tag_meta.insert(t::CENTER, TagMeta {
715        is_deprecated: true,
716        basic_attrs: vec![
717            a::BASE, a::DIR, a::LANG, a::TITLE
718        ],
719        .. TagMeta::default()
720    });
721    tag_meta.insert(t::CITE, TagMeta {
722        is_inline: true,
723        basic_attrs: vec![
724            a::BASE, a::DIR, a::LANG, a::TITLE
725        ],
726        .. TagMeta::default()
727    });
728    tag_meta.insert(t::CODE, TagMeta {
729        is_inline: true,
730        basic_attrs: vec![
731            a::BASE, a::DIR, a::LANG, a::TITLE
732        ],
733        .. TagMeta::default()
734    });
735    tag_meta.insert(t::COL, TagMeta {
736        is_empty: true,
737        basic_attrs: vec![
738            a::BASE, a::DIR, a::LANG, a::SPAN, a::TITLE
739        ],
740        .. TagMeta::default()
741    });
742    tag_meta.insert(t::COLGROUP, TagMeta {
743        basic_attrs: vec![
744            a::BASE, a::DIR, a::LANG, a::SPAN, a::TITLE
745        ],
746        .. TagMeta::default()
747    });
748    tag_meta.insert(t::CONTENT, TagMeta {
749        is_deprecated: true,
750        is_banned: true,
751        basic_attrs: vec![
752            a::BASE, a::DIR, a::LANG, a::TITLE
753        ],
754        .. TagMeta::default()
755    });
756    tag_meta.insert(t::DATA, TagMeta {
757        is_inline: true,
758        basic_attrs: vec![
759            a::BASE, a::DIR, a::LANG, a::TITLE, a::VALUE
760        ],
761        .. TagMeta::default()
762    });
763    tag_meta.insert(t::DATALIST, TagMeta {
764        is_inline: true,
765        is_banned: true,
766        basic_attrs: vec![
767            a::BASE, a::DIR, a::LANG, a::TITLE
768        ],
769        .. TagMeta::default()
770    });
771    tag_meta.insert(t::DD, TagMeta {
772        basic_attrs: vec![
773            a::BASE, a::DIR, a::LANG, a::TITLE
774        ],
775        .. TagMeta::default()
776    });
777    tag_meta.insert(t::DEL, TagMeta {
778        is_inline: true,
779        basic_attrs: vec![
780            a::BASE, a::CITE, a::DATETIME, a::DIR, a::LANG, a::TITLE
781        ],
782        .. TagMeta::default()
783    });
784    tag_meta.insert(t::DETAILS, TagMeta {
785        basic_attrs: vec![
786            a::BASE, a::DIR, a::LANG, a::TITLE
787        ],
788        .. TagMeta::default()
789    });
790    tag_meta.insert(t::DFN, TagMeta {
791        is_inline: true,
792        basic_attrs: vec![
793            a::BASE, a::DIR, a::LANG, a::TITLE
794        ],
795        .. TagMeta::default()
796    });
797    tag_meta.insert(t::DIALOG, TagMeta {
798        basic_attrs: vec![
799            a::BASE, a::DIR, a::LANG, a::TITLE
800        ],
801        .. TagMeta::default()
802    });
803    tag_meta.insert(t::DIR, TagMeta {
804        is_deprecated: true,
805        basic_attrs: vec![
806            a::BASE, a::DIR, a::LANG, a::TITLE
807        ],
808        .. TagMeta::default()
809    });
810    tag_meta.insert(t::DIV, TagMeta {
811        basic_attrs: vec![
812            a::BASE, a::DIR, a::LANG, a::TITLE
813        ],
814        .. TagMeta::default()
815    });
816    tag_meta.insert(t::DL, TagMeta {
817        basic_attrs: vec![
818            a::BASE, a::DIR, a::LANG, a::TITLE
819        ],
820        .. TagMeta::default()
821    });
822    tag_meta.insert(t::DT, TagMeta {
823        basic_attrs: vec![
824            a::BASE, a::DIR, a::LANG, a::TITLE
825        ],
826        .. TagMeta::default()
827    });
828    tag_meta.insert(t::EM, TagMeta {
829        is_inline: true,
830        basic_attrs: vec![
831            a::BASE, a::DIR, a::LANG, a::TITLE
832        ],
833        .. TagMeta::default()
834    });
835    tag_meta.insert(t::EMBED, TagMeta {
836        is_empty: true,
837        is_inline: true,
838        basic_attrs: vec![
839            a::BASE, a::DIR, a::HEIGHT, a::LANG, a::SRC, a::TITLE, a::TYPE, a::WIDTH
840        ],
841        .. TagMeta::default()
842    });
843    tag_meta.insert(t::FIELDSET, TagMeta {
844        is_banned: true,
845        basic_attrs: vec![
846            a::BASE, a::DIR, a::LANG, a::TITLE
847        ],
848        .. TagMeta::default()
849    });
850    tag_meta.insert(t::FIGCAPTION, TagMeta {
851        basic_attrs: vec![
852            a::BASE, a::DIR, a::LANG, a::TITLE
853        ],
854        .. TagMeta::default()
855    });
856    tag_meta.insert(t::FIGURE, TagMeta {
857        basic_attrs: vec![
858            a::BASE, a::DIR, a::LANG, a::TITLE
859        ],
860        .. TagMeta::default()
861    });
862    tag_meta.insert(t::FONT, TagMeta {
863        is_deprecated: true,
864        is_inline: true,
865        basic_attrs: vec![
866            a::BASE, a::DIR, a::LANG, a::TITLE
867        ],
868        .. TagMeta::default()
869    });
870    tag_meta.insert(t::FOOTER, TagMeta {
871        basic_attrs: vec![
872            a::BASE, a::DIR, a::LANG, a::TITLE
873        ],
874        .. TagMeta::default()
875    });
876    tag_meta.insert(t::FORM, TagMeta {
877        basic_attrs: vec![
878            a::ACCEPT, a::ACCEPT_CHARSET, a::BASE, a::DIR, a::LANG, a::TITLE
879        ],
880        .. TagMeta::default()
881    });
882    tag_meta.insert(t::FRAME, TagMeta {
883        is_empty: true,
884        is_deprecated: true,
885        is_banned: true,
886        basic_attrs: vec![
887            a::BASE, a::SRC, a::TITLE
888        ],
889        .. TagMeta::default()
890    });
891    tag_meta.insert(t::FRAMESET, TagMeta {
892        is_deprecated: true,
893        is_banned: true,
894        basic_attrs: vec![
895            a::BASE, a::TITLE
896        ],
897        .. TagMeta::default()
898    });
899    tag_meta.insert(t::H1, TagMeta {
900        basic_attrs: vec![
901            a::BASE, a::DIR, a::LANG, a::TITLE
902        ],
903        .. TagMeta::default()
904    });
905    tag_meta.insert(t::H2, TagMeta {
906        basic_attrs: vec![
907            a::BASE, a::DIR, a::LANG, a::TITLE
908        ],
909        .. TagMeta::default()
910    });
911    tag_meta.insert(t::H3, TagMeta {
912        basic_attrs: vec![
913            a::BASE, a::DIR, a::LANG, a::TITLE
914        ],
915        .. TagMeta::default()
916    });
917    tag_meta.insert(t::H4, TagMeta {
918        basic_attrs: vec![
919            a::BASE, a::DIR, a::LANG, a::TITLE
920        ],
921        .. TagMeta::default()
922    });
923    tag_meta.insert(t::H5, TagMeta {
924        basic_attrs: vec![
925            a::BASE, a::DIR, a::LANG, a::TITLE
926        ],
927        .. TagMeta::default()
928    });
929    tag_meta.insert(t::H6, TagMeta {
930        basic_attrs: vec![
931            a::BASE, a::DIR, a::LANG, a::TITLE
932        ],
933        .. TagMeta::default()
934    });
935    tag_meta.insert(t::HEAD, TagMeta {
936        is_meta: true,
937        basic_attrs: vec![
938            a::BASE, a::DIR, a::LANG
939        ],
940        .. TagMeta::default()
941    });
942    tag_meta.insert(t::HEADER, TagMeta {
943        basic_attrs: vec![
944            a::BASE, a::DIR, a::LANG, a::TITLE
945        ],
946        .. TagMeta::default()
947    });
948    tag_meta.insert(t::HGROUP, TagMeta {
949        basic_attrs: vec![
950            a::BASE, a::DIR, a::LANG, a::TITLE
951        ],
952        .. TagMeta::default()
953    });
954    tag_meta.insert(t::HR, TagMeta {
955        is_empty: true,
956        basic_attrs: vec![
957            a::BASE, a::TITLE
958        ],
959        .. TagMeta::default()
960    });
961    tag_meta.insert(t::HTML, TagMeta {
962        basic_attrs: vec![
963            a::BASE, a::DIR, a::LANG
964        ],
965        .. TagMeta::default()
966    });
967    tag_meta.insert(t::I, TagMeta {
968        is_inline: true,
969        basic_attrs: vec![
970            a::BASE, a::DIR, a::LANG, a::TITLE
971        ],
972        .. TagMeta::default()
973    });
974    tag_meta.insert(t::IFRAME, TagMeta {
975        is_inline: true,
976        basic_attrs: vec![
977            a::ALIGN, a::BASE, a::TITLE
978        ],
979        .. TagMeta::default()
980    });
981    tag_meta.insert(t::IMG, TagMeta {
982        is_empty: true,
983        is_inline: true,
984        basic_attrs: vec![
985            a::ALT, a::BASE, a::DECODING.clone(), a::DIR, a::HEIGHT, a::LANG, a::SRC, a::TITLE, a::WIDTH
986        ],
987        .. TagMeta::default()
988    });
989    tag_meta.insert(t::INPUT, TagMeta {
990        is_empty: true,
991        is_inline: true,
992        is_banned: true,
993        basic_attrs: vec![
994            a::ACCEPT, a::ALT, a::BASE, a::DIR, a::LANG, a::TITLE
995        ],
996        .. TagMeta::default()
997    });
998    tag_meta.insert(t::INS, TagMeta {
999        is_inline: true,
1000        basic_attrs: vec![
1001            a::BASE, a::CITE, a::DATETIME, a::DIR, a::LANG, a::TITLE
1002        ],
1003        .. TagMeta::default()
1004    });
1005    tag_meta.insert(t::ISINDEX, TagMeta {
1006        is_deprecated: true,
1007        basic_attrs: vec![
1008            a::BASE, a::DIR, a::LANG, a::TITLE
1009        ],
1010        .. TagMeta::default()
1011    });
1012    tag_meta.insert(t::KBD, TagMeta {
1013        is_inline: true,
1014        basic_attrs: vec![
1015            a::BASE, a::DIR, a::LANG, a::TITLE
1016        ],
1017        .. TagMeta::default()
1018    });
1019    tag_meta.insert(t::LABEL, TagMeta {
1020        is_inline: true,
1021        is_banned: true,
1022        basic_attrs: vec![
1023            a::BASE, a::DIR, a::LANG, a::TITLE
1024        ],
1025        .. TagMeta::default()
1026    });
1027    tag_meta.insert(t::LEGEND, TagMeta {
1028        is_banned: true,
1029        basic_attrs: vec![
1030            a::BASE, a::DIR, a::LANG, a::TITLE
1031        ],
1032        .. TagMeta::default()
1033    });
1034    tag_meta.insert(t::LI, TagMeta {
1035        basic_attrs: vec![
1036            a::BASE, a::DIR, a::LANG, a::TITLE
1037        ],
1038        .. TagMeta::default()
1039    });
1040    tag_meta.insert(t::LINK, TagMeta {
1041        is_empty: true,
1042        is_meta: true,
1043        basic_attrs: vec![
1044            a::BASE, a::CHARSET, a::DIR, a::HREF, a::HREFLANG, a::LANG, a::MEDIA, a::REL, a::REV, a::TITLE, a::TYPE
1045        ],
1046        .. TagMeta::default()
1047    });
1048    tag_meta.insert(t::LISTING, TagMeta {
1049        is_deprecated: true,
1050        basic_attrs: vec![
1051            a::BASE, a::DIR, a::LANG, a::TITLE
1052        ],
1053        .. TagMeta::default()
1054    });
1055    tag_meta.insert(t::MAIN, TagMeta {
1056        basic_attrs: vec![
1057            a::BASE, a::DIR, a::LANG, a::TITLE
1058        ],
1059        .. TagMeta::default()
1060    });
1061    tag_meta.insert(t::MAP, TagMeta {
1062        is_inline: true,
1063        basic_attrs: vec![
1064            a::BASE, a::DIR, a::LANG, a::TITLE
1065        ],
1066        .. TagMeta::default()
1067    });
1068    tag_meta.insert(t::MARK, TagMeta {
1069        is_inline: true,
1070        basic_attrs: vec![
1071            a::BASE, a::DIR, a::LANG, a::TITLE
1072        ],
1073        .. TagMeta::default()
1074    });
1075    tag_meta.insert(t::MENU, TagMeta {
1076        is_deprecated: true,
1077        basic_attrs: vec![
1078            a::BASE, a::DIR, a::LANG, a::TITLE
1079        ],
1080        .. TagMeta::default()
1081    });
1082    tag_meta.insert(t::MENUITEM, TagMeta {
1083        is_empty: true,
1084        is_deprecated: true,
1085        basic_attrs: vec![
1086            a::BASE, a::DIR, a::LANG, a::TITLE
1087        ],
1088        .. TagMeta::default()
1089    });
1090    tag_meta.insert(t::META, TagMeta {
1091        is_empty: true,
1092        is_meta: true,
1093        basic_attrs: vec![
1094            a::BASE, a::CHARSET, a::CONTENT, a::DIR, a::HTTP_EQUIV, a::LANG, a::SCHEME
1095        ],
1096        .. TagMeta::default()
1097    });
1098    tag_meta.insert(t::METER, TagMeta {
1099        is_inline: true,
1100        basic_attrs: vec![
1101            a::BASE, a::DIR, a::LANG, a::TITLE
1102        ],
1103        .. TagMeta::default()
1104    });
1105    tag_meta.insert(t::NAV, TagMeta {
1106        basic_attrs: vec![
1107            a::BASE, a::DIR, a::LANG, a::TITLE
1108        ],
1109        .. TagMeta::default()
1110    });
1111    tag_meta.insert(t::NOBR, TagMeta {
1112        is_deprecated: true,
1113        is_inline: true,
1114        basic_attrs: vec![
1115            a::BASE, a::DIR, a::LANG, a::TITLE
1116        ],
1117        .. TagMeta::default()
1118    });
1119    tag_meta.insert(t::NOFRAMES, TagMeta {
1120        is_deprecated: true,
1121        is_banned: true,
1122        basic_attrs: vec![
1123            a::BASE, a::DIR, a::LANG, a::TITLE
1124        ],
1125        .. TagMeta::default()
1126    });
1127    tag_meta.insert(t::NOSCRIPT, TagMeta {
1128        is_inline: true,
1129        is_banned: true,
1130        basic_attrs: vec![
1131            a::BASE, a::DIR, a::LANG, a::TITLE
1132        ],
1133        .. TagMeta::default()
1134    });
1135    tag_meta.insert(t::OBJECT, TagMeta {
1136        is_inline: true,
1137        is_banned: true,
1138        basic_attrs: vec![
1139            a::ALIGN, a::BASE, a::DATA, a::DIR, a::LANG, a::TITLE, a::TYPE
1140        ],
1141        .. TagMeta::default()
1142    });
1143    tag_meta.insert(t::OL, TagMeta {
1144        basic_attrs: vec![
1145            a::BASE, a::DIR, a::LANG, a::TITLE
1146        ],
1147        .. TagMeta::default()
1148    });
1149    tag_meta.insert(t::OPTGROUP, TagMeta {
1150        is_banned: true,
1151        basic_attrs: vec![
1152            a::BASE, a::DIR, a::LABEL, a::LANG, a::TITLE
1153        ],
1154        .. TagMeta::default()
1155    });
1156    tag_meta.insert(t::OPTION, TagMeta {
1157        is_banned: true,
1158        basic_attrs: vec![
1159            a::BASE, a::DIR, a::LABEL, a::LANG, a::TITLE
1160        ],
1161        .. TagMeta::default()
1162    });
1163    tag_meta.insert(t::OUTPUT, TagMeta {
1164        is_inline: true,
1165        basic_attrs: vec![
1166            a::BASE, a::DIR, a::LANG, a::TITLE
1167        ],
1168        .. TagMeta::default()
1169    });
1170    tag_meta.insert(t::P, TagMeta {
1171        basic_attrs: vec![
1172            a::BASE, a::DIR, a::LANG, a::TITLE
1173        ],
1174        .. TagMeta::default()
1175    });
1176    tag_meta.insert(t::PARAM, TagMeta {
1177        is_empty: true,
1178        basic_attrs: vec![
1179            a::BASE, a::NAME, a::VALUE
1180        ],
1181        .. TagMeta::default()
1182    });
1183    tag_meta.insert(t::PICTURE, TagMeta {
1184        is_inline: true,
1185        basic_attrs: vec![
1186            a::BASE, a::DIR, a::HEIGHT, a::LANG, a::TITLE, a::WIDTH
1187        ],
1188        .. TagMeta::default()
1189    });
1190    tag_meta.insert(t::PLAINTEXT, TagMeta {
1191        is_deprecated: true,
1192        basic_attrs: vec![
1193            a::BASE, a::DIR, a::LANG, a::TITLE
1194        ],
1195        .. TagMeta::default()
1196    });
1197    tag_meta.insert(t::PRE, TagMeta {
1198        basic_attrs: vec![
1199            a::BASE, a::DIR, a::LANG, a::TITLE
1200        ],
1201        .. TagMeta::default()
1202    });
1203    tag_meta.insert(t::PROGRESS, TagMeta {
1204        is_inline: true,
1205        basic_attrs: vec![
1206            a::BASE, a::DIR, a::LANG, a::TITLE
1207        ],
1208        .. TagMeta::default()
1209    });
1210    tag_meta.insert(t::Q, TagMeta {
1211        is_inline: true,
1212        basic_attrs: vec![
1213            a::BASE, a::CITE, a::DIR, a::LANG, a::TITLE
1214        ],
1215        .. TagMeta::default()
1216    });
1217    tag_meta.insert(t::RB, TagMeta {
1218        basic_attrs: vec![
1219            a::BASE, a::DIR, a::LANG, a::TITLE
1220        ],
1221        .. TagMeta::default()
1222    });
1223    tag_meta.insert(t::RBC.clone(), TagMeta {
1224        basic_attrs: vec![
1225            a::BASE, a::DIR, a::LANG, a::TITLE
1226        ],
1227        .. TagMeta::default()
1228    });
1229    tag_meta.insert(t::RP, TagMeta {
1230        basic_attrs: vec![
1231            a::BASE, a::DIR, a::LANG, a::TITLE
1232        ],
1233        .. TagMeta::default()
1234    });
1235    tag_meta.insert(t::RT, TagMeta {
1236        basic_attrs: vec![
1237            a::BASE, a::DIR, a::LANG, a::TITLE
1238        ],
1239        .. TagMeta::default()
1240    });
1241    tag_meta.insert(t::RTC, TagMeta {
1242        basic_attrs: vec![
1243            a::BASE, a::DIR, a::LANG, a::TITLE
1244        ],
1245        .. TagMeta::default()
1246    });
1247    tag_meta.insert(t::RUBY, TagMeta {
1248        is_inline: true,
1249        basic_attrs: vec![
1250            a::BASE, a::DIR, a::LANG, a::TITLE
1251        ],
1252        .. TagMeta::default()
1253    });
1254    tag_meta.insert(t::S, TagMeta {
1255        is_deprecated: true,
1256        is_inline: true,
1257        basic_attrs: vec![
1258            a::BASE, a::DIR, a::LANG, a::TITLE
1259        ],
1260        .. TagMeta::default()
1261    });
1262    tag_meta.insert(t::SAMP, TagMeta {
1263        is_inline: true,
1264        basic_attrs: vec![
1265            a::BASE, a::DIR, a::LANG, a::TITLE
1266        ],
1267        .. TagMeta::default()
1268    });
1269    tag_meta.insert(t::SCRIPT, TagMeta {
1270        is_inline: true,
1271        is_banned: true,
1272        basic_attrs: vec![
1273            a::BASE, a::DIR, a::LANG
1274        ],
1275        .. TagMeta::default()
1276    });
1277    tag_meta.insert(t::SECTION, TagMeta {
1278        basic_attrs: vec![
1279            a::BASE, a::DIR, a::LANG, a::TITLE
1280        ],
1281        .. TagMeta::default()
1282    });
1283    tag_meta.insert(t::SELECT, TagMeta {
1284        is_inline: true,
1285        is_banned: true,
1286        basic_attrs: vec![
1287            a::BASE, a::DIR, a::LANG, a::TITLE
1288        ],
1289        .. TagMeta::default()
1290    });
1291    tag_meta.insert(t::SLOT, TagMeta {
1292        is_inline: true,
1293        is_banned: true,
1294        basic_attrs: vec![
1295            a::BASE, a::DIR, a::LANG, a::TITLE
1296        ],
1297        .. TagMeta::default()
1298    });
1299    tag_meta.insert(t::SMALL, TagMeta {
1300        is_inline: true,
1301        basic_attrs: vec![
1302            a::BASE, a::DIR, a::LANG, a::TITLE
1303        ],
1304        .. TagMeta::default()
1305    });
1306    tag_meta.insert(t::SOURCE, TagMeta {
1307        is_empty: true,
1308        basic_attrs: vec![
1309            a::BASE, a::DIR, a::LANG, a::SRC, a::TITLE, a::TYPE
1310        ],
1311        .. TagMeta::default()
1312    });
1313    tag_meta.insert(t::SPAN, TagMeta {
1314        is_inline: true,
1315        basic_attrs: vec![
1316            a::BASE, a::DIR, a::LANG, a::TITLE
1317        ],
1318        .. TagMeta::default()
1319    });
1320    tag_meta.insert(t::STRIKE, TagMeta {
1321        is_deprecated: true,
1322        is_inline: true,
1323        basic_attrs: vec![
1324            a::BASE, a::DIR, a::LANG, a::TITLE
1325        ],
1326        .. TagMeta::default()
1327    });
1328    tag_meta.insert(t::STRONG, TagMeta {
1329        is_inline: true,
1330        basic_attrs: vec![
1331            a::BASE, a::DIR, a::LANG, a::TITLE
1332        ],
1333        .. TagMeta::default()
1334    });
1335    tag_meta.insert(t::STYLE, TagMeta {
1336        is_banned: true,
1337        basic_attrs: vec![
1338            a::BASE, a::DIR, a::LANG
1339        ],
1340        .. TagMeta::default()
1341    });
1342    tag_meta.insert(t::SUB, TagMeta {
1343        is_inline: true,
1344        basic_attrs: vec![
1345            a::BASE, a::DIR, a::LANG, a::TITLE
1346        ],
1347        .. TagMeta::default()
1348    });
1349    tag_meta.insert(t::SUMMARY, TagMeta {
1350        basic_attrs: vec![
1351            a::BASE, a::DIR, a::LANG, a::TITLE
1352        ],
1353        .. TagMeta::default()
1354    });
1355    tag_meta.insert(t::SUP, TagMeta {
1356        is_inline: true,
1357        basic_attrs: vec![
1358            a::BASE, a::DIR, a::LANG, a::TITLE
1359        ],
1360        .. TagMeta::default()
1361    });
1362    tag_meta.insert(t::SVG, TagMeta {
1363        basic_attrs: vec![
1364            a::BASE, a::DIR, a::HEIGHT, a::LANG, a::TITLE, a::WIDTH
1365        ],
1366        .. TagMeta::default()
1367    });
1368    tag_meta.insert(t::TABLE, TagMeta {
1369        basic_attrs: vec![
1370            a::ALIGN, a::BASE, a::DIR, a::LANG, a::SUMMARY, a::TITLE
1371        ],
1372        .. TagMeta::default()
1373    });
1374    tag_meta.insert(t::TBODY, TagMeta {
1375        basic_attrs: vec![
1376            a::ALIGN, a::BASE, a::DIR, a::LANG, a::TITLE
1377        ],
1378        .. TagMeta::default()
1379    });
1380    tag_meta.insert(t::TD, TagMeta {
1381        basic_attrs: vec![
1382            a::ALIGN, a::BASE, a::COLSPAN, a::DIR, a::HEADERS, a::LANG, a::ROWSPAN, a::SCOPE, a::TITLE
1383        ],
1384        .. TagMeta::default()
1385    });
1386    tag_meta.insert(t::TEMPLATE, TagMeta {
1387        is_banned: true,
1388        basic_attrs: vec![
1389            a::BASE, a::DIR, a::LANG, a::TITLE
1390        ],
1391        .. TagMeta::default()
1392    });
1393    tag_meta.insert(t::TEXTAREA, TagMeta {
1394        is_inline: true,
1395        is_banned: true,
1396        basic_attrs: vec![
1397            a::BASE, a::DIR, a::LANG, a::TITLE
1398        ],
1399        .. TagMeta::default()
1400    });
1401    tag_meta.insert(t::TFOOT, TagMeta {
1402        basic_attrs: vec![
1403            a::ALIGN, a::BASE, a::DIR, a::LANG, a::TITLE
1404        ],
1405        .. TagMeta::default()
1406    });
1407    tag_meta.insert(t::TH, TagMeta {
1408        basic_attrs: vec![
1409            a::ABBR, a::ALIGN, a::AXIS, a::BASE, a::COLSPAN, a::DIR, a::LANG, a::ROWSPAN, a::SCOPE, a::TITLE
1410        ],
1411        .. TagMeta::default()
1412    });
1413    tag_meta.insert(t::THEAD, TagMeta {
1414        basic_attrs: vec![
1415            a::ALIGN, a::BASE, a::DIR, a::LANG, a::TITLE
1416        ],
1417        .. TagMeta::default()
1418    });
1419    tag_meta.insert(t::TIME, TagMeta {
1420        is_inline: true,
1421        basic_attrs: vec![
1422            a::BASE, a::DATETIME, a::DIR, a::LANG, a::TITLE
1423        ],
1424        .. TagMeta::default()
1425    });
1426    tag_meta.insert(t::TITLE, TagMeta {
1427        is_meta: true,
1428        basic_attrs: vec![
1429            a::BASE, a::DIR, a::LANG
1430        ],
1431        .. TagMeta::default()
1432    });
1433    tag_meta.insert(t::TR, TagMeta {
1434        basic_attrs: vec![
1435            a::ABBR, a::ALIGN, a::AXIS, a::BASE, a::COLSPAN, a::DIR, a::HEADERS, a::LANG, a::ROWSPAN, a::SCOPE, a::TITLE
1436        ],
1437        .. TagMeta::default()
1438    });
1439    tag_meta.insert(t::TT, TagMeta {
1440        is_deprecated: true,
1441        is_inline: true,
1442        basic_attrs: vec![
1443            a::BASE, a::DIR, a::LANG, a::TITLE
1444        ],
1445        .. TagMeta::default()
1446    });
1447    tag_meta.insert(t::U, TagMeta {
1448        is_deprecated: true,
1449        is_inline: true,
1450        basic_attrs: vec![
1451            a::BASE, a::DIR, a::LANG, a::TITLE
1452        ],
1453        .. TagMeta::default()
1454    });
1455    tag_meta.insert(t::UL, TagMeta {
1456        basic_attrs: vec![
1457            a::BASE, a::DIR, a::LANG, a::TITLE
1458        ],
1459        .. TagMeta::default()
1460    });
1461    tag_meta.insert(t::VAR, TagMeta {
1462        is_inline: true,
1463        basic_attrs: vec![
1464            a::BASE, a::DIR, a::LANG, a::TITLE
1465        ],
1466        .. TagMeta::default()
1467    });
1468    tag_meta.insert(t::VIDEO, TagMeta {
1469        is_inline: true,
1470        basic_attrs: vec![
1471            a::BASE, a::DIR, a::HEIGHT, a::LANG, a::TITLE, a::WIDTH
1472        ],
1473        .. TagMeta::default()
1474    });
1475    tag_meta.insert(t::WBR, TagMeta {
1476        is_empty: true,
1477        is_inline: true,
1478        basic_attrs: vec![
1479            a::BASE, a::DIR, a::LANG, a::TITLE
1480        ],
1481        .. TagMeta::default()
1482    });
1483    tag_meta.insert(t::XMP, TagMeta {
1484        is_deprecated: true,
1485        basic_attrs: vec![
1486            a::BASE, a::DIR, a::LANG, a::TITLE
1487        ],
1488        .. TagMeta::default()
1489    });
1490
1491    tag_meta
1492}