Index: tracing/third_party/tvcm/third_party/rcssmin/rcssmin.py |
diff --git a/tracing/third_party/tvcm/third_party/rcssmin/rcssmin.py b/tracing/third_party/tvcm/third_party/rcssmin/rcssmin.py |
deleted file mode 100644 |
index ae1cefc3396be21ef861d9bda163c69b3be50433..0000000000000000000000000000000000000000 |
--- a/tracing/third_party/tvcm/third_party/rcssmin/rcssmin.py |
+++ /dev/null |
@@ -1,374 +0,0 @@ |
-#!/usr/bin/env python |
-# -*- coding: ascii -*- |
-r""" |
-============== |
- CSS Minifier |
-============== |
- |
-CSS Minifier. |
- |
-The minifier is based on the semantics of the `YUI compressor`_\\, which |
-itself is based on `the rule list by Isaac Schlueter`_\\. |
- |
-:Copyright: |
- |
- Copyright 2011 - 2014 |
- Andr\xe9 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. |
- |
-This module is a re-implementation aiming for speed instead of maximum |
-compression, so it can be used at runtime (rather than during a preprocessing |
-step). RCSSmin does syntactical compression only (removing spaces, comments |
-and possibly semicolons). It does not provide semantic compression (like |
-removing empty blocks, collapsing redundant properties etc). It does, however, |
-support various CSS hacks (by keeping them working as intended). |
- |
-Here's a feature list: |
- |
-- Strings are kept, except that escaped newlines are stripped |
-- Space/Comments before the very end or before various characters are |
- stripped: ``:{});=>+],!`` (The colon (``:``) is a special case, a single |
- space is kept if it's outside a ruleset.) |
-- Space/Comments at the very beginning or after various characters are |
- stripped: ``{}(=:>+[,!`` |
-- Optional space after unicode escapes is kept, resp. replaced by a simple |
- space |
-- whitespaces inside ``url()`` definitions are stripped |
-- Comments starting with an exclamation mark (``!``) can be kept optionally. |
-- All other comments and/or whitespace characters are replaced by a single |
- space. |
-- Multiple consecutive semicolons are reduced to one |
-- The last semicolon within a ruleset is stripped |
-- CSS Hacks supported: |
- |
- - IE7 hack (``>/**/``) |
- - Mac-IE5 hack (``/*\\*/.../**/``) |
- - The boxmodelhack is supported naturally because it relies on valid CSS2 |
- strings |
- - Between ``:first-line`` and the following comma or curly brace a space is |
- inserted. (apparently it's needed for IE6) |
- - Same for ``:first-letter`` |
- |
-rcssmin.c is a reimplementation of rcssmin.py in C and improves runtime up to |
-factor 100 or so (depending on the input). docs/BENCHMARKS in the source |
-distribution contains the details. |
- |
-Both python 2 (>= 2.4) and python 3 are supported. |
- |
-.. _YUI compressor: https://github.com/yui/yuicompressor/ |
- |
-.. _the rule list by Isaac Schlueter: https://github.com/isaacs/cssmin/ |
-""" |
-if __doc__: |
- # pylint: disable = W0622 |
- __doc__ = __doc__.encode('ascii').decode('unicode_escape') |
-__author__ = r"Andr\xe9 Malo".encode('ascii').decode('unicode_escape') |
-__docformat__ = "restructuredtext en" |
-__license__ = "Apache License, Version 2.0" |
-__version__ = '1.0.5' |
-__all__ = ['cssmin'] |
- |
-import re as _re |
- |
- |
-def _make_cssmin(python_only=False): |
- """ |
- Generate CSS minifier. |
- |
- :Parameters: |
- `python_only` : ``bool`` |
- Use only the python variant. If true, the c extension is not even |
- tried to be loaded. |
- |
- :Return: Minifier |
- :Rtype: ``callable`` |
- """ |
- # pylint: disable = R0912, R0914, W0612 |
- |
- if not python_only: |
- try: |
- import _rcssmin |
- except ImportError: |
- pass |
- else: |
- return _rcssmin.cssmin |
- |
- nl = r'(?:[\n\f]|\r\n?)' # pylint: disable = C0103 |
- spacechar = r'[\r\n\f\040\t]' |
- |
- unicoded = r'[0-9a-fA-F]{1,6}(?:[\040\n\t\f]|\r\n?)?' |
- escaped = r'[^\n\r\f0-9a-fA-F]' |
- escape = r'(?:\\(?:%(unicoded)s|%(escaped)s))' % locals() |
- |
- nmchar = r'[^\000-\054\056\057\072-\100\133-\136\140\173-\177]' |
- #nmstart = r'[^\000-\100\133-\136\140\173-\177]' |
- #ident = (r'(?:' |
- # r'-?(?:%(nmstart)s|%(escape)s)%(nmchar)s*(?:%(escape)s%(nmchar)s*)*' |
- #r')') % locals() |
- |
- comment = r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)' |
- |
- # only for specific purposes. The bang is grouped: |
- _bang_comment = r'(?:/\*(!?)[^*]*\*+(?:[^/*][^*]*\*+)*/)' |
- |
- string1 = \ |
- r'(?:\047[^\047\\\r\n\f]*(?:\\[^\r\n\f][^\047\\\r\n\f]*)*\047)' |
- string2 = r'(?:"[^"\\\r\n\f]*(?:\\[^\r\n\f][^"\\\r\n\f]*)*")' |
- strings = r'(?:%s|%s)' % (string1, string2) |
- |
- nl_string1 = \ |
- r'(?:\047[^\047\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^\047\\\r\n\f]*)*\047)' |
- nl_string2 = r'(?:"[^"\\\r\n\f]*(?:\\(?:[^\r]|\r\n?)[^"\\\r\n\f]*)*")' |
- nl_strings = r'(?:%s|%s)' % (nl_string1, nl_string2) |
- |
- uri_nl_string1 = r'(?:\047[^\047\\]*(?:\\(?:[^\r]|\r\n?)[^\047\\]*)*\047)' |
- uri_nl_string2 = r'(?:"[^"\\]*(?:\\(?:[^\r]|\r\n?)[^"\\]*)*")' |
- uri_nl_strings = r'(?:%s|%s)' % (uri_nl_string1, uri_nl_string2) |
- |
- nl_escaped = r'(?:\\%(nl)s)' % locals() |
- |
- space = r'(?:%(spacechar)s|%(comment)s)' % locals() |
- |
- ie7hack = r'(?:>/\*\*/)' |
- |
- uri = (r'(?:' |
- # noqa pylint: disable = C0330 |
- r'(?:[^\000-\040"\047()\\\177]*' |
- r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*)' |
- r'(?:' |
- r'(?:%(spacechar)s+|%(nl_escaped)s+)' |
- r'(?:' |
- r'(?:[^\000-\040"\047()\\\177]|%(escape)s|%(nl_escaped)s)' |
- r'[^\000-\040"\047()\\\177]*' |
- r'(?:%(escape)s[^\000-\040"\047()\\\177]*)*' |
- r')+' |
- r')*' |
- r')') % locals() |
- |
- nl_unesc_sub = _re.compile(nl_escaped).sub |
- |
- uri_space_sub = _re.compile(( |
- r'(%(escape)s+)|%(spacechar)s+|%(nl_escaped)s+' |
- ) % locals()).sub |
- uri_space_subber = lambda m: m.groups()[0] or '' |
- |
- space_sub_simple = _re.compile(( |
- r'[\r\n\f\040\t;]+|(%(comment)s+)' |
- ) % locals()).sub |
- space_sub_banged = _re.compile(( |
- r'[\r\n\f\040\t;]+|(%(_bang_comment)s+)' |
- ) % locals()).sub |
- |
- post_esc_sub = _re.compile(r'[\r\n\f\t]+').sub |
- |
- main_sub = _re.compile(( |
- # noqa pylint: disable = C0330 |
- r'([^\\"\047u>@\r\n\f\040\t/;:{}]+)' |
- r'|(?<=[{}(=:>+[,!])(%(space)s+)' |
- r'|^(%(space)s+)' |
- r'|(%(space)s+)(?=(([:{});=>+\],!])|$)?)' |
- r'|;(%(space)s*(?:;%(space)s*)*)(?=(\})?)' |
- r'|(\{)' |
- r'|(\})' |
- r'|(%(strings)s)' |
- r'|(?<!%(nmchar)s)url\(%(spacechar)s*(' |
- r'%(uri_nl_strings)s' |
- r'|%(uri)s' |
- r')%(spacechar)s*\)' |
- r'|(@(?:' |
- r'[mM][eE][dD][iI][aA]' |
- r'|[sS][uU][pP][pP][oO][rR][tT][sS]' |
- r'|[dD][oO][cC][uU][mM][eE][nN][tT]' |
- r'|(?:-(?:' |
- r'[wW][eE][bB][kK][iI][tT]|[mM][oO][zZ]|[oO]|[mM][sS]' |
- r')-)?' |
- r'[kK][eE][yY][fF][rR][aA][mM][eE][sS]' |
- r'))(?!%(nmchar)s)' |
- r'|(%(ie7hack)s)(%(space)s*)' |
- r'|(:[fF][iI][rR][sS][tT]-[lL]' |
- r'(?:[iI][nN][eE]|[eE][tT][tT][eE][rR]))' |
- r'(%(space)s*)(?=[{,])' |
- r'|(%(nl_strings)s)' |
- r'|(%(escape)s[^\\"\047u>@\r\n\f\040\t/;:{}]*)' |
- ) % locals()).sub |
- |
- #print main_sub.__self__.pattern |
- |
- def main_subber(keep_bang_comments): |
- """ Make main subber """ |
- in_macie5, in_rule, at_group = [0], [0], [0] |
- |
- if keep_bang_comments: |
- space_sub = space_sub_banged |
- |
- def space_subber(match): |
- """ Space|Comment subber """ |
- if match.lastindex: |
- group1, group2 = match.group(1, 2) |
- if group2: |
- if group1.endswith(r'\*/'): |
- in_macie5[0] = 1 |
- else: |
- in_macie5[0] = 0 |
- return group1 |
- elif group1: |
- if group1.endswith(r'\*/'): |
- if in_macie5[0]: |
- return '' |
- in_macie5[0] = 1 |
- return r'/*\*/' |
- elif in_macie5[0]: |
- in_macie5[0] = 0 |
- return '/**/' |
- return '' |
- else: |
- space_sub = space_sub_simple |
- |
- def space_subber(match): |
- """ Space|Comment subber """ |
- if match.lastindex: |
- if match.group(1).endswith(r'\*/'): |
- if in_macie5[0]: |
- return '' |
- in_macie5[0] = 1 |
- return r'/*\*/' |
- elif in_macie5[0]: |
- in_macie5[0] = 0 |
- return '/**/' |
- return '' |
- |
- def fn_space_post(group): |
- """ space with token after """ |
- if group(5) is None or ( |
- group(6) == ':' and not in_rule[0] and not at_group[0]): |
- return ' ' + space_sub(space_subber, group(4)) |
- return space_sub(space_subber, group(4)) |
- |
- def fn_semicolon(group): |
- """ ; handler """ |
- return ';' + space_sub(space_subber, group(7)) |
- |
- def fn_semicolon2(group): |
- """ ; handler """ |
- if in_rule[0]: |
- return space_sub(space_subber, group(7)) |
- return ';' + space_sub(space_subber, group(7)) |
- |
- def fn_open(_): |
- """ { handler """ |
- if at_group[0]: |
- at_group[0] -= 1 |
- else: |
- in_rule[0] = 1 |
- return '{' |
- |
- def fn_close(_): |
- """ } handler """ |
- in_rule[0] = 0 |
- return '}' |
- |
- def fn_at_group(group): |
- """ @xxx group handler """ |
- at_group[0] += 1 |
- return group(13) |
- |
- def fn_ie7hack(group): |
- """ IE7 Hack handler """ |
- if not in_rule[0] and not at_group[0]: |
- in_macie5[0] = 0 |
- return group(14) + space_sub(space_subber, group(15)) |
- return '>' + space_sub(space_subber, group(15)) |
- |
- table = ( |
- # noqa pylint: disable = C0330 |
- None, |
- None, |
- None, |
- None, |
- fn_space_post, # space with token after |
- fn_space_post, # space with token after |
- fn_space_post, # space with token after |
- fn_semicolon, # semicolon |
- fn_semicolon2, # semicolon |
- fn_open, # { |
- fn_close, # } |
- lambda g: g(11), # string |
- lambda g: 'url(%s)' % uri_space_sub(uri_space_subber, g(12)), |
- # url(...) |
- fn_at_group, # @xxx expecting {...} |
- None, |
- fn_ie7hack, # ie7hack |
- None, |
- lambda g: g(16) + ' ' + space_sub(space_subber, g(17)), |
- # :first-line|letter followed |
- # by [{,] (apparently space |
- # needed for IE6) |
- lambda g: nl_unesc_sub('', g(18)), # nl_string |
- lambda g: post_esc_sub(' ', g(19)), # escape |
- ) |
- |
- def func(match): |
- """ Main subber """ |
- idx, group = match.lastindex, match.group |
- if idx > 3: |
- return table[idx](group) |
- |
- # shortcuts for frequent operations below: |
- elif idx == 1: # not interesting |
- return group(1) |
- #else: # space with token before or at the beginning |
- return space_sub(space_subber, group(idx)) |
- |
- return func |
- |
- def cssmin(style, keep_bang_comments=False): # pylint: disable = W0621 |
- """ |
- Minify CSS. |
- |
- :Parameters: |
- `style` : ``str`` |
- CSS to minify |
- |
- `keep_bang_comments` : ``bool`` |
- Keep comments starting with an exclamation mark? (``/*!...*/``) |
- |
- :Return: Minified style |
- :Rtype: ``str`` |
- """ |
- return main_sub(main_subber(keep_bang_comments), style) |
- |
- return cssmin |
- |
-cssmin = _make_cssmin() |
- |
- |
-if __name__ == '__main__': |
- def main(): |
- """ Main """ |
- import sys as _sys |
- keep_bang_comments = ( |
- '-b' in _sys.argv[1:] |
- or '-bp' in _sys.argv[1:] |
- or '-pb' in _sys.argv[1:] |
- ) |
- if '-p' in _sys.argv[1:] or '-bp' in _sys.argv[1:] \ |
- or '-pb' in _sys.argv[1:]: |
- global cssmin # pylint: disable = W0603 |
- cssmin = _make_cssmin(python_only=True) |
- _sys.stdout.write(cssmin( |
- _sys.stdin.read(), keep_bang_comments=keep_bang_comments |
- )) |
- main() |