From html-presentation-beautifier
Convert HTML slide templates to JSON+HTML format. Invoke when generating JSON data for beauty-normal command or converting existing HTML examples to JSON-driven templates.
npx claudepluginhub within-7/minto-plugin-tools --plugin html-presentation-beautifierThis skill uses the workspace's default tool permissions.
将HTML幻灯片示例文件转换为JSON+HTML格式,实现数据与展示分离。
Conducts multi-round deep research on GitHub repos via API and web searches, generating markdown reports with executive summaries, timelines, metrics, and Mermaid diagrams.
Dynamically discovers and combines enabled skills into cohesive, unexpected delightful experiences like interactive HTML or themed artifacts. Activates on 'surprise me', inspiration, or boredom cues.
Generates images from structured JSON prompts via Python script execution. Supports reference images and aspect ratios for characters, scenes, products, visuals.
将HTML幻灯片示例文件转换为JSON+HTML格式,实现数据与展示分离。
主要任务:
beauty-html/assets/ 目录)适用场景:
beauty-normal 命令生成JSON数据{
"presentation": {
"meta": {
"title": "演示文稿标题",
"subtitle": "副标题",
"author": "作者",
"date": "日期"
},
"slides": [
{
"id": 1,
"type": "cover|toc|section|content|end",
"template": "01-cover-page|02-two-column|03-three-column|05-chart-text|...",
"title": "幻灯片标题",
"content": { ... }
}
]
}
}
{
"id": 1,
"type": "cover",
"template": "01-cover-page",
"title": "封面页",
"content": {
"mainTitle": "跨境垂直平台战略报告",
"subtitle": "平台模式 vs 个人IP模式深度分析",
"meta": {
"date": "2026年1月",
"author": "战略分析团队"
}
}
}
{
"id": 2,
"type": "content",
"template": "02-two-column-comparison",
"title": "平台模式 vs 个人IP模式",
"content": {
"leftColumn": {
"title": "平台模式",
"items": [
"可复制性强,易于规模化",
"网络效应明显,壁垒高",
"生态闭环,数据价值高",
"资本吸引力强,估值高",
"运营复杂度高,投入大",
"冷启动困难,需要临界规模"
],
"highlight": "适合:有资本、有资源、追求规模"
},
"rightColumn": {
"title": "个人IP模式",
"items": [
"启动快,成本低",
"个人影响力强,粘性高",
"灵活性强,转型容易",
"现金流稳定,风险低",
"规模化困难,天花板低",
"个人依赖强,不易复制"
],
"highlight": "适合:个人创业者、内容创作者"
}
}
}
{
"id": 3,
"type": "content",
"template": "03-three-column",
"title": "三大核心策略",
"content": {
"columns": [
{
"title": "策略一",
"items": ["要点1", "要点2", "要点3"],
"icon": "📊"
},
{
"title": "策略二",
"items": ["要点1", "要点2", "要点3"],
"icon": "🎯"
},
{
"title": "策略三",
"items": ["要点1", "要点2", "要点3"],
"icon": "💡"
}
]
}
}
{
"id": 4,
"type": "content",
"template": "05-chart-text",
"title": "六大平台收入增长对比",
"content": {
"chart": {
"type": "bar",
"title": "2024年收入对比",
"data": {
"labels": ["GrowthBi", "Finder", "Foundy", "Clarity", "Panda", "Omega"],
"datasets": [{
"label": "年收入(百万美元)",
"data": [120, 95, 88, 45, 35, 28],
"backgroundColor": [
"rgba(248, 93, 66, 0.8)",
"rgba(85, 110, 230, 0.8)",
"rgba(80, 165, 241, 0.8)",
"rgba(52, 195, 143, 0.8)",
"rgba(241, 180, 76, 0.8)",
"rgba(116, 120, 141, 0.8)"
]
}]
},
"options": {
"responsive": true,
"maintainAspectRatio": false
}
},
"insights": [
"GrowthBi引领增长,年增长率达120%",
"Finder和Foundy保持稳健增长(80-90%)",
"传统平台增长乏力,增速低于50%",
"会员订阅模式是增长核心驱动力",
"高客单价服务贡献主要利润"
],
"highlight": "启示:会员订阅(稳定现金流)+ 高客单价服务(利润来源)是最佳商业模式"
}
}
{
"id": 5,
"type": "toc",
"template": "08-table-of-contents",
"title": "目录",
"content": {
"items": [
{ "number": "01", "title": "市场分析", "page": 3 },
{ "number": "02", "title": "竞争格局", "page": 8 },
{ "number": "03", "title": "战略建议", "page": 15 },
{ "number": "04", "title": "实施路径", "page": 22 }
]
}
}
{
"id": 6,
"type": "section",
"template": "11-chapter-overview",
"title": "第一章 市场分析",
"content": {
"subtitle": "市场规模与增长趋势",
"description": "深入分析当前市场状况,识别关键增长机会"
}
}
{
"id": 7,
"type": "content",
"template": "06-data-emphasis",
"title": "关键数据",
"content": {
"metrics": [
{
"value": "120%",
"label": "年增长率",
"description": "市场高速增长"
},
{
"value": "$5.2B",
"label": "市场规模",
"description": "2024年市场规模"
},
{
"value": "85%",
"label": "市场份额",
"description": "头部企业占比"
}
]
}
}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>McKinsey风格演示文稿</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
<style>
/* CSS样式 - McKinsey规范 */
</style>
</head>
<body>
<div id="presentation-container"></div>
<script>
// JSON数据
const presentationData = {
"presentation": {
"meta": { ... },
"slides": [ ... ]
}
};
// 渲染函数
function renderPresentation(data) {
const container = document.getElementById('presentation-container');
// 渲染逻辑
}
// 初始化
document.addEventListener('DOMContentLoaded', function() {
renderPresentation(presentationData);
});
</script>
</body>
</html>
function renderCoverPage(content) {
return `
<div class="slide cover-page">
<div class="cover-content">
<h1>${content.mainTitle}</h1>
<div class="divider"></div>
<p class="subtitle">${content.subtitle}</p>
<div class="meta-info">
<p>报告日期:${content.meta.date}</p>
<p>作者:${content.meta.author}</p>
</div>
</div>
</div>
`;
}
function renderTwoColumnPage(content) {
return `
<div class="slide two-column-page">
<div class="slide-header">
<h2>${content.title}</h2>
</div>
<div class="comparison-container">
<div class="column left">
<div class="column-header">${content.leftColumn.title}</div>
<ul class="column-content">
${content.leftColumn.items.map(item => `<li>${item}</li>`).join('')}
</ul>
<div class="highlight-box">
💡 ${content.leftColumn.highlight}
</div>
</div>
<div class="column right">
<div class="column-header">${content.rightColumn.title}</div>
<ul class="column-content">
${content.rightColumn.items.map(item => `<li>${item}</li>`).join('')}
</ul>
<div class="highlight-box">
💡 ${content.rightColumn.highlight}
</div>
</div>
</div>
</div>
`;
}
function renderChartTextPage(content, slideId) {
const canvasId = `chart-${slideId}`;
return `
<div class="slide chart-text-page">
<div class="slide-header">
<h2>${content.title}</h2>
</div>
<div class="chart-text-container">
<div class="chart-section">
<div class="chart-container">
<canvas id="${canvasId}"></canvas>
</div>
</div>
<div class="text-section">
<div class="insight-title">关键洞察</div>
<ul class="insight-list">
${content.insights.map(insight => `<li>${insight}</li>`).join('')}
</ul>
<div class="highlight-box">
<p>💡 ${content.highlight}</p>
</div>
</div>
</div>
</div>
`;
}
function readHTMLTemplate(templateName) {
const templatePath = `beauty-html/assets/${templateName}.html`;
// 读取HTML文件内容
}
提取规则:
数据提取规则:
整合规则:
| 模板文件 | 模板类型 | JSON结构 |
|---|---|---|
| 01-cover-page.html | 封面页 | cover |
| 02-two-column-comparison.html | 双列对比 | two-column |
| 03-three-column.html | 三列布局 | three-column |
| 04-card-grid.html | 卡片网格 | card-grid |
| 05-chart-text.html | 图表+文本 | chart-text |
| 06-data-emphasis.html | 数据强调 | data-emphasis |
| 08-table-of-contents.html | 目录页 | toc |
| 11-chapter-overview.html | 章节首页 | section |
| 12-traffic-analysis.html | 流量分析 | chart-text |
| 13-user-positioning.html | 用户定位 | chart-text |
| 14-user-demand-rating.html | 用户需求评分 | chart-text |
输入HTML:01-cover-page.html
输出JSON:
{
"presentation": {
"slides": [{
"id": 1,
"type": "cover",
"template": "01-cover-page",
"title": "封面页",
"content": {
"mainTitle": "跨境垂直平台战略报告",
"subtitle": "平台模式 vs 个人IP模式深度分析",
"meta": {
"date": "2026年1月",
"author": "战略分析团队"
}
}
}]
}
}
输出HTML框架:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>McKinsey风格演示文稿</title>
<style>
/* 完整的CSS样式(从原HTML提取) */
</style>
</head>
<body>
<div id="presentation-container"></div>
<script>
const presentationData = { /* JSON数据 */ };
function renderCoverPage(content) {
return `
<div class="slide cover-page">
<div class="cover-content">
<h1>${content.mainTitle}</h1>
<div class="divider"></div>
<p class="subtitle">${content.subtitle}</p>
<div class="meta-info">
<p>报告日期:${content.meta.date}</p>
<p>作者:${content.meta.author}</p>
</div>
</div>
</div>
`;
}
function renderPresentation(data) {
const container = document.getElementById('presentation-container');
data.presentation.slides.forEach(slide => {
if (slide.type === 'cover') {
container.innerHTML += renderCoverPage(slide.content);
}
});
}
document.addEventListener('DOMContentLoaded', function() {
renderPresentation(presentationData);
});
</script>
</body>
</html>
输入HTML:05-chart-text.html
输出JSON:
{
"presentation": {
"slides": [{
"id": 4,
"type": "content",
"template": "05-chart-text",
"title": "六大平台收入增长对比",
"content": {
"chart": {
"type": "bar",
"title": "2024年收入对比",
"data": {
"labels": ["GrowthBi", "Finder", "Foundy", "Clarity", "Panda", "Omega"],
"datasets": [{
"label": "年收入(百万美元)",
"data": [120, 95, 88, 45, 35, 28],
"backgroundColor": [
"rgba(248, 93, 66, 0.8)",
"rgba(85, 110, 230, 0.8)",
"rgba(80, 165, 241, 0.8)",
"rgba(52, 195, 143, 0.8)",
"rgba(241, 180, 76, 0.8)",
"rgba(116, 120, 141, 0.8)"
]
}]
},
"options": {
"responsive": true,
"maintainAspectRatio": false
}
},
"insights": [
"GrowthBi引领增长,年增长率达120%",
"Finder和Foundy保持稳健增长(80-90%)",
"传统平台增长乏力,增速低于50%",
"会员订阅模式是增长核心驱动力",
"高客单价服务贡献主要利润"
],
"highlight": "启示:会员订阅(稳定现金流)+ 高客单价服务(利润来源)是最佳商业模式"
}
}]
}
}
🔑 最核心规则(必须严格遵守):如果数据内容过大,或者token过长,则自动使用'继续'进行'分段'加载数据,绝对不能精简、偷工减料的节省token,严禁为了省token而跳过内容或使用摘要
当遇到 token 限制或上下文长度问题时,必须使用"继续"分页方式,绝对禁止:
正确处理方式:使用"继续"机制
1. 在完成当前可执行的部分后
2. 明确说明:"由于 token 限制,任务未完成,请输入'继续'以获取剩余部分"
3. 等待用户输入"继续"后
4. 继续执行剩余步骤
5. 重复直到任务完全完成
分段加载原则:
关键规则:
responsive: truemaintainAspectRatio: falsewidth: 100% !important开始
↓
步骤1:读取HTML示例文件
├─ 从beauty-html/assets/读取HTML文件
├─ 解析HTML结构
└─ 提取CSS和JavaScript框架
↓
步骤2:提取HTML框架
├─ 保留HTML结构
├─ 保留CSS样式
├─ 保留JavaScript框架
└─ 移除具体内容数据
↓
步骤3:生成JSON数据
├─ 提取所有文本内容
├─ 识别数据结构
├─ 组织JSON数据
└─ 验证数据完整性
↓
步骤4:创建JSON驱动的HTML
├─ 整合HTML框架
├─ 嵌入JSON数据
├─ 实现渲染函数
└─ 验证渲染效果
↓
完成!输出JSON数据和HTML文件
[模板名称]_data.json[模板名称]_template.html[模板名称]_complete.html当以下所有条件都满足时,转换成功:
数据完整性:
代码完整性:
功能验证:
设计规范: