fix(wiki): protect inline-code spans from cross-ref injection
_inject_cross_refs temporarily replaces backtick spans with null-byte placeholders before injecting [[slug]] cross-refs, then restores them. This prevents concept titles inside `code` from being rewritten. Add tests for inline-code protection and full-list cross-ref injection. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -284,6 +284,9 @@ def _run_grounding_guard(
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
_INLINE_CODE_RE = re.compile(r"`[^`]+`")
|
||||
|
||||
|
||||
def _inject_cross_refs(
|
||||
markdown: str,
|
||||
all_concepts: list[Concept],
|
||||
@@ -292,8 +295,21 @@ def _inject_cross_refs(
|
||||
"""Replace occurrences of other concept titles/aliases with ``[[slug]]`` links.
|
||||
|
||||
Only exact case-insensitive whole-word matches outside of existing
|
||||
``[[…]]`` blocks or inline code are replaced.
|
||||
``[[…]]`` blocks or inline code spans are replaced.
|
||||
Inline-code spans (`` `…` ``) are temporarily protected by null-byte
|
||||
placeholders and restored after injection.
|
||||
"""
|
||||
# Step 1: protect inline-code spans from replacement
|
||||
placeholders: dict[str, str] = {}
|
||||
|
||||
def _protect(m: re.Match[str]) -> str:
|
||||
key = f"\x00{len(placeholders)}\x00"
|
||||
placeholders[key] = m.group(0)
|
||||
return key
|
||||
|
||||
markdown = _INLINE_CODE_RE.sub(_protect, markdown)
|
||||
|
||||
# Step 2: inject cross-refs on unprotected text
|
||||
for concept in all_concepts:
|
||||
if concept.slug == current_slug:
|
||||
continue
|
||||
@@ -304,6 +320,11 @@ def _inject_cross_refs(
|
||||
pattern = re.compile(rf"(?<!\[\[)\b{escaped}\b(?!\]\])", re.IGNORECASE)
|
||||
replacement = f"[[{concept.slug}]]"
|
||||
markdown = pattern.sub(replacement, markdown)
|
||||
|
||||
# Step 3: restore inline-code spans
|
||||
for key, val in placeholders.items():
|
||||
markdown = markdown.replace(key, val)
|
||||
|
||||
return markdown
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user