API Changes in 3.0.0 This is a major update. See the main changes for details. API Changes in 2.1.1 * NEW METHOD: document() returns the DOMDocument * BUG FIX: Issue #10 has been re-fixed to correctly collapse certain empty tags. * BUG FIX: Issue #10 has been re-fixed to correctly escape JavaScript for browsers. * BUG FIX: Issue #47 has been fixed to only remove XML declaration, but leave DOCTYPE. * NEW ARGUMENT: xpath() now supports $options, which includes the ability to set a namespace. API Changes in 2.1 All changes are documented in their respective doc blocks. So take a look at http://api.querypath.org to learn more. New Functions * The `htmlqp()` method has been added for parsing icky HTML. Use this for web scraping. Altered Functions * The qp() function now supports the following new options: - convert_to_encoding - convert_from_encoding - strip_low_ascii - use_parser New Methods * attach()/detach() * has() * emptyElement() * even()/odd() * first()/last() * firstChild()/lastChild() * nextUntil()/prevUntil() * parentsUntil() * encodeDataURL() * dataURL() * filterPreg() * textBefore()/textAfter() Altered Methods * css() has been changed to allow subsequent calls to modify the style attribute (issue #28) * attr() has been changed. If it is called with no arguments, it now returns all attributes. New CSS Selectors Behavior * :contains-exactly() performs as :contains() used to perform. Altered CSS Selectors Behavior * The star operator (*) is now non-greedy, per spec. Before, the star would match any descendants. Now it will only match children. * :contains() now does substring matching instead of exact matching. This conforms to jQuery's behavior. * Quotes are now checked carefully before being stripped from pseudo-class values. * Issue #40 identified a potential infinite looping problem on poorly formed selectors. This was fixed.