Files
Fu-Jie_openwebui-extensions/plugins/actions/infographic/test_infographic.html

688 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AntV Infographic Debug Test</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f5f5f5;
}
.container {
max-width: 1000px;
margin: 0 auto;
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.infographic-render-container {
height: 800px;
border: 1px dashed #ccc;
border-radius: 4px;
margin-top: 20px;
overflow: auto;
}
h1 {
margin-top: 0;
}
.status {
margin-top: 10px;
padding: 10px;
background: #e0f2fe;
border-radius: 4px;
font-family: monospace;
white-space: pre-wrap;
/* 保留换行符 */
}
</style>
</head>
<body>
<div class="container">
<h1>AntV Infographic 综合测试台</h1>
<div class="controls">
<label>选择测试用例:</label>
<select id="case-selector">
<option value="case-list-basic">Case A: List Basic (Standard)</option>
<option value="case-tree-vertical">Case B: Tree Vertical (Hierarchy)</option>
<option value="case-theme-extended">Case C: Theme Extended (Bg/Text Color)</option>
<option value="case-tree-horizontal">Case D: Tree Horizontal</option>
<option value="case-list-children">Case E: List with Children</option>
<option value="case-tree-indented">Case F: Indented Tree</option>
<option value="case-mindmap">Case G: Mindmap</option>
<option value="case-l">Case L: List Grid (MiniMax)</option>
<option value="case-list-vertical">Case H: List Vertical</option>
<option value="case-statistic-card">Case I: Statistic Card</option>
<option value="case-k">Case K: 柠檬霜 Controversy (Roadmap)</option>
<option value="case-l">Case L: List Grid (MiniMax)</option>
<option value="case-llm-list-grid">LLM: List Grid (Features)</option>
<option value="case-llm-tree-vertical">LLM: Tree Vertical (Hierarchy)</option>
<option value="case-llm-statistic-card">LLM: Statistic Card (Metrics)</option>
<option value="case-llm-mindmap">LLM: Mindmap (Brainstorming)</option>
<option value="case-chart-bar">Case M: Chart Bar</option>
<option value="case-compare-swot">Case N: Comparison SWOT</option>
<option value="case-relation-sankey">Case O: Relationship Sankey</option>
<option value="case-quadrant-quarter">Case P: Quadrant Analysis</option>
</select>
<button onclick="runTest()">运行测试</button>
</div>
<div class="status" id="status-log">准备就绪...</div>
<div id="infographic-container-test" class="infographic-render-container"></div>
</div>
<!-- Case A: 基础列表 -->
<script type="text/template" id="case-list-basic">
infographic list-row-simple-horizontal-arrow
data
title 基础列表测试
items
- label 步骤一
icon ref:search:one
- label 步骤二
icon ref:search:two
theme
colorPrimary #3b82f6
palette #3b82f6 #8b5cf6
</script>
<!-- Case B: 垂直树 (尝试添加 ID) -->
<script type="text/template" id="case-tree-vertical">
infographic tree-vertical
data
title 垂直树测试
items
- label 根节点
id root
icon ref:search:root
children
- label 子节点 A
id child-a
- label 子节点 B
id child-b
theme
colorPrimary #10b981
palette #10b981 #34d399
</script>
<!-- Case C: 扩展主题 (测试清理逻辑) -->
<script type="text/template" id="case-theme-extended">
infographic list-row-simple-horizontal-arrow
data
title 扩展主题测试
items
- label 暗色模式
icon ref:search:moon
theme
colorPrimary #6366f1
palette #6366f1 #8b5cf6
backgroundColor #1e293b
textColor #f8fafc
roughness 0.5
</script>
<!-- Case D: 水平树 -->
<script type="text/template" id="case-tree-horizontal">
infographic tree-horizontal
data
title 水平树测试
items
- label 根节点
id root-h
children
- label 子节点 1
id child-1
- label 子节点 2
id child-2
theme
colorPrimary #f59e0b
</script>
<!-- Case E: 列表带子节点 (测试兼容性) -->
<script type="text/template" id="case-list-children">
infographic list-row-simple-horizontal-arrow
data
title 列表带子节点
items
- label 父项 1
children
- label 子项 1.1
- label 父项 2
theme
colorPrimary #ec4899
</script>
<!-- Case F: Indented Tree (缩进树) -->
<script type="text/template" id="case-tree-indented">
infographic tree-indented
data
title 缩进树测试
items
- label 根节点
id root-i
children
- label 子节点 1
id child-i-1
- label 子节点 2
id child-i-2
theme
colorPrimary #8b5cf6
</script>
<!-- Case G: Mindmap -->
<script type="text/template" id="case-mindmap">
infographic mindmap
data
title 脑图测试
items
- label 中心主题
children
- label 主题 A
children
- label 子主题 A1
- label 子主题 A2
- label 主题 B
theme
colorPrimary #06b6d4
</script>
<!-- Case H: List Vertical (垂直列表) -->
<script type="text/template" id="case-list-vertical">
infographic list-vertical
data
title 垂直列表测试
items
- label 第一项
desc 描述文本 1
icon ref:search:one
- label 第二项
desc 描述文本 2
icon ref:search:two
theme
colorPrimary #8b5cf6
</script>
<!-- Case I: Statistic Card (统计卡片) -->
<script type="text/template" id="case-statistic-card">
infographic statistic-card
data
title 核心指标
items
- label 总用户数
value 1,234
icon ref:search:users
- label 日活
value 89%
icon ref:search:activity
theme
colorPrimary #10b981
</script>
<!-- Case J: Official Tree Example -->
<script type="text/template" id="case-official-tree">
infographic hierarchy-tree-tech-style-capsule-item
data
title 官方树形示例
items
- label 根节点
icon ref:search:root
children
- label 子节点 A
icon ref:search:a
children
- label 叶子 A1
- label 叶子 A2
- label 子节点 B
icon ref:search:b
theme
colorPrimary #1677ff
</script>
<!-- Case K: User Fail Case (Lemon Frost) -->
<script type="text/template" id="case-user-fail">
infographic list-vertical
data
title 柠檬霜豹纹守宫美丽的诅咒
desc 揭露极端审美背后的遗传缺陷伦理代价与商业真相
items
- label 审美霸权与病态追求
desc 追求极致黄色而筛选出致癌基因让生命背负终身癌症风险是伦理上的霸权行为
icon mdi/eye-off-outline
- label 致命的基因多效性
desc 品系不同柠檬霜导致的是实体肿瘤溃烂致癌机制与颜色性状不可剥离
icon mdi/dna
- label 商业层面的误导欺诈
desc 所谓低肿瘤率改良版多为营销谎言只要表现出性状就注定携带致癌机制
icon mdi/alert-octagon
- label 科学研究与宠物价值
desc 其价值应仅限于作为黑色素瘤的医学研究模型而非在宠物交易市场中流通
icon mdi/microscope
- label 行动呼吁坚决拒绝
desc 拒绝购买与繁育将柠檬霜留在教科书中作为警示而非留在饲养箱中承受痛苦
icon mdi/cancel
theme
colorPrimary #FFD700
colorBg #1A1A1A
textColor #FFFFFF
palette #FFD700 #FF4D4F #E6E6E6
stylize rough
roughness 0.2
</script>
<!-- Case L: List Grid (MiniMax) -->
<script type="text/template" id="case-l">
list-grid
data
title MiniMax 2025 模型矩阵全解析
desc abab 7 为核心的国产顶尖大模型
items
- label 极致 MoE 架构优化
desc 国内首批 MoE 路线坚定者
icon mdi/cpu-64-bit
- label Video-01 视频生成
desc 杀手锏级多模态能力
icon mdi/movie-filter
- label 情感陪伴与角色扮演
desc 源自星野基因
icon mdi/emoticon-heart
- label 超长上下文与精准召回
desc 支持 128k+ 窗口
icon mdi/database-search
theme
colorPrimary #6366f1
colorBg #ffffff
textColor #1f2937
</script>
<!-- LLM Generated Cases for Verification -->
<script type="text/template" id="case-llm-list-grid">
infographic list-grid
data
title MiniMax 2025 模型矩阵全解析
desc 极致架构与多模态能力的全面进阶
items
- label 极致 MoE 架构优化
desc 国内首批 MoE 路线坚定者兼顾模型性能与推理效率
icon mdi/layers-triple
- label Video-01 视频生成
desc 杀手锏级多模态能力支持高品质视频内容创作
icon mdi/video-vintage
- label 情感陪伴与角色扮演
desc 源自星野基因提供深度的情感连接与人格化交互
icon mdi/robot-happy
- label 超长上下文与精准召回
desc 支持 128k+ 超长窗口实现海量信息的精准处理
icon mdi/file-find
theme
colorPrimary #0052D9
colorBg #F2F3F5
palette #0052D9 #2BA471 #E37318 #D54941
stylize flat
</script>
<script type="text/template" id="case-llm-tree-vertical">
infographic tree-vertical
data
title 公司组织架构
desc 2025年度企业内部编制示意图
items
- label 研发部
icon mdi/xml
children
- label 后端组
icon mdi/server
- label 前端组
icon mdi/language-javascript
- label 市场部
icon mdi/chart-bell-curve
children
- label 销售组
icon mdi/account-cash
- label 推广组
icon mdi/bullhorn
</script>
<script type="text/template" id="case-llm-statistic-card">
infographic statistic-card
data
title 2024年Q4 核心指标
desc 统计日期2024年第四季度
items
- label 总用户数
value 1,234,567
icon mdi/account-group
- label 日活跃用户
value 89%
icon mdi/chart-line
- label 营收增长
value +45%
icon mdi/trending-up
</script>
<script type="text/template" id="case-llm-mindmap">
infographic mindmap
data
title 人工智能应用领域
desc 核心应用场景分类与展示
items
- label 生成式 AI
icon mdi/brain
children
- label 文本生成
icon mdi/text-recognition
- label 图像生成
icon mdi/image-multiple
- label 视频生成
icon mdi/video-input-component
- label 预测性 AI
icon mdi/chart-line
children
- label 股市预测
icon mdi/finance
- label 天气预报
icon mdi/weather-partly-cloudy
- label 决策 AI
icon mdi/robot
children
- label 自动驾驶
icon mdi/car-autonomous
- label 游戏博弈
icon mdi/controller-classic
theme
colorPrimary #2F54EB
colorBg #FFFFFF
</script>
<!-- New Styles Test Cases -->
<script type="text/template" id="case-chart-bar">
infographic chart-bar
data
title 2023年季度营收分析
desc 单位亿元
items
- label 第一季度
value 12.5
- label 第二季度
value 15.8
- label 第三季度
value 14.2
- label 第四季度
value 18.9
</script>
<script type="text/template" id="case-relation-circle">
infographic relation-circle
data
title 生态循环
items
- label 生产者
- label 消费者
- label 分解者
</script>
<script type="text/template" id="case-compare-swot">
infographic compare-swot
data
title 某初创咖啡品牌 SWOT 分析
items
- label 优势
children
- label 产品口味独特
- label 选址精准
- label 劣势
children
- label 品牌知名度低
- label 资金压力大
- label 机会
children
- label 线上外卖市场增长
- label 年轻人对精品咖啡需求增加
- label 威胁
children
- label 行业巨头价格战
- label 原材料成本上涨
</script>
<script type="text/template" id="case-relation-sankey">
infographic relation-sankey
data
title 家庭月度开支流向
desc 2025年12月家庭总收入 10000 元分配明细
items
- label 总收入
value 10000
children
- label 房贷
value 4000
- label 日常消费
value 3000
children
- label 餐饮
value 2000
- label 交通
value 1000
- label 教育培训
value 2000
- label 存入银行
value 1000
</script>
<script type="text/template" id="case-quadrant-quarter">
infographic quadrant-quarter
data
title 个人任务象限分析
desc 2025年12月28日 任务优先级管理
items
- label 修复线上紧急 Bug
desc 紧急且重要立即优先处理
illus mdi/bug
- label 准备下午的客户会议
desc 紧急且重要核心商务产出
illus mdi/account-group
- label 制定年度学习计划
desc 重要不紧急长期价值积累
illus mdi/calendar-check
- label 健身锻炼
desc 重要不紧急身体健康投资
illus mdi/dumbbell
- label 回复琐碎的邮件
desc 紧急不重要低价值干扰
illus mdi/email-outline
- label 接听推销电话
desc 紧急不重要时间黑洞
illus mdi/phone-cancel
- label 刷社交媒体
desc 不紧急不重要消遣娱乐
illus mdi/instagram
- label 看无聊的综艺
desc 不紧急不重要无谓消耗
illus mdi/television-classic
</script>
<script type="text/template" id="case-compare-binary">
infographic compare-binary
data
title IDE vs Open WebUI
desc 核心差异对比
items
- label IDE
desc 代码工程中心
children
- label 深度上下文
- label 实时补全
- label Open WebUI
desc 对话交互中心
children
- label 模型管理
- label 知识库 RAG
</script>
<script src="https://unpkg.com/@antv/infographic@latest/dist/infographic.min.js"></script>
<script>
function log(msg) {
console.log(msg);
const el = document.getElementById('status-log');
el.textContent += '\n' + msg;
}
function logError(err) {
console.error('Detailed Error:', err);
let msg = `❌ 内部错误: ${err.message}`;
if (err.stack) msg += `\nStack: ${err.stack}`;
for (const key in err) {
if (key !== 'message' && key !== 'stack') {
msg += `\n${key}: ${JSON.stringify(err[key])}`;
}
}
log(msg);
}
function clearLog() {
document.getElementById('status-log').textContent = '准备就绪...';
}
window.listTemplates = () => {
clearLog();
log('[Explore] 正在获取模版列表...');
if (typeof AntVInfographic !== 'undefined') {
if (typeof AntVInfographic.getTemplates === 'function') {
const templates = AntVInfographic.getTemplates();
log(`[Explore] getTemplates() result (${templates.length}):\n${JSON.stringify(templates, null, 2)}`);
console.log(templates);
} else {
log('❌ AntVInfographic.getTemplates is not a function.');
log('Available keys: ' + Object.keys(AntVInfographic).join(', '));
}
} else {
log('❌ AntVInfographic is undefined.');
}
};
window.runTest = () => {
clearLog();
const selector = document.getElementById('case-selector');
const caseId = selector.value;
const sourceEl = document.getElementById(caseId);
const containerEl = document.getElementById('infographic-container-test');
if (!sourceEl) return log('❌ 未找到测试用例');
// 重置容器
containerEl.innerHTML = '';
containerEl.style = '';
let syntaxContent = sourceEl.textContent.trim();
log(`[Test] 运行用例: ${caseId} (${selector.options[selector.selectedIndex].text})`);
log(`[Step 1] 原始内容:\n${syntaxContent}`);
// --- 模拟插件的清理逻辑 ---
const bgMatch = syntaxContent.match(/backgroundColor\s+(#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|[a-zA-Z]+)/);
if (bgMatch && bgMatch[1]) {
containerEl.style.backgroundColor = bgMatch[1];
}
const textMatch = syntaxContent.match(/textColor\s+(#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}|[a-zA-Z]+)/);
if (textMatch && textMatch[1]) {
containerEl.style.color = textMatch[1];
}
// 使用更强的正则:匹配 stylize 及其后续缩进的行
const nl = String.fromCharCode(10);
const cleanRegex = new RegExp('^\\s*(roughness|stylize|backgroundColor|textColor|colorBg).*(' + nl + '\\s+.*)*', 'gm');
if (cleanRegex.test(syntaxContent)) {
log('[Fix] 移除扩展 Theme 属性...');
syntaxContent = syntaxContent.replace(cleanRegex, '');
}
// 2. 模板映射配置
const TEMPLATE_MAPPING = {
// 列表与层级
'list-grid': 'list-grid-compact-card',
'list-vertical': 'list-column-simple-vertical-arrow',
'tree-vertical': 'hierarchy-tree-tech-style-capsule-item',
'tree-horizontal': 'hierarchy-tree-lr-tech-style-capsule-item',
'mindmap': 'hierarchy-mindmap-branch-gradient-capsule-item',
// 顺序与关系
'sequence-roadmap': 'sequence-roadmap-vertical-simple',
'sequence-zigzag': 'sequence-horizontal-zigzag-simple',
'sequence-horizontal': 'sequence-horizontal-zigzag-simple',
'relation-sankey': 'relation-sankey-simple', // 暂无直接对应,保留原值或需移除
'relation-circle': 'relation-circle-icon-badge',
// 对比与分析
'compare-binary': 'compare-binary-horizontal-simple-vs',
'compare-swot': 'compare-swot',
'compare-table': 'compare-table-simple', // 暂无直接对应
'quadrant-quarter': 'quadrant-quarter-simple-card',
// 图表与数据
'statistic-card': 'list-grid-compact-card',
'chart-bar': 'chart-bar-plain-text',
'chart-column': 'chart-column-simple',
'chart-line': 'chart-line-plain-text',
'chart-area': 'chart-area-simple', // 暂无直接对应
'chart-pie': 'chart-pie-plain-text',
'chart-doughnut': 'chart-pie-donut-plain-text'
};
// 3. 应用映射策略
for (const [key, value] of Object.entries(TEMPLATE_MAPPING)) {
const regex = new RegExp(`infographic\\s+${key}(?=\\s|$)`, 'i');
if (regex.test(syntaxContent)) {
log(`[Fix] 自动映射模板: ${key} -> ${value}`);
syntaxContent = syntaxContent.replace(regex, `infographic ${value}`);
break; // 找到一个匹配后即停止
}
}
// 兜底检查:确保以 infographic 开头
if (!syntaxContent.trim().toLowerCase().startsWith('infographic')) {
const firstWord = syntaxContent.trim().split(/\s+/)[0].toLowerCase();
if (!['data', 'theme', 'design', 'items'].includes(firstWord)) {
log('[Fix] 检测到缺失 infographic 前缀,自动补全');
syntaxContent = 'infographic ' + syntaxContent;
}
}
syntaxContent = syntaxContent.trim();
log(`[Step 2] 清理后内容:\n${syntaxContent}`);
try {
const { Infographic } = AntVInfographic;
const instance = new Infographic({
container: '#infographic-container-test',
padding: 24,
});
instance.on('error', (err) => {
logError(err);
});
instance.render(syntaxContent);
if (instance.node) {
log('✅ 渲染成功 (instance.node 存在)');
if (!containerEl.querySelector('svg')) {
log('⚠️ 自动挂载失败,手动挂载...');
containerEl.appendChild(instance.node);
}
} else {
log('❌ 渲染失败 (instance.node 为空)');
}
} catch (e) {
logError(e);
}
};
</script>
</body>
</html>