| @@ -221,6 +221,8 @@ class Tokenizer(object): | |||
| self._head += 1 | |||
| self._write_all(self._pop()) | |||
| if self._context & contexts.FAIL_NEXT: | |||
| self._context ^= contexts.FAIL_NEXT | |||
| def _parse_template(self): | |||
| """Parse a template at the head of the wikicode string.""" | |||
| @@ -293,6 +295,8 @@ class Tokenizer(object): | |||
| self._head = reset | |||
| self._write_text("[[") | |||
| else: | |||
| if self._context & contexts.FAIL_NEXT: | |||
| self._context ^= contexts.FAIL_NEXT | |||
| self._write(tokens.WikilinkOpen()) | |||
| self._write_all(wikilink) | |||
| self._write(tokens.WikilinkClose()) | |||
| @@ -507,7 +511,7 @@ class Tokenizer(object): | |||
| else: | |||
| data.context = data.CX_ATTR_NAME | |||
| self._push(contexts.TAG_ATTR) | |||
| self._write_text(chunk) ### hook on here for {, <, etc | |||
| self._parse_tag_chunk(chunk) | |||
| elif data.context & data.CX_ATTR_NAME: | |||
| if chunk.isspace(): | |||
| data.padding_buffer.append(chunk) | |||
| @@ -523,7 +527,7 @@ class Tokenizer(object): | |||
| data.padding_buffer.append("") # No padding before tag | |||
| data.context = data.CX_ATTR_NAME | |||
| self._push(contexts.TAG_ATTR) | |||
| self._write_text(chunk) ### hook on here for {, <, etc | |||
| self._parse_tag_chunk(chunk) | |||
| elif data.context & data.CX_ATTR_VALUE: | |||
| ### handle backslashes here | |||
| if data.context & data.CX_NEED_QUOTE: | |||
| @@ -535,7 +539,7 @@ class Tokenizer(object): | |||
| data.padding_buffer.append(chunk) | |||
| else: | |||
| data.context ^= data.CX_NEED_QUOTE | |||
| self._write_text(chunk) ### hook on here for {, <, etc | |||
| self._parse_tag_chunk(chunk) | |||
| elif not data.literal: | |||
| if chunk == '"': | |||
| data.context |= data.CX_NEED_SPACE | |||
| @@ -547,7 +551,18 @@ class Tokenizer(object): | |||
| data.padding_buffer.append(chunk) | |||
| data.context = data.CX_ATTR_READY | |||
| else: | |||
| self._write_text(chunk) ### hook on here for {, <, etc | |||
| self._parse_tag_chunk(chunk) | |||
| def _parse_tag_chunk(self, chunk): | |||
| next = self._read(1) | |||
| if not self._can_recurse() or chunk not in self.MARKERS: | |||
| self._write_text(chunk) | |||
| elif chunk == next == "{": | |||
| self._parse_template_or_argument() | |||
| elif chunk == next == "[": | |||
| self._parse_wikilink() | |||
| else: | |||
| self._write_text(chunk) | |||
| def _push_tag_buffer(self, data): | |||
| """Write a pending tag attribute from *data* to the stack. | |||
| @@ -678,8 +693,6 @@ class Tokenizer(object): | |||
| elif this == next == "{": | |||
| if self._can_recurse(): | |||
| self._parse_template_or_argument() | |||
| if self._context & contexts.FAIL_NEXT: | |||
| self._context ^= contexts.FAIL_NEXT | |||
| else: | |||
| self._write_text("{") | |||
| elif this == "|" and self._context & contexts.TEMPLATE: | |||
| @@ -698,8 +711,6 @@ class Tokenizer(object): | |||
| elif this == next == "[": | |||
| if not self._context & contexts.WIKILINK_TITLE and self._can_recurse(): | |||
| self._parse_wikilink() | |||
| if self._context & contexts.FAIL_NEXT: | |||
| self._context ^= contexts.FAIL_NEXT | |||
| else: | |||
| self._write_text("[") | |||
| elif this == "|" and self._context & contexts.WIKILINK_TITLE: | |||