|
| 1 | +// Copyright 2021-2022 the Tectonic Project |
| 2 | +// Licensed under the MIT License. |
| 3 | + |
| 4 | +//! Helpers for working with HTML5 tags. |
| 5 | +
|
| 6 | +use std::str::FromStr; |
| 7 | + |
| 8 | +macro_rules! emit_tag_data { |
| 9 | + ($([$vname:ident $tagname:literal deprecated($deprecated:literal), autoclosed($($acvname:ident),*)],)+) => { |
| 10 | + pub enum Tag { |
| 11 | + $($vname,)+ |
| 12 | + Other(String), |
| 13 | + } |
| 14 | + |
| 15 | + impl FromStr for Tag { |
| 16 | + type Err = (); |
| 17 | + |
| 18 | + fn from_str(s: &str) -> Result<Self, Self::Err> { |
| 19 | + Ok(match s { |
| 20 | + $($tagname => Tag::$vname,)+ |
| 21 | + other => Tag::Other(other.to_owned()) |
| 22 | + }) |
| 23 | + } |
| 24 | + } |
| 25 | + |
| 26 | + impl Tag { |
| 27 | + pub fn is_deprecated(&self) -> bool { |
| 28 | + match self { |
| 29 | + $(Tag::$vname => $deprecated,)+ |
| 30 | + Tag::Other(_) => false, |
| 31 | + } |
| 32 | + } |
| 33 | + |
| 34 | + pub fn is_other(&self) -> bool { |
| 35 | + matches!(self, Tag::Other(_)) |
| 36 | + } |
| 37 | + |
| 38 | + pub fn is_autoclosed_by(&self, other: &Tag) -> bool { |
| 39 | + match self { |
| 40 | + $( |
| 41 | + Tag::$vname => { |
| 42 | + match other { |
| 43 | + $(Tag::$acvname => true,)* |
| 44 | + _ => false |
| 45 | + } |
| 46 | + }, |
| 47 | + )+ |
| 48 | + Tag::Other(_) => false, |
| 49 | + } |
| 50 | + } |
| 51 | + } |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +emit_tag_data! { |
| 56 | + [A "a" deprecated(false), autoclosed()], |
| 57 | + [Abbr "abbr" deprecated(false), autoclosed()], |
| 58 | + [Acronym "acroynm" deprecated(true), autoclosed()], |
| 59 | + [Address "address" deprecated(false), autoclosed()], |
| 60 | + [Applet "applet" deprecated(true), autoclosed()], |
| 61 | + [Area "area" deprecated(false), autoclosed()], |
| 62 | + [Article "article" deprecated(false), autoclosed()], |
| 63 | + [Aside "aside" deprecated(false), autoclosed()], |
| 64 | + [Audio "audio" deprecated(false), autoclosed()], |
| 65 | + [B "b" deprecated(false), autoclosed()], |
| 66 | + [Base "base" deprecated(false), autoclosed()], |
| 67 | + [Bdi "bdi" deprecated(false), autoclosed()], |
| 68 | + [Bdo "bdo" deprecated(false), autoclosed()], |
| 69 | + [Bgsound "bgsound" deprecated(true), autoclosed()], |
| 70 | + [Big "big" deprecated(true), autoclosed()], |
| 71 | + [Blink "blink" deprecated(true), autoclosed()], |
| 72 | + [Blockquote "blockquote" deprecated(false), autoclosed()], |
| 73 | + [Body "body" deprecated(false), autoclosed()], |
| 74 | + [Br "br" deprecated(false), autoclosed()], |
| 75 | + [Button "button" deprecated(false), autoclosed()], |
| 76 | + [Canvas "canvas" deprecated(false), autoclosed()], |
| 77 | + [Caption "caption" deprecated(false), autoclosed()], |
| 78 | + [Center "center" deprecated(true), autoclosed()], |
| 79 | + [Cite "cite" deprecated(false), autoclosed()], |
| 80 | + [Code "code" deprecated(false), autoclosed()], |
| 81 | + [Col "col" deprecated(false), autoclosed()], |
| 82 | + [Colgroup "colgroup" deprecated(false), autoclosed()], |
| 83 | + [Content "content" deprecated(true), autoclosed()], |
| 84 | + [Data "data" deprecated(false), autoclosed()], |
| 85 | + [Datalist "datalist" deprecated(false), autoclosed()], |
| 86 | + [Dd "dd" deprecated(false), autoclosed()], |
| 87 | + [Del "del" deprecated(false), autoclosed()], |
| 88 | + [Details "details" deprecated(false), autoclosed()], |
| 89 | + [Dfn "dfn" deprecated(false), autoclosed()], |
| 90 | + [Dialog "dialog" deprecated(false), autoclosed()], |
| 91 | + [Dir "dir" deprecated(true), autoclosed()], |
| 92 | + [Div "div" deprecated(false), autoclosed()], |
| 93 | + [Dl "dl" deprecated(false), autoclosed()], |
| 94 | + [Dt "dt" deprecated(false), autoclosed()], |
| 95 | + [Em "em" deprecated(false), autoclosed()], |
| 96 | + [Embed "embed" deprecated(false), autoclosed()], |
| 97 | + [Fieldset "fieldset" deprecated(false), autoclosed()], |
| 98 | + [Figcaption "figcaption" deprecated(false), autoclosed()], |
| 99 | + [Figure "figure" deprecated(false), autoclosed()], |
| 100 | + [Font "font" deprecated(true), autoclosed()], |
| 101 | + [Footer "footer" deprecated(false), autoclosed()], |
| 102 | + [Form "form" deprecated(false), autoclosed()], |
| 103 | + [Frame "frame" deprecated(true), autoclosed()], |
| 104 | + [Frameset "frameset" deprecated(true), autoclosed()], |
| 105 | + [H1 "h1" deprecated(false), autoclosed()], |
| 106 | + [H2 "h2" deprecated(false), autoclosed()], |
| 107 | + [H3 "h3" deprecated(false), autoclosed()], |
| 108 | + [H4 "h4" deprecated(false), autoclosed()], |
| 109 | + [H5 "h5" deprecated(false), autoclosed()], |
| 110 | + [H6 "h6" deprecated(false), autoclosed()], |
| 111 | + [Head "head" deprecated(false), autoclosed()], |
| 112 | + [Header "header" deprecated(false), autoclosed()], |
| 113 | + [Hgroup "hgroup" deprecated(true), autoclosed()], |
| 114 | + [Hr "hr" deprecated(false), autoclosed()], |
| 115 | + [Html "html" deprecated(false), autoclosed()], |
| 116 | + [I "i" deprecated(false), autoclosed()], |
| 117 | + [Iframe "iframe" deprecated(false), autoclosed()], |
| 118 | + [Image "image" deprecated(true), autoclosed()], |
| 119 | + [Img "img" deprecated(false), autoclosed()], |
| 120 | + [Input "input" deprecated(false), autoclosed()], |
| 121 | + [Ins "ins" deprecated(false), autoclosed()], |
| 122 | + [Kbd "kbd" deprecated(false), autoclosed()], |
| 123 | + [Keygen "keygen" deprecated(true), autoclosed()], |
| 124 | + [Label "label" deprecated(false), autoclosed()], |
| 125 | + [Legend "legend" deprecated(false), autoclosed()], |
| 126 | + [Li "li" deprecated(false), autoclosed()], |
| 127 | + [Link "link" deprecated(false), autoclosed()], |
| 128 | + [Main "main" deprecated(false), autoclosed()], |
| 129 | + [Map "map" deprecated(false), autoclosed()], |
| 130 | + [Mark "mark" deprecated(false), autoclosed()], |
| 131 | + [Marquee "marquee" deprecated(true), autoclosed()], |
| 132 | + [Math "math" deprecated(false), autoclosed()], |
| 133 | + [Menu "menu" deprecated(false), autoclosed()], |
| 134 | + [Menuitem "menuitem" deprecated(true), autoclosed()], |
| 135 | + [Meta "meta" deprecated(false), autoclosed()], |
| 136 | + [Meter "meter" deprecated(false), autoclosed()], |
| 137 | + [Nav "nav" deprecated(false), autoclosed()], |
| 138 | + [Nobr "nobr" deprecated(true), autoclosed()], |
| 139 | + [Noembed "noembed" deprecated(true), autoclosed()], |
| 140 | + [Noframes "noframes" deprecated(true), autoclosed()], |
| 141 | + [Noscript "noscript" deprecated(false), autoclosed()], |
| 142 | + [Object "object" deprecated(false), autoclosed()], |
| 143 | + [Ol "ol" deprecated(false), autoclosed()], |
| 144 | + [Optgroup "optgroup" deprecated(false), autoclosed()], |
| 145 | + [Option "option" deprecated(false), autoclosed()], |
| 146 | + [Output "output" deprecated(false), autoclosed()], |
| 147 | + [P "p" deprecated(false), autoclosed( |
| 148 | + Address, |
| 149 | + Article, |
| 150 | + Aside, |
| 151 | + Blockquote, |
| 152 | + Div, |
| 153 | + Dl, |
| 154 | + Fieldset, |
| 155 | + Footer, |
| 156 | + Form, |
| 157 | + H1, |
| 158 | + H2, |
| 159 | + H3, |
| 160 | + H4, |
| 161 | + H5, |
| 162 | + H6, |
| 163 | + Header, |
| 164 | + Hr, |
| 165 | + Menu, |
| 166 | + Nav, |
| 167 | + Ol, |
| 168 | + Pre, |
| 169 | + Section, |
| 170 | + Table, |
| 171 | + Ul, |
| 172 | + P |
| 173 | + )], |
| 174 | + [Param "param" deprecated(true), autoclosed()], |
| 175 | + [Picture "picture" deprecated(false), autoclosed()], |
| 176 | + [Plaintext "plaintext" deprecated(true), autoclosed()], |
| 177 | + [Portal "portal" deprecated(false), autoclosed()], |
| 178 | + [Pre "pre" deprecated(false), autoclosed()], |
| 179 | + [Progress "progress" deprecated(false), autoclosed()], |
| 180 | + [Q "q" deprecated(false), autoclosed()], |
| 181 | + [Rb "rb" deprecated(true), autoclosed()], |
| 182 | + [Rp "rp" deprecated(false), autoclosed()], |
| 183 | + [Rt "rt" deprecated(false), autoclosed()], |
| 184 | + [Rtc "rtc" deprecated(true), autoclosed()], |
| 185 | + [Ruby "ruby" deprecated(false), autoclosed()], |
| 186 | + [S "s" deprecated(false), autoclosed()], |
| 187 | + [Samp "samp" deprecated(false), autoclosed()], |
| 188 | + [Script "script" deprecated(false), autoclosed()], |
| 189 | + [Section "section" deprecated(false), autoclosed()], |
| 190 | + [Select "select" deprecated(false), autoclosed()], |
| 191 | + [Shadow "shadow" deprecated(true), autoclosed()], |
| 192 | + [Slot "slot" deprecated(false), autoclosed()], |
| 193 | + [Small "small" deprecated(false), autoclosed()], |
| 194 | + [Spacer "spacer" deprecated(true), autoclosed()], |
| 195 | + [Source "source" deprecated(false), autoclosed()], |
| 196 | + [Span "span" deprecated(false), autoclosed()], |
| 197 | + [Strike "strike" deprecated(true), autoclosed()], |
| 198 | + [Strong "strong" deprecated(false), autoclosed()], |
| 199 | + [Style "style" deprecated(false), autoclosed()], |
| 200 | + [Sub "sub" deprecated(false), autoclosed()], |
| 201 | + [Summary "summary" deprecated(false), autoclosed()], |
| 202 | + [Sup "sup" deprecated(false), autoclosed()], |
| 203 | + [Svg "svg" deprecated(false), autoclosed()], |
| 204 | + [Table "table" deprecated(false), autoclosed()], |
| 205 | + [Tbody "tbody" deprecated(false), autoclosed()], |
| 206 | + [Td "td" deprecated(false), autoclosed()], |
| 207 | + [Template "template" deprecated(false), autoclosed()], |
| 208 | + [Textarea "textarea" deprecated(false), autoclosed()], |
| 209 | + [Tfoot "tfoot" deprecated(false), autoclosed()], |
| 210 | + [Th "th" deprecated(false), autoclosed()], |
| 211 | + [Thead "thead" deprecated(false), autoclosed()], |
| 212 | + [Time "time" deprecated(false), autoclosed()], |
| 213 | + [Title "title" deprecated(false), autoclosed()], |
| 214 | + [Tr "tr" deprecated(false), autoclosed()], |
| 215 | + [Track "track" deprecated(false), autoclosed()], |
| 216 | + [Tt "tt" deprecated(true), autoclosed()], |
| 217 | + [U "u" deprecated(false), autoclosed()], |
| 218 | + [Ul "ul" deprecated(false), autoclosed()], |
| 219 | + [Var "var" deprecated(false), autoclosed()], |
| 220 | + [Video "video" deprecated(false), autoclosed()], |
| 221 | + [Wbr "wbr" deprecated(false), autoclosed()], |
| 222 | + [Xmp "xmp" deprecated(true), autoclosed()], |
| 223 | +} |
0 commit comments