From 827c544721e223c2f9a5eaf90d5742b2d45de449 Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Sun, 9 Dec 2012 01:38:45 -0500 Subject: [PATCH] Should correctly handle closing tags with strange spacing. --- mwparserfromhell/nodes/tag.py | 29 ++++++++++++++++++----------- mwparserfromhell/parser/builder.py | 3 +-- mwparserfromhell/parser/tokenizer.py | 6 +++--- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/mwparserfromhell/nodes/tag.py b/mwparserfromhell/nodes/tag.py index b1eb133..1f3bdf9 100644 --- a/mwparserfromhell/nodes/tag.py +++ b/mwparserfromhell/nodes/tag.py @@ -111,7 +111,7 @@ class Tag(Node): } def __init__(self, type_, tag, contents=None, attrs=None, showtag=True, - self_closing=False, open_padding="", close_padding=""): + self_closing=False, open_padding="", closing_tag=None): super(Tag, self).__init__() self._type = type_ self._tag = tag @@ -123,7 +123,10 @@ class Tag(Node): self._showtag = showtag self._self_closing = self_closing self._open_padding = open_padding - self._close_padding = close_padding + if closing_tag: + self._closing_tag = closing_tag + else: + self._closing_tag = tag def __unicode__(self): if not self.showtag: @@ -140,7 +143,7 @@ class Tag(Node): result += self.open_padding + "/>" else: result += self.open_padding + ">" + str(self.contents) - result += "" + result += "" return result def __iternodes__(self, getter): @@ -242,9 +245,13 @@ class Tag(Node): return self._open_padding @property - def close_padding(self): - """Spacing to insert before the last closing > (excl. self-closing).""" - return self._close_padding + def closing_tag(self): + """The closing tag, as a :py:class:`~.Wikicode` object. + + This will usually equal :py:attr:`tag`, unless there is additional + spacing, comments, or the like. + """ + return self._closing_tag @type.setter def type(self, value): @@ -254,11 +261,11 @@ class Tag(Node): self._type = value for key in self.TRANSLATIONS: if self.TRANSLATIONS[key] == value: - self._tag = parse_anything(key) + self._tag = self._closing_tag = parse_anything(key) @tag.setter def tag(self, value): - self._tag = parse_anything(value) + self._tag = self._closing_tag = parse_anything(value) try: self._type = self.TRANSLATIONS[text] except KeyError: @@ -280,6 +287,6 @@ class Tag(Node): def open_padding(self, value): self._open_padding = str(value) - @close_padding.setter - def close_padding(self, value): - self._close_padding = str(value) + @closing_tag.setter + def closing_tag(self, value): + self._closing_tag = parse_anything(value) diff --git a/mwparserfromhell/parser/builder.py b/mwparserfromhell/parser/builder.py index 648842c..90274fa 100644 --- a/mwparserfromhell/parser/builder.py +++ b/mwparserfromhell/parser/builder.py @@ -221,9 +221,8 @@ class Builder(object): contents = self._pop() self._push() elif isinstance(token, tokens.TagCloseClose): - self._pop() return Tag(type_, tag, contents, attrs, showtag, False, - open_pad, token.padding) + open_pad, self._pop()) else: self._write(self._handle_token(token)) diff --git a/mwparserfromhell/parser/tokenizer.py b/mwparserfromhell/parser/tokenizer.py index 2e72951..9e9465d 100644 --- a/mwparserfromhell/parser/tokenizer.py +++ b/mwparserfromhell/parser/tokenizer.py @@ -496,8 +496,7 @@ class Tokenizer(object): # Closing and opening tags are not the same, so fail this route: self._fail_route() self._write_all(closing) - padding = "" # TODO - self._write(tokens.TagCloseClose(padding=padding)) + self._write(tokens.TagCloseClose()) return self._pop() def _parse(self, context=0): @@ -589,7 +588,8 @@ class Tokenizer(object): self._context & contexts.TAG_OPEN and not self._context & contexts.TAG_ATTR_BODY_QUOTED): return self._handle_tag_selfclose() - elif this == "<" and next == "/" and self._context & contexts.TAG_BODY: + elif this == "<" and next == "/" and ( + self._context & contexts.TAG_BODY): self._handle_tag_open_close() elif this == ">" and self._context & contexts.TAG_CLOSE: return self._handle_tag_close_close()