From be66936a25d590aebe76ee38bdaf4e3ae3b30b79 Mon Sep 17 00:00:00 2001 From: 1fanwang <1fannnw@gmail.com> Date: Tue, 8 Sep 2026 12:07:52 -0700 Subject: [PATCH] Validate the examples that follow an unvalidated language fence Closing a docs-validate hidden block sets a pending skip so the visible copy is not validated twice. A fence whose language has no validator, such as rust, was never recognized as a code block, so it never consumed that skip and the next validated block absorbed it instead. Signed-off-by: 1fanwang <1fannnw@gmail.com> --- scripts/docs-validation/extract.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/scripts/docs-validation/extract.ts b/scripts/docs-validation/extract.ts index df1c358deb..7ddd2c136c 100644 --- a/scripts/docs-validation/extract.ts +++ b/scripts/docs-validation/extract.ts @@ -61,6 +61,7 @@ function parseMarkdownCodeBlocks( let skipNext = false; let wrapAsync = false; let inHiddenBlock = false; + let inUnvalidatedFence = false; for (let i = 0; i < lines.length; i++) { const line = lines[i]; @@ -86,13 +87,25 @@ function parseMarkdownCodeBlocks( } // Start of code block - if (!inCodeBlock && line.startsWith("```")) { + if (!inCodeBlock && !inUnvalidatedFence && line.startsWith("```")) { const lang = line.slice(3).trim().toLowerCase(); if (lang && LANGUAGE_MAP[lang]) { inCodeBlock = true; currentLang = LANGUAGE_MAP[lang]; currentCode = []; blockStartLine = i + 1; // 1-indexed line number + } else { + inUnvalidatedFence = true; + } + continue; + } + + // End of a fence whose language has no validator. It still consumes a + // pending skip so the directive cannot leak onto a later block. + if (inUnvalidatedFence && line.startsWith("```")) { + inUnvalidatedFence = false; + if (!inHiddenBlock) { + skipNext = false; } continue; }