diff options
author | Matthew Peveler <matt.peveler@gmail.com> | 2021-10-17 20:39:22 -1000 |
---|---|---|
committer | Matthew Peveler <matt.peveler@gmail.com> | 2021-10-17 21:50:23 -1000 |
commit | 7c4d2b9c25a901986412593e9e4e3e1bbbf62b04 (patch) | |
tree | 40dfc819c5c68baff2361649ba806a7b61ec1b89 /asciidoc/asciidoc.py | |
parent | e4b2c71720ceb86d6063613a2903779f6409e24f (diff) | |
download | asciidoc-py3-7c4d2b9c25a901986412593e9e4e3e1bbbf62b04.tar.gz |
Fix handling escaped attributes inside macrosmpeveler/bugfix-escape-attribute-2
Signed-off-by: Matthew Peveler <matt.peveler@gmail.com>
Diffstat (limited to 'asciidoc/asciidoc.py')
-rw-r--r-- | asciidoc/asciidoc.py | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/asciidoc/asciidoc.py b/asciidoc/asciidoc.py index 4c323f1..c5fc2b8 100644 --- a/asciidoc/asciidoc.py +++ b/asciidoc/asciidoc.py @@ -799,12 +799,12 @@ def subs_attrs(lines, dictionary=None): n = 0 result = start for c in text[start:]: - # Skip braces that are followed by a backslash. - if result == len(text) - 1 or text[result + 1] != '\\': - if c == '{': - n = n + 1 - elif c == '}': - n = n - 1 + if result == len(text): + break + if c == '{': + n = n + 1 + elif c == '}': + n = n - 1 result = result + 1 if n == 0: break @@ -872,6 +872,7 @@ def subs_attrs(lines, dictionary=None): for reo in [reo1, reo2]: pos = 0 while True: + line = line.replace('\\{', '{\\') mo = reo.search(line, pos) if not mo: break @@ -971,6 +972,7 @@ def subs_attrs(lines, dictionary=None): assert False, 'illegal attribute: %s' % attr s = str(s) line = line[:mo.start()] + s + line[end:] + line = line.replace('{\\', '\\{') pos = mo.start() + len(s) # Drop line if it contains unsubstituted {name} references. skipped = re.search(r'(?s)\{[^\\\W][-\w]*?\}(?!\\)', line) @@ -991,7 +993,7 @@ def subs_attrs(lines, dictionary=None): break expr = mo.group('expr') action = mo.group('action') - expr = expr.replace('{\\', '{') + expr = expr.replace('{\\', '\\{') expr = expr.replace('}\\', '}') s = system(action, expr, attrs=dictionary) if dictionary is not None and action in ('counter', 'counter2', 'set', 'set2'): @@ -1006,8 +1008,9 @@ def subs_attrs(lines, dictionary=None): if skipped: break if not skipped: - # Remove backslash from escaped entries. - line = line.replace('{\\', '{') + # Put back slash for leftmost curly brace for subsequent parses of + # escaped attributes. We don't need the escaped right curly braces though. + line = line.replace('{\\', '\\{') line = line.replace('}\\', '}') result.append(line) if string_result: @@ -4441,7 +4444,8 @@ class Writer: def write_line(self, line=None): if not (self.skip_blank_lines and (not line or not line.strip())): - self.f.write((line or '') + self.newline) + # Replace out any escaped attributes with non-escaped versions + self.f.write((re.sub(r'\\({[a-zA-Z0-9_][a-zA-Z0-9_\-]*)', '\\1', line) or '') + self.newline) self.lines_out = self.lines_out + 1 def write(self, *args, **kwargs): |