- Improved performance of selector matching on deeply nested elements and on stray end tags.
- Fixed element handlers never running for SVG and MathML integration-point elements when the preceding tag matched no selector.
- Fixed attribute selectors with an uppercase attribute name:
[HREF]silently matched nothing and[HREF=x]was rejected as a namespaced selector. - Fixed
:nth-of-type()counting custom elements spelled with different ASCII case as distinct types.
- Added
MemorySettings::with_graceful_bail_out_on_memory_limit_exceeded(): when set, the rewriter flushes every input byte it has received but not yet emitted to the sink (as-is) before returningMemoryLimitExceededError, so callers can continue the response by writing subsequent bytes directly to their downstream sink instead of breaking it. - Added
Settings::with_graceful_bail_out_on_content_handler_error(): symmetric to the memory setting above, but forRewritingError::ContentHandlerError. When set, the rewriter flushes remaining input bytes before propagating a handler error, preserving the response. Currently exposed via the Rust API only; the C API still uses the original behavior. - Added
Settings::append_bail_out_handler()and the matchingbail_out!macro,BailOutrewritable unit, andBailOutHandler/BailOutHandlerSendtype aliases. Bail-out handlers fire immediately before the raw flush of remaining unparsed input on a graceful bail-out (memory or content-handler error). Handlers receive theRewritingErrorand aBailOutthrough which they can append final bytes to the sink viaBailOut::append(content, content_type). Intended for handlers that buffer state across the document (e.g. text-buffering handlers that defer emission) and need to flush that state on bail-out. - Marked
RewritingError#[non_exhaustive]so future error variants can be added without a major version bump. External callers can stillmatchon it, but must include a catch-all_ =>arm. - Reworked
Settings,MemorySettingsandRewriteStrSettingsto use a consuming-builder API. Fields are now private; construction is via::new()plus chainedwith_*setters andappend_*methods for the content-handler vectors. This makes future field additions non-breaking. Migration:// before Settings { element_content_handlers: vec![element!("div", |el| { /* ... */ Ok(()) })], strict: false, ..Settings::new() } // after Settings::new() .with_strict(false) .append_element_content_handler(element!("div", |el| { /* ... */ Ok(()) }))
- Renamed the internal-use feature
integration_testto_integration_test. The leading underscore signals tocargo-semver-checksand similar tools that the feature is not part of the public API. Comment::set_textnow also rejects--!>, a leading>, and a leading->, which WHATWG-conformant browsers treat as comment terminators. Previously only-->was rejected, so a caller passing attacker-influenced data could let an attacker break out of the comment and inject HTML (security fix).
- Added
OutputSink::set_encoding - Fixed
rewrite_strto ignore non-UTF-8 encoding declarations (it takes a UTF-8 string) - Added source locations to individual attributes
- Updated
selectorsdependency
- Reduced allocations
- Added
on_end_tagconvenience method - Added support for nested
:not()with simple selectors. - Updated
selectors
- Replaced several panicking assertions with gracefully reported errors, especially in the C API
- Performance improvements.
- Updated dependencies.
- Improve type generation in js-api.
- Updated dependencies.
- Added source code locations to the C and JS APIs
- Significant performance improvements and code size reductions
- Source code locations for tags and other tokens.
- Document text chunks and escaping of attributes.
- Selector validation improvements.
- Upgraded
selectorsandcssparser.
- Added
element.onEndTagto JS bindings. - Refactored TextDecoder and token construction to avoid heap allocations.
- Added fast paths for UTF-8 rewrites.
- Updated cssparser and selectors dependencies
- Adopted
cargo-cfor building the C API - Added WASM/JS API
- An invalid
/>syntax will be removed when content is added to an HTML element
- Added streaming handlers.
- Only allow changing the charset once with the
<meta>tag, in accordance with the HTML spec. - Fixed parsing of invalid elements in
<svg>and<math>.
- Added the ability for the rewriter to be
Send. Thesendmodule contains the utilities for that.
- Remove unmaintained
safememdependency.
- Expose
is_self_closingandcan_have_contentin C api. - Make
ElementContentHandlersandDocumentContentHandlersfields public. - Add missing docs to public API.
- Ensure that
TagScanner::is_in_end_tagresets when changing parsers.
- Added ability to get the tag and attribute names with the original casing.
- The C API's new
lol_html_element_add_end_tag_handler()function now sets the last error retrievable bylol_html_take_last_error()if it is called on an element that can have no end tag.
Yes, you got that right: this is the first 1.x release! From now on you should expect this project to adhere to the semantic versioning spec (we have been somewhat relaxed about that in the past).
- Added
Element::end_tag_handlers()which allows better control over the end tag handlers.
- Removed
Element::on_end_tag()andElement::add_on_end_tag()in favor of the newly addedElement::end_tag_handlers().
- Added method
TextChunk::as_mut_str()andTextChunk::set_str()for in-place modifications to the text in aTextChunk. (#175)
- Modified method
Element::on_end_tag()to support multiple handlers. This is a breaking change since the old semantics of the method was to overwrite any previously set handler. (#177)
- Support dynamic charset change on meta tags in HtmlRewriter. (#162)
- Add
Element::can_have_content(). (#163)
- Add
Doctype::remove. (#129) - Add
Element::start_tag()andElement::is_self_closing(). (#148) - Add mutation methods to
StartTagandEndTag. (#148) - Implement
Eqfor all types that implementPartialEq. (#146)
- Changed the HTML parser to more closely match the spec. This only affects rewriters which modify HTML comments. (#128)
- Add
Element::on_end_tag(#97, #107, #124)
- Change string allocators in the C API to return
lol_html_str_t, notlol_html_str_t*. This was necessary to fix a memory leak inlol_html_str_free. (#115) - Update dependencies (#98, #103)
- Fix memory leaks in C API (#113, #115)
- Add unofficial Go bindings to the README (#77)
- Update dependencies (#73)
- Take
selfin HtmlRewriter::end (#68) - Refactor HTMLRewriter Settings to make
HTMLRewriter::newinfallible (#70) - Allow using
element!in a separate expression fromrewrite_str(#69) - Update to hashbrown 0.9 (#64)
- Add Send+Sync constraint for ContentHandler Error
- feat: Allow using either Settings or RewriteStrSettings (#57)
- Fix unhappy clippy (#60)
- Compile literal attribute name lowercase instead of value (#51)
- Use more memory efficient nth-of-type tracking. (#49)
- Minor cleanup from :nth-child (#48)
- Add support for :nth-child selectors (#47)
- Added:
DocumentContentHandlers::end.
- Initial release