Extend the wp:quote normalizer so one more historical quote shape counts as safe:
wp:quote block<p ...> paragraph with optional attributes such as id<br /><br /> to represent paragraph breaks inside the quote<p></p> paragraph used only for spacingThe immediate target is the third wp:quote block in _posts/2025-07-21-negativity-blackholes-unburdening-and-resilience.md, which currently causes the whole file to be skipped.
The current normalizer is intentionally conservative. It converts only a narrow set of wp:quote shapes and skips the whole file if any quote block is unsupported.
For _posts/2025-07-21-negativity-blackholes-unburdening-and-resilience.md, the first two quote blocks are already safe. The third one is skipped because it includes:
id attribute<br /><br />cite ruleThe user has now specified the full desired mechanical conversion for this block. This follow-up should therefore cover:
<br /><br />Treat the following as a safe quote paragraph:
<!-- wp:quote -->
<blockquote class="wp-block-quote"><!-- wp:paragraph -->
<p id="...">Paragraph one.<br /><br />Paragraph two.</p>
<!-- /wp:paragraph -->
Expected markdown output:
> Paragraph one.
>
> Paragraph two.
Important constraints:
<p> tag may contain attributes<br> and <br /> are allowed only as line-break markers inside otherwise plain text<br /><br /> should become a blank markdown quote line between quoted paragraphs<p></p> should become a blank markdown quote lineKeep the normalizer conservative at the file level.
Rules:
wp:quote block in a file is safe under the expanded rules, convert them allwp:quote block in that file is still unsupported, skip the whole fileunsupported inner markup when practicalThat means this change may or may not make _posts/2025-07-21-negativity-blackholes-unburdening-and-resilience.md fully convertible today. But after the change, the remaining blocker list should be more precise, which is the main review surface the user asked for.
The current paragraph matcher should accept <p> tags that carry harmless attributes such as id, while still rejecting nested HTML content inside the paragraph body.
<br /><br />When a paragraph body contains <br /><br />, convert it into:
Single <br> should continue to behave as an inline line break inside the quote content. The main new behavior here is preserving the double break as a real paragraph separation in markdown.
If a quote block contains:
<p></p>
convert it to:
>
This keeps the visual paragraph break without treating the quote as malformed.
If a quote paragraph contains exactly one anchor and no other inner markup, convert it to:
> [Link text](url)
This stays mechanical and safe because it preserves the same content with no inferred prose.
If the parser can cheaply distinguish:
it should report that more specific reason. But correctness matters more than taxonomy polish. The tool should not be expanded into a broad HTML classifier.
Add focused tests for:
wp:quote paragraph with <br /><br /> converting into two markdown quote paragraphs_posts/2025-07-21-negativity-blackholes-unburdening-and-resilience.md, including the id attribute> lineRun:
python3 -m unittest tests/test_normalize_wp_quotes.py
python3 scripts/normalize_wp_quotes.py
Then inspect whether:
_posts/2025-07-21-negativity-blackholes-unburdening-and-resilience.md either converts cleanly or now reports a more precise remaining blockerwp:quote paragraphs with harmless <p> attributes.<br /><br /> inside a safe paragraph becomes two markdown quote paragraphs separated by a blank > line.> line.wp:quote block still skip at the file level.