b0d572c7f1
- Adds schema validation for config file - Adds JSON comment stripping utility
52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
# Copyright (C) 2018 and later: Unicode, Inc. and others.
|
|
# License & terms of use: http://www.unicode.org/copyright.html
|
|
|
|
import io
|
|
|
|
class CommentStripper(object):
|
|
"""Removes lines starting with "//" from a file stream."""
|
|
|
|
def __init__(self, f):
|
|
self.f = f
|
|
self.state = 0
|
|
|
|
def read(self, size=-1):
|
|
bytes = self.f.read(size)
|
|
# TODO: Do we need to read more bytes if comments were stripped
|
|
# in order to obey the size request?
|
|
return "".join(self._strip_comments(bytes))
|
|
|
|
def _strip_comments(self, bytes):
|
|
for byte in bytes:
|
|
if self.state == 0:
|
|
# state 0: start of a line
|
|
if byte == "/":
|
|
self.state = 1
|
|
elif byte == "\n":
|
|
self.state = 0
|
|
yield byte
|
|
else:
|
|
self.state = 2
|
|
yield byte
|
|
elif self.state == 1:
|
|
# state 1: read a single '/'
|
|
if byte == "/":
|
|
self.state = 3
|
|
elif byte == "\n":
|
|
self.state = 0
|
|
yield "/" # the one that was skipped
|
|
yield "\n"
|
|
else:
|
|
self.state = 2
|
|
yield "/" # the one that was skipped
|
|
yield byte
|
|
elif self.state == 2:
|
|
# state 2: middle of a line, no comment
|
|
if byte == "\n":
|
|
self.state = 0
|
|
yield byte
|
|
elif self.state == 3:
|
|
# state 3: inside a comment
|
|
if byte == "\n":
|
|
self.state = 0
|