hyperbuild 0.1.10 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e556f9c7d4088da60101da67f3122a1383a492b53dfabd14a72527bf58bf64a
4
- data.tar.gz: ae64306255bb1345ffe29abeaaf8ea36472f2a88e23651de6299413fa59d7f7f
3
+ metadata.gz: e83b0423aee5805c928eaea74b59e6b230bd5445b96bc7d01de4de3d851c6651
4
+ data.tar.gz: e095ae3c16b327a8712a0ff049f4908ddf7ce3292a128f516933c00c2d455d8a
5
5
  SHA512:
6
- metadata.gz: 00071f629c3e0b8586e109baeb540008bf40fa3d0876efca0a30c7da612bdd9fb1f7f80abd31f82a8432fa8bb573aa7ad750c2f9328ead6e0186ac10681227ed
7
- data.tar.gz: 0ed32c3233e1500458759b4ad0dfca11949c34823fb76f88127e1691ae4ffd156738a62f15d0735dc28f7bd65e0d7a6c0eb51277e9e52d8188c5c7e305c35843
6
+ metadata.gz: d9adcacde88b2985ae0488ea1555c6c83ac376492cd21c2316fa3130176ccce17c11c75f2d7ed30f94c03bd1454bc117221dc63523e45c69d305aa2fb562803f
7
+ data.tar.gz: d19a164fc4709d8448408f54d417d62df4bd5bcf7eda5d90296c987c350ce1611dec530a23dffc6915bf19f63550bbd88e6bea73df8446b079f43382ff27338f
data/README.md CHANGED
@@ -2,8 +2,10 @@
2
2
 
3
3
  A fast one-pass in-place HTML minifier written in Rust with context-aware whitespace handling.
4
4
 
