Some_claude_skills mdx-sanitizer
Sanitize MDX content for Docusaurus builds. Fixes unescaped angle brackets (<, >, <=, >=), Liquid/Nunjucks template syntax ({{ }}), TypeScript generics (Promise<T>), and inline code backtick edge cases. Use when pre-commit hooks fail on bracket or Liquid validation, or when MDX/JSX build errors reference unexpected tokens. NOT for general markdown linting or prose editing.
git clone https://github.com/curiositech/some_claude_skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/curiositech/some_claude_skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/mdx-sanitizer" ~/.claude/skills/erichowens-some-claude-skills-mdx-sanitizer && rm -rf "$T"
.claude/skills/mdx-sanitizer/SKILL.mdMDX Sanitizer
Comprehensive MDX content sanitizer that prevents JSX parsing errors caused by angle brackets, generics, and other conflicting patterns.
The Problem
MDX 2.x treats unescaped
< and { as JSX syntax. This causes build failures when content contains:
- TypeScript generics:
,Promise<T>
,Array<string>Map<K, V> - Comparisons:
,<100ms
,<=>= - Arrows:
,-->
,<---> - Invalid tags:
in prose,<link>
placeholders<tag> - Empty brackets:
<>
Solution Architecture
This skill implements a three-layer defense:
1. Sync-Time Sanitization (Proactive)
Content is sanitized when syncing from
.claude/skills/ to website/docs/:
- Main skill filessyncSkillDocs.ts
- Reference filessyncSkillSubpages.ts
- Generated docsdoc-generator.ts
2. Pre-Commit Validation (Reactive)
The git pre-commit hook validates files before commit using
validate-brackets.js.
3. Build-Time Validation (Final Check)
npm run validate:all runs as part of prebuild to catch any issues.
Usage
Check for Issues (Dry Run)
cd website npm run sanitize:mdx # or with verbose output npm run sanitize:mdx -- --verbose
Fix All Issues
cd website npm run sanitize:mdx -- --fix # or shorthand npm run fix:mdx
Programmatic API
import { sanitizeForMdx, validateMdxSafety, isMdxSafe } from './lib/mdx-sanitizer'; // Sanitize content const result = sanitizeForMdx(content, { useHtmlEntities: true }); if (result.modified) { console.log(`Fixed ${result.issues.length} issues`); fs.writeFileSync(path, result.content); } // Validate without modifying const issues = validateMdxSafety(content, 'path/to/file.md'); // Quick check if (!isMdxSafe(content)) { // Handle issues }
Escaping Strategies
The sanitizer uses HTML entities for maximum compatibility:
| Pattern | Original | Escaped |
|---|---|---|
| Less-than | | |
| Greater-than | | |
| Generics | | |
| Comparison | | |
Content inside code blocks (
``` or `) is automatically protected and never escaped.
Files Modified
- Core sanitizer modulewebsite/scripts/lib/mdx-sanitizer.ts
- CLI wrapperwebsite/scripts/sanitize-mdx.ts
- Integrationwebsite/scripts/syncSkillDocs.ts
- Integrationwebsite/scripts/syncSkillSubpages.ts
- Integrationwebsite/scripts/lib/doc-generator.ts
- npm scriptswebsite/package.json
Patterns Detected
- Less-than before digit:
,<100<0.5ms - Comparison operators:
,<=>= - Empty brackets:
<> - Arrows:
,<----> - Generic types:
,Promise<T>Array<string> - Space after less-than:
< value - Invalid pseudo-tags:
,<link>
(not valid HTML)<tag>
Troubleshooting
Build Still Fails After Running Sanitizer
- Clear Docusaurus cache:
npm run clear - Re-run sanitizer:
npm run sanitize:mdx -- --fix - Rebuild:
npm run build
False Positives
If valid JSX components are being escaped:
- Ensure they use PascalCase (e.g.,
)<MyComponent> - Check they're valid HTML5 elements
Manual Escaping
For edge cases, manually escape in source:
- Use backticks for inline code:
`<T>` - Use fenced code blocks for multi-line
- Use HTML entities:
and<>