Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/bleargh45/css-minifier-xs

XS based CSS minifier
https://github.com/bleargh45/css-minifier-xs

css-minifier minification minifier minify-css perl xs

Last synced: about 1 month ago
JSON representation

XS based CSS minifier

Awesome Lists containing this project

README

        

# NAME

CSS::Minifier::XS - XS based CSS minifier

# SYNOPSIS

```perl
use CSS::Minifier::XS qw(minify);
my $css = '...';
my $minified = minify($css);
```

# DESCRIPTION

`CSS::Minifier::XS` is a CSS "minifier"; its designed to remove unnecessary
whitespace and comments from CSS files, while also **not** breaking the CSS.

`CSS::Minifier::XS` is similar in function to `CSS::Minifier`, but is
substantially faster as its written in XS and not just pure Perl.

# METHODS

- minify($css)

Minifies the given `$css`, returning the minified CSS back to the caller.

# HOW IT WORKS

`CSS::Minifier::XS` minifies the CSS by removing unnecessary whitespace from
CSS documents. Comment blocks are also removed, _except_ when (a) they
contain the word "copyright" in them, or (b) they're needed to implement the
"Mac/IE Comment Hack".

Internally, the minification is done by taking multiple passes through the CSS
document:

## Pass 1: Tokenize

First, we go through and parse the CSS document into a series of tokens
internally. The tokenizing process **does not** check to make sure that you've
got syntactically valid CSS, it just breaks up the text into a stream of tokens
suitable for processing by the subsequent stages.

## Pass 2: Collapse

We then march through the token list and collapse certain tokens down to their
smallest possible representation. _If_ they're still included in the final
results we only want to include them at their shortest.

- Whitespace

Runs of multiple whitespace characters are reduced down to a single whitespace
character. If the whitespace contains any "end of line" (EOL) characters, then
the end result is the _first_ EOL character encountered. Otherwise, the
result is the first whitespace character in the run.

- Comments

Comments implementing the "Mac/IE Comment Hack" are collapsed down to the
smallest possible comment that would still implement the hack ("/\*\\\*/" to start
the hack, and "/\*\*/" to end it).

- Zero Units

Zero Units (e.g. `0px`) are reduced down to just "0", as the CSS specification
indicates that the unit is not required when its a zero value.

## Pass 3: Pruning

We then go back through the token list and prune and remove unnecessary
tokens.

- Whitespace

Wherever possible, whitespace is removed; before+after comment blocks, and
before+after various symbols/sigils.

- Comments

Comments that either (a) are needed to implement the "Mac/IE Comment Hack", or
that (b) contain the word "copyright" in them are preserved. **All** other
comments are removed.

- Symbols/Sigils

Semi-colons that are immediately followed by a closing brace (e.g. ";}") are
removed; semi-colons are needed to separate multiple declarations, but aren't
required at the end of a group.

- Everything else

We keep everything else; identifiers, quoted literal strings, symbols/sigils,
etc.

## Pass 4: Re-assembly

Lastly, we go back through the token list and re-assemble it all back into a
single CSS string, which is then returned back to the caller.

# AUTHOR

Graham TerMarsch ([email protected])

# COPYRIGHT

Copyright (C) 2007-, Graham TerMarsch. All Rights Reserved.

This is free software; you can redistribute it and/or modify it under the same
license as Perl itself.

# SEE ALSO

`CSS::Minifier`.