Start migration to Rust

This commit is contained in:
Wilson Lin 2019-12-15 19:37:53 +11:00
parent 55fd264215
commit 1fb675ef91
44 changed files with 2537 additions and 4689 deletions

8
Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "hyperbuild"
version = "0.0.1"
authors = ["Wilson Lin <code@wilsonl.in>"]
edition = "2018"
[dependencies]
phf = "0.8.0"

View File

@ -1,23 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_ascii_control_set;
void hb_rule_ascii_control_add_elems(nh_bitfield_ascii* set)
{
for (char c = 0x0; c <= 0x1F; c++) {
nh_bitfield_ascii_add(set, c);
}
}
void hb_rule_ascii_control_init(void)
{
hb_rule_ascii_control_set = nh_bitfield_ascii_create();
hb_rule_ascii_control_add_elems(hb_rule_ascii_control_set);
}
bool hb_rule_ascii_control_check(hb_rune c)
{
return nh_bitfield_ascii_has(hb_rule_ascii_control_set, c);
}

View File

@ -1,23 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_ascii_digit_set;
void hb_rule_ascii_digit_add_elems(nh_bitfield_ascii* set)
{
for (char c = '0'; c <= '9'; c++) {
nh_bitfield_ascii_add(set, c);
}
}
void hb_rule_ascii_digit_init(void)
{
hb_rule_ascii_digit_set = nh_bitfield_ascii_create();
hb_rule_ascii_digit_add_elems(hb_rule_ascii_digit_set);
}
bool hb_rule_ascii_digit_check(hb_rune c)
{
return nh_bitfield_ascii_has(hb_rule_ascii_digit_set, c);
}

View File

@ -1,29 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_ascii_hex_set;
void hb_rule_ascii_hex_add_elems(nh_bitfield_ascii* set)
{
for (char c = '0'; c <= '9'; c++) {
nh_bitfield_ascii_add(set, c);
}
for (char c = 'A'; c <= 'F'; c++) {
nh_bitfield_ascii_add(set, c);
}
for (char c = 'a'; c <= 'f'; c++) {
nh_bitfield_ascii_add(set, c);
}
}
void hb_rule_ascii_hex_init(void)
{
hb_rule_ascii_hex_set = nh_bitfield_ascii_create();
hb_rule_ascii_hex_add_elems(hb_rule_ascii_hex_set);
}
bool hb_rule_ascii_hex_check(hb_rune c)
{
return nh_bitfield_ascii_has(hb_rule_ascii_hex_set, c);
}

View File

@ -1,23 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_ascii_lowercase_set;
void hb_rule_ascii_lowercase_add_elems(nh_bitfield_ascii* set)
{
for (char c = 'a'; c <= 'z'; c++) {
nh_bitfield_ascii_add(set, c);
}
}
void hb_rule_ascii_lowercase_init(void)
{
hb_rule_ascii_lowercase_set = nh_bitfield_ascii_create();
hb_rule_ascii_lowercase_add_elems(hb_rule_ascii_lowercase_set);
}
bool hb_rule_ascii_lowercase_check(hb_rune c)
{
return nh_bitfield_ascii_has(hb_rule_ascii_lowercase_set, c);
}

View File

@ -1,23 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_ascii_uppercase_set;
void hb_rule_ascii_uppercase_add_elems(nh_bitfield_ascii* set)
{
for (char c = 'A'; c <= 'Z'; c++) {
nh_bitfield_ascii_add(set, c);
}
}
void hb_rule_ascii_uppercase_init(void)
{
hb_rule_ascii_uppercase_set = nh_bitfield_ascii_create();
hb_rule_ascii_uppercase_add_elems(hb_rule_ascii_uppercase_set);
}
bool hb_rule_ascii_uppercase_check(hb_rune c)
{
return nh_bitfield_ascii_has(hb_rule_ascii_uppercase_set, c);
}

View File

@ -1,25 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_ascii_whitespace_set;
void hb_rule_ascii_whitespace_add_elems(nh_bitfield_ascii* set)
{
nh_bitfield_ascii_add(set, '\t'); // TAB
nh_bitfield_ascii_add(set, '\n'); // LF
nh_bitfield_ascii_add(set, '\f'); // FF
nh_bitfield_ascii_add(set, '\r'); // CR
nh_bitfield_ascii_add(set, ' '); // SPACE
}
void hb_rule_ascii_whitespace_init(void)
{
hb_rule_ascii_whitespace_set = nh_bitfield_ascii_create();
hb_rule_ascii_whitespace_add_elems(hb_rule_ascii_whitespace_set);
}
bool hb_rule_ascii_whitespace_check(hb_rune c)
{
return nh_bitfield_ascii_has(hb_rule_ascii_whitespace_set, c);
}

View File

@ -1,29 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_attr_name_exceptions;
void hb_rule_attr_name_add_exceptions(nh_bitfield_ascii* set)
{
hb_rule_ascii_control_add_elems(set);
nh_bitfield_ascii_add(set, ' ');
nh_bitfield_ascii_add(set, '"');
nh_bitfield_ascii_add(set, '\'');
nh_bitfield_ascii_add(set, '>');
nh_bitfield_ascii_add(set, '/');
nh_bitfield_ascii_add(set, '=');
// NOTE: Unicode noncharacters not tested
// (https://html.spec.whatwg.org/multipage/syntax.html#syntax-attribute-name)
}
void hb_rule_attr_name_init(void)
{
hb_rule_attr_name_exceptions = nh_bitfield_ascii_create();
hb_rule_attr_name_add_exceptions(hb_rule_attr_name_exceptions);
}
bool hb_rule_attr_name_check(hb_rune c)
{
return !nh_bitfield_ascii_has(hb_rule_attr_name_exceptions, c);
}

17
src/hb/rule/attr/name.rs Normal file
View File

