mdx-validator
2
总安装量
2
周安装量
#70153
全站排名
安装命令
npx skills add https://github.com/foreveryh/deeptoai-skills --skill mdx-validator
Agent 安装分布
opencode
2
claude-code
2
github-copilot
2
codex
2
kimi-cli
2
gemini-cli
2
Skill 文档
MDX Validator
MDX è¯æ³é¢æ£æ¥å·¥å ·ï¼è¡¥å ç°æå·¥å ·ï¼eslint-mdx, prettierï¼ã
ð¯ 设计ç念
ä¸ç°æå·¥å ·çå ³ç³»
eslint-mdx (åºç¡ MDX æ£æ¥)
+
prettier (æ ¼å¼å)
+
mdx-validator (Fumadocs ä¸é¡¹æ£æ¥) â ä½ å¨è¿é
â
宿´ç MDX è´¨éä¿è¯
为ä»ä¹éè¦æ¬ skill:
- eslint-mdx 䏿£æ¥å¾çæä»¶åè§è
- prettier 䏿£æ¥ç¿»è¯å®æ´æ§
- ç°æå·¥å ·æ²¡æ Fumadocs ç¹å®é®é¢çæ£æ¥
ð¦ åç½®æ¡ä»¶
æ¨èå®è£ ï¼å¯éï¼
# 1. å®è£
eslint-mdxï¼å®æ¹ MDX æ£æ¥å·¥å
·ï¼
npm install -D eslint-plugin-mdx
# 2. å®è£
prettierï¼MDX æ ¼å¼åï¼
npm install -D prettier
# 3. å建é
ç½®
echo '{"extends":["plugin:mdx/recommended"]}' > .eslintrc.json
ð æ£æ¥é¡¹
Step 0: 使ç¨ç°æå·¥å ·ï¼å¦ææï¼
# æ£æ¥æ¯å¦æ eslint-mdx
if [ -f "node_modules/eslint-plugin-mdx" ]; then
echo "â
åç° eslint-mdxï¼è¿è¡æ£æ¥..."
npx eslint "**/*.mdx" --fix
else
echo "â ï¸ æªå®è£
eslint-mdxï¼è·³è¿åºç¡æ£æ¥"
echo " æ¨è: npm install -D eslint-plugin-mdx"
fi
# æ£æ¥æ¯å¦æ prettier
if [ -f "node_modules/prettier" ]; then
echo "â
åç° prettierï¼æ ¼å¼å..."
npx prettier --write "**/*.mdx"
fi
Step 1: ç¹æ®åç¬¦æ£æ¥ï¼MDX è¯æ³ï¼
é®é¢å符:
<– 被解æä¸º JSX æ ç¾>– 被解æä¸º JSX æ ç¾{}– 被解æä¸º JSX 表达å¼
æ£æ¥å½ä»¤:
# æ£æ¥å±é©ç < 符å·ï¼ä¸å¨ä»£ç åå HTML æ ç¾ä¸ï¼
grep -n '<[^a-zA-Z/!]' *.mdx | grep -v '```' | grep -v '^.*:.*<\(a\|img\|div\|span\|p\|h[1-6]\|ul\|ol\|li\|code\|pre\|strong\|em\|br\|hr\)\'
# æ£æ¥å±é©ç > 符å·ï¼ä¸å¨ä»£ç åä¸ï¼
grep -n '>[^a-zA-Z/]' *.mdx | grep -v '```' | grep -v '^.*:.*</\(a\|img\|div\|span\|p\|h[1-6\|ul\|ol\|li\|code\|pre\|strong\|em\)\>'
2. å¾çè·¯å¾æ£æ¥
é®é¢æ¨¡å¼: img-1.png, screenshot-10.png
æ£æ¥å½ä»¤:
# æ£æ¥è¿å符+æ°åçæä»¶å
grep -nE '(img|image|screenshot|fig|figure)-[0-9]+\.(png|jpg|webp|gif)' *.mdx
3. Frontmatter æ£æ¥
å¿
éåæ®µ: title, description
æ£æ¥å½ä»¤:
# æ£æ¥ç¼ºå¤± title çæä»¶
grep -L '^title:' *.mdx
# æ£æ¥ç¼ºå¤± description çæä»¶
grep -L '^description:' *.mdx
# æ£æ¥ description é¿åº¦ï¼å»ºè®® 50-160 å符ï¼
for f in *.mdx; do
desc=$(grep '^description:' "$f" | cut -d':' -f2-)
len=${#desc}
if [ $len -lt 50 ] || [ $len -gt 160 ]; then
echo "â ï¸ $f: description é¿åº¦ $lenï¼å»ºè®® 50-160ï¼"
fi
done
4. 代ç å宿´æ§æ£æ¥
æ£æ¥å½ä»¤:
# æ£æ¥æªéåç代ç å
awk '/^```/{flag=1-flag} END{if(flag)print "â æªéåç代ç å"}' *.mdx
# æ£æ¥ä»£ç åè¯è¨æ è¯
grep -n '^```[^a-z]*$' *.mdx | grep -v '^.*:.*````*$'
5. ç¿»è¯å®æ´æ§æ£æ¥
æ¹è¿åçæ£æµé»è¾:
# 1. å®ä¹å¸¸è§çè±æææ¯æ¯è¯ï¼ä¸åºè¢«æ£æµä¸ºæªç¿»è¯ï¼
TECH_TERMS=(
"React|TypeScript|JavaScript|Node\.js|npm|yarn|pnpm"
"API|SDK|CLI|GUI|IDE|JSON|YAML|XML|HTTP|HTTPS"
"CSS|HTML|SQL|NoSQL|REST|GraphQL"
"Git|GitHub|GitLab|Bitbucket"
"Docker|Kubernetes|AWS|GCP|Azure"
"MacOS|Windows|Linux|Ubuntu|Debian"
"CDN|DNS|SSL|TLS|OAuth|JWT"
)
# å并为æ£å表达å¼
TECH_REGEX=$(IFS="|"; echo "${TECH_TERMS[*]}")
# 2. æ£æ¥ä¸ææä»¶ä¸çè±æåè¯ï¼æé¤ææ¯æ¯è¯ï¼
for f in content/docs/zh-CN/*.mdx; do
# ç»è®¡è±æåè¯æ°éï¼æé¤ææ¯æ¯è¯ï¼
english=$(grep -oE '\b[A-Za-z]+\b' "$f" | \
grep -v -E "^($TECH_REGEX)$" | \
wc -l)
# ç»è®¡æ»è¯æ°
total=$(wc -w < "$f")
# 计ç®è±æå æ¯
if [ $total -gt 0 ]; then
ratio=$((english * 100 / total))
if [ $ratio -gt 20 ]; then
echo "â ï¸ $f: è±æå æ¯ ${ratio}%ï¼å¯è½æªç¿»è¯"
fi
fi
done
# 3. æ£æ¥æ£æå
容æ¯å¦ä¸è±æçç¸åï¼æé¤ frontmatterï¼
for f in content/docs/zh-CN/*.mdx; do
en_file="${f/zh-CN/en}"
if [ -f "$en_file" ]; then
# æåæ£æï¼è·³è¿å 10 è¡ frontmatterï¼
zh_body=$(tail -n +10 "$f")
en_body=$(tail -n +10 "$en_file")
if [ "$zh_body" = "$en_body" ]; then
echo "â $f: æ£æå
容ä¸è±æçç¸åï¼æªç¿»è¯ï¼"
fi
fi
done
# 4. æºè½æ£æµï¼åºäºå¥å级å«ï¼
for f in content/docs/zh-CN/*.mdx; do
# æåå
å«å¤§éè±æçå¥å
grep -nE '^[^#]*[A-Za-z]{20,}[^#]*$' "$f" | \
grep -v '```' | \
grep -v '<!--' | \
head -5
done
æ´æºè½çæ£æµ:
# ä½¿ç¨ MDX AST è§£æï¼æ´åç¡®ï¼
# éè¦å®è£
: npm install -D remark remark-mdx
npx remark content/docs/zh-CN/article.mdx \
--use remark-mdx \
--tree | \
jq '.. | .value? | select(. != null) | select(test("[A-Za-z]{10,}"))'
èªå¨ä¿®å¤
ä¼å ä½¿ç¨ prettier
# 妿æ prettierï¼ä¼å
使ç¨
if command -v prettier &> /dev/null; then
echo "â
ä½¿ç¨ prettier æ ¼å¼å..."
prettier --write "**/*.mdx"
fi
ä¿®å¤ç¹æ®å符
# ä¿®å¤ < 符å·ï¼æ°ååï¼
sed -i 's|<\([0-9]\)|under \1|g' *.mdx
sed -i 's|<\([0-9]\)|<\1|g' *.mdx # æä½¿ç¨ HTML å®ä½
# ä¿®å¤ > 符å·ï¼æ°ååï¼
sed -i 's|>\([0-9]\)|over \1|g' *.mdx
sed -i 's|>\([0-9]\)|>\1|g' *.mdx # æä½¿ç¨ HTML å®ä½
ä¿®å¤å¾çè·¯å¾
# ä¿®å¤è¿å符+æ°åçæä»¶å
# img-1.png â img01.png
# screenshot-10.png â screenshot10.png
sed -i -E 's|(img|image|screenshot|fig|figure)-([0-9]+)\.|\1\2.|g' *.mdx
ä¿®å¤ Frontmatter
# æ·»å 缺失ç titleï¼å¦ææä»¶åææä¹ï¼
for f in *.mdx; do
if ! grep -q '^title:' "$f"; then
title=$(basename "$f" .mdx | sed 's/-/ /g' | sed 's/\b\(.\)/\u\1/')
sed -i "1i---\ntitle: $title\n---" "$f"
fi
done
ä½¿ç¨æ¹å¼
æ¹å¼ 1: 宿´æ£æ¥ï¼æ¨èï¼
# 1. åºç¡æ£æ¥ï¼å¦ææ eslint-mdxï¼
if [ -f "node_modules/eslint-plugin-mdx" ]; then
npx eslint "**/*.mdx" --fix
fi
# 2. æ ¼å¼åï¼å¦ææ prettierï¼
if [ -f "node_modules/prettier" ]; then
npx prettier --write "**/*.mdx"
fi
# 3. Fumadocs ä¸é¡¹æ£æ¥
mdx-validator --check-images --check-translation
# 4. èªå¨ä¿®å¤å©ä½é®é¢
mdx-validator --fix
æ¹å¼ 2: ä» ä½¿ç¨ mdx-validator
# æ£æ¥å个æä»¶
mdx-validator article.mdx
# æ£æ¥ç®å½ä¸æææä»¶
mdx-validator content/docs/en/**/*.mdx
# æ£æ¥å¹¶ä¿®å¤
mdx-validator --fix content/docs/en/**/*.mdx
æ¹å¼ 2: éæå°å·¥ä½æµ
# å¨ç¿»è¯åè¿è¡
article-translator article.mdx --to zh
mdx-validator --fix content/docs/zh/article.mdx
# å¨æå»ºåè¿è¡
mdx-validator content/docs/**/*.mdx && pnpm build:docs
è¾åºç¤ºä¾
=== MDX Validation Report ===
File: content/docs/en/ai-ml/jina-vlm.mdx
â
Special characters: OK
â ï¸ Image paths: 2 issues found
Line 45: img-10.png â img10.png
Line 78: screenshot-1.png â screenshot01.png
â
Frontmatter: OK
â
Code blocks: OK
Auto-fix available: mdx-validator --fix jina-vlm.mdx
é ç½®
å¯å¨é¡¹ç®æ ¹ç®å½å建 .mdx-validator.json:
{
"rules": {
"specialChars": true,
"imagePaths": true,
"frontmatter": true,
"codeBlocks": true
},
"autoFix": false,
"ignore": ["node_modules", ".next"]
}
ä¸å ¶ä» Skills é å
fumadocs-article-importer (导å
¥æç« )
â
article-translator (ç¿»è¯å
容)
â
ââââââââââ´âââââââââ
â eslint-mdx â â åºç¡ MDX æ£æ¥ï¼æ¨èï¼
â prettier â â æ ¼å¼åï¼æ¨èï¼
ââââââââââ¬âââââââââ
â
mdx-validator â ä½ å¨è¿éï¼Fumadocs ä¸é¡¹æ£æ¥ï¼
â
pnpm build:docs (æå»º)
â
fumadocs-deploy (é¨ç½²éªè¯)
ð ä¸ç°æå·¥å ·å¯¹æ¯
| æ£æ¥é¡¹ | eslint-mdx | prettier | mdx-validator |
|---|---|---|---|
| MDX JSX è¯æ³ | â | – | – |
| Markdown è¯æ³ | â | – | – |
| 代ç 飿 ¼ | – | â | – |
| ç¹æ®å符ï¼MDXï¼ | – | – | â |
| å¾çæä»¶å | – | – | â |
| ç¿»è¯å®æ´æ§ | – | – | â |
| Fumadocs ç¹å® | – | – | â |
ç»è®º:
- ä½¿ç¨ eslint-mdx + prettier è¿è¡åºç¡æ£æ¥
- ä½¿ç¨ mdx-validator è¿è¡ä¸é¡¹æ£æ¥
- ä¸è äºè¡¥ï¼ä¸å²çª
常è§é®é¢
Q: 为ä»ä¹è¦é¢æ£æ¥ï¼
A: MDX è¯æ³éè¯¯å¨æå»ºæ¶æä¼åç°ï¼é¢æ£æ¥å¯ä»¥ï¼
- æååç°é®é¢ï¼èçæå»ºæ¶é´
- èªå¨ä¿®å¤å¸¸è§é®é¢
- é¿å CI/CD 失败
Q: åªäºå符æ¯å®å ¨çï¼
A:
- å®å
¨: åæ¯ãæ°åãåºæ¬æ ç¹ï¼
. , ! ? ; : ' " ( )ï¼ - ä¸å®å
¨:
<>{}&ï¼éè¦ç¹æ®å¤çï¼ - 代ç åä¸: ææå符é½å®å ¨
Q: å¾çè·¯å¾ä¸ºä»ä¹ä¸è½ç¨è¿å符ï¼
A: MDX ä¼å° img-1.png è§£æä¸º img åå» 1.pngï¼å¯¼è´è·¯å¾é误ã
ä½¿ç¨ img01.png æ openclaw01.png å¯é¿å
æ¤é®é¢ã