Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(539)

Side by Side Diff: third_party/WebKit/Source/build/scripts/minimize_css.py

Issue 2088123002: Minimize bundled user-agent CSS: html.css (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright 2016 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 import functools
7 import os.path
8 import re
9 import sys
10
11 import in_generator
12
13
14 class CSSMinimizer(object):
15
16 INITIAL = 0
17 MAYBE_COMMENT_START = 1
18 INSIDE_COMMENT = 2
19 MAYBE_COMMENT_END = 3
20 INSIDE_SINGLE_QUOTE = 4
21 INSIDE_SINGLE_QUOTE_ESCAPE = 5
22 INSIDE_DOUBLE_QUOTE = 6
23 INSIDE_DOUBLE_QUOTE_ESCAPE = 7
24
25 def __init__(self):
26 self._output = ''
27 self._codeblock = ''
28
29 def flush_codeblock(self):
30 stripped = re.sub(r"\s+", ' ', self._codeblock)
31 stripped = re.sub(r";?\s*(?P<op>[{};])\s*", r'\g<op>', stripped)
32 self._output += stripped
33 self._codeblock = ''
34
35 def parse(self, content):
36 state = self.INITIAL
37 for char in content:
38 if state == self.INITIAL:
39 if char == '/':
40 state = self.MAYBE_COMMENT_START
41 elif char == "'":
42 self.flush_codeblock()
43 self._output += char
44 state = self.INSIDE_SINGLE_QUOTE
45 elif char == '"':
46 self.flush_codeblock()
47 self._output += char
48 state = self.INSIDE_DOUBLE_QUOTE
49 else:
50 self._codeblock += char
51 elif state == self.MAYBE_COMMENT_START:
52 if char == '*':
53 self.flush_codeblock()
54 state = self.INSIDE_COMMENT
55 else:
56 self._codeblock += '/' + char
57 state = self.INITIAL
58 elif state == self.INSIDE_COMMENT:
59 if char == '*':
60 state = self.MAYBE_COMMENT_END
61 else:
62 pass
63 elif state == self.MAYBE_COMMENT_END:
64 if char == '/':
65 state = self.INITIAL
66 else:
67 state = self.INSIDE_COMMENT
68 elif state == self.INSIDE_SINGLE_QUOTE:
69 if char == '\\':
70 self._output += char
71 state = self.INSIDE_SINGLE_QUOTE_ESCAPE
72 elif char == "'":
73 self._output += char
74 state = self.INITIAL
75 else:
76 self._output += char
77 elif state == self.INSIDE_SINGLE_QUOTE_ESCAPE:
78 self._output += char
79 state = self.INSIDE_SINGLE_QUOTE
80 elif state == self.INSIDE_DOUBLE_QUOTE:
81 if char == '\\':
82 self._output += char
83 state = self.INSIDE_DOUBLE_QUOTE_ESCAPE
84 elif char == '"':
85 self._output += char
86 state = self.INITIAL
87 else:
88 self._output += char
89 elif state == self.INSIDE_DOUBLE_QUOTE_ESCAPE:
90 self._output += char
91 state = self.INSIDE_DOUBLE_QUOTE
92
93 self.flush_codeblock()
94 self._output = self._output.strip()
95 return self._output
96
97 @classmethod
98 def minimize_css(cls, content):
99 minimizer = CSSMinimizer()
100 return minimizer.parse(content)
101
102
103 class CSSMinimizerWriter(in_generator.GenericWriter):
104
105 def __init__(self, in_file_paths):
106 super(CSSMinimizerWriter, self).__init__(in_file_paths)
107
108 self._outputs = {}
109 for in_file_path in in_file_paths:
110 out_path = os.path.basename(in_file_path)
111 self._outputs[out_path] = functools.partial(self.generate_implementa tion, in_file_path)
112
113 def generate_implementation(self, in_file_path):
114 content = ''
115 with open(os.path.abspath(in_file_path)) as in_file:
116 content = in_file.read()
117 return CSSMinimizer.minimize_css(content)
118
119
120 if __name__ == '__main__':
121 in_generator.Maker(CSSMinimizerWriter).main(sys.argv)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698