@ -0,0 +1,17 @@
use ::phf::{phf_set, Set};
// Does not include control characters, which are also not allowed.
static ATTR_NAME_NON_CONTROL_DISALLOWED: Set<char> = phf_set! {
' ',
'"',
'\'',
'>',
'/',
'=',
// NOTE: Unicode noncharacters not tested.
// (https://html.spec.whatwg.org/multipage/syntax.html#syntax-attribute-name)
};
fn is_valid_attr_name_char(c: char) -> bool {
not (ATTR_NAME_NON_CONTROL_DISALLOWED.has(c) || c.is_ascii_control())
}

View File

@ -1,24 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_attr_quote_set;
void hb_rule_attr_quote_add_elems(nh_bitfield_ascii* set)
{
// Backtick is not a valid quote character according to
// https://html.spec.whatwg.org/multipage/introduction.html#intro-early-example
nh_bitfield_ascii_add(set, '\'');
nh_bitfield_ascii_add(set, '"');
}
void hb_rule_attr_quote_init(void)
{
hb_rule_attr_quote_set = nh_bitfield_ascii_create();
hb_rule_attr_quote_add_elems(hb_rule_attr_quote_set);
}
bool hb_rule_attr_quote_check(hb_rune c)
{
return nh_bitfield_ascii_has(hb_rule_attr_quote_set, c);
}

View File

@ -0,0 +1,8 @@
use ::phf::{phf_set, Set};
static ATTR_QUOTE: Set<char> = phf_set! {
// Backtick is not a valid quote character according to
// https://html.spec.whatwg.org/multipage/introduction.html#intro-early-example
'\'',
'"',
};

View File

@ -1,28 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_attr_unquotedvalue_exceptions;
void hb_rule_attr_unquotedvalue_add_exceptions(nh_bitfield_ascii* set)
{
hb_rule_ascii_whitespace_add_elems(set);
nh_bitfield_ascii_add(set, '"');
nh_bitfield_ascii_add(set, '\'');
nh_bitfield_ascii_add(set, '`');
nh_bitfield_ascii_add(set, '=');
nh_bitfield_ascii_add(set, '<');
nh_bitfield_ascii_add(set, '>');
}
void hb_rule_attr_unquotedvalue_init(void)
{
hb_rule_attr_unquotedvalue_exceptions = nh_bitfield_ascii_create();
hb_rule_attr_unquotedvalue_add_exceptions(
hb_rule_attr_unquotedvalue_exceptions);
}
bool hb_rule_attr_unquotedvalue_check(hb_rune c)
{
return !nh_bitfield_ascii_has(hb_rule_attr_unquotedvalue_exceptions, c);
}

View File

@ -0,0 +1,15 @@
use ::phf::{phf_set, Set};
// Does not include whitespace, which is also disallowed.
static ATTR_VAL_UNQUOTED_NON_WHITESPACE_DISALLOWED: Set<char> = phf_set! {
'"',
'\'',
'`',
'=',
'<',
'>',
};
fn is_valid_attr_value_unquoted_char(c: char) -> bool {
not(ATTR_VAL_UNQUOTED_NON_WHITESPACE_DISALLOWED.has(c) || c.is_ascii_whitespace())
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,45 +0,0 @@
#include <hb/rule.h>
void hb_rule_init(void)
{
// Core
hb_rule_ascii_control_init();
hb_rule_ascii_digit_init();
hb_rule_ascii_hex_init();
hb_rule_ascii_uppercase_init();
hb_rule_ascii_lowercase_init();
hb_rule_ascii_whitespace_init();
// Identifiers
hb_rule_tag_name_init();
hb_rule_attr_name_init();
// Values
hb_rule_attr_quote_init();
hb_rule_attr_unquotedvalue_init();
hb_rule_entity_reference_init();
// Specification tag categories
hb_rule_tag_heading_init();
hb_rule_tag_media_init();
hb_rule_tag_sectioning_init();
hb_rule_tag_void_init();
hb_rule_tag_wss_init();
hb_rule_tag_html_init();
hb_rule_tag_svg_init();
// hyperbuild tag categories
hb_rule_tag_contentfirst_init();
hb_rule_tag_content_init();
hb_rule_tag_formatting_init();
hb_rule_tag_layout_init();
hb_rule_tag_specific_init();
// Relations
hb_rule_tag_child_blacklist_init();
hb_rule_tag_child_whitelist_init();
hb_rule_tag_parent_blacklist_init();
hb_rule_tag_parent_whitelist_init();
}

View File

@ -1,41 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_content_set;
void hb_rule_tag_content_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "address");
hb_set_tag_names_add_whole_literal(set, "audio");
hb_set_tag_names_add_whole_literal(set, "button");
hb_set_tag_names_add_whole_literal(set, "canvas");
hb_set_tag_names_add_whole_literal(set, "caption");
hb_set_tag_names_add_whole_literal(set, "figcaption");
hb_set_tag_names_add_whole_literal(set, "h1");
hb_set_tag_names_add_whole_literal(set, "h2");
hb_set_tag_names_add_whole_literal(set, "h3");
hb_set_tag_names_add_whole_literal(set, "h4");
hb_set_tag_names_add_whole_literal(set, "h5");
hb_set_tag_names_add_whole_literal(set, "h6");
hb_set_tag_names_add_whole_literal(set, "legend");
hb_set_tag_names_add_whole_literal(set, "meter");
hb_set_tag_names_add_whole_literal(set, "object");
hb_set_tag_names_add_whole_literal(set, "option");
hb_set_tag_names_add_whole_literal(set, "p");
hb_set_tag_names_add_whole_literal(
set, "summary"); // Can also contain a heading
hb_set_tag_names_add_whole_literal(set, "textarea");
hb_set_tag_names_add_whole_literal(set, "video");
}
void hb_rule_tag_content_init(void)
{
hb_rule_tag_content_set = hb_set_tag_names_create();
hb_rule_tag_content_add_elems(hb_rule_tag_content_set);
}
bool hb_rule_tag_content_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_content_set, tag);
}

View File

@ -0,0 +1,24 @@
use ::phf::{phf_set, Set};
static CONTENT_TAGS: Set<&'static str> = phf_set! {
"address",
"audio",
"button",
"canvas",
"caption",
"figcaption",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
"legend",
"meter",
"object",
"option",
"p",
"summary", // Can also contain a heading.
"textarea",
"video",
};

