Index: third_party/json_minify/minify_json.py |
diff --git a/third_party/json_minify/minify_json.py b/third_party/json_minify/minify_json.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..59e968926c4da8b63aa206d0d38ba89efa73f6cd |
--- /dev/null |
+++ b/third_party/json_minify/minify_json.py |
@@ -0,0 +1,113 @@ |
+# Use of this source code is governed by a BSD-style license (MIT) |
+''' |
+Created on 20/01/2011 |
+ |
+v0.1 (C) Gerald Storer |
+MIT License |
+ |
+Based on JSON.minify.js: |
+https://github.com/getify/JSON.minify |
+''' |
+ |
+import re |
+ |
+def json_minify(json,strip_space=True): |
+ tokenizer=re.compile('"|(/\*)|(\*/)|(//)|\n|\r') |
+ in_string = False |
+ in_multiline_comment = False |
+ in_singleline_comment = False |
+ |
+ new_str = [] |
+ from_index = 0 # from is a keyword in Python |
+ |
+ for match in re.finditer(tokenizer,json): |
+ |
+ if not in_multiline_comment and not in_singleline_comment: |
+ tmp2 = json[from_index:match.start()] |
+ if not in_string and strip_space: |
+ tmp2 = re.sub('[ \t\n\r]*','',tmp2) # replace only white space defined in standard |
+ new_str.append(tmp2) |
+ |
+ from_index = match.end() |
+ |
+ if match.group() == '"' and not in_multiline_comment and not in_singleline_comment: |
+ escaped = re.search('(\\\\)*$',json[:match.start()]) |
+ if not in_string or escaped is None or len(escaped.group()) % 2 == 0: |
+ # start of string with ", or unescaped " character found to end string |
+ in_string = not in_string |
+ from_index -= 1 # include " character in next catch |
+ |
+ elif match.group() == '/*' and not in_string and not in_multiline_comment and not in_singleline_comment: |
+ in_multiline_comment = True |
+ elif match.group() == '*/' and not in_string and in_multiline_comment and not in_singleline_comment: |
+ in_multiline_comment = False |
+ elif match.group() == '//' and not in_string and not in_multiline_comment and not in_singleline_comment: |
+ in_singleline_comment = True |
+ elif (match.group() == '\n' or match.group() == '\r') and not in_string and not in_multiline_comment and in_singleline_comment: |
+ in_singleline_comment = False |
+ elif not in_multiline_comment and not in_singleline_comment and ( |
+ match.group() not in ['\n','\r',' ','\t'] or not strip_space): |
+ new_str.append(match.group()) |
+ |
+ new_str.append(json[from_index:]) |
+ return ''.join(new_str) |
+ |
+if __name__ == '__main__': |
+ import json # requires Python 2.6+ to run tests |
+ |
+ def test_json(s): |
+ return json.loads(json_minify(s)) |
+ |
+ test1 = '''// this is a JSON file with comments |
+{ |
+ "foo": "bar", // this is cool |
+ "bar": [ |
+ "baz", "bum", "zam" |
+ ], |
+/* the rest of this document is just fluff |
+ in case you are interested. */ |
+ "something": 10, |
+ "else": 20 |
+} |
+ |
+/* NOTE: You can easily strip the whitespace and comments |
+ from such a file with the JSON.minify() project hosted |
+ here on github at http://github.com/getify/JSON.minify |
+*/ |
+''' |
+ |
+ test1_res = '''{"foo":"bar","bar":["baz","bum","zam"],"something":10,"else":20}''' |
+ |
+ test2 = ''' |
+{"/*":"*/","//":"",/*"//"*/"/*/":// |
+"//"} |
+ |
+''' |
+ test2_res = '''{"/*":"*/","//":"","/*/":"//"}''' |
+ |
+ test3 = r'''/* |
+this is a |
+multi line comment */{ |
+ |
+"foo" |
+: |
+ "bar/*"// something |
+ , "b\"az":/* |
+something else */"blah" |
+ |
+} |
+''' |
+ test3_res = r'''{"foo":"bar/*","b\"az":"blah"}''' |
+ |
+ test4 = r'''{"foo": "ba\"r//", "bar\\": "b\\\"a/*z", |
+ "baz\\\\": /* yay */ "fo\\\\\"*/o" |
+} |
+''' |
+ test4_res = r'''{"foo":"ba\"r//","bar\\":"b\\\"a/*z","baz\\\\":"fo\\\\\"*/o"}''' |
+ |
+ assert test_json(test1) == json.loads(test1_res),'Failed test 1' |
+ assert test_json(test2) == json.loads(test2_res),'Failed test 2' |
+ assert test_json(test3) == json.loads(test3_res),'Failed test 3' |
+ assert test_json(test4) == json.loads(test4_res),'Failed test 4' |
+ if __debug__: # Don't print passed message if the asserts didn't run |
+ print 'Passed all tests' |