minify-html/src/spec/tag/whitespace.rs

168 lines
3.9 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 ROOT: &WhitespaceMinification = &WhitespaceMinification {
collapse: true,
destroy_whole: true,
trim: true,
};
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 {
match tag_name {
Some(n) => TAG_WHITESPACE_MINIFICATION.get(n).unwrap_or(&DEFAULT),
None => ROOT,
}
}