Improvements
- Attribute object accessors: Added
Element.attribute(String)
andAttributes.attribute(String)
to more simply
obtain anAttribute
object. 2069 - Attribute source tracking: If source tracking is on, and an Attribute's key is changed (
viaAttribute.setKey(String)
), the source range is now still tracked
inAttribute.sourceRange()
. 2070 - Wildcard attribute selector: Added support for the
[*]
element with any attribute selector. And also restored
support for selecting by an empty attribute name prefix ([^]
). 2079
Bug Fixes
- Mixed-cased source position: When tracking the source position of attributes, if the source attribute name was
mix-cased but the parser was lower-case normalizing attribute names, the source position for that attribute was not
tracked correctly. 2067 - Source position NPE: When tracking the source position of a body fragment parse, a null pointer
exception was thrown. 2068 - Multi-point emoji entity: A multi-point encoded emoji entity may be incorrectly decoded to the replacement
character. 2074 - Selector sub-expressions: (Regression) in a selector like
parent [attr=va], other
, the, OR
was binding
to[attr=va]
instead ofparent [attr=va]
, causing incorrect selections. The fix includes a EvaluatorDebug class
that generates a sexpr to represent the query, allowing simpler and more thorough query parse
tests. 2073 - XML CData output: When generating XML-syntax output from parsed HTML, script nodes containing (pseudo) CData
sections would have an extraneous CData section added, causing script execution errors. Now, the data content is
emitted in a HTML/XML/XHTML polyglot format, if the data is not already within a CData
section. 2078 - Thread safety: The
:has
evaluator held a non-thread-safe Iterator, and so if an Evaluator object was
shared across multiple concurrent threads, a NoSuchElement exception may be thrown, and the selected results may be
incorrect. Now, the iterator object is a thread-local. 2088