View File

@ -1,33 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_contentfirst_set;
void hb_rule_tag_contentfirst_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "dd");
hb_set_tag_names_add_whole_literal(set, "details");
hb_set_tag_names_add_whole_literal(set, "dt");
hb_set_tag_names_add_whole_literal(set, "iframe");
hb_set_tag_names_add_whole_literal(set, "label");
hb_set_tag_names_add_whole_literal(set, "li");
hb_set_tag_names_add_whole_literal(set, "noscript");
hb_set_tag_names_add_whole_literal(set, "output");
hb_set_tag_names_add_whole_literal(set, "progress");
hb_set_tag_names_add_whole_literal(set, "slot");
hb_set_tag_names_add_whole_literal(set, "td");
hb_set_tag_names_add_whole_literal(set, "template");
hb_set_tag_names_add_whole_literal(set, "th");
}
void hb_rule_tag_contentfirst_init(void)
{
hb_rule_tag_contentfirst_set = hb_set_tag_names_create();
hb_rule_tag_contentfirst_add_elems(hb_rule_tag_contentfirst_set);
}
bool hb_rule_tag_contentfirst_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_contentfirst_set, tag);
}

View File

@ -0,0 +1,17 @@
use ::phf::{phf_set, Set};
static CONTENT_FIRST_TAGS: Set<&'static str> = phf_set! {
"dd",
"details",
"dt",
"iframe",
"label",
"li",
"noscript",
"output",
"progress",
"slot",
"td",
"template",
"th",
};

View File

@ -1,51 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_formatting_set;
void hb_rule_tag_formatting_add_elems(hb_set_tag_names* set)
{
// Difference to MDN's inline text semantics list: -br, +del, +ins
hb_set_tag_names_add_whole_literal(set, "a");
hb_set_tag_names_add_whole_literal(set, "abbr");
hb_set_tag_names_add_whole_literal(set, "b");
hb_set_tag_names_add_whole_literal(set, "bdi");
hb_set_tag_names_add_whole_literal(set, "bdo");
hb_set_tag_names_add_whole_literal(set, "cite");
hb_set_tag_names_add_whole_literal(set, "data");
hb_set_tag_names_add_whole_literal(set, "del");
hb_set_tag_names_add_whole_literal(set, "dfn");
hb_set_tag_names_add_whole_literal(set, "em");
hb_set_tag_names_add_whole_literal(set, "i");
hb_set_tag_names_add_whole_literal(set, "ins");
hb_set_tag_names_add_whole_literal(set, "kbd");
hb_set_tag_names_add_whole_literal(set, "mark");
hb_set_tag_names_add_whole_literal(set, "q");
hb_set_tag_names_add_whole_literal(set, "rp");
hb_set_tag_names_add_whole_literal(set, "rt");
hb_set_tag_names_add_whole_literal(set, "rtc");
hb_set_tag_names_add_whole_literal(set, "ruby");
hb_set_tag_names_add_whole_literal(set, "s");
hb_set_tag_names_add_whole_literal(set, "samp");
hb_set_tag_names_add_whole_literal(set, "small");
hb_set_tag_names_add_whole_literal(set, "span");
hb_set_tag_names_add_whole_literal(set, "strong");
hb_set_tag_names_add_whole_literal(set, "sub");
hb_set_tag_names_add_whole_literal(set, "sup");
hb_set_tag_names_add_whole_literal(set, "time");
hb_set_tag_names_add_whole_literal(set, "u");
hb_set_tag_names_add_whole_literal(set, "var");
hb_set_tag_names_add_whole_literal(set, "wbr");
}
void hb_rule_tag_formatting_init(void)
{
hb_rule_tag_formatting_set = hb_set_tag_names_create();
hb_rule_tag_formatting_add_elems(hb_rule_tag_formatting_set);
}
bool hb_rule_tag_formatting_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_formatting_set, tag);
}

View File

@ -0,0 +1,35 @@
use ::phf::{phf_set, Set};
// Difference to MDN's inline text semantics list: -br, +del, +ins
static FORMATTING_TAGS: Set<&'static str> = phf_set! {
"a",
"abbr",
"b",
"bdi",
"bdo",
"cite",
"data",
"del",
"dfn",
"em",
"i",
"ins",
"kbd",
"mark",
"q",
"rp",
"rt",
"rtc",
"ruby",
"s",
"samp",
"small",
"span",
"strong",
"sub",
"sup",
"time",
"u",
"var",
"wbr",
};

View File

@ -1,27 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_heading_set;
void hb_rule_tag_heading_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "hgroup");
hb_set_tag_names_add_whole_literal(set, "h1");
hb_set_tag_names_add_whole_literal(set, "h2");
hb_set_tag_names_add_whole_literal(set, "h3");
hb_set_tag_names_add_whole_literal(set, "h4");
hb_set_tag_names_add_whole_literal(set, "h5");
hb_set_tag_names_add_whole_literal(set, "h6");
}
void hb_rule_tag_heading_init(void)
{
hb_rule_tag_heading_set = hb_set_tag_names_create();
hb_rule_tag_heading_add_elems(hb_rule_tag_heading_set);
}
bool hb_rule_tag_heading_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_heading_set, tag);
}

View File

@ -0,0 +1,11 @@
use ::phf::{phf_set, Set};
static HEADING_TAGS: Set<&'static str> = phf_set! {
"hgroup",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
};

View File

