1pub mod site;
2use regex::Regex;
3
4use std::fmt::{self, Display, Formatter};
5
6const A: &str = "a";
9const ABBR: &str = "abbr";
10const ACRONYM: &str = "acronym";
11const ADDRESS: &str = "address";
12const APPLET: &str = "applet";
13const AREA: &str = "area";
14const ARTICLE: &str = "article";
15const ASIDE: &str = "aside";
16const AUDIO: &str = "audio";
17const B: &str = "b";
18const BASE: &str = "base";
19const BASEFONT: &str = "basefont";
20const BDI: &str = "bdi";
21const BDO: &str = "bdo";
22const BIG: &str = "big";
23const BLOCKQUOTE: &str = "blockquote";
24const BODY: &str = "body";
25const BR: &str = "br";
26const BUTTON: &str = "button";
27const CANVAS: &str = "canvas";
28const CAPTION: &str = "caption";
29const CENTER: &str = "center";
30const CITE: &str = "cite";
31const CODE: &str = "code";
32const COL: &str = "col";
33const COLGROUP: &str = "colgroup";
34const DATALIST: &str = "datalist";
35const DD: &str = "dd";
36const DEL: &str = "del";
37const DETAILS: &str = "details";
38const DFN: &str = "dfn";
39const DIR: &str = "dir";
40const DIV: &str = "div";
41const DL: &str = "dl";
42const DT: &str = "dt";
43const EM: &str = "em";
44const EMBED: &str = "embed";
45const FIELDSET: &str = "fieldset";
46const FIGCAPTION: &str = "figcaption";
47const FIGURE: &str = "figure";
48const FONT: &str = "font";
49const FOOTER: &str = "footer";
50const FORM: &str = "form";
51const FRAME: &str = "frame";
52const FRAMESET: &str = "frameset";
53const H1: &str = "h1";
54const H2: &str = "h2";
55const H3: &str = "h3";
56const H4: &str = "h4";
57const H5: &str = "h5";
58const H6: &str = "h6";
59const HEAD: &str = "head";
60const HEADER: &str = "header";
61const HR: &str = "hr";
62const HTML: &str = "html";
63const I: &str = "i";
64const IFRAME: &str = "iframe";
65const IMG: &str = "img";
66const INPUT: &str = "input";
67const INS: &str = "ins";
68const KBD: &str = "kbd";
69const KEYGEN: &str = "keygen";
70const LABEL: &str = "label";
71const LEGEND: &str = "legend";
72const LI: &str = "li";
73const LINK: &str = "link";
74const MAIN: &str = "main";
75const MAP: &str = "map";
76const MARK: &str = "mark";
77const MENU: &str = "menu";
78const MENUITEM: &str = "menuitem";
79const META: &str = "meta";
80const METER: &str = "meter";
81const NAV: &str = "nav";
82const NOFRAMES: &str = "noframes";
83const NOSCRIPT: &str = "noscript";
84const OBJECT: &str = "object";
85const OL: &str = "ol";
86const OPTGROUP: &str = "optgroup";
87const OPTION: &str = "option";
88const OUTPUT: &str = "output";
89const P: &str = "p";
90const PARAM: &str = "param";
91const PRE: &str = "pre";
92const PROGRESS: &str = "progress";
93const Q: &str = "q";
94
95const S: &str = "s";
96const SAMP: &str = "samp";
97const SCRIPT: &str = "script";
98const SECTION: &str = "section";
99const SELECT: &str = "select";
100const SMALL: &str = "small";
101const SOURCE: &str = "source";
102const SPAN: &str = "span";
103const STRIKE: &str = "strike";
104const STRONG: &str = "strong";
105const STYLE: &str = "style";
106const SUB: &str = "sub";
107const SUMMARY: &str = "summary";
108const SUP: &str = "sup";
109const TABLE: &str = "table";
110const TBODY: &str = "tbody";
111const TD: &str = "td";
112const TEXTAREA: &str = "textarea";
113const TFOOT: &str = "tfoot";
114const TH: &str = "th";
115const THEAD: &str = "thead";
116const TIME: &str = "time";
117const TITLE: &str = "title";
118const TR: &str = "tr";
119const TRACK: &str = "track";
120const TT: &str = "tt";
121const U: &str = "u";
122const UL: &str = "ul";
123const VAR: &str = "var";
124const VIDEO: &str = "video";
125
126pub struct HtmlTag(pub &'static str);
137impl Display for HtmlTag {
138 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
139 write!(f, "{}", self.0)
140 }
141}
142impl HtmlTag {
143 pub const A: HtmlTag = HtmlTag(A);
145 pub const ABBR: HtmlTag = HtmlTag(ABBR);
147 pub const ACRONYM: HtmlTag = HtmlTag(ACRONYM);
149 pub const ADDRESS: HtmlTag = HtmlTag(ADDRESS);
151 pub const APPLET: HtmlTag = HtmlTag(APPLET);
153 pub const AREA: HtmlTag = HtmlTag(AREA);
155 pub const ARTICLE: HtmlTag = HtmlTag(ARTICLE);
157 pub const ASIDE: HtmlTag = HtmlTag(ASIDE);
159 pub const AUDIO: HtmlTag = HtmlTag(AUDIO);
161 pub const B: HtmlTag = HtmlTag(B);
163 pub const BASE: HtmlTag = HtmlTag(BASE);
165 pub const BASEFONT: HtmlTag = HtmlTag(BASEFONT);
167 pub const BDI: HtmlTag = HtmlTag(BDI);
169 pub const BDO: HtmlTag = HtmlTag(BDO);
171 pub const BIG: HtmlTag = HtmlTag(BIG);
173 pub const BLOCKQUOTE: HtmlTag = HtmlTag(BLOCKQUOTE);
175 pub const BODY: HtmlTag = HtmlTag(BODY);
177 pub const BR: HtmlTag = HtmlTag(BR);
179 pub const BUTTON: HtmlTag = HtmlTag(BUTTON);
181 pub const CANVAS: HtmlTag = HtmlTag(CANVAS);
183 pub const CAPTION: HtmlTag = HtmlTag(CAPTION);
185 pub const CENTER: HtmlTag = HtmlTag(CENTER);
187 pub const CITE: HtmlTag = HtmlTag(CITE);
189 pub const CODE: HtmlTag = HtmlTag(CODE);
191 pub const COL: HtmlTag = HtmlTag(COL);
193 pub const COLGROUP: HtmlTag = HtmlTag(COLGROUP);
195 pub const DATALIST: HtmlTag = HtmlTag(DATALIST);
197 pub const DD: HtmlTag = HtmlTag(DD);
199 pub const DEL: HtmlTag = HtmlTag(DEL);
201 pub const DETAILS: HtmlTag = HtmlTag(DETAILS);
203 pub const DFN: HtmlTag = HtmlTag(DFN);
205 pub const DIR: HtmlTag = HtmlTag(DIR);
207 pub const DIV: HtmlTag = HtmlTag(DIV);
209 pub const DL: HtmlTag = HtmlTag(DL);
211 pub const DT: HtmlTag = HtmlTag(DT);
213 pub const EM: HtmlTag = HtmlTag(EM);
215 pub const EMBED: HtmlTag = HtmlTag(EMBED);
217 pub const FIELDSET: HtmlTag = HtmlTag(FIELDSET);
219 pub const FIGCAPTION: HtmlTag = HtmlTag(FIGCAPTION);
221 pub const FIGURE: HtmlTag = HtmlTag(FIGURE);
223 pub const FONT: HtmlTag = HtmlTag(FONT);
225 pub const FOOTER: HtmlTag = HtmlTag(FOOTER);
227 pub const FORM: HtmlTag = HtmlTag(FORM);
229 pub const FRAME: HtmlTag = HtmlTag(FRAME);
231 pub const FRAMESET: HtmlTag = HtmlTag(FRAMESET);
233 pub const H1: HtmlTag = HtmlTag(H1);
235 pub const H2: HtmlTag = HtmlTag(H2);
237 pub const H3: HtmlTag = HtmlTag(H3);
239 pub const H4: HtmlTag = HtmlTag(H4);
241 pub const H5: HtmlTag = HtmlTag(H5);
243 pub const H6: HtmlTag = HtmlTag(H6);
245 pub const HEAD: HtmlTag = HtmlTag(HEAD);
247 pub const HEADER: HtmlTag = HtmlTag(HEADER);
249 pub const HR: HtmlTag = HtmlTag(HR);
251 pub const HTML: HtmlTag = HtmlTag(HTML);
253 pub const I: HtmlTag = HtmlTag(I);
255 pub const IFRAME: HtmlTag = HtmlTag(IFRAME);
257 pub const IMG: HtmlTag = HtmlTag(IMG);
259 pub const INPUT: HtmlTag = HtmlTag(INPUT);
261 pub const INS: HtmlTag = HtmlTag(INS);
263 pub const KBD: HtmlTag = HtmlTag(KBD);
265 pub const KEYGEN: HtmlTag = HtmlTag(KEYGEN);
267 pub const LABEL: HtmlTag = HtmlTag(LABEL);
269 pub const LEGEND: HtmlTag = HtmlTag(LEGEND);
271 pub const LI: HtmlTag = HtmlTag(LI);
273 pub const LINK: HtmlTag = HtmlTag(LINK);
275 pub const MAIN: HtmlTag = HtmlTag(MAIN);
277 pub const MAP: HtmlTag = HtmlTag(MAP);
279 pub const MARK: HtmlTag = HtmlTag(MARK);
281 pub const MENU: HtmlTag = HtmlTag(MENU);
283 pub const MENUITEM: HtmlTag = HtmlTag(MENUITEM);
285 pub const META: HtmlTag = HtmlTag(META);
287 pub const METER: HtmlTag = HtmlTag(METER);
289 pub const NAV: HtmlTag = HtmlTag(NAV);
291 pub const NOFRAMES: HtmlTag = HtmlTag(NOFRAMES);
293 pub const NOSCRIPT: HtmlTag = HtmlTag(NOSCRIPT);
295 pub const OBJECT: HtmlTag = HtmlTag(OBJECT);
297 pub const OL: HtmlTag = HtmlTag(OL);
299 pub const OPTGROUP: HtmlTag = HtmlTag(OPTGROUP);
301 pub const OPTION: HtmlTag = HtmlTag(OPTION);
303 pub const OUTPUT: HtmlTag = HtmlTag(OUTPUT);
305 pub const P: HtmlTag = HtmlTag(P);
307 pub const PARAM: HtmlTag = HtmlTag(PARAM);
309 pub const PRE: HtmlTag = HtmlTag(PRE);
311 pub const PROGRESS: HtmlTag = HtmlTag(PROGRESS);
313 pub const Q: HtmlTag = HtmlTag(Q);
315 pub const S: HtmlTag = HtmlTag(S);
317 pub const SAMP: HtmlTag = HtmlTag(SAMP);
319 pub const SCRIPT: HtmlTag = HtmlTag(SCRIPT);
321 pub const SECTION: HtmlTag = HtmlTag(SECTION);
323 pub const SELECT: HtmlTag = HtmlTag(SELECT);
325 pub const SMALL: HtmlTag = HtmlTag(SMALL);
327 pub const SOURCE: HtmlTag = HtmlTag(SOURCE);
329 pub const SPAN: HtmlTag = HtmlTag(SPAN);
331 pub const STRIKE: HtmlTag = HtmlTag(STRIKE);
333 pub const STRONG: HtmlTag = HtmlTag(STRONG);
335 pub const STYLE: HtmlTag = HtmlTag(STYLE);
337 pub const SUB: HtmlTag = HtmlTag(SUB);
339 pub const SUMMARY: HtmlTag = HtmlTag(SUMMARY);
341 pub const SUP: HtmlTag = HtmlTag(SUP);
343 pub const TABLE: HtmlTag = HtmlTag(TABLE);
345 pub const TBODY: HtmlTag = HtmlTag(TBODY);
347 pub const TD: HtmlTag = HtmlTag(TD);
349 pub const TEXTAREA: HtmlTag = HtmlTag(TEXTAREA);
351 pub const TFOOT: HtmlTag = HtmlTag(TFOOT);
353 pub const TH: HtmlTag = HtmlTag(TH);
355 pub const THEAD: HtmlTag = HtmlTag(THEAD);
357 pub const TIME: HtmlTag = HtmlTag(TIME);
359 pub const TITLE: HtmlTag = HtmlTag(TITLE);
361 pub const TR: HtmlTag = HtmlTag(TR);
363 pub const TRACK: HtmlTag = HtmlTag(TRACK);
365 pub const TT: HtmlTag = HtmlTag(TT);
367 pub const U: HtmlTag = HtmlTag(U);
369 pub const UL: HtmlTag = HtmlTag(UL);
371 pub const VAR: HtmlTag = HtmlTag(VAR);
373 pub const VIDEO: HtmlTag = HtmlTag(VIDEO);
375 pub fn parse_tags(&self, input: &str) -> Vec<String> {
377 let re = Regex::new(&format!(r#"(?s)<{}[^>]*>(.*?)</{}>"#, &self, &self)).unwrap();
378
379 let mut result = Vec::new();
380
381 for capture in re.captures_iter(input) {
382 if let Some(text) = capture.get(1) {
383 result.push(text.as_str().trim().to_string());
384 }
385 }
386
387 result
388 }
389}
390
391