Normalize legacy wp:quote blocks across all posts in _posts/ where a clean mechanical conversion exists, replacing them with native markdown blockquotes plus a separate Source: line when citation data is present.
Issue #100 follows the weekly roundup work from #99.
The repository still contains many historical posts with legacy WordPress quote markup:
<!-- wp:quote --><blockquote class="wp-block-quote"><!-- wp:paragraph --> wrappers<cite><a ...>...</a></cite> attributionThis older markup makes the content harder to normalize, harder to parse, and less aligned with the repository’s Jekyll-native markup direction.
The goal here is not a full HTML migration project. The goal is a safe batch conversion of straightforward quote blocks only.
🔗 postsThe cleanup pass should scan all markdown posts in _posts/, not just 🔗 link posts.
Reason:
wp:quote exists outside the link-post subsetAdd a script, likely scripts/normalize_wp_quotes.py.
Responsibilities:
<!-- wp:quote -->The script should default to dry-run mode and require an explicit --write flag to edit files in place.
A quote block is a safe candidate only when:
wp:quote block<cite><a ...>Title</a></cite> form that can be rendered cleanlyConverted output shape:
Source: [Title](url)The conversion should preserve meaning and attribution, but it should not preserve WordPress block wrappers.
The script should touch only the targeted quote block.
It should preserve:
It should not:
The script should skip, not guess, when it sees:
wp:quote blockswp:quote blocks in the same postSource: [Title](url)Every skip should include a reason so the remaining debt is visible and reviewable.
This issue is a normalization pass, not an editorial pass.
That means:
This keeps the batch diff reviewable and preserves authored signal.
docs/superpowers/specs/2026-03-26-normalize-wp-quotes-design.mdscripts/normalize_wp_quotes.py_posts/ that can be converted cleanlyAdd unit coverage for:
wp:quoteSource: conversionAfter the script runs with --write:
Source: lines render cleanlyRun the normal repository validators after conversion so the cleanup does not introduce date or snippet regressions.
Some old WordPress exports may look similar while carrying different internal structure. The safe response is to skip those files, not to widen the converter until it starts guessing.
Because this cleanup can touch many posts, the conversion must stay mechanical and the skip report must be explicit so review stays tractable.
Even when meaning is preserved, a broad conversion can alter blank-line spacing. The script should aim for minimal readable markdown and avoid unrelated layout churn.
wp:quote markup.--write to edit files.Source: [Title](url).