feat(zetesis): Cardigann filter tail — diacritics, validate, validfilename, url encode/decode, aliases (#513)#629
Merged
Conversation
…ename, url encode/decode, aliases (#513) Six more Cardigann field filters, each previously rejected at load (so any definition using one failed to load at all). Verified against Jackett's applyFilters + .NET's WebUtility/StringUtil semantics: - diacritics: NFD-decompose, drop combining marks, NFC-recompose — a mark strip, NOT transliteration, so precomposed letters (Đ) and non-Latin scripts pass through unchanged. Only "replace" is a valid arg (rejected at load otherwise, matching upstream's throw). - validate: lowercase + split both sides on upstream's delimiter set, keep the whitelist tokens present in the value, in WHITELIST order, deduped. - validfilename: replaces the characters .NET forbids on Linux (the platform real deployments run) — / and NUL — with _; an empty result collapses to _. - urldecode / urlencode: .NET WebUtility semantics — safe set A-Za-z0-9-_.!*(), space as +, uppercase hex, byte-wise; decode is lenient on a malformed %. - timeparse / reltime: upstream aliases of dateparse / timeago. By definition-count across the upstream corpus these cover diacritics (14), validate (14), validfilename (8), urldecode (3), urlencode (1), timeparse (1). Still rejected at load and tracked in #513: the row-level andmatch (65 defs — needs query/release state, a separate dispatch), fuzzytime (22), htmldecode (6), and the zero-usage tail. Part of #513. Gate-Passed: kanon 0.1.6 +stages:fmt,check,clippy,nextest,lint sha:6b58d5c61e8b0fccdc516d2344cc6a31c0173278
forkwright
force-pushed
the
feat/cardigann-filter-tail
branch
from
July 16, 2026 15:19
1453397 to
0adc2d6
Compare
forkwright
pushed a commit
that referenced
this pull request
Jul 23, 2026
🤖 I have created a release *beep* *boop* --- ## [0.2.0](v0.1.14...v0.2.0) (2026-07-23) ### Features * **horismos,kathodos,archon:** media-type coverage for audiobook/comic/podcast/tv ([#612](#612)) ([#625](#625)) ([23f1ae7](23f1ae7)) * **zetesis:** andmatch row filter for Cardigann definitions ([#631](#631)) ([dc41e23](dc41e23)) * **zetesis:** Cardigann filter tail — diacritics, validate, validfilename, url encode/decode, aliases ([#513](#513)) ([#629](#629)) ([032a72a](032a72a)) * **zetesis:** Cardigann JSON search responses (flat arrays) ([#624](#624)) ([28966a6](28966a6)) * **zetesis:** Cardigann nested JSON rows (rows.attribute/multiple + parent switch) ([#513](#513)) ([#627](#627)) ([3e0143f](3e0143f)) * **zetesis:** Cardigann POST search paths ([#621](#621)) ([aa7e286](aa7e286)) ### Bug Fixes * **deps:** bump serde_with 3.20.0 -> 3.21.0 (GHSA-7gcf-g7xr-8hxj) ([#630](#630)) ([970508c](970508c)) * **deps:** repair ulid 3.0 and rubato 4.0 fallout on main ([#660](#660)) ([96027e2](96027e2)) * **epignosis:** preserve book provider identity ([#654](#654)) ([#659](#659)) ([b9b48c2](b9b48c2)) * **periskopio:** restore standalone compilation ([#620](#620)) ([#657](#657)) ([e46a013](e46a013)) * **zetesis:** redact all credential query params in logged URLs, not just apikey ([#623](#623)) ([#626](#626)) ([6ec6154](6ec6154)) ### Documentation * **manifest:** add docs/MANIFEST.toml ([#647](#647)) ([16b700b](16b700b)) * **planning:** pointer-only vision (kanon-canonical) ([#648](#648)) ([8784a34](8784a34)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #513 (filter coverage;
andmatch/fuzzytime/htmldecodefollow — #513 stays open).Six Cardigann field filters that were previously rejected at load — so any definition using one failed to load at all. Semantics verified against Jackett's
applyFiltersand .NET'sWebUtility/StringUtil, not guessed:\p{Mn}, NFC-recompose. A mark strip, not transliteration: precomposed letters (Đ) and non-Latin scripts pass through untouched. Only"replace"is a valid arg (rejected at load otherwise, matching upstream's throw).Intersectsemantics)./and NUL →_; empty →_. Not the stricter Windows set the name implies.WebUtilitysemantics: safe setA-Za-z0-9-_.!*(), space as+, uppercase hex, byte-wise; decode is lenient on a malformed%.dateparse/timeago.By definition-count across the upstream corpus these cover diacritics (14), validate (14), validfilename (8), urldecode (3), urlencode (1), timeparse (1).
A 3-lens adversarial-review workflow caught a real HIGH bug, fixed here:
unicode_normalization::char::is_combining_markis the wholeMarkcategory (Mn+Mc+Me), but upstream strips onlyNonSpacingMark. The superset deleted spacing combining marks — Devanagari/Bengali/Tamil vowel signs — silently changing meaning (काम"work" →कम). Now uses\p{Mn}(exact category, via the existingregexdep) with a regression test on an Mc-bearing script.Also fixed: a pre-existing test that used
diacriticsas its "unsupported filter" example (now supported → switched tofuzzytime).No new workspace dependency (
unicode-normalizationalready existed). Fullkanon gate --fullgreen.