|
@@ -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, |
|
|