CSS compressor written in OCaml

Taddeus Kroes bf099c1049 Bugfix in color conversion %!s(int64=11) %!d(string=hai) anos
dist 675f641463 Updated README some more, added 64-bit pre-compiled binary %!s(int64=11) %!d(string=hai) anos
.gitignore 6ee79d6b7b Cleanup %!s(int64=11) %!d(string=hai) anos
Makefile 675f641463 Updated README some more, added 64-bit pre-compiled binary %!s(int64=11) %!d(string=hai) anos
README.md 675f641463 Updated README some more, added 64-bit pre-compiled binary %!s(int64=11) %!d(string=hai) anos
color_names.ml bf099c1049 Bugfix in color conversion %!s(int64=11) %!d(string=hai) anos
duplicates.ml d36f52bf3f Implemented duplicate declaration pruning %!s(int64=11) %!d(string=hai) anos
lexer.mll aaaf2601ed Fixed support for @-<prefix>-keyframes syntax %!s(int64=11) %!d(string=hai) anos
main.ml 0f0ddfeda0 Forgot newline in usage message %!s(int64=11) %!d(string=hai) anos
parse.ml 70f032a31d Lexer now correctly tracks line numbers + some general cleanup %!s(int64=11) %!d(string=hai) anos
parser.mly 3b7dc07458 Extended 'Simple' selector type to algebraic data types %!s(int64=11) %!d(string=hai) anos
selector.ml 099cdb0189 Renamed a file %!s(int64=11) %!d(string=hai) anos
shorthand.ml 2406d894cf Improved shorthand folding when component expressions are !important %!s(int64=11) %!d(string=hai) anos
simple.ml bf099c1049 Bugfix in color conversion %!s(int64=11) %!d(string=hai) anos
stringify.ml bed50c9bba Minified numbers are now rounded to 2 decimal digits %!s(int64=11) %!d(string=hai) anos
types.ml 43ee471f69 Changed main function for minimal command-line usage (just simple minification operations, for now) %!s(int64=11) %!d(string=hai) anos
util.ml 5003457c8a Added --sort option %!s(int64=11) %!d(string=hai) anos

README.md

About

mincss is an extendible CSS minifier written in OCaml. It features a complete parser for the CSS3 language, along with type definitions that are consistent with the official CSS specification and a traversal utility function for use in transformation passes.

Installation

For now, there is no easy installation option for mincss (yet). A pre-built 64-bit ELF binary is available for download here. You can also build the binary from source (see Building mincss below).

Features

Whitespace compression

a,                                  |  a,.myclass [class~="foo"]>p{color:#fff}
.myclass [class ~= "foo"] >  p {    |
    color: #fff;                    |
}                                   |

Compression of simple expressions

color: white;                       |  color: #fff;
font-weight: normal;                |  font-weight: 400;

Generation of shorthand properties

font-weight: normal;                |  font: normal 12px/15px sans-serif;
font-size: 12px;                    |
line-height: 15px;                  |
font-family: sans-serif;            |

Any existing shorthands are first unfolded into their non-shorthand counterparts, after which the last value is used for shorthand generation:

font: normal 12px/15px sans-serif;  |  font: bold 12px/15px sans-serif;
font-weight: bold;                  |

Sorting declarations

The --sort command-line option sorts declarations alphabetically. This option is disabled by default since it does not affect file size.

Command-line interface

Output of mincss -h:

Usage: ./mincss [<options>] [<file> ...]

Generic options:
 -h, --help        Show this help message
 -v, --verbose     Verbose mode: show compression rate
 -o <file>         Output file (defaults to stdout)
 <file> ...        Input files (default is to read from stdin)

Optimization flags (if none are specified, all are enabled):
 -w, --whitespace  Eliminate unnecessary whitespaces (has the greatest effect, omit for pretty-printing)
 -c, --simple      Shorten colors and font weights
 -s, --shorthands  Generate shorthand properties
 -d, --duplicates  Prune duplicate properties (WARNING: may affect cross-browser hacks)
 -p, --pretty      Shorthand for -c -s -d
 -e, --echo        Just parse and pretty-print, no optimizations

Formatting options:
 --sort            Sort declarations in each selector group

Building mincss

Dependencies are OCaml 4.0 and menhir.

Bootstrapping on a Debian system can be done as follows:

$ sudo apt-get install ocaml opam git
$ opam init
$ opam switch 4.01.0
$ opam install menhir
$ git clone git@github.com:taddeus/mincss.git
$ cd mincss
$ make
$ ./mincss --help