UNPKG

d-grouped-barchart

Version:

Derby grouped bar chart component using d3 and d3-tip.

193 lines (175 loc) 6.6 kB
(function() { var out$ = typeof exports != 'undefined' && exports || this; var doctype = '<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'; function isExternal(url) { return url && url.lastIndexOf('http',0) == 0 && url.lastIndexOf(window.location.host) == -1; } function inlineImages(el, callback) { var images = el.querySelectorAll('image'); var left = images.length; if (left == 0) { callback(); } for (var i = 0; i < images.length; i++) { (function(image) { var href = image.getAttributeNS("http://www.w3.org/1999/xlink", "href"); if (href) { if (isExternal(href.value)) { console.warn("Cannot render embedded images linking to external hosts: "+href.value); return; } } var canvas = document.createElement('canvas'); var ctx = canvas.getContext('2d'); var img = new Image(); href = href || image.getAttribute('href'); img.src = href; img.onload = function() { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); image.setAttributeNS("http://www.w3.org/1999/xlink", "href", canvas.toDataURL('image/png')); left--; if (left == 0) { callback(); } } img.onerror = function() { console.log("Could not load "+href); left--; if (left == 0) { callback(); } } })(images[i]); } } function styles(el, selectorRemap) { var css = ""; var sheets = document.styleSheets; for (var i = 0; i < sheets.length; i++) { if (isExternal(sheets[i].href)) { console.warn("Cannot include styles from other hosts: "+sheets[i].href); continue; } var rules = sheets[i].cssRules; if (rules != null) { for (var j = 0; j < rules.length; j++) { var rule = rules[j]; if (typeof(rule.style) != "undefined") { var match = null; try { match = el.querySelector(rule.selectorText); } catch(err) { console.warn('Invalid CSS selector "' + rule.selectorText + '"', err); } if (match) { var selector = selectorRemap ? selectorRemap(rule.selectorText) : rule.selectorText; css += selector + " { " + rule.style.cssText + " }\n"; } else if(rule.cssText.match(/^@font-face/)) { css += rule.cssText + '\n'; } } } } } return css; } function getDimension(el, clone, dim) { return (clone.getAttribute(dim) !== null && !clone.getAttribute(dim).match(/%$/) && parseInt(clone.getAttribute(dim))) || el.getBoundingClientRect()[dim] || parseInt(clone.style[dim]) || parseInt(window.getComputedStyle(el).getPropertyValue(dim)); } function getSvg(el, options) { var xmlns = "http://www.w3.org/2000/xmlns/"; var outer = document.createElement("div"); var clone = el.cloneNode(true); var width, height, viewBoxWidth, viewBoxHeight; if(el.tagName == 'svg') { width = getDimension(el, clone, 'width'); height = getDimension(el, clone, 'height'); if (typeof width === "undefined" || width === null || isNaN(parseFloat(width))) { width = 0; } if (typeof height === "undefined" || height === null || isNaN(parseFloat(height))) { height = 0; } viewBoxWidth = el.viewBox.baseVal && el.viewBox.baseVal.width !== 0 ? el.viewBox.baseVal.width : width; viewBoxHeight = el.viewBox.baseVal && el.viewBox.baseVal.height !== 0 ? el.viewBox.baseVal.height : height; } else { var box = el.getBBox(); width = box.x + box.width; height = box.y + box.height; clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\(.*?\)/, '')); viewBoxWidth = width; viewBoxHeight = height; var svg = document.createElementNS('http://www.w3.org/2000/svg','svg') svg.appendChild(clone) clone = svg; } clone.setAttribute("version", "1.1"); clone.setAttributeNS(xmlns, "xmlns", "http://www.w3.org/2000/svg"); clone.setAttributeNS(xmlns, "xmlns:xlink", "http://www.w3.org/1999/xlink"); clone.setAttribute("width", width * options.scale); clone.setAttribute("height", height * options.scale); clone.setAttribute("viewBox", "0 0 " + viewBoxWidth + " " + viewBoxHeight); outer.appendChild(clone); var css = styles(el, options.selectorRemap); var s = document.createElement('style'); s.setAttribute('type', 'text/css'); s.innerHTML = "<![CDATA[\n" + css + "\n]]>"; var defs = document.createElement('defs'); defs.appendChild(s); clone.insertBefore(defs, clone.firstChild); var svg = doctype + outer.innerHTML; return svg; } out$.getSvg = function(el, options, cb) { options = options || {}; options.scale = options.scale || 1; inlineImages(el, function() { var svg = getSvg(el, options); if (cb) { cb(svg); } }); } out$.svgAsDataUri = function(el, options, cb) { options = options || {}; options.scale = options.scale || 1; inlineImages(el, function() { var svg = getSvg(el, options); window.unescape = window.unescape || window.decodeURI; // encode then decode to handle `btoa` on Unicode; see MDN for `btoa`. var uri = 'data:image/svg+xml;base64,' + window.btoa(decodeURIComponent(encodeURIComponent(unescape(svg)))); if (cb) { cb(uri); } }); } out$.saveSvgAsPng = function(el, name, options) { options = options || {}; out$.svgAsDataUri(el, options, function(uri) { var image = new Image(); image.onload = function() { var canvas = document.createElement('canvas'); canvas.width = image.width; canvas.height = image.height; var context = canvas.getContext('2d'); context.fillStyle = "#ffffff"; context.fillRect(0,0,canvas.width, canvas.height); context.drawImage(image, 0, 0); var a = document.createElement('a'); a.download = name; a.href = canvas.toDataURL('image/png'); document.body.appendChild(a); a.addEventListener("click", function(e) { a.parentNode.removeChild(a); }); a.click(); } image.src = uri; }); } })();