@ -1,174 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
// Sourced from https://developer.mozilla.org/en-US/docs/Web/HTML/Element at
// 2018-07-01T05:55:00Z
static hb_set_tag_names* hb_rule_tag_html_set;
void hb_rule_tag_html_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "a");
hb_set_tag_names_add_whole_literal(set, "abbr");
hb_set_tag_names_add_whole_literal(set, "acronym");
hb_set_tag_names_add_whole_literal(set, "address");
hb_set_tag_names_add_whole_literal(set, "applet");
hb_set_tag_names_add_whole_literal(set, "applet");
hb_set_tag_names_add_whole_literal(set, "area");
hb_set_tag_names_add_whole_literal(set, "article");
hb_set_tag_names_add_whole_literal(set, "aside");
hb_set_tag_names_add_whole_literal(set, "audio");
hb_set_tag_names_add_whole_literal(set, "b");
hb_set_tag_names_add_whole_literal(set, "basefont");
hb_set_tag_names_add_whole_literal(set, "bdi");
hb_set_tag_names_add_whole_literal(set, "bdo");
hb_set_tag_names_add_whole_literal(set, "bgsound");
hb_set_tag_names_add_whole_literal(set, "big");
hb_set_tag_names_add_whole_literal(set, "blink");
hb_set_tag_names_add_whole_literal(set, "blockquote");
hb_set_tag_names_add_whole_literal(set, "body");
hb_set_tag_names_add_whole_literal(set, "br");
hb_set_tag_names_add_whole_literal(set, "button");
hb_set_tag_names_add_whole_literal(set, "canvas");
hb_set_tag_names_add_whole_literal(set, "caption");
hb_set_tag_names_add_whole_literal(set, "center");
hb_set_tag_names_add_whole_literal(set, "cite");
hb_set_tag_names_add_whole_literal(set, "code");
hb_set_tag_names_add_whole_literal(set, "col");
hb_set_tag_names_add_whole_literal(set, "colgroup");
hb_set_tag_names_add_whole_literal(set, "command");
hb_set_tag_names_add_whole_literal(set, "content");
hb_set_tag_names_add_whole_literal(set, "content");
hb_set_tag_names_add_whole_literal(set, "data");
hb_set_tag_names_add_whole_literal(set, "datalist");
hb_set_tag_names_add_whole_literal(set, "dd");
hb_set_tag_names_add_whole_literal(set, "del");
hb_set_tag_names_add_whole_literal(set, "details");
hb_set_tag_names_add_whole_literal(set, "dfn");
hb_set_tag_names_add_whole_literal(set, "dialog");
hb_set_tag_names_add_whole_literal(set, "dir");
hb_set_tag_names_add_whole_literal(set, "dir");
hb_set_tag_names_add_whole_literal(set, "div");
hb_set_tag_names_add_whole_literal(set, "dl");
hb_set_tag_names_add_whole_literal(set, "dt");
hb_set_tag_names_add_whole_literal(set, "element");
hb_set_tag_names_add_whole_literal(set, "element");
hb_set_tag_names_add_whole_literal(set, "em");
hb_set_tag_names_add_whole_literal(set, "embed");
hb_set_tag_names_add_whole_literal(set, "fieldset");
hb_set_tag_names_add_whole_literal(set, "figcaption");
hb_set_tag_names_add_whole_literal(set, "figure");
hb_set_tag_names_add_whole_literal(set, "font");
hb_set_tag_names_add_whole_literal(set, "footer");
hb_set_tag_names_add_whole_literal(set, "form");
hb_set_tag_names_add_whole_literal(set, "frame");
hb_set_tag_names_add_whole_literal(set, "frameset");
hb_set_tag_names_add_whole_literal(set, "h1");
hb_set_tag_names_add_whole_literal(set, "h2");
hb_set_tag_names_add_whole_literal(set, "h3");
hb_set_tag_names_add_whole_literal(set, "h4");
hb_set_tag_names_add_whole_literal(set, "h5");
hb_set_tag_names_add_whole_literal(set, "h6");
hb_set_tag_names_add_whole_literal(set, "head");
hb_set_tag_names_add_whole_literal(set, "header");
hb_set_tag_names_add_whole_literal(set, "hgroup");
hb_set_tag_names_add_whole_literal(set, "hr");
hb_set_tag_names_add_whole_literal(set, "html");
hb_set_tag_names_add_whole_literal(set, "i");
hb_set_tag_names_add_whole_literal(set, "iframe");
hb_set_tag_names_add_whole_literal(set, "image");
hb_set_tag_names_add_whole_literal(set, "img");
hb_set_tag_names_add_whole_literal(set, "input");
hb_set_tag_names_add_whole_literal(set, "ins");
hb_set_tag_names_add_whole_literal(set, "isindex");
hb_set_tag_names_add_whole_literal(set, "kbd");
hb_set_tag_names_add_whole_literal(set, "keygen");
hb_set_tag_names_add_whole_literal(set, "label");
hb_set_tag_names_add_whole_literal(set, "legend");
hb_set_tag_names_add_whole_literal(set, "li");
hb_set_tag_names_add_whole_literal(set, "link");
hb_set_tag_names_add_whole_literal(set, "listing");
hb_set_tag_names_add_whole_literal(set, "main");
hb_set_tag_names_add_whole_literal(set, "map");
hb_set_tag_names_add_whole_literal(set, "mark");
hb_set_tag_names_add_whole_literal(set, "marquee");
hb_set_tag_names_add_whole_literal(set, "menu");
hb_set_tag_names_add_whole_literal(set, "menuitem");
hb_set_tag_names_add_whole_literal(set, "menuitem");
hb_set_tag_names_add_whole_literal(set, "meta");
hb_set_tag_names_add_whole_literal(set, "meter");
hb_set_tag_names_add_whole_literal(set, "multicol");
hb_set_tag_names_add_whole_literal(set, "nav");
hb_set_tag_names_add_whole_literal(set, "nextid");
hb_set_tag_names_add_whole_literal(set, "nobr");
hb_set_tag_names_add_whole_literal(set, "noembed");
hb_set_tag_names_add_whole_literal(set, "noembed");
hb_set_tag_names_add_whole_literal(set, "noframes");
hb_set_tag_names_add_whole_literal(set, "noscript");
hb_set_tag_names_add_whole_literal(set, "object");
hb_set_tag_names_add_whole_literal(set, "ol");
hb_set_tag_names_add_whole_literal(set, "optgroup");
hb_set_tag_names_add_whole_literal(set, "option");
hb_set_tag_names_add_whole_literal(set, "output");
hb_set_tag_names_add_whole_literal(set, "p");
hb_set_tag_names_add_whole_literal(set, "param");
hb_set_tag_names_add_whole_literal(set, "picture");
hb_set_tag_names_add_whole_literal(set, "plaintext");
hb_set_tag_names_add_whole_literal(set, "pre");
hb_set_tag_names_add_whole_literal(set, "progress");
hb_set_tag_names_add_whole_literal(set, "q");
hb_set_tag_names_add_whole_literal(set, "rp");
hb_set_tag_names_add_whole_literal(set, "rt");
hb_set_tag_names_add_whole_literal(set, "rtc");
hb_set_tag_names_add_whole_literal(set, "ruby");
hb_set_tag_names_add_whole_literal(set, "s");
hb_set_tag_names_add_whole_literal(set, "samp");
hb_set_tag_names_add_whole_literal(set, "script");
hb_set_tag_names_add_whole_literal(set, "section");
hb_set_tag_names_add_whole_literal(set, "select");
hb_set_tag_names_add_whole_literal(set, "shadow");
hb_set_tag_names_add_whole_literal(set, "shadow");
hb_set_tag_names_add_whole_literal(set, "slot");
hb_set_tag_names_add_whole_literal(set, "small");
hb_set_tag_names_add_whole_literal(set, "source");
hb_set_tag_names_add_whole_literal(set, "spacer");
hb_set_tag_names_add_whole_literal(set, "span");
hb_set_tag_names_add_whole_literal(set, "strike");
hb_set_tag_names_add_whole_literal(set, "strong");
hb_set_tag_names_add_whole_literal(set, "style");
hb_set_tag_names_add_whole_literal(set, "sub");
hb_set_tag_names_add_whole_literal(set, "summary");
hb_set_tag_names_add_whole_literal(set, "sup");
hb_set_tag_names_add_whole_literal(set, "table");
hb_set_tag_names_add_whole_literal(set, "tbody");
hb_set_tag_names_add_whole_literal(set, "td");
hb_set_tag_names_add_whole_literal(set, "template");
hb_set_tag_names_add_whole_literal(set, "textarea");
hb_set_tag_names_add_whole_literal(set, "tfoot");
hb_set_tag_names_add_whole_literal(set, "th");
hb_set_tag_names_add_whole_literal(set, "thead");
hb_set_tag_names_add_whole_literal(set, "time");
hb_set_tag_names_add_whole_literal(set, "title");
hb_set_tag_names_add_whole_literal(set, "tr");
hb_set_tag_names_add_whole_literal(set, "track");
hb_set_tag_names_add_whole_literal(set, "tt");
hb_set_tag_names_add_whole_literal(set, "tt");
hb_set_tag_names_add_whole_literal(set, "u");
hb_set_tag_names_add_whole_literal(set, "ul");
hb_set_tag_names_add_whole_literal(set, "var");
hb_set_tag_names_add_whole_literal(set, "video");
hb_set_tag_names_add_whole_literal(set, "wbr");
hb_set_tag_names_add_whole_literal(set, "xmp");
}
void hb_rule_tag_html_init(void)
{
hb_rule_tag_html_set = hb_set_tag_names_create();
hb_rule_tag_html_add_elems(hb_rule_tag_html_set);
}
bool hb_rule_tag_html_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_html_set, tag);
}

