mdx-sanitizer
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseMDX Sanitizer
MDX Sanitizer
Comprehensive MDX content sanitizer that prevents JSX parsing errors caused by angle brackets, generics, and other conflicting patterns.
一款全面的MDX内容清理工具,可防止由尖括号、泛型以及其他冲突模式引发的JSX解析错误。
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:
<>
MDX 2.x会将未转义的和视为JSX语法。当内容包含以下元素时,会导致构建失败:
<{- TypeScript泛型:、
Promise<T>、Array<string>Map<K, V> - 比较运算符:、
<100ms、<=>= - 箭头符号:、
-->、<---> - 无效标签:散文中的、
<link>占位符<tag> - 空括号:
<>
Solution Architecture
解决方案架构
This skill implements a three-layer defense:
本工具实现了三层防护机制:
1. Sync-Time Sanitization (Proactive)
1. 同步时清理(主动防护)
Content is sanitized when syncing from to :
.claude/skills/website/docs/- - Main skill files
syncSkillDocs.ts - - Reference files
syncSkillSubpages.ts - - Generated docs
doc-generator.ts
在从同步到时对内容进行清理:
.claude/skills/website/docs/- - 主工具文件
syncSkillDocs.ts - - 参考文件
syncSkillSubpages.ts - - 生成的文档
doc-generator.ts
2. Pre-Commit Validation (Reactive)
2. 提交前验证(响应式防护)
The git pre-commit hook validates files before commit using .
validate-brackets.jsGit提交前钩子会使用在提交前验证文件。
validate-brackets.js3. Build-Time Validation (Final Check)
3. 构建时验证(最终检查)
npm run validate:allprebuildnpm run validate:allprebuildUsage
使用方法
Check for Issues (Dry Run)
检查问题(试运行)
bash
cd website
npm run sanitize:mdxbash
cd website
npm run sanitize:mdxor with verbose output
或启用详细输出
npm run sanitize:mdx -- --verbose
undefinednpm run sanitize:mdx -- --verbose
undefinedFix All Issues
修复所有问题
bash
cd website
npm run sanitize:mdx -- --fixbash
cd website
npm run sanitize:mdx -- --fixor shorthand
或简写命令
npm run fix:mdx
undefinednpm run fix:mdx
undefinedProgrammatic API
程序化API
typescript
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
}typescript
import { sanitizeForMdx, validateMdxSafety, isMdxSafe } from './lib/mdx-sanitizer';
// 清理内容
const result = sanitizeForMdx(content, { useHtmlEntities: true });
if (result.modified) {
console.log(`已修复 ${result.issues.length} 个问题`);
fs.writeFileSync(path, result.content);
}
// 验证内容但不修改
const issues = validateMdxSafety(content, 'path/to/file.md');
// 快速检查
if (!isMdxSafe(content)) {
// 处理问题
}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.
````该清理工具使用HTML实体以实现最大兼容性:
| 模式 | 原始内容 | 转义后内容 |
|---|---|---|
| 小于号 | | |
| 大于号 | | |
| 泛型 | | |
| 比较运算符 | | |
代码块( 或 )内的内容会自动被保护,不会被转义。
````Files Modified
修改的文件
- - Core sanitizer module
website/scripts/lib/mdx-sanitizer.ts - - CLI wrapper
website/scripts/sanitize-mdx.ts - - Integration
website/scripts/syncSkillDocs.ts - - Integration
website/scripts/syncSkillSubpages.ts - - Integration
website/scripts/lib/doc-generator.ts - - npm scripts
website/package.json
- - 核心清理模块
website/scripts/lib/mdx-sanitizer.ts - - CLI 封装器
website/scripts/sanitize-mdx.ts - - 集成文件
website/scripts/syncSkillDocs.ts - - 集成文件
website/scripts/syncSkillSubpages.ts - - 集成文件
website/scripts/lib/doc-generator.ts - - npm 脚本
website/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>
- 尖括号后接数字:、
<100<0.5ms - 比较运算符:、
<=>= - 空括号:
<> - 箭头符号:、
<----> - 泛型类型:、
Promise<T>Array<string> - 尖括号后接空格:
< value - 无效伪标签:、
<link>(非有效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
- 清除Docusaurus缓存:
npm run clear - 重新运行清理工具:
npm run sanitize:mdx -- --fix - 重新构建:
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
如果有效的JSX组件被转义:
- 确保组件使用大驼峰命名(例如:)
<MyComponent> - 检查组件是否为有效的HTML5元素
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
<>
对于特殊场景,可在源文件中手动转义:
- 使用反引号包裹行内代码:
`<T>` - 使用围栏代码块包裹多行内容
- 使用HTML实体:和
<>