# 微信公众平台文章结构验证规范仓
**Repository Path**: cutee/wechat-spec
## Basic Information
- **Project Name**: 微信公众平台文章结构验证规范仓
- **Description**: 微信公众平台文章结构验证规范仓——面向第三方编辑器开发者的排版合规指南、测试用例、本地检测 CLI 与反馈通道。
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-27
- **Last Updated**: 2026-09-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# verify-article-structure-spec
> 微信公众平台文章结构验证**规范仓**——面向第三方编辑器开发者的排版合规指南、测试用例、本地检测 CLI 与反馈通道。
[](https://opensource.org/licenses/MIT)
---
本仓库制定微信公众号文章 HTML 结构的合规标准,并提供检测能力与反馈机制。供第三方编辑器及排版校验插件的开发者参考。
| 内容 | 文件 | 作用 |
|---|---|---|
| 📜 **规范文档** | [`verify_article_structure.md`](./verify_article_structure.md) | 所有检测规则的权威定义(章节号、阈值、判定逻辑) |
| 🖥️ **本地检测 CLI** | [`cli/`](./cli/) | 本地跑全规则检测(`check`)+ 清理冗余嵌套(`dedupe`),puppeteer 真实浏览器 |
| 🧪 **测试用例** | [`cases.config.js`](./cases.config.js) | 违规用例(badcases)+ 合规反向用例(goodcases)|
> 规范文档是规则真理源;本地 CLI 是规范的具体实现,可用于检测文章合规性。
---
## 本地检测 CLI
`cli/` 子目录是一个**自包含**的检测 CLI(TypeScript + puppeteer),复用本仓的 `cases.config.js` 与 `__tests__/fixtures/` 作为回归用例。
- **`check`**:对本地 HTML 文件跑引擎**全规则**校验(含布局类规则 width 差异 / height-zero / line-height 实测叠字等),输出违规结果。
- **`dedupe`**:`check` 的姊妹能力,把检测出的冗余嵌套层真删掉,输出清理后的 HTML,形成「检测 → 清理 → 复测清零」闭环。
> npm 包 `@tencent/verify-article-structure` 暂未对外开放发布,当前请从源码构建使用。
### 安装(从源码构建)
```bash
git clone https://github.com/wechatjs/verify-article-structure-spec.git
cd verify-article-structure-spec/cli
npm install # 依赖(mp-darkmode / esbuild / jsdom / puppeteer)均在官方源,可直接安装
```
puppeteer 需要 Chromium:安装时会自动下载到 `~/.cache/puppeteer`(首次需联网,约几百 MB)。受限网络可跳过下载并用系统 Chromium:
```bash
PUPPETEER_SKIP_DOWNLOAD=true npm install
PUPPETEER_EXECUTABLE_PATH=/path/to/chrome npm run check ./article.html
```
### 快速上手
```bash
# 检测本地 HTML 文件
npm run check ./article.html
# 输出结构化 JSON
npm run check ./article.html --json
# 清理冗余嵌套,输出清理后的 HTML
npm run dedupe ./article.html --out=./cleaned.html
# 清理并复测 before/after nestNodes
npm run dedupe ./article.html --verify
```
以上命令等价于 `tsx src/index.ts ...` / `tsx src/clean.ts ...`,也可直接 `pnpm check` / `pnpm dedupe`(需 pnpm)。
更多用法、参数、退出码与架构说明见 [`cli/README.md`](./cli/README.md)。
---
## 提交 Issue / 反馈规则问题
> 本仓库的核心对外机制:通过 Issue 驱动规则迭代与完善。
### Issue 类型
| 类型 | 说明 | 标签 |
|---|---|---|
| 🐛 **误报 (False Positive)** | 文章实际是合规的,但被某条规则标记为违规 | `bug` |
| 🐛 **漏报 (False Negative)** | 某篇明显有排版问题的文章没有被检测出来 | `bug` |
| 💡 **规则建议 (Rule Suggestion)** | 建议新增一条排版检测规则 | `enhancement` |
| ⚙️ **阈值调整 (Threshold Tuning)** | 某条规则的参数(如宽度阈值 `677px`、嵌套层数 `15`)太严或太松 | `enhancement` |
### 提交流程
1. 点击 **[New Issue](https://github.com/wechatjs/verify-article-structure-spec/issues/new?template=rule-feedback.yml)** → 直接进入「规则反馈」模板
2. 按模板填写必填字段(涉及规则、文章链接、问题描述、期望行为)
3. 提交后维护者会跟进,修复后会在 Issue 中回复并关闭
### 必填信息
无论哪种 Issue 类型,须提供:
1. **涉及规则**:指明是哪条规则(如 `1.4 width`、`1.1 opacity`、`2.1 嵌套层级`、`4.1 颜色` 等),便于定位。
2. **文章链接** / **文章 HTML**(二选一):提供以下任一即可用于复现和验证。
- **文章链接**:触发问题的公众号文章链接(`https://mp.weixin.qq.com/s/xxx`)。
- **文章 HTML**:提供文章 HTML 源码以便精准排查。
3. **问题描述**:清晰说明期望行为 vs 实际行为。
#### 规则建议额外需要
4. **场景描述**:描述所遇排版问题的场景,附截图或效果对比。
5. **检测思路**(可选):如有自动检测该问题的思路,可一并提出。
#### 示例
##### 📝 误报示例
> **标题**:[误报] 1.4 width 规则错杀响应式图片
>
> **1. 涉及规则**:`1.4 width`
>
> **2. 文章链接**:`https://mp.weixin.qq.com/s/AbCdEfGhIjKlMnOp`
>
> **3. 问题描述**:
> - **期望行为**:图片设置了 `max-width: 100%` 应当判为合规。
> - **实际行为**:被判违规,提示 `width 超过 677px`。
> - 检测逻辑似乎只看了 `width` 属性,忽略了 `max-width` 的约束语义。
##### 💡 规则建议示例
> **标题**:[规则建议] 检测正文中的空 `` 标签
>
> **1. 涉及规则**:建议新增 `5.x 空链接`
>
> **2. 文章 HTML**:
> ```html
> 这是一段正文, 后面还有内容。
> ```
>
> **3. 问题描述**:
> - **期望行为**:检测出文本为空的 `` 标签并提示作者。
> - **实际行为**:当前无相关规则,此类隐形链接会被忽略。
>
> **4. 场景描述**:第三方工具导入文章时,常因模板残留生成 `` 空标签,读者无法点击但占用语义。截图对比见附件。
>
> **5. 检测思路**(可选):
> - 遍历 `` 节点,判断 `textContent.trim()` 为空且无 `
` 子节点即视为空链接。
> - 阈值建议:单篇 ≥ 1 即提示。
---
## 目录结构
```
verify-article-structure-spec/
├── verify_article_structure.md ← 📜 规范文档(权威源)
├── cases.config.js ← 🧪 测试用例配置
├── cli/ ← 🖥️ 本地检测 CLI(check 检测 + dedupe 清理冗余嵌套)
├── __tests__/
│ └── fixtures/ ← 📂 文章 HTML 缓存
│ ├── badcases/ ← 违规用例文章
│ └── goodcases/ ← 合规反向用例文章
├── scripts/
│ └── fetch-fixtures.js ← 从公众号抓取 fixtures 到本地缓存
├── 公众号新功能提示测试汇总/ ← 人工测试记录归档
├── .github/
│ └── ISSUE_TEMPLATE/ ← Issue 模板
├── package.json
└── README.md
```
---
## 测试用例字段说明(cases.config.js)
[`cases.config.js`](./cases.config.js) 定义了用于回归测试的违规与合规用例。如有意附带补充用例,可参照下表字段格式提供:
### `badcases`(违规用例)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `id` | string | ✅ | 文章短链 ID(`mp.weixin.qq.com/s/` 后的部分),同时用作 fixture 文件名 |
| `url` | string | ✅ | 文章完整 URL |
| `relatedRule` | string | ✅ | 期望命中的规则 key,对应 `propertyRules` 中的键(如 `opacity` / `width` / `pre`) |
| `expectInvalidKeys` | string[] | ✅ | 验证结果 `inValidInfo` 中**必须出现**的外层桶名(如 `['width']`) |
| `desc` | string | ✅ | 可读描述,**必须以 `#章节号` 开头**对应 `verify_article_structure.md` 章节,例:`'#1.1 opacity - 图片透明度为 0'` |
### `goodcases`(合规反向用例)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `id` | string | ✅ | 同上 |
| `url` | string | ✅ | 同上 |
| `desc` | string | ✅ | 可读描述(无章节号约束) |
> goodcase 期望:`isValid: true` 且 `inValidInfo` 为空。
---
## 版本历史
| 版本 | 日期 | 变更 |
|---|---|---|
| 0.2.16 | 2026-09-10 | line-height 叠字检测改用 Range API 精确测量,修复单行文字 + padding/border 误报叠字 |
| 0.2.15 | 2026-09-07 | 修复居中判断 bug(abs(left+right)→abs(left-right));宽度/居中/溢出三维度独立判断;正常响应式(大屏一致+小屏撑满容器)不再误报宽度差异;debug 模式增强 |
| 0.2.14 | 2026-09-01 | 图片加载不再阻塞插入(带 `data-w` 的图直接用占位宽度)+ `deleteNestNode` 删除前增加有意义内容安全检查,避免误删正文 |
| 1.0.0 | 2026-06-25 | 首个对外发布版本 · 含规范文档、测试用例与 Issue 反馈通道 |
---
## License
MIT