Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

svgsaver

Package Overview
Dependencies
Maintainers
1
Versions
24
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

svgsaver - npm Package Compare versions

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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc