summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/tools/grit/minimize_css.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/tools/grit/minimize_css.py')
-rw-r--r--third_party/libwebrtc/tools/grit/minimize_css.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/third_party/libwebrtc/tools/grit/minimize_css.py b/third_party/libwebrtc/tools/grit/minimize_css.py
new file mode 100644
index 0000000000..2c3b8aeb1e
--- /dev/null
+++ b/third_party/libwebrtc/tools/grit/minimize_css.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import re
+import sys
+
+class CSSMinimizer(object):
+
+ INITIAL = 0
+ MAYBE_COMMENT_START = 1
+ INSIDE_COMMENT = 2
+ MAYBE_COMMENT_END = 3
+ INSIDE_SINGLE_QUOTE = 4
+ INSIDE_SINGLE_QUOTE_ESCAPE = 5
+ INSIDE_DOUBLE_QUOTE = 6
+ INSIDE_DOUBLE_QUOTE_ESCAPE = 7
+
+ def __init__(self):
+ self._output = ''
+ self._codeblock = ''
+
+ def flush_codeblock(self):
+ stripped = re.sub(r"\s+", ' ', self._codeblock)
+ stripped = re.sub(r";?\s*(?P<op>[{};])\s*", r'\g<op>', stripped)
+ self._output += stripped
+ self._codeblock = ''
+
+ def parse(self, content):
+ state = self.INITIAL
+ for char in content:
+ if state == self.INITIAL:
+ if char == '/':
+ state = self.MAYBE_COMMENT_START
+ elif char == "'":
+ self.flush_codeblock()
+ self._output += char
+ state = self.INSIDE_SINGLE_QUOTE
+ elif char == '"':
+ self.flush_codeblock()
+ self._output += char
+ state = self.INSIDE_DOUBLE_QUOTE
+ else:
+ self._codeblock += char
+ elif state == self.MAYBE_COMMENT_START:
+ if char == '*':
+ self.flush_codeblock()
+ state = self.INSIDE_COMMENT
+ else:
+ self._codeblock += '/' + char
+ state = self.INITIAL
+ elif state == self.INSIDE_COMMENT:
+ if char == '*':
+ state = self.MAYBE_COMMENT_END
+ else:
+ pass
+ elif state == self.MAYBE_COMMENT_END:
+ if char == '/':
+ state = self.INITIAL
+ else:
+ state = self.INSIDE_COMMENT
+ elif state == self.INSIDE_SINGLE_QUOTE:
+ if char == '\\':
+ self._output += char
+ state = self.INSIDE_SINGLE_QUOTE_ESCAPE
+ elif char == "'":
+ self._output += char
+ state = self.INITIAL
+ else:
+ self._output += char
+ elif state == self.INSIDE_SINGLE_QUOTE_ESCAPE:
+ self._output += char
+ state = self.INSIDE_SINGLE_QUOTE
+ elif state == self.INSIDE_DOUBLE_QUOTE:
+ if char == '\\':
+ self._output += char
+ state = self.INSIDE_DOUBLE_QUOTE_ESCAPE
+ elif char == '"':
+ self._output += char
+ state = self.INITIAL
+ else:
+ self._output += char
+ elif state == self.INSIDE_DOUBLE_QUOTE_ESCAPE:
+ self._output += char
+ state = self.INSIDE_DOUBLE_QUOTE
+
+ self.flush_codeblock()
+ self._output = self._output.strip()
+ return self._output
+
+ @classmethod
+ def minimize_css(cls, content):
+ minimizer = CSSMinimizer()
+ return minimizer.parse(content)
+
+def main():
+ result = ''
+ try:
+ result = CSSMinimizer.minimize_css(sys.stdin.read())
+ finally:
+ print(result)
+
+if __name__ == '__main__':
+ main()