UNPKG

d3-graphviz

Version:

Graphviz DOT rendering and animated transitions for D3

147 lines (135 loc) 4.46 kB
import * as d3 from "d3-selection"; export function extractElementData(element) { var datum = {}; var tag = element.node().nodeName; datum.tag = tag; if (tag == '#text') { datum.text = element.text(); } else if (tag == '#comment') { datum.comment = element.text(); } datum.attributes = {}; var attributes = element.node().attributes; if (attributes) { for (var i = 0; i < attributes.length; i++) { var attribute = attributes[i]; var name = attribute.name; var value = attribute.value; datum.attributes[name] = value; } } var transform = element.node().transform; if (transform && transform.baseVal.numberOfItems != 0) { var matrix = transform.baseVal.consolidate().matrix; datum.translation = {x: matrix.e, y: matrix.f}; } if (tag == 'ellipse') { datum.center = { x: datum.attributes.cx, y: datum.attributes.cy, }; } if (tag == 'polygon') { var points = element.attr('points').split(' '); var x = points.map(function(p) {return p.split(',')[0]}); var y = points.map(function(p) {return p.split(',')[1]}); var xmin = Math.min.apply(null, x); var xmax = Math.max.apply(null, x); var ymin = Math.min.apply(null, y); var ymax = Math.max.apply(null, y); var bbox = { x: xmin, y: ymin, width: xmax - xmin, height: ymax - ymin, }; datum.bbox = bbox; datum.center = { x: (xmin + xmax) / 2, y: (ymin + ymax) / 2, }; } if (tag == 'path') { var d = element.attr('d'); var points = d.split(/[A-Z ]/); points.shift(); var x = points.map(function(p) {return +p.split(',')[0]}); var y = points.map(function(p) {return +p.split(',')[1]}); var xmin = Math.min.apply(null, x); var xmax = Math.max.apply(null, x); var ymin = Math.min.apply(null, y); var ymax = Math.max.apply(null, y); var bbox = { x: xmin, y: ymin, width: xmax - xmin, height: ymax - ymin, }; datum.bbox = bbox; datum.center = { x: (xmin + xmax) / 2, y: (ymin + ymax) / 2, }; datum.totalLength = element.node().getTotalLength(); } if (tag == '#text') { datum.text = element.text(); } else if (tag == '#comment') { datum.comment = element.text(); } return datum } export function extractAllElementsData(element) { var datum = extractElementData(element); datum.children = []; var children = d3.selectAll(element.node().childNodes); children.each(function () { var childData = extractAllElementsData(d3.select(this)); childData.parent = datum; datum.children.push(childData); }); return datum; } export function createElement(data) { if (data.tag == '#text') { return document.createTextNode(""); } else if (data.tag == '#comment') { return document.createComment(data.comment); } else { return document.createElementNS('http://www.w3.org/2000/svg', data.tag); } } export function createElementWithAttributes(data) { var elementNode = createElement(data); var element = d3.select(elementNode); var attributes = data.attributes; for (var attributeName of Object.keys(attributes)) { var attributeValue = attributes[attributeName]; element.attr(attributeName, attributeValue); } return elementNode; } export function replaceElement(element, data) { var parent = d3.select(element.node().parentNode); var newElementNode = createElementWithAttributes(data); var newElement = parent.insert(function () { return newElementNode; }, function () { return element.node(); }); element.remove(); return newElement; } export function insertElementData(element, datum) { element.datum(datum); element.data([datum], function (d) { return d.key; }); } export function insertAllElementsData(element, datum) { insertElementData(element, datum); var children = d3.selectAll(element.node().childNodes); children.each(function (d, i) { insertAllElementsData(d3.select(this), datum.children[i]); }); }