Comparing version 0.6.1 to 0.6.2
245
browser.js
@@ -10,4 +10,10 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.SvgSaver = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
var _computedStyles = require('computed-styles'); | ||
var _computedStyles2 = _interopRequireDefault(_computedStyles); | ||
var svgStyles = { // Whitelist of CSS styles and default values | ||
@@ -82,3 +88,3 @@ 'alignment-baseline': 'auto', | ||
'xlink: href', // Xlink attribute | ||
'style', 'class', 'd', 'pathLength', // Path | ||
'href', 'style', 'class', 'd', 'pathLength', // Path | ||
'x', 'y', 'dx', 'dy', 'glyphRef', 'format', 'x1', 'y1', 'x2', 'y2', 'rotate', 'textLength', 'cx', 'cy', 'r', 'rx', 'ry', 'fx', 'fy', 'width', 'height', 'refX', 'refY', 'orient', 'markerUnits', 'markerWidth', 'markerHeight', 'maskUnits', 'transform', 'viewBox', 'version', // Container | ||
@@ -118,119 +124,3 @@ 'preserveAspectRatio', 'xmlns', 'points', // Polygons | ||
// detection | ||
var DownloadAttributeSupport = typeof document !== 'undefined' && 'download' in document.createElement('a'); | ||
function saveUri(uri, name) { | ||
if (DownloadAttributeSupport) { | ||
var dl = document.createElement('a'); | ||
dl.setAttribute('href', uri); | ||
dl.setAttribute('download', name); | ||
// firefox doesn't support `.click()`... | ||
// from https://github.com/sindresorhus/multi-download/blob/gh-pages/index.js | ||
dl.dispatchEvent(new MouseEvent('click')); | ||
return true; | ||
} else if (typeof window !== 'undefined') { | ||
window.open(uri, '_blank', ''); | ||
return true; | ||
} | ||
return false; | ||
} | ||
function savePng(uri, name) { | ||
var canvas = document.createElement('canvas'); | ||
var context = canvas.getContext('2d'); | ||
var image = new Image(); | ||
image.onload = function () { | ||
canvas.width = image.width; | ||
canvas.height = image.height; | ||
context.drawImage(image, 0, 0); | ||
if (isDefined(window.saveAs) && isDefined(canvas.toBlob)) { | ||
canvas.toBlob(function (blob) { | ||
saveAs(blob, name); | ||
}); | ||
} else { | ||
saveUri(canvas.toDataURL('image/png'), name); | ||
} | ||
}; | ||
image.src = uri; | ||
return true; | ||
} | ||
var _isDefined = function _isDefined(a) { | ||
return typeof a !== 'undefined'; | ||
}; | ||
var _isUndefined = function _isUndefined(a) { | ||
return typeof a === 'undefined'; | ||
}; | ||
var _isObject = function _isObject(a) { | ||
return a !== null && typeof a === 'object'; | ||
}; | ||
// from https://github.com/npm-dom/is-dom/blob/master/index.js | ||
function _isNode(val) { | ||
if (!_isObject(val)) return false; | ||
if (_isDefined(window) && _isObject(window.Node)) return val instanceof window.Node; | ||
return 'number' == typeof val.nodeType && 'string' == typeof val.nodeName; | ||
} | ||
var useComputedStyles = _isDefined(window) && _isDefined(window.getComputedStyle); | ||
// Gets computed styles for an element | ||
// from https://github.com/jquery/jquery/blob/master/src/css/var/getStyles.js | ||
function getComputedStyles(node) { | ||
if (useComputedStyles) { | ||
var view = node.ownerDocument.defaultView; | ||
if (!view.opener) view = window; | ||
return view.getComputedStyle(node, null); | ||
} else { | ||
return node.currentStyle || node.style; | ||
} | ||
} | ||
/** | ||
* Returns a collection of CSS property-value pairs | ||
* @param {Element} node A DOM element to copy styles from | ||
* @param {Object} [target] An optional object to copy styles to | ||
* @param {(Object|Boolean)} [default=true] A collection of CSS property-value pairs, false: copy none, true: copy all | ||
* @return {object} collection of CSS property-value pairs | ||
* @api public | ||
*/ | ||
function computedStyles(node) { | ||
var target = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | ||
var styleList = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; | ||
if (!_isNode(node)) { | ||
throw new Error('parameter 1 is not of type \'Element\''); | ||
} | ||
if (styleList === false) return target; | ||
var computed = getComputedStyles(node); | ||
if (styleList === true) { | ||
var keysArray = useComputedStyles ? computed : Object.keys(computed); | ||
} else { | ||
var keysArray = Object.keys(styleList); | ||
} | ||
for (var i = 0, l = keysArray.length; i < l; i++) { | ||
var key = keysArray[i]; | ||
var def = styleList === true || styleList[key]; | ||
if (def === false || _isUndefined(def)) continue; // copy never | ||
var value = /* computed.getPropertyValue(key) || */computed[key]; // using getPropertyValue causes error in IE11 | ||
if (typeof value !== 'string' || value === '') continue; // invalid value | ||
if (def === true || value !== def) { | ||
// styleList === true || styleList[key] === true || styleList[key] !== value | ||
target[key] = value; | ||
} | ||
} | ||
return target; | ||
} | ||
/* Some utilities for cloning SVGs with inline styles */ | ||
// Removes attributes that are not valid for SVGs | ||
@@ -278,3 +168,3 @@ function cleanAttrs(el, attrs, styles) { | ||
if (tgt.style) { | ||
computedStyles(src, tgt.style, styles); | ||
(0, _computedStyles2['default'])(src, tgt.style, styles); | ||
} | ||
@@ -293,2 +183,50 @@ }, function (src, tgt) { | ||
/* global saveAs, Image, MouseEvent */ | ||
/* Some simple utilities for saving SVGs, including an alternative to saveAs */ | ||
// detection | ||
var DownloadAttributeSupport = typeof document !== 'undefined' && 'download' in document.createElement('a'); | ||
function saveUri(uri, name) { | ||
if (DownloadAttributeSupport) { | ||
var dl = document.createElement('a'); | ||
dl.setAttribute('href', uri); | ||
dl.setAttribute('download', name); | ||
// firefox doesn't support `.click()`... | ||
// from https://github.com/sindresorhus/multi-download/blob/gh-pages/index.js | ||
dl.dispatchEvent(new MouseEvent('click')); | ||
return true; | ||
} else if (typeof window !== 'undefined') { | ||
window.open(uri, '_blank', ''); | ||
return true; | ||
} | ||
return false; | ||
} | ||
function savePng(uri, name) { | ||
var canvas = document.createElement('canvas'); | ||
var context = canvas.getContext('2d'); | ||
var image = new Image(); | ||
image.onload = function () { | ||
canvas.width = image.width; | ||
canvas.height = image.height; | ||
context.drawImage(image, 0, 0); | ||
if (isDefined(window.saveAs) && isDefined(canvas.toBlob)) { | ||
canvas.toBlob(function (blob) { | ||
saveAs(blob, name); | ||
}); | ||
} else { | ||
saveUri(canvas.toDataURL('image/png'), name); | ||
} | ||
}; | ||
image.src = uri; | ||
return true; | ||
} | ||
/* global saveAs, Blob */ | ||
// inheritable styles may be overridden by parent, always copy for now | ||
@@ -447,3 +385,72 @@ inheritableAttrs.forEach(function (k) { | ||
},{"computed-styles":2}],2:[function(require,module,exports){ | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
var isDefined = function isDefined(a) { | ||
return typeof a !== 'undefined'; | ||
}; | ||
var isObject = function isObject(a) { | ||
return a !== null && typeof a === 'object'; | ||
}; | ||
// from https://github.com/npm-dom/is-dom/blob/master/index.js | ||
function isNode(val) { | ||
if (!isObject(val)) return false; | ||
if (isDefined(window) && isObject(window.Node)) return val instanceof window.Node; | ||
return 'number' == typeof val.nodeType && 'string' == typeof val.nodeName; | ||
} | ||
var useComputedStyles = isDefined(window) && isDefined(window.getComputedStyle); | ||
/** | ||
* Returns a collection of CSS property-value pairs | ||
* @param {Element} node A DOM element to copy styles from | ||
* @param {Object} [target] An optional object to copy styles to | ||
* @param {(Object|Boolean)} [default=true] A collection of CSS property-value pairs, false: copy none, true: copy all | ||
* @return {object} collection of CSS property-value pairs | ||
* @api public | ||
*/ | ||
function computedStyles(node) { | ||
var target = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | ||
var styleList = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; | ||
if (!isNode(node)) { | ||
throw new Error('parameter 1 is not of type \'Element\''); | ||
} | ||
if (styleList === false) return target; | ||
if (useComputedStyles) { | ||
var computed = node.ownerDocument.defaultView.getComputedStyle(node, null); | ||
var keysArray = styleList === true ? computed : Object.keys(styleList); | ||
} else { | ||
var computed = isDefined(node.currentStyle) ? node.currentStyle : node.style; | ||
var keysArray = styleList === true ? Object.keys(computed) : Object.keys(styleList); | ||
} | ||
for (var i = 0, l = keysArray.length; i < l; i++) { | ||
var key = keysArray[i]; | ||
var def = styleList === true || styleList[key]; | ||
if (def === false || !isDefined(def)) continue; // copy never | ||
var value = useComputedStyles ? computed.getPropertyValue(key) : computed[key]; | ||
if (typeof value !== 'string' || value === '') continue; // invalid value | ||
if (def === true || value !== def) { | ||
// styleList === true || styleList[key] === true || styleList[key] !== value | ||
target[key] = value; | ||
} | ||
} | ||
return target; | ||
} | ||
exports['default'] = computedStyles; | ||
module.exports = exports['default']; | ||
},{}]},{},[1])(1) | ||
}); |
@@ -1,1 +0,1 @@ | ||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.SvgSaver=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var svgStyles={"alignment-baseline":"auto","baseline-shift":"baseline",clip:"auto","clip-path":"none","clip-rule":"nonzero",color:"rgb(51, 51, 51)","color-interpolation":"srgb","color-interpolation-filters":"linearrgb","color-profile":"auto","color-rendering":"auto",cursor:"auto",direction:"ltr",display:"inline","dominant-baseline":"auto","enable-background":"",fill:"rgb(0, 0, 0)","fill-opacity":"1","fill-rule":"nonzero",filter:"none","flood-color":"rgb(0, 0, 0)","flood-opacity":"1",font:"","font-family":"normal","font-size":"medium","font-size-adjust":"auto","font-stretch":"normal","font-style":"normal","font-variant":"normal","font-weight":"400","glyph-orientation-horizontal":"0deg","glyph-orientation-vertical":"auto","image-rendering":"auto",kerning:"auto","letter-spacing":"0","lighting-color":"rgb(255, 255, 255)",marker:"","marker-end":"none","marker-mid":"none","marker-start":"none",mask:"none",opacity:"1",overflow:"visible","paint-order":"fill","pointer-events":"auto","shape-rendering":"auto","stop-color":"rgb(0, 0, 0)","stop-opacity":"1",stroke:"none","stroke-dasharray":"none","stroke-dashoffset":"0","stroke-linecap":"butt","stroke-linejoin":"miter","stroke-miterlimit":"4","stroke-opacity":"1","stroke-width":"1","text-anchor":"start","text-decoration":"none","text-rendering":"auto","unicode-bidi":"normal",visibility:"visible","word-spacing":"0px","writing-mode":"lr-tb"};var svgAttrs=["id","xml: base","xml: lang","xml: space","height","result","width","x","y","xlink: href","style","class","d","pathLength","x","y","dx","dy","glyphRef","format","x1","y1","x2","y2","rotate","textLength","cx","cy","r","rx","ry","fx","fy","width","height","refX","refY","orient","markerUnits","markerWidth","markerHeight","maskUnits","transform","viewBox","version","preserveAspectRatio","xmlns","points","offset"];var inheritableAttrs=["clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cursor","direction","fill","fill-opacity","fill-rule","font","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","glyph-orientation-horizontal","glyph-orientation-vertical","image-rendering","kerning","letter-spacing","marker","marker-end","marker-mid","marker-start","pointer-events","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-rendering","transform","visibility","white-space","word-spacing","writing-mode"];var isFunction=function isFunction(a){return typeof a==="function"};var isDefined=function isDefined(a){return typeof a!=="undefined"};var isUndefined=function isUndefined(a){return typeof a==="undefined"};var isObject=function isObject(a){return a!==null&&typeof a==="object"};function isNode(val){if(!isObject(val)){return false}if(isDefined(window)&&isObject(window.Node)){return val instanceof window.Node}return typeof val.nodeType==="number"&&typeof val.nodeName==="string"}var DownloadAttributeSupport=typeof document!=="undefined"&&"download"in document.createElement("a");function saveUri(uri,name){if(DownloadAttributeSupport){var dl=document.createElement("a");dl.setAttribute("href",uri);dl.setAttribute("download",name);dl.dispatchEvent(new MouseEvent("click"));return true}else if(typeof window!=="undefined"){window.open(uri,"_blank","");return true}return false}function savePng(uri,name){var canvas=document.createElement("canvas");var context=canvas.getContext("2d");var image=new Image;image.onload=function(){canvas.width=image.width;canvas.height=image.height;context.drawImage(image,0,0);if(isDefined(window.saveAs)&&isDefined(canvas.toBlob)){canvas.toBlob(function(blob){saveAs(blob,name)})}else{saveUri(canvas.toDataURL("image/png"),name)}};image.src=uri;return true}var _isDefined=function _isDefined(a){return typeof a!=="undefined"};var _isUndefined=function _isUndefined(a){return typeof a==="undefined"};var _isObject=function _isObject(a){return a!==null&&typeof a==="object"};function _isNode(val){if(!_isObject(val))return false;if(_isDefined(window)&&_isObject(window.Node))return val instanceof window.Node;return"number"==typeof val.nodeType&&"string"==typeof val.nodeName}var useComputedStyles=_isDefined(window)&&_isDefined(window.getComputedStyle);function getComputedStyles(node){if(useComputedStyles){var view=node.ownerDocument.defaultView;if(!view.opener)view=window;return view.getComputedStyle(node,null)}else{return node.currentStyle||node.style}}function computedStyles(node){var target=arguments.length<=1||arguments[1]===undefined?{}:arguments[1];var styleList=arguments.length<=2||arguments[2]===undefined?true:arguments[2];if(!_isNode(node)){throw new Error("parameter 1 is not of type 'Element'")}if(styleList===false)return target;var computed=getComputedStyles(node);if(styleList===true){var keysArray=useComputedStyles?computed:Object.keys(computed)}else{var keysArray=Object.keys(styleList)}for(var i=0,l=keysArray.length;i<l;i++){var key=keysArray[i];var def=styleList===true||styleList[key];if(def===false||_isUndefined(def))continue;var value=computed[key];if(typeof value!=="string"||value==="")continue;if(def===true||value!==def){target[key]=value}}return target}function cleanAttrs(el,attrs,styles){if(attrs===true){return}Array.prototype.slice.call(el.attributes).forEach(function(attr){if(attr.specified){if(attrs===""||attrs===false||isUndefined(styles[attr.name])&&attrs.indexOf(attr.name)<0){el.removeAttribute(attr.name)}}})}function cleanStyle(tgt,parentStyles){parentStyles=parentStyles||tgt.parentNode.style;inheritableAttrs.forEach(function(key){if(tgt.style[key]===parentStyles[key]){tgt.style.removeProperty(key)}})}function domWalk(src,tgt,down,up){down(src,tgt);var children=src.childNodes;for(var i=0;i<children.length;i++){domWalk(children[i],tgt.childNodes[i],down,up)}up(src,tgt)}function cloneSvg(src,attrs,styles){var clonedSvg=src.cloneNode(true);domWalk(src,clonedSvg,function(src,tgt){if(tgt.style){computedStyles(src,tgt.style,styles)}},function(src,tgt){if(tgt.style&&tgt.parentNode){cleanStyle(tgt)}if(tgt.attributes){cleanAttrs(tgt,attrs,styles)}});return clonedSvg}inheritableAttrs.forEach(function(k){if(k in svgStyles){svgStyles[k]=true}});function getSvg(el){if(isUndefined(el)||el===""){el=document.body.querySelector("svg")}else if(typeof el==="string"){el=document.body.querySelector(el)}if(el&&el.tagName!=="svg"){el=el.querySelector("svg")}if(!isNode(el)){throw new Error("svgsaver: Can't find an svg element")}return el}function getFilename(el,filename,ext){if(!filename||filename===""){filename=(el.getAttribute("title")||"untitled")+"."+ext}return encodeURI(filename)}var SvgSaver=function(){function SvgSaver(){var _ref=arguments.length<=0||arguments[0]===undefined?{}:arguments[0];var attrs=_ref.attrs;var styles=_ref.styles;_classCallCheck(this,SvgSaver);this.attrs=attrs===undefined?svgAttrs:attrs;this.styles=styles===undefined?svgStyles:styles}_createClass(SvgSaver,[{key:"getHTML",value:function getHTML(el){el=getSvg(el);var svg=cloneSvg(el,this.attrs,this.styles);svg.setAttribute("xmlns","http://www.w3.org/2000/svg");svg.setAttribute("version",1.1);svg.setAttribute("width",svg.getAttribute("width")||"500");svg.setAttribute("height",svg.getAttribute("height")||"900");return svg.outerHTML||(new window.XMLSerializer).serializeToString(svg)}},{key:"getBlob",value:function getBlob(el){var html=this.getHTML(el);return new Blob([html],{type:"text/xml"})}},{key:"getUri",value:function getUri(el){var html=encodeURIComponent(this.getHTML(el));if(isDefined(window.btoa)){return"data:image/svg+xml;base64,"+window.btoa(unescape(html))}return"data:image/svg+xml,"+html}},{key:"asSvg",value:function asSvg(el,filename){el=getSvg(el);filename=getFilename(el,filename,"svg");if(isDefined(window.saveAs)&&isFunction(Blob)){return saveAs(this.getBlob(el),filename)}else{return saveUri(this.getUri(el),filename)}}},{key:"asPng",value:function asPng(el,filename){el=getSvg(el);filename=getFilename(el,filename,"png");return savePng(this.getUri(el),filename)}}]);return SvgSaver}();exports["default"]=SvgSaver;module.exports=exports["default"]},{}]},{},[1])(1)}); | ||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.SvgSaver=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}();function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{"default":obj}}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var _computedStyles=require("computed-styles");var _computedStyles2=_interopRequireDefault(_computedStyles);var svgStyles={"alignment-baseline":"auto","baseline-shift":"baseline",clip:"auto","clip-path":"none","clip-rule":"nonzero",color:"rgb(51, 51, 51)","color-interpolation":"srgb","color-interpolation-filters":"linearrgb","color-profile":"auto","color-rendering":"auto",cursor:"auto",direction:"ltr",display:"inline","dominant-baseline":"auto","enable-background":"",fill:"rgb(0, 0, 0)","fill-opacity":"1","fill-rule":"nonzero",filter:"none","flood-color":"rgb(0, 0, 0)","flood-opacity":"1",font:"","font-family":"normal","font-size":"medium","font-size-adjust":"auto","font-stretch":"normal","font-style":"normal","font-variant":"normal","font-weight":"400","glyph-orientation-horizontal":"0deg","glyph-orientation-vertical":"auto","image-rendering":"auto",kerning:"auto","letter-spacing":"0","lighting-color":"rgb(255, 255, 255)",marker:"","marker-end":"none","marker-mid":"none","marker-start":"none",mask:"none",opacity:"1",overflow:"visible","paint-order":"fill","pointer-events":"auto","shape-rendering":"auto","stop-color":"rgb(0, 0, 0)","stop-opacity":"1",stroke:"none","stroke-dasharray":"none","stroke-dashoffset":"0","stroke-linecap":"butt","stroke-linejoin":"miter","stroke-miterlimit":"4","stroke-opacity":"1","stroke-width":"1","text-anchor":"start","text-decoration":"none","text-rendering":"auto","unicode-bidi":"normal",visibility:"visible","word-spacing":"0px","writing-mode":"lr-tb"};var svgAttrs=["id","xml: base","xml: lang","xml: space","height","result","width","x","y","xlink: href","href","style","class","d","pathLength","x","y","dx","dy","glyphRef","format","x1","y1","x2","y2","rotate","textLength","cx","cy","r","rx","ry","fx","fy","width","height","refX","refY","orient","markerUnits","markerWidth","markerHeight","maskUnits","transform","viewBox","version","preserveAspectRatio","xmlns","points","offset"];var inheritableAttrs=["clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cursor","direction","fill","fill-opacity","fill-rule","font","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","glyph-orientation-horizontal","glyph-orientation-vertical","image-rendering","kerning","letter-spacing","marker","marker-end","marker-mid","marker-start","pointer-events","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-rendering","transform","visibility","white-space","word-spacing","writing-mode"];var isFunction=function isFunction(a){return typeof a==="function"};var isDefined=function isDefined(a){return typeof a!=="undefined"};var isUndefined=function isUndefined(a){return typeof a==="undefined"};var isObject=function isObject(a){return a!==null&&typeof a==="object"};function isNode(val){if(!isObject(val)){return false}if(isDefined(window)&&isObject(window.Node)){return val instanceof window.Node}return typeof val.nodeType==="number"&&typeof val.nodeName==="string"}function cleanAttrs(el,attrs,styles){if(attrs===true){return}Array.prototype.slice.call(el.attributes).forEach(function(attr){if(attr.specified){if(attrs===""||attrs===false||isUndefined(styles[attr.name])&&attrs.indexOf(attr.name)<0){el.removeAttribute(attr.name)}}})}function cleanStyle(tgt,parentStyles){parentStyles=parentStyles||tgt.parentNode.style;inheritableAttrs.forEach(function(key){if(tgt.style[key]===parentStyles[key]){tgt.style.removeProperty(key)}})}function domWalk(src,tgt,down,up){down(src,tgt);var children=src.childNodes;for(var i=0;i<children.length;i++){domWalk(children[i],tgt.childNodes[i],down,up)}up(src,tgt)}function cloneSvg(src,attrs,styles){var clonedSvg=src.cloneNode(true);domWalk(src,clonedSvg,function(src,tgt){if(tgt.style){(0,_computedStyles2["default"])(src,tgt.style,styles)}},function(src,tgt){if(tgt.style&&tgt.parentNode){cleanStyle(tgt)}if(tgt.attributes){cleanAttrs(tgt,attrs,styles)}});return clonedSvg}var DownloadAttributeSupport=typeof document!=="undefined"&&"download"in document.createElement("a");function saveUri(uri,name){if(DownloadAttributeSupport){var dl=document.createElement("a");dl.setAttribute("href",uri);dl.setAttribute("download",name);dl.dispatchEvent(new MouseEvent("click"));return true}else if(typeof window!=="undefined"){window.open(uri,"_blank","");return true}return false}function savePng(uri,name){var canvas=document.createElement("canvas");var context=canvas.getContext("2d");var image=new Image;image.onload=function(){canvas.width=image.width;canvas.height=image.height;context.drawImage(image,0,0);if(isDefined(window.saveAs)&&isDefined(canvas.toBlob)){canvas.toBlob(function(blob){saveAs(blob,name)})}else{saveUri(canvas.toDataURL("image/png"),name)}};image.src=uri;return true}inheritableAttrs.forEach(function(k){if(k in svgStyles){svgStyles[k]=true}});function getSvg(el){if(isUndefined(el)||el===""){el=document.body.querySelector("svg")}else if(typeof el==="string"){el=document.body.querySelector(el)}if(el&&el.tagName!=="svg"){el=el.querySelector("svg")}if(!isNode(el)){throw new Error("svgsaver: Can't find an svg element")}return el}function getFilename(el,filename,ext){if(!filename||filename===""){filename=(el.getAttribute("title")||"untitled")+"."+ext}return encodeURI(filename)}var SvgSaver=function(){function SvgSaver(){var _ref=arguments.length<=0||arguments[0]===undefined?{}:arguments[0];var attrs=_ref.attrs;var styles=_ref.styles;_classCallCheck(this,SvgSaver);this.attrs=attrs===undefined?svgAttrs:attrs;this.styles=styles===undefined?svgStyles:styles}_createClass(SvgSaver,[{key:"getHTML",value:function getHTML(el){el=getSvg(el);var svg=cloneSvg(el,this.attrs,this.styles);svg.setAttribute("xmlns","http://www.w3.org/2000/svg");svg.setAttribute("version",1.1);svg.setAttribute("width",svg.getAttribute("width")||"500");svg.setAttribute("height",svg.getAttribute("height")||"900");return svg.outerHTML||(new window.XMLSerializer).serializeToString(svg)}},{key:"getBlob",value:function getBlob(el){var html=this.getHTML(el);return new Blob([html],{type:"text/xml"})}},{key:"getUri",value:function getUri(el){var html=encodeURIComponent(this.getHTML(el));if(isDefined(window.btoa)){return"data:image/svg+xml;base64,"+window.btoa(unescape(html))}return"data:image/svg+xml,"+html}},{key:"asSvg",value:function asSvg(el,filename){el=getSvg(el);filename=getFilename(el,filename,"svg");if(isDefined(window.saveAs)&&isFunction(Blob)){return saveAs(this.getBlob(el),filename)}else{return saveUri(this.getUri(el),filename)}}},{key:"asPng",value:function asPng(el,filename){el=getSvg(el);filename=getFilename(el,filename,"png");return savePng(this.getUri(el),filename)}}]);return SvgSaver}();exports["default"]=SvgSaver;module.exports=exports["default"]},{"computed-styles":2}],2:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var isDefined=function isDefined(a){return typeof a!=="undefined"};var isObject=function isObject(a){return a!==null&&typeof a==="object"};function isNode(val){if(!isObject(val))return false;if(isDefined(window)&&isObject(window.Node))return val instanceof window.Node;return"number"==typeof val.nodeType&&"string"==typeof val.nodeName}var useComputedStyles=isDefined(window)&&isDefined(window.getComputedStyle);function computedStyles(node){var target=arguments.length<=1||arguments[1]===undefined?{}:arguments[1];var styleList=arguments.length<=2||arguments[2]===undefined?true:arguments[2];if(!isNode(node)){throw new Error("parameter 1 is not of type 'Element'")}if(styleList===false)return target;if(useComputedStyles){var computed=node.ownerDocument.defaultView.getComputedStyle(node,null);var keysArray=styleList===true?computed:Object.keys(styleList)}else{var computed=isDefined(node.currentStyle)?node.currentStyle:node.style;var keysArray=styleList===true?Object.keys(computed):Object.keys(styleList)}for(var i=0,l=keysArray.length;i<l;i++){var key=keysArray[i];var def=styleList===true||styleList[key];if(def===false||!isDefined(def))continue;var value=useComputedStyles?computed.getPropertyValue(key):computed[key];if(typeof value!=="string"||value==="")continue;if(def===true||value!==def){target[key]=value}}return target}exports["default"]=computedStyles;module.exports=exports["default"]},{}]},{},[1])(1)}); |
@@ -9,2 +9,5 @@ CHANGELOG | ||
## 0.6.2 (2016-11-11) | ||
* Fix #4, Add href to default attributes | ||
## 0.6.1 (2015-11-17) | ||
@@ -11,0 +14,0 @@ * Fix #1, The string to be encoded contains characters outside of the Latin1 range. |
@@ -9,4 +9,10 @@ 'use strict'; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
var _computedStyles = require('computed-styles'); | ||
var _computedStyles2 = _interopRequireDefault(_computedStyles); | ||
var svgStyles = { // Whitelist of CSS styles and default values | ||
@@ -81,3 +87,3 @@ 'alignment-baseline': 'auto', | ||
'xlink: href', // Xlink attribute | ||
'style', 'class', 'd', 'pathLength', // Path | ||
'href', 'style', 'class', 'd', 'pathLength', // Path | ||
'x', 'y', 'dx', 'dy', 'glyphRef', 'format', 'x1', 'y1', 'x2', 'y2', 'rotate', 'textLength', 'cx', 'cy', 'r', 'rx', 'ry', 'fx', 'fy', 'width', 'height', 'refX', 'refY', 'orient', 'markerUnits', 'markerWidth', 'markerHeight', 'maskUnits', 'transform', 'viewBox', 'version', // Container | ||
@@ -117,119 +123,3 @@ 'preserveAspectRatio', 'xmlns', 'points', // Polygons | ||
// detection | ||
var DownloadAttributeSupport = typeof document !== 'undefined' && 'download' in document.createElement('a'); | ||
function saveUri(uri, name) { | ||
if (DownloadAttributeSupport) { | ||
var dl = document.createElement('a'); | ||
dl.setAttribute('href', uri); | ||
dl.setAttribute('download', name); | ||
// firefox doesn't support `.click()`... | ||
// from https://github.com/sindresorhus/multi-download/blob/gh-pages/index.js | ||
dl.dispatchEvent(new MouseEvent('click')); | ||
return true; | ||
} else if (typeof window !== 'undefined') { | ||
window.open(uri, '_blank', ''); | ||
return true; | ||
} | ||
return false; | ||
} | ||
function savePng(uri, name) { | ||
var canvas = document.createElement('canvas'); | ||
var context = canvas.getContext('2d'); | ||
var image = new Image(); | ||
image.onload = function () { | ||
canvas.width = image.width; | ||
canvas.height = image.height; | ||
context.drawImage(image, 0, 0); | ||
if (isDefined(window.saveAs) && isDefined(canvas.toBlob)) { | ||
canvas.toBlob(function (blob) { | ||
saveAs(blob, name); | ||
}); | ||
} else { | ||
saveUri(canvas.toDataURL('image/png'), name); | ||
} | ||
}; | ||
image.src = uri; | ||
return true; | ||
} | ||
var _isDefined = function _isDefined(a) { | ||
return typeof a !== 'undefined'; | ||
}; | ||
var _isUndefined = function _isUndefined(a) { | ||
return typeof a === 'undefined'; | ||
}; | ||
var _isObject = function _isObject(a) { | ||
return a !== null && typeof a === 'object'; | ||
}; | ||
// from https://github.com/npm-dom/is-dom/blob/master/index.js | ||
function _isNode(val) { | ||
if (!_isObject(val)) return false; | ||
if (_isDefined(window) && _isObject(window.Node)) return val instanceof window.Node; | ||
return 'number' == typeof val.nodeType && 'string' == typeof val.nodeName; | ||
} | ||
var useComputedStyles = _isDefined(window) && _isDefined(window.getComputedStyle); | ||
// Gets computed styles for an element | ||
// from https://github.com/jquery/jquery/blob/master/src/css/var/getStyles.js | ||
function getComputedStyles(node) { | ||
if (useComputedStyles) { | ||
var view = node.ownerDocument.defaultView; | ||
if (!view.opener) view = window; | ||
return view.getComputedStyle(node, null); | ||
} else { | ||
return node.currentStyle || node.style; | ||
} | ||
} | ||
/** | ||
* Returns a collection of CSS property-value pairs | ||
* @param {Element} node A DOM element to copy styles from | ||
* @param {Object} [target] An optional object to copy styles to | ||
* @param {(Object|Boolean)} [default=true] A collection of CSS property-value pairs, false: copy none, true: copy all | ||
* @return {object} collection of CSS property-value pairs | ||
* @api public | ||
*/ | ||
function computedStyles(node) { | ||
var target = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | ||
var styleList = arguments.length <= 2 || arguments[2] === undefined ? true : arguments[2]; | ||
if (!_isNode(node)) { | ||
throw new Error('parameter 1 is not of type \'Element\''); | ||
} | ||
if (styleList === false) return target; | ||
var computed = getComputedStyles(node); | ||
if (styleList === true) { | ||
var keysArray = useComputedStyles ? computed : Object.keys(computed); | ||
} else { | ||
var keysArray = Object.keys(styleList); | ||
} | ||
for (var i = 0, l = keysArray.length; i < l; i++) { | ||
var key = keysArray[i]; | ||
var def = styleList === true || styleList[key]; | ||
if (def === false || _isUndefined(def)) continue; // copy never | ||
var value = /* computed.getPropertyValue(key) || */computed[key]; // using getPropertyValue causes error in IE11 | ||
if (typeof value !== 'string' || value === '') continue; // invalid value | ||
if (def === true || value !== def) { | ||
// styleList === true || styleList[key] === true || styleList[key] !== value | ||
target[key] = value; | ||
} | ||
} | ||
return target; | ||
} | ||
/* Some utilities for cloning SVGs with inline styles */ | ||
// Removes attributes that are not valid for SVGs | ||
@@ -277,3 +167,3 @@ function cleanAttrs(el, attrs, styles) { | ||
if (tgt.style) { | ||
computedStyles(src, tgt.style, styles); | ||
(0, _computedStyles2['default'])(src, tgt.style, styles); | ||
} | ||
@@ -292,2 +182,50 @@ }, function (src, tgt) { | ||
/* global saveAs, Image, MouseEvent */ | ||
/* Some simple utilities for saving SVGs, including an alternative to saveAs */ | ||
// detection | ||
var DownloadAttributeSupport = typeof document !== 'undefined' && 'download' in document.createElement('a'); | ||
function saveUri(uri, name) { | ||
if (DownloadAttributeSupport) { | ||
var dl = document.createElement('a'); | ||
dl.setAttribute('href', uri); | ||
dl.setAttribute('download', name); | ||
// firefox doesn't support `.click()`... | ||
// from https://github.com/sindresorhus/multi-download/blob/gh-pages/index.js | ||
dl.dispatchEvent(new MouseEvent('click')); | ||
return true; | ||
} else if (typeof window !== 'undefined') { | ||
window.open(uri, '_blank', ''); | ||
return true; | ||
} | ||
return false; | ||
} | ||
function savePng(uri, name) { | ||
var canvas = document.createElement('canvas'); | ||
var context = canvas.getContext('2d'); | ||
var image = new Image(); | ||
image.onload = function () { | ||
canvas.width = image.width; | ||
canvas.height = image.height; | ||
context.drawImage(image, 0, 0); | ||
if (isDefined(window.saveAs) && isDefined(canvas.toBlob)) { | ||
canvas.toBlob(function (blob) { | ||
saveAs(blob, name); | ||
}); | ||
} else { | ||
saveUri(canvas.toDataURL('image/png'), name); | ||
} | ||
}; | ||
image.src = uri; | ||
return true; | ||
} | ||
/* global saveAs, Blob */ | ||
// inheritable styles may be overridden by parent, always copy for now | ||
@@ -294,0 +232,0 @@ inheritableAttrs.forEach(function (k) { |
{ | ||
"name": "svgsaver", | ||
"version": "0.6.1", | ||
"version": "0.6.2", | ||
"description": "download an SVG element with css styles", | ||
@@ -11,3 +11,3 @@ "main": "lib/svgsaver.js", | ||
"uglify": "uglifyjs browser.js -o browser.min.js", | ||
"test": "npm run zuul:phantom", | ||
"test": "npm run check && npm run zuul:phantom", | ||
"compile": "npm run rollup && npm run browserify && npm run uglify", | ||
@@ -36,17 +36,17 @@ "build": "npm run compile && npm run jsdoc2md", | ||
"devDependencies": { | ||
"babel": "^5.8.23", | ||
"babel": "^5.8.38", | ||
"babelify": "^6.4.0", | ||
"browserify": "^11.2.0", | ||
"browserify": "^13.1.1", | ||
"dependency-check": "^2.5.1", | ||
"dmd": "^1.2.0", | ||
"jsdoc-parse": "^1.1.0", | ||
"live-server": "^0.8.1", | ||
"phantomjs": "^1.9.18", | ||
"rollup": "^0.16.4", | ||
"semistandard": "^7.0.2", | ||
"dmd": "^1.4.2", | ||
"jsdoc-parse": "^1.2.7", | ||
"live-server": "^1.1.0", | ||
"phantomjs": "^2.1.7", | ||
"rollup": "^0.36.3", | ||
"semistandard": "^9.1.0", | ||
"tap-spec": "^4.1.0", | ||
"tape": "^4.2.2", | ||
"tape": "^4.6.2", | ||
"uglifyjs": "^2.4.10", | ||
"watch": "^0.16.0", | ||
"zuul": "^3.7.2" | ||
"watch": "^1.0.1", | ||
"zuul": "^3.11.1" | ||
}, | ||
@@ -53,0 +53,0 @@ "dependencies": { |
@@ -70,2 +70,3 @@ export const svgStyles = { // Whitelist of CSS styles and default values | ||
'xlink: href', // Xlink attribute | ||
'href', | ||
'style', 'class', | ||
@@ -72,0 +73,0 @@ 'd', 'pathLength', // Path |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
56236
1086