==============
lxml changelog
==============

4.9.2 (2022-12-13)
==================

Bugs fixed
----------

* CVE-2022-2309: A Bug in libxml2 2.9.1[0-4] could let namespace declarations
  from a failed parser run leak into later parser runs.  This bug was worked around
  in lxml and resolved in libxml2 2.10.0.
  https://gitlab.gnome.org/GNOME/libxml2/-/issues/378

Other changes
-------------

* LP#1981760: ``Element.attrib`` now registers as ``collections.abc.MutableMapping``.

* lxml now has a static build setup for macOS on ARM64 machines (not used for building wheels).
  Patch by Quentin Leffray.


4.9.1 (2022-07-01)
==================

Bugs fixed
----------

* A crash was resolved when using ``iterwalk()`` (or ``canonicalize()``)
  after parsing certain incorrect input.  Note that ``iterwalk()`` can crash
  on *valid* input parsed with the same parser *after* failing to parse the
  incorrect input.


4.9.0 (2022-06-01)
==================

Bugs fixed
----------

* GH#341: The mixin inheritance order in ``lxml.html`` was corrected.
  Patch by xmo-odoo.

Other changes
-------------

* Built with Cython 0.29.30 to adapt to changes in Python 3.11 and 3.12.

* Wheels include zlib 1.2.12, libxml2 2.9.14 and libxslt 1.1.35
  (libxml2 2.9.12+ and libxslt 1.1.34 on Windows).

* GH#343: Windows-AArch64 build support in Visual Studio.
  Patch by Steve Dower.


4.8.0 (2022-02-17)
==================

Features added
--------------

* GH#337: Path-like objects are now supported throughout the API instead of just strings.
  Patch by Henning Janssen.

* The ``ElementMaker`` now supports ``QName`` values as tags, which always override
  the default namespace of the factory.

Bugs fixed
----------

* GH#338: In lxml.objectify, the XSI float annotation "nan" and "inf" were spelled in
  lower case, whereas XML Schema datatypes define them as "NaN" and "INF" respectively.
  Patch by Tobias Deiminger.

Other changes
-------------

* Built with Cython 0.29.28.


4.7.1 (2021-12-13)
==================

Features added
--------------

* Chunked Unicode string parsing via ``parser.feed()`` now encodes the input data
  to the native UTF-8 encoding directly, instead of going through ``Py_UNICODE`` /
  ``wchar_t`` encoding first, which previously required duplicate recoding in most cases.

Bugs fixed
----------

* The standard namespace prefixes were mishandled during "C14N2" serialisation on Python 3.
  See https://mail.python.org/archives/list/lxml@python.org/thread/6ZFBHFOVHOS5GFDOAMPCT6HM5HZPWQ4Q/

* ``lxml.objectify`` previously accepted non-XML numbers with underscores (like "1_000")
  as integers or float values in Python 3.6 and later. It now adheres to the number
  format of the XML spec again.

* LP#1939031: Static wheels of lxml now contain the header files of zlib and libiconv
  (in addition to the already provided headers of libxml2/libxslt/libexslt).

Other changes
-------------

* Wheels include libxml2 2.9.12+ and libxslt 1.1.34 (also on Windows).


4.7.0 (2021-12-13)
==================

* Release retracted due to missing files in lxml/includes/.


4.6.5 (2021-12-12)
==================

Bugs fixed
----------

* A vulnerability (GHSL-2021-1038) in the HTML cleaner allowed sneaking script
  content through SVG images (CVE-2021-43818).

* A vulnerability (GHSL-2021-1037) in the HTML cleaner allowed sneaking script
  content through CSS imports and other crafted constructs (CVE-2021-43818).


4.6.4 (2021-11-01)
==================

Features added
--------------

* GH#317: A new property ``system_url`` was added to DTD entities.
  Patch by Thirdegree.

* GH#314: The ``STATIC_*`` variables in ``setup.py`` can now be passed via env vars.
  Patch by Isaac Jurado.


4.6.3 (2021-03-21)
==================

Bugs fixed
----------

