From 1b3e3c365704bed8b0b9d8601c9ca5cbe8e7e0f6 Mon Sep 17 00:00:00 2001 From: David Winegar Date: Tue, 22 Jul 2014 15:17:51 -0700 Subject: [PATCH] Change wiki tags to use style separators For wiki syntax tables, add `wiki_style_separator` as an attribute for the Tag node. Also reorder `closing_wiki_markup` property and tests to match its place in the constructor. --- mwparserfromhell/nodes/tag.py | 78 +++++++++++++++++++++++--------------- mwparserfromhell/parser/builder.py | 6 ++- tests/test_tag.py | 40 ++++++++++++------- 3 files changed, 79 insertions(+), 45 deletions(-) diff --git a/mwparserfromhell/nodes/tag.py b/mwparserfromhell/nodes/tag.py index c5f9d84..e9531e7 100644 --- a/mwparserfromhell/nodes/tag.py +++ b/mwparserfromhell/nodes/tag.py @@ -35,7 +35,8 @@ class Tag(Node): def __init__(self, tag, contents=None, attrs=None, wiki_markup=None, self_closing=False, invalid=False, implicit=False, padding="", - closing_tag=None, closing_wiki_markup=None): + closing_tag=None, wiki_style_separator=None, + closing_wiki_markup=None): super(Tag, self).__init__() self._tag = tag if contents is None and not self_closing: @@ -44,12 +45,6 @@ class Tag(Node): self._contents = contents self._attrs = attrs if attrs else [] self._wiki_markup = wiki_markup - if closing_wiki_markup: - self._closing_wiki_markup = closing_wiki_markup - elif wiki_markup and not self_closing: - self._closing_wiki_markup = wiki_markup - else: - self._closing_wiki_markup = None self._self_closing = self_closing self._invalid = invalid self._implicit = implicit @@ -58,16 +53,28 @@ class Tag(Node): self._closing_tag = closing_tag else: self._closing_tag = tag + self._wiki_style_separator = wiki_style_separator + if closing_wiki_markup is not None: + self._closing_wiki_markup = closing_wiki_markup + elif wiki_markup and not self_closing: + self._closing_wiki_markup = wiki_markup + else: + self._closing_wiki_markup = None def __unicode__(self): if self.wiki_markup: - attrs = "".join([str(attr) for attr in self.attributes]) if self.attributes else "" - close = self.closing_wiki_markup if self.closing_wiki_markup else "" - padding = self.padding if self.padding else "" + if self.attributes: + attrs = "".join([str(attr) for attr in self.attributes]) + else: + attrs = "" + padding = self.padding or "" + separator = self.wiki_style_separator or "" + close = self.closing_wiki_markup or "" if self.self_closing: - return self.wiki_markup + attrs + padding + close + return self.wiki_markup + attrs + padding + separator else: - return self.wiki_markup + attrs + padding + str(self.contents) + close + return self.wiki_markup + attrs + padding + separator + \ + str(self.contents) + close result = ("``).""" return self._self_closing @@ -197,6 +190,27 @@ class Tag(Node): """ return self._closing_tag + @property + def wiki_style_separator(self): + """The separator between the padding and content in a wiki markup tag. + + Essentially the wiki equivalent of the TagCloseOpen. + """ + return self._wiki_style_separator + + @property + def closing_wiki_markup(self): + """The wikified version of the closing tag to show instead of HTML. + + If set to a value, this will be displayed instead of the close tag + brackets. If tag is :attr:`self_closing` is ``True`` then this is not + displayed. If :attr:`wiki_markup` is set and this has not been set, this + is set to the value of :attr:`wiki_markup`. If this has been set and + :attr:`wiki_markup` is set to a ``False`` value, this is set to + ``None``. + """ + return self._closing_wiki_markup + @tag.setter def tag(self, value): self._tag = self._closing_tag = parse_anything(value) @@ -211,10 +225,6 @@ class Tag(Node): if not value or not self.closing_wiki_markup: self.closing_wiki_markup = str(value) if value else None - @closing_wiki_markup.setter - def closing_wiki_markup(self, value): - self._closing_wiki_markup = str(value) if value else None - @self_closing.setter def self_closing(self, value): self._self_closing = bool(value) @@ -241,6 +251,14 @@ class Tag(Node): def closing_tag(self, value): self._closing_tag = parse_anything(value) + @wiki_style_separator.setter + def wiki_style_separator(self, value): + self._wiki_style_separator = str(value) if value else None + + @closing_wiki_markup.setter + def closing_wiki_markup(self, value): + self._closing_wiki_markup = str(value) if value else None + def has(self, name): """Return whether any attribute in the tag has the given *name*. diff --git a/mwparserfromhell/parser/builder.py b/mwparserfromhell/parser/builder.py index 32cbb93..99a54d1 100644 --- a/mwparserfromhell/parser/builder.py +++ b/mwparserfromhell/parser/builder.py @@ -248,13 +248,14 @@ class Builder(object): close_tokens = (tokens.TagCloseSelfclose, tokens.TagCloseClose) implicit, attrs, contents, closing_tag = False, [], None, None wiki_markup, invalid = token.wiki_markup, token.invalid or False - closing_wiki_markup = None + wiki_style_separator, closing_wiki_markup = None, wiki_markup self._push() while self._tokens: token = self._tokens.pop() if isinstance(token, tokens.TagAttrStart): attrs.append(self._handle_attribute(token)) elif isinstance(token, tokens.TagCloseOpen): + wiki_style_separator = token.wiki_markup padding = token.padding or "" tag = self._pop() self._push() @@ -273,7 +274,8 @@ class Builder(object): self_closing = False closing_tag = self._pop() return Tag(tag, contents, attrs, wiki_markup, self_closing, - invalid, implicit, padding, closing_tag, closing_wiki_markup) + invalid, implicit, padding, closing_tag, + wiki_style_separator, closing_wiki_markup) else: self._write(self._handle_token(token)) raise ParserError("_handle_tag() missed a close token") diff --git a/tests/test_tag.py b/tests/test_tag.py index 2d67723..c2c751b 100644 --- a/tests/test_tag.py +++ b/tests/test_tag.py @@ -171,19 +171,6 @@ class TestTag(TreeEqualityTestCase): self.assertFalse(node.wiki_markup) self.assertEqual("italic text", node) - def test_closing_wiki_markup(self): - """test getter/setter behavior for closing_wiki_markup attribute""" - node = Tag(wraptext("table"), wraptext("\n")) - self.assertIs(None, node.closing_wiki_markup) - node.wiki_markup = "{|" - self.assertEqual("{|", node.closing_wiki_markup) - node.closing_wiki_markup = "|}" - self.assertEqual("|}", node.closing_wiki_markup) - self.assertEqual("{|\n|}", node) - node.wiki_markup = False - self.assertFalse(node.closing_wiki_markup) - self.assertEqual("\n
", node) - def test_self_closing(self): """test getter/setter for the self_closing attribute""" node = Tag(wraptext("ref"), wraptext("foobar")) @@ -239,6 +226,33 @@ class TestTag(TreeEqualityTestCase): self.assertWikicodeEqual(parsed, node.closing_tag) self.assertEqual("foobar", node) + def test_wiki_style_separator(self): + """test getter/setter for wiki_style_separator attribute""" + node = Tag(wraptext("table"), wraptext("\n")) + self.assertIs(None, node.wiki_style_separator) + node.wiki_style_separator = "|" + self.assertEqual("|", node.wiki_style_separator) + node.wiki_markup = "{" + self.assertEqual("{|\n{", node) + node2 = Tag(wraptext("table"), wraptext("\n"), wiki_style_separator="|") + self.assertEqual("|", node.wiki_style_separator) + + def test_closing_wiki_markup(self): + """test getter/setter for closing_wiki_markup attribute""" + node = Tag(wraptext("table"), wraptext("\n")) + self.assertIs(None, node.closing_wiki_markup) + node.wiki_markup = "{|" + self.assertEqual("{|", node.closing_wiki_markup) + node.closing_wiki_markup = "|}" + self.assertEqual("|}", node.closing_wiki_markup) + self.assertEqual("{|\n|}", node) + node.wiki_markup = False + self.assertFalse(node.closing_wiki_markup) + self.assertEqual("\n
", node) + node2 = Tag(wraptext("table"), wraptext("\n"), wiki_markup="{|", + closing_wiki_markup="|}") + self.assertEqual("|}", node2.closing_wiki_markup) + def test_has(self): """test Tag.has()""" node = Tag(wraptext("ref"), wraptext("cite"), [agen("name", "foo")])