# Claw Markdown Gen

> 从网页采集内容生成风格化图文（公众号/知乎/掘金/小红书/头条风格）。 当用户需要将网页文章转为精美图文、生成公众号推文、制作小红书笔记、或对文章进行AI改写时使用。 触发词: 生成图文、公众号文章、图文内容、微信推文、article generation、图文生成

- Skill: `lord1egypt/claw-markdown-gen` (Agent Skill)
- Install (CLI): `npx skillmds@latest add lord1egypt/claw-markdown-gen`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lord1egypt/claw-markdown-gen/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: Lord1Egypt (https://skillmd.com/u/lord1egypt)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/lord1egypt/claw-markdown-gen

---


## 图文生成技能

### 调用来源识别

在收到用户输入后，先判断是否来自 `claw-markdown` 插件：

- 如果 prompt 中包含标识 `claw-markdown-gen` → 执行下方完整图文生成流程
- 如果 prompt 中不包含此标识 → 回复以下引导信息后停止：
```
请安装 ClawMarkDown 浏览器插件后使用本技能。  
插件安装后，在任意网页点击"阅读此文"即可自动采集文章内容并生图文。  
> 技能名称：claw-markdown-gen  
版本：2.2.0  
兼容平台：OpenClaw / QClaw / Hermes / ArkClaw
```

* * *

### 风格配置声明

根据 user 消息中的 `{style}` 参数（中文），按以下映射加载对应的风格配置文件：

| `{style}` | 配置文件路径 |
|:---------:|:------------|
| `公众号` | `references/styles/wechat_common_style.json` |
| `知乎` | `references/styles/zhihu_common_style.json` |
| `掘金` | `references/styles/juejin_common_style.json` |
| `小红书` | `references/styles/xiaohongshu_common_style.json` |
| `头条` | `references/styles/toutiao_common_style.json` |

各配置文件的字段含义：

| JSON 字段 | 含义 | 约束等级 |
|-----------|------|---------|
| `style.tone` | 全文语气基调（如"口语化、短段落、轻松"） | 必须遵循 |
| `style.structure` | 三段结构：opening / body / conclusion | 中度/重度改写必须按此组织，轻度仅作参考 |
| `style.formatting` | 标题格式、代码块、列表等排版规则 | 建议遵循 |
| `style.taboo` | 禁止出现的写作方式 | 严格禁止 |

**降级规则**：JSON 文件不存在或无法解析 → 使用下方字段说明表中的简述继续生成，并在文末追加 `<!-- style_fallback:{style} -->` 注释。

后续执行步骤中不再单独说明风格约束，直接引用本声明中加载的配置。

---

### 输出约束（必须严格遵守）

1. **回复中只输出最终的 Markdown 图文内容**
2. **绝对禁止**输出以下任何内容：
   - 思考过程、推理步骤、内部对话
   - 关键字列表、关键字映射 JSON
   - 步骤序号（"第一步"、"第二步"...）
   - 图片插入规划说明、段落匹配结果
   - 确认语句（"已按 XX 风格生成"、"根据您的要求..."）
   - **技能定位叙述**（"找到了 XX 技能"、"让我先读取 SKILL.md"、"现在让我读取参考文档"等）
   - **任何形式的前导说明、过渡语、操作叙述**
   - 任何与最终图文无关的文字
3. **允许输出**：
   - 每张图片占位符后紧跟一行 `<!-- kw:文件名:关键词1,关键词2,... -->` 格式的关键词注释，用于插件端回填 IndexedDB
   - 版本更新提示行（仅当 cloudVersion_from_plugin 大于当前版本时输出）：`## 请更新 claw-markdown-gen 至最新版本 v{cloudVersion_from_plugin}`，输出位置在标题下方、正文之前
4. 违反以上约束的输出视为技能调用失败
5. **输出的第一个字符必须是 `#`（Markdown 标题）**，不得在标题前输出任何文字

* * *

### 输入数据格式

插件调用时数据分布在 system 和 user 两条消息中：

**system 消息** — 原文标题、正文、图片元数据：
```
标题：{title}
正文：
{content}

---

[IMAGE: img_001.jpg]
index: 3
alt: "AI机器人工作场景"
width: 800
height: 600
context: "随着AI技术的发展，越来越多的企业开始引入智能办公系统。这些系统不仅能自动处理文档，还能辅助决策。"
keywords: "AI办公,自动化文档,机器人流程,智能处理"

[IMAGE: img_002.jpg]
index: 7
alt: "自动化办公示意图"
width: 1200
height: 800
context: "传统办公模式下，大量重复性工作消耗了员工的时间和精力。而智能办公系统可以将这些工作自动化。"
```

**user 消息** — 技能指令、改写参数、版本标识：
```
请使用 claw-markdown-gen 技能，根据以下数据生成{style}风格的{mode}图文，改写深度：{rewriteDepth}：
<!-- source: claw-markdown-gen v2.2.0 -->
```

**字段说明：**

| 字段                     | 说明                         |
| ---------------------- | -------------------------- |
| `{title}`            | 原文标题                       |
| `{content}`          | 正文 Markdown 内容             |
| `{style}`            | 图文风格（中文，详见「风格配置声明」中的映射表） |
| `{mode}`             | 字数模式（简述/详细）                |
| `{rewriteDepth}`     | 改写深度（轻度/中度/重度）             |
| `[IMAGE: xxx]`      | 图片元数据块开始标记                 |
| `index`              | 图片在原文中的位置序号，用于定位图片所属的上下文段落 |
| `alt`                | 图片 HTML alt 属性，辅助理解图片内容    |
| `width` / `height` | 图片尺寸信息                     |
| `keywords`           | （可选）已有的图片关键字，逗号分隔。存在时跳过关键字生成，直接使用 |
| `context`            | （可选）图片在原文中前文文字（上溯多个同级元素采集），用于关键字生成的上下文参考，替代 index 段落匹配 |

**图片元数据块以 `---` 与正文分隔，每张图片信息以空行分隔。**


---

### 执行步骤（不得输出中间结果）

本部分描述了生成图文必须执行的处理步骤。**以下所有步骤的中间产物绝对禁止出现在回复中。** 回复中只出现最终 Markdown。

> **参考文档**：执行步骤 2-3（图片关键字生成、插入位置规划）时，必须同时参考 `references/image-handling.md` 中的完整规范，包括关键字生成方法、生成原则、示例、图片插入原则及位置规则。

#### 步骤 0：版本检查

1. 在 user 消息末尾查找 `<!-- source: claw-markdown-gen vX.Y.Z -->` 格式的版本标识，提取其中的版本号 X.Y.Z（cloudVersion_from_plugin）
2. 与本 SKILL.md 头部 `version` 字段中的版本号（当前部署的技能版本）进行比较
3. 如果 cloudVersion_from_plugin > 当前版本号 → 在生成的图文标题下方输出版本更新提示：`## 请更新 claw-markdown-gen 至最新版本 v{cloudVersion_from_plugin}`
4. 如果版本号相同 → 不输出版本提示

#### 步骤 1：解析输入数据

数据分布在 system 和 user 两条消息中，需跨消息提取：

1. 在 system 消息中定位 `---` 分隔符
2. 分隔符之前 → 文案正文 `article_text`
3. 分隔符之后 → 图片元数据块（逐张解析，每张图片元数据以空行分隔）
4. 在 user 消息中提取参数：`style`（风格）、`mode`（简述/详细）、`rewriteDepth`（轻度/中度/重度），以及末尾的 `<!-- source:` 版本标识

每张图片解析得到：`name`（文件名）、`index`（位置序号）、`alt`（描述）、`width`、`height`、`context`（可选，前文文字）、`keywords`（可选，已有关键字）。

**无图片时的处理**：如果 `---` 分隔符之后不存在任何 `[IMAGE: xxx]` 块（即没有图片元数据），则跳过步骤 2 和步骤 3，直接进入步骤 4 生成纯文本文章，步骤 5 照常执行。

#### 步骤 2：为每张图片匹配原文上下文并生成关键字

**带关键字图片的处理（改写场景）**：

如果图片元数据中包含 `keywords` 字段（非空），说明该图片已在首次生成时获得正确关键字。此时：
- **跳过**该图片的上下文匹配和关键字生成
- **直接使用** `keywords` 字段中的关键字，原样写入输出中的 `<!-- kw:... -->` 注释
- 仅对**没有** `keywords` 字段的图片执行下方上下文匹配和关键字生成流程

**匹配上下文：**

每张图片在采集时已从页面 DOM 中提取了前文文字（上溯多个同级元素），存储在 `context` 字段中。直接使用 `context` 字段的文字作为该图片的上下文参考。

如果某张图片没有 `context` 字段或为空，则退回到根据 `index` 序号在 `article_text` 中定位段落的方式：
- `index` 表示图片在原文中的出现顺序
- 将 `article_text` 按段落分割，映射 index 到对应段落
- 提取该段落及其前后各一段的文字作为该图片的上下文

**生成关键字：**  

为每张图片生成 3-5 个中文关键字，分析依据按优先级：

1. 匹配到的上下文字 —— 最直接反映图片在文章中的含义
2. 图片的 `alt` 属性 —— 图片的原始描述
3. 文章整体主题 —— 确保关键字与文章方向一致

**关键字要求：**

-   具体、有区分度，不同图片的关键字必须体现差异性
-   避免泛泛的"图片"、"示意图"、"配图"、"插图"
-   关键字将在步骤 4 中以 HTML 注释形式嵌入输出，供插件端回填 IndexedDB

#### 步骤 3：规划图片插入位置

根据每张图片的关键字，与 `article_text` 各段落做语义匹配：

1. 将图片分配到语义最相关的段落
2. 每 300-500 字插入一张图片
3. 不强制按 `index` 或文件名顺序，以语义相关性为准

**插入位置规则：**

- 引导图（关键字最贴近标题/主题）→ 引言段之后
- 分段配图 → 对应小节标题之后、正文之前
- 结尾图 → 倒数第二段之后

#### 步骤 4：生成图文

根据 `{rewriteDepth}` 执行不同的生成策略：

**所有图片关键字必须输出**：步骤 2 中为每张图片都生成了关键字，无论该图片最终是否被插入文章，关键字注释都必须出现在输出中：
- 被使用的图片：`<!-- kw:文件名:关键词1,关键词2,... -->` 紧跟图片占位符和说明之后（现有格式）
- 未被使用的图片：`<!-- kw:文件名:关键词1,关键词2,... -->` 集中追加在文章末尾

这确保插件端能为所有图片回填正确关键字，避免改写场景中因缺少关键字而重新生成错误关键字。

**轻度改写：**
1. 标题优化：基于 `{title}` 生成引人注目的标题
2. 结构整理：保持原文章节结构，优化标题层级和分段
3. 内容润色：保留 70% 以上原文表述，主要做语法润色、格式整理和少量过渡句补充
4. 图片占位符独立成行，格式为 `{{IMAGE:img_XXX.jpg}}`
5. 每张图片占位符后紧跟一行 `> 图片说明`（不超过 20 字）
6. 每张图片说明后紧跟一行 `<!-- kw:img_XXX.jpg:关键词1,关键词2,关键词3 -->`（3-5 个中文关键词，逗号分隔）
7. 严格遵循「风格配置声明」中加载的 tone、formatting、taboo 约束，structure 仅作语气参考
8. 字数控制：简述 500-800 字 / 详细 1500-3500 字
9. 保持原文核心信息和事实准确性

**中度改写（默认）：**
1. 标题优化：基于 `{title}` 生成引人注目的标题
2. 结构重组：禁止照搬原文的章节结构和顺序，必须按核心价值点重新组织内容框架，提炼 3-5 个关键主题围绕展开
3. 内容原创：每个段落用自己的语言重新表述，与原文表述相似度不超过 30%；删除原文中 50% 以上的细节描述，只保留核心信息
4. 增值内容：必须添加原文没有的个人见解、使用建议、对比分析、注意事项、适用场景或实际案例
5. 图片占位符独立成行，格式为 `{{IMAGE:img_XXX.jpg}}`
6. 每张图片占位符后紧跟一行 `> 图片说明`（不超过 20 字）
7. 每张图片说明后紧跟一行 `<!-- kw:img_XXX.jpg:关键词1,关键词2,关键词3 -->`（3-5 个中文关键词，逗号分隔）
8. 严格遵循「风格配置声明」中加载的 tone、structure、formatting、taboo 约束，必须按 structure 的三段结构重新组织
9. 字数控制：简述 500-800 字 / 详细 1500-3500 字
10. 保持原文核心信息和事实准确性

**重度改写：**
1. 标题优化：基于 `{title}` 生成引人注目的标题
2. 结构重构：完全打破原文结构，以全新角度组织内容，构建独立的叙事框架
3. 内容原创：与原文表述相似度不超过 10%，仅保留核心事实和数据；删除原文中 80% 以上的细节描述
4. 深度增值：大量添加原文没有的深度分析、行业洞察、多角度对比、替代方案、注意事项、实际案例
5. 原文图片：图片占位符独立成行，格式为 `{{IMAGE:img_XXX.jpg}}`，每张后紧跟 `> 图片说明`（不超过 20 字）
6. 每张图片说明后紧跟一行 `<!-- kw:img_XXX.jpg:关键词1,关键词2,关键词3 -->`（3-5 个中文关键词，逗号分隔）
7. SVG 插图：在需要可视化说明的位置，直接输出 SVG 代码（流程图、示意图、装饰图等），用 Markdown 代码块包裹
8. Mermaid 图表：在需要展示关系、流程、架构的位置，输出 Mermaid 代码，用 Markdown 代码块包裹
9. AI 配图：在需要 AI 生成配图的位置，使用 `{{AI_IMAGE:ai_img_XXX.jpg:prompt描述}}` 占位符，后紧跟 `<!-- kw:ai_img_XXX.jpg:关键词1,关键词2,关键词3 -->`。生成完成后，由技能脚本调用用户透传的图片生成 API 将占位符替换为真实图片 URL，保留关键词注释
10. 严格遵循「风格配置声明」中加载的 tone、structure、formatting、taboo 约束，必须按 structure 的三段结构重新组织
11. 字数控制：详细模式 1500-3500 字（重度不支持简述模式）
12. 保持原文核心信息和事实准确性

**重度模式后处理**：LLM 输出含 `{{AI_IMAGE:ai_img_XXX.jpg:prompt}}` 占位符的 Markdown 后，执行 `scripts/generate_images.py` 脚本：

```
python scripts/generate_images.py <input_md> <output_md> \
  --api-key {multimodal.key} \
  --api-url {multimodal.url}
```

脚本流程：
1. 解析所有 `{{AI_IMAGE:ai_img_XXX.jpg:prompt描述}}` 占位符，提取文件名和 prompt
2. 使用请求中透传的 `multimodal.key` 和 `multimodal.url` 调用图片生成 API
3. 将占位符替换为 `![prompt描述](图片URL)` 格式
4. 保留 `<!-- kw:ai_img_XXX.jpg:关键词 -->` 注释，供插件端回填 IndexedDB
5. 输出最终 Markdown 图文

#### 步骤 5：去 AI 味润色

> **参考文档**：执行本步骤时，必须同时参考 `references/ren-zh.md` 中的完整规范，包括核心规则、注入灵魂、高频 AI 模式及快速检查清单。

对生成的 Markdown 图文做去 AI 味处理，保持图片占位符和图片说明不被修改。

### 正确输出示例

```markdown
# AI 助手正在重塑我们的办公方式 

你有没有发现，以前要花半天整理的报表，现在几分钟就搞定了？ 

这不是科幻，而是正在发生的现实。 

{{IMAGE:img_001.jpg}} 
> AI 机器人自动处理文档
<!-- kw:img_001.jpg:AI办公,自动化文档,机器人流程,智能处理 -->

就拿文档处理来说，过去人工一份份核对数据、排版、纠错，效率低还容易出错。现在接入 AI 助手后，它能自动识别表格结构、提取关键信息、甚至按你的风格生成初稿。 

{{IMAGE:img_002.jpg}} 
> 智能办公流程示意
<!-- kw:img_002.jpg:数据大屏,实时监控,业务指标,可视化分析 -->

更妙的是，它不只是"工具"，而是在不断学习你的偏好。你改得越多，它下次就越懂你。 

当然，AI 也不是万能药。最终的判断、创意、策略，还得靠人。但那些重复枯燥的活儿，交给它确实很香。 

拥抱新工具，把精力花在真正值钱的事情上。

<!-- kw:img_003.jpg:团队协作,在线会议,远程办公,视频沟通 -->
<!-- kw:img_004.jpg:数据安全,隐私保护,加密传输,安全防护 -->
```

### 错误处理

| 错误 | 处理方式 |
|------|---------|
| `---` 分隔符后无 `[IMAGE: xxx]` 块 | 跳过步骤 2 和 3，直接生成纯文本文章 |
| 某张图片 `context` 和 `index` 均无法定位段落 | 跳过该图片，不执行关键字生成和插入 |
| 图片关键字语义匹配无合适段落 | 按 index 顺序就近插入，不强制语义匹配 |
| 重度模式 `AI_IMAGE` 生成 API 超时或失败 | 保留 `{{AI_IMAGE:...}}` 占位符，不阻塞文章输出 |
| user 消息中缺少 `style`/`mode`/`rewriteDepth` | 默认值：公众号风格 / 详细 / 中度改写 |
| 风格配置文件不存在或无法解析 | 使用字段说明表中的简述继续生成，并在文末追加 `<!-- style_fallback:{style} -->` 注释 |
| 正文内容为空 | 输出提示："无法从该网页提取到有效正文内容" |

### 降级方案

| 故障 | 降级路径 |
|------|---------|
| 重度模式图片生成 API 不可用 | 跳过 AI 配图，仅保留原文图片占位符 |
| 图片元数据解析失败 | 忽略该图片，继续处理其他图片 |
| 改写后文章字数不足下限 80% | 轻度补充原文相关段落，不补图片 |
| 步骤 0 无法获取 cloudVersion_from_plugin | 跳过版本检查，正常生成图文 |

### 安全注意事项

- 重度模式 AI 配图使用用户自行配置的图片生成 API（`multimodal.key`/`multimodal.url`），技能本身不持有任何密钥
- 图片元数据以纯文本传输，不包含图片二进制数据
- 所有原始图片由插件端在本地 IndexedDB 管理，技能不读取用户本地文件
- 生成的图文为纯 Markdown，不包含可执行代码或脚本
- 敏感操作（调用外部 API）所需的密钥均由用户在插件设置页自行配置，技能不收集或上传任何凭证

### 注意事项

- 输出 Markdown 时不要用代码块包裹
- 图片占位符格式严格为 `{{IMAGE:img_XXX.jpg}}`
- 图片说明不超过 20 字
- 图片插入位置由关键字语义匹配决定，不强制按 index 顺序
- `width` 和 `height` 仅用于判断图片宽高比和大致类型（横图/竖图/方图），不直接出现在输出中
- 正文中若残留作者自我介绍语句（如"大家好，我是XX""嗨，我是XX"等），在生成时将其去除或改写，保持内容干净