* A vulnerability (CVE-2021-28957) was discovered in the HTML Cleaner by Kevin Chung,
  which allowed JavaScript to pass through.  The cleaner now removes the HTML5
  ``formaction`` attribute.


4.6.2 (2020-11-26)
==================

Bugs fixed
----------

* A vulnerability (CVE-2020-27783) was discovered in the HTML Cleaner by Yaniv Nizry,
  which allowed JavaScript to pass through.  The cleaner now removes more sneaky
  "style" content.


4.6.1 (2020-10-18)
==================

Bugs fixed
----------

* A vulnerability was discovered in the HTML Cleaner by Yaniv Nizry, which allowed
  JavaScript to pass through.  The cleaner now removes more sneaky "style" content.


4.6.0 (2020-10-17)
==================

Features added
--------------

* GH#310: ``lxml.html.InputGetter`` supports ``__len__()`` to count the number of input fields.
  Patch by Aidan Woolley.

* ``lxml.html.InputGetter`` has a new ``.items()`` method to ease processing all input fields.

* ``lxml.html.InputGetter.keys()`` now returns the field names in document order.

* GH-309: The API documentation is now generated using ``sphinx-apidoc``.
  Patch by Chris Mayo.

Bugs fixed
----------

* LP#1869455: C14N 2.0 serialisation failed for unprefixed attributes
  when a default namespace was defined.

* ``TreeBuilder.close()`` raised ``AssertionError`` in some error cases where it
  should have raised ``XMLSyntaxError``.  It now raises a combined exception to
  keep up backwards compatibility, while switching to ``XMLSyntaxError`` as an
  interface.


4.5.2 (2020-07-09)
==================

Bugs fixed
----------

* ``Cleaner()`` now validates that only known configuration options can be set.

* LP#1882606: ``Cleaner.clean_html()`` discarded comments and PIs regardless of the
  corresponding configuration option, if ``remove_unknown_tags`` was set.

* LP#1880251: Instead of globally overwriting the document loader in libxml2, lxml now
  sets it per parser run, which improves the interoperability with other users of libxml2
  such as libxmlsec.

* LP#1881960: Fix build in CPython 3.10 by using Cython 0.29.21.

* The setup options "--with-xml2-config" and "--with-xslt-config" were accidentally renamed
  to "--xml2-config" and "--xslt-config" in 4.5.1 and are now available again.


4.5.1 (2020-05-19)
==================

Bugs fixed
----------

* LP#1570388: Fix failures when serialising documents larger than 2GB in some cases.

* LP#1865141, GH#298: ``QName`` values were not accepted by the ``el.iter()`` method.
  Patch by xmo-odoo.

* LP#1863413, GH#297: The build failed to detect libraries on Linux that are only
  configured via pkg-config.
  Patch by Hugh McMaster.


4.5.0 (2020-01-29)
==================

Features added
--------------

* A new function ``indent()`` was added to insert tail whitespace for pretty-printing
  an XML tree.

Bugs fixed
----------

* LP#1857794: Tail text of nodes that get removed from a document using item
  deletion disappeared silently instead of sticking with the node that was removed.

Other changes
-------------

* MacOS builds are 64-bit-only by default.
  Set CFLAGS and LDFLAGS explicitly to override it.

* Linux/MacOS Binary wheels now use libxml2 2.9.10 and libxslt 1.1.34.

* LP#1840234: The package version number is now available as ``lxml.__version__``.


4.4.3 (2020-01-28)
==================

Bugs fixed
----------

* LP#1844674: ``itertext()`` was missing tail text of comments and PIs since 4.4.0.


4.4.2 (2019-11-25)
==================

Bugs fixed
----------

* LP#1835708: ``ElementInclude`` incorrectly rejected repeated non-recursive
  includes as recursive.
  Patch by Rainer Hausdorf.


4.4.1 (2019-08-11)
==================

Bugs fixed
----------

* LP#1838252: The order of an OrderedDict was lost in 4.4.0 when passing it as
  attrib mapping during element creation.

* LP#1838521: The package metadata now lists the supported Python versions.


4.4.0 (2019-07-27)
==================

Features added
--------------

