Formatting
This commit is contained in:
parent
3b6c22088e
commit
19abe390d4
|
@ -43,7 +43,7 @@ const averageChartOptions = (label) => ({
|
||||||
type: "linear",
|
type: "linear",
|
||||||
scaleLabel: {
|
scaleLabel: {
|
||||||
display: true,
|
display: true,
|
||||||
fontColor: '#222',
|
fontColor: "#222",
|
||||||
fontSize: 24,
|
fontSize: 24,
|
||||||
fontStyle: "bold",
|
fontStyle: "bold",
|
||||||
labelString: label,
|
labelString: label,
|
||||||
|
@ -145,7 +145,12 @@ const renderChart = (cfg, width, height) =>
|
||||||
await fs.mkdir(GRAPHS_DIR, { recursive: true });
|
await fs.mkdir(GRAPHS_DIR, { recursive: true });
|
||||||
|
|
||||||
const res = results.calculate();
|
const res = results.calculate();
|
||||||
const speedMinifiers = ["html-minifier", "minimize", "minify-html", "minify-html-onepass"];
|
const speedMinifiers = [
|
||||||
|
"html-minifier",
|
||||||
|
"minimize",
|
||||||
|
"minify-html",
|
||||||
|
"minify-html-onepass",
|
||||||
|
];
|
||||||
const sizeMinifiers = ["minimize", "html-minifier", "minify-html"];
|
const sizeMinifiers = ["minimize", "html-minifier", "minify-html"];
|
||||||
const inputs = Object.keys(res.inputSizes).sort();
|
const inputs = Object.keys(res.inputSizes).sort();
|
||||||
|
|
||||||
|
@ -208,11 +213,14 @@ const renderChart = (cfg, width, height) =>
|
||||||
label: minifier,
|
label: minifier,
|
||||||
data: inputs.map(
|
data: inputs.map(
|
||||||
(input) =>
|
(input) =>
|
||||||
res.perInputOps[minifier][input] / res.perInputOps['minify-html'][input]
|
res.perInputOps[minifier][input] /
|
||||||
|
res.perInputOps["minify-html"][input]
|
||||||
),
|
),
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
...breakdownChartOptions("Operations per second, relative to minify-html"),
|
...breakdownChartOptions(
|
||||||
|
"Operations per second, relative to minify-html"
|
||||||
|
),
|
||||||
},
|
},
|
||||||
900,
|
900,
|
||||||
1600
|
1600
|
||||||
|
@ -228,7 +236,11 @@ const renderChart = (cfg, width, height) =>
|
||||||
labels: inputs,
|
labels: inputs,
|
||||||
datasets: sizeMinifiers.map((minifier) => ({
|
datasets: sizeMinifiers.map((minifier) => ({
|
||||||
label: minifier,
|
label: minifier,
|
||||||
data: inputs.map((input) => res.perInputReduction[minifier][input] / res.perInputReduction['minify-html'][input]),
|
data: inputs.map(
|
||||||
|
(input) =>
|
||||||
|
res.perInputReduction[minifier][input] /
|
||||||
|
res.perInputReduction["minify-html"][input]
|
||||||
|
),
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
...breakdownChartOptions("Size reduction, relative to minify-html"),
|
...breakdownChartOptions("Size reduction, relative to minify-html"),
|
||||||
|
|
|
@ -1,13 +1,19 @@
|
||||||
use std::{env, fs};
|
|
||||||
use std::io::stdout;
|
use std::io::stdout;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
use std::{env, fs};
|
||||||
|
|
||||||
use minify_html_onepass::{Cfg, in_place};
|
use minify_html_onepass::{in_place, Cfg};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let iterations = env::var("MHB_ITERATIONS").unwrap().parse::<usize>().unwrap();
|
let iterations = env::var("MHB_ITERATIONS")
|
||||||
|
.unwrap()
|
||||||
|
.parse::<usize>()
|
||||||
|
.unwrap();
|
||||||
let input_dir = env::var("MHB_INPUT_DIR").unwrap();
|
let input_dir = env::var("MHB_INPUT_DIR").unwrap();
|
||||||
let html_only = env::var("MHB_HTML_ONLY").ok().filter(|v| v == "1").is_some();
|
let html_only = env::var("MHB_HTML_ONLY")
|
||||||
|
.ok()
|
||||||
|
.filter(|v| v == "1")
|
||||||
|
.is_some();
|
||||||
|
|
||||||
let tests = fs::read_dir(input_dir).unwrap().map(|d| d.unwrap());
|
let tests = fs::read_dir(input_dir).unwrap().map(|d| d.unwrap());
|
||||||
|
|
||||||
|
@ -24,10 +30,15 @@ fn main() {
|
||||||
for _ in 0..iterations {
|
for _ in 0..iterations {
|
||||||
let mut data = source.to_vec();
|
let mut data = source.to_vec();
|
||||||
len = in_place(&mut data, &cfg).expect("failed to minify");
|
len = in_place(&mut data, &cfg).expect("failed to minify");
|
||||||
};
|
}
|
||||||
let elapsed = start.elapsed().as_secs_f64();
|
let elapsed = start.elapsed().as_secs_f64();
|
||||||
results.push((t.file_name().into_string().unwrap(), len, iterations, elapsed));
|
results.push((
|
||||||
};
|
t.file_name().into_string().unwrap(),
|
||||||
|
len,
|
||||||
|
iterations,
|
||||||
|
elapsed,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
serde_json::to_writer(stdout(), &results).unwrap();
|
serde_json::to_writer(stdout(), &results).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,19 @@
|
||||||
use std::{env, fs};
|
|
||||||
use std::io::stdout;
|
use std::io::stdout;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
use std::{env, fs};
|
||||||
|
|
||||||
use minify_html::{Cfg, minify};
|
use minify_html::{minify, Cfg};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let iterations = env::var("MHB_ITERATIONS").unwrap().parse::<usize>().unwrap();
|
let iterations = env::var("MHB_ITERATIONS")
|
||||||
|
.unwrap()
|
||||||
|
.parse::<usize>()
|
||||||
|
.unwrap();
|
||||||
let input_dir = env::var("MHB_INPUT_DIR").unwrap();
|
let input_dir = env::var("MHB_INPUT_DIR").unwrap();
|
||||||
let html_only = env::var("MHB_HTML_ONLY").ok().filter(|v| v == "1").is_some();
|
let html_only = env::var("MHB_HTML_ONLY")
|
||||||
|
.ok()
|
||||||
|
.filter(|v| v == "1")
|
||||||
|
.is_some();
|
||||||
|
|
||||||
let tests = fs::read_dir(input_dir).unwrap().map(|d| d.unwrap());
|
let tests = fs::read_dir(input_dir).unwrap().map(|d| d.unwrap());
|
||||||
|
|
||||||
|
@ -24,10 +30,15 @@ fn main() {
|
||||||
let mut len = 0;
|
let mut len = 0;
|
||||||
for _ in 0..iterations {
|
for _ in 0..iterations {
|
||||||
len = minify(&source, &cfg).len();
|
len = minify(&source, &cfg).len();
|
||||||
};
|
}
|
||||||
let elapsed = start.elapsed().as_secs_f64();
|
let elapsed = start.elapsed().as_secs_f64();
|
||||||
results.push((t.file_name().into_string().unwrap(), len, iterations, elapsed));
|
results.push((
|
||||||
};
|
t.file_name().into_string().unwrap(),
|
||||||
|
len,
|
||||||
|
iterations,
|
||||||
|
elapsed,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
serde_json::to_writer(stdout(), &results).unwrap();
|
serde_json::to_writer(stdout(), &results).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,8 @@ fn main() {
|
||||||
let out_code = minify(
|
let out_code = minify(
|
||||||
&src_code,
|
&src_code,
|
||||||
&Cfg {
|
&Cfg {
|
||||||
ensure_spec_compliant_unquoted_attribute_values: args.ensure_spec_compliant_unquoted_attribute_values,
|
ensure_spec_compliant_unquoted_attribute_values: args
|
||||||
|
.ensure_spec_compliant_unquoted_attribute_values,
|
||||||
keep_closing_tags: args.keep_closing_tags,
|
keep_closing_tags: args.keep_closing_tags,
|
||||||
keep_comments: args.keep_comments,
|
keep_comments: args.keep_comments,
|
||||||
keep_html_and_head_opening_tags: args.keep_html_and_head_opening_tags,
|
keep_html_and_head_opening_tags: args.keep_html_and_head_opening_tags,
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -Eeuxo pipefail
|
||||||
|
|
||||||
|
pushd "$(dirname "$0")" >/dev/null
|
||||||
|
|
||||||
|
npx prettier@2.3.2 -w 'bench/*.{js,json}' 'bench/*/*.{js,json}' 'gen/*.{ts,json}'
|
||||||
|
|
||||||
|
for dir in \
|
||||||
|
bench/runners/minify-html \
|
||||||
|
bench/runners/minify-html-onepass \
|
||||||
|
cli \
|
||||||
|
fuzz \
|
||||||
|
fuzz/process \
|
||||||
|
java \
|
||||||
|
nodejs/native \
|
||||||
|
python \
|
||||||
|
ruby \
|
||||||
|
rust/main \
|
||||||
|
rust/onepass \
|
||||||
|
; do
|
||||||
|
pushd "$dir" >/dev/null
|
||||||
|
cargo fmt
|
||||||
|
popd >/dev/null
|
||||||
|
done
|
||||||
|
|
||||||
|
popd >/dev/null
|
|
@ -1,7 +1,7 @@
|
||||||
|
use minify_html;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
use std::panic;
|
use std::panic;
|
||||||
use minify_html;
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
for dirent in fs::read_dir("../out/crashes").unwrap() {
|
for dirent in fs::read_dir("../out/crashes").unwrap() {
|
||||||
|
@ -9,9 +9,7 @@ fn main() {
|
||||||
let path_in_catch = path.clone();
|
let path_in_catch = path.clone();
|
||||||
let res = panic::catch_unwind(|| {
|
let res = panic::catch_unwind(|| {
|
||||||
let mut contents = fs::read(path_in_catch).unwrap();
|
let mut contents = fs::read(path_in_catch).unwrap();
|
||||||
let _ = minify_html::in_place(&mut contents, &minify_html::Cfg {
|
let _ = minify_html::in_place(&mut contents, &minify_html::Cfg { minify_js: false });
|
||||||
minify_js: false,
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
if res.is_err() {
|
if res.is_err() {
|
||||||
let contents = fs::read(path).unwrap();
|
let contents = fs::read(path).unwrap();
|
||||||
|
@ -19,5 +17,5 @@ fn main() {
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
fs::remove_file(path).unwrap();
|
fs::remove_file(path).unwrap();
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,15 @@ const SINGLE_QUOTE = [c("'")];
|
||||||
// Official characters allowed in an attribute name.
|
// Official characters allowed in an attribute name.
|
||||||
// NOTE: Unicode noncharacters not tested.
|
// NOTE: Unicode noncharacters not tested.
|
||||||
// See https://html.spec.whatwg.org/multipage/syntax.html#syntax-attribute-name for spec.
|
// See https://html.spec.whatwg.org/multipage/syntax.html#syntax-attribute-name for spec.
|
||||||
const WHATWG_ATTR_NAME_CHAR = invert([...CONTROL, c(' '), c('"'), c('\''), c('>'), c('/'), c('=')]);
|
const WHATWG_ATTR_NAME_CHAR = invert([
|
||||||
|
...CONTROL,
|
||||||
|
c(" "),
|
||||||
|
c('"'),
|
||||||
|
c("'"),
|
||||||
|
c(">"),
|
||||||
|
c("/"),
|
||||||
|
c("="),
|
||||||
|
]);
|
||||||
// Valid attribute quote characters.
|
// Valid attribute quote characters.
|
||||||
// See https://html.spec.whatwg.org/multipage/introduction.html#intro-early-example for spec.
|
// See https://html.spec.whatwg.org/multipage/introduction.html#intro-early-example for spec.
|
||||||
// Backtick is not a valid quote character according to spec.
|
// Backtick is not a valid quote character according to spec.
|
||||||
|
|
|
@ -1,14 +1,9 @@
|
||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
|
||||||
"format": "prettier -w '*.{ts,json}'"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": "^14.0.5",
|
"@types/node": "^14.0.5",
|
||||||
"@wzlin/html-data": "^2021080714.0.0",
|
"@wzlin/html-data": "^2021080714.0.0",
|
||||||
"prettier": "2.3.2",
|
|
||||||
"ts-node": "^8.10.1",
|
"ts-node": "^8.10.1",
|
||||||
"typescript": "^3.7.4",
|
"typescript": "^3.7.4"
|
||||||
"yaml": "^1.10.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +1,48 @@
|
||||||
use minify_html::{minify as minify_html_native, Cfg};
|
use jni::objects::{JClass, JObject, JString};
|
||||||
|
use jni::sys::jstring;
|
||||||
use jni::JNIEnv;
|
use jni::JNIEnv;
|
||||||
use jni::objects::{ JClass, JObject, JString};
|
use minify_html::{minify as minify_html_native, Cfg};
|
||||||
use jni::sys::{ jstring};
|
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
|
|
||||||
fn build_cfg(
|
fn build_cfg(env: &JNIEnv, obj: &JObject) -> Cfg {
|
||||||
env: &JNIEnv,
|
|
||||||
obj: &JObject,
|
|
||||||
) -> Cfg {
|
|
||||||
Cfg {
|
Cfg {
|
||||||
ensure_spec_compliant_unquoted_attribute_values: env.get_field(*obj, "ensure_spec_compliant_unquoted_attribute_values", "Z").unwrap().z().unwrap(),
|
ensure_spec_compliant_unquoted_attribute_values: env
|
||||||
keep_closing_tags: env.get_field(*obj, "keep_closing_tags", "Z").unwrap().z().unwrap(),
|
.get_field(*obj, "ensure_spec_compliant_unquoted_attribute_values", "Z")
|
||||||
keep_comments: env.get_field(*obj, "keep_comments", "Z").unwrap().z().unwrap(),
|
.unwrap()
|
||||||
keep_html_and_head_opening_tags: env.get_field(*obj, "keep_html_and_head_opening_tags", "Z").unwrap().z().unwrap(),
|
.z()
|
||||||
keep_spaces_between_attributes: env.get_field(*obj, "keep_spaces_between_attributes", "Z").unwrap().z().unwrap(),
|
.unwrap(),
|
||||||
|
keep_closing_tags: env
|
||||||
|
.get_field(*obj, "keep_closing_tags", "Z")
|
||||||
|
.unwrap()
|
||||||
|
.z()
|
||||||
|
.unwrap(),
|
||||||
|
keep_comments: env
|
||||||
|
.get_field(*obj, "keep_comments", "Z")
|
||||||
|
.unwrap()
|
||||||
|
.z()
|
||||||
|
.unwrap(),
|
||||||
|
keep_html_and_head_opening_tags: env
|
||||||
|
.get_field(*obj, "keep_html_and_head_opening_tags", "Z")
|
||||||
|
.unwrap()
|
||||||
|
.z()
|
||||||
|
.unwrap(),
|
||||||
|
keep_spaces_between_attributes: env
|
||||||
|
.get_field(*obj, "keep_spaces_between_attributes", "Z")
|
||||||
|
.unwrap()
|
||||||
|
.z()
|
||||||
|
.unwrap(),
|
||||||
minify_css: env.get_field(*obj, "minify_css", "Z").unwrap().z().unwrap(),
|
minify_css: env.get_field(*obj, "minify_css", "Z").unwrap().z().unwrap(),
|
||||||
minify_js: env.get_field(*obj, "minify_js", "Z").unwrap().z().unwrap(),
|
minify_js: env.get_field(*obj, "minify_js", "Z").unwrap().z().unwrap(),
|
||||||
remove_bangs: env.get_field(*obj, "remove_bangs", "Z").unwrap().z().unwrap(),
|
remove_bangs: env
|
||||||
remove_processing_instructions: env.get_field(*obj, "remove_processing_instructions", "Z").unwrap().z().unwrap(),
|
.get_field(*obj, "remove_bangs", "Z")
|
||||||
|
.unwrap()
|
||||||
|
.z()
|
||||||
|
.unwrap(),
|
||||||
|
remove_processing_instructions: env
|
||||||
|
.get_field(*obj, "remove_processing_instructions", "Z")
|
||||||
|
.unwrap()
|
||||||
|
.z()
|
||||||
|
.unwrap(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,8 +52,7 @@ pub extern "system" fn Java_in_wilsonl_minifyhtml_MinifyHtml_minify(
|
||||||
_class: JClass,
|
_class: JClass,
|
||||||
input: JString,
|
input: JString,
|
||||||
cfg: JObject,
|
cfg: JObject,
|
||||||
)
|
) -> jstring {
|
||||||
-> jstring {
|
|
||||||
let source: String = env.get_string(input).unwrap().into();
|
let source: String = env.get_string(input).unwrap().into();
|
||||||
let code = source.into_bytes();
|
let code = source.into_bytes();
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
pub use crate::cfg::Cfg;
|
pub use crate::cfg::Cfg;
|
||||||
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
|
use crate::common::spec::tag::EMPTY_SLICE;
|
||||||
use crate::minify::content::minify_content;
|
use crate::minify::content::minify_content;
|
||||||
use crate::parse::content::parse_content;
|
use crate::parse::content::parse_content;
|
||||||
use crate::parse::Code;
|
use crate::parse::Code;
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
|
||||||
use crate::common::spec::tag::EMPTY_SLICE;
|
|
||||||
|
|
||||||
mod ast;
|
mod ast;
|
||||||
mod cfg;
|
mod cfg;
|
||||||
|
|
|
@ -6,14 +6,14 @@ use {
|
||||||
crate::minify::css::MINIFY_CSS_TRANSFORM_OPTIONS, crate::minify::esbuild::minify_using_esbuild,
|
crate::minify::css::MINIFY_CSS_TRANSFORM_OPTIONS, crate::minify::esbuild::minify_using_esbuild,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::entity::encode::encode_entities;
|
|
||||||
use crate::Cfg;
|
|
||||||
use crate::common::gen::attrs::ATTRS;
|
use crate::common::gen::attrs::ATTRS;
|
||||||
use crate::common::gen::codepoints::DIGIT;
|
use crate::common::gen::codepoints::DIGIT;
|
||||||
use crate::common::pattern::Replacer;
|
use crate::common::pattern::Replacer;
|
||||||
use crate::common::spec::script::JAVASCRIPT_MIME_TYPES;
|
use crate::common::spec::script::JAVASCRIPT_MIME_TYPES;
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
use crate::common::whitespace::{collapse_whitespace, left_trim, right_trim};
|
use crate::common::whitespace::{collapse_whitespace, left_trim, right_trim};
|
||||||
|
use crate::entity::encode::encode_entities;
|
||||||
|
use crate::Cfg;
|
||||||
|
|
||||||
fn build_double_quoted_replacer() -> Replacer {
|
fn build_double_quoted_replacer() -> Replacer {
|
||||||
let mut patterns = Vec::<Vec<u8>>::new();
|
let mut patterns = Vec::<Vec<u8>>::new();
|
||||||
|
|
|
@ -3,6 +3,12 @@ use lazy_static::lazy_static;
|
||||||
|
|
||||||
use crate::ast::{NodeData, ScriptOrStyleLang};
|
use crate::ast::{NodeData, ScriptOrStyleLang};
|
||||||
use crate::cfg::Cfg;
|
use crate::cfg::Cfg;
|
||||||
|
use crate::common::gen::codepoints::TAG_NAME_CHAR;
|
||||||
|
use crate::common::pattern::Replacer;
|
||||||
|
use crate::common::spec::tag::whitespace::{
|
||||||
|
get_whitespace_minification_for_tag, WhitespaceMinification,
|
||||||
|
};
|
||||||
|
use crate::common::whitespace::{collapse_whitespace, is_all_whitespace, left_trim, right_trim};
|
||||||
use crate::entity::encode::encode_entities;
|
use crate::entity::encode::encode_entities;
|
||||||
use crate::minify::bang::minify_bang;
|
use crate::minify::bang::minify_bang;
|
||||||
use crate::minify::comment::minify_comment;
|
use crate::minify::comment::minify_comment;
|
||||||
|
@ -10,14 +16,6 @@ use crate::minify::css::minify_css;
|
||||||
use crate::minify::element::minify_element;
|
use crate::minify::element::minify_element;
|
||||||
use crate::minify::instruction::minify_instruction;
|
use crate::minify::instruction::minify_instruction;
|
||||||
use crate::minify::js::minify_js;
|
use crate::minify::js::minify_js;
|
||||||
use crate::common::gen::codepoints::TAG_NAME_CHAR;
|
|
||||||
use crate::common::pattern::Replacer;
|
|
||||||
use crate::common::spec::tag::whitespace::{
|
|
||||||
get_whitespace_minification_for_tag, WhitespaceMinification,
|
|
||||||
};
|
|
||||||
use crate::common::whitespace::{
|
|
||||||
collapse_whitespace, is_all_whitespace, left_trim, right_trim,
|
|
||||||
};
|
|
||||||
|
|
||||||
fn build_chevron_replacer() -> Replacer {
|
fn build_chevron_replacer() -> Replacer {
|
||||||
let mut patterns = Vec::<Vec<u8>>::new();
|
let mut patterns = Vec::<Vec<u8>>::new();
|
||||||
|
|
|
@ -2,10 +2,10 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::ast::{ElementClosingTag, NodeData};
|
use crate::ast::{ElementClosingTag, NodeData};
|
||||||
use crate::cfg::Cfg;
|
use crate::cfg::Cfg;
|
||||||
use crate::minify::attr::{minify_attr, AttrMinified};
|
|
||||||
use crate::minify::content::minify_content;
|
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
||||||
|
use crate::minify::attr::{minify_attr, AttrMinified};
|
||||||
|
use crate::minify::content::minify_content;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||||
enum LastAttr {
|
enum LastAttr {
|
||||||
|
|
|
@ -3,6 +3,10 @@ use lazy_static::lazy_static;
|
||||||
use memchr::memrchr;
|
use memchr::memrchr;
|
||||||
|
|
||||||
use crate::ast::NodeData;
|
use crate::ast::NodeData;
|
||||||
|
use crate::common::gen::codepoints::TAG_NAME_CHAR;
|
||||||
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
|
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
||||||
|
use crate::common::spec::tag::void::VOID_TAGS;
|
||||||
use crate::entity::decode::decode_entities;
|
use crate::entity::decode::decode_entities;
|
||||||
use crate::parse::bang::parse_bang;
|
use crate::parse::bang::parse_bang;
|
||||||
use crate::parse::comment::parse_comment;
|
use crate::parse::comment::parse_comment;
|
||||||
|
@ -10,10 +14,6 @@ use crate::parse::content::ContentType::*;
|
||||||
use crate::parse::element::{parse_element, parse_tag, peek_tag_name};
|
use crate::parse::element::{parse_element, parse_tag, peek_tag_name};
|
||||||
use crate::parse::instruction::parse_instruction;
|
use crate::parse::instruction::parse_instruction;
|
||||||
use crate::parse::Code;
|
use crate::parse::Code;
|
||||||
use crate::common::gen::codepoints::TAG_NAME_CHAR;
|
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
|
||||||
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
|
||||||
use crate::common::spec::tag::void::VOID_TAGS;
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Eq, PartialEq)]
|
#[derive(Copy, Clone, Eq, PartialEq)]
|
||||||
enum ContentType {
|
enum ContentType {
|
||||||
|
|
|
@ -1,13 +1,6 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::ast::{ElementClosingTag, NodeData, ScriptOrStyleLang};
|
use crate::ast::{ElementClosingTag, NodeData, ScriptOrStyleLang};
|
||||||
use crate::entity::decode::decode_entities;
|
|
||||||
use crate::parse::content::{parse_content, ParsedContent};
|
|
||||||
use crate::parse::script::parse_script_content;
|
|
||||||
use crate::parse::style::parse_style_content;
|
|
||||||
use crate::parse::textarea::parse_textarea_content;
|
|
||||||
use crate::parse::title::parse_title_content;
|
|
||||||
use crate::parse::Code;
|
|
||||||
use crate::common::gen::codepoints::{
|
use crate::common::gen::codepoints::{
|
||||||
ATTR_QUOTE, DOUBLE_QUOTE, NOT_UNQUOTED_ATTR_VAL_CHAR, SINGLE_QUOTE, TAG_NAME_CHAR, WHITESPACE,
|
ATTR_QUOTE, DOUBLE_QUOTE, NOT_UNQUOTED_ATTR_VAL_CHAR, SINGLE_QUOTE, TAG_NAME_CHAR, WHITESPACE,
|
||||||
WHITESPACE_OR_SLASH, WHITESPACE_OR_SLASH_OR_EQUALS_OR_RIGHT_CHEVRON,
|
WHITESPACE_OR_SLASH, WHITESPACE_OR_SLASH_OR_EQUALS_OR_RIGHT_CHEVRON,
|
||||||
|
@ -15,6 +8,13 @@ use crate::common::gen::codepoints::{
|
||||||
use crate::common::spec::script::JAVASCRIPT_MIME_TYPES;
|
use crate::common::spec::script::JAVASCRIPT_MIME_TYPES;
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
use crate::common::spec::tag::void::VOID_TAGS;
|
use crate::common::spec::tag::void::VOID_TAGS;
|
||||||
|
use crate::entity::decode::decode_entities;
|
||||||
|
use crate::parse::content::{parse_content, ParsedContent};
|
||||||
|
use crate::parse::script::parse_script_content;
|
||||||
|
use crate::parse::style::parse_style_content;
|
||||||
|
use crate::parse::textarea::parse_textarea_content;
|
||||||
|
use crate::parse::title::parse_title_content;
|
||||||
|
use crate::parse::Code;
|
||||||
use std::fmt::{Debug, Formatter};
|
use std::fmt::{Debug, Formatter};
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::ast::{ElementClosingTag, NodeData};
|
use crate::ast::{ElementClosingTag, NodeData};
|
||||||
use crate::parse::element::{parse_element, parse_tag, ParsedTag};
|
|
||||||
use crate::parse::Code;
|
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
use crate::common::spec::tag::EMPTY_SLICE;
|
use crate::common::spec::tag::EMPTY_SLICE;
|
||||||
|
use crate::parse::element::{parse_element, parse_tag, ParsedTag};
|
||||||
|
use crate::parse::Code;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_tag() {
|
fn test_parse_tag() {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
pub use crate::cfg::Cfg;
|
pub use crate::cfg::Cfg;
|
||||||
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
use crate::err::debug_repr;
|
use crate::err::debug_repr;
|
||||||
pub use crate::err::{Error, ErrorType, FriendlyError};
|
pub use crate::err::{Error, ErrorType, FriendlyError};
|
||||||
use crate::proc::Processor;
|
use crate::proc::Processor;
|
||||||
use crate::unit::content::process_content;
|
use crate::unit::content::process_content;
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
|
||||||
|
|
||||||
mod cfg;
|
mod cfg;
|
||||||
mod common;
|
mod common;
|
||||||
|
|
|
@ -15,12 +15,12 @@
|
||||||
|
|
||||||
use std::char::from_u32;
|
use std::char::from_u32;
|
||||||
|
|
||||||
use crate::proc::Processor;
|
|
||||||
use crate::common::gen::codepoints::{
|
use crate::common::gen::codepoints::{
|
||||||
Lookup, ALPHANUMERIC_OR_EQUALS, DIGIT, HEX_DIGIT, LOWER_HEX_ALPHA, UPPER_HEX_ALPHA,
|
Lookup, ALPHANUMERIC_OR_EQUALS, DIGIT, HEX_DIGIT, LOWER_HEX_ALPHA, UPPER_HEX_ALPHA,
|
||||||
};
|
};
|
||||||
use crate::common::gen::entities::{EntityType, ENTITY};
|
use crate::common::gen::entities::{EntityType, ENTITY};
|
||||||
use crate::common::pattern::TrieNodeMatch;
|
use crate::common::pattern::TrieNodeMatch;
|
||||||
|
use crate::proc::Processor;
|
||||||
|
|
||||||
enum Parsed {
|
enum Parsed {
|
||||||
// This includes numeric entities that were invalid and decoded to 0xFFFD.
|
// This includes numeric entities that were invalid and decoded to 0xFFFD.
|
||||||
|
|
|
@ -11,12 +11,12 @@ use {
|
||||||
std::sync::{Arc, Mutex},
|
std::sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::common::gen::codepoints::Lookup;
|
||||||
|
use crate::common::spec::tag::EMPTY_SLICE;
|
||||||
use crate::err::{debug_repr, Error, ErrorType, ProcessingResult};
|
use crate::err::{debug_repr, Error, ErrorType, ProcessingResult};
|
||||||
use crate::proc::range::ProcessorRange;
|
use crate::proc::range::ProcessorRange;
|
||||||
use crate::proc::MatchAction::*;
|
use crate::proc::MatchAction::*;
|
||||||
use crate::proc::MatchMode::*;
|
use crate::proc::MatchMode::*;
|
||||||
use crate::common::gen::codepoints::Lookup;
|
|
||||||
use crate::common::spec::tag::EMPTY_SLICE;
|
|
||||||
|
|
||||||
pub mod checkpoint;
|
pub mod checkpoint;
|
||||||
pub mod entity;
|
pub mod entity;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
use crate::common::gen::attrs::ATTRS;
|
||||||
|
use crate::common::gen::codepoints::{WHATWG_ATTR_NAME_CHAR, WHITESPACE};
|
||||||
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
use crate::err::ProcessingResult;
|
use crate::err::ProcessingResult;
|
||||||
use crate::proc::checkpoint::WriteCheckpoint;
|
use crate::proc::checkpoint::WriteCheckpoint;
|
||||||
use crate::proc::range::ProcessorRange;
|
use crate::proc::range::ProcessorRange;
|
||||||
|
@ -7,9 +10,6 @@ use crate::proc::Processor;
|
||||||
use crate::unit::attr::value::{
|
use crate::unit::attr::value::{
|
||||||
process_attr_value, skip_attr_value, DelimiterType, ProcessedAttrValue,
|
process_attr_value, skip_attr_value, DelimiterType, ProcessedAttrValue,
|
||||||
};
|
};
|
||||||
use crate::common::gen::attrs::ATTRS;
|
|
||||||
use crate::common::gen::codepoints::{WHATWG_ATTR_NAME_CHAR, WHITESPACE};
|
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
|
||||||
|
|
||||||
mod value;
|
mod value;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,9 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
|
use crate::common::gen::codepoints::{
|
||||||
|
ATTR_QUOTE, DIGIT, DOUBLE_QUOTE, NOT_UNQUOTED_ATTR_VAL_CHAR, SINGLE_QUOTE, WHITESPACE,
|
||||||
|
};
|
||||||
use crate::err::ProcessingResult;
|
use crate::err::ProcessingResult;
|
||||||
use crate::proc::checkpoint::WriteCheckpoint;
|
use crate::proc::checkpoint::WriteCheckpoint;
|
||||||
use crate::proc::entity::maybe_normalise_entity;
|
use crate::proc::entity::maybe_normalise_entity;
|
||||||
|
@ -9,9 +12,6 @@ use crate::proc::range::ProcessorRange;
|
||||||
use crate::proc::MatchAction::*;
|
use crate::proc::MatchAction::*;
|
||||||
use crate::proc::MatchMode::*;
|
use crate::proc::MatchMode::*;
|
||||||
use crate::proc::Processor;
|
use crate::proc::Processor;
|
||||||
use crate::common::gen::codepoints::{
|
|
||||||
ATTR_QUOTE, DIGIT, DOUBLE_QUOTE, NOT_UNQUOTED_ATTR_VAL_CHAR, SINGLE_QUOTE, WHITESPACE,
|
|
||||||
};
|
|
||||||
|
|
||||||
// See comment in `process_attr_value` for full description of why these intentionally do not have semicolons.
|
// See comment in `process_attr_value` for full description of why these intentionally do not have semicolons.
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
use crate::cfg::Cfg;
|
use crate::cfg::Cfg;
|
||||||
|
use crate::common::gen::codepoints::{TAG_NAME_CHAR, WHITESPACE};
|
||||||
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
|
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
||||||
|
use crate::common::spec::tag::whitespace::{
|
||||||
|
get_whitespace_minification_for_tag, WhitespaceMinification,
|
||||||
|
};
|
||||||
use crate::err::ProcessingResult;
|
use crate::err::ProcessingResult;
|
||||||
use crate::proc::checkpoint::ReadCheckpoint;
|
use crate::proc::checkpoint::ReadCheckpoint;
|
||||||
use crate::proc::entity::maybe_normalise_entity;
|
use crate::proc::entity::maybe_normalise_entity;
|
||||||
|
@ -10,12 +16,6 @@ use crate::unit::bang::process_bang;
|
||||||
use crate::unit::comment::process_comment;
|
use crate::unit::comment::process_comment;
|
||||||
use crate::unit::instruction::process_instruction;
|
use crate::unit::instruction::process_instruction;
|
||||||
use crate::unit::tag::{process_tag, MaybeClosingTag};
|
use crate::unit::tag::{process_tag, MaybeClosingTag};
|
||||||
use crate::common::gen::codepoints::{TAG_NAME_CHAR, WHITESPACE};
|
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
|
||||||
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
|
||||||
use crate::common::spec::tag::whitespace::{
|
|
||||||
get_whitespace_minification_for_tag, WhitespaceMinification,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq)]
|
#[derive(Copy, Clone, PartialEq, Eq)]
|
||||||
enum ContentType {
|
enum ContentType {
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
use crate::cfg::Cfg;
|
use crate::cfg::Cfg;
|
||||||
|
use crate::common::gen::attrs::{AttributeMinification, ATTRS};
|
||||||
|
use crate::common::gen::codepoints::{TAG_NAME_CHAR, WHITESPACE};
|
||||||
|
use crate::common::spec::tag::ns::Namespace;
|
||||||
|
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
||||||
|
use crate::common::spec::tag::void::VOID_TAGS;
|
||||||
use crate::err::{ErrorType, ProcessingResult};
|
use crate::err::{ErrorType, ProcessingResult};
|
||||||
use crate::proc::checkpoint::{ReadCheckpoint, WriteCheckpoint};
|
use crate::proc::checkpoint::{ReadCheckpoint, WriteCheckpoint};
|
||||||
use crate::proc::range::ProcessorRange;
|
use crate::proc::range::ProcessorRange;
|
||||||
|
@ -10,11 +15,6 @@ use crate::unit::content::process_content;
|
||||||
use crate::unit::script::process_script;
|
use crate::unit::script::process_script;
|
||||||
use crate::unit::style::process_style;
|
use crate::unit::style::process_style;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use crate::common::gen::attrs::{AttributeMinification, ATTRS};
|
|
||||||
use crate::common::gen::codepoints::{TAG_NAME_CHAR, WHITESPACE};
|
|
||||||
use crate::common::spec::tag::ns::Namespace;
|
|
||||||
use crate::common::spec::tag::omission::{can_omit_as_before, can_omit_as_last_node};
|
|
||||||
use crate::common::spec::tag::void::VOID_TAGS;
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
|
|
Loading…
Reference in New Issue