| @@ -7,6 +7,7 @@ nodes Package | |||
| .. automodule:: mwparserfromhell.nodes | |||
| .. autoclass:: mwparserfromhell.nodes.Node | |||
| :special-members: | |||
| :mod:`heading` Module | |||
| --------------------- | |||
| @@ -37,4 +37,4 @@ __email__ = "ben.kurtovic@verizon.net" | |||
| from . import nodes, parser, smart_list, string_mixin, wikicode | |||
| parse = lambda text: parser.Parser(text).parse() | |||
| parse.__doc__ = "Short for ``mwparserfromhell.parser.Parser(text).parse()``." | |||
| parse.__doc__ = "Short for :py:meth:`.Parser.parse`." | |||
| @@ -21,14 +21,12 @@ | |||
| # SOFTWARE. | |||
| """ | |||
| This package contains :py:class:`~mwparserfromhell.wikicode.Wikicode` "nodes", | |||
| which represent a single unit of wikitext, such as a Template, an HTML tag, | |||
| a Heading, or plain text. The node "tree" is far from flat, as most types can | |||
| contain additional :py:class:`~mwparserfromhell.wikicode.Wikicode` types within | |||
| them - and with that, more nodes. For example, the name of a | |||
| :py:class:`~mwparserfromhell.nodes.template.Template` is a | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` object that can contain text or | |||
| more templates. | |||
| This package contains :py:class:`~.Wikicode` "nodes", which represent a single | |||
| unit of wikitext, such as a Template, an HTML tag, a Heading, or plain text. | |||
| The node "tree" is far from flat, as most types can contain additional | |||
| :py:class:`~.Wikicode` types within them - and with that, more nodes. For | |||
| example, the name of a :py:class:`~.Template` is a :py:class:`~.Wikicode` | |||
| object that can contain text or more templates. | |||
| """ | |||
| from __future__ import unicode_literals | |||
| @@ -43,15 +41,15 @@ class Node(StringMixIn): | |||
| :py:meth:`__unicode__` must be overridden. It should return a ``unicode`` | |||
| or (``str`` in py3k) representation of the node. If the node contains | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` objects inside of it, | |||
| :py:meth:`__iternodes__` should be overridden to yield tuples of | |||
| (``wikicode``, ``node_in_wikicode``) for each node in each wikicode, as | |||
| well as the node itself (``None``, ``self``). If the node is printable, | |||
| :py:meth:`__strip__` should be overridden to return the printable version | |||
| of the node - it does not have to be a string, but something that can be | |||
| converted to a string with ``str()``. Finally, :py:meth:`__showtree__` can | |||
| be overridden to build a nice tree representation of the node, if desired, | |||
| for :py:meth:`~mwparserfromhell.wikicode.Wikicode.get_tree`. | |||
| :py:class:`~.Wikicode` objects inside of it, :py:meth:`__iternodes__` | |||
| should be overridden to yield tuples of (``wikicode``, | |||
| ``node_in_wikicode``) for each node in each wikicode, as well as the node | |||
| itself (``None``, ``self``). If the node is printable, :py:meth:`__strip__` | |||
| should be overridden to return the printable version of the node - it does | |||
| not have to be a string, but something that can be converted to a string | |||
| with ``str()``. Finally, :py:meth:`__showtree__` can be overridden to build | |||
| a nice tree representation of the node, if desired, for | |||
| :py:meth:`~.Wikicode.get_tree`. | |||
| """ | |||
| def __unicode__(self): | |||
| raise NotImplementedError() | |||
| @@ -22,8 +22,8 @@ | |||
| """ | |||
| This package contains objects used by | |||
| :py:class:`~mwparserfromhell.nodes.Node`\ s, but are not nodes themselves. | |||
| This includes the parameters of Templates or the attributes of HTML tags. | |||
| :py:class:`~.Node`\ s, but are not nodes themselves. This includes the | |||
| parameters of Templates or the attributes of HTML tags. | |||
| """ | |||
| from .attribute import Attribute | |||
| @@ -30,9 +30,9 @@ __all__ = ["Attribute"] | |||
| class Attribute(StringMixIn): | |||
| """Represents an attribute of an HTML tag. | |||
| This is used by :py:class:`~mwparserfromhell.nodes.tag.Tag` objects. For | |||
| example, the tag ``<ref name="foo">`` contains an Attribute whose name is | |||
| ``"name"`` and whose value is ``"foo"``. | |||
| This is used by :py:class:`~.Tag` objects. For example, the tag | |||
| ``<ref name="foo">`` contains an Attribute whose name is ``"name"`` and | |||
| whose value is ``"foo"``. | |||
| """ | |||
| def __init__(self, name, value=None, quoted=True): | |||
| @@ -50,12 +50,12 @@ class Attribute(StringMixIn): | |||
| @property | |||
| def name(self): | |||
| """The name of the attribute as a ``Wikicode`` object.""" | |||
| """The name of the attribute as a :py:class:`~.Wikicode` object.""" | |||
| return self._name | |||
| @property | |||
| def value(self): | |||
| """The value of the attribute as a ``Wikicode`` object.""" | |||
| """The value of the attribute as a :py:class:`~.Wikicode` object.""" | |||
| return self._value | |||
| @property | |||
| @@ -50,12 +50,12 @@ class Parameter(StringMixIn): | |||
| @property | |||
| def name(self): | |||
| """The name of the parameter as a ``Wikicode`` object.""" | |||
| """The name of the parameter as a :py:class:`~.Wikicode` object.""" | |||
| return self._name | |||
| @property | |||
| def value(self): | |||
| """The value of the parameter as a ``Wikicode`` object.""" | |||
| """The value of the parameter as a :py:class:`~.Wikicode` object.""" | |||
| return self._value | |||
| @property | |||
| @@ -53,7 +53,7 @@ class Heading(Node): | |||
| @property | |||
| def title(self): | |||
| """The title of the heading itself, as a ``Wikicode`` object.""" | |||
| """The title of the heading, as a :py:class:`~.Wikicode` object.""" | |||
| return self._title | |||
| @property | |||
| @@ -172,20 +172,19 @@ class Tag(Node): | |||
| @property | |||
| def tag(self): | |||
| """The tag itself, as a ``Wikicode`` object.""" | |||
| """The tag itself, as a :py:class:`~.Wikicode` object.""" | |||
| return self._tag | |||
| @property | |||
| def contents(self): | |||
| """The contents of the tag, as a ``Wikicode`` object.""" | |||
| """The contents of the tag, as a :py:class:`~.Wikicode` object.""" | |||
| return self._contents | |||
| @property | |||
| def attrs(self): | |||
| """The list of attributes affecting the tag. | |||
| Each attribute is an instance of | |||
| :py:class:`~mwparserfromhell.nodes.extras.attribute.Attribute`. | |||
| Each attribute is an instance of :py:class:`~.Attribute`. | |||
| """ | |||
| return self._attrs | |||
| @@ -152,7 +152,7 @@ class Template(Node): | |||
| @property | |||
| def name(self): | |||
| """The name of the template, as a ``Wikicode`` object.""" | |||
| """The name of the template, as a :py:class:`~.Wikicode` object.""" | |||
| return self._name | |||
| @property | |||
| @@ -184,11 +184,10 @@ class Template(Node): | |||
| """Get the parameter whose name is *name*. | |||
| The returned object is a | |||
| :py:class:`~mwparserfromhell.nodes.extras.parameter.Parameter` | |||
| instance. Raises :py:exc:`ValueError` if no parameter has this name. | |||
| Since multiple parameters can have the same name, we'll return the last | |||
| match, since the last parameter is the only one read by the MediaWiki | |||
| parser. | |||
| :py:class:`~.Parameter` instance. Raises :py:exc:`ValueError` if no | |||
| parameter has this name. Since multiple parameters can have the same | |||
| name, we'll return the last match, since the last parameter is the only | |||
| one read by the MediaWiki parser. | |||
| """ | |||
| name = name.strip() if isinstance(name, basestring) else str(name) | |||
| for param in reversed(self.params): | |||
| @@ -200,14 +199,14 @@ class Template(Node): | |||
| """Add a parameter to the template with a given *name* and *value*. | |||
| *name* and *value* can be anything parasable by | |||
| :py:func:`mwparserfromhell.utils.parse_anything`; pipes (and equal | |||
| signs, if appropriate) are automatically escaped from *value* where | |||
| applicable. If *showkey* is given, this will determine whether or not | |||
| to show the parameter's name (e.g., ``{{foo|bar}}``'s parameter has a | |||
| name of ``"1"`` but it is hidden); otherwise, we'll make a safe and | |||
| intelligent guess. If *name* is already a parameter, we'll replace its | |||
| value while keeping the same spacing rules unless *force_nonconformity* | |||
| is ``True``. We will also try to guess the dominant spacing convention | |||
| :py:func:`.utils.parse_anything`; pipes (and equal signs, if | |||
| appropriate) are automatically escaped from *value* where applicable. | |||
| If *showkey* is given, this will determine whether or not to show the | |||
| parameter's name (e.g., ``{{foo|bar}}``'s parameter has a name of | |||
| ``"1"`` but it is hidden); otherwise, we'll make a safe and intelligent | |||
| guess. If *name* is already a parameter, we'll replace its value while | |||
| keeping the same spacing rules unless *force_nonconformity* is | |||
| ``True``. We will also try to guess the dominant spacing convention | |||
| when adding a new parameter using :py:meth:`_get_spacing_conventions` | |||
| unless *force_nonconformity* is ``True``. | |||
| """ | |||
| @@ -22,9 +22,8 @@ | |||
| """ | |||
| This package contains the actual wikicode parser, split up into two main | |||
| modules: the :py:mod:`~mwparserfromhell.parser.tokenizer` and the | |||
| :py:mod:`~mwparserfromhell.parser.builder`. This module joins them together | |||
| under one interface. | |||
| modules: the :py:mod:`~.tokenizer` and the :py:mod:`~.builder`. This module | |||
| joins them together under one interface. | |||
| """ | |||
| try: | |||
| @@ -40,12 +39,9 @@ class Parser(object): | |||
| """Represents a parser for wikicode. | |||
| Actual parsing is a two-step process: first, the text is split up into a | |||
| series of tokens by the | |||
| :py:class:`~mwparserfromhell.parser.tokenizer.Tokenizer`, and then the | |||
| tokens are converted into trees of | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` objects and | |||
| :py:class:`~mwparserfromhell.nodes.Node`\ s by the | |||
| :py:class:`~mwparserfromhell.parser.builder.Builder`. | |||
| series of tokens by the :py:class:`~.Tokenizer`, and then the tokens are | |||
| converted into trees of :py:class:`~.Wikicode` objects and | |||
| :py:class:`~.Node`\ s by the :py:class:`~.Builder`. | |||
| """ | |||
| def __init__(self, text): | |||
| @@ -54,7 +50,7 @@ class Parser(object): | |||
| self._builder = Builder() | |||
| def parse(self): | |||
| """Return a string as a parsed ``Wikicode`` object tree.""" | |||
| """Return a string as a parsed :py:class:`~.Wikicode` object tree.""" | |||
| tokens = self._tokenizer.tokenize(self.text) | |||
| code = self._builder.build(tokens) | |||
| return code | |||
| @@ -34,10 +34,9 @@ __all__ = ["Builder"] | |||
| class Builder(object): | |||
| """Combines a sequence of tokens into a tree of ``Wikicode`` objects. | |||
| To use, pass a list of :py:class:`~mwparserfromhell.parser.tokens.Token`\ s | |||
| to the :py:meth:`build` method. The list will be exhausted as it is parsed | |||
| and a :py:class:`~mwparserfromhell.wikicode.Wikicode` object will be | |||
| returned. | |||
| To use, pass a list of :py:class:`~.Token`\ s to the :py:meth:`build` | |||
| method. The list will be exhausted as it is parsed and a | |||
| :py:class:`~.Wikicode` object will be returned. | |||
| """ | |||
| def __init__(self): | |||
| @@ -92,7 +92,7 @@ class Tokenizer(object): | |||
| """Fail the current tokenization route. | |||
| Discards the current stack/context/textbuffer and raises | |||
| :py:exc:`~mwparserfromhell.parser.tokenizer.BadRoute`. | |||
| :py:exc:`~.BadRoute`. | |||
| """ | |||
| self._pop() | |||
| raise BadRoute() | |||
| @@ -24,10 +24,8 @@ | |||
| This module contains the token definitions that are used as an intermediate | |||
| parsing data type - they are stored in a flat list, with each token being | |||
| identified by its type and optional attributes. The token list is generated in | |||
| a syntactically valid form by the | |||
| :py:class:`~mwparserfromhell.parser.tokenizer.Tokenizer`, and then converted | |||
| into the :py:class`~mwparserfromhell.wikicode.Wikicode` tree by the | |||
| :py:class:`~mwparserfromhell.parser.builder.Builder`. | |||
| a syntactically valid form by the :py:class:`~.Tokenizer`, and then converted | |||
| into the :py:class`~.Wikicode` tree by the :py:class:`~.Builder`. | |||
| """ | |||
| from __future__ import unicode_literals | |||
| @@ -21,10 +21,9 @@ | |||
| # SOFTWARE. | |||
| """ | |||
| This module contains the :py:class:`~mwparserfromhell.smart_list.SmartList` | |||
| type, as well as its :py:class:`~mwparserfromhell.smart_list._ListProxy` child, | |||
| which together implement a list whose sublists reflect changes made to the main | |||
| list, and vice-versa. | |||
| This module contains the :py:class:`~.SmartList` type, as well as its | |||
| :py:class:`~._ListProxy` child, which together implement a list whose sublists | |||
| reflect changes made to the main list, and vice-versa. | |||
| """ | |||
| from __future__ import unicode_literals | |||
| @@ -36,9 +35,8 @@ __all__ = ["SmartList"] | |||
| def inheritdoc(method): | |||
| """Set __doc__ of *method* to __doc__ of *method* in its parent class. | |||
| Since this is used on | |||
| :py:class:`~mwparserfromhell.smart_list.SmartList`, the "parent class" used | |||
| is ``list``. This function can be used as a decorator. | |||
| Since this is used on :py:class:`~.SmartList`, the "parent class" used is | |||
| ``list``. This function can be used as a decorator. | |||
| """ | |||
| method.__doc__ = getattr(list, method.__name__).__doc__ | |||
| return method | |||
| @@ -51,10 +49,9 @@ class SmartList(list): | |||
| list (such as the addition, removal, or replacement of elements) will be | |||
| reflected in the sublist, or vice-versa, to the greatest degree possible. | |||
| This is implemented by having sublists - instances of the | |||
| :py:class:`~mwparserfromhell.smart_list._ListProxy` type - dynamically | |||
| determine their elements by storing their slice info and retrieving that | |||
| slice from the parent. Methods that change the size of the list also change | |||
| the slice info. For example:: | |||
| :py:class:`~._ListProxy` type - dynamically determine their elements by | |||
| storing their slice info and retrieving that slice from the parent. Methods | |||
| that change the size of the list also change the slice info. For example:: | |||
| >>> parent = SmartList([0, 1, 2, 3]) | |||
| >>> parent | |||
| @@ -183,10 +180,9 @@ class SmartList(list): | |||
| class _ListProxy(list): | |||
| """Implement the ``list`` interface by getting elements from a parent. | |||
| This is created by a :py:class:`~mwparserfromhell.smart_list.SmartList` | |||
| object when slicing. It does not actually store the list at any time; | |||
| instead, whenever the list is needed, it builds it dynamically using the | |||
| :py:meth:`_render` method. | |||
| This is created by a :py:class:`~.SmartList` object when slicing. It does | |||
| not actually store the list at any time; instead, whenever the list is | |||
| needed, it builds it dynamically using the :py:meth:`_render` method. | |||
| """ | |||
| def __init__(self, parent, sliceinfo): | |||
| @@ -21,9 +21,8 @@ | |||
| # SOFTWARE. | |||
| """ | |||
| This module contains the :py:class:`~mwparserfromhell.string_mixin.StringMixIn` | |||
| type, which implements the interface for the ``unicode`` type (``str`` on py3k) | |||
| in a dynamic manner. | |||
| This module contains the :py:class:`~.StringMixIn` type, which implements the | |||
| interface for the ``unicode`` type (``str`` on py3k) in a dynamic manner. | |||
| """ | |||
| from __future__ import unicode_literals | |||
| @@ -35,9 +34,8 @@ __all__ = ["StringMixIn"] | |||
| def inheritdoc(method): | |||
| """Set __doc__ of *method* to __doc__ of *method* in its parent class. | |||
| Since this is used on | |||
| :py:class:`~mwparserfromhell.string_mixin.StringMixIn`, the "parent class" | |||
| used is ``str``. This function can be used as a decorator. | |||
| Since this is used on :py:class:`~.StringMixIn`, the "parent class" used is | |||
| ``str``. This function can be used as a decorator. | |||
| """ | |||
| method.__doc__ = getattr(str, method.__name__).__doc__ | |||
| return method | |||
| @@ -33,20 +33,16 @@ from .nodes import Node | |||
| from .smart_list import SmartList | |||
| def parse_anything(value): | |||
| """Return a :py:class:`~mwparserfromhell.wikicode.Wikicode` for *value*. | |||
| """Return a :py:class:`~.Wikicode` for *value*, allowing multiple types. | |||
| This differs from :py:func:`mwparserfromhell.parse` in that we accept more | |||
| than just a string to be parsed. Unicode objects (strings in py3k), strings | |||
| (bytes in py3k), integers (converted to strings), ``None``, existing | |||
| :py:class:`~mwparserfromhell.nodes.Node` or | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` objects, as well as an | |||
| :py:class:`~.Node` or :py:class:`~.Wikicode` objects, as well as an | |||
| iterable of these types, are supported. This is used to parse input | |||
| on-the-fly by various methods of | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` and others like | |||
| :py:class:`~mwparserfromhell.nodes.template.Template`, such as | |||
| :py:meth:`wikicode.insert() <mwparserfromhell.wikicode.Wikicode.insert>` | |||
| or setting :py:meth:`template.name | |||
| <mwparserfromhell.nodes.template.Template.name>`. | |||
| on-the-fly by various methods of :py:class:`~.Wikicode` and others like | |||
| :py:class:`~.Template`, such as :py:meth:`wikicode.insert() | |||
| <.Wikicode.insert>` or setting :py:meth:`template.name <.Template.name>`. | |||
| """ | |||
| wikicode = mwparserfromhell.wikicode.Wikicode | |||
| if isinstance(value, wikicode): | |||
| @@ -158,10 +158,10 @@ class Wikicode(StringMixIn): | |||
| @property | |||
| def nodes(self): | |||
| """A list of :py:class:`~mwparserfromhell.nodes.Node` objects. | |||
| """A list of :py:class:`~.Node` objects. | |||
| This is the internal data actually stored within a | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` object. | |||
| :py:class:`~.Wikicode` object. | |||
| """ | |||
| return self._nodes | |||
| @@ -178,9 +178,9 @@ class Wikicode(StringMixIn): | |||
| Raises :py:exc:`IndexError` if *index* is out of range, or | |||
| :py:exc:`ValueError` if *value* cannot be coerced into one | |||
| :py:class:`~mwparserfromhell.nodes.Node`. To insert multiple nodes at | |||
| an index, use :py:meth:`get` with either :py:meth:`remove` and | |||
| :py:meth:`insert` or :py:meth:`replace`. | |||
| :py:class:`~.Node`. To insert multiple nodes at an index, use | |||
| :py:meth:`get` with either :py:meth:`remove` and :py:meth:`insert` or | |||
| :py:meth:`replace`. | |||
| """ | |||
| nodes = parse_anything(value).nodes | |||
| if len(nodes) > 1: | |||
| @@ -213,10 +213,9 @@ class Wikicode(StringMixIn): | |||
| def insert(self, index, value): | |||
| """Insert *value* at *index* in the list of nodes. | |||
| *value* can be anything parasable by | |||
| :py:func:`mwparserfromhell.utils.parse_anything`, which includes | |||
| strings or other :py:class:`~mwparserfromhell.wikicode.Wikicode` or | |||
| :py:class:`~mwparserfromhell.nodes.Node` objects. | |||
| *value* can be anything parasable by :py:func:`.parse_anything`, which | |||
| includes strings or other :py:class:`~.Wikicode` or :py:class:`~.Node` | |||
| objects. | |||
| """ | |||
| nodes = parse_anything(value).nodes | |||
| for node in reversed(nodes): | |||
| @@ -225,13 +224,11 @@ class Wikicode(StringMixIn): | |||
| def insert_before(self, obj, value, recursive=True): | |||
| """Insert *value* immediately before *obj* in the list of nodes. | |||
| *obj* can be either a string or a | |||
| :py:class:`~mwparserfromhell.nodes.Node`. *value* can be anything | |||
| parasable by :py:func:`mwparserfromhell.utils.parse_anything`. If | |||
| *recursive* is ``True``, we will try to find *obj* within our child | |||
| nodes even if it is not a direct descendant of this | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` object. If *obj* is not | |||
| in the node list, :py:exc:`ValueError` is raised. | |||
| *obj* can be either a string or a :py:class:`~.Node`. *value* can be | |||
| anything parasable by :py:func:`.parse_anything`. If *recursive* is | |||
| ``True``, we will try to find *obj* within our child nodes even if it | |||
| is not a direct descendant of this :py:class:`~.Wikicode` object. If | |||
| *obj* is not in the node list, :py:exc:`ValueError` is raised. | |||
| """ | |||
| callback = lambda self, i, value: self.insert(i, value) | |||
| self._do_search(obj, recursive, callback, self, value) | |||
| @@ -239,13 +236,11 @@ class Wikicode(StringMixIn): | |||
| def insert_after(self, obj, value, recursive=True): | |||
| """Insert *value* immediately after *obj* in the list of nodes. | |||
| *obj* can be either a string or a | |||
| :py:class:`~mwparserfromhell.nodes.Node`. *value* can be anything | |||
| parasable by :py:func:`mwparserfromhell.utils.parse_anything`. If | |||
| *recursive* is ``True``, we will try to find *obj* within our child | |||
| nodes even if it is not a direct descendant of this | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` object. If *obj* is not | |||
| in the node list, :py:exc:`ValueError` is raised. | |||
| *obj* can be either a string or a :py:class:`~.Node`. *value* can be | |||
| anything parasable by :py:func:`.parse_anything`. If *recursive* is | |||
| ``True``, we will try to find *obj* within our child nodes even if it | |||
| is not a direct descendant of this :py:class:`~.Wikicode` object. If | |||
| *obj* is not in the node list, :py:exc:`ValueError` is raised. | |||
| """ | |||
| callback = lambda self, i, value: self.insert(i + 1, value) | |||
| self._do_search(obj, recursive, callback, self, value) | |||
| @@ -253,13 +248,11 @@ class Wikicode(StringMixIn): | |||
| def replace(self, obj, value, recursive=True): | |||
| """Replace *obj* with *value* in the list of nodes. | |||
| *obj* can be either a string or a | |||
| :py:class:`~mwparserfromhell.nodes.Node`. *value* can be anything | |||
| parasable by :py:func:`mwparserfromhell.utils.parse_anything`. If | |||
| *recursive* is ``True``, we will try to find *obj* within our child | |||
| nodes even if it is not a direct descendant of this | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` object. If *obj* is not | |||
| in the node list, :py:exc:`ValueError` is raised. | |||
| *obj* can be either a string or a :py:class:`~.Node`. *value* can be | |||
| anything parasable by :py:func:`.parse_anything`. If *recursive* is | |||
| ``True``, we will try to find *obj* within our child nodes even if it | |||
| is not a direct descendant of this :py:class:`~.Wikicode` object. If | |||
| *obj* is not in the node list, :py:exc:`ValueError` is raised. | |||
| """ | |||
| def callback(self, i, value): | |||
| self.nodes.pop(i) | |||
| @@ -270,8 +263,7 @@ class Wikicode(StringMixIn): | |||
| def append(self, value): | |||
| """Insert *value* at the end of the list of nodes. | |||
| *value* can be anything parasable by | |||
| :py:func:`mwparserfromhell.utils.parse_anything`. | |||
| *value* can be anything parasable by :py:func:`.parse_anything`. | |||
| """ | |||
| nodes = parse_anything(value).nodes | |||
| for node in nodes: | |||
| @@ -280,12 +272,10 @@ class Wikicode(StringMixIn): | |||
| def remove(self, obj, recursive=True): | |||
| """Remove *obj* from the list of nodes. | |||
| *obj* can be either a string or a | |||
| :py:class:`~mwparserfromhell.nodes.Node`. If *recursive* is ``True``, | |||
| we will try to find *obj* within our child nodes even if it is not a | |||
| direct descendant of this | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` object. If *obj* is not | |||
| in the node list, :py:exc:`ValueError` is raised. | |||
| *obj* can be either a string or a :py:class:`~.Node`. If *recursive* is | |||
| ``True``, we will try to find *obj* within our child nodes even if it | |||
| is not a direct descendant of this :py:class:`~.Wikicode` object. If | |||
| *obj* is not in the node list, :py:exc:`ValueError` is raised. | |||
| """ | |||
| callback = lambda self, i: self.nodes.pop(i) | |||
| self._do_search(obj, recursive, callback, self) | |||
| @@ -316,7 +306,7 @@ class Wikicode(StringMixIn): | |||
| """Iterate over template nodes. | |||
| This is equivalent to :py:meth:`ifilter` with *forcetype* set to | |||
| :py:class:`~mwparserfromhell.nodes.template.Template`. | |||
| :py:class:`~.Template`. | |||
| """ | |||
| return self.filter(recursive, matches, flags, forcetype=Template) | |||
| @@ -324,7 +314,7 @@ class Wikicode(StringMixIn): | |||
| """Iterate over text nodes. | |||
| This is equivalent to :py:meth:`ifilter` with *forcetype* set to | |||
| :py:class:`~mwparserfromhell.nodes.text.Text`. | |||
| :py:class:`~.Text`. | |||
| """ | |||
| return self.filter(recursive, matches, flags, forcetype=Text) | |||
| @@ -332,7 +322,7 @@ class Wikicode(StringMixIn): | |||
| """Iterate over tag nodes. | |||
| This is equivalent to :py:meth:`ifilter` with *forcetype* set to | |||
| :py:class:`~mwparserfromhell.nodes.tag.Tag`. | |||
| :py:class:`~.Tag`. | |||
| """ | |||
| return self.ifilter(recursive, matches, flags, forcetype=Tag) | |||
| @@ -372,24 +362,20 @@ class Wikicode(StringMixIn): | |||
| include_headings=True): | |||
| """Return a list of sections within the page. | |||
| Sections are returned as | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` objects with a shared | |||
| node list (implemented using | |||
| :py:class:`~mwparserfromhell.smart_list.SmartList`) so that changes to | |||
| sections are reflected in the parent Wikicode object. | |||
| Sections are returned as :py:class:`~.Wikicode` objects with a shared | |||
| node list (implemented using :py:class:`~.SmartList`) so that changes | |||
| to sections are reflected in the parent Wikicode object. | |||
| With *flat* as ``True``, each returned section contains all of its | |||
| subsections within the :py:class:`~mwparserfromhell.wikicode.Wikicode`; | |||
| otherwise, the returned sections contain only the section up to the | |||
| next heading, regardless of its size. If *matches* is given, it should | |||
| be a regex to matched against the titles of section headings; only | |||
| sections whose headings match the regex will be included. If *levels* | |||
| is given, it should be a list of integers; only sections whose heading | |||
| levels are within the list will be returned. If *include_headings* is | |||
| ``True``, the section's literal | |||
| :py:class:`~mwparserfromhell.nodes.heading.Heading` object will be | |||
| included in returned :py:class:`~mwparserfromhell.wikicode.Wikicode` | |||
| objects; otherwise, this is skipped. | |||
| subsections within the :py:class:`~.Wikicode`; otherwise, the returned | |||
| sections contain only the section up to the next heading, regardless of | |||
| its size. If *matches* is given, it should be a regex to matched | |||
| against the titles of section headings; only sections whose headings | |||
| match the regex will be included. If *levels* is given, it should be a = | |||
| list of integers; only sections whose heading levels are within the | |||
| list will be returned. If *include_headings* is ``True``, the section's | |||
| literal :py:class:`~.Heading` object will be included in returned | |||
| :py:class:`~.Wikicode` objects; otherwise, this is skipped. | |||
| """ | |||
| if matches: | |||
| matches = r"^(=+?)\s*" + matches + r"\s*\1$" | |||
| @@ -421,16 +407,15 @@ class Wikicode(StringMixIn): | |||
| """Return a rendered string without unprintable code such as templates. | |||
| The way a node is stripped is handled by the | |||
| :py:meth:`~mwparserfromhell.nodes.Node.__showtree__` method of | |||
| :py:class:`~mwparserfromhell.nodes.Node` objects, which generally | |||
| return a subset of their nodes or ``None``. For example, templates and | |||
| tags are removed completely, links are stripped to just their display | |||
| part, headings are stripped to just their title. If *normalize* is | |||
| ``True``, various things may be done to strip code further, such as | |||
| converting HTML entities like ``Σ``, ``Σ``, and ``Σ`` | |||
| to ``Σ``. If *collapse* is ``True``, we will try to remove excess | |||
| whitespace as well (three or more newlines are converted to two, for | |||
| example). | |||
| :py:meth:`~.Node.__showtree__` method of :py:class:`~.Node` objects, | |||
| which generally return a subset of their nodes or ``None``. For | |||
| example, templates and tags are removed completely, links are stripped | |||
| to just their display part, headings are stripped to just their title. | |||
| If *normalize* is ``True``, various things may be done to strip code | |||
| further, such as converting HTML entities like ``Σ``, ``Σ``, | |||
| and ``Σ`` to ``Σ``. If *collapse* is ``True``, we will try to | |||
| remove excess whitespace as well (three or more newlines are converted | |||
| to two, for example). | |||
| """ | |||
| nodes = [] | |||
| for node in self.nodes: | |||
| @@ -451,8 +436,8 @@ class Wikicode(StringMixIn): | |||
| The representation is a string makes the most sense printed. It is | |||
| built by calling :py:meth:`_get_tree` on the | |||
| :py:class:`~mwparserfromhell.wikicode.Wikicode` object and its children | |||
| recursively. The end result may look something like the following:: | |||
| :py:class:`~.Wikicode` object and its children recursively. The end | |||
| result may look something like the following:: | |||
| >>> text = "Lorem ipsum {{foo|bar|{{baz}}|spam=eggs}}" | |||
| >>> print mwparserfromhell.parse(text).get_tree() | |||