Formatting

This commit is contained in:
Wilson Lin 2021-08-09 19:56:37 +10:00
parent 3b6c22088e
commit 19abe390d4
23 changed files with 181 additions and 96 deletions

View File

@ -43,7 +43,7 @@ const averageChartOptions = (label) => ({
type: "linear",
scaleLabel: {
display: true,
fontColor: '#222',
fontColor: "#222",
fontSize: 24,
fontStyle: "bold",
labelString: label,
@ -145,7 +145,12 @@ const renderChart = (cfg, width, height) =>
await fs.mkdir(GRAPHS_DIR, { recursive: true });
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 inputs = Object.keys(res.inputSizes).sort();
@ -208,11 +213,14 @@ const renderChart = (cfg, width, height) =>
label: minifier,
data: inputs.map(
(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,
1600
@ -228,7 +236,11 @@ const renderChart = (cfg, width, height) =>
labels: inputs,
datasets: sizeMinifiers.map((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"),

View File

@ -1,13 +1,19 @@
use std::{env, fs};
use std::io::stdout;
use std::time::Instant;
use std::{env, fs};
use minify_html_onepass::{Cfg, in_place};
use minify_html_onepass::{in_place, Cfg};
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 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());
@ -24,10 +30,15 @@ fn main() {
for _ in 0..iterations {
let mut data = source.to_vec();
len = in_place(&mut data, &cfg).expect("failed to minify");
};
}
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();
}

View File

@ -1,13 +1,19 @@
use std::{env, fs};
use std::io::stdout;
use std::time::Instant;
use std::{env, fs};
use minify_html::{Cfg, minify};
use minify_html::{minify, Cfg};
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 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());
@ -24,10 +30,15 @@ fn main() {
let mut len = 0;
for _ in 0..iterations {
len = minify(&source, &cfg).len();
};
}
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();
}

View File

@ -74,7 +74,8 @@ fn main() {
let out_code = minify(
&src_code,
&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_comments: args.keep_comments,
keep_html_and_head_opening_tags: args.keep_html_and_head_opening_tags,

27
format Executable file
View File

@ -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

View File

@ -1,7 +1,7 @@
use minify_html;
use std::fs;
use std::io::{self, Write};
use std::panic;
use minify_html;
fn main() {
for dirent in fs::read_dir("../out/crashes").unwrap() {
@ -9,9 +9,7 @@ fn main() {
let path_in_catch = path.clone();
let res = panic::catch_unwind(|| {
let mut contents = fs::read(path_in_catch).unwrap();
let _ = minify_html::in_place(&mut contents, &minify_html::Cfg {
minify_js: false,
});
let _ = minify_html::in_place(&mut contents, &minify_html::Cfg { minify_js: false });
});
if res.is_err() {
let contents = fs::read(path).unwrap();
@ -19,5 +17,5 @@ fn main() {
break;
};
fs::remove_file(path).unwrap();
};
}
}

View File

@ -49,7 +49,15 @@ const SINGLE_QUOTE = [c("'")];
// Official characters allowed in an attribute name.
// NOTE: Unicode noncharacters not tested.
// 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.
// See https://html.spec.whatwg.org/multipage/introduction.html#intro-early-example for spec.
// Backtick is not a valid quote character according to spec.

View File

@ -1,14 +1,9 @@
{
"private": true,
"scripts": {
"format": "prettier -w '*.{ts,json}'"
},
"dependencies": {
"@types/node": "^14.0.5",
"@wzlin/html-data": "^2021080714.0.0",
"prettier": "2.3.2",
"ts-node": "^8.10.1",
"typescript": "^3.7.4",
"yaml": "^1.10.0"
"typescript": "^3.7.4"
}
}

View File

@ -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::objects::{ JClass, JObject, JString};
use jni::sys::{ jstring};
use minify_html::{minify as minify_html_native, Cfg};
use std::str::from_utf8;
fn build_cfg(
env: &JNIEnv,
obj: &JObject,
) -> Cfg {
fn build_cfg(env: &JNIEnv, obj: &JObject) -> Cfg {
Cfg {
ensure_spec_compliant_unquoted_attribute_values: env.get_field(*obj, "ensure_spec_compliant_unquoted_attribute_values", "Z").unwrap().z().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(),
ensure_spec_compliant_unquoted_attribute_values: env
.get_field(*obj, "ensure_spec_compliant_unquoted_attribute_values", "Z")
.unwrap()
.z()
.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_js: env.get_field(*obj, "minify_js", "Z").unwrap().z().unwrap(),
remove_bangs: env.get_field(*obj, "remove_bangs", "Z").unwrap().z().unwrap(),
remove_processing_instructions: env.get_field(*obj, "remove_processing_instructions", "Z").unwrap().z().unwrap(),
remove_bangs: env
.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,
input: JString,
cfg: JObject,
)
-> jstring {
) -> jstring {
let source: String = env.get_string(input).unwrap().into();
let code = source.into_bytes();

View File

@ -1,9 +1,9 @@
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::parse::content::parse_content;
use crate::parse::Code;
use crate::common::spec::tag::ns::Namespace;
use crate::common::spec::tag::EMPTY_SLICE;
mod ast;
mod cfg;

View File

@ -6,14 +6,14 @@ use {
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::codepoints::DIGIT;
use crate::common::pattern::Replacer;
use crate::common::spec::script::JAVASCRIPT_MIME_TYPES;
use crate::common::spec::tag::ns::Namespace;
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 {
let mut patterns = Vec::<Vec<u8>>::new();

View File

@ -3,6 +3,12 @@ use lazy_static::lazy_static;
use crate::ast::{NodeData, ScriptOrStyleLang};
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::minify::bang::minify_bang;
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::instruction::minify_instruction;
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 {
let mut patterns = Vec::<Vec<u8>>::new();

View File

@ -2,10 +2,10 @@ use std::collections::HashMap;
use crate::ast::{ElementClosingTag, NodeData};
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::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)]
enum LastAttr {

View File

@ -3,6 +3,10 @@ use lazy_static::lazy_static;
use memchr::memrchr;
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::parse::bang::parse_bang;
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::instruction::parse_instruction;
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)]
enum ContentType {

View File

@ -1,13 +1,6 @@
use std::collections::HashMap;
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::{
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,
@ -15,6 +8,13 @@ use crate::common::gen::codepoints::{
use crate::common::spec::script::JAVASCRIPT_MIME_TYPES;
use crate::common::spec::tag::ns::Namespace;
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::str::from_utf8;

View File

@ -1,10 +1,10 @@
use std::collections::HashMap;
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::EMPTY_SLICE;
use crate::parse::element::{parse_element, parse_tag, ParsedTag};
use crate::parse::Code;
#[test]
fn test_parse_tag() {

View File

@ -1,9 +1,9 @@
pub use crate::cfg::Cfg;
use crate::common::spec::tag::ns::Namespace;
use crate::err::debug_repr;
pub use crate::err::{Error, ErrorType, FriendlyError};
use crate::proc::Processor;
use crate::unit::content::process_content;
use crate::common::spec::tag::ns::Namespace;
mod cfg;
mod common;

View File

@ -15,12 +15,12 @@
use std::char::from_u32;
use crate::proc::Processor;
use crate::common::gen::codepoints::{
Lookup, ALPHANUMERIC_OR_EQUALS, DIGIT, HEX_DIGIT, LOWER_HEX_ALPHA, UPPER_HEX_ALPHA,
};
use crate::common::gen::entities::{EntityType, ENTITY};
use crate::common::pattern::TrieNodeMatch;
use crate::proc::Processor;
enum Parsed {
// This includes numeric entities that were invalid and decoded to 0xFFFD.

View File

@ -11,12 +11,12 @@ use {
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::proc::range::ProcessorRange;
use crate::proc::MatchAction::*;
use crate::proc::MatchMode::*;
use crate::common::gen::codepoints::Lookup;
use crate::common::spec::tag::EMPTY_SLICE;
pub mod checkpoint;
pub mod entity;

View File

@ -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::proc::checkpoint::WriteCheckpoint;
use crate::proc::range::ProcessorRange;
@ -7,9 +10,6 @@ use crate::proc::Processor;
use crate::unit::attr::value::{
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;

View File

@ -2,6 +2,9 @@ use std::collections::HashMap;
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::proc::checkpoint::WriteCheckpoint;
use crate::proc::entity::maybe_normalise_entity;
@ -9,9 +12,6 @@ use crate::proc::range::ProcessorRange;
use crate::proc::MatchAction::*;
use crate::proc::MatchMode::*;
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.
lazy_static! {

View File

@ -1,4 +1,10 @@
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::proc::checkpoint::ReadCheckpoint;
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::instruction::process_instruction;
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)]
enum ContentType {

View File

@ -1,4 +1,9 @@
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::proc::checkpoint::{ReadCheckpoint, WriteCheckpoint};
use crate::proc::range::ProcessorRange;
@ -10,11 +15,6 @@ use crate::unit::content::process_content;
use crate::unit::script::process_script;
use crate::unit::style::process_style;
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;
lazy_static! {