5
+ Also supports JS minification by plugging into [esbuild](https://github.com/evanw/esbuild).
6
+
5
7
  Available as:
6
- - CLI for Windows, macOS, and Linux.
8
+ - CLI for macOS and Linux.
7
9
  - Rust library.
8
10
  - Native library for Node.js, Python, Java, and Ruby.
9
11
 
@@ -12,27 +14,29 @@ Available as:
12
14
  - Minification is done in one pass with no backtracking or DOM/AST building.
13
15
  - No extra heap memory is allocated during processing, which increases performance.
14
16
  - Context-aware whitespace handling allows maximum minification while retaining desired spaces.
17
+ - Well tested with a large test suite and extensive [fuzzing](./fuzz).
15
18
 
16
19
  ## Performance
17
20
 
18
21
  Speed and effectiveness of Node.js version compared to [html-minfier](https://github.com/kangax/html-minifier) and [minimize](https://github.com/Swaagie/minimize), run on popular already-minified web pages. See [bench](./bench) folder for more details.
19
22
 
20
- <img width="435" alt="Chart showing speed of HTML minifiers" src="https://wilsonl.in/hyperbuild/bench/0.1.10/average-speeds.png"> <img width="435" alt="Chart showing effectiveness of HTML minifiers" src="https://wilsonl.in/hyperbuild/bench/0.1.10/average-sizes.png">
23
+ <img width="435" alt="Chart showing speed of HTML minifiers" src="https://wilsonl.in/hyperbuild/bench/0.2.4/average-speeds.png"> <img width="435" alt="Chart showing effectiveness of HTML minifiers" src="https://wilsonl.in/hyperbuild/bench/0.2.4/average-sizes.png">
21
24
 
22
25
  ## Usage
23
26
 
24
27
  ### CLI
25
28
 
26
- Precompiled binaries are available for x86-64 Windows, macOS, and Linux.
29
+ Precompiled binaries are available for x86-64 macOS and Linux.
27
30
 
28
31
  ##### Get
29
32
 
30
- [Windows](https://wilsonl.in/hyperbuild/bin/0.1.10-windows-x86_64.exe) |
31
- [macOS](https://wilsonl.in/hyperbuild/bin/0.1.10-macos-x86_64) |
32
- [Linux](https://wilsonl.in/hyperbuild/bin/0.1.10-linux-x86_64)
33
+ [macOS](https://wilsonl.in/hyperbuild/bin/0.2.4-macos-x86_64) |
34
+ [Linux](https://wilsonl.in/hyperbuild/bin/0.2.4-linux-x86_64)
33
35
 
34
36
  ##### Use
35
37
 
38
+ Use the `--help` argument for more details.
39
+
36
40
  ```bash
37
41
  hyperbuild --src /path/to/src.html --out /path/to/output.min.html
38
42
  ```
@@ -46,34 +50,41 @@ hyperbuild --src /path/to/src.html --out /path/to/output.min.html
46
50
 
47
51
  ```toml
48
52
  [dependencies]
49
- hyperbuild = "0.1.10"
53
+ hyperbuild = { version = "0.2.4", features = ["js-esbuild"] }
50
54
  ```
51
55
 
56
+ Building with the `js-esbuild` feature requires the Go compiler to be installed as well, to build the [JS minifier](https://github.com/evanw/esbuild).
57
+
58
+ If the `js-esbuild` feature is not enabled, `cfg.minify_js` will have no effect.
59
+
52
60
  ##### Use
53
61
 
54
62
  ```rust
55
- use hyperbuild::{FriendlyError, hyperbuild};
63
+ use hyperbuild::{Cfg, FriendlyError, hyperbuild, hyperbuild_copy, hyperbuild_friendly_error, hyperbuild_truncate};
56
64
 
57
65
  fn main() {
58
66
  let mut code = b"<p> Hello, world! </p>".to_vec();
67
+ let cfg = &Cfg {
68
+ minify_js: false,
69
+ };
59
70
 
60
71
  // Minifies a slice in-place and returns the new minified length,
61
72
  // but leaves any original code after the minified code intact.
62
- match hyperbuild(&mut code) {
73
+ match hyperbuild(&mut code, cfg) {
63
74
  Ok(minified_len) => {}
64
75
  Err((error_type, error_position)) => {}
65
76
  };
66
77
 
67
78
  // Creates a vector copy containing only minified code
68
79
  // instead of minifying in-place.
69
- match hyperbuild_copy(&code) {
80
+ match hyperbuild_copy(&code, cfg) {
70
81
  Ok(minified) => {}
71
82
  Err((error_type, error_position)) => {}
72
83
  };
73
84
 
74
85
  // Minifies a vector in-place, and then truncates the
75
86
  // vector to the new minified length.
76
- match hyperbuild_truncate(&mut code) {
87
+ match hyperbuild_truncate(&mut code, cfg) {
77
88
  Ok(()) => {}
78
89
  Err((error_type, error_position)) => {}
79
90
  };
@@ -81,7 +92,7 @@ fn main() {
81
92
  // Identical to `hyperbuild` except with FriendlyError instead.
82
93
  // `code_context` is a string of a visual representation of the source,
83
94
  // with line numbers and position markers to aid in debugging syntax.
84
- match hyperbuild_friendly_error(&mut code) {
95
+ match hyperbuild_friendly_error(&mut code, cfg) {
85
96
  Ok(minified_len) => {}
86
97
  Err(FriendlyError { position, message, code_context }) => {
87
98
  eprintln!("Failed at character {}:", position);
@@ -118,10 +129,11 @@ yarn add hyperbuild
118
129
  ```js
119
130
  const hyperbuild = require("hyperbuild");
120
131
 
121
- const minified = hyperbuild.minify("<p> Hello, world! </p>");
132
+ const cfg = { minifyJs: false };
133
+ const minified = hyperbuild.minify("<p> Hello, world! </p>", cfg);
122
134
 
123
135
  // Alternatively, minify in place to avoid copying.
124
- const source = Buffer.from("<p> Hello, world! </p>");
136
+ const source = Buffer.from("<p> Hello, world! </p>", cfg);
125
137
  hyperbuild.minifyInPlace(source);
126
138
  ```
127
139
 
@@ -131,8 +143,9 @@ hyperbuild is also available for TypeScript:
131
143
  import * as hyperbuild from "hyperbuild";
132
144
  import * as fs from "fs";
133
145
 
134
- const minified = hyperbuild.minify("<p> Hello, world! </p>");
135
- hyperbuild.minifyInPlace(fs.readFileSync("source.html"));
146
+ const cfg = { minifyJs: false };
147
+ const minified = hyperbuild.minify("<p> Hello, world! </p>", cfg);
148
+ hyperbuild.minifyInPlace(fs.readFileSync("source.html"), cfg);
136
149
  ```
137
150
 
138
151
  </details>
@@ -150,7 +163,7 @@ Add as a Maven dependency:
150
163
  <dependency>
151
164
  <groupId>in.wilsonl.hyperbuild</groupId>
152
165
  <artifactId>hyperbuild</artifactId>
153
- <version>0.1.10</version>
166
+ <version>0.2.4</version>
154
167
  </dependency>
155
168
  ```
156
169
 
@@ -159,15 +172,18 @@ Add as a Maven dependency:
159
172
  ```java
160
173
  import in.wilsonl.hyperbuild.Hyperbuild;
161
174
 
175
+ Hyperbuild.Configuration cfg = new Hyperbuild.Configuration.Builder()
176
+ .setMinifyJs(false)
177
+ .build();
162
178
  try {
163
- String minified = Hyperbuild.minify("<p> Hello, world! </p>");
179
+ String minified = Hyperbuild.minify("<p> Hello, world! </p>", cfg);
164
180
  } catch (Hyperbuild.SyntaxException e) {
165
181
  System.err.println(e.getMessage());
166
182
  }
167
183
 
168
184
  // Alternatively, minify in place:
169
185
  assert source instanceof ByteBuffer && source.isDirect();
170
- Hyperbuild.minifyInPlace(source);
186
+ Hyperbuild.minifyInPlace(source, cfg);
171
187
  ```
172
188
 
173
189
  </details>
@@ -187,7 +203,7 @@ Add the PyPI project as a dependency and install it using `pip` or `pipenv`.
187
203
  import hyperbuild
188
204
 
189
205
  try:
190
- minified = hyperbuild.minify("<p> Hello, world! </p>")
206
+ minified = hyperbuild.minify("<p> Hello, world! </p>", minify_js=False)
191
207
  except SyntaxError as e:
192
208
  print(e)
193
209
  ```
@@ -208,17 +224,13 @@ Add the library as a dependency to `Gemfile` or `*.gemspec`.
208
224
  ```ruby
209
225
  require 'hyperbuild'
210
226
 
211
- print Hyperbuild.minify "<p> Hello, world! </p>"
227
+ print Hyperbuild.minify("<p> Hello, world! </p>", { :minify_js => false })
212
228
  ```
213
229
 
214
230
  </details>
215
231
 
216
232
  ## Minification
217
233
 
218
- ### Configurability
219
-
220
- Configuration of minification is currently WIP across all languages. The behaviour mentioned below is the default.
221
-
222
234
  ### Whitespace
223
235
 
224
236
  hyperbuild has advanced context-aware whitespace minification that does things such as:
@@ -440,6 +452,8 @@ Numeric entities that do not refer to a valid [Unicode Scalar Value](https://www
440
452
 
441
453
  If an entity is unintentionally formed after decoding, the leading ampersand is encoded, e.g. `&&#97;&#109;&#112;;` becomes `&ampamp;`. This is done as `&amp` is equal to or shorter than all other entity representations of characters part of an entity (`[&#a-zA-Z0-9;]`), and there is no other conflicting entity name that starts with `amp`.
442
454
 
455
+ It's possible to get an unintentional entity after removing comments, e.g. `&am<!-- -->p`.
456
+
443
457
  Left chevrons after any decoding in text are encoded to `&LT` if possible or `&LT;` otherwise.
444
458
 
445
459
  ### Comments
@@ -454,7 +468,7 @@ Bangs, [processing instructions](https://en.wikipedia.org/wiki/Processing_Instru
454
468
 
455
469
  Only UTF-8/ASCII-encoded HTML code is supported.
456
470
 
457
- hyperbuild simply does HTML minification, and almost does no syntax checking or standards enforcement for performance and code complexity reasons.
471
+ hyperbuild does no syntax checking or standards enforcement for performance and code complexity reasons.
458
472
 
459
473
  For example, this means that it's not an error to have self-closing tags, declare multiple `<body>` elements, use incorrect attribute names and values, or write something like `<br>alert('');</br>`
460
474
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyperbuild
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wilson Lin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-07 00:00:00.000000000 Z
11
+ date: 2020-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fiddle
@@ -62,6 +62,5 @@ rubyforge_project:
62
62
  rubygems_version: 2.7.6.2
63
63
  signing_key:
64
64
  specification_version: 4
65
- summary: Fast one-pass in-place HTML minifier written in Rust with context-aware whitespace
66
- handling
65
+ summary: Fast allocation-less HTML minifier with smart whitespace handling
67
66
  test_files: []