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
9 def _Rcount(string
, chars
):
10 '''Returns the number of consecutive characters from |chars| that occur at the
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).
19 min_index
, min_key
= (-1, None)
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
):
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))
34 return start_range
+ 1
35 output
.append(input[start
: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
)
43 output
.append(eol_token
)
44 return eol_token_index
+ len(eol_token
)
53 while pos
< len(input):
54 token_index
, token
= _FindNextToken(input, token_actions
.keys(), pos
)
56 output
.append(input[pos
:])
58 output
.append(input[pos
:token_index
])
59 pos
= token_actions
[token
](input, token_index
+ len(token
), output
)
60 return ''.join(output
)