mwparserfromhell


Namemwparserfromhell JSON
Version 0.6.6 PyPI version JSON
download
home_pagehttps://github.com/earwig/mwparserfromhell
SummaryMWParserFromHell is a parser for MediaWiki wikicode.
upload_time2024-01-04 06:40:20
maintainer
docs_urlNone
authorBen Kurtovic
requires_python>= 3.8
licenseMIT License
keywords earwig mwparserfromhell wikipedia wiki mediawiki wikicode template parsing
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            mwparserfromhell
================

.. image:: https://api.travis-ci.com/earwig/mwparserfromhell.svg
  :alt: Build Status
  :target: https://travis-ci.org/earwig/mwparserfromhell

.. image:: https://img.shields.io/coveralls/earwig/mwparserfromhell/main.svg
  :alt: Coverage Status
  :target: https://coveralls.io/r/earwig/mwparserfromhell

**mwparserfromhell** (the *MediaWiki Parser from Hell*) is a Python package
that provides an easy-to-use and outrageously powerful parser for MediaWiki_
wikicode. It supports Python 3.8+.

Developed by Earwig_ with contributions from `Σ`_, Legoktm_, and others.
Full documentation is available on ReadTheDocs_. Development occurs on GitHub_.

Installation
------------

The easiest way to install the parser is through the `Python Package Index`_;
you can install the latest release with ``pip install mwparserfromhell``
(`get pip`_). Make sure your pip is up-to-date first, especially on Windows.

Alternatively, get the latest development version::

    git clone https://github.com/earwig/mwparserfromhell.git
    cd mwparserfromhell
    python setup.py install

The comprehensive unit testing suite requires `pytest`_ (``pip install pytest``)
and can be run with ``python -m pytest``.

Usage
-----

Normal usage is rather straightforward (where ``text`` is page text):

>>> import mwparserfromhell
>>> wikicode = mwparserfromhell.parse(text)

``wikicode`` is a ``mwparserfromhell.Wikicode`` object, which acts like an
ordinary ``str`` object 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}}']

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

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}}']

