Skip to content

Commit cab4878

Browse files
committed
engine_spx2html: work on codifying HTML tag info
1 parent 5a737e3 commit cab4878

2 files changed

Lines changed: 224 additions & 0 deletions

File tree

crates/engine_spx2html/src/html.rs

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
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+
}

crates/engine_spx2html/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use tectonic_xdv::{FileType, XdvEvents, XdvParser};
2525
use crate::font::{FontData, MapEntry};
2626

2727
mod font;
28+
mod html;
2829

2930
/// An engine that converts SPX to HTML.
3031
#[derive(Default)]

0 commit comments

Comments
 (0)