156
src/hb/rule/tag/html.rs Normal file
View File

@ -0,0 +1,156 @@
use ::phf::{phf_set, Set};
// Sourced from https://developer.mozilla.org/en-US/docs/Web/HTML/Element at 2018-07-01T05:55:00Z.
static HTML_TAGS: Set<&'static str> = phf_set! {
"a",
"abbr",
"acronym",
"address",
"applet",
"applet",
"area",
"article",
"aside",
"audio",
"b",
"basefont",
"bdi",
"bdo",
"bgsound",
"big",
"blink",
"blockquote",
"body",
"br",
"button",
"canvas",
"caption",
"center",
"cite",
"code",
"col",
"colgroup",
"command",
"content",
"content",
"data",
"datalist",
"dd",
"del",
"details",
"dfn",
"dialog",
"dir",
"dir",
"div",
"dl",
"dt",
"element",
"element",
"em",
"embed",
"fieldset",
"figcaption",
"figure",
"font",
"footer",
"form",
"frame",
"frameset",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
"head",
"header",
"hgroup",
"hr",
"html",
"i",
"iframe",
"image",
"img",
"input",
"ins",
"isindex",
"kbd",
"keygen",
"label",
"legend",
"li",
"link",
"listing",
"main",
"map",
"mark",
"marquee",
"menu",
"menuitem",
"menuitem",
"meta",
"meter",
"multicol",
"nav",
"nextid",
"nobr",
"noembed",
"noembed",
"noframes",
"noscript",
"object",
"ol",
"optgroup",
"option",
"output",
"p",
"param",
"picture",
"plaintext",
"pre",
"progress",
"q",
"rp",
"rt",
"rtc",
"ruby",
"s",
"samp",
"script",
"section",
"select",
"shadow",
"shadow",
"slot",
"small",
"source",
"spacer",
"span",
"strike",
"strong",
"style",
"sub",
"summary",
"sup",
"table",
"tbody",
"td",
"template",
"textarea",
"tfoot",
"th",
"thead",
"time",
"title",
"tr",
"track",
"tt",
"tt",
"u",
"ul",
"var",
"video",
"wbr",
"xmp",
};

View File