You can then convert ``code`` back into a regular ``str`` object (for
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

Limitations
-----------

While the MediaWiki parser generates HTML and has access to the contents of
templates, among other things, mwparserfromhell acts as a direct interface to
the source code only. This has several implications:

* Syntax elements produced by a template transclusion cannot be detected. For
  example, imagine a hypothetical page ``"Template:End-bold"`` that contained
  the text ``</b>``. While MediaWiki would correctly understand that
  ``<b>foobar{{end-bold}}`` translates to ``<b>foobar</b>``, mwparserfromhell
  has no way of examining the contents of ``{{end-bold}}``. Instead, it would
  treat the bold tag as unfinished, possibly extending further down the page.

* Templates adjacent to external links, as in ``http://example.com{{foo}}``,
  are considered part of the link. In reality, this would depend on the
  contents of the template.

* When different syntax elements cross over each other, as in
  ``{{echo|''Hello}}, world!''``, the parser gets confused because this cannot
  be represented by an ordinary syntax tree. Instead, the parser will treat the
  first syntax construct as plain text. In this case, only the italic tag would
  be properly parsed.

  **Workaround:** Since this commonly occurs with text formatting and text
  formatting is often not of interest to users, you may pass
  *skip_style_tags=True* to ``mwparserfromhell.parse()``. This treats ``''``
  and ``'''`` as plain text.

  A future version of mwparserfromhell may include multiple parsing modes to
  get around this restriction more sensibly.

Additionally, the parser lacks awareness of certain wiki-specific settings:

* `Word-ending links`_ are not supported, since the linktrail rules are
  language-specific.

* Localized namespace names aren't recognized, so file links (such as
  ``[[File:...]]``) are treated as regular wikilinks.

* Anything that looks like an XML tag is treated as a tag, even if it is not a
  recognized tag name, since the list of valid tags depends on loaded MediaWiki
  extensions.

Integration
-----------

``mwparserfromhell`` is used by and originally developed for EarwigBot_;
``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:

.. code-block:: python

    import mwparserfromhell
    import pywikibot

    def parse(title):
        site = pywikibot.Site()
        page = pywikibot.Page(site, title)
        text = page.get()
        return mwparserfromhell.parse(text)

If you're not using a library, you can parse any page with the following
Python 3 code (using the API_ and the requests_ library):

.. code-block:: python

    import mwparserfromhell
    import requests

    API_URL = "https://en.wikipedia.org/w/api.php"

    def parse(title):
        params = {
            "action": "query",
            "prop": "revisions",
            "rvprop": "content",
            "rvslots": "main",
            "rvlimit": 1,
            "titles": title,
            "format": "json",
            "formatversion": "2",
        }
        headers = {"User-Agent": "My-Bot-Name/1.0"}
        req = requests.get(API_URL, headers=headers, params=params)
        res = req.json()
        revision = res["query"]["pages"][0]["revisions"][0]
        text = revision["slots"]["main"]["content"]
        return mwparserfromhell.parse(text)

.. _MediaWiki:              https://www.mediawiki.org
.. _ReadTheDocs:            https://mwparserfromhell.readthedocs.io
.. _Earwig:                 https://en.wikipedia.org/wiki/User:The_Earwig
.. _Σ:                      https://en.wikipedia.org/wiki/User:%CE%A3
.. _Legoktm:                https://en.wikipedia.org/wiki/User:Legoktm
.. _GitHub:                 https://github.com/earwig/mwparserfromhell
.. _Python Package Index:   https://pypi.org/
.. _get pip:                https://pypi.org/project/pip/
.. _pytest:                 https://docs.pytest.org/
.. _Word-ending links:      https://www.mediawiki.org/wiki/Help:Links#linktrail
.. _EarwigBot:              https://github.com/earwig/earwigbot
.. _Pywikibot:              https://www.mediawiki.org/wiki/Manual:Pywikibot
.. _API:                    https://www.mediawiki.org/wiki/API:Main_page
.. _requests:               https://2.python-requests.org

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/earwig/mwparserfromhell",
    "name": "mwparserfromhell",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">= 3.8",
    "maintainer_email": "",
    "keywords": "earwig mwparserfromhell wikipedia wiki mediawiki wikicode template parsing",
    "author": "Ben Kurtovic",
    "author_email": "ben.kurtovic@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/47/aa/358f9af602b743ac8898353f240f678b69722801bd0625507c69d9755936/mwparserfromhell-0.6.6.tar.gz",
    "platform": null,
    "description": "mwparserfromhell\n================\n\n.. image:: https://api.travis-ci.com/earwig/mwparserfromhell.svg\n  :alt: Build Status\n  :target: https://travis-ci.org/earwig/mwparserfromhell\n\n.. image:: https://img.shields.io/coveralls/earwig/mwparserfromhell/main.svg\n  :alt: Coverage Status\n  :target: https://coveralls.io/r/earwig/mwparserfromhell\n\n**mwparserfromhell** (the *MediaWiki Parser from Hell*) is a Python package\nthat provides an easy-to-use and outrageously powerful parser for MediaWiki_\nwikicode. It supports Python 3.8+.\n\nDeveloped by Earwig_ with contributions from `\u03a3`_, Legoktm_, and others.\nFull documentation is available on ReadTheDocs_. Development occurs on GitHub_.\n\nInstallation\n------------\n\nThe easiest way to install the parser is through the `Python Package Index`_;\nyou can install the latest release with ``pip install mwparserfromhell``\n(`get pip`_). Make sure your pip is up-to-date first, especially on Windows.\n\nAlternatively, get the latest development version::\n\n    git clone https://github.com/earwig/mwparserfromhell.git\n    cd mwparserfromhell\n    python setup.py install\n\nThe comprehensive unit testing suite requires `pytest`_ (``pip install pytest``)\nand can be run with ``python -m pytest``.\n\nUsage\n-----\n\nNormal usage is rather straightforward (where ``text`` is page text):\n\n>>> import mwparserfromhell\n>>> wikicode = mwparserfromhell.parse(text)\n\n``wikicode`` is a ``mwparserfromhell.Wikicode`` object, which acts like an\nordinary ``str`` object with some extra methods. For example:\n\n>>> text = \"I has a template! {{foo|bar|baz|eggs=spam}} See it?\"\n>>> wikicode = mwparserfromhell.parse(text)\n>>> print(wikicode)\nI has a template! {{foo|bar|baz|eggs=spam}} See it?\n>>> templates = wikicode.filter_templates()\n>>> print(templates)\n['{{foo|bar|baz|eggs=spam}}']\n>>> template = templates[0]\n>>> print(template.name)\nfoo\n>>> print(template.params)\n['bar', 'baz', 'eggs=spam']\n>>> print(template.get(1).value)\nbar\n>>> print(template.get(\"eggs\").value)\nspam\n\nSince nodes can contain other nodes, getting nested templates is trivial:\n\n>>> text = \"{{foo|{{bar}}={{baz|{{spam}}}}}}\"\n>>> mwparserfromhell.parse(text).filter_templates()\n['{{foo|{{bar}}={{baz|{{spam}}}}}}', '{{bar}}', '{{baz|{{spam}}}}', '{{spam}}']\n\nYou can also pass ``recursive=False`` to ``filter_templates()`` and explore\ntemplates manually. This is possible because nodes can contain additional\n``Wikicode`` objects:\n\n>>> code = mwparserfromhell.parse(\"{{foo|this {{includes a|template}}}}\")\n>>> print(code.filter_templates(recursive=False))\n['{{foo|this {{includes a|template}}}}']\n>>> foo = code.filter_templates(recursive=False)[0]\n>>> print(foo.get(1).value)\nthis {{includes a|template}}\n>>> print(foo.get(1).value.filter_templates()[0])\n{{includes a|template}}\n>>> print(foo.get(1).value.filter_templates()[0].get(1).value)\ntemplate\n\nTemplates can be easily modified to add, remove, or alter params. ``Wikicode``\nobjects can be treated like lists, with ``append()``, ``insert()``,\n``remove()``, ``replace()``, and more. They also have a ``matches()`` method\nfor comparing page or template names, which takes care of capitalization and\nwhitespace:\n\n>>> text = \"{{cleanup}} '''Foo''' is a [[bar]]. {{uncategorized}}\"\n>>> code = mwparserfromhell.parse(text)\n>>> for template in code.filter_templates():\n...     if template.name.matches(\"Cleanup\") and not template.has(\"date\"):\n...         template.add(\"date\", \"July 2012\")\n...\n>>> print(code)\n{{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{uncategorized}}\n>>> code.replace(\"{{uncategorized}}\", \"{{bar-stub}}\")\n>>> print(code)\n{{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{bar-stub}}\n>>> print(code.filter_templates())\n['{{cleanup|date=July 2012}}', '{{bar-stub}}']\n\nYou can then convert ``code`` back into a regular ``str`` object (for\nsaving the page!) by calling ``str()`` on it:\n\n>>> text = str(code)\n>>> print(text)\n{{cleanup|date=July 2012}} '''Foo''' is a [[bar]]. {{bar-stub}}\n>>> text == code\nTrue\n\nLimitations\n-----------\n\nWhile the MediaWiki parser generates HTML and has access to the contents of\ntemplates, among other things, mwparserfromhell acts as a direct interface to\nthe source code only. This has several implications:\n\n* Syntax elements produced by a template transclusion cannot be detected. For\n  example, imagine a hypothetical page ``\"Template:End-bold\"`` that contained\n  the text ``</b>``. While MediaWiki would correctly understand that\n  ``<b>foobar{{end-bold}}`` translates to ``<b>foobar</b>``, mwparserfromhell\n  has no way of examining the contents of ``{{end-bold}}``. Instead, it would\n  treat the bold tag as unfinished, possibly extending further down the page.\n\n* Templates adjacent to external links, as in ``http://example.com{{foo}}``,\n  are considered part of the link. In reality, this would depend on the\n  contents of the template.\n\n* When different syntax elements cross over each other, as in\n  ``{{echo|''Hello}}, world!''``, the parser gets confused because this cannot\n  be represented by an ordinary syntax tree. Instead, the parser will treat the\n  first syntax construct as plain text. In this case, only the italic tag would\n  be properly parsed.\n\n  **Workaround:** Since this commonly occurs with text formatting and text\n  formatting is often not of interest to users, you may pass\n  *skip_style_tags=True* to ``mwparserfromhell.parse()``. This treats ``''``\n  and ``'''`` as plain text.\n\n  A future version of mwparserfromhell may include multiple parsing modes to\n  get around this restriction more sensibly.\n\nAdditionally, the parser lacks awareness of certain wiki-specific settings:\n\n* `Word-ending links`_ are not supported, since the linktrail rules are\n  language-specific.\n\n* Localized namespace names aren't recognized, so file links (such as\n  ``[[File:...]]``) are treated as regular wikilinks.\n\n* Anything that looks like an XML tag is treated as a tag, even if it is not a\n  recognized tag name, since the list of valid tags depends on loaded MediaWiki\n  extensions.\n\nIntegration\n-----------\n\n``mwparserfromhell`` is used by and originally developed for EarwigBot_;\n``Page`` objects have a ``parse`` method that essentially calls\n``mwparserfromhell.parse()`` on ``page.get()``.\n\nIf you're using Pywikibot_, your code might look like this:\n\n.. code-block:: python\n\n    import mwparserfromhell\n    import pywikibot\n\n    def parse(title):\n        site = pywikibot.Site()\n        page = pywikibot.Page(site, title)\n        text = page.get()\n        return mwparserfromhell.parse(text)\n\nIf you're not using a library, you can parse any page with the following\nPython 3 code (using the API_ and the requests_ library):\n\n.. code-block:: python\n\n    import mwparserfromhell\n    import requests\n\n    API_URL = \"https://en.wikipedia.org/w/api.php\"\n\n    def parse(title):\n        params = {\n            \"action\": \"query\",\n            \"prop\": \"revisions\",\n            \"rvprop\": \"content\",\n            \"rvslots\": \"main\",\n            \"rvlimit\": 1,\n            \"titles\": title,\n            \"format\": \"json\",\n            \"formatversion\": \"2\",\n        }\n        headers = {\"User-Agent\": \"My-Bot-Name/1.0\"}\n        req = requests.get(API_URL, headers=headers, params=params)\n        res = req.json()\n        revision = res[\"query\"][\"pages\"][0][\"revisions\"][0]\n        text = revision[\"slots\"][\"main\"][\"content\"]\n        return mwparserfromhell.parse(text)\n\n.. _MediaWiki:              https://www.mediawiki.org\n.. _ReadTheDocs:            https://mwparserfromhell.readthedocs.io\n.. _Earwig:                 https://en.wikipedia.org/wiki/User:The_Earwig\n.. _\u03a3:                      https://en.wikipedia.org/wiki/User:%CE%A3\n.. _Legoktm:                https://en.wikipedia.org/wiki/User:Legoktm\n.. _GitHub:                 https://github.com/earwig/mwparserfromhell\n.. _Python Package Index:   https://pypi.org/\n.. _get pip:                https://pypi.org/project/pip/\n.. _pytest:                 https://docs.pytest.org/\n.. _Word-ending links:      https://www.mediawiki.org/wiki/Help:Links#linktrail\n.. _EarwigBot:              https://github.com/earwig/earwigbot\n.. _Pywikibot:              https://www.mediawiki.org/wiki/Manual:Pywikibot\n.. _API:                    https://www.mediawiki.org/wiki/API:Main_page\n.. _requests:               https://2.python-requests.org\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "MWParserFromHell is a parser for MediaWiki wikicode.",
    "version": "0.6.6",
    "project_urls": {
        "Download": "https://github.com/earwig/mwparserfromhell/tarball/v0.6.6",
        "Homepage": "https://github.com/earwig/mwparserfromhell"
    },
    "split_keywords": [
        "earwig",
        "mwparserfromhell",
        "wikipedia",
        "wiki",
        "mediawiki",
        "wikicode",
        "template",
        "parsing"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "70ac91a87496212f8909f983f6f057ddd1b4ba897bf48a67e4fdecc50d37b0ec",
                "md5": "2f7ddc4fb36829632015a859f42e1ec7",
                "sha256": "d6995b9cfe6ec79556db0232a39210ac11aa69ee304cfc95b29c51be381e202b"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp310-cp310-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2f7ddc4fb36829632015a859f42e1ec7",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">= 3.8",
            "size": 99352,
            "upload_time": "2024-01-04T06:40:14",
            "upload_time_iso_8601": "2024-01-04T06:40:14.027423Z",
            "url": "https://files.pythonhosted.org/packages/70/ac/91a87496212f8909f983f6f057ddd1b4ba897bf48a67e4fdecc50d37b0ec/mwparserfromhell-0.6.6-cp310-cp310-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4e694fd2699c1d2db1a86e8ca02b5f1af7f49ab50c4da924c95d2dfd3be8c936",
                "md5": "ba88488ec4cc860124241ee3b39ddce9",
                "sha256": "ebc70f8a24aa60e54728be740f1c12a4acb1b12d1cc947d87b067cc1c83339fd"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "ba88488ec4cc860124241ee3b39ddce9",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">= 3.8",
            "size": 192557,
            "upload_time": "2024-01-04T06:45:44",
            "upload_time_iso_8601": "2024-01-04T06:45:44.271252Z",
            "url": "https://files.pythonhosted.org/packages/4e/69/4fd2699c1d2db1a86e8ca02b5f1af7f49ab50c4da924c95d2dfd3be8c936/mwparserfromhell-0.6.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "94c623cf7c7525af4c70573c6a86a576daa4815b0fa3385a5b62eeef0b5cd0d6",
                "md5": "4d0b235362f24ec9f474a66679b31967",
                "sha256": "9136696d6b29838adcf8f428e3f7028b2c6e788fc05fe1beeb4b135429c356df"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4d0b235362f24ec9f474a66679b31967",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">= 3.8",
            "size": 191006,
            "upload_time": "2024-01-04T06:45:45",
            "upload_time_iso_8601": "2024-01-04T06:45:45.875469Z",
            "url": "https://files.pythonhosted.org/packages/94/c6/23cf7c7525af4c70573c6a86a576daa4815b0fa3385a5b62eeef0b5cd0d6/mwparserfromhell-0.6.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d74a6aedd790b97ca897fe091cc9f1fdf9c7543cfdd1f56074e4af1d2489c7ee",
                "md5": "e12828d449a5a0002fd56a485685c7a2",
                "sha256": "6b11dea3bcdebe4554933169eade815e9d6b898175faa5a20a744524fd99210f"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp310-cp310-win32.whl",
            "has_sig": false,
            "md5_digest": "e12828d449a5a0002fd56a485685c7a2",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">= 3.8",
            "size": 98529,
            "upload_time": "2024-01-04T07:09:10",
            "upload_time_iso_8601": "2024-01-04T07:09:10.302224Z",
            "url": "https://files.pythonhosted.org/packages/d7/4a/6aedd790b97ca897fe091cc9f1fdf9c7543cfdd1f56074e4af1d2489c7ee/mwparserfromhell-0.6.6-cp310-cp310-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fb34d9c24046343296c076ab3b093b3a0081318b86c1d1396ec6f308805003a3",
                "md5": "73532185fd8fbd0d001b7b691959227f",
                "sha256": "6a89edf53f15877223d923e122e9a97f3f7b85f56dc56d91a3d77b89c9dd4126"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "73532185fd8fbd0d001b7b691959227f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">= 3.8",
            "size": 100534,
            "upload_time": "2024-01-04T07:11:07",
            "upload_time_iso_8601": "2024-01-04T07:11:07.327555Z",
            "url": "https://files.pythonhosted.org/packages/fb/34/d9c24046343296c076ab3b093b3a0081318b86c1d1396ec6f308805003a3/mwparserfromhell-0.6.6-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "19151eb4fc9d68747885fb08f431de74a77a9b04851c141d58507ed337e721b2",
                "md5": "7e2cd6ab0f73d44ade66a605273008fa",
                "sha256": "fff66e97f7c02aa0fd57ff8f702977a9c5a1d72ef55b64ee9b146291e4c41057"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp311-cp311-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "7e2cd6ab0f73d44ade66a605273008fa",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">= 3.8",
            "size": 123842,
            "upload_time": "2024-01-04T06:40:16",
            "upload_time_iso_8601": "2024-01-04T06:40:16.911702Z",
            "url": "https://files.pythonhosted.org/packages/19/15/1eb4fc9d68747885fb08f431de74a77a9b04851c141d58507ed337e721b2/mwparserfromhell-0.6.6-cp311-cp311-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bd67cbe2512d3ad77520fa869aaf14f3bd76402ca9d0d11c3068386d0eb75696",
                "md5": "60d4b3856bca44512ae36f9662a16049",
                "sha256": "59633d3cc09993af75ced8dfbd6800e1e38e64620851a095575621548448875c"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "60d4b3856bca44512ae36f9662a16049",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">= 3.8",
            "size": 197677,
            "upload_time": "2024-01-04T06:45:48",
            "upload_time_iso_8601": "2024-01-04T06:45:48.466285Z",
            "url": "https://files.pythonhosted.org/packages/bd/67/cbe2512d3ad77520fa869aaf14f3bd76402ca9d0d11c3068386d0eb75696/mwparserfromhell-0.6.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9b1ed3e3ff290be89135854c5945953c8fd9615388e795de1eb3da71e1a5b9ca",
                "md5": "4229d9dc165768afa2d8e96b7a51797b",
                "sha256": "007d0859e5467241b73c6e974df039a074609ce4e2b9df8c2263a8920554d032"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4229d9dc165768afa2d8e96b7a51797b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">= 3.8",
            "size": 196287,
            "upload_time": "2024-01-04T06:45:50",
            "upload_time_iso_8601": "2024-01-04T06:45:50.554021Z",
            "url": "https://files.pythonhosted.org/packages/9b/1e/d3e3ff290be89135854c5945953c8fd9615388e795de1eb3da71e1a5b9ca/mwparserfromhell-0.6.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3ddaaf2daa54a7a6d89eb9c37320a0a39d9815b66b1d5bd000fa80d43f1a6847",
                "md5": "8037a7c9e0b4eb1e12081dfd9676a390",
                "sha256": "dbe5976b1b524e26aa2eb71b6219960f2578f56b536c68e0a79deb63e3b7f710"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp311-cp311-win32.whl",
            "has_sig": false,
            "md5_digest": "8037a7c9e0b4eb1e12081dfd9676a390",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">= 3.8",
            "size": 98364,
            "upload_time": "2024-01-04T07:13:15",
            "upload_time_iso_8601": "2024-01-04T07:13:15.215656Z",
            "url": "https://files.pythonhosted.org/packages/3d/da/af2daa54a7a6d89eb9c37320a0a39d9815b66b1d5bd000fa80d43f1a6847/mwparserfromhell-0.6.6-cp311-cp311-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "305116b6381021d3bb5ce1a277fd3334f7155f4aed1885e22eae78f4bfa07923",
                "md5": "2eba4ecc98106032854f1276a3955c87",
                "sha256": "063c1e79befd1f55d77c358e0f5006f5ecf88ddf218ff6af55188d686139330e"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2eba4ecc98106032854f1276a3955c87",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">= 3.8",
            "size": 100668,
            "upload_time": "2024-01-04T07:15:07",
            "upload_time_iso_8601": "2024-01-04T07:15:07.090604Z",
            "url": "https://files.pythonhosted.org/packages/30/51/16b6381021d3bb5ce1a277fd3334f7155f4aed1885e22eae78f4bfa07923/mwparserfromhell-0.6.6-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "61c0059513420490a2d96b470d4f560445d89f022a4749a20a952bfb002e2915",
                "md5": "39baa3cb68857e7a5039ea48f6f40f9b",
                "sha256": "910d36bc70e8bea758380e75c12fd47626b295abec9f73a6099d8f937a649e77"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp312-cp312-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "39baa3cb68857e7a5039ea48f6f40f9b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">= 3.8",
            "size": 124175,
            "upload_time": "2024-01-04T06:40:23",
            "upload_time_iso_8601": "2024-01-04T06:40:23.559579Z",
            "url": "https://files.pythonhosted.org/packages/61/c0/059513420490a2d96b470d4f560445d89f022a4749a20a952bfb002e2915/mwparserfromhell-0.6.6-cp312-cp312-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bcabda1b51303f0457c8cd343cf2d9a66fd0c5654fe8d0331c8107751459191f",
                "md5": "bd57217092d984e6160587f2c994b877",
                "sha256": "d2febd92a55a3f19b461833267726cb81429c3d6cb0006ad1691dfa849789e5d"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "bd57217092d984e6160587f2c994b877",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">= 3.8",
            "size": 203036,
            "upload_time": "2024-01-04T06:45:52",
            "upload_time_iso_8601": "2024-01-04T06:45:52.127096Z",
            "url": "https://files.pythonhosted.org/packages/bc/ab/da1b51303f0457c8cd343cf2d9a66fd0c5654fe8d0331c8107751459191f/mwparserfromhell-0.6.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7a396bd8d9678e8b3f57babee36b5a9540db8cccba1b81a64ed56576c653994b",
                "md5": "443d9a2e985429b72efca7c6b690e4d7",
                "sha256": "2b75fae6d01c8fda19dbf127175122d7aa2964ef6454690e6868bbc3d80a7bc1"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "443d9a2e985429b72efca7c6b690e4d7",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">= 3.8",
            "size": 201886,
            "upload_time": "2024-01-04T06:45:53",
            "upload_time_iso_8601": "2024-01-04T06:45:53.526648Z",
            "url": "https://files.pythonhosted.org/packages/7a/39/6bd8d9678e8b3f57babee36b5a9540db8cccba1b81a64ed56576c653994b/mwparserfromhell-0.6.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "15b798e5e4fc94270cc6ec20261081b21daf0f9dda8db53003848b0794547daa",
                "md5": "a8352662d56aefe28443cb5128549fc5",
                "sha256": "fd05481adc0806f4b8f8f8cb309ec56924b17ce386cb1c2f73919d8a012e6b16"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp38-cp38-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a8352662d56aefe28443cb5128549fc5",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">= 3.8",
            "size": 99356,
            "upload_time": "2024-01-04T06:40:47",
            "upload_time_iso_8601": "2024-01-04T06:40:47.123658Z",
            "url": "https://files.pythonhosted.org/packages/15/b7/98e5e4fc94270cc6ec20261081b21daf0f9dda8db53003848b0794547daa/mwparserfromhell-0.6.6-cp38-cp38-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a3f281c29426e1b6ec55111b068603d38188b9b067503c2ac0f95deac1363b9b",
                "md5": "c44defb199883802a455eccb48c2202d",
                "sha256": "03e03b8bec729af850457d045b04d0c9d3e296ff8bf66b455f754cccb29c3bea"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "c44defb199883802a455eccb48c2202d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">= 3.8",
            "size": 197956,
            "upload_time": "2024-01-04T06:45:54",
            "upload_time_iso_8601": "2024-01-04T06:45:54.906077Z",
            "url": "https://files.pythonhosted.org/packages/a3/f2/81c29426e1b6ec55111b068603d38188b9b067503c2ac0f95deac1363b9b/mwparserfromhell-0.6.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7ec15780c084c0626735e330c6150ef4acb0f73f8b6b0720d79198ef6fb32483",
                "md5": "48c77db8f7784738d7ea4479d5e80730",
                "sha256": "1d2422659abb29191a0fa096cf8bead837ac3ecd343065569b2acc7a84ecf866"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "48c77db8f7784738d7ea4479d5e80730",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">= 3.8",
            "size": 196132,
            "upload_time": "2024-01-04T06:45:56",
            "upload_time_iso_8601": "2024-01-04T06:45:56.792637Z",
            "url": "https://files.pythonhosted.org/packages/7e/c1/5780c084c0626735e330c6150ef4acb0f73f8b6b0720d79198ef6fb32483/mwparserfromhell-0.6.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9ef6ed9d07dc35378371e4812e2df50b2019f9d59ab2fc351ff0a222b70c0bc7",
                "md5": "aa24cd4c5181674c8f52de5aaedf08d8",
                "sha256": "a58251a5d5c77abdfd061624dc05667c2774e93e8178a2fbd1a3b45f8673f1a9"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp38-cp38-win32.whl",
            "has_sig": false,
            "md5_digest": "aa24cd4c5181674c8f52de5aaedf08d8",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">= 3.8",
            "size": 100945,
            "upload_time": "2024-01-04T07:01:19",
            "upload_time_iso_8601": "2024-01-04T07:01:19.118356Z",
            "url": "https://files.pythonhosted.org/packages/9e/f6/ed9d07dc35378371e4812e2df50b2019f9d59ab2fc351ff0a222b70c0bc7/mwparserfromhell-0.6.6-cp38-cp38-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dafd73684ae8ba1dba96061d17764481a9112910c77aa5e72c15a2da1050d36a",
                "md5": "fe98eb5a750e83f7dad392951363c828",
                "sha256": "e28ffa9a7e0748ec64002a84234201ef69c2d4a710508baf9cc25f4ee274c6bd"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "fe98eb5a750e83f7dad392951363c828",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">= 3.8",
            "size": 103875,
            "upload_time": "2024-01-04T07:03:07",
            "upload_time_iso_8601": "2024-01-04T07:03:07.212753Z",
            "url": "https://files.pythonhosted.org/packages/da/fd/73684ae8ba1dba96061d17764481a9112910c77aa5e72c15a2da1050d36a/mwparserfromhell-0.6.6-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0e3fca66ec2a86be83cbd107d12e7d8edc139ad0c18b1361123a6c311662f420",
                "md5": "289e8a168456d7cadf7daed8c70e4289",
                "sha256": "746bad799179684994ecee72a26352e0bbe2b697f6a7e35dc5ad151606bcb8ab"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp39-cp39-macosx_11_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "289e8a168456d7cadf7daed8c70e4289",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">= 3.8",
            "size": 99358,
            "upload_time": "2024-01-04T06:40:13",
            "upload_time_iso_8601": "2024-01-04T06:40:13.962552Z",
            "url": "https://files.pythonhosted.org/packages/0e/3f/ca66ec2a86be83cbd107d12e7d8edc139ad0c18b1361123a6c311662f420/mwparserfromhell-0.6.6-cp39-cp39-macosx_11_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ffb0b47287759839cb1f3da9946c2b73f4ad324dffd319020371846d1fe3499f",
                "md5": "a6f4686a7ca40a8f81a04c327454aff9",
                "sha256": "50c482e703d2d51401f7e36a71ae9493901f170225940196292f97398713dde5"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "a6f4686a7ca40a8f81a04c327454aff9",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">= 3.8",
            "size": 192112,
            "upload_time": "2024-01-04T06:45:58",
            "upload_time_iso_8601": "2024-01-04T06:45:58.672865Z",
            "url": "https://files.pythonhosted.org/packages/ff/b0/b47287759839cb1f3da9946c2b73f4ad324dffd319020371846d1fe3499f/mwparserfromhell-0.6.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cf73be45e97670103132f37d20efde2e8d391505eace17ba1962bdf1fa52212e",
                "md5": "f97ada256db3973140cbb3a81b7e5c2d",
                "sha256": "1915fe4f5e5ae34f16242d4cd98da2adc81a810ab94105ec2af3dc95d7ce74aa"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f97ada256db3973140cbb3a81b7e5c2d",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">= 3.8",
            "size": 190515,
            "upload_time": "2024-01-04T06:46:00",
            "upload_time_iso_8601": "2024-01-04T06:46:00.527465Z",
            "url": "https://files.pythonhosted.org/packages/cf/73/be45e97670103132f37d20efde2e8d391505eace17ba1962bdf1fa52212e/mwparserfromhell-0.6.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "633f34271ba4889a8071ee65e8fadba8116abaebfa68b684b268d7245bc4ff04",
                "md5": "55b4841f9c31d8bb16e7bd60509b5231",
                "sha256": "54e2dd30edc1a358408d14343b30dcca0b4613227781e4bbee968bd4395d94ff"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp39-cp39-win32.whl",
            "has_sig": false,
            "md5_digest": "55b4841f9c31d8bb16e7bd60509b5231",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">= 3.8",
            "size": 100967,
            "upload_time": "2024-01-04T07:05:08",
            "upload_time_iso_8601": "2024-01-04T07:05:08.322540Z",
            "url": "https://files.pythonhosted.org/packages/63/3f/34271ba4889a8071ee65e8fadba8116abaebfa68b684b268d7245bc4ff04/mwparserfromhell-0.6.6-cp39-cp39-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "720af4583a92d3489d5cbc256b12b5c88c65fb5f259d5ed0448f78f8f9f30c24",
                "md5": "b802d9a58f5df5667b3a286e18f3b39e",
                "sha256": "1960bcc5115ea57427df130150edf1dbfc2fb03465e548e630bb6eb37976d793"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "b802d9a58f5df5667b3a286e18f3b39e",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">= 3.8",
            "size": 103879,
            "upload_time": "2024-01-04T07:07:03",
            "upload_time_iso_8601": "2024-01-04T07:07:03.692011Z",
            "url": "https://files.pythonhosted.org/packages/72/0a/f4583a92d3489d5cbc256b12b5c88c65fb5f259d5ed0448f78f8f9f30c24/mwparserfromhell-0.6.6-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "47aa358f9af602b743ac8898353f240f678b69722801bd0625507c69d9755936",
                "md5": "a93a031436cdd62995d04c4ff79e4458",
                "sha256": "71afec1e9784ba576e95d6f34845582d3c733a3a52ba770dd8a9c3a40e5b649f"
            },
            "downloads": -1,
            "filename": "mwparserfromhell-0.6.6.tar.gz",
            "has_sig": false,
            "md5_digest": "a93a031436cdd62995d04c4ff79e4458",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">= 3.8",
            "size": 138899,
            "upload_time": "2024-01-04T06:40:20",
            "upload_time_iso_8601": "2024-01-04T06:40:20.170662Z",
            "url": "https://files.pythonhosted.org/packages/47/aa/358f9af602b743ac8898353f240f678b69722801bd0625507c69d9755936/mwparserfromhell-0.6.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-01-04 06:40:20",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "earwig",
    "github_project": "mwparserfromhell",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "appveyor": true,
    "lcname": "mwparserfromhell"
}
        
Elapsed time: 0.16402s