* ``Element.clear()`` accepts a new keyword argument ``keep_tail=True`` to clear
  everything but the tail text.  This is helpful in some document-style use cases
  and for clearing the current element in ``iterparse()`` and pull parsing.

* When creating attributes or namespaces from a dict in Python 3.6+, lxml now
  preserves the original insertion order of that dict, instead of always sorting
  the items by name.  A similar change was made for ElementTree in CPython 3.8.
  See https://bugs.python.org/issue34160

* Integer elements in ``lxml.objectify`` implement the ``__index__()`` special method.

* GH#269: Read-only elements in XSLT were missing the ``nsmap`` property.
  Original patch by Jan Pazdziora.

* ElementInclude can now restrict the maximum inclusion depth via a ``max_depth``
  argument to prevent content explosion.  It is limited to 6 by default.

* The ``target`` object of the XMLParser can have ``start_ns()`` and ``end_ns()``
  callback methods to listen to namespace declarations.

* The ``TreeBuilder`` has new arguments ``comment_factory`` and ``pi_factory`` to
  pass factories for creating comments and processing instructions, as well as
  flag arguments ``insert_comments`` and ``insert_pis`` to discard them from the
  tree when set to false.

* A `C14N 2.0 <https://www.w3.org/TR/xml-c14n2/>`_ implementation was added as
  ``etree.canonicalize()``, a corresponding ``C14NWriterTarget`` class, and
  a ``c14n2`` serialisation method.

Bugs fixed
----------

* When writing to file paths that contain the URL escape character '%', the file
  path could wrongly be mangled by URL unescaping and thus write to a different
  file or directory.  Code that writes to file paths that are provided by untrusted
  sources, but that must work with previous versions of lxml, should best either
  reject paths that contain '%' characters, or otherwise make sure that the path
  does not contain maliciously injected '%XX' URL hex escapes for paths like '../'.

* Assigning to Element child slices with negative step could insert the slice at
  the wrong position, starting too far on the left.

* Assigning to Element child slices with overly large step size could take very
  long, regardless of the length of the actual slice.

* Assigning to Element child slices of the wrong size could sometimes fail to
  raise a ValueError (like a list assignment would) and instead assign outside
  of the original slice bounds or leave parts of it unreplaced.

* The ``comment`` and ``pi`` events in ``iterwalk()`` were never triggered, and
  instead, comments and processing instructions in the tree were reported as
  ``start`` elements.  Also, when walking an ElementTree (as opposed to its root
  element), comments and PIs outside of the root element are now reported.

* LP#1827833: The RelaxNG compact syntax support was broken with recent versions
  of ``rnc2rng``.

* LP#1758553: The HTML elements ``source`` and ``track`` were added to the list
  of empty tags in ``lxml.html.defs``.

* Registering a prefix other than "xml" for the XML namespace is now rejected.

* Failing to write XSLT output to a file could raise a misleading exception.
  It now raises ``IOError``.

Other changes
-------------

* Support for Python 3.4 was removed.

* When using ``Element.find*()`` with prefix-namespace mappings, the empty string
  is now accepted to define a default namespace, in addition to the previously
  supported ``None`` prefix.  Empty strings are more convenient since they keep
  all prefix keys in a namespace dict strings, which simplifies sorting etc.

* The ``ElementTree.write_c14n()`` method has been deprecated in favour of the
  long preferred ``ElementTree.write(f, method="c14n")``.  It will be removed
  in a future release.


4.3.5 (2019-07-27)
==================

* Rebuilt with Cython 0.29.13 to support Python 3.8.


4.3.4 (2019-06-10)
==================

* Rebuilt with Cython 0.29.10 to support Python 3.8.


4.3.3 (2019-03-26)
==================

Bugs fixed
----------

* Fix leak of output buffer and unclosed files in ``_XSLTResultTree.write_output()``.


4.3.2 (2019-02-29)
==================

Bugs fixed
----------

* Crash in 4.3.1 when appending a child subtree with certain text nodes.

Other changes
-------------

* Built with Cython 0.29.6.


4.3.1 (2019-02-08)
==================

Bugs fixed
----------

