159 lines
3.7 KiB
Rust
159 lines
3.7 KiB
Rust
|
use phf::{phf_map, Map};
|
||
|
|
||
|
pub struct WhitespaceMinification {
|
||
|
pub collapse: bool,
|
||
|
pub destroy_whole: bool,
|
||
|
pub trim: bool,
|
||
|
}
|
||
|
|
||
|
static CONTENT: &WhitespaceMinification = &WhitespaceMinification {
|
||
|
collapse: true,
|
||
|
destroy_whole: false,
|
||
|
trim: true,
|
||
|
};
|
||
|
|
||
|
static CONTENT_FIRST: &WhitespaceMinification = &WhitespaceMinification {
|
||
|
collapse: true,
|
||
|
destroy_whole: false,
|
||
|
trim: true,
|
||
|
};
|
||
|
|
||
|
static FORMATTING: &WhitespaceMinification = &WhitespaceMinification {
|
||
|
collapse: true,
|
||
|
destroy_whole: false,
|
||
|
trim: false,
|
||
|
};
|
||
|
|
||
|
static LAYOUT: &WhitespaceMinification = &WhitespaceMinification {
|
||
|
collapse: true,
|
||
|
destroy_whole: true,
|
||
|
trim: true,
|
||
|
};
|
||
|
|
||
|
static WHITESPACE_SENSITIVE: &WhitespaceMinification = &WhitespaceMinification {
|
||
|
collapse: false,
|
||
|
destroy_whole: false,
|
||
|
trim: false,
|
||
|
};
|
||
|
|
||
|
static DEFAULT: &WhitespaceMinification = &WhitespaceMinification {
|
||
|
collapse: true,
|
||
|
destroy_whole: false,
|
||
|
trim: false,
|
||
|
};
|
||
|
|
||
|
static TAG_WHITESPACE_MINIFICATION: Map<&'static [u8], &'static WhitespaceMinification> = phf_map! {
|
||
|
// Content tags.
|
||
|
b"address" => CONTENT,
|
||
|
b"audio" => CONTENT,
|
||
|
b"button" => CONTENT,
|
||
|
b"canvas" => CONTENT,
|
||
|
b"caption" => CONTENT,
|
||
|
b"figcaption" => CONTENT,
|
||
|
b"h1" => CONTENT,
|
||
|
b"h2" => CONTENT,
|
||
|
b"h3" => CONTENT,
|
||
|
b"h4" => CONTENT,
|
||
|
b"h5" => CONTENT,
|
||
|
b"h6" => CONTENT,
|
||
|
b"legend" => CONTENT,
|
||
|
b"meter" => CONTENT,
|
||
|
b"object" => CONTENT,
|
||
|
b"option" => CONTENT,
|
||
|
b"p" => CONTENT,
|
||
|
b"summary" => CONTENT,
|
||
|
b"textarea" => CONTENT,
|
||
|
b"video" => CONTENT,
|
||
|
|
||
|
// Content-first tags.
|
||
|
b"dd" => CONTENT_FIRST,
|
||
|
b"details" => CONTENT_FIRST,
|
||
|
b"dt" => CONTENT_FIRST,
|
||
|
b"iframe" => CONTENT_FIRST,
|
||
|
b"label" => CONTENT_FIRST,
|
||
|
b"li" => CONTENT_FIRST,
|
||
|
b"noscript" => CONTENT_FIRST,
|
||
|
b"output" => CONTENT_FIRST,
|
||
|
b"progress" => CONTENT_FIRST,
|
||
|
b"slot" => CONTENT_FIRST,
|
||
|
b"td" => CONTENT_FIRST,
|
||
|
b"template" => CONTENT_FIRST,
|
||
|
b"th" => CONTENT_FIRST,
|
||
|
|
||
|
// Formatting tags.
|
||
|
// Sourced from https://developer.mozilla.org/en-US/docs/Web/HTML/Element#Inline_text_semantics.
|
||
|
// Differences to tags listed in table at above URL: -br, +del, +ins.
|
||
|
b"a" => FORMATTING,
|
||
|
b"abbr" => FORMATTING,
|
||
|
b"b" => FORMATTING,
|
||
|
b"bdi" => FORMATTING,
|
||
|
b"bdo" => FORMATTING,
|
||
|
b"cite" => FORMATTING,
|
||
|
b"data" => FORMATTING,
|
||
|
b"del" => FORMATTING,
|
||
|
b"dfn" => FORMATTING,
|
||
|
b"em" => FORMATTING,
|
||
|
b"i" => FORMATTING,
|
||
|
b"ins" => FORMATTING,
|
||
|
b"kbd" => FORMATTING,
|
||
|
b"mark" => FORMATTING,
|
||
|
b"q" => FORMATTING,
|
||
|
b"rp" => FORMATTING,
|
||
|
b"rt" => FORMATTING,
|
||
|
b"rtc" => FORMATTING,
|
||
|
b"ruby" => FORMATTING,
|
||
|
b"s" => FORMATTING,
|
||
|
b"samp" => FORMATTING,
|
||
|
b"small" => FORMATTING,
|
||
|
b"span" => FORMATTING,
|
||
|
b"strong" => FORMATTING,
|
||
|
b"sub" => FORMATTING,
|
||
|
b"sup" => FORMATTING,
|
||
|
b"time" => FORMATTING,
|
||
|
b"u" => FORMATTING,
|
||
|
b"var" => FORMATTING,
|
||
|
b"wbr" => FORMATTING,
|
||
|
|
||
|
// Layout tags.
|
||
|
b"article" => LAYOUT,
|
||
|
b"aside" => LAYOUT,
|
||
|
b"blockquote" => LAYOUT,
|
||
|
b"body" => LAYOUT,
|
||
|
b"colgroup" => LAYOUT,
|
||
|
b"datalist" => LAYOUT,
|
||
|
b"dialog" => LAYOUT,
|
||
|
b"div" => LAYOUT,
|
||
|
b"dl" => LAYOUT,
|
||
|
b"fieldset" => LAYOUT,
|
||
|
b"figure" => LAYOUT,
|
||
|
b"footer" => LAYOUT,
|
||
|
b"form" => LAYOUT,
|
||
|
b"head" => LAYOUT,
|
||
|
b"header" => LAYOUT,
|
||
|
b"hgroup" => LAYOUT,
|
||
|
b"html" => LAYOUT,
|
||
|
b"main" => LAYOUT,
|
||
|
b"map" => LAYOUT,
|
||
|
b"menu" => LAYOUT,
|
||
|
b"nav" => LAYOUT,
|
||
|
b"ol" => LAYOUT,
|
||
|
b"optgroup" => LAYOUT,
|
||
|
b"picture" => LAYOUT,
|
||
|
b"section" => LAYOUT,
|
||
|
b"select" => LAYOUT,
|
||
|
b"table" => LAYOUT,
|
||
|
b"tbody" => LAYOUT,
|
||
|
b"tfoot" => LAYOUT,
|
||
|
b"thead" => LAYOUT,
|
||
|
b"tr" => LAYOUT,
|
||
|
b"ul" => LAYOUT,
|
||
|
|
||
|
// Whitespace-sensitive tags.
|
||
|
b"code" => WHITESPACE_SENSITIVE,
|
||
|
b"pre" => WHITESPACE_SENSITIVE,
|
||
|
};
|
||
|
|
||
|
pub fn get_whitespace_minification_for_tag(tag_name: Option<&[u8]>) -> &'static WhitespaceMinification {
|
||
|
tag_name.and_then(|n| TAG_WHITESPACE_MINIFICATION.get(n)).unwrap_or(&DEFAULT)
|
||
|
}
|