diff --git a/mwparserfromhell/parser/tokenizer.c b/mwparserfromhell/parser/tokenizer.c index de58e72..d8a505f 100644 --- a/mwparserfromhell/parser/tokenizer.c +++ b/mwparserfromhell/parser/tokenizer.c @@ -1899,7 +1899,7 @@ static PyObject* Tokenizer_handle_single_tag_end(Tokenizer* self) int is_instance; len = PyList_GET_SIZE(self->topstack->stack); - for (index = 0; index < len; index++) { + for (index = len - 1; index >= 0; index--) { token = PyList_GET_ITEM(self->topstack->stack, index); is_instance = PyObject_IsInstance(token, TagCloseOpen); if (is_instance == -1) diff --git a/mwparserfromhell/parser/tokenizer.py b/mwparserfromhell/parser/tokenizer.py index 29a7e25..93d53e7 100644 --- a/mwparserfromhell/parser/tokenizer.py +++ b/mwparserfromhell/parser/tokenizer.py @@ -21,6 +21,7 @@ # SOFTWARE. from __future__ import unicode_literals +from itertools import izip from math import log import re @@ -751,11 +752,12 @@ class Tokenizer(object): def _handle_single_tag_end(self): """Handle the stream end when inside a single-supporting HTML tag.""" - gen = enumerate(self._stack) + stack = self._stack + gen = izip(xrange(len(stack) - 1, -1, -1), reversed(stack)) index = next(i for i, t in gen if isinstance(t, tokens.TagCloseOpen)) - padding = self._stack[index].padding + padding = stack[index].padding token = tokens.TagCloseSelfclose(padding=padding, implicit=True) - self._stack[index] = token + stack[index] = token return self._pop() def _really_parse_tag(self): diff --git a/tests/tokenizer/tags.mwtest b/tests/tokenizer/tags.mwtest index a8ca2f0..26e569b 100644 --- a/tests/tokenizer/tags.mwtest +++ b/tests/tokenizer/tags.mwtest @@ -124,6 +124,13 @@ output: [TagOpenOpen(), Text(text="ref"), TagAttrStart(pad_first=" ", pad_before --- +name: nested_tag_selfclosing +label: a tag nested within the attributes of another; outer tag implicitly self-closing +input: "
  • " +output: [TagOpenOpen(), Text(text="li"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), TagOpenOpen(), Text(text="b"), TagCloseOpen(padding=""), TagOpenClose(), Text(text="b"), TagCloseClose(), Text(text="test"