v0.6 (unreleased): - Dropped support for end-of-life Python versions 2.6, 3.2, 3.3. (#199, #204) - Fixed not being considered a single-only tag. (#200) v0.5.1 (released March 3, 2018): - Improved behavior when adding parameters to templates (via Template.add()) with poorly formatted whitespace conventions. (#185) - Fixed the parser getting stuck in deeply nested HTML tags with unclosed, quoted attributes. (#190) v0.5 (released June 23, 2017): - Added Wikicode.contains() to determine whether a Node or Wikicode object is contained within another Wikicode object. - Added Wikicode.get_ancestors() and Wikicode.get_parent() to find all ancestors and the direct parent of a Node, respectively. - Fixed a long-standing performance issue with deeply nested, invalid syntax (issue #42). The parser should be much faster on certain complex pages. The "max cycle" restriction has also been removed, so some situations where templates at the end of a page were being skipped are now resolved. - Made Template.remove(keep_field=True) behave more reasonably when the parameter is already empty. - Added the keep_template_params argument to Wikicode.strip_code(). If True, then template parameters will be preserved in the output. - Wikicode objects can now be pickled properly (fixed infinite recursion error on incompletely-constructed StringMixIn subclasses). - Fixed Wikicode.matches()'s behavior on iterables besides lists and tuples. - Fixed len() sometimes raising ValueError on empty node lists. - Fixed a rare parsing bug involving self-closing tags inside the attributes of unpaired tags. - Fixed release script after changes to PyPI. v0.4.4 (released December 30, 2016): - Added support for Python 3.6. - Fixed parsing bugs involving: - wikitables nested in templates; - wikitable error recovery when unable to recurse; - templates nested in template parameters before other parameters. - Fixed parsing file-like objects. - Made builds deterministic. - Documented caveats. v0.4.3 (released October 29, 2015): - Added Windows binaries for Python 3.5. - Fixed edge cases involving wikilinks inside of external links and vice versa. - Fixed a C tokenizer crash when a keyboard interrupt happens while parsing. v0.4.2 (released July 30, 2015): - Fixed setup script not including header files in releases. - Fixed Windows binary uploads. v0.4.1 (released July 30, 2015): - The process for building Windows binaries has been fixed, and these should be distributed along with new releases. Windows users can now take advantage of C speedups without having a compiler of their own. - Added support for Python 3.5. - '<' and '>' are now disallowed in wikilink titles and template names. This includes when denoting tags, but not comments. - Fixed the behavior of preserve_spacing in Template.add() and keep_field in Template.remove() on parameters with hidden keys. - Removed _ListProxy.detach(). SmartLists now use weak references and their children are garbage-collected properly. - Fixed parser bugs involving: - templates with completely blank names; - templates with newlines and comments. - Heavy refactoring and fixes to the C tokenizer, including: - corrected a design flaw in text handling, allowing for substantial speed improvements when parsing long strings of plain text; - implemented new Python 3.3 PEP 393 Unicode APIs. - Fixed various bugs in SmartList, including one that was causing memory issues on 64-bit builds of Python 2 on Windows. - Fixed some bugs in the release scripts. v0.4 (released May 23, 2015): - The parser now falls back on pure Python mode if C extensions cannot be built. This fixes an issue that prevented some Windows users from installing the parser. - Added support for parsing wikicode tables (patches by David Winegar). - Added a script to test for memory leaks in scripts/memtest.py. - Added a script to do releases in scripts/release.sh. - skip_style_tags can now be passed to mwparserfromhell.parse() (previously, only Parser().parse() allowed it). - The 'recursive' argument to Wikicode's filter methods now accepts a third option, RECURSE_OTHERS, which recurses over all children except instances of 'forcetype' (for example, `code.filter_templates(code.RECURSE_OTHERS)` returns all un-nested templates). - The parser now understands HTML tag attributes quoted with single quotes. When setting a tag attribute's value, quotes will be added if necessary. As part of this, Attribute's 'quoted' attribute has been changed to 'quotes', and is now either a string or None. - Calling Template.remove() with a Parameter object that is not part of the template now raises ValueError instead of doing nothing. - Parameters with non-integer keys can no longer be created with 'showkey=False', nor have the value of this attribute be set to False later. - _ListProxy.destroy() has been changed to _ListProxy.detach(), and now works in a more useful way. - If something goes wrong while parsing, ParserError will now be raised. Previously, the parser would produce an unclear BadRoute exception or allow an incorrect node tree to be build. - Fixed parser bugs involving: - nested tags; - comments in template names; - tags inside of tags. - Added tests to ensure that parsed trees convert back to wikicode without unintentional modifications. - Added support for a NOWEB environment variable, which disables a unit test that makes a web call. - Test coverage has been improved, and some minor related bugs have been fixed. - Updated and fixed some documentation. v0.3.3 (released April 22, 2014): - Added support for Python 2.6 and 3.4. - Template.has() is now passed 'ignore_empty=False' by default instead of True. This fixes a bug when adding parameters to templates with empty fields, and is a breaking change if you rely on the default behavior. - The 'matches' argument of Wikicode's filter methods now accepts a function (taking one argument, a Node, and returning a bool) in addition to a regex. - Re-added 'flat' argument to Wikicode.get_sections(), fixed the order in which it returns sections, and made it faster. - Wikicode.matches() now accepts a tuple or list of strings/Wikicode objects instead of just a single string or Wikicode. - Given the frequency of issues with the (admittedly insufficient) tag parser, there's a temporary skip_style_tags argument to parse() that ignores '' and ''' until these issues are corrected. - Fixed a parser bug involving nested wikilinks and external links. - C code cleanup and speed improvements. v0.3.2 (released September 1, 2013): - Added support for Python 3.2 (along with current support for 3.3 and 2.7). - Renamed Template.remove()'s first argument from 'name' to 'param', which now accepts Parameter objects in addition to parameter name strings. v0.3.1 (released August 29, 2013): - Fixed a parser bug involving URLs nested inside other markup. - Fixed some typos. v0.3 (released August 24, 2013): - Added complete support for HTML Tags, including forms like foo, , and wiki-markup tags like bold ('''), italics (''), and lists (*, #, ; and :). - Added support for ExternalLinks (http://example.com/ and [http://example.com/ Example]). - Wikicode's filter methods are now passed 'recursive=True' by default instead of False. This is a breaking change if you rely on any filter() methods being non-recursive by default. - Added a matches() method to Wikicode for page/template name comparisons. - The 'obj' param of Wikicode.insert_before(), insert_after(), replace(), and remove() now accepts other Wikicode objects and strings representing parts of wikitext, instead of just nodes. These methods also make all possible substitutions instead of just one. - Renamed Template.has_param() to has() for consistency with Template's other methods; has_param() is now an alias. - The C tokenizer extension now works on Python 3 in addition to Python 2.7. - Various bugfixes, internal changes, and cleanup. v0.2 (released June 20, 2013): - The parser now fully supports Python 3 in addition to Python 2.7. - Added a C tokenizer extension that is significantly faster than its Python equivalent. It is enabled by default (if available) and can be toggled by setting `mwparserfromhell.parser.use_c` to a boolean value. - Added a complete set of unit tests covering parsing and wikicode manipulation. - Renamed Wikicode.filter_links() to filter_wikilinks() (applies to ifilter as well). - Added filter methods for Arguments, Comments, Headings, and HTMLEntities. - Added 'before' param to Template.add(); renamed 'force_nonconformity' to 'preserve_spacing'. - Added 'include_lead' param to Wikicode.get_sections(). - Removed 'flat' param from Wikicode.get_sections(). - Removed 'force_no_field' param from Template.remove(). - Added support for Travis CI. - Added note about Windows build issue in the README. - The tokenizer will limit itself to a realistic recursion depth to prevent errors and unreasonably long parse times. - Fixed how some nodes' attribute setters handle input. - Fixed multiple bugs in the tokenizer's handling of invalid markup. - Fixed bugs in the implementation of SmartList and StringMixIn. - Fixed some broken example code in the README; other copyedits. - Other bugfixes and code cleanup. v0.1.1 (released September 21, 2012): - Added support for Comments () and Wikilinks ([[foo]]). - Added corresponding ifilter_links() and filter_links() methods to Wikicode. - Fixed a bug when parsing incomplete templates. - Fixed strip_code() to affect the contents of headings. - Various copyedits in documentation and comments. v0.1 (released August 23, 2012): - Initial release.