* LP#1814522: Crash when appending a child subtree that contains unsubstituted
  entity references.

Other changes
-------------

* Built with Cython 0.29.5.


4.3.0 (2019-01-04)
==================

Features added
--------------

* The module ``lxml.sax`` is compiled using Cython in order to speed it up.

* GH#267: ``lxml.sax.ElementTreeProducer`` now preserves the namespace prefixes.
  If two prefixes point to the same URI, the first prefix in alphabetical order
  is used.  Patch by Lennart Regebro.

* Updated ISO-Schematron implementation to 2013 version (now MIT licensed)
  and the corresponding schema to the 2016 version (with optional "properties").

Other changes
-------------

* GH#270, GH#271: Support for Python 2.6 and 3.3 was removed.
  Patch by hugovk.

* The minimum dependency versions were raised to libxml2 2.9.2 and libxslt 1.1.27,
  which were released in 2014 and 2012 respectively.

* Built with Cython 0.29.2.


4.2.6 (2019-01-02)
==================

Bugs fixed
----------

* LP#1799755: Fix a DeprecationWarning in Py3.7+.

* Import warnings in Python 3.6+ were resolved.


4.2.5 (2018-09-09)
==================

Bugs fixed
----------

* Javascript URLs that used URL escaping were not removed by the HTML cleaner.
  Security problem found by Omar Eissa.  (CVE-2018-19787)


4.2.4 (2018-08-03)
==================

Features added
--------------

* GH#259: Allow using ``pkg-config`` for build configuration.
  Patch by Patrick Griffis.

Bugs fixed
----------

* LP#1773749, GH#268: Crash when moving an element to another document with
  ``Element.insert()``.
  Patch by Alexander Weggerle.


4.2.3 (2018-06-27)
==================

Bugs fixed
----------

* Reverted GH#265: lxml links against zlib as a shared library again.


4.2.2 (2018-06-22)
==================

Bugs fixed
----------

* GH#266: Fix sporadic crash during GC when parse-time schema validation is used
  and the parser participates in a reference cycle.
  Original patch by Julien Greard.

* GH#265: lxml no longer links against zlib as a shared library, only on static builds.
  Patch by Nehal J Wani.


4.2.1 (2018-03-21)
==================

Bugs fixed
----------

* LP#1755825: ``iterwalk()`` failed to return the 'start' event for the initial
  element if a tag selector is used.

* LP#1756314: Failure to import 4.2.0 into PyPy due to a missing library symbol.

* LP#1727864, GH#258: Add "-isysroot" linker option on MacOS as needed by XCode 9.


4.2.0 (2018-03-13)
==================

Features added
--------------

* GH#255: ``SelectElement.value`` returns more standard-compliant and
  browser-like defaults for non-multi-selects.  If no option is selected, the
  value of the first option is returned (instead of None).  If multiple options
  are selected, the value of the last one is returned (instead of that of the
  first one).  If no options are present (not standard-compliant)
  ``SelectElement.value`` still returns ``None``.

* GH#261: The ``HTMLParser()`` now supports the ``huge_tree`` option.
  Patch by stranac.

Bugs fixed
----------

* LP#1551797: Some XSLT messages were not captured by the transform error log.

* LP#1737825: Crash at shutdown after an interrupted iterparse run with XMLSchema
  validation.

Other changes
-------------


4.1.1 (2017-11-04)
==================

* Rebuild with Cython 0.27.3 to improve support for Py3.7.


4.1.0 (2017-10-13)
==================

Features added
--------------

* ElementPath supports text predicates for current node, like "[.='text']".

* ElementPath allows spaces in predicates.

* Custom Element classes and XPath functions can now be registered with a
  decorator rather than explicit dict assignments.

* Static Linux wheels are now built with link time optimisation (LTO) enabled.
  This should have a beneficial impact on the overall performance by providing
  a tighter compiler integration between lxml and libxml2/libxslt.

Bugs fixed
----------

* LP#1722776: Requesting non-Element objects like comments from a document with
  ``PythonElementClassLookup`` could fail with a TypeError.


4.0.0 (2017-09-17)
==================

