+# HTMLMinifier
+
[![NPM version](https://img.shields.io/npm/v/html-minifier.svg)](https://www.npmjs.com/package/html-minifier)
[![Build Status](https://img.shields.io/travis/kangax/html-minifier.svg)](https://travis-ci.org/kangax/html-minifier)
[![Dependency Status](https://img.shields.io/david/kangax/html-minifier.svg)](https://david-dm.org/kangax/html-minifier)
## Minification comparison
-How does HTMLMinifier compare to other solutions — [HTML Minifier from Will Peavy](http://www.willpeavy.com/minifier/) (1st result in [google search for "html minifier"](https://www.google.com/#q=html+minifier)) as well as [htmlcompressor.com](http://htmlcompressor.com) and [minimize](https://github.com/Swaagie/minimize)?
+How does HTMLMinifier compare to other solutions — [HTML Minifier from Will Peavy](http://www.willpeavy.com/minifier/) (1st result in [Google search for "html minifier"](https://www.google.com/#q=html+minifier)) as well as [htmlcompressor.com](http://htmlcompressor.com) and [minimize](https://github.com/Swaagie/minimize)?
-| Site | Original size _(KB)_ | HTMLMinifier | minimize | Will Peavy | htmlcompressor.com |
+| Site | Original size *(KB)* | HTMLMinifier | minimize | Will Peavy | htmlcompressor.com |
| --------------------------------------------------------------------------- |:--------------------:| ------------:| --------:| ----------:| ------------------:|
-| [HTMLMinifier page](https://github.com/kangax/html-minifier) | 49 | <b>37</b> | 42 | 44 | 43 |
-| [NBC](http://www.nbc.com) | 91 | <b>74</b> | 84 | 86 | 85 |
-| [ES6 table](http://kangax.github.io/es5-compat-table/es6/) | 118 | <b>80</b> | 93 | 95 | 94 |
-| [New York Times](http://www.nytimes.com/) | 131 | <b>101</b> | 122 | 125 | 120 |
-| [Google](http://www.google.com/) | 133 | <b>128</b> | 132 | 135 | 131 |
-| [MSN](http://msn.com) | 157 | <b>130</b> | 138 | 145 | 138 |
-| [Stackoverflow](http://stackoverflow.com) | 200 | <b>159</b> | 165 | 174 | 166 |
-| [Amazon](http://amazon.com) | 246 | <b>204</b> | 234 | 230 | 219 |
-| [Wikipedia](http://en.wikipedia.org/wiki/President_of_the_United_States) | 401 | <b>367</b> | 388 | 400 | n/a |
-| [Eloquent Javascript](http://eloquentjavascript.net/print.html) | 870 | <b>827</b> | 840 | 864 | n/a |
-| [ES6 draft](https://people.mozilla.org/~jorendorff/es6-draft.html) | 3678 | <b>2990</b> | 3079 | 3204 | n/a |
-
-
+| [HTMLMinifier page](https://github.com/kangax/html-minifier) | 49 | **37** | 42 | 44 | 43 |
+| [NBC](http://www.nbc.com/) | 91 | **74** | 84 | 86 | 85 |
+| [ES6 table](http://kangax.github.io/es5-compat-table/es6/) | 118 | **80** | 93 | 95 | 94 |
+| [New York Times](http://www.nytimes.com/) | 131 | **101** | 122 | 125 | 120 |
+| [Google](https://www.google.com/) | 133 | **128** | 132 | 135 | 131 |
+| [MSN](http://www.msn.com/) | 157 | **130** | 138 | 145 | 138 |
+| [Stackoverflow](http://stackoverflow.com/) | 200 | **159** | 165 | 174 | 166 |
+| [Amazon](http://www.amazon.com/) | 246 | **204** | 234 | 230 | 219 |
+| [Wikipedia](https://en.wikipedia.org/wiki/President_of_the_United_States) | 401 | **367** | 388 | 400 | n/a |
+| [Eloquent Javascript](http://eloquentjavascript.net/1st_edition/print.html) | 870 | **827** | 840 | 864 | n/a |
+| [ES6 draft](https://tc39.github.io/ecma262/) | 3678 | **2990** | 3079 | 3204 | n/a |
## Options Quick Reference
| `collapseInlineTagWhitespace` | Don't leave any spaces between `display:inline;` elements when collapsing. Must be used in conjunction with `collapseWhitespace=true` | `false` |
| `preserveLineBreaks` | Always collapse to 1 line break (never remove it entirely) when whitespace between tags include a line break. Must be used in conjunction with `collapseWhitespace=true` | `false` |
| `collapseBooleanAttributes` | [Omit attribute values from boolean attributes](http://perfectionkills.com/experimenting-with-html-minifier/#collapse_boolean_attributes) | `false` |
-| `removeTagWhitespace` | Remove space between attributes whenever possible. | `false` |
+| `removeTagWhitespace` | Remove space between attributes whenever possible. **Note that this will result in invalid HTML!** | `false` |
| `removeAttributeQuotes` | [Remove quotes around attributes when possible.](http://perfectionkills.com/experimenting-with-html-minifier/#remove_attribute_quotes) | `false` |
| `removeRedundantAttributes` | [Remove attributes when value matches default.](http://perfectionkills.com/experimenting-with-html-minifier/#remove_redundant_attributes) | `false` |
| `preventAttributesEscaping` | Prevents the escaping of the values of attributes. | `false` |
-| `useShortDoctype` | [Replaces the doctype with the short (HTML5) doctype](http://perfectionkills.com/experimenting-with-html-minifier/#use_short_doctype) | `false` |
+| `useShortDoctype` | [Replaces the `doctype` with the short (HTML5) doctype](http://perfectionkills.com/experimenting-with-html-minifier/#use_short_doctype) | `false` |
| `removeEmptyAttributes` | [Remove all attributes with whitespace-only values](http://perfectionkills.com/experimenting-with-html-minifier/#remove_empty_or_blank_attributes) | `false` |
| `removeScriptTypeAttributes` | Remove `type="text/javascript"` from `script` tags. Other `type` attribute values are left intact. | `false` |
| `removeStyleLinkTypeAttributes`| Remove `type="text/css"` from `style` and `link` tags. Other `type` attribute values are left intact. | `false` |
-| `removeOptionalTags` | [Remove unrequired tags](http://perfectionkills.com/experimenting-with-html-minifier/#remove_optional_tags) | `false` |
+| `removeOptionalTags` | [Remove optional tags](http://perfectionkills.com/experimenting-with-html-minifier/#remove_optional_tags) | `false` |
| `removeEmptyElements` | [Remove all elements with empty contents](http://perfectionkills.com/experimenting-with-html-minifier/#remove_empty_elements) | `false` |
| `lint` | [Toggle linting](http://perfectionkills.com/experimenting-with-html-minifier/#validate_input_through_html_lint) | `false` |
| `keepClosingSlash` | Keep the trailing slash on singleton elements | `false` |
| `caseSensitive` | Treat attributes in case sensitive manner (useful for custom HTML tags.) | `false` |
-| `minifyJS` | Minify Javascript in script elements and event attributes (uses [UglifyJS](https://github.com/mishoo/UglifyJS2)) | `false` (could be `true`, `false`, `Object` (options)) |
+| `minifyJS` | Minify JavaScript in script elements and event attributes (uses [UglifyJS](https://github.com/mishoo/UglifyJS2)) | `false` (could be `true`, `false`, `Object` (options)) |
| `minifyCSS` | Minify CSS in style elements and style attributes (uses [clean-css](https://github.com/jakubpawlowicz/clean-css)) | `false` (could be `true`, `false`, `Object` (options)) |
| `minifyURLs` | Minify URLs in various attributes (uses [relateurl](https://github.com/stevenvachon/relateurl)) | `false` (could be `Object` (options)) |
| `includeAutoGeneratedTags` | Insert tags generated by HTML parser | `true` |
| `customAttrCollapse` | Regex that specifies custom attribute to strip newlines from (e.g. `/ng\-class/`) | |
| `quoteCharacter` | Type of quote to use for attribute values (' or ") | |
-
## Special cases
### Ignoring chunks of markup
### Working with invalid markup
-HTMLMinifier **can't work with invalid or partial chunks of markup**. This is because it parses markup into a tree structure, then modifies it (removing anything that was specified for removal, ignoring anything that was specified to be ingored, etc.), then it creates a markup out of that tree and returns it.
+HTMLMinifier **can't work with invalid or partial chunks of markup**. This is because it parses markup into a tree structure, then modifies it (removing anything that was specified for removal, ignoring anything that was specified to be ignored, etc.), then it creates a markup out of that tree and returns it.
Input markup (e.g. `<p id="">foo`)
↓
-Internal representation of markup in a form of tree (e.g. `{tag: "p", attr: "id", children: ["foo"] }`)
+Internal representation of markup in a form of tree (e.g. `{ tag: "p", attr: "id", children: ["foo"] }`)
↓
-Transformation of internal representation (e.g. removal of "id" attribute)
+Transformation of internal representation (e.g. removal of `id` attribute)
↓
HTMLMinifier can't know that original markup was only half of the tree; it does its best to try to parse it as a full tree and it loses information about tree being malformed or partial in the beginning. As a result, it can't create a partial/malformed tree at the time of the output.
-
## Installation Instructions
From NPM for use as a command line app:
-```bash
+
+```shell
npm install html-minifier -g
```
From NPM for programmatic use:
-```bash
+
+```shell
npm install html-minifier
```
From Git:
-```bash
+
+```shell
git clone git://github.com/kangax/html-minifier.git
cd html-minifier
npm link .
```
-
## Usage
For command line usage please see `html-minifier --help`
result; // '<p title=blah id=moo>foo</p>'
```
-
## Running benchmarks
Benchmarks for minified HTML:
-```
+
+```shell
node benchmark.js
```