@ -1,51 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_layout_set;
void hb_rule_tag_layout_add_elems(hb_set_tag_names* set)
{
hb_rule_tag_sectioning_add_elems(set);
hb_set_tag_names_add_whole_literal(set, "blockquote");
hb_set_tag_names_add_whole_literal(set, "body");
hb_set_tag_names_add_whole_literal(set, "colgroup");
hb_set_tag_names_add_whole_literal(set, "datalist");
hb_set_tag_names_add_whole_literal(set, "dialog");
hb_set_tag_names_add_whole_literal(set, "div");
hb_set_tag_names_add_whole_literal(set, "dl");
hb_set_tag_names_add_whole_literal(set, "fieldset");
hb_set_tag_names_add_whole_literal(set, "figure");
hb_set_tag_names_add_whole_literal(set, "footer");
hb_set_tag_names_add_whole_literal(set, "form");
hb_set_tag_names_add_whole_literal(set, "head");
hb_set_tag_names_add_whole_literal(set, "header");
hb_set_tag_names_add_whole_literal(set, "hgroup");
hb_set_tag_names_add_whole_literal(set, "html");
hb_set_tag_names_add_whole_literal(set, "main");
hb_set_tag_names_add_whole_literal(set, "map");
hb_set_tag_names_add_whole_literal(set, "menu");
hb_set_tag_names_add_whole_literal(set, "nav");
hb_set_tag_names_add_whole_literal(set, "ol");
hb_set_tag_names_add_whole_literal(set, "optgroup");
hb_set_tag_names_add_whole_literal(set, "picture");
hb_set_tag_names_add_whole_literal(set, "section");
hb_set_tag_names_add_whole_literal(set, "select");
hb_set_tag_names_add_whole_literal(set, "table");
hb_set_tag_names_add_whole_literal(set, "tbody");
hb_set_tag_names_add_whole_literal(set, "tfoot");
hb_set_tag_names_add_whole_literal(set, "thead");
hb_set_tag_names_add_whole_literal(set, "tr");
hb_set_tag_names_add_whole_literal(set, "ul");
}
void hb_rule_tag_layout_init(void)
{
hb_rule_tag_layout_set = hb_set_tag_names_create();
hb_rule_tag_layout_add_elems(hb_rule_tag_layout_set);
}
bool hb_rule_tag_layout_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_layout_set, tag);
}

40
src/hb/rule/tag/layout.rs Normal file
View File

@ -0,0 +1,40 @@
use ::phf::{phf_set, Set};
static LAYOUT_TAGS: Set<&'static str> = phf_set! {
// Sectioning tags.
"article",
"aside",
"nav",
"section",
// Other tags.
"blockquote",
"body",
"colgroup",
"datalist",
"dialog",
"div",
"dl",
"fieldset",
"figure",
"footer",
"form",
"head",
"header",
"hgroup",
"html",
"main",
"map",
"menu",
"nav",
"ol",
"optgroup",
"picture",
"section",
"select",
"table",
"tbody",
"tfoot",
"thead",
"tr",
"ul",
};

View File

@ -1,22 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_media_set;
void hb_rule_tag_media_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "audio");
hb_set_tag_names_add_whole_literal(set, "video");
}
void hb_rule_tag_media_init(void)
{
hb_rule_tag_media_set = hb_set_tag_names_create();
hb_rule_tag_media_add_elems(hb_rule_tag_media_set);
}
bool hb_rule_tag_media_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_media_set, tag);
}

6
src/hb/rule/tag/media.rs Normal file
View File

@ -0,0 +1,6 @@
use ::phf::{phf_set, Set};
static MEDIA_TAGS: Set<&'static str> = phf_set! {
"audio",
"video",
};

View File

@ -1,25 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static nh_bitfield_ascii* hb_rule_tag_name_set;
void hb_rule_tag_name_add_elems(nh_bitfield_ascii* set)
{
hb_rule_ascii_lowercase_add_elems(set);
hb_rule_ascii_uppercase_add_elems(set);
hb_rule_ascii_digit_add_elems(set);
nh_bitfield_ascii_add(set, ':');
nh_bitfield_ascii_add(set, '-');
}
void hb_rule_tag_name_init(void)
{
hb_rule_tag_name_set = nh_bitfield_ascii_create();
hb_rule_tag_name_add_elems(hb_rule_tag_name_set);
}
bool hb_rule_tag_name_check(hb_rune c)
{
return nh_bitfield_ascii_has(hb_rule_tag_name_set, c);
}

3
src/hb/rule/tag/name.rs Normal file
View File

@ -0,0 +1,3 @@
fn is_valid_tag_name_char(c: char) -> bool {
c.is_ascii_alphabetic() || c.is_ascii_digit() || c == ':' || c == '-'
}

View File

@ -1,24 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_sectioning_set;
void hb_rule_tag_sectioning_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "article");
hb_set_tag_names_add_whole_literal(set, "aside");
hb_set_tag_names_add_whole_literal(set, "nav");
hb_set_tag_names_add_whole_literal(set, "section");
}
void hb_rule_tag_sectioning_init(void)
{
hb_rule_tag_sectioning_set = hb_set_tag_names_create();
hb_rule_tag_sectioning_add_elems(hb_rule_tag_sectioning_set);
}
bool hb_rule_tag_sectioning_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_sectioning_set, tag);
}

View File

@ -0,0 +1,9 @@
use ::phf::{phf_set, Set};
static SECTIONING_TAGS: Set<&'static str> = phf_set! {
// Also used by layout tags.
"article",
"aside",
"nav",
"section",
};

View File

@ -1,37 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_specific_set;
void hb_rule_tag_specific_add_elems(hb_set_tag_names* set)
{
hb_rule_tag_svg_add_elems(set);
hb_set_tag_names_add_whole_literal(set, "area");
hb_set_tag_names_add_whole_literal(set, "base");
hb_set_tag_names_add_whole_literal(set, "br");
hb_set_tag_names_add_whole_literal(
set, "code"); // Reason: unlikely to want to minify
hb_set_tag_names_add_whole_literal(set, "col");
hb_set_tag_names_add_whole_literal(set, "embed");
hb_set_tag_names_add_whole_literal(set, "hr");
hb_set_tag_names_add_whole_literal(set, "img");
hb_set_tag_names_add_whole_literal(set, "input");
hb_set_tag_names_add_whole_literal(set, "param");
hb_set_tag_names_add_whole_literal(
set, "pre"); // Reason: unlikely to want to minify
hb_set_tag_names_add_whole_literal(set, "script");
hb_set_tag_names_add_whole_literal(set, "source");
hb_set_tag_names_add_whole_literal(set, "track");
}
void hb_rule_tag_specific_init(void)
{
hb_rule_tag_specific_set = hb_set_tag_names_create();
hb_rule_tag_specific_add_elems(hb_rule_tag_specific_set);
}
bool hb_rule_tag_specific_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_specific_set, tag);
}

