| @@ -218,10 +218,11 @@ class Wikicode(StringMixIn): | |||||
| def insert_before(self, obj, value, recursive=True): | def insert_before(self, obj, value, recursive=True): | ||||
| """Insert *value* immediately before *obj* in the list of nodes. | """Insert *value* immediately before *obj* in the list of nodes. | ||||
| *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 | |||||
| *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 | :py:class:`~mwparserfromhell.wikicode.Wikicode` object. If *obj* is not | ||||
| in the node list, :py:exc:`ValueError` is raised. | in the node list, :py:exc:`ValueError` is raised. | ||||
| """ | """ | ||||
| @@ -231,10 +232,11 @@ class Wikicode(StringMixIn): | |||||
| def insert_after(self, obj, value, recursive=True): | def insert_after(self, obj, value, recursive=True): | ||||
| """Insert *value* immediately after *obj* in the list of nodes. | """Insert *value* immediately after *obj* in the list of nodes. | ||||
| *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 | |||||
| *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 | :py:class:`~mwparserfromhell.wikicode.Wikicode` object. If *obj* is not | ||||
| in the node list, :py:exc:`ValueError` is raised. | in the node list, :py:exc:`ValueError` is raised. | ||||
| """ | """ | ||||
| @@ -242,6 +244,16 @@ class Wikicode(StringMixIn): | |||||
| self._do_search(obj, recursive, callback, self, value) | self._do_search(obj, recursive, callback, self, value) | ||||
| def replace(self, obj, value, recursive=True): | 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. | |||||
| """ | |||||
| def callback(self, i, value): | def callback(self, i, value): | ||||
| self.nodes.pop(i) | self.nodes.pop(i) | ||||
| self.insert(i, value) | self.insert(i, value) | ||||
| @@ -249,16 +261,41 @@ class Wikicode(StringMixIn): | |||||
| self._do_search(obj, recursive, callback, self, value) | self._do_search(obj, recursive, callback, self, value) | ||||
| def append(self, value): | 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`. | |||||
| """ | |||||
| nodes = parse_anything(value).nodes | nodes = parse_anything(value).nodes | ||||
| for node in nodes: | for node in nodes: | ||||
| self.nodes.append(node) | self.nodes.append(node) | ||||
| def remove(self, obj, recursive=True): | 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. | |||||
| """ | |||||
| callback = lambda self, i: self.nodes.pop(i) | callback = lambda self, i: self.nodes.pop(i) | ||||
| self._do_search(obj, recursive, callback, self) | self._do_search(obj, recursive, callback, self) | ||||
| def ifilter(self, recursive=False, matches=None, flags=FLAGS, | def ifilter(self, recursive=False, matches=None, flags=FLAGS, | ||||
| forcetype=None): | forcetype=None): | ||||
| """Iterate over nodes in our list matching certain conditions. | |||||
| If *recursive* is ``True``, we will iterate over our children and all | |||||
| descendants of our children, otherwise just our immediate children. If | |||||
| *matches* is given, we will only yield the nodes that match the given | |||||
| regular expression (with :py:func:`re.search`). The default flags used | |||||
| are :py:const:`re.IGNORECASE`, :py:const:`re.DOTALL`, and | |||||
| :py:const:`re.UNICODE`, but custom flags can be specified by passing | |||||
| *flags*. If *forcetype* is given, only nodes that are instances of this | |||||
| type are yielded. | |||||
| """ | |||||
| if recursive: | if recursive: | ||||
| nodes = self._get_all_nodes(self) | nodes = self._get_all_nodes(self) | ||||
| else: | else: | ||||
| @@ -269,25 +306,60 @@ class Wikicode(StringMixIn): | |||||
| yield node | yield node | ||||
| def ifilter_templates(self, recursive=False, matches=None, flags=FLAGS): | def ifilter_templates(self, recursive=False, matches=None, flags=FLAGS): | ||||
| """Iterate over template nodes. | |||||
| This is equivalent to :py:meth:`ifilter` with *forcetype* set to | |||||
| :py:class:`~mwparserfromhell.nodes.template.Template`. It takes all | |||||
| other arguments passable to :py:meth:`ifilter`. | |||||
| """ | |||||
| return self.filter(recursive, matches, flags, forcetype=Template) | return self.filter(recursive, matches, flags, forcetype=Template) | ||||
| def ifilter_text(self, recursive=False, matches=None, flags=FLAGS): | def ifilter_text(self, recursive=False, matches=None, flags=FLAGS): | ||||
| """Iterate over text nodes. | |||||
| This is equivalent to :py:meth:`ifilter` with *forcetype* set to | |||||
| :py:class:`~mwparserfromhell.nodes.text.Text`. | |||||
| """ | |||||
| return self.filter(recursive, matches, flags, forcetype=Text) | return self.filter(recursive, matches, flags, forcetype=Text) | ||||
| def ifilter_tags(self, recursive=False, matches=None, flags=FLAGS): | def ifilter_tags(self, recursive=False, matches=None, flags=FLAGS): | ||||
| """Iterate over tag nodes. | |||||
| This is equivalent to :py:meth:`ifilter` with *forcetype* set to | |||||
| :py:class:`~mwparserfromhell.nodes.tag.Tag`. | |||||
| """ | |||||
| return self.ifilter(recursive, matches, flags, forcetype=Tag) | return self.ifilter(recursive, matches, flags, forcetype=Tag) | ||||
| def filter(self, recursive=False, matches=None, flags=FLAGS, | def filter(self, recursive=False, matches=None, flags=FLAGS, | ||||
| forcetype=None): | forcetype=None): | ||||
| """Return a list of nodes within our list matching certain conditions. | |||||
| This is equivalent to calling :py:func:`list` on :py:meth:`ifilter`. | |||||
| """ | |||||
| return list(self.ifilter(recursive, matches, flags, forcetype)) | return list(self.ifilter(recursive, matches, flags, forcetype)) | ||||
| def filter_templates(self, recursive=False, matches=None, flags=FLAGS): | def filter_templates(self, recursive=False, matches=None, flags=FLAGS): | ||||
| """Return a list of template nodes. | |||||
| This is equivalent to calling :py:func:`list` on | |||||
| :py:meth:`ifilter_templates`. | |||||
| """ | |||||
| return list(self.ifilter_templates(recursive, matches, flags)) | return list(self.ifilter_templates(recursive, matches, flags)) | ||||
| def filter_text(self, recursive=False, matches=None, flags=FLAGS): | def filter_text(self, recursive=False, matches=None, flags=FLAGS): | ||||
| """Return a list of text nodes. | |||||
| This is equivalent to calling :py:func:`list` on | |||||
| :py:meth:`ifilter_text`. | |||||
| """ | |||||
| return list(self.ifilter_text(recursive, matches, flags)) | return list(self.ifilter_text(recursive, matches, flags)) | ||||
| def filter_tags(self, recursive=False, matches=None, flags=FLAGS): | def filter_tags(self, recursive=False, matches=None, flags=FLAGS): | ||||
| """Return a list of tag nodes. | |||||
| This is equivalent to calling :py:func:`list` on | |||||
| :py:meth:`ifilter_tags`. | |||||
| """ | |||||
| return list(self.ifilter_tags(recursive, matches, flags)) | return list(self.ifilter_tags(recursive, matches, flags)) | ||||
| def get_sections(self, flat=True, matches=None, levels=None, flags=FLAGS, | def get_sections(self, flat=True, matches=None, levels=None, flags=FLAGS, | ||||