Re-enable index-basics-workers test to see if still times
[chromium-blink-merge.git] / tools / json_comment_eater / json_comment_eater.py
blob85874649980de182f0342da2344c23554fa892dd
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 '''Utility to remove comments from JSON files so that they can be parsed by
6 json.loads.
7 '''
9 def _Rcount(string, chars):
10 '''Returns the number of consecutive characters from |chars| that occur at the
11 end of |string|.
12 '''
13 return len(string) - len(string.rstrip(chars))
15 def _FindNextToken(string, tokens, start):
16 '''Finds the next token in |tokens| that occurs in |string| from |start|.
17 Returns a tuple (index, token key).
18 '''
19 min_index, min_key = (-1, None)
20 for k in tokens:
21 index = string.find(k, start)
22 if index != -1 and (min_index == -1 or index < min_index):
23 min_index, min_key = (index, k)
24 return (min_index, min_key)
26 def _ReadString(input, start, output):
27 output.append('"')
28 start_range, end_range = (start, input.find('"', start))
29 # \" escapes the ", \\" doesn't, \\\" does, etc.
30 while (end_range != -1 and
31 _Rcount(input[start_range:end_range], '\\') % 2 == 1):
32 start_range, end_range = (end_range, input.find('"', end_range + 1))
33 if end_range == -1:
34 return start_range + 1
35 output.append(input[start:end_range + 1])
36 return end_range + 1
38 def _ReadComment(input, start, output):
39 eol_tokens = ('\n', '\r')
40 eol_token_index, eol_token = _FindNextToken(input, eol_tokens, start)
41 if eol_token is None:
42 return len(input)
43 output.append(eol_token)
44 return eol_token_index + len(eol_token)
46 def Nom(input):
47 token_actions = {
48 '"': _ReadString,
49 '//': _ReadComment,
51 output = []
52 pos = 0
53 while pos < len(input):
54 token_index, token = _FindNextToken(input, token_actions.keys(), pos)
55 if token is None:
56 output.append(input[pos:])
57 break
58 output.append(input[pos:token_index])
59 pos = token_actions[token](input, token_index + len(token), output)
60 return ''.join(output)