| @@ -9,6 +9,14 @@ nodes Package | |||
| .. autoclass:: mwparserfromhell.nodes.Node | |||
| :special-members: | |||
| :mod:`argument` Module | |||
| ---------------------- | |||
| .. automodule:: mwparserfromhell.nodes.argument | |||
| :members: | |||
| :undoc-members: | |||
| :show-inheritance: | |||
| :mod:`heading` Module | |||
| --------------------- | |||
| @@ -34,7 +34,8 @@ from __future__ import unicode_literals | |||
| from ..compat import str | |||
| from ..string_mixin import StringMixIn | |||
| __all__ = ["Node", "Text", "Heading", "HTMLEntity", "Tag", "Template"] | |||
| __all__ = ["Node", "Text", "Argument", "Heading", "HTMLEntity", "Tag", | |||
| "Template"] | |||
| class Node(StringMixIn): | |||
| """Represents the base Node type, demonstrating the methods to override. | |||
| @@ -66,6 +67,7 @@ class Node(StringMixIn): | |||
| from . import extras | |||
| from .text import Text | |||
| from .argument import Argument | |||
| from .heading import Heading | |||
| from .html_entity import HTMLEntity | |||
| from .tag import Tag | |||
| @@ -0,0 +1,69 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
| # SOFTWARE. | |||
| from __future__ import unicode_literals | |||
| from . import Node | |||
| from ..compat import str | |||
| from ..utils import parse_anything | |||
| __all__ = ["Argument"] | |||
| class Argument(Node): | |||
| """Represents a template argument substitution, like ``{{{foo}}}``.""" | |||
| def __init__(self, name, default=None): | |||
| super(Argument, self).__init__() | |||
| self._value = value | |||
| self._default = None | |||
| def __unicode__(self): | |||
| start = "{{{" + unicode(self.name) | |||
| if self.default is not None: | |||
| return start + "|" + unicode(self.default) + "}}}" | |||
| return start + "}}}" | |||
| @property | |||
| def name(self): | |||
| """The name of the argument to substitute.""" | |||
| return self._name | |||
| @property | |||
| def default(self): | |||
| """The default value to substitute if none is passed. | |||
| This will be ``None`` if the argument wasn't defined with one. The | |||
| MediaWiki parser handles this by rendering the argument itself in the | |||
| result, complete braces. To have the argument render as nothing, set | |||
| default to ``""`` (``{{{arg}}}`` vs. ``{{{arg|}}}``). | |||
| """ | |||
| return self._default | |||
| @name.setter | |||
| def name(self, value): | |||
| self._name = parse_anything(value) | |||
| @default.setter | |||
| def default(self, default): | |||
| if default is None: | |||
| self._default = None | |||
| else: | |||
| self._default = parse_anything(default) | |||
| @@ -24,7 +24,7 @@ from __future__ import unicode_literals | |||
| from . import tokens | |||
| from ..compat import str | |||
| from ..nodes import Heading, HTMLEntity, Tag, Template, Text | |||
| from ..nodes import Argument, Heading, HTMLEntity, Tag, Template, Text | |||
| from ..nodes.extras import Attribute, Parameter | |||
| from ..smart_list import SmartList | |||
| from ..wikicode import Wikicode | |||
| @@ -109,6 +109,22 @@ class Builder(object): | |||
| else: | |||
| self._write(self._handle_token(token)) | |||
| def _handle_argument(self): | |||
| """Handle a case where an argument is at the head of the tokens.""" | |||
| name = None | |||
| self._push() | |||
| while self._tokens: | |||
| token = self._tokens.pop() | |||
| if isinstance(token, tokens.ArgumentSeparator): | |||
| name = self._pop() | |||
| self._push() | |||
| elif isinstance(token, tokens.ArgumentClose): | |||
| if name is not None: | |||
| return Argument(name, self._pop()) | |||
| return Argument(self._pop()) | |||
| else: | |||
| self._write(self._handle_token(token)) | |||
| def _handle_entity(self): | |||
| """Handle a case where a HTML entity is at the head of the tokens.""" | |||
| token = self._tokens.pop() | |||
| @@ -187,6 +203,8 @@ class Builder(object): | |||
| return Text(token.text) | |||
| elif isinstance(token, tokens.TemplateOpen): | |||
| return self._handle_template() | |||
| elif isinstance(token, tokens.ArgumentOpen): | |||
| return self._handle_argument() | |||
| elif isinstance(token, tokens.HTMLEntityStart): | |||
| return self._handle_entity() | |||
| elif isinstance(token, tokens.HeadingStart): | |||
| @@ -75,6 +75,10 @@ TemplateParamSeparator = make("TemplateParamSeparator") # | | |||
| TemplateParamEquals = make("TemplateParamEquals") # = | |||
| TemplateClose = make("TemplateClose") # }} | |||
| ArgumentOpen = make("ArgumentOpen") # {{{ | |||
| ArgumentSeparator = make("ArgumentSeparator") # | | |||
| ArgumentClose = make("ArgumentClose") # }}} | |||
| HTMLEntityStart = make("HTMLEntityStart") # & | |||
| HTMLEntityNumeric = make("HTMLEntityNumeric") # # | |||
| HTMLEntityHex = make("HTMLEntityHex") # x | |||