Features added
--------------

* The ElementPath implementation is now compiled using Cython,
  which speeds up the ``.find*()`` methods quite significantly.

* The modules ``lxml.builder``, ``lxml.html.diff`` and ``lxml.html.clean``
  are also compiled using Cython in order to speed them up.

* ``xmlfile()`` supports async coroutines using ``async with`` and ``await``.

* ``iterwalk()`` has a new method ``skip_subtree()`` that prevents walking into
  the descendants of the current element.

* ``RelaxNG.from_rnc_string()`` accepts a ``base_url`` argument to
  allow relative resource lookups.

* The XSLT result object has a new method ``.write_output(file)`` that serialises
  output data into a file according to the ``<xsl:output>`` configuration.

Bugs fixed
----------

* GH#251: HTML comments were handled incorrectly by the soupparser.
  Patch by mozbugbox.

* LP#1654544: The html5parser no longer passes the ``useChardet`` option
  if the input is a Unicode string, unless explicitly requested.  When parsing
  files, the default is to enable it when a URL or file path is passed (because
  the file is then opened in binary mode), and to disable it when reading from
  a file(-like) object.

  Note: This is a backwards incompatible change of the default configuration.
  If your code parses byte strings/streams and depends on character detection,
  please pass the option ``guess_charset=True`` explicitly, which already worked
  in older lxml versions.

* LP#1703810: ``etree.fromstring()`` failed to parse UTF-32 data with BOM.

* LP#1526522: Some RelaxNG errors were not reported in the error log.

* LP#1567526: Empty and plain text input raised a TypeError in soupparser.

* LP#1710429: Uninitialised variable usage in HTML diff.

* LP#1415643: The closing tags context manager in ``xmlfile()`` could continue
  to output end tags even after writing failed with an exception.

* LP#1465357: ``xmlfile.write()`` now accepts and ignores None as input argument.

* Compilation under Py3.7-pre failed due to a modified function signature.

Other changes
-------------

* The main module source files were renamed from ``lxml.*.pyx`` to plain
  ``*.pyx`` (e.g. ``etree.pyx``) to simplify their handling in the build
  process.  Care was taken to keep the old header files as fallbacks for
  code that compiles against the public C-API of lxml, but it might still
  be worth validating that third-party code does not notice this change.


3.8.0 (2017-06-03)
==================

Features added
--------------

* ``ElementTree.write()`` has a new option ``doctype`` that writes out a
  doctype string before the serialisation, in the same way as ``tostring()``.

* GH#220: ``xmlfile`` allows switching output methods at an element level.
  Patch by Burak Arslan.

* LP#1595781, GH#240: added a PyCapsule Python API and C-level API for
  passing externally generated libxml2 documents into lxml.

* GH#244: error log entries have a new property ``path`` with an XPath
  expression (if known, None otherwise) that points to the tree element
  responsible for the error. Patch by Bob Kline.

* The namespace prefix mapping that can be used in ElementPath now injects
  a default namespace when passing a None prefix.

Bugs fixed
----------

* GH#238: Character escapes were not hex-encoded in the ``xmlfile`` serialiser.
  Patch by matejcik.

* GH#229: fix for externally created XML documents.  Patch by Theodore Dubois.

* LP#1665241, GH#228: Form data handling in lxml.html no longer strips the
  option values specified in form attributes but only the text values.
  Patch by Ashish Kulkarni.

* LP#1551797: revert previous fix for XSLT error logging as it breaks
  multi-threaded XSLT processing.

* LP#1673355, GH#233: ``fromstring()`` html5parser failed to parse byte strings.

Other changes
-------------

* The previously undocumented ``docstring`` option in ``ElementTree.write()``
  produces a deprecation warning and will eventually be removed.


3.7.4 (2017-??-??)
==================

Bugs fixed
----------

* LP#1551797: revert previous fix for XSLT error logging as it breaks
  multi-threaded XSLT processing.

* LP#1673355, GH#233: ``fromstring()`` html5parser failed to parse byte strings.


3.7.3 (2017-02-18)
==================

Bugs fixed
----------

