0
Fork 0
mirror of https://github.com/penpot/penpot.git synced 2025-02-11 01:28:30 -05:00

Make svgclean behave exactly as svgo.

This commit is contained in:
Andrey Antukh 2021-01-11 11:08:40 +01:00
parent 3135de3eb3
commit 031123b2ca
5 changed files with 356 additions and 97 deletions

File diff suppressed because one or more lines are too long

View file

@ -1,41 +1,13 @@
const plugins = { const plugins = [
// prefixIds: true, {removeDimensions: true},
cleanupAttrs: true, {removeXMLNS: true},
// cleanupEnableBackground: true, {removeScriptElement: true},
// cleanupIDs: true, {removeViewBox: false},
cleanupNumericValues: true, {moveElemsAttrsToGroup: false}
collapseGroups: true, ];
convertColors: true,
convertEllipseToCircle: true,
convertPathData: true,
convertShapeToPath: true,
convertStyleToAttrs: true,
convertTransform: true,
inlineStyles: true,
mergePaths: false,
minifyStyles: true,
removeComments: true,
removeDesc: true,
removeDimensions: false,
removeDoctype: true,
removeEditorsNSData: true,
removeEmptyAttrs: true,
removeEmptyContainers: true,
removeEmptyText: true,
removeHiddenElems: true,
removeNonInheritableGroupAttrs: true,
removeRasterImages: true,
removeTitle: true,
removeUnknownsAndDefaults: true,
removeUnusedNS: true,
removeUselessDefs: true,
removeUselessStrokeAndFill: true,
removeXMLNS: true,
removeXMLProcInst: true
};
const svgc = require("./src/svgclean.js"); const svgc = require("./src/svgclean.js");
const inst = svgc.configure({plugins}); const inst = svgc.configure({plugins, multipass: undefined});
exports.optimize = function(data) { exports.optimize = function(data) {
return svgc.optimize(inst, data) return svgc.optimize(inst, data)

268
vendor/svgclean/package-lock.json generated vendored
View file

@ -4,6 +4,12 @@
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"@types/q": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
"integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
"dev": true
},
"@ungap/promise-all-settled": { "@ungap/promise-all-settled": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
@ -701,6 +707,75 @@
} }
} }
}, },
"coa": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
"integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
"dev": true,
"requires": {
"@types/q": "^1.5.1",
"chalk": "^2.4.1",
"q": "^1.1.2"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
}
}
},
"color-convert": { "color-convert": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@ -2615,6 +2690,12 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true "dev": true
}, },
"q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
"integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
"dev": true
},
"qs": { "qs": {
"version": "6.5.2", "version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
@ -3170,6 +3251,193 @@
"has-flag": "^4.0.0" "has-flag": "^4.0.0"
} }
}, },
"svgo": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
"integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
"dev": true,
"requires": {
"chalk": "^2.4.1",
"coa": "^2.0.2",
"css-select": "^2.0.0",
"css-select-base-adapter": "^0.1.1",
"css-tree": "1.0.0-alpha.37",
"csso": "^4.0.2",
"js-yaml": "^3.13.1",
"mkdirp": "~0.5.1",
"object.values": "^1.1.0",
"sax": "~1.2.4",
"stable": "^0.1.8",
"unquote": "~1.1.1",
"util.promisify": "~1.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"css-select": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
"integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
"dev": true,
"requires": {
"boolbase": "^1.0.0",
"css-what": "^3.2.1",
"domutils": "^1.7.0",
"nth-check": "^1.0.2"
}
},
"css-tree": {
"version": "1.0.0-alpha.37",
"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
"integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
"dev": true,
"requires": {
"mdn-data": "2.0.4",
"source-map": "^0.6.1"
}
},
"css-what": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
"integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
"dev": true
},
"dom-serializer": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
"integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
"dev": true,
"requires": {
"domelementtype": "^2.0.1",
"entities": "^2.0.0"
},
"dependencies": {
"domelementtype": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
"integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
"dev": true
}
}
},
"domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
"dev": true
},
"domutils": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
"integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
"dev": true,
"requires": {
"dom-serializer": "0",
"domelementtype": "1"
}
},
"es-abstract": {
"version": "1.17.7",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
"integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
"dev": true,
"requires": {
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.1",
"is-callable": "^1.2.2",
"is-regex": "^1.1.1",
"object-inspect": "^1.8.0",
"object-keys": "^1.1.1",
"object.assign": "^4.1.1",
"string.prototype.trimend": "^1.0.1",
"string.prototype.trimstart": "^1.0.1"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"mdn-data": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
"integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
"dev": true
},
"nth-check": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
"integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
"dev": true,
"requires": {
"boolbase": "~1.0.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"util.promisify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
"integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
"dev": true,
"requires": {
"define-properties": "^1.1.3",
"es-abstract": "^1.17.2",
"has-symbols": "^1.0.1",
"object.getownpropertydescriptors": "^2.1.0"
}
}
}
},
"syntax-error": { "syntax-error": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",

View file

@ -9,7 +9,6 @@
"build": "browserify -r./main.js:svgclean -o bundle.js", "build": "browserify -r./main.js:svgclean -o bundle.js",
"minify": "terser bundle.js -c -m -o bundle.min.js", "minify": "terser bundle.js -c -m -o bundle.min.js",
"dist": "npm run build && npm run minify" "dist": "npm run build && npm run minify"
}, },
"dependencies": { "dependencies": {
"chalk": "^4.1.0", "chalk": "^4.1.0",
@ -33,6 +32,7 @@
"mocha-istanbul": "^0.3.0", "mocha-istanbul": "^0.3.0",
"mock-stdin": "^1.0.0", "mock-stdin": "^1.0.0",
"should": "~13.2.3", "should": "~13.2.3",
"svgo": "^1.3.2",
"terser": "^5.5.1" "terser": "^5.5.1"
}, },
"license": "MIT" "license": "MIT"

