vnote/src/data/extra/web/js/graphviz.js
Le Tan 52702a32e9 hard days for VNoteX project
Never say "refactor" again!!!
2020-11-28 23:10:43 +08:00

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());