Skip to main content

pagesift_html/
tag.rs

1//! 已知的 HTML 标签。用枚举而不是字符串:比较是一次整数比较,分类判断编译成查表。
2
3/// HTML 标签。不认识的标签是 [`Tag::Other`],名字从 [`crate::Element::name`] 取。
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[repr(u8)]
6pub enum Tag {
7    A,
8    Abbr,
9    Address,
10    Applet,
11    Area,
12    Article,
13    Aside,
14    Audio,
15    B,
16    Base,
17    Basefont,
18    Bdi,
19    Bdo,
20    Bgsound,
21    Big,
22    Blockquote,
23    Body,
24    Br,
25    Button,
26    Canvas,
27    Caption,
28    Center,
29    Cite,
30    Code,
31    Col,
32    Colgroup,
33    Data,
34    Datalist,
35    Dd,
36    Del,
37    Details,
38    Dfn,
39    Dialog,
40    Dir,
41    Div,
42    Dl,
43    Dt,
44    Em,
45    Embed,
46    Fieldset,
47    Figcaption,
48    Figure,
49    Font,
50    Footer,
51    Form,
52    Frame,
53    Frameset,
54    H1,
55    H2,
56    H3,
57    H4,
58    H5,
59    H6,
60    Head,
61    Header,
62    Hgroup,
63    Hr,
64    Html,
65    I,
66    Iframe,
67    Img,
68    Input,
69    Ins,
70    Kbd,
71    Keygen,
72    Label,
73    Legend,
74    Li,
75    Link,
76    Listing,
77    Main,
78    Map,
79    Mark,
80    Marquee,
81    Math,
82    Menu,
83    Meta,
84    Meter,
85    Nav,
86    Nobr,
87    Noembed,
88    Noframes,
89    Noscript,
90    Object,
91    Ol,
92    Optgroup,
93    Option,
94    Output,
95    P,
96    Param,
97    Picture,
98    Plaintext,
99    Pre,
100    Progress,
101    Q,
102    Rb,
103    Rp,
104    Rt,
105    Rtc,
106    Ruby,
107    S,
108    Samp,
109    Script,
110    Search,
111    Section,
112    Select,
113    Slot,
114    Small,
115    Source,
116    Span,
117    Strike,
118    Strong,
119    Style,
120    Sub,
121    Summary,
122    Sup,
123    Svg,
124    Table,
125    Tbody,
126    Td,
127    Template,
128    Textarea,
129    Tfoot,
130    Th,
131    Thead,
132    Time,
133    Title,
134    Tr,
135    Track,
136    Tt,
137    U,
138    Ul,
139    Var,
140    Video,
141    Wbr,
142    Xmp,
143    /// 不在上面列表里的标签,包括自定义元素和 SVG、MathML 内部的元素。
144    Other,
145}
146
147impl Tag {
148    /// 小写名字;[`Tag::Other`] 返回空串。
149    pub fn name(self) -> &'static str {
150        match self {
151            Tag::A => "a",
152            Tag::Abbr => "abbr",
153            Tag::Address => "address",
154            Tag::Applet => "applet",
155            Tag::Area => "area",
156            Tag::Article => "article",
157            Tag::Aside => "aside",
158            Tag::Audio => "audio",
159            Tag::B => "b",
160            Tag::Base => "base",
161            Tag::Basefont => "basefont",
162            Tag::Bdi => "bdi",
163            Tag::Bdo => "bdo",
164            Tag::Bgsound => "bgsound",
165            Tag::Big => "big",
166            Tag::Blockquote => "blockquote",
167            Tag::Body => "body",
168            Tag::Br => "br",
169            Tag::Button => "button",
170            Tag::Canvas => "canvas",
171            Tag::Caption => "caption",
172            Tag::Center => "center",
173            Tag::Cite => "cite",
174            Tag::Code => "code",
175            Tag::Col => "col",
176            Tag::Colgroup => "colgroup",
177            Tag::Data => "data",
178            Tag::Datalist => "datalist",
179            Tag::Dd => "dd",
180            Tag::Del => "del",
181            Tag::Details => "details",
182            Tag::Dfn => "dfn",
183            Tag::Dialog => "dialog",
184            Tag::Dir => "dir",
185            Tag::Div => "div",
186            Tag::Dl => "dl",
187            Tag::Dt => "dt",
188            Tag::Em => "em",
189            Tag::Embed => "embed",
190            Tag::Fieldset => "fieldset",
191            Tag::Figcaption => "figcaption",
192            Tag::Figure => "figure",
193            Tag::Font => "font",
194            Tag::Footer => "footer",
195            Tag::Form => "form",
196            Tag::Frame => "frame",
197            Tag::Frameset => "frameset",
198            Tag::H1 => "h1",
199            Tag::H2 => "h2",
200            Tag::H3 => "h3",
201            Tag::H4 => "h4",
202            Tag::H5 => "h5",
203            Tag::H6 => "h6",
204            Tag::Head => "head",
205            Tag::Header => "header",
206            Tag::Hgroup => "hgroup",
207            Tag::Hr => "hr",
208            Tag::Html => "html",
209            Tag::I => "i",
210            Tag::Iframe => "iframe",
211            Tag::Img => "img",
212            Tag::Input => "input",
213            Tag::Ins => "ins",
214            Tag::Kbd => "kbd",
215            Tag::Keygen => "keygen",
216            Tag::Label => "label",
217            Tag::Legend => "legend",
218            Tag::Li => "li",
219            Tag::Link => "link",
220            Tag::Listing => "listing",
221            Tag::Main => "main",
222            Tag::Map => "map",
223            Tag::Mark => "mark",
224            Tag::Marquee => "marquee",
225            Tag::Math => "math",
226            Tag::Menu => "menu",
227            Tag::Meta => "meta",
228            Tag::Meter => "meter",
229            Tag::Nav => "nav",
230            Tag::Nobr => "nobr",
231            Tag::Noembed => "noembed",
232            Tag::Noframes => "noframes",
233            Tag::Noscript => "noscript",
234            Tag::Object => "object",
235            Tag::Ol => "ol",
236            Tag::Optgroup => "optgroup",
237            Tag::Option => "option",
238            Tag::Output => "output",
239            Tag::P => "p",
240            Tag::Param => "param",
241            Tag::Picture => "picture",
242            Tag::Plaintext => "plaintext",
243            Tag::Pre => "pre",
244            Tag::Progress => "progress",
245            Tag::Q => "q",
246            Tag::Rb => "rb",
247            Tag::Rp => "rp",
248            Tag::Rt => "rt",
249            Tag::Rtc => "rtc",
250            Tag::Ruby => "ruby",
251            Tag::S => "s",
252            Tag::Samp => "samp",
253            Tag::Script => "script",
254            Tag::Search => "search",
255            Tag::Section => "section",
256            Tag::Select => "select",
257            Tag::Slot => "slot",
258            Tag::Small => "small",
259            Tag::Source => "source",
260            Tag::Span => "span",
261            Tag::Strike => "strike",
262            Tag::Strong => "strong",
263            Tag::Style => "style",
264            Tag::Sub => "sub",
265            Tag::Summary => "summary",
266            Tag::Sup => "sup",
267            Tag::Svg => "svg",
268            Tag::Table => "table",
269            Tag::Tbody => "tbody",
270            Tag::Td => "td",
271            Tag::Template => "template",
272            Tag::Textarea => "textarea",
273            Tag::Tfoot => "tfoot",
274            Tag::Th => "th",
275            Tag::Thead => "thead",
276            Tag::Time => "time",
277            Tag::Title => "title",
278            Tag::Tr => "tr",
279            Tag::Track => "track",
280            Tag::Tt => "tt",
281            Tag::U => "u",
282            Tag::Ul => "ul",
283            Tag::Var => "var",
284            Tag::Video => "video",
285            Tag::Wbr => "wbr",
286            Tag::Xmp => "xmp",
287            Tag::Other => "",
288        }
289    }
290
291    /// 按小写名字查标签。
292    pub fn from_name(name: &str) -> Tag {
293        match name {
294            "a" => Tag::A,
295            "abbr" => Tag::Abbr,
296            "address" => Tag::Address,
297            "applet" => Tag::Applet,
298            "area" => Tag::Area,
299            "article" => Tag::Article,
300            "aside" => Tag::Aside,
301            "audio" => Tag::Audio,
302            "b" => Tag::B,
303            "base" => Tag::Base,
304            "basefont" => Tag::Basefont,
305            "bdi" => Tag::Bdi,
306            "bdo" => Tag::Bdo,
307            "bgsound" => Tag::Bgsound,
308            "big" => Tag::Big,
309            "blockquote" => Tag::Blockquote,
310            "body" => Tag::Body,
311            "br" => Tag::Br,
312            "button" => Tag::Button,
313            "canvas" => Tag::Canvas,
314            "caption" => Tag::Caption,
315            "center" => Tag::Center,
316            "cite" => Tag::Cite,
317            "code" => Tag::Code,
318            "col" => Tag::Col,
319            "colgroup" => Tag::Colgroup,
320            "data" => Tag::Data,
321            "datalist" => Tag::Datalist,
322            "dd" => Tag::Dd,
323            "del" => Tag::Del,
324            "details" => Tag::Details,
325            "dfn" => Tag::Dfn,
326            "dialog" => Tag::Dialog,
327            "dir" => Tag::Dir,
328            "div" => Tag::Div,
329            "dl" => Tag::Dl,
330            "dt" => Tag::Dt,
331            "em" => Tag::Em,
332            "embed" => Tag::Embed,
333            "fieldset" => Tag::Fieldset,
334            "figcaption" => Tag::Figcaption,
335            "figure" => Tag::Figure,
336            "font" => Tag::Font,
337            "footer" => Tag::Footer,
338            "form" => Tag::Form,
339            "frame" => Tag::Frame,
340            "frameset" => Tag::Frameset,
341            "h1" => Tag::H1,
342            "h2" => Tag::H2,
343            "h3" => Tag::H3,
344            "h4" => Tag::H4,
345            "h5" => Tag::H5,
346            "h6" => Tag::H6,
347            "head" => Tag::Head,
348            "header" => Tag::Header,
349            "hgroup" => Tag::Hgroup,
350            "hr" => Tag::Hr,
351            "html" => Tag::Html,
352            "i" => Tag::I,
353            "iframe" => Tag::Iframe,
354            "img" => Tag::Img,
355            "input" => Tag::Input,
356            "ins" => Tag::Ins,
357            "kbd" => Tag::Kbd,
358            "keygen" => Tag::Keygen,
359            "label" => Tag::Label,
360            "legend" => Tag::Legend,
361            "li" => Tag::Li,
362            "link" => Tag::Link,
363            "listing" => Tag::Listing,
364            "main" => Tag::Main,
365            "map" => Tag::Map,
366            "mark" => Tag::Mark,
367            "marquee" => Tag::Marquee,
368            "math" => Tag::Math,
369            "menu" => Tag::Menu,
370            "meta" => Tag::Meta,
371            "meter" => Tag::Meter,
372            "nav" => Tag::Nav,
373            "nobr" => Tag::Nobr,
374            "noembed" => Tag::Noembed,
375            "noframes" => Tag::Noframes,
376            "noscript" => Tag::Noscript,
377            "object" => Tag::Object,
378            "ol" => Tag::Ol,
379            "optgroup" => Tag::Optgroup,
380            "option" => Tag::Option,
381            "output" => Tag::Output,
382            "p" => Tag::P,
383            "param" => Tag::Param,
384            "picture" => Tag::Picture,
385            "plaintext" => Tag::Plaintext,
386            "pre" => Tag::Pre,
387            "progress" => Tag::Progress,
388            "q" => Tag::Q,
389            "rb" => Tag::Rb,
390            "rp" => Tag::Rp,
391            "rt" => Tag::Rt,
392            "rtc" => Tag::Rtc,
393            "ruby" => Tag::Ruby,
394            "s" => Tag::S,
395            "samp" => Tag::Samp,
396            "script" => Tag::Script,
397            "search" => Tag::Search,
398            "section" => Tag::Section,
399            "select" => Tag::Select,
400            "slot" => Tag::Slot,
401            "small" => Tag::Small,
402            "source" => Tag::Source,
403            "span" => Tag::Span,
404            "strike" => Tag::Strike,
405            "strong" => Tag::Strong,
406            "style" => Tag::Style,
407            "sub" => Tag::Sub,
408            "summary" => Tag::Summary,
409            "sup" => Tag::Sup,
410            "svg" => Tag::Svg,
411            "table" => Tag::Table,
412            "tbody" => Tag::Tbody,
413            "td" => Tag::Td,
414            "template" => Tag::Template,
415            "textarea" => Tag::Textarea,
416            "tfoot" => Tag::Tfoot,
417            "th" => Tag::Th,
418            "thead" => Tag::Thead,
419            "time" => Tag::Time,
420            "title" => Tag::Title,
421            "tr" => Tag::Tr,
422            "track" => Tag::Track,
423            "tt" => Tag::Tt,
424            "u" => Tag::U,
425            "ul" => Tag::Ul,
426            "var" => Tag::Var,
427            "video" => Tag::Video,
428            "wbr" => Tag::Wbr,
429            "xmp" => Tag::Xmp,
430            _ => Tag::Other,
431        }
432    }
433}