2 # Copyright (c) 2012 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.
6 '''Utility to remove comments from JSON files so that they can be parsed by
13 def _Rcount(string
, chars
):
14 '''Returns the number of consecutive characters from |chars| that occur at the
17 return len(string
) - len(string
.rstrip(chars
))
20 def _FindNextToken(string
, tokens
, start
):
21 '''Finds the next token in |tokens| that occurs in |string| from |start|.
22 Returns a tuple (index, token key).
24 min_index
, min_key
= (-1, None)
26 index
= string
.find(k
, start
)
27 if index
!= -1 and (min_index
== -1 or index
< min_index
):
28 min_index
, min_key
= (index
, k
)
29 return (min_index
, min_key
)
32 def _ReadString(input, start
, output
):
34 start_range
, end_range
= (start
, input.find('"', start
))
35 # \" escapes the ", \\" doesn't, \\\" does, etc.
36 while (end_range
!= -1 and
37 _Rcount(input[start_range
:end_range
], '\\') % 2 == 1):
38 start_range
, end_range
= (end_range
, input.find('"', end_range
+ 1))
40 return start_range
+ 1
41 output
.append(input[start
:end_range
+ 1])
45 def _ReadComment(input, start
, output
):
46 eol_tokens
= ('\n', '\r')
47 eol_token_index
, eol_token
= _FindNextToken(input, eol_tokens
, start
)
50 output
.append(eol_token
)
51 return eol_token_index
+ len(eol_token
)
53 def _ReadMultilineComment(input, start
, output
):
55 end_token_index
, end_token
= _FindNextToken(input, end_tokens
, start
)
57 raise Exception("Multiline comment end token (*/) not found")
58 return end_token_index
+ len(end_token
)
64 '/*': _ReadMultilineComment
,
68 while pos
< len(input):
69 token_index
, token
= _FindNextToken(input, token_actions
.keys(), pos
)
71 output
.append(input[pos
:])
73 output
.append(input[pos
:token_index
])
74 pos
= token_actions
[token
](input, token_index
+ len(token
), output
)
75 return ''.join(output
)
78 if __name__
== '__main__':
79 sys
.stdout
.write(Nom(sys
.stdin
.read()))