* GH#218 was ineffective in Python 3.

* GH#222: ``lxml.html.submit_form()`` failed in Python 3.
  Patch by Jakub Wilk.


3.7.2 (2017-01-08)
==================

* GH#220: ``xmlfile`` allows switching output methods at an element level.
  Patch by Burak Arslan.

Bugs fixed
----------

* Work around installation problems in recent Python 2.7 versions
  due to FTP download failures.

* GH#219: ``xmlfile.element()`` was not properly quoting attribute values.
  Patch by Burak Arslan.

* GH#218: ``xmlfile.element()`` was not properly escaping text content of
  script/style tags.  Patch by Burak Arslan.


3.7.1 (2016-12-23)
==================

* No source changes, issued only to solve problems with the
  binary packages released for 3.7.0.


3.7.0 (2016-12-10)
==================

Features added
--------------

* GH#217: ``XMLSyntaxError`` now behaves more like its ``SyntaxError``
  baseclass.  Patch by Philipp A.

* GH#216: ``HTMLParser()`` now supports the same ``collect_ids`` parameter
  as ``XMLParser()``.  Patch by Burak Arslan.

* GH#210: Allow specifying a serialisation method in ``xmlfile.write()``.
  Patch by Burak Arslan.

* GH#203: New option ``default_doctype`` in ``HTMLParser`` that allows
  disabling the automatic doctype creation.  Patch by Shadab Zafar.

* GH#201: Calling the method ``.set('attrname')`` without value argument
  (or ``None``) on HTML elements creates an attribute without value that
  serialises like ``<div attrname></div>``.  Patch by Daniel Holth.

* GH#197: Ignore form input fields in ``form_values()`` when they are
  marked as ``disabled`` in HTML.  Patch by Kristian Klemon.

Bugs fixed
----------

* GH#206: File name and line number were missing from XSLT error messages.
  Patch by Marcus Brinkmann.

Other changes
-------------

* Log entries no longer allow anything but plain string objects as message text
  and file name.

* ``zlib`` is included in the list of statically built libraries.


3.6.4 (2016-08-20)
==================

* GH#204, LP#1614693: build fix for MacOS-X.


3.6.3 (2016-08-18)
==================

* LP#1614603: change linker flags to build multi-linux wheels


3.6.2 (2016-08-18)
==================

* LP#1614603: release without source changes to provide cleanly built Linux wheels


3.6.1 (2016-07-24)
==================

Features added
--------------

* GH#180: Separate option ``inline_style`` for Cleaner that only removes ``style``
  attributes instead of all styles.  Patch by Christian Pedersen.

* GH#196: Windows build support for Python 3.5.  Contribution by Maximilian Hils.

Bugs fixed
----------

* GH#199: Exclude ``file`` fields from ``FormElement.form_values`` (as browsers do).
  Patch by Tomas Divis.

* GH#198, LP#1568167: Try to provide base URL from ``Resolver.resolve_string()``.
  Patch by Michael van Tellingen.

* GH#191: More accurate float serialisation in ``objectify.FloatElement``.
  Patch by Holger Joukl.

* LP#1551797: Repair XSLT error logging. Patch by Marcus Brinkmann.


3.6.0 (2016-03-17)
==================

Features added
--------------

* GH#187: Now supports (only) version 5.x and later of PyPy.
  Patch by Armin Rigo.

* GH#181: Direct support for ``.rnc`` files in `RelaxNG()` if ``rnc2rng``
  is installed.  Patch by Dirkjan Ochtman.

Bugs fixed
----------

* GH#189: Static builds honour FTP proxy configurations when downloading
  the external libs.  Patch by Youhei Sakurai.

* GH#186: Soupparser failed to process entities in Python 3.x.
  Patch by Duncan Morris.

* GH#185: Rare encoding related ``TypeError`` on import was fixed.
  Patch by Petr Demin.


3.5.0 (2015-11-13)
==================

Bugs fixed
----------

* Unicode string results failed XPath queries in PyPy.

* LP#1497051: HTML target parser failed to terminate on exceptions
  and continued parsing instead.

* Deprecated API usage in doctestcompare.


