NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #5078 most downloaded on crates.io
Fast HTML parser written in pure Rust
Last release 3 years ago
no release in 18 months
Ships unpredictably
gaps range from 1 weeks to 1.4 years
Most releases are documented
notes for 20 of 24 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
24 releases · first in 2021
One column per quarter.
Fixes a build error if compiled with the simd feature flag. See [y21/tl#60]
simd feature flag. See [y21/tl#60]Fixes a bug in the query selector parser that made it fail to parse values containing :. See y21/tl#46 and [y21/tl#47] for more details.
:. See y21/tl#46 and [y21/tl#47] for more details.Fixes a build error if compiled with the simd feature flag. See y21/tl#41 for more details.
simd feature flag. See y21/tl#41 for more details.innerHTML() actually had the behavior of Element#outerHTML. This was changed and innerHTML now correctly only returns the markup of its subnodes, and not the markup of the own node.outerHTML() was added to nodes, which moves the old behavior to another function.children_mut(), which allows mutating the subnodes of an HTML Tag.Fixed a bug that caused the parser to parse closing tags incorrectly. See y21/tl#37 and y21/tl#38 for more details.
Restructure internals (mainly SIMD functions)
simd feature isn't set)Fixed HTMLTag::raw() returning one byte less than it should have. See y21/tl#31.
HTMLTag::raw() returning one byte less than it should have. See y21/tl#31.Add Attributes::contains(key) to check if an attribute exists.
Attributes::contains(key) to check if an attribute exists.Attributes::remove(key) to remove an attribute.Attributes::remove_value(key) to delete the value of a given attribute key.- Version bump in README.md
> Warning: This release contains breaking changes
Warning: This release contains breaking changes
Attributes::insert has changed:
K, V instead of just one.
Prior to this version, this meant that the key and value type had to match.
See y21/tl#27 for more details.TryFrom<String> for Bytes implementation for convenience to create owned Bytes.HTMLTag::boundaries method for obtaining the start and end position of a tag in the source string.<tag/Fixed a bug where Attributes::class() returned its id attribute instead of class. See y21/tl#26
Attributes::class() returned its id attribute instead of class. See y21/tl#26Fixed a bug where the slash in slash tags ( ) is interpreted as > and causes the next > to be interpreted as a text node on its own.
<br />) is interpreted as > and causes the next > to be interpreted as a text node on its own.Fixed an off-by-one error in the QueryIterable trait implementation for HTMLTag that caused query selectors on HTML tags to return one node less than
QueryIterable trait implementation for HTMLTag that caused query selectors on HTML tags to return one node less than they should.> Warning: This release contains breaking changes
Warning: This release contains breaking changes
VDom::find_node
VDom::nodes().iter().find(...) insteadAttributes::get() now returns a reference to Bytes instead of cloning.
Bytes type was just an immutable &[u8]. Now it can hold owned data.HTMLTag::children() no longer returns an iterator, and instead returns a wrapper struct around the children of the HTML tag.
This wrapper struct makes it easy to obtain direct children of the tag (Children::top()),
or all children (including their children, etc...) (Children::all()).Node::children() no longer returns an iterator (see above).HTMLTag::name() now returns a reference to Bytes instead of cloning (see above).tl::parse_query_selector)HTMLTags (see #18)queryselector module is now publicInnerNodeHandle is now u32max_depth parser optionPartialEq<str> and PartialEq<[u8]> impls for Bytes> Warning: This release contains breaking changes
Warning: This release contains breaking changes
Bytes to store owned data through Bytes::set()
Bytes is u32::MAXtl::parse() now returns Result<VDom<'a>, ParseError>Attributes fields are no longer public, instead use one of the provided methodsHTMLTag::inner_html() now takes a &Parser and no longer directly returns the substring
inner_html needs to be recomputedHTMLTag::raw() if you never mutate any nodesParse unquoted attribute values properly ( ) [#12]
<a href=foo>) [#12]<iframe allowfullscreen>) [#11]Add optional simd feature flag for SIMD-accelerated parsing
simd feature flag for SIMD-accelerated parsingKeep track of recursion depth when parsing to avoid overflowing the stack
Fixed an infinite loop bug in parse_single and a panic that occurs when trying to parse incomplete markup tags (<!)
parse_single and a panic that occurs when trying to parse incomplete markup tags (<!)Remove AsBytes trait in favor of From for Bytes
AsBytes trait in favor of From<T> for BytesVDom::query_selector()InnerHandleNode to hide implementation details of NodeHandleAttributes::is_class_member() generic over T: Into<Bytes<'a>>Attributes::get_attribute()HTMLTag::name() and HTMLTag::inner_html() return owned BytesDeprecate VDom::find_node in favor of VDom::nodes().iter().find()
VDom::find_node in favor of VDom::nodes().iter().find()Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →