--- a/compare_locales/parser.py
+++ b/compare_locales/parser.py
@@ -236,27 +236,25 @@ class Parser:
offset = m.end()
entity = self.createEntity(ctx, m)
return (entity, offset)
m = self.reComment.match(ctx.contents, offset)
if m:
offset = m.end()
self.last_comment = Comment(ctx, *[m.span(i) for i in xrange(4)])
return (self.last_comment, offset)
- mkey = self.reKey.search(ctx.contents, offset)
- mcomment = self.reComment.search(ctx.contents, offset)
- m = None
- if mkey and mcomment:
- m = mkey if mkey.start() < mcomment.start() else mcomment
- else:
- m = mkey if mkey else mcomment
- if m:
- # we didn't match, but search, so there's junk between offset
- # and start. We'll match() on the next turn
- junkend = m.start()
+ 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 not None:
return (Junk(ctx, (offset, junkend)), junkend)
return (None, offset)
def createEntity(self, ctx, m):
pre_comment = str(self.last_comment) if self.last_comment else ''
self.last_comment = ''
return Entity(ctx, self.postProcessValue, pre_comment,
*[m.span(i) for i in xrange(6)])
@@ -402,29 +400,17 @@ class PropertiesParser(Parser):
entity = Entity(ctx, self.postProcessValue, pre_comment,
(m.start(), offset), # full span
m.span(1), # leading whitespan
(m.start(2), offset), # entity def span
m.span(2), # key span
(m.end(), endval), # value span
(offset, offset)) # post comment span, empty
return (entity, offset)
- mkey = self.reKey.search(ctx.contents, offset)
- mcomment = self.reComment.search(ctx.contents, offset)
- m = None
- if mkey and mcomment:
- m = mkey if mkey.start() < mcomment.start() else mcomment
- else:
- m = mkey if mkey else mcomment
- if m:
- # we didn't match, but search, so there's junk between offset
- # and start. We'll match() on the next turn
- junkend = m.start()
- return (Junk(ctx, (offset, junkend)), junkend)
- return (None, offset)
+ return self.getTrailing(ctx, offset, self.reKey, self.reComment)
def postProcessValue(self, val):
def unescape(m):
found = m.groupdict()
if found['uni']:
return unichr(int(found['uni'][1:], 16))
if found['nl']:
@@ -480,24 +466,18 @@ class DefinesParser(Parser):
if m:
offset = m.end()
return (self.createEntity(ctx, m), offset)
m = self.rePI.match(contents, offset)
if m:
offset = m.end()
return (DefinesInstruction(ctx, *[m.span(i) for i in xrange(5)]),
offset)
- junkend = None
- for exp in (self.reComment, self.reKey, self.rePI):
- m = exp.search(contents, offset)
- if m:
- junkend = min(junkend, m.start(1)) if junkend else m.start()
- if junkend is not None:
- return (Junk(ctx, (offset, junkend)), junkend)
- return (None, offset)
+ return self.getTrailing(ctx, offset,
+ self.reComment, self.reKey, self.rePI)
class IniSection(Entity):
'''Entity-like object representing sections in ini files
'''
def __init__(self, ctx, span, pre_ws_span, def_span, val_span, post_span):
self.ctx = ctx
self.span = span
@@ -546,22 +526,16 @@ class IniParser(Parser):
m = self.reSection.match(contents, offset)
if m:
offset = m.end()
return (IniSection(ctx, *[m.span(i) for i in xrange(5)]), offset)
m = self.reKey.match(contents, offset)
if m:
offset = m.end()
return (self.createEntity(ctx, m), offset)
- junkend = None
- for exp in (self.reComment, self.reSection, self.reKey):
- m = exp.search(contents, offset)
- if m:
- junkend = min(junkend, m.start(1)) if junkend else m.start()
- if junkend is not None:
- return (Junk(ctx, (offset, junkend)), junkend)
- return (None, offset)
+ return self.getTrailing(ctx, offset,
+ self.reComment, self.reSection, self.reKey)
__constructors = [('\\.dtd$', DTDParser()),
('\\.properties$', PropertiesParser()),
('\\.ini$', IniParser()),
('\\.inc$', DefinesParser())]