View File

@ -0,0 +1,19 @@
use ::phf::{phf_set, Set};
// Does not include SVG tags.
static SPECIFIC_HTML_TAGS: Set<&'static str> = phf_set! {
"area",
"base",
"br",
"code", // Reason: unlikely to want to minify.
"col",
"embed",
"hr",
"img",
"input",
"param",
"pre", // Reason: unlikely to want to minify.
"script",
"source",
"track",
}

View File

@ -1,113 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
// Sourced from https://developer.mozilla.org/en-US/docs/Web/SVG/Element at
// 2018-08-04T03:50:00Z
static hb_set_tag_names* hb_rule_tag_svg_set;
void hb_rule_tag_svg_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "a");
hb_set_tag_names_add_whole_literal(set, "altGlyph");
hb_set_tag_names_add_whole_literal(set, "altGlyphDef");
hb_set_tag_names_add_whole_literal(set, "altGlyphItem");
hb_set_tag_names_add_whole_literal(set, "animate");
hb_set_tag_names_add_whole_literal(set, "animateColor");
hb_set_tag_names_add_whole_literal(set, "animateMotion");
hb_set_tag_names_add_whole_literal(set, "animateTransform");
hb_set_tag_names_add_whole_literal(set, "circle");
hb_set_tag_names_add_whole_literal(set, "clipPath");
hb_set_tag_names_add_whole_literal(set, "color-profile");
hb_set_tag_names_add_whole_literal(set, "cursor");
hb_set_tag_names_add_whole_literal(set, "defs");
hb_set_tag_names_add_whole_literal(set, "desc");
hb_set_tag_names_add_whole_literal(set, "discard");
hb_set_tag_names_add_whole_literal(set, "ellipse");
hb_set_tag_names_add_whole_literal(set, "feBlend");
hb_set_tag_names_add_whole_literal(set, "feColorMatrix");
hb_set_tag_names_add_whole_literal(set, "feComponentTransfer");
hb_set_tag_names_add_whole_literal(set, "feComposite");
hb_set_tag_names_add_whole_literal(set, "feConvolveMatrix");
hb_set_tag_names_add_whole_literal(set, "feDiffuseLighting");
hb_set_tag_names_add_whole_literal(set, "feDisplacementMap");
hb_set_tag_names_add_whole_literal(set, "feDistantLight");
hb_set_tag_names_add_whole_literal(set, "feDropShadow");
hb_set_tag_names_add_whole_literal(set, "feFlood");
hb_set_tag_names_add_whole_literal(set, "feFuncA");
hb_set_tag_names_add_whole_literal(set, "feFuncB");
hb_set_tag_names_add_whole_literal(set, "feFuncG");
hb_set_tag_names_add_whole_literal(set, "feFuncR");
hb_set_tag_names_add_whole_literal(set, "feGaussianBlur");
hb_set_tag_names_add_whole_literal(set, "feImage");
hb_set_tag_names_add_whole_literal(set, "feMerge");
hb_set_tag_names_add_whole_literal(set, "feMergeNode");
hb_set_tag_names_add_whole_literal(set, "feMorphology");
hb_set_tag_names_add_whole_literal(set, "feOffset");
hb_set_tag_names_add_whole_literal(set, "fePointLight");
hb_set_tag_names_add_whole_literal(set, "feSpecularLighting");
hb_set_tag_names_add_whole_literal(set, "feSpotLight");
hb_set_tag_names_add_whole_literal(set, "feTile");
hb_set_tag_names_add_whole_literal(set, "feTurbulence");
hb_set_tag_names_add_whole_literal(set, "filter");
hb_set_tag_names_add_whole_literal(set, "font-face-format");
hb_set_tag_names_add_whole_literal(set, "font-face-name");
hb_set_tag_names_add_whole_literal(set, "font-face-src");
hb_set_tag_names_add_whole_literal(set, "font-face-uri");
hb_set_tag_names_add_whole_literal(set, "font-face");
hb_set_tag_names_add_whole_literal(set, "font");
hb_set_tag_names_add_whole_literal(set, "foreignObject");
hb_set_tag_names_add_whole_literal(set, "g");
hb_set_tag_names_add_whole_literal(set, "glyph");
hb_set_tag_names_add_whole_literal(set, "glyphRef");
hb_set_tag_names_add_whole_literal(set, "hatch");
hb_set_tag_names_add_whole_literal(set, "hatchpath");
hb_set_tag_names_add_whole_literal(set, "hkern");
hb_set_tag_names_add_whole_literal(set, "image");
hb_set_tag_names_add_whole_literal(set, "line");
hb_set_tag_names_add_whole_literal(set, "linearGradient");
hb_set_tag_names_add_whole_literal(set, "marker");
hb_set_tag_names_add_whole_literal(set, "mask");
hb_set_tag_names_add_whole_literal(set, "mesh");
hb_set_tag_names_add_whole_literal(set, "meshgradient");
hb_set_tag_names_add_whole_literal(set, "meshpatch");
hb_set_tag_names_add_whole_literal(set, "meshrow");
hb_set_tag_names_add_whole_literal(set, "metadata");
hb_set_tag_names_add_whole_literal(set, "missing-glyph");
hb_set_tag_names_add_whole_literal(set, "mpath");
hb_set_tag_names_add_whole_literal(set, "path");
hb_set_tag_names_add_whole_literal(set, "pattern");
hb_set_tag_names_add_whole_literal(set, "polygon");
hb_set_tag_names_add_whole_literal(set, "polyline");
hb_set_tag_names_add_whole_literal(set, "radialGradient");
hb_set_tag_names_add_whole_literal(set, "rect");
hb_set_tag_names_add_whole_literal(set, "script");
hb_set_tag_names_add_whole_literal(set, "set");
hb_set_tag_names_add_whole_literal(set, "solidcolor");
hb_set_tag_names_add_whole_literal(set, "stop");
hb_set_tag_names_add_whole_literal(set, "style");
hb_set_tag_names_add_whole_literal(set, "svg");
hb_set_tag_names_add_whole_literal(set, "switch");
hb_set_tag_names_add_whole_literal(set, "symbol");
hb_set_tag_names_add_whole_literal(set, "text");
hb_set_tag_names_add_whole_literal(set, "textPath");
hb_set_tag_names_add_whole_literal(set, "title");
hb_set_tag_names_add_whole_literal(set, "tref");
hb_set_tag_names_add_whole_literal(set, "tspan");
hb_set_tag_names_add_whole_literal(set, "unknown");
hb_set_tag_names_add_whole_literal(set, "use");
hb_set_tag_names_add_whole_literal(set, "view");
hb_set_tag_names_add_whole_literal(set, "vkern");
}
void hb_rule_tag_svg_init(void)
{
hb_rule_tag_svg_set = hb_set_tag_names_create();
hb_rule_tag_svg_add_elems(hb_rule_tag_svg_set);
}
bool hb_rule_tag_svg_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_svg_set, tag);
}

