Releases: tox-dev/turbohtml
Releases · tox-dev/turbohtml
Release list
v1.4.0
What's Changed
- 🐛 fix(dom, xslt): lock subtree copies by @gaborbernat in #635
- 🐛 fix(dom): stabilize adopted node hashes by @gaborbernat in #634
- 🐛 fix(xslt): reject circular imports by @gaborbernat in #637
- 🐛 fix(xslt): resolve instruction namespaces by @gaborbernat in #636
- 🐛 fix(query): keep multi-root document order by @gaborbernat in #638
- 📝 docs(changelog): backfill fixes since 1.3.1 by @gaborbernat in #639
- ⚡ perf(core): shrink tokenizer and DOM state by @gaborbernat in #640
Full Changelog: 1.3.1...1.4.0
v1.3.1
What's Changed
- 🔧 chore(meta): enrich PyPI links and issue templates by @gaborbernat in #633
Full Changelog: 1.3.0...1.3.1
v1.3.0
What's Changed
- ✨ feat(pypy): run the C core on PyPy, publish 3.10 + 3.11 wheels by @gaborbernat in #623
- ⚡ perf(encoding): inline the decoder and copy ASCII runs past it by @gaborbernat in #624
- 🐛 fix(detect): stream the encoding detector by @gaborbernat in #628
- 🐛 fix(encoding, tokenizer): honor a late , and report every parse error by @gaborbernat in #626
- 🐛 fix(stream): report the parse errors a streamed document raises by @gaborbernat in #631
- 🐛 fix(detect): restore chardetng's TLD hint by @gaborbernat in #632
Full Changelog: 1.2.0...1.3.0
v1.2.0
What's Changed
- 🐛 fix(dom): lock threaded tree reads by @gaborbernat in #617
- 🐛 fix(xslt): resolve file URL imports by @gaborbernat in #618
- 📝 docs(changelog): backfill entries by @gaborbernat in #620
- 🐛 fix(linkify): normalize skip tags by @gaborbernat in #619
- 🐛 fix(forms): honor fieldset legend by @gaborbernat in #621
- 🐛 fix(encoding): decode with the WHATWG decoders, not CPython codecs by @gaborbernat in #622
Full Changelog: 1.1.1...1.2.0
v1.1.1
What's Changed
- 🔧 chore: correct package metadata and widen discoverability by @gaborbernat in #616
Full Changelog: 1.1.0...1.1.1
v1.1.0
What's Changed
- ✨ feat(bench): name why each empty benchmark cell is blank by @gaborbernat in #526
- ✨ feat(convert): expose CSS selector specificity by @gaborbernat in #556
- ✨ feat(sanitize): add SAFE_FOR_TEMPLATES marker stripping by @gaborbernat in #555
- ✨ feat(clean): report what the sanitizer dropped by @gaborbernat in #557
- ✨ feat(query): add XPath 2.0 string functions by @gaborbernat in #558
- ✨ feat(detect): add Unicode normalization (UAX #15) by @gaborbernat in #560
- ✨ feat(extract): parse RSS and Atom feeds by @gaborbernat in #562
- ✨ feat(clean): per-property inline-style value allowlist by @gaborbernat in #561
- ✨ feat(parse): add scripting flag for noscript by @gaborbernat in #559
- ✨ feat(sanitize): rename tags during sanitize by @gaborbernat in #563
- ✨ feat(serialize): add XML/XHTML output syntax by @gaborbernat in #564
- ✨ feat(parser): per-attribute and tag source locations by @gaborbernat in #566
- ✨ feat(dom): add TreeWalker and NodeIterator by @gaborbernat in #567
- ✨ feat(sanitize): add DOM-clobbering isolation by @gaborbernat in #568
- ✨ feat(parser): add strict XML parsing mode by @gaborbernat in #569
- ✨ feat(dom): add DOM Range and StaticRange by @gaborbernat in #570
- ✨ feat(cssom): add CSSOM cascade and computed style by @gaborbernat in #571
- ✨ feat(sanitize): custom elements + content profiles by @gaborbernat in #572
- ✨ feat(serialize): add XML canonicalization (c14n) by @gaborbernat in #574
- ✨ feat(dom): add Shadow DOM tree model by @gaborbernat in #573
- ✨ feat(parser): add DOM-less SAX event parsing by @gaborbernat in #575
- ✨ feat(transform): add XSLT 1.0 processor by @gaborbernat in #576
- ✨ feat(parser): declarative Shadow DOM (
<template shadowrootmode>) by @gaborbernat in #577 - ✨ feat(dom): add synchronous MutationObserver by @gaborbernat in #578
- ✅ test(cssom): validate cascade against jsdom by @gaborbernat in #582
- 👷 ci: add dedicated conformance job by @gaborbernat in #585
- ✅ test: error on missing submodule instead of silent skip by @gaborbernat in #586
- ✅ test(detect): validate normalize against NormalizationTest.txt by @gaborbernat in #579
- 🔧 chore: drop stray conformance changelog by @gaborbernat in #592
- ✅ test(dom): validate DOM APIs against jsdom by @gaborbernat in #581
- ✅ test(xslt): validate XSLT 1.0 against libxslt REC suite by @gaborbernat in #590
- ✨ feat(cssom): expand border and outline shorthands by @gaborbernat in #593
- ✨ feat(validate): XSD and RELAX NG schema validation by @gaborbernat in #589
- ✅ test(xml): validate parse_xml against the W3C XML Conformance Suite by @gaborbernat in #588
- ✅ test(c14n): validate canonicalize against libxml2's c14n corpus by @gaborbernat in #580
- 👷 fix(tools): route HTTP through httpx2 with tenacity retry by @gaborbernat in #596
- ✨ feat(rewrite): DOM-less streaming HTML rewriter (lol-html style) by @gaborbernat in #591
- ✅ test(xpath): validate fn:* functions against W3C QT3 suite by @gaborbernat in #587
- ✅ test(clean): validate sanitizer against DOMPurify suite by @gaborbernat in #583
- ✨ feat(xslt): complete the XSLT 1.0 feature set by @gaborbernat in #595
- ✨ feat(xml): enforce Namespaces 1.0 well-formedness by @gaborbernat in #594
- ✅ test(dom): validate source locations against parse5 by @gaborbernat in #584
- 📝 docs(migration): order guides by downloads, add npm/crates shields by @gaborbernat in #597
- ✨ feat(serialize): lossless byte-preserving to_source by @gaborbernat in #600
- ✨ feat(validate): HTML5 conformance checker with a severity model by @gaborbernat in #599
- ✨ feat(treebuild): retarget the parser at a custom tree by @gaborbernat in #601
- ✨ feat(clean): add XML/XHTML output to the sanitizer by @gaborbernat in #598
- 📝 docs(migration): slot html5validator by download rank by @gaborbernat in #602
- ⚡ perf(c14n): drop redundant xlink ancestor walk by @gaborbernat in #603
- ⚡ perf(cssom): binary-search the property table by @gaborbernat in #604
- ⚡ perf(xslt): classify instructions once per node by @gaborbernat in #605
- 📊 feat(bench): stress the perf-optimized paths by @gaborbernat in #607
- ♻️ refactor(c): split serialize headers, tidy layout by @gaborbernat in #606
- ♻️ refactor(_c): dissolve features into clean + extract by @gaborbernat in #608
- ♻️ refactor(_c): consolidate CSS under css/ by @gaborbernat in #609
- ♻️ refactor(_c): lift JS minifier to js/ by @gaborbernat in #610
- 📝 docs: re-taxonomize reference by task by @gaborbernat in #611
- ✨ feat(bench): in-process rewrite peer with peak memory by @gaborbernat in #612
- ♻️ refactor: group private modules under public packages by @gaborbernat in #613
- 📝 docs: generate CLI reference from the argparse parser by @gaborbernat in #614
- 📝 docs: nest nav, add tutorials & workflows, generate llms.txt by @gaborbernat in #615
Full Changelog: 1.0.0...1.1.0
v1.0.0
What's Changed
- ✨ feat: a safe-string for HTML, a markupsafe drop-in by @gaborbernat in #28
- ✨ feat: linkify() — URL/email auto-linking, a bleach successor by @gaborbernat in #29
- ✨ feat: an HTML sanitizer (clean()), faster than nh3, a bleach successor by @gaborbernat in #30
- 🐛 fix: detection and URL-scheme bugs found running competitors' test suites by @gaborbernat in #31
- ⚡ perf: faster serialize and data-state scan by @gaborbernat in #73
- 🐛 fix(linkify): keep underscore in host labels by @gaborbernat in #100
- 🐛 fix(treebuilder): keep foreign inside its root by @gaborbernat in #101
- 🐛 fix(serialize): emit frame as a void element by @gaborbernat in #102
- 🐛 fix(treebuilder): ignore stray end tag before by @gaborbernat in #103
- 🐛 fix(sanitizer): drop URL attr when a duplicate scheme is unsafe by @gaborbernat in #104
- 🐛 fix(tokenizer): drop duplicate attribute names per WHATWG by @gaborbernat in #105
- 🐛 fix(treebuilder): synthesize head/body for html fragments by @gaborbernat in #108
- 🐛 fix(treebuilder): restore table mode after fostered rawtext by @gaborbernat in #110
- 🐛 fix(treebuilder): adjust MathML definitionURL attribute name by @gaborbernat in #107
- 🐛 fix(serialize): walk trees iteratively to avoid stack overflow by @gaborbernat in #106
- 🐛 fix(parse): keep head mode on redundant html/duplicate head by @gaborbernat in #111
- 🐛 fix(treebuilder): honor foreign scope in adoption agency by @gaborbernat in #112
- 🐛 fix(tokenizer): report nameless DOCTYPE name as None by @gaborbernat in #115
- 🐛 fix(treebuilder): case-adjust SVG attribute names by @gaborbernat in #113
- 🐛 fix(tree): guard descendants walk against a detached cursor by @gaborbernat in #117
- 🐛 fix(tokenizer): reclaim consumed input in streaming feed() by @gaborbernat in #114
- 🐛 fix(treebuilder): ignore stray DOCTYPE after initial mode by @gaborbernat in #118
- 🐛 fix(encoding): complete the WHATWG charset-label table by @gaborbernat in #121
- 🐛 fix(tree): pickle elements with parser-only tag names by @gaborbernat in #119
- 🐛 fix(treebuilder): process stray in colgroup via in-body by @gaborbernat in #123
- 🐛 fix(select): decode CSS escape sequences in identifiers by @gaborbernat in #122
- 🐛 fix(tokenizer): reject Tokenizer constructor arguments by @gaborbernat in #124
- 🐛 fix(linkify): end a URL at Unicode whitespace by @gaborbernat in #120
- 🐛 fix(treebuilder): keep NUL-adjacent table whitespace inside by @gaborbernat in #126
- 🐛 fix(treebuilder): foster out of a table-section fragment by @gaborbernat in #135
- 🐛 fix: keep a trailing asterisk in a linkified URL by @gaborbernat in #134
- 🐛 fix: report missing DOCTYPE identifier as None on the node by @gaborbernat in #133
- 🐛 fix: decode gbk label with gb18030 decoder by @gaborbernat in #132
- 🐛 fix: raise TypeError for non-mapping Element attrs by @gaborbernat in #131
- 🐛 fix: report exact-case WHATWG name for legacy encodings by @gaborbernat in #129
- 🐛 fix: accept slash separator after meta in encoding prescan by @gaborbernat in #128
- 🐛 fix: require str for parse_fragment context and Token.attr name by @gaborbernat in #127
- 🐛 fix: declare _reconstruct pickle hook in type stub by @gaborbernat in #130
- 🐛 fix(select): apply HTML case-insensitive attribute set by @gaborbernat in #125
- 🐛 fix: keep foreign element namespace across a pickle round-trip by @gaborbernat in #139
- 🐛 fix: match custom-element type selector case-insensitively by @gaborbernat in #137
- 🐛 fix(encoding): cap the meta charset prescan at 1024 bytes by @gaborbernat in #136
- 🐛 fix(selectors): accept namespace-qualified type selectors by @gaborbernat in #141
- 🐛 fix: require exact annotation-xml encoding for integration point by @gaborbernat in #142
- 🐛 fix(treebuilder): keep foreign
inside its root by @gaborbernat in #143 - 🐛 fix: keep raw-text serialization across construct and pickle by @gaborbernat in #145
- 🐛 fix: put plain xmlns on a foreign element in the xmlns namespace by @gaborbernat in #140
- 🐛 fix: pop open optgroup/option in a select-context fragment by @gaborbernat in #147
- 🐛 fix(sanitizer): always neutralize plaintext by @gaborbernat in #146
- 🐛 fix(encoding): add the WHATWG replacement decoder by @gaborbernat in #148
- 🐛 fix(sanitizer): keep allowlisted SVG/MathML elements by @gaborbernat in #144
- 🐛 fix: keep after-head whitespace under html, not in body by @gaborbernat in #150
- ✨ feat(select): tree-structural pseudo-classes by @gaborbernat in #151
- 🐛 fix: report a valueless attribute as the empty string by @gaborbernat in #153
- 🐛 fix: pop open select for a keygen start tag in select mode by @gaborbernat in #154
- 🐛 fix: pop open option before hr in a select-context fragment by @gaborbernat in #149
- 🐛 fix(tokenizer): lock shared Tokenizer for free-threaded safety by @gaborbernat in #152
- 🐛 fix(parse): template fragment enters in-template mode by @gaborbernat in #155
- 🐛 fix(treebuilder): pop select for a table tag in select-in-table by @gaborbernat in #156
- 🐛 fix: lock the shared node tree for free-threaded safety by @gaborbernat in #157
- 🧪 test(freethread): stress, GIL guard, and ThreadSanitizer by @gaborbernat in #159
- ✨ feat(select): :is(), :where(), and :has() pseudo-classes by @gaborbernat in #158
- ⚡ perf(select): index by subject atom and cache compiled selectors by @gaborbernat in #162
- 🧪 test(treebuilder): lock foreign /
containment by @gaborbernat in #184 - 🐛 fix(select): fold class/ID case in quirks mode by @gaborbernat in #185
- ✨ feat(select): support the :not() negation pseudo-class by @gaborbernat in #188
- 🐛 fix(select): match whitespace-only elements with :empty by @gaborbernat in #187
- 🐛 fix(parser): treat empty DOCTYPE system id as quirks by @gaborbernat in #190
- ✨ feat(xpath): native XPath 1.0 engine by @gaborbernat in #186
- ✨ feat(select): support :scope, UI/form, :lang() and :dir() pseudo-classes by @gaborbernat in #193
- 🐛 fix(select): make :is()/:where() forgiving selector lists by @gaborbernat in #195
- ✨ feat(select): support :nth-child(An+B of S) selector lists by @gaborbernat in #198
- ✨ feat(serializer): round-trip-safe HTML minify mode by @gaborbernat in #196
- ✨ feat(compat): html.parser-compatible callback adapter by @gaborbernat in #199
- ✨ feat(xpath): complete lxml/parsel call-option parity by @gaborbernat in #194
- ✨ feat(serialize): to_markdown and to_text exporters with full markdownify/html2text/inscriptis parity by @gaborbernat in #191
- 📝 docs(migration): note the encoding-detection boundary by @gaborbernat in #202
- 📝 docs: compare and migrate resiliparse, note gumbo by @gaborbernat in #205
- 📝 docs: compare and migrate lxml-html-clean & html-sanitizer by @gaborbernat in https://gi...
v0.4.0
What's Changed
- ✨ feat: an editable tree, complete node types, migration guides by @gaborbernat in #27
Full Changelog: 0.3.0...0.4.0
v0.3.0
What's Changed
- ✨ feat: parse HTML into a navigable tree by @gaborbernat in #12
- 📝 docs: benchmark parse() against other tree builders by @gaborbernat in #13
- ✨ feat: a typed query and serialization layer for parsed HTML by @gaborbernat in #26
New Contributors
- @pre-commit-ci[bot] made their first contribution in #25
Full Changelog: 0.2.0...0.3.0
v0.2.0
What's Changed
- Fix links: gaborbernat -> tox-dev by @hugovk in #5
- ✨ feat: WHATWG-conformant streaming HTML tokenizer by @gaborbernat in #6
- ⚡ perf: SIMD escape scan and span-hopping unescape by @gaborbernat in #7
New Contributors
Full Changelog: 0.1.1...0.2.0