174 lines
6.5 KiB
Plaintext
174 lines
6.5 KiB
Plaintext
.. copyright:
|
|
Copyright 2011 - 2015
|
|
André Malo or his licensors, as applicable
|
|
|
|
.. license:
|
|
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.
|
|
- Line terminators after regex literals are handled more sensibly.
|
|
- "``+ +``" and "``- -``" sequences are not collapsed to '``++``' or
|
|
'``--``'
|
|
- Newlines before ``!`` operators are removed more sensibly
|
|
- Comments starting with an exclamation mark ('``!``') can be kept optionally
|
|
- |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 3 and 50 (for huge inputs).
|
|
|
|
|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
|
|
|
|
It takes two options:
|
|
|
|
-b Keep bang-comments (Comments starting with an exclamation mark)
|
|
-p Force using the python implementation (not the C implementation)
|
|
|
|
|
|
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
|
|
|
|
|
|
Bugs
|
|
~~~~
|
|
|
|
No bugs, of course. ;-)
|
|
But if you've found one or have an idea how to improve |rjsmin|, feel free
|
|
to send a pull request on `github <https://github.com/ndparker/rjsmin>`_
|
|
or send a mail to <rjsmin-bugs@perlig.de>.
|
|
|
|
|
|
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'|\r?\n|\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?<=[(,=:\[!&|?'
|
|
r'{};\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*'
|
|
r'][^*]*\*+)*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\0'
|
|
r'14\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)*((?:/(?![\r'
|
|
r'\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r'
|
|
r'\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))((?:[\000-\011\013\014'
|
|
r'\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:(?:(?://[^\r'
|
|
r'\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:'
|
|
r'[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;=?\]|}-]))?|(?<=[\00'
|
|
r'0-#%-,./:-@\[-^`{-~-]return)(?:[\000-\011\013\014\016-\040]|(?'
|
|
r':/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]'
|
|
r'))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*'
|
|
r'\*+)*/))*)*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\['
|
|
r'[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/))(('
|
|
r'?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)'
|
|
r'*/))*(?:(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\04'
|
|
r'0]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040&)+,.:;'
|
|
r'=?\]|}-]))?|(?<=[^\000-!#%&(*,./:-@\[\\^`{|~])(?:[\000-\011\01'
|
|
r'3\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*(?:((?:(?:'
|
|
r'//[^\r\n]*)?[\r\n]))(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]'
|
|
r'*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#%-\047)*,./:-@\\-^'
|
|
r'`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-\011\013\014\0'
|
|
r'16-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^\000-#%-,./'
|
|
r':-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|(?:/\*['
|
|
r'^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\013'
|
|
r'\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:['
|
|
r'\000-\011\013\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
|