3.5.0b1 (2015-09-18)
====================

Features added
--------------

* ``cleanup_namespaces()`` accepts a new argument ``keep_ns_prefixes``
  that does not remove definitions of the provided prefix-namespace
  mapping from the tree.

* ``cleanup_namespaces()`` accepts a new argument ``top_nsmap`` that
  moves definitions of the provided prefix-namespace mapping to the
  top of the tree.

* LP#1490451: ``Element`` objects gained a ``cssselect()`` method as
  known from ``lxml.html``.  Patch by Simon Sapin.

* API functions and methods behave and look more like Python functions,
  which allows introspection on them etc.  One side effect to be aware of
  is that the functions now bind as methods when assigned to a class
  variable.  A quick fix is to wrap them in ``staticmethod()`` (as for
  normal Python functions).

* ISO-Schematron support gained an option ``error_finder`` that allows
  passing a filter function for picking validation errors from reports.

* LP#1243600: Elements in ``lxml.html`` gained a ``classes`` property
  that provides a set-like interface to the ``class`` attribute.
  Original patch by masklinn.

* LP#1341964: The soupparser now handles DOCTYPE declarations, comments
  and processing instructions outside of the root element.
  Patch by Olli Pottonen.

* LP#1421512: The ``docinfo`` of a tree was made editable to allow
  setting and removing the public ID and system ID of the DOCTYPE.
  Patch by Olli Pottonen.

* LP#1442427: More work-arounds for quirks and bugs in pypy and pypy3.

* ``lxml.html.soupparser`` now uses BeautifulSoup version 4 instead
  of version 3 if available.

Bugs fixed
----------

* Memory errors that occur during tree adaptations (e.g. moving subtrees
  to foreign documents) could leave the tree in a crash prone state.

* Calling ``process_children()`` in an XSLT extension element without
  an ``output_parent`` argument failed with a ``TypeError``.
  Fix by Jens Tröger.

* GH#162: Image data in HTML ``data`` URLs is considered safe and
  no longer removed by ``lxml.html.clean`` JavaScript cleaner.

* GH#166: Static build could link libraries in wrong order.

* GH#172: Rely a bit more on libxml2 for encoding detection rather than
  rolling our own in some cases.  Patch by Olli Pottonen.

* GH#159: Validity checks for names and string content were tightened
  to detect the use of illegal characters early.  Patch by Olli Pottonen.

* LP#1421921: Comments/PIs before the DOCTYPE declaration were not
  serialised.  Patch by Olli Pottonen.

* LP#659367: Some HTML DOCTYPE declarations were not serialised.
  Patch by Olli Pottonen.

* LP#1238503: lxml.doctestcompare is now consistent with stdlib's doctest
  in how it uses ``+`` and ``-`` to refer to unexpected and missing output.

* Empty prefixes are explicitly rejected when a namespace mapping is used
  with ElementPath to avoid hiding bugs in user code.

* Several problems with PyPy were fixed by switching to Cython 0.23.


3.4.4 (2015-04-25)
==================

Bugs fixed
----------

* An ElementTree compatibility test added in lxml 3.4.3 that failed in
  Python 3.4+ was removed again.


3.4.3 (2015-04-15)
==================

Bugs fixed
----------

* Expression cache in ElementPath was ignored.  Fix by Changaco.

* LP#1426868: Passing a default namespace and a prefixed namespace mapping
  as nsmap into ``xmlfile.element()`` raised a ``TypeError``.

* LP#1421927: DOCTYPE system URLs were incorrectly quoted when containing
  double quotes.  Patch by Olli Pottonen.

* LP#1419354: meta-redirect URLs were incorrectly processed by
  ``iterlinks()`` if preceded by whitespace.


3.4.2 (2015-02-07)
==================

Bugs fixed
----------

* LP#1415907: Crash when creating an XMLSchema from a non-root element
  of an XML document.

* LP#1369362: HTML cleaning failed when hitting processing instructions
  with pseudo-attributes.

* ``CDATA()`` wrapped content was rejected for tail text.

* CDATA sections were not serialised as tail text of the top-level element.
