1use std::collections::HashMap;
9
10use lazy_static::lazy_static;
11
12use crate::dom::LocalName;
13
14lazy_static! {
15 pub static ref TAG_META: HashMap<LocalName, TagMeta> = init_tag_metadata();
17}
18
19pub 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 pub fn is_empty(&self) -> bool {
35 self.is_empty
36 }
37
38 pub fn is_deprecated(&self) -> bool {
42 self.is_deprecated
43 }
44
45 pub fn is_inline(&self) -> bool {
55 self.is_inline
56 }
57
58 pub fn is_meta(&self) -> bool {
63 self.is_meta
64 }
65
66 pub fn is_banned(&self) -> bool {
71 self.is_banned
72 }
73
74 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
97pub mod ns {
99 use html5ever::ns;
100 use crate::dom::Namespace;
101
102 pub const HTML: Namespace = ns!(html);
103}
104
105pub mod t {
107 use html5ever::local_name as lname;
108 use crate::dom::LocalName;
109
110 pub const A: LocalName = lname!("a");
113 pub const ABBR: LocalName = lname!("abbr");
116 pub const ACRONYM: LocalName = lname!("acronym");
119 pub const ADDRESS: LocalName = lname!("address");
121 pub const APPLET: LocalName = lname!("applet");
124 pub const AREA: LocalName = lname!("area");
127 pub const ARTICLE: LocalName = lname!("article");
129 pub const ASIDE: LocalName = lname!("aside");
131 pub const AUDIO: LocalName = lname!("audio");
134 pub const B: LocalName = lname!("b");
137 pub const BASE: LocalName = lname!("base");
140 pub const BASEFONT: LocalName = lname!("basefont");
143 pub const BDI: LocalName = lname!("bdi");
146 pub const BDO: LocalName = lname!("bdo");
149 pub const BIG: LocalName = lname!("big");
152 pub const BLINK: LocalName = lname!("blink");
155 pub const BLOCKQUOTE: LocalName = lname!("blockquote");
157 pub const BODY: LocalName = lname!("body");
159 pub const BR: LocalName = lname!("br");
162 pub const BUTTON: LocalName = lname!("button");
165 pub const CANVAS: LocalName = lname!("canvas");
168 pub const CAPTION: LocalName = lname!("caption");
170 pub const CENTER: LocalName = lname!("center");
173 pub const CITE: LocalName = lname!("cite");
176 pub const CODE: LocalName = lname!("code");
179 pub const COL: LocalName = lname!("col");
182 pub const COLGROUP: LocalName = lname!("colgroup");
184 pub const CONTENT: LocalName = lname!("content");
187 pub const DATA: LocalName = lname!("data");
190 pub const DATALIST: LocalName = lname!("datalist");
193 pub const DD: LocalName = lname!("dd");
195 pub const DEL: LocalName = lname!("del");
198 pub const DETAILS: LocalName = lname!("details");
200 pub const DFN: LocalName = lname!("dfn");
203 pub const DIALOG: LocalName = lname!("dialog");
205 pub const DIR: LocalName = lname!("dir");
208 pub const DIV: LocalName = lname!("div");
210 pub const DL: LocalName = lname!("dl");
212 pub const DT: LocalName = lname!("dt");
214 pub const EM: LocalName = lname!("em");
217 pub const EMBED: LocalName = lname!("embed");
220 pub const FIELDSET: LocalName = lname!("fieldset");
223 pub const FIGCAPTION: LocalName = lname!("figcaption");
225 pub const FIGURE: LocalName = lname!("figure");
227 pub const FONT: LocalName = lname!("font");
230 pub const FOOTER: LocalName = lname!("footer");
232 pub const FORM: LocalName = lname!("form");
234 pub const FRAME: LocalName = lname!("frame");
237 pub const FRAMESET: LocalName = lname!("frameset");
240 pub const H1: LocalName = lname!("h1");
242 pub const H2: LocalName = lname!("h2");
244 pub const H3: LocalName = lname!("h3");
246 pub const H4: LocalName = lname!("h4");
248 pub const H5: LocalName = lname!("h5");
250 pub const H6: LocalName = lname!("h6");
252 pub const HEAD: LocalName = lname!("head");
255 pub const HEADER: LocalName = lname!("header");
257 pub const HGROUP: LocalName = lname!("hgroup");
259 pub const HR: LocalName = lname!("hr");
262 pub const HTML: LocalName = lname!("html");
264 pub const I: LocalName = lname!("i");
267 pub const IFRAME: LocalName = lname!("iframe");
270 pub const IMG: LocalName = lname!("img");
273 pub const INPUT: LocalName = lname!("input");
276 pub const INS: LocalName = lname!("ins");
279 pub const ISINDEX: LocalName = lname!("isindex");
282 pub const KBD: LocalName = lname!("kbd");
285 pub const LABEL: LocalName = lname!("label");
288 pub const LEGEND: LocalName = lname!("legend");
291 pub const LI: LocalName = lname!("li");
293 pub const LINK: LocalName = lname!("link");
296 pub const LISTING: LocalName = lname!("listing");
299 pub const MAIN: LocalName = lname!("main");
301 pub const MAP: LocalName = lname!("map");
304 pub const MARK: LocalName = lname!("mark");
307 pub const MENU: LocalName = lname!("menu");
310 pub const MENUITEM: LocalName = lname!("menuitem");
313 pub const META: LocalName = lname!("meta");
316 pub const METER: LocalName = lname!("meter");
319 pub const NAV: LocalName = lname!("nav");
321 pub const NOBR: LocalName = lname!("nobr");
324 pub const NOFRAMES: LocalName = lname!("noframes");
327 pub const NOSCRIPT: LocalName = lname!("noscript");
330 pub const OBJECT: LocalName = lname!("object");
333 pub const OL: LocalName = lname!("ol");
335 pub const OPTGROUP: LocalName = lname!("optgroup");
338 pub const OPTION: LocalName = lname!("option");
341 pub const OUTPUT: LocalName = lname!("output");
344 pub const P: LocalName = lname!("p");
346 pub const PARAM: LocalName = lname!("param");
349 pub const PICTURE: LocalName = lname!("picture");
352 pub const PLAINTEXT: LocalName = lname!("plaintext");
355 pub const PRE: LocalName = lname!("pre");
357 pub const PROGRESS: LocalName = lname!("progress");
360 pub const Q: LocalName = lname!("q");
363 pub const RB: LocalName = lname!("rb");
365 lazy_static::lazy_static! {
366 pub static ref RBC: LocalName = "rbc".into();
371 }
372 pub const RP: LocalName = lname!("rp");
374 pub const RT: LocalName = lname!("rt");
376 pub const RTC: LocalName = lname!("rtc");
378 pub const RUBY: LocalName = lname!("ruby");
381 pub const S: LocalName = lname!("s");
384 pub const SAMP: LocalName = lname!("samp");
387 pub const SCRIPT: LocalName = lname!("script");
390 pub const SECTION: LocalName = lname!("section");
392 pub const SELECT: LocalName = lname!("select");
395 pub const SLOT: LocalName = lname!("slot");
398 pub const SMALL: LocalName = lname!("small");
401 pub const SOURCE: LocalName = lname!("source");
404 pub const SPAN: LocalName = lname!("span");
407 pub const STRIKE: LocalName = lname!("strike");
410 pub const STRONG: LocalName = lname!("strong");
413 pub const STYLE: LocalName = lname!("style");
416 pub const SUB: LocalName = lname!("sub");
419 pub const SUMMARY: LocalName = lname!("summary");
421 pub const SUP: LocalName = lname!("sup");
424 pub const SVG: LocalName = lname!("svg");
426 pub const TABLE: LocalName = lname!("table");
428 pub const TBODY: LocalName = lname!("tbody");
430 pub const TD: LocalName = lname!("td");
432 pub const TEMPLATE: LocalName = lname!("template");
435 pub const TEXTAREA: LocalName = lname!("textarea");
438 pub const TFOOT: LocalName = lname!("tfoot");
440 pub const TH: LocalName = lname!("th");
442 pub const THEAD: LocalName = lname!("thead");
444 pub const TIME: LocalName = lname!("time");
447 pub const TITLE: LocalName = lname!("title");
450 pub const TR: LocalName = lname!("tr");
452 pub const TT: LocalName = lname!("tt");
455 pub const U: LocalName = lname!("u");
458 pub const UL: LocalName = lname!("ul");
460 pub const VAR: LocalName = lname!("var");
463 pub const VIDEO: LocalName = lname!("video");
466 pub const WBR: LocalName = lname!("wbr");
469 pub const XMP: LocalName = lname!("xmp");
472}
473
474pub mod a {
476 use html5ever::local_name as lname;
477 use crate::dom::LocalName;
478
479 pub const ABBR: LocalName = lname!("abbr");
480 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 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 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 pub const CONTENT: LocalName = lname!("content");
502 pub const CONTROLS: LocalName = lname!("controls");
503 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 pub static ref DECODING: LocalName = "decoding".into();
512 }
513 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 pub const HIDDEN: LocalName = lname!("hidden");
520 pub const HREF: LocalName = lname!("href");
522 pub const HREFLANG: LocalName = lname!("hreflang");
524 pub const HTTP_EQUIV: LocalName = lname!("http-equiv");
526 pub const ID: LocalName = lname!("id");
527 pub const LABEL: LocalName = lname!("label");
528 pub const LANG: LocalName = lname!("lang");
530 pub const MEDIA: LocalName = lname!("media");
531 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 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 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}