diff options
| author | Laurenz <laurmaedje@gmail.com> | 2025-01-23 22:56:15 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2025-07-09 12:13:17 +0200 |
| commit | fce8a2b4aceb672dfc65af0adc4a364cb0b0b688 (patch) | |
| tree | c2b0d6a96ba9b9ba6ba8ed62903626eacc795e0f | |
| parent | 52a708b988cf7d13898194e886790acb7edd510f (diff) | |
Content modelshtml-content-models
Co-Authored-By: Martin Haug <3874949+reknih@users.noreply.github.com>
| -rw-r--r-- | crates/typst-library/src/html/dom.rs | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/crates/typst-library/src/html/dom.rs b/crates/typst-library/src/html/dom.rs index 47bcf995..09698c08 100644 --- a/crates/typst-library/src/html/dom.rs +++ b/crates/typst-library/src/html/dom.rs @@ -626,6 +626,297 @@ pub mod tag { | self::colgroup ) } + + /// Wether an element is considered flow content. + pub fn is_flow_content(tag: HtmlTag) -> bool { + matches!( + tag, + self::a + | self::abbr + | self::address + | self::area + | self::article + | self::aside + | self::audio + | self::b + | self::bdi + | self::bdo + | self::blockquote + | self::br + | self::button + | self::canvas + | self::cite + | self::code + | self::data + | self::datalist + | self::del + | self::details + | self::dfn + | self::dialog + | self::div + | self::dl + | self::em + | self::embed + | self::fieldset + | self::figure + | self::footer + | self::form + | self::h1 + | self::h2 + | self::h3 + | self::h4 + | self::h5 + | self::h6 + | self::header + | self::hgroup + | self::hr + | self::i + | self::iframe + | self::img + | self::input + | self::ins + | self::kbd + | self::label + | self::link + | self::main + | self::map + | self::mark + | self::menu + | self::meta + | self::meter + | self::nav + | self::noscript + | self::object + | self::ol + | self::output + | self::p + | self::picture + | self::pre + | self::progress + | self::q + | self::ruby + | self::s + | self::samp + | self::script + | self::search + | self::section + | self::select + | self::slot + | self::small + | self::span + | self::strong + | self::sub + | self::sup + | self::table + | self::template + | self::textarea + | self::time + | self::u + | self::ul + | self::var + | self::video + | self::wbr + ) + } + + /// Whether an element is considered sectioning content. + pub fn is_sectioning_content(tag: HtmlTag) -> bool { + matches!(tag, self::article | self::aside | self::nav | self::section) + } + + /// Whether an element is considered heading content. + pub fn is_heading_content(tag: HtmlTag) -> bool { + matches!( + tag, + self::h1 + | self::h2 + | self::h3 + | self::h4 + | self::h5 + | self::h6 + | self::hgroup + ) + } + + /// Whether an element is considered phrasing content. + pub fn is_phrasing_content(tag: HtmlTag) -> bool { + matches!( + tag, + self::a + | self::abbr + | self::area + | self::audio + | self::b + | self::bdi + | self::bdo + | self::br + | self::button + | self::canvas + | self::cite + | self::code + | self::data + | self::datalist + | self::del + | self::dfn + | self::em + | self::embed + | self::i + | self::iframe + | self::img + | self::input + | self::ins + | self::kbd + | self::label + | self::link + | self::map + | self::mark + | self::meta + | self::meter + | self::noscript + | self::object + | self::output + | self::picture + | self::progress + | self::q + | self::ruby + | self::s + | self::samp + | self::script + | self::select + | self::slot + | self::small + | self::span + | self::strong + | self::sub + | self::sup + | self::template + | self::textarea + | self::time + | self::u + | self::var + | self::video + | self::wbr + ) + } + + /// Whether an element is considered embedded content. + pub fn is_embedded_content(tag: HtmlTag) -> bool { + matches!( + tag, + self::audio + | self::canvas + | self::embed + | self::iframe + | self::img + | self::object + | self::picture + | self::video + ) + } + + /// Whether an element is considered interactive content. + pub fn is_interactive_content(tag: HtmlTag) -> bool { + matches!( + tag, + self::a + | self::audio + | self::button + | self::details + | self::embed + | self::iframe + | self::img + | self::input + | self::label + | self::select + | self::textarea + | self::video + ) + } + + /// Whether an element is considered palpable content. + pub fn is_palpable_content(tag: HtmlTag) -> bool { + matches!( + tag, + self::a + | self::abbr + | self::address + | self::article + | self::aside + | self::audio + | self::b + | self::bdi + | self::bdo + | self::blockquote + | self::button + | self::canvas + | self::cite + | self::code + | self::data + | self::del + | self::details + | self::dfn + | self::div + | self::dl + | self::em + | self::embed + | self::fieldset + | self::figure + | self::footer + | self::form + | self::h1 + | self::h2 + | self::h3 + | self::h4 + | self::h5 + | self::h6 + | self::header + | self::hgroup + | self::i + | self::iframe + | self::img + | self::input + | self::ins + | self::kbd + | self::label + | self::main + | self::map + | self::mark + | self::menu + | self::meter + | self::nav + | self::object + | self::ol + | self::output + | self::p + | self::picture + | self::pre + | self::progress + | self::q + | self::ruby + | self::s + | self::samp + | self::search + | self::section + | self::select + | self::small + | self::span + | self::strong + | self::sub + | self::sup + | self::table + | self::textarea + | self::time + | self::u + | self::ul + | self::var + | self::video + ) + } + + /// Whether an element is considered a script-supporting element. + pub fn is_script_supporting_content(tag: HtmlTag) -> bool { + matches!(tag, self::script | self::template) + } } #[allow(non_upper_case_globals)] |
