diff --git a/README.rst b/README.rst index 9825938..cf2715f 100644 --- a/README.rst +++ b/README.rst @@ -35,81 +35,81 @@ You can run the comprehensive unit testing suite with Usage ----- -Normal usage is rather straightforward (where ``text`` is page text):: +Normal usage is rather straightforward (where ``text`` is page text): - >>> import mwparserfromhell - >>> wikicode = mwparserfromhell.parse(text) +>>> import mwparserfromhell +>>> wikicode = mwparserfromhell.parse(text) ``wikicode`` is a ``mwparserfromhell.Wikicode`` object, which acts like an ordinary ``str`` object (or ``unicode`` in Python 2) with some extra methods. -For example:: - - >>> text = "I has a template! {{foo|bar|baz|eggs=spam}} See it?" - >>> wikicode = mwparserfromhell.parse(text) - >>> print(wikicode) - I has a template! {{foo|bar|baz|eggs=spam}} See it? - >>> templates = wikicode.filter_templates() - >>> print(templates) - ['{{foo|bar|baz|eggs=spam}}'] - >>> template = templates[0] - >>> print(template.name) - foo - >>> print(template.params) - ['bar', 'baz', 'eggs=spam'] - >>> print(template.get(1).value) - bar - >>> print(template.get("eggs").value) - spam - -Since nodes can contain other nodes, getting nested templates is trivial:: - - >>> text = "{{foo|{{bar}}={{baz|{{spam}}}}}}" - >>> mwparserfromhell.parse(text).filter_templates() - ['{{foo|{{bar}}={{baz|{{spam}}}}}}', '{{bar}}', '{{baz|{{spam}}}}', '{{spam}}'] +For example: + +>>> text = "I has a template! {{foo|bar|baz|eggs=spam}} See it?" +>>> wikicode = mwparserfromhell.parse(text) +>>> print(wikicode) +I has a template! {{foo|bar|baz|eggs=spam}} See it? +>>> templates = wikicode.filter_templates() +>>> print(templates) +['{{foo|bar|baz|eggs=spam}}'] +>>> template = templates[0] +>>> print(template.name) +foo +>>> print(template.params) +['bar', 'baz', 'eggs=spam'] +>>> print(template.get(1).value) +bar +>>> print(template.get("eggs").value) +spam + +Since nodes can contain other nodes, getting nested templates is trivial: + +>>> text = "{{foo|{{bar}}={{baz|{{spam}}}}}}" +>>> mwparserfromhell.parse(text).filter_templates() +['{{foo|{{bar}}={{baz|{{spam}}}}}}', '{{bar}}', '{{baz|{{spam}}}}', '{{spam}}'] You can also pass ``recursive=False`` to ``filter_templates()`` and explore templates manually. This is possible because nodes can contain additional -``Wikicode`` objects:: - - >>> code = mwparserfromhell.parse("{{foo|this {{includes a|template}}}}") - >>> print(code.filter_templates(recursive=False)) - ['{{foo|this {{includes a|template}}}}'] - >>> foo = code.filter_templates(recursive=False)[0] - >>> print(foo.get(1).value) - this {{includes a|template}} - >>> print(foo.get(1).value.filter_templates()[0]) - {{includes a|template}} - >>> print(foo.get(1).value.filter_templates()[0].get(1).value) - template +``Wikicode`` objects: + +>>> code = mwparserfromhell.parse("{{foo|this {{includes a|template}}}}") +>>> print(code.filter_templates(recursive=False)) +['{{foo|this {{includes a|template}}}}'] +>>> foo = code.filter_templates(recursive=False)[0] +>>> print(foo.get(1).value) +this {{includes a|template}} +>>> print(foo.get(1).value.filter_templates()[0]) +{{includes a|template}} +>>> print(foo.get(1).value.filter_templates()[0].get(1).value) +template Templates can be easily modified to add, remove, or alter params. ``Wikicode`` objects can be treated like lists, with ``append()``, ``insert()``, ``remove()``, ``replace()``, and more. They also have a ``matches()`` method for comparing page or template names, which takes care of capitalization and -whitespace:: - - >>> text = "{{cleanup}} '''Foo''' is a [[bar]]. {{uncategorized}}" - >>> code = mwparserfromhell.parse(text) - >>> for template in code.filter_templates(): - ... if template.name.matches("Cleanup") and not template.has("date"): - ... template.add("date", "July 2012") - ... - >>> print(code) - {{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{uncategorized}} - >>> code.replace("{{uncategorized}}", "{{bar-stub}}") - >>> print(code) - {{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{bar-stub}} - >>> print(code.filter_templates()) - ['{{cleanup|date=July 2012}}', '{{bar-stub}}'] +whitespace: + +>>> text = "{{cleanup}} '''Foo''' is a [[bar]]. {{uncategorized}}" +>>> code = mwparserfromhell.parse(text) +>>> for template in code.filter_templates(): +... if template.name.matches("Cleanup") and not template.has("date"): +... template.add("date", "July 2012") +... +>>> print(code) +{{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{uncategorized}} +>>> code.replace("{{uncategorized}}", "{{bar-stub}}") +>>> print(code) +{{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{bar-stub}} +>>> print(code.filter_templates()) +['{{cleanup|date=July 2012}}', '{{bar-stub}}'] You can then convert ``code`` back into a regular ``str`` object (for -saving the page!) by calling ``str()`` on it:: +saving the page!) by calling ``str()`` on it: - >>> text = str(code) - >>> print(text) - {{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{bar-stub}} - >>> text == code - True +>>> text = str(code) +>>> print(text) +{{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{bar-stub}} +>>> text == code +True Likewise, use ``unicode(code)`` in Python 2. @@ -164,7 +164,9 @@ Integration ``Page`` objects have a ``parse`` method that essentially calls ``mwparserfromhell.parse()`` on ``page.get()``. -If you're using Pywikibot_, your code might look like this:: +If you're using Pywikibot_, your code might look like this: + +.. code-block:: python import mwparserfromhell import pywikibot @@ -176,7 +178,9 @@ If you're using Pywikibot_, your code might look like this:: return mwparserfromhell.parse(text) If you're not using a library, you can parse any page using the following -Python 3 code (via the API_):: +Python 3 code (via the API_): + +.. code-block:: python import json from urllib.parse import urlencode