HTMLWidgets.widget({
name: 'grViz',
type: 'output',
initialize: function(el, width, height) {
return {
// TODO: add instance fields as required
}
},
renderValue: function(el, x, instance) {
// use this to sort of make our diagram responsive
// or at a minimum fit within the bounds set by htmlwidgets
// for the parent container
function makeResponsive(el){
var svg = el.getElementsByTagName("svg")[0];
if(svg){
if(svg.width) {svg.removeAttribute("width")};
if(svg.height) {svg.removeAttribute("height")};
svg.style.width = "100%";
svg.style.height = "100%";
}
};
if ( x.diagram != "" ) {
if ( typeof x.config === "undefined" ){
x.config = {};
x.config.engine = "dot";
x.config.options = {};
}
try {
el.innerHTML = Viz( x.diagram, format="svg", engine=x.config.engine, options=x.config.options );
makeResponsive(el);
// set up a container for tasks to perform after completion
// one example would be add callbacks for event handling
// styling
if (!(typeof x.tasks === "undefined") ){
if ( (typeof x.tasks.length === "undefined") ||
(typeof x.tasks === "function" ) ) {
// handle a function not enclosed in array
// should be able to remove once using jsonlite
x.tasks = [x.tasks];
}
x.tasks.map(function(t){
// for each tasks add it to the mermaid.tasks with el
t.call(el);
})
}
} catch(e){
var p = document.createElement("pre")
p.innerText = e;
el.appendChild(p);
}
}
},
resize: function(el, width, height, instance) {
}
});