95
src/hb/rule/tag/svg.rs Normal file
View File

@ -0,0 +1,95 @@
use ::phf::{phf_set, Set};
// Sourced from https://developer.mozilla.org/en-US/docs/Web/SVG/Element at 2018-08-04T03:50:00Z.
static SVG_TAGS: Set<&'static str> = phf_set! {
"a",
"altGlyph",
"altGlyphDef",
"altGlyphItem",
"animate",
"animateColor",
"animateMotion",
"animateTransform",
"circle",
"clipPath",
"color-profile",
"cursor",
"defs",
"desc",
"discard",
"ellipse",
"feBlend",
"feColorMatrix",
"feComponentTransfer",
"feComposite",
"feConvolveMatrix",
"feDiffuseLighting",
"feDisplacementMap",
"feDistantLight",
"feDropShadow",
"feFlood",
"feFuncA",
"feFuncB",
"feFuncG",
"feFuncR",
"feGaussianBlur",
"feImage",
"feMerge",
"feMergeNode",
"feMorphology",
"feOffset",
"fePointLight",
"feSpecularLighting",
"feSpotLight",
"feTile",
"feTurbulence",
"filter",
"font-face-format",
"font-face-name",
"font-face-src",
"font-face-uri",
"font-face",
"font",
"foreignObject",
"g",
"glyph",
"glyphRef",
"hatch",
"hatchpath",
"hkern",
"image",
"line",
"linearGradient",
"marker",
"mask",
"mesh",
"meshgradient",
"meshpatch",
"meshrow",
"metadata",
"missing-glyph",
"mpath",
"path",
"pattern",
"polygon",
"polyline",
"radialGradient",
"rect",
"script",
"set",
"solidcolor",
"stop",
"style",
"svg",
"switch",
"symbol",
"text",
"textPath",
"title",
"tref",
"tspan",
"unknown",
"use",
"view",
"vkern",
};

View File

@ -1,7 +0,0 @@
#include <hb/rule.h>
#include <hb/rune.h>
bool hb_rule_tag_valid_check(nh_view_str* tag)
{
return hb_rule_tag_html_check(tag) || hb_rule_tag_svg_check(tag);
}

3
src/hb/rule/tag/valid.rs Normal file
View File

@ -0,0 +1,3 @@
fn is_valid_tag(tag: &str) -> bool {
hb_rule_tag_html_check(tag) || hb_rule_tag_svg_check(tag)
}

View File

@ -1,35 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
static hb_set_tag_names* hb_rule_tag_void_set;
void hb_rule_tag_void_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "area");
hb_set_tag_names_add_whole_literal(set, "base");
hb_set_tag_names_add_whole_literal(set, "br");
hb_set_tag_names_add_whole_literal(set, "col");
hb_set_tag_names_add_whole_literal(set, "embed");
hb_set_tag_names_add_whole_literal(set, "hr");
hb_set_tag_names_add_whole_literal(set, "img");
hb_set_tag_names_add_whole_literal(set, "input");
hb_set_tag_names_add_whole_literal(set, "keygen");
hb_set_tag_names_add_whole_literal(set, "link");
hb_set_tag_names_add_whole_literal(set, "meta");
hb_set_tag_names_add_whole_literal(set, "param");
hb_set_tag_names_add_whole_literal(set, "source");
hb_set_tag_names_add_whole_literal(set, "track");
hb_set_tag_names_add_whole_literal(set, "wbr");
}
void hb_rule_tag_void_init(void)
{
hb_rule_tag_void_set = hb_set_tag_names_create();
hb_rule_tag_void_add_elems(hb_rule_tag_void_set);
}
bool hb_rule_tag_void_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_void_set, tag);
}

19
src/hb/rule/tag/void.rs Normal file
View File

@ -0,0 +1,19 @@
use ::phf::{phf_set, Set};
static VOID_TAGS: Set<&'static str> = phf_set! {
"area",
"base",
"br",
"col",
"embed",
"hr",
"img",
"input",
"keygen",
"link",
"meta",
"param",
"source",
"track",
"wbr",
};

View File

@ -1,24 +0,0 @@
#include <hb/collection.h>
#include <hb/rule.h>
#include <hb/rune.h>
// "wss" stands for whitespace-sensitive.
static hb_set_tag_names* hb_rule_tag_wss_set;
void hb_rule_tag_wss_add_elems(hb_set_tag_names* set)
{
hb_set_tag_names_add_whole_literal(set, "code");
hb_set_tag_names_add_whole_literal(set, "pre");
}
void hb_rule_tag_wss_init(void)
{
hb_rule_tag_wss_set = hb_set_tag_names_create();
hb_rule_tag_wss_add_elems(hb_rule_tag_wss_set);
}
bool hb_rule_tag_wss_check(nh_view_str* tag)
{
return hb_set_tag_names_has(hb_rule_tag_wss_set, tag);
}

7
src/hb/rule/tag/wss.rs Normal file
View File

@ -0,0 +1,7 @@
// "WSS" stands for whitespace-sensitive.
use ::phf::{phf_set, Set};
static WSS_TAGS: Set<&'static str> = phf_set! {
"code",
"pre",
};