diff --git a/mwparserfromhell/parser/tokenizer.py b/mwparserfromhell/parser/tokenizer.py index 068ce1a..aafb7e7 100644 --- a/mwparserfromhell/parser/tokenizer.py +++ b/mwparserfromhell/parser/tokenizer.py @@ -98,10 +98,15 @@ class Tokenizer(object): raise BadRoute() def _write(self, token): - """Write a token to the current token stack.""" + """Write a token to the end of the current token stack.""" self._push_textbuffer() self._stack.append(token) + def _write_first(self, token): + """Write a token to the beginning of the current token stack.""" + self._push_textbuffer() + self._stack.insert(0, token) + def _write_text(self, text): """Write text to the current textbuffer.""" self._textbuffer.append(text) @@ -113,6 +118,13 @@ class Tokenizer(object): self._push_textbuffer() self._stack.extend(tokenlist) + def _write_text_then_stack(self, text): + """Pop the current stack, write *text*, and then write the stack.""" + stack = self._pop() + self._write_text(text) + self._write_all(stack) + self._head -= 1 + def _read(self, delta=0, wrap=False, strict=False): """Read the value at a relative point in the wikicode. @@ -146,20 +158,12 @@ class Tokenizer(object): while braces: if braces == 1: - stack = self._pop() - self._write_text("{") - self._write_all(stack) - self._head -= 1 - return + return self._write_text_then_stack("{") if braces == 2: try: self._parse_template() except BadRoute: - stack = self._pop() - self._write_text("{{") - self._write_all(stack) - self._head -= 1 - return + return self._write_text_then_stack("{{") break try: self._parse_argument() @@ -167,16 +171,11 @@ class Tokenizer(object): try: self._parse_template() except BadRoute: - stack = self._pop() - self._write_text("{" * braces) - self._write_all(stack) - self._head -= 1 - return - else: - stack = self._pop() - self._write_text("{") - self._push() - self._write_all(stack) + return self._write_text_then_stack("{" * braces) + stack = self._pop() + self._write_text("{") + self._push() + self._write_all(stack) braces -= 3 if braces: self._head += 1 @@ -192,10 +191,7 @@ class Tokenizer(object): self._head = reset raise else: - stack = self._pop() - self._push() - self._write(tokens.TemplateOpen()) - self._write_all(stack) + self._write_first(tokens.TemplateOpen()) self._write_all(template) self._write(tokens.TemplateClose()) @@ -208,10 +204,7 @@ class Tokenizer(object): self._head = reset raise else: - stack = self._pop() - self._push() - self._write(tokens.ArgumentOpen()) - self._write_all(stack) + self._write_first(tokens.ArgumentOpen()) self._write_all(argument) self._write(tokens.ArgumentClose())