mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-06 14:29:54 +08:00
111 lines
3.1 KiB
JavaScript
111 lines
3.1 KiB
JavaScript
class Graphviz extends GraphRenderer {
|
|
constructor() {
|
|
super();
|
|
|
|
this.name = 'graphviz';
|
|
|
|
this.graphDivClass = 'vx-graphviz-graph';
|
|
|
|
this.extraScripts = [this.scriptFolderPath + '/viz.js/viz.js',
|
|
this.scriptFolderPath + '/viz.js/lite.render.js'];
|
|
|
|
this.viz = null;
|
|
|
|
this.format = 'svg';
|
|
|
|
this.langs = ['dot'];
|
|
}
|
|
|
|
registerInternal() {
|
|
this.vnotex.on('basicMarkdownRendered', () => {
|
|
this.reset();
|
|
this.renderCodeNodes(this.vnotex.contentContainer, 'svg');
|
|
});
|
|
|
|
this.vnotex.getWorker('markdownit').addLangsToSkipHighlight(this.langs);
|
|
}
|
|
|
|
initialize(p_callback) {
|
|
return super.initialize(() => {
|
|
this.viz = new Viz();
|
|
p_callback();
|
|
});
|
|
}
|
|
|
|
// Interface 1.
|
|
render(p_node, p_classList, p_format) {
|
|
this.format = p_format;
|
|
|
|
super.render(p_node, p_classList);
|
|
}
|
|
|
|
// Interface 2.
|
|
renderCodeNodes(p_node, p_format) {
|
|
this.format = p_format;
|
|
|
|
super.renderCodeNodes(p_node);
|
|
}
|
|
|
|
renderOne(p_node, p_idx) {
|
|
let func = function(p_graphviz, p_renderNode) {
|
|
let graphviz = p_graphviz;
|
|
let node = p_renderNode;
|
|
return function(p_element) {
|
|
if (node) {
|
|
let wrapperDiv = document.createElement('div');
|
|
wrapperDiv.classList.add(graphviz.graphDivClass);
|
|
wrapperDiv.appendChild(p_element);
|
|
|
|
Utils.checkSourceLine(p_node, wrapperDiv);
|
|
|
|
Utils.replaceNodeWithPreCheck(p_node, wrapperDiv);
|
|
|
|
if (graphviz.format === 'svg') {
|
|
window.vxImageViewer.setupSVGToView(p_element, false);
|
|
} else {
|
|
window.vxImageViewer.setupIMGToView(p_element);
|
|
}
|
|
}
|
|
graphviz.finishRenderingOne();
|
|
};
|
|
};
|
|
|
|
if (this.format === 'svg') {
|
|
this.viz.renderSVGElement(p_node.textContent)
|
|
.then(func(this, p_node))
|
|
.catch(function(p_err) {
|
|
console.error('failed to render Graphviz', p_err);
|
|
});
|
|
} else {
|
|
this.viz.renderImageElement(p_node.textContent)
|
|
.then(func(this, p_node))
|
|
.catch(function(p_err) {
|
|
console.error('failed to render Graphviz', p_err);
|
|
});
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// Render a graph from @p_text in SVG format.
|
|
// p_callback(svgNode).
|
|
renderText(p_text, p_callback) {
|
|
let func = () => {
|
|
this.viz.renderSVGElement(p_text)
|
|
.then(p_callback)
|
|
.catch(function(err) {
|
|
console.error('failed to render Graphviz', err);
|
|
p_callback(null);
|
|
});
|
|
};
|
|
|
|
if (!this.initialize(func)) {
|
|
return;
|
|
}
|
|
|
|
func();
|
|
}
|
|
}
|
|
|
|
window.vnotex.registerWorker(new Graphviz());
|