tui.editor热力图插件开发:直观展示数据分布
热力图是一种通过颜色变化来直观展示数据密度和分布的可视化方式,在数据分析、用户行为展示等场景中应用广泛。本文将详细介绍如何为tui.editor开发热力图插件,帮助用户在富文本编辑环境中轻松插入和展示热力图数据。
插件开发环境准备
开发tui.editor插件需要遵循项目的模块化结构。参考现有插件如图表插件的目录组织,热力图插件的基础目录结构应包含以下部分:
plugins/heatmap/
├── src/ # 源代码目录
│ ├── index.ts # 插件入口文件
│ ├── heatmap.ts # 热力图核心逻辑
│ └── utils/ # 工具函数
├── demo/ # 示例页面
│ └── editor.html # 插件演示页面
├── types/ # TypeScript类型定义
├── package.json # 插件配置
└── webpack.config.js # 构建配置
首先需要创建插件的package.json文件,定义插件名称、版本和依赖。关键配置如下:
{
"name": "@toast-ui/editor-plugin-heatmap",
"version": "1.0.0",
"main": "dist/toastui-editor-plugin-heatmap.js",
"dependencies": {
"heatmap.js": "^2.0.5" // 使用heatmap.js作为可视化库
}
}
核心功能实现
热力图插件的核心功能包括数据解析、热力图渲染和编辑器集成三个部分。我们将参考图表插件的实现方式,开发适用于热力图的解析器和渲染器。
数据解析模块
热力图插件需要支持CSV格式数据输入,格式如下:
x,y,value
10,20,0.5
30,40,0.8
50,60,0.3
创建src/utils/parser.ts文件,实现CSV数据解析功能:
export function parseCSV(text: string) {
const lines = text.trim().split('\n');
const headers = lines[0].split(',').map(h => h.trim());
return lines.slice(1).map(line => {
const values = line.split(',').map(v => parseFloat(v.trim()));
return headers.reduce((obj, key, index) => {
obj[key] = values[index];
return obj;
}, {});
});
}
热力图渲染逻辑
在src/heatmap.ts中实现热力图渲染功能,使用heatmap.js库:
import heatmap from 'heatmap.js';
export function renderHeatmap(container: HTMLElement, data: any[]) {
const points = data.map(item => ({
x: item.x,
y: item.y,
value: item.value
}));
return heatmap.create({
container,
radius: 20,
maxOpacity: 0.8,
minOpacity: 0,
blur: 0.75
}).setData({
max: Math.max(...points.map(p => p.value)),
data: points
});
}
编辑器集成
创建src/index.ts作为插件入口,实现tui.editor插件接口:
import type { PluginInfo, MdNode } from '@toast-ui/editor';
import { parseCSV } from './utils/parser';
import { renderHeatmap } from './heatmap';
export default function heatmapPlugin(): PluginInfo {
return {
toHTMLRenderers: {
heatmap(node: MdNode) {
const id = `heatmap-${Date.now()}`;
setTimeout(() => {
const container = document.querySelector(`[data-heatmap-id="${id}"]`);
if (container) {
const data = parseCSV(node.literal || '');
renderHeatmap(container, data);
}
}, 0);
return [
{
type: 'openTag',
tagName: 'div',
attributes: { 'data-heatmap-id': id, style: 'width:100%;height:400px;' }
},
{ type: 'closeTag', tagName: 'div' }
];
}
}
};
}
插件样式与交互优化
为热力图添加自定义样式,创建src/css/heatmap.css文件:
.heatmap-container {
position: relative;
width: 100%;
height: 400px;
margin: 1rem 0;
border: 1px solid #eee;
border-radius: 4px;
}
实现编辑器工具栏按钮,参考toolbarItemFactory.ts添加热力图插入按钮:
// src/ui/toolbar.ts
import { ToolbarItemFactory } from '@toast-ui/editor';
export function createHeatmapToolbarItem() {
return ToolbarItemFactory.createButton({
icon: '<svg>...</svg>', // 热力图图标SVG
tooltip: '插入热力图',
action: (editor) => {
editor.insertText('$$heatmap\nx,y,value\n10,20,0.5\n30,40,0.8\n$$');
}
});
}
示例与测试
创建demo/editor.html文件,演示热力图插件的使用效果:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://uicdn.toast.com/editor/latest/toastui-editor.css">
<script src="https://uicdn.toast.com/editor/latest/toastui-editor-all.min.js"></script>
<script src="../dist/toastui-editor-plugin-heatmap.js"></script>
</head>
<body>
<div id="editor"></div>
<script>
const editor = new toastui.Editor({
el: document.querySelector('#editor'),
plugins: [heatmapPlugin()]
});
</script>
</body>
</html>
热力图插件效果示例:
构建与发布
配置webpack.config.js文件,设置插件构建规则:
module.exports = {
entry: './src/index.ts',
output: {
filename: 'toastui-editor-plugin-heatmap.js',
path: path.resolve(__dirname, 'dist'),
library: 'heatmapPlugin'
},
// 其他配置...
};
在package.json中添加构建脚本:
"scripts": {
"build": "webpack build",
"dev": "webpack serve --open"
}
运行构建命令生成插件文件:
npm run build
总结与扩展
本文开发的热力图插件实现了基本的数据可视化功能,可进一步扩展以下特性:
- 支持更多数据格式(JSON、TSV)
- 添加交互式控制(缩放、平移)
- 实现数据过滤和聚类功能
- 添加颜色主题切换
完整的插件代码可参考项目中的图表插件实现,更多开发细节请查阅官方文档。通过开发热力图插件,我们展示了tui.editor的灵活扩展性,开发者可根据需求定制更多专业的数据可视化插件。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




