--- a/compare_locales/parser.py
+++ b/compare_locales/parser.py
@@ -244,53 +244,54 @@ class Parser(object):
return self.walk(onlyEntities=True)
def walk(self, onlyEntities=False):
if not self.ctx:
# loading file failed, or we just didn't load anything
return
ctx = self.ctx
contents = ctx.contents
+
offset = 0
- entity, offset = self.getEntity(ctx, offset)
+ entity = self.getEntity(ctx, offset)
while entity:
- if (not onlyEntities or
- isinstance(entity, Entity) or
- type(entity) is Junk):
+ offset = entity.span[1]
+
+ if (not onlyEntities or isinstance(entity, (Entity, Junk))):
yield entity
- entity, offset = self.getEntity(ctx, offset)
+
+ entity = self.getEntity(ctx, offset)
+
if len(contents) > offset:
yield Junk(ctx, (offset, len(contents)))
def getEntity(self, ctx, offset):
m = self.reKey.match(ctx.contents, offset)
if m:
- offset = m.end()
entity = self.createEntity(ctx, m)
- return (entity, offset)
+ return entity
m = self.reComment.match(ctx.contents, offset)
if m:
- offset = m.end()
self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(2)])
- return (self.last_comment, offset)
+ return self.last_comment
return self.getTrailing(ctx, offset, self.reKey, self.reComment)
def getTrailing(self, ctx, offset, *expressions):
junkend = None
for exp in expressions:
m = exp.search(ctx.contents, offset)
if m:
junkend = min(junkend, m.start()) if junkend else m.start()
if junkend is None:
if self.tail.match(ctx.contents, offset):
white_end = len(ctx.contents)
- return (Whitespace(ctx, (offset, white_end)), white_end)
+ return Whitespace(ctx, (offset, white_end))
else:
- return (None, offset)
- return (Junk(ctx, (offset, junkend)), junkend)
+ return None
+ return Junk(ctx, (offset, junkend))
def createEntity(self, ctx, m):
pre_comment = self.last_comment
self.last_comment = None
return Entity(ctx, pre_comment,
*[m.span(i) for i in xrange(4)])
@classmethod
@@ -371,24 +372,23 @@ class DTDParser(Parser):
Overload Parser.getEntity to special-case ParsedEntities.
Just check for a parsed entity if that method claims junk.
<!ENTITY % foo SYSTEM "url">
%foo;
'''
if offset is 0 and self.reHeader.match(ctx.contents):
offset += 1
- entity, inneroffset = Parser.getEntity(self, ctx, offset)
+ entity = Parser.getEntity(self, ctx, offset)
if (entity and isinstance(entity, Junk)) or entity is None:
m = self.rePE.match(ctx.contents, offset)
if m:
- inneroffset = m.end()
self.last_comment = None
entity = DTDEntity(ctx, '', *[m.span(i) for i in xrange(4)])
- return (entity, inneroffset)
+ return entity
def createEntity(self, ctx, m):
valspan = m.span('val')
valspan = (valspan[0]+1, valspan[1]-1)
pre_comment = self.last_comment
self.last_comment = None
return DTDEntity(ctx, pre_comment,
m.span(),
@@ -433,17 +433,17 @@ class PropertiesParser(Parser):
m = self._trailingWS.match(contents, offset)
if not m:
break
offset = m.end()
# Extend the 0th span (the whole match) to the end of the trailing
# whitespace.
spans[0] = (spans[0][0], offset)
self.last_comment = Comment(ctx, *spans)
- return (self.last_comment, offset)
+ return self.last_comment
m = self.reKey.match(contents, offset)
if m:
startline = offset = m.end()
while True:
endval = nextline = contents.find('\n', offset)
if nextline == -1:
endval = offset = len(contents)
break
@@ -464,17 +464,17 @@ class PropertiesParser(Parser):
pre_comment = self.last_comment
self.last_comment = None
entity = PropertiesEntity(
ctx, pre_comment,
(m.start(), offset), # full span
(m.start(1), offset), # entity def span
m.span(1), # key span
(m.end(), endval)) # value span
- return (entity, offset)
+ return entity
return self.getTrailing(ctx, offset, self.reKey, self.reComment)
class DefinesInstruction(EntityBase):
'''Entity-like object representing processing instructions in inc files
'''
def __init__(self, ctx, span, def_span, val_span):
self.ctx = ctx
@@ -505,28 +505,24 @@ class DefinesParser(Parser):
'(?:[ \t]*(?:\n|\Z))*',
re.M)
Parser.__init__(self)
def getEntity(self, ctx, offset):
contents = ctx.contents
m = self.reComment.match(contents, offset)
if m:
- offset = m.end()
self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(2)])
- return (self.last_comment, offset)
+ return self.last_comment
m = self.reKey.match(contents, offset)
if m:
- offset = m.end()
- return (self.createEntity(ctx, m), offset)
+ return self.createEntity(ctx, m)
m = self.rePI.match(contents, offset)
if m:
- offset = m.end()
- return (DefinesInstruction(ctx, *[m.span(i) for i in xrange(3)]),
- offset)
+ return DefinesInstruction(ctx, *[m.span(i) for i in xrange(3)])
return self.getTrailing(ctx, offset,
self.reComment, self.reKey, self.rePI)
class IniSection(EntityBase):
'''Entity-like object representing sections in ini files
'''
def __init__(self, ctx, span, def_span, val_span):
@@ -563,27 +559,24 @@ class IniParser(Parser):
'((.+?)=(.*))'
'(?:[ \t]*(?:\n|\Z))*', re.M)
Parser.__init__(self)
def getEntity(self, ctx, offset):
contents = ctx.contents
m = self.reComment.match(contents, offset)
if m:
- offset = m.end()
self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(2)])
- return (self.last_comment, offset)
+ return self.last_comment
m = self.reSection.match(contents, offset)
if m:
- offset = m.end()
- return (IniSection(ctx, *[m.span(i) for i in xrange(3)]), offset)
+ return IniSection(ctx, *[m.span(i) for i in xrange(3)])
m = self.reKey.match(contents, offset)
if m:
- offset = m.end()
- return (self.createEntity(ctx, m), offset)
+ return self.createEntity(ctx, m)
return self.getTrailing(ctx, offset,
self.reComment, self.reSection, self.reKey)
class FluentAttribute(EntityBase):
ignored_fields = ['span']
def __init__(self, entity, attr_node):