View file

@ -108,46 +108,57 @@ const builtinPlugins = {
sortDefsChildren, sortDefsChildren,
}; };
const defaultPlugins = { const defaultPlugins = [
prefixIds: true, "removeDoctype",
cleanupAttrs: true, "removeXMLProcInst",
cleanupEnableBackground: true, "removeComments",
cleanupIDs: true, "removeMetadata",
cleanupNumericValues: true, "removeXMLNS",
collapseGroups: true, "removeEditorsNSData",
convertColors: true, "cleanupAttrs",
convertEllipseToCircle: true, "inlineStyles",
convertPathData: true, "minifyStyles",
convertShapeToPath: true, "convertStyleToAttrs",
convertStyleToAttrs: true, "cleanupIDs",
convertTransform: true, "prefixIds",
inlineStyles: true, "removeRasterImages",
mergePaths: false, "removeUselessDefs",
minifyStyles: true, "cleanupNumericValues",
moveElemsAttrsToGroup: false, "cleanupListOfValues",
moveGroupAttrsToElems: false, "convertColors",
removeComments: true, "removeUnknownsAndDefaults",
removeDesc: true, "removeNonInheritableGroupAttrs",
removeDimensions: false, "removeUselessStrokeAndFill",
removeDoctype: true, "removeViewBox",
removeEditorsNSData: true, "cleanupEnableBackground",
removeEmptyAttrs: true, "removeHiddenElems",
removeEmptyContainers: true, "removeEmptyText",
removeEmptyText: true, "convertShapeToPath",
removeHiddenElems: true, "convertEllipseToCircle",
removeNonInheritableGroupAttrs: true, "moveElemsAttrsToGroup",
removeRasterImages: true, "moveGroupAttrsToElems",
removeTitle: true, "collapseGroups",
removeUnknownsAndDefaults: true, "convertPathData",
removeUnusedNS: true, "convertTransform",
removeUselessDefs: true, "removeEmptyAttrs",
removeUselessStrokeAndFill: true, "removeEmptyContainers",
removeViewBox: false, "mergePaths",
removeXMLNS: true, "removeUnusedNS",
removeXMLProcInst: true, "sortAttrs",
sortAttrs: false, "sortDefsChildren",
sortDefsChildren: true "removeTitle",
}; "removeDesc",
"removeDimensions",
"removeAttrs",
"removeAttributesBySelector",
"removeElementsByAttr",
"addClassesToSVGElement",
"removeStyleElement",
"removeScriptElement",
"addAttributesToSVGElement",
"removeOffCanvasPaths",
"reusePaths"
];
function optimizePlugins(plugins) { function optimizePlugins(plugins) {
let prev; let prev;
@ -163,27 +174,35 @@ function optimizePlugins(plugins) {
} }
exports.loadPlugins = function(config={}) { exports.loadPlugins = function(config={}) {
let plugins = Object.assign({}, config.plugins || defaultPlugins); let configured = [];
let configuredPlugins = [];
for (let key of Object.keys(plugins)) { for (let name of defaultPlugins) {
let pluginOpt = plugins[key]; const plugin = Object.assign({}, builtinPlugins[name]);
let plugin = null; plugin.name = name;
configured.push(plugin);
if (typeof pluginOpt === "object") {
plugin = Object.assign({}, builtinPlugins[key]);
plugin.params = Object.assign({}, pluginOpt);
} else if (pluginOpt === true) {
plugin = Object.assign({}, builtinPlugins[key]);
} else {
continue;
}
plugin.active = true;
configuredPlugins.push(plugin);
} }
return optimizePlugins(configuredPlugins); for (let item of config.plugins || []) {
const name = Object.keys(item)[0];
const opts = item[name];
if (typeof opts === "object") {
configured.forEach(function(plugin) {
if (plugin.name === name) {
plugin.active = true;
plugin.params = Object.assign({}, plugin.params, opts);
}
});
} else if (typeof opts === "boolean") {
configured.forEach(function(plugin) {
if (plugin.name === name) {
plugin.active = opts;
}
});
}
}
return optimizePlugins(configured);
}; };
exports.executePlugins = function(plugins, data, info) { exports.executePlugins = function(plugins, data, info) {