150 lines
5.5 KiB
Plaintext
150 lines
5.5 KiB
Plaintext
.. license:
|
|
Copyright 2011 - 2013
|
|
André Malo or his licensors, as applicable
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
|
|
|
|
==============================
|
|
rJSmin - Javascript Minifier
|
|
==============================
|
|
|
|
|**rJSmin**| is a javascript minifier written in python.
|
|
|
|
The minifier is based on the semantics of `jsmin.c by Douglas Crockford`_\.
|
|
|
|
The module is a re-implementation aiming for :doc:`speed <benchmark>`, so it
|
|
can be used at runtime (rather than during a preprocessing step). Usually it
|
|
produces the same results as the original ``jsmin.c``. It differs in the
|
|
following ways:
|
|
|
|
- there is no error detection: unterminated string, regex and comment
|
|
literals are treated as regular javascript code and minified as such.
|
|
- Control characters inside string and regex literals are left untouched; they
|
|
are not converted to spaces (nor to \n)
|
|
- Newline characters are not allowed inside string and regex literals, except
|
|
for line continuations in string literals (ECMA-5).
|
|
- "``return /regex/``" is recognized correctly.
|
|
- "``+ +``" and "``- -``" sequences are not collapsed to '``++``' or
|
|
'``--``'
|
|
- Newlines before ``!`` operators are removed more sensibly
|
|
- |rJSmin| does not handle streams, but only complete strings. (However, the
|
|
module provides a "streamy" interface).
|
|
|
|
Since most parts of the logic are handled by the regex engine it's way
|
|
faster than the original python port of ``jsmin.c`` by Baruch Even. The speed
|
|
factor varies between about 6 and 55 depending on input and python version
|
|
(it gets faster the more compressed the input already is). Compared to the
|
|
speed-refactored python port by Dave St.Germain the performance gain is less
|
|
dramatic but still between 1.2 and 7.
|
|
|
|
|rjsmin| comes with an optional C-reimplementation of the python/regex
|
|
implementation, which speeds up the minifying process even more.
|
|
|
|
|rjsmin| works with both python 2 (starting with python 2.4) and python 3.
|
|
|
|
.. _jsmin.c by Douglas Crockford: http://www.crockford.com/javascript/jsmin.c
|
|
|
|
|
|
Documentation
|
|
~~~~~~~~~~~~~
|
|
|
|
A :rjsmin:`generated API documentation </>` is available. But you can
|
|
just look into the module. It provides a simple function, called
|
|
``jsmin`` which takes the script as a string and returns the minified
|
|
script as a string.
|
|
|
|
The module additionally provides a "streamy" interface similar to the
|
|
one jsmin.c provides:
|
|
|
|
.. sourcecode:: console
|
|
|
|
$ python -mrjsmin <script >minified
|
|
|
|
|
|
Development Status
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
|rjsmin| is stable.
|
|
|
|
|
|
License
|
|
~~~~~~~
|
|
|
|
|rjsmin| is available under the terms and conditions of the "Apache License,
|
|
Version 2.0." You'll find the detailed licensing terms in the root
|
|
directory of the source distribution package or online at
|
|
`http://www.apache.org/licenses/LICENSE-2.0
|
|
<http://www.apache.org/licenses/LICENSE-2.0>`_.
|
|
|
|
|
|
.. placeholder: Download
|
|
|
|
|
|
Author Information
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
|rjsmin| was written and is maintained by André Malo.
|
|
|
|
|
|
Acknowledgements
|
|
----------------
|
|
|
|
- `Douglas Crockford <http://www.crockford.com/>`_
|
|
- `Jeffrey Friedl <http://regex.info/>`_
|
|
|
|
|
|
Trivia / Fun
|
|
~~~~~~~~~~~~
|
|
|
|
|rJSmin| is a single pass substitution using a simple regular expression,
|
|
which looks like this:
|
|
|
|
.. sourcecode:: text
|
|
|
|
pattern = (
|
|
r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?'
|
|
r'\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|'
|
|
r'\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?{};\r\n])(?'
|
|
r':[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*'
|
|
r'(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*'
|
|
r'[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:('
|
|
r'?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\['
|
|
r'\r\n]*)*/)[^\047"/\000-\040]*)|(?<=[\000-#%-,./:-@\[-^`{-~-]return'
|
|
r')(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/'
|
|
r'))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:'
|
|
r'/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?'
|
|
r':(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/'
|
|
r'\\\[\r\n]*)*/)[^\047"/\000-\040]*)|(?<=[^\000-!#%&(*,./:-@\[\\^`{|'
|
|
r'~])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)'
|
|
r'*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016-\040]'
|
|
r'|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#%-\047)*,./'
|
|
r':-@\\-^`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\013\01'
|
|
r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./:'
|
|
r'-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*'
|
|
r'\*+(?:[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\013\014\016-'
|
|
r'\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:[\000-\011\013'
|
|
r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+|(?:(?:(?://[^'
|
|
r'\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^'
|
|
r'/*][^*]*\*+)*/))*)+'
|
|
)
|
|
|
|
|
|
Related
|
|
~~~~~~~
|
|
|
|
- `CSS Minifier rCSSmin <http://opensource.perlig.de/rcssmin/>`_
|
|
|
|
|
|
.. vim: ft=rest tw=72
|