继MCP之后的Skills到底能干什么?
什么是Skills?
其实在2025年的年轻我在撰写提示词时,是有关于skill的概念的,当时我所接手时现在模型大厂的一个PPT项目,需要构建System Prompt,由于我是设计专业出身所以就需要设计一套流程化的提示词来对模型的审美和构图能力进行规范,当时我就意识到如果将所有的设计师经验回忆道一个SP中那么模型不就成了设计大神。
我当时的核心工作就是把自己之前的设计经验融合整理成文字形式让模型去学习去根据我的经验来进行ppt生成,甚至我还会给他配色、排版、字体等网站让他自己学习,其实这就是skill的概念将人类专业中宝贵的经验累积分享下来。
Skills 是一套专门为模型设计的知识库系统,包含了各类任务的最佳实践、操作规范和质量标准。这些都是通过大量实验和迭代积累下来的宝贵经验。
Skill的构成
核心设计理念:按需加载+渐进式加载(Progressive Loading)
这种设计解决了一个关键问题:如何在有限的上下文窗口中高效管理大量知识? xxxx 小姐
把 AI 想象成一个刚毕业的聪明但没经验的实习生:
普通Prompt = 你每次都要从头教他怎么做事(今天教一遍,明天还得重新教)
Rule / 记忆 = 你给他贴一张"公司行为守则"在工位上(一直生效,但只能管态度和格式)
MCP / Tools = 你给他电脑装了一堆软件和API(他能调用外部工具,但不知道什么时候该用、怎么组合用)
Skills = 你直接给他一整套"岗位培训大礼包"(PDF+流程图+SOP+话术模板+常用脚本),告诉他:"当老板让你做这类事情时,就按这个文件夹里的方法来做" 约炮
如何为项目构建 SKILL.md 配置文件?
SKILL.md 文件是一份专门为 AI 编写的"工作手册",它能引导 Claude 按照既定流程自动化处理特定任务,从而实现能力扩展。
步骤一:建立技能存储结构
技能文件需要按规范存放。针对项目级别的技能,应在项目根目录创建以下路径:
mkdir -p .claude/skills/<技能名称>
关键要点:
- 作用域区分:放置在 .claude/skills//SKILL.md 的技能仅在当前项目内生效
- 命名约定:建议采用 kebab-case 格式(小写字母+连字符),长度不超过 64 字符
步骤二:构建文件内容框架
SKILL.md 采用双层结构设计: 电影小宝影院
层级 1:元数据配置(YAML Frontmatter)
位于文件开头,用 --- 分隔符包裹,定义技能的触发逻辑:
- name:技能标识符,同时作为斜杠命令使用(如 /code-review)
- description:触发判断依据,需包含用户可能使用的自然语言关键词(这是最关键的配置项)
- disable-model-invocation:设为 true 时禁止自动触发,仅支持手动调用
- allowed-tools:限定可用工具范围(如 Read、Grep 等)
层级 2:执行指令(Markdown 正文)
紧接元数据部分,编写 AI 需遵循的标准操作流程: 小宝影院 爱一帆电影
- 撰写原则:指令应具体、明确且可执行
- 动态参数:通过 $ARGUMENTS 或 $0、$1 接收用户输入
步骤三:实战配置案例
创建代码审查技能 .claude/skills/code-review/SKILL.md:
name: code-review
description: 执行代码审查,识别潜在缺陷和性能瓶颈。适用于代码质量检查、漏洞扫描等场景。
disable-model-invocation: false aiyifan电影
代码审查执行规范
收到审查请求后,按以下顺序操作:
- 安全漏洞扫描:检测 SQL 注入风险、明文密钥等安全隐患
- 性能分析:定位冗余循环、内存泄漏等性能问题
- 目标文件处理:若用户指定文件($ARGUMENTS),优先处理该文件
- 结果呈现:以结构化列表输出问题点及改进方案
步骤四:扩展资源管理(高级功能)
当指令内容超过 500 行时,建议采用模块化管理:
目录组织方案:
.claude/skills/code-review/
├── SKILL.md # 核心指令文件
├── templates/ # 代码/文档模板库
├── examples/ # 正反面案例集
└── scripts/ # 可执行脚本(如 validate.sh)
引用机制:在 SKILL.md 中通过相对路径声明,例如:"格式规范参见 examples/best-practice.md"。Claude 会按需加载这些资源,有效控制 Token 消耗。
步骤五:功能验证
完成配置后可通过以下方式测试: xxxxx
- 手动触发:在终端执行 /技能名称 参数(例:/code-review src/main.js)
- 智能识别:输入符合 description 描述的自然语言请求(如"帮我检查这段代码"),系统将自动匹配并加载技能
排查提示:若技能未按预期激活,请检查:
- description 字段是否包含常用触发词
- 运行 /context 命令查看技能是否因超出字符限制而被过滤
Skills 应用场景(精炼业务版)
应用场景总览:Skills 解决什么问题
从业务视角看,Skills 的核心价值不是“更会写提示词”,而是把高频、可复制、可标准化的工作沉淀为组织级能力。在实际工作中,其应用场景可以收敛为三大类: xxxvideo
- 高频标准化流程(SOP 类)
- 强组织语境与内部知识依赖类
- 多资源协同的复杂生产任务
这三类场景,覆盖了个人效率、团队一致性与技术自动化三个层级。
- 高频标准化流程(SOP 类场景)
场景特征
同类任务周期性重复(周 / 月 / 项目节点)|输出结构高度固定|人工操作成本主要浪费在“重新组织表达”而非思考本身
判断标准一句话版:
这件事如果不靠记忆、而是靠流程完成,就该做成 Skill。
1.1 周报 / 月报 / 项目汇报生成
痛点:汇报频率高但信息密度低|结构固定却每次重写|多数据源拼装成本高(项目系统 / 代码仓库 / 会议纪要)|不同人输出风格差异大,管理者阅读成本高
Skill 的好处:将“经验型检查”结构化|固化检查顺序与判断标准|降低人为疏漏概率 aiyifan 小宝影院在线视频 xnxx 会所
1.2 固定结构写作与文档模板
痛点:文档结构不统一|新成员无从下笔|评审时间被格式问题消耗|文档难以规模化复用
常见文档类型:产品需求文档(PRD)|技术方案 / RFC|事故复盘与复盘报告|内部技术分享材料
Skill 的好处:统一结构与逻辑顺序|明确“每一部分该回答什么问题”|提升文档的决策支持能力
- 强组织语境与内部知识依赖类场景
场景特征
强依赖公司内部定义、规则与共识|脱离组织语境,通用模型输出失真|一致性比创造性更重要
一句话总结:
这类 Skill 的目标不是“更聪明”,而是“不出错”。
2.1 品牌调性与内容规范
痛点:对外表达风格割裂|术语口径不统一|禁用表达靠口口相传|新人学习成本高
Skill 的好处:语气与风格基准|统一术语表|禁用词与风险表达|标准示例库
2.2 团队工程与协作规范
痛点:提交信息不可读|PR 评审成本高|代码风格不统一|项目结构随人而变
Skill 覆盖范围:Commit 信息规范|PRD 描述模板|工程目录与命名规范|代码风格与最佳实践
2.3 业务口径与指标定义
痛点:同一指标多种解释|报表对不上结论|新人理解成本高|数据决策缺乏可信基础
Skill 的优势:固化指标定义|明确计算逻辑与边界条件|统一数据解释方式 小寶影院
- 多资源协同的复杂生产任务
场景特征
仅靠提示词不稳定|需要脚本、模板、示例协同|输出质量要求高且可复用
这一类 Skill 更接近“轻量自动化系统”。
3.1 数据分析与报告自动化
痛点:分析流程重复|手工清洗易出错、图表风格不统一|结论表达质量不稳定
Skill 组合能力:数据解析与清洗脚本|标准图表配置|结论生成模板 小宝影院电影
3.2 文档批量生成与维护
痛点:文档数量大|手工维护成本高|更新不及时|一致性差
典型应用:API 文档、组件与配置文档、批量格式转换
3.3 测试与项目脚手架生成
痛点:测试模板重复劳动|风格不一致|Mock 数据构造成本高|覆盖率难保障
Skill 的角色:固化测试结构|统一断言规范|提供可复用基础设施
如何判断是否值得做成 Skill
三个业务判断维度
- 频率:是否持续、高频发生
- 稳定性:是否存在固定结构与规则
- 复杂度:是否难以用一句话描述清楚
满足其中两项,通常就具备投入价值。
Skills 的本质不是“工具升级”,而是:
把个人经验转化为组织可复用的生产力资产。从最浪费时间、最容易出错、最依赖个人记忆的工作开始,优先落地 Skill,往往能获得最高的投入产出比。
案例:一键公众号排版 Skill
背景要求:用户上传原始文章(txt/pdf/md/docx) → AI自动格式化美化 → 生成可直接复制到微信公众号的HTML代码
三层架构设计
第一层:元信息层
wechat-formatter xxxxxx
微信公众号一键排版工具。上传原始文章文件,自动转换为适合公众号的精美排版格式。 支持 txt、pdf、markdown、docx 等格式,自动应用宝蓝色主题样式,一键复制粘贴即可发布。 - 用户上传了文本/PDF/Word文件 - 用户说"帮我排版"、"格式化这篇文章"、"转换成公众号格式" - 用户说"一键导入公众号"、"美化排版" - 文件内容是文章、博客、报告等长文本 ✅ 自动识别文章结构(标题、正文、列表、引用) ✅ 应用宝蓝色主题样式(专业、清爽) ✅ 优化段落间距、字体大小、配色 ✅ 生成公众号适配的HTML代码 ✅ 提供多种风格变体(专业、温暖、创意) ✅ 支持多种输入格式(txt/pdf/md/docx) 1. 接收用户上传的文件 2. 提取并分析文本内容和结构 3. 应用宝蓝色主题样式模板 4. 生成HTML格式化代码 5. 提供预览和复制按钮 ifun 爱壹帆电影 爱壹帆免费版 约炮
/mnt/skills/user/wechat-formatter/SKILL.md 免费在线影院
1.0.0
2025-02-01
第二层:SKILL.md 正文
微信公众号一键排版 Skill
核心流程
Step 1: 接收文件
支持的格式: 电影aiyifan
.txt- 纯文本文件.pdf- PDF文档(自动提取文字).md- Markdown文件.docx- Word文档
文件获取方式: xxxvideo
- 用户直接上传到对话中
- 文件路径:
/mnt/user-data/uploads/[filename]
Step 2: 内容分析与结构识别
自动识别元素: 小寶影院电影
- 文章标题:通常是第一行,字数较少,或用
#标记 - 副标题/引言:标题后的概括性文字
- 正文段落:主体内容,按空行分段
- 小标题:段落前的标题,或用
##标记 - 列表项:以
-或数字开头的条目 - 引用块:以
>开头的文本 - 强调文字:用
**或关键词汇 - 代码块:用 ``` 包裹的内容
结构分析逻辑:
def analyze_structure(content):
"""
分析文章结构
"""
lines = content.split('\n')
structure = {
'title': None, # 主标题
'subtitle': None, # 副标题/引言
'sections': [] # 章节列表
}
# 识别主标题(第一行或 # 开头)
if lines[0].startswith('#'):
structure['title'] = lines[0].strip('#').strip()
else:
structure['title'] = lines[0].strip()
# 识别副标题(主标题后的短段落)
if len(lines) > 2 and len(lines[2]) < 100:
structure['subtitle'] = lines[2].strip()
# 识别章节
current_section = None
for line in lines[1:]:
if line.startswith('##'):
# 二级标题 = 新章节
current_section = {
'heading': line.strip('#').strip(),
'paragraphs': []
}
structure['sections'].append(current_section)
elif current_section:
# 添加到当前章节
if line.strip():
current_section['paragraphs'].append(line.strip())
return structure
Step 3: 应用样式模板
宝蓝色主题配色方案:
/* 主题色定义 */
:root {
--primary-blue: #1E88E5; /* 宝蓝色 - 主色 */
--light-blue: #E3F2FD; /* 浅蓝色 - 背景 */
--dark-blue: #0D47A1; /* 深蓝色 - 标题 */
--text-primary: #333333; /* 正文黑色 */
--text-secondary: #666666; /* 次要文字灰色 */
--border-color: #BBDEFB; /* 边框蓝色 */
}
/* 主标题样式 */
.main-title {
font-size: 22px;
font-weight: bold;
color: var(--dark-blue);
text-align: center;
padding: 20px 0;
margin-bottom: 15px;
border-bottom: 3px solid var(--primary-blue);
}
/* 副标题/引言样式 */
.subtitle {
font-size: 15px;
color: var(--text-secondary);
text-align: center;
font-style: italic;
padding: 10px 20px;
background: var(--light-blue);
border-left: 4px solid var(--primary-blue);
margin-bottom: 20px;
}
/* 章节标题样式 */
.section-heading {
font-size: 18px;
font-weight: bold;
color: var(--primary-blue);
padding: 15px 0 10px 15px;
margin-top: 25px;
border-left: 5px solid var(--primary-blue);
background: linear-gradient(to right, var(--light-blue), transparent);
}
/* 正文段落样式 */
.paragraph {
font-size: 16px;
line-height: 1.8;
color: var(--text-primary);
text-align: justify;
margin: 15px 0;
padding: 0 10px;
}
/* 强调文字 */
.highlight {
color: var(--primary-blue);
font-weight: 600;
}
/* 列表样式 */
.list-item {
font-size: 15px;
line-height: 1.7;
color: var(--text-primary);
padding: 8px 0 8px 25px;
position: relative;
}
.list-item::before {
content: "●";
color: var(--primary-blue);
font-weight: bold;
position: absolute;
left: 10px;
}
/* 引用框样式 */
.quote-box {
background: var(--light-blue);
border-left: 4px solid var(--primary-blue);
padding: 15px 20px;
margin: 20px 0;
font-style: italic;
color: var(--text-secondary);
}
/* 代码块样式 */
.code-block {
background: #F5F5F5;
border: 1px solid var(--border-color);
border-radius: 5px;
padding: 15px;
font-family: 'Courier New', monospace;
font-size: 14px;
overflow-x: auto;
margin: 15px 0;
}
/* 分隔线 */
.divider {
height: 2px;
background: linear-gradient(to right, transparent, var(--primary-blue), transparent);
margin: 25px 0;
}排版规范:
- 字体大小:标题 22px / 小标题 18px / 正文 16px
- 行间距:1.8倍(适合手机阅读)
- 段间距:15-20px
- 页面边距:左右各10px
- 配色:以宝蓝色为主色调,搭配浅蓝背景和深蓝标题
Step 4: HTML模板生成
def generate_html(structure, style='sapphire-blue'):
"""
生成公众号HTML代码
Args:
structure: 文章结构对象
style: 样式主题(默认宝蓝色)
Returns:
formatted_html: 格式化的HTML代码
"""
# 加载CSS样式(从第三层文件)
css = load_style(f'../styles/{style}.css')
# 构建HTML
html_parts = []
# 1. 主标题
if structure['title']:
html_parts.append(f'''
<h1 class="main-title">{structure['title']}</h1>
''')
# 2. 副标题/引言
if structure['subtitle']:
html_parts.append(f'''
<div class="subtitle">{structure['subtitle']}</div>
''')
# 3. 章节内容
for section in structure['sections']:
# 章节标题
html_parts.append(f'''
<h2 class="section-heading">{section['heading']}</h2>
''')
# 章节段落
for para in section['paragraphs']:
# 检测段落类型
if para.startswith('-') or para.startswith('•'):
# 列表项
text = para.lstrip('-•').strip()
html_parts.append(f'''
<div class="list-item">{format_inline(text)}</div>
''')
elif para.startswith('>'):
# 引用
text = para.lstrip('>').strip()
html_parts.append(f'''
<div class="quote-box">{format_inline(text)}</div>
''')
elif para.startswith('```'):
# 代码块
code = extract_code_block(para)
html_parts.append(f'''
<pre class="code-block">{code}</pre>
''')
else:
# 普通段落
html_parts.append(f'''
<p class="paragraph">{format_inline(para)}</p>
''')
# 章节分隔线
html_parts.append('<div class="divider"></div>')
# 组合最终HTML
html = f'''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>{css}</style>
</head>
<body>
<section class="wechat-article">
{''.join(html_parts)}
</section>
</body>
</html>
'''
return html
def format_inline(text):
"""
处理行内格式(加粗、高亮等)
"""
# **加粗** → <strong>
text = re.sub(r'\*\*(.+?)\*\*', r'<strong class="highlight">\1</strong>', text)
# `代码` → <code>
text = re.sub(r'`(.+?)`', r'<code style="background:#F0F0F0;padding:2px 5px;">\1</code>', text)
return text
Step 5: 输出与使用
输出格式: iyf
生成HTML文件:保存到 /mnt/user-data/outputs/formatted_article.html
提供使用说明: 爱一帆
✅ 排版完成!
📋 使用方法:
1. 下载生成的HTML文件
2. 在浏览器中打开
3. 全选内容(Ctrl+A / Cmd+A)
4. 复制(Ctrl+C / Cmd+C)
5. 打开微信公众号编辑器
6. 粘贴(Ctrl+V / Cmd+V)
7. 检查效果,调整细节
8. 发布!
💡 提示:
- 如果样式丢失,使用"壹伴"或"秀米"等插件辅助
- 图片需要单独上传到公众号素材库
- 建议在手机预览效果可选输出: xxxxxx
- 纯HTML代码:直接显示在对话中,方便复制
- 截图预览:生成排版效果的截图
- 多种风格:提供2-3种配色方案供选择
使用示例
示例对话流程
用户: 爱壹帆在线
[上传文件: my_article.txt]
帮我把这篇文章排版成适合公众号的格式,用宝蓝色主题AI 执行流程: xxx
# 1. 读取文件
content = read_file('/mnt/user-data/uploads/my_article.txt')
# 2. 分析结构
structure = analyze_structure(content)
# 3. 生成HTML
html = generate_html(structure, style='sapphire-blue')
# 4. 保存文件
save_file('/mnt/user-data/outputs/formatted_article.html', html)
# 5. 提供给用户
present_file('formatted_article.html')✅ 已为您完成排版!采用宝蓝色主题,专业清爽。
📄 文章结构:
- 主标题:《如何提升工作效率》
- 3个章节,共12段内容
- 已优化:段落间距、字体大小、配色方案
📥 下载文件:formatted_article.html
📋 使用步骤:
1. 用浏览器打开文件
2. 全选并复制(Ctrl+A → Ctrl+C)
3. 粘贴到公众号编辑器(Ctrl+V)
4. 预览并发布
🎨 样式特点:
- 主色调:宝蓝色 #1E88E5
- 标题突出,层次清晰
- 适配手机阅读
高级功能
自动优化建议
AI 会自动检测并提示: 楼凤信息
- ⚠️ 段落过长(超过200字)→ 建议分段
- ⚠️ 缺少小标题 → 建议添加结构
- ⚠️ 文字密集 → 建议增加列表或引用框
- ⚠️ 无配图 → 提醒添加图片
优化示例: 电影爱壹帆
💡 优化建议:
1. 第3段内容较长(320字),建议拆分为两段,提升可读性
2. 检测到多个要点,已自动转换为列表格式
3. 发现关键结论,已使用引用框高亮显示
4. 建议在第2、5、8段后各插入一张配图
多风格变体
除了宝蓝色主题,还可以提供: xnxx
- 商务专业风(深蓝+灰色)
- 温暖亲和风(橙色+米黄)
- 清新自然风(绿色+浅绿)
- 科技未来风(紫色+渐变)
用户:"换成温暖风格试试"
AI:重新生成 → 应用橙色主题
常见问题处理
Q1: PDF 文件无法识别?
- 检查PDF是否为扫描件(需OCR)
- 使用
pdfplumber提取文字 - 如果失败,建议转换为txt后再处理
Q2: 样式在公众号编辑器中丢失?
解决方案:
- 使用行内样式(inline CSS)而非外部样式表
- 避免使用公众号不支持的CSS属性
- 推荐使用"壹伴"等插件辅助粘贴
Q3: 图片如何处理?
处理方式: 爱壹帆影视
- 图片不包含在HTML中(公众号限制)
- 在文中标注图片位置:
[图片:示意图] - 提醒用户单独上传到素材库
技术实现细节
文件读取适配
def read_content(filepath):
"""
根据文件类型读取内容
"""
ext = Path(filepath).suffix.lower()
if ext == '.txt':
with open(filepath, 'r', encoding='utf-8') as f:
return f.read()
elif ext == '.pdf':
import pdfplumber
text = []
with pdfplumber.open(filepath) as pdf:
for page in pdf.pages:
text.append(page.extract_text())
return '\n'.join(text)
elif ext == '.md':
with open(filepath, 'r', encoding='utf-8') as f:
return f.read()
elif ext == '.docx':
from docx import Document
doc = Document(filepath)
return '\n'.join([p.text for p in doc.paragraphs])
else:
raise ValueError(f"不支持的文件格式: {ext}")
完整工作流程图
用户上传文件
↓
[读取文件内容]
↓
[分析文章结构]
├─ 识别标题
├─ 划分章节
└─ 检测列表/引用
↓
[应用样式模板]
├─ 加载宝蓝色CSS
├─ 生成HTML结构
└─ 添加行内样式
↓
[优化与检查]
├─ 段落长度优化
├─ 格式一致性检查
└─ 生成优化建议
↓
[输出文件]
├─ 保存HTML到outputs/
├─ 生成使用说明
└─ 提供下载链接
相关工具调用
需要使用的第三层文件: 电影aiyifan
../styles/sapphire-blue.css- 宝蓝色样式表../scripts/content_analyzer.py- 内容分析脚本../scripts/html_generator.py- HTML生成器../templates/wechat_base.html- 基础HTML模板
第三层:附加资源文件
/mnt/skills/user/wechat-formatter/
│
├── SKILL.md # 第二层主文档
│
├── styles/ # 样式库
│ ├── sapphire-blue.css # 宝蓝色主题(主推)
│ ├── business-gray.css # 商务灰色主题
│ ├── warm-orange.css # 温暖橙色主题
│ └── fresh-green.css # 清新绿色主题
│
├── scripts/ # 处理脚本
│ ├── content_analyzer.py # 内容结构分析
│ ├── html_generator.py # HTML生成器
│ ├── pdf_extractor.py # PDF文字提取
│ └── image_placeholder.py # 图片占位符生成
│
├── templates/ # HTML模板
│ ├── wechat_base.html # 基础模板
│ ├── with_cover.html # 带封面模板
│ └── minimal.html # 极简模板
│
└── examples/ # 示例文件
├── sample_input.txt # 输入示例
├── sample_output.html # 输出示例
└── preview.png # 效果预览图
核心文件示例
sapphire-blue.css(完整版)
/* ===== 宝蓝色主题样式 ===== */
/* 全局设置 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
background: #FFFFFF;
color: #333333;
padding: 20px 15px;
}
/* 文章容器 */
.wechat-article {
max-width: 677px;
margin: 0 auto;
}
/* 主标题 */
.main-title {
font-size: 22px;
font-weight: 700;
color: #0D47A1; /* 深蓝色 */
text-align: center;
line-height: 1.4;
padding: 20px 0 15px;
margin-bottom: 15px;
border-bottom: 3px solid #1E88E5; /* 宝蓝色底线 */
}
/* 副标题/引言 */
.subtitle {
font-size: 15px;
color: #666666;
text-align: center;
font-style: italic;
line-height: 1.6;
padding: 12px 20px;
margin: 0 auto 25px;
max-width: 90%;
background: linear-gradient(135deg, #E3F2FD 0%, #BBDEFB 100%); /* 浅蓝渐变 */
border-left: 4px solid #1E88E5;
border-radius: 0 4px 4px 0;
}
/* 章节标题 */
.section-heading {
font-size: 18px;
font-weight: 600;
color: #1E88E5; /* 宝蓝色 */
line-height: 1.5;
padding: 15px 0 10px 15px;
margin: 30px 0 15px;
border-left: 5px solid #1E88E5;
background: linear-gradient(to right, #E3F2FD 0%, transparent 100%);
}
/* 正文段落 */
.paragraph {
font-size: 16px;
line-height: 1.8;
color: #333333;
text-align: justify;
margin: 15px 0;
padding: 0 10px;
letter-spacing: 0.5px;
}
/* 强调文字 */
.highlight {
color: #1E88E5; /* 宝蓝色 */
font-weight: 600;
}
strong {
color: #0D47A1; /* 深蓝色 */
font-weight: 600;
}
/* 列表项 */
.list-item {
font-size: 15px;
line-height: 1.7;
color: #333333;
padding: 8px 0 8px 30px;
margin: 5px 0;
position: relative;
}
.list-item::before {
content: "●";
color: #1E88E5; /* 宝蓝色圆点 */
font-weight: bold;
font-size: 12px;
position: absolute;
left: 12px;
top: 10px;
}
/* 引用框 */
.quote-box {
background: #E3F2FD; /* 浅蓝背景 */
border-left: 4px solid #1E88E5;
padding: 15px 20px;
margin: 20px 0;
font-style: italic;
color: #555555;
line-height: 1.7;
border-radius: 0 6px 6px 0;
}
.quote-box::before {
content: """;
font-size: 32px;
color: #1E88E5;
line-height: 1;
margin-right: 8px;
}
/* 代码块 */
.code-block {
background: #F5F5F5;
border: 1px solid #BBDEFB;
border-left: 4px solid #1E88E5;
border-radius: 4px;
padding: 15px;
font-family: 'Monaco', 'Menlo', 'Consolas', 'Courier New', monospace;
font-size: 14px;
line-height: 1.6;
overflow-x: auto;
margin: 15px 0;
color: #333333;
}
/* 行内代码 */
code {
background: #F0F0F0;
color: #1E88E5;
padding: 2px 6px;
border-radius: 3px;
font-family: 'Monaco', 'Menlo', 'Consolas', 'Courier New', monospace;
font-size: 14px;
}
/* 分隔线 */
.divider {
height: 2px;
background: linear-gradient(to right, transparent 0%, #1E88E5 50%, transparent 100%);
margin: 25px 0;
opacity: 0.5;
}
/* 图片占位符 */
.image-placeholder {
background: #E3F2FD;
border: 2px dashed #BBDEFB;
padding: 40px 20px;
text-align: center;
color: #1E88E5;
font-size: 14px;
margin: 20px 0;
border-radius: 4px;
}
/* 链接样式 */
a {
color: #1E88E5;
text-decoration: none;
border-bottom: 1px solid #BBDEFB;
transition: all 0.3s ease;
}
a:hover {
color: #0D47A1;
border-bottom-color: #1E88E5;
}
/* 页脚署名(可选) */
.footer {
text-align: center;
font-size: 13px;
color: #999999;
padding-top: 30px;
margin-top: 30px;
border-top: 1px solid #E0E0E0;
}
/* 响应式优化 */
@media (max-width: 677px) {
.main-title {
font-size: 20px;
}
.section-heading {
font-size: 17px;
}
.paragraph {
font-size: 15px;
}
}
html_generator.py(核心脚本)
#!/usr/bin/env python3
"""
微信公众号格式生成器
"""
import re
from pathlib import Path
class WechatFormatter:
def __init__(self, style='sapphire-blue'):
self.style = style
self.css = self.load_css()
def load_css(self):
"""加载CSS样式"""
css_file = Path(__file__).parent.parent / 'styles' / f'{self.style}.css'
with open(css_file, 'r', encoding='utf-8') as f:
return f.read()
def analyze_structure(self, content):
"""分析文章结构"""
lines = [l.strip() for l in content.split('\n') if l.strip()]
structure = {
'title': None,
'subtitle': None,
'sections': []
}
# 第一行作为标题
if lines:
structure['title'] = lines[0].strip('#').strip()
# 如果第二行很短,作为副标题
if len(lines) > 1 and len(lines[1]) < 80 and not lines[1].startswith('#'):
structure['subtitle'] = lines[1]
start_idx = 2
else:
start_idx = 1
# 解析章节
current_section = None
for line in lines[start_idx:]:
if line.startswith('##'):
# 新章节
if current_section:
structure['sections'].append(current_section)
current_section = {
'heading': line.strip('#').strip(),
'content': []
}
elif line.startswith('#'):
# 也是标题
if current_section:
structure['sections'].append(current_section)
current_section = {
'heading': line.strip('#').strip(),
'content': []
}
else:
# 内容
if not current_section:
# 没有章节标题的情况,创建一个默认章节
current_section = {
'heading': None,
'content': []
}
current_section['content'].append(line)
# 添加最后一个章节
if current_section:
structure['sections'].append(current_section)
return structure
def format_inline(self, text):
"""处理行内格式"""
# **加粗**
text = re.sub(r'\*\*(.+?)\*\*', r'<strong class="highlight">\1</strong>', text)
# *斜体* (公众号不支持,用下划线代替)
text = re.sub(r'\*(.+?)\*', r'<u>\1</u>', text)
# `代码`
text = re.sub(r'`(.+?)`', r'<code>\1</code>', text)
return text
def render_paragraph(self, text):
"""渲染段落"""
# 列表项
if text.startswith('-') or text.startswith('•') or re.match(r'^\d+\.', text):
text = re.sub(r'^[-•\d.]+\s*', '', text)
return f'<div class="list-item">{self.format_inline(text)}</div>'
# 引用
elif text.startswith('>'):
text = text.lstrip('>').strip()
return f'<div class="quote-box">{self.format_inline(text)}</div>'
# 普通段落
else:
return f'<p class="paragraph">{self.format_inline(text)}</p>'
def generate_html(self, structure):
"""生成HTML"""
html_parts = []
# 主标题
if structure['title']:
html_parts.append(f'<h1 class="main-title">{structure["title"]}</h1>')
# 副标题
if structure['subtitle']:
html_parts.append(f'<div class="subtitle">{structure["subtitle"]}</div>')
# 章节
for section in structure['sections']:
if section['heading']:
html_parts.append(f'<h2 class="section-heading">{section["heading"]}</h2>')
for para in section['content']:
html_parts.append(self.render_paragraph(para))
# 章节分隔线
html_parts.append('<div class="divider"></div>')
# 组装完整HTML
html = f'''<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{structure['title'] or '微信公众号文章'}</title>
<style>
{self.css}
</style>
</head>
<body>
<section class="wechat-article">
{''.join(html_parts)}
</section>
</body>
</html>'''
return html
def format_file(self, input_path, output_path):
"""格式化文件"""
# 读取内容
with open(input_path, 'r', encoding='utf-8') as f:
content = f.read()
# 分析结构
structure = self.analyze_structure(content)
# 生成HTML
html = self.generate_html(structure)
# 保存
with open(output_path, 'w', encoding='utf-8') as f:
f.write(html)
return structure
# 命令行使用
if __name__ == '__main__':
import sys
if len(sys.argv) < 2:
print("用法: python html_generator.py input_file [output_file]")
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2] if len(sys.argv) > 2 else 'formatted_article.html'
formatter = WechatFormatter('sapphire-blue')
structure = formatter.format_file(input_file, output_file)
print(f"✅ 格式化完成!")
print(f"📄 标题: {structure['title']}")
print(f"📊 章节数: {len(structure['sections'])}")
print(f"💾 输出: {output_file}")💡 实际使用流程
完整对话示例:
用户: [上传 my_article.txt]
帮我排版成公众号格式,用宝蓝色主题
AI:
[调用 view 工具读取 skill]
[读取上传的文件]
[分析文章结构]
[生成格式化HTML]
[保存到 outputs 目录]
✅ 已完成排版!
📄 文章信息:
- 标题:《提升工作效率的5个方法》
- 结构:5个章节,18段内容
- 主题:宝蓝色专业风格
🎨 样式特点:
- 主色:宝蓝色 #1E88E5
- 清晰的层次结构
- 适配手机阅读
📥 下载文件:formatted_article.html
📋 使用步骤:
1. 用浏览器打开下载的 HTML 文件
2. 全选内容(Ctrl+A 或 Cmd+A)
3. 复制(Ctrl+C 或 Cmd+C)
4. 打开微信公众号编辑器
5. 粘贴(Ctrl+V 或 Cmd+V)
6. 检查效果,微调后发布
💡 优化建议:
- 第3段内容较长,已自动优化段落间距
- 检测到多个要点,已转换为列表格式
- 建议在第2、6、9段后插入配图
需要调整样式或重新生成吗?00目录 0