aboutsummaryrefslogtreecommitdiff
path: root/node_modules/svgo/plugins/moveElemsAttrsToGroup.js
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/svgo/plugins/moveElemsAttrsToGroup.js
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/svgo/plugins/moveElemsAttrsToGroup.js')
-rw-r--r--node_modules/svgo/plugins/moveElemsAttrsToGroup.js126
1 files changed, 126 insertions, 0 deletions
diff --git a/node_modules/svgo/plugins/moveElemsAttrsToGroup.js b/node_modules/svgo/plugins/moveElemsAttrsToGroup.js
new file mode 100644
index 00000000..0f3b65c7
--- /dev/null
+++ b/node_modules/svgo/plugins/moveElemsAttrsToGroup.js
@@ -0,0 +1,126 @@
+'use strict';
+
+exports.type = 'perItemReverse';
+
+exports.active = true;
+
+exports.description = 'moves elements attributes to the existing group wrapper';
+
+var inheritableAttrs = require('./_collections').inheritableAttrs,
+ pathElems = require('./_collections.js').pathElems;
+
+/**
+ * Collapse content's intersected and inheritable
+ * attributes to the existing group wrapper.
+ *
+ * @example
+ * <g attr1="val1">
+ * <g attr2="val2">
+ * text
+ * </g>
+ * <circle attr2="val2" attr3="val3"/>
+ * </g>
+ * ⬇
+ * <g attr1="val1" attr2="val2">
+ * <g>
+ * text
+ * </g>
+ * <circle attr3="val3"/>
+ * </g>
+ *
+ * @param {Object} item current iteration item
+ * @return {Boolean} if false, item will be filtered out
+ *
+ * @author Kir Belevich
+ */
+exports.fn = function(item) {
+
+ if (item.isElem('g') && !item.isEmpty() && item.content.length > 1) {
+
+ var intersection = {},
+ hasTransform = false,
+ hasClip = item.hasAttr('clip-path') || item.hasAttr('mask'),
+ intersected = item.content.every(function(inner) {
+ if (inner.isElem() && inner.hasAttr()) {
+ // don't mess with possible styles (hack until CSS parsing is implemented)
+ if (inner.hasAttr('class')) return false;
+ if (!Object.keys(intersection).length) {
+ intersection = inner.attrs;
+ } else {
+ intersection = intersectInheritableAttrs(intersection, inner.attrs);
+
+ if (!intersection) return false;
+ }
+
+ return true;
+ }
+ }),
+ allPath = item.content.every(function(inner) {
+ return inner.isElem(pathElems);
+ });
+
+ if (intersected) {
+
+ item.content.forEach(function(g) {
+
+ for (var name in intersection) {
+
+ if (!allPath && !hasClip || name !== 'transform') {
+
+ g.removeAttr(name);
+
+ if (name === 'transform') {
+ if (!hasTransform) {
+ if (item.hasAttr('transform')) {
+ item.attr('transform').value += ' ' + intersection[name].value;
+ } else {
+ item.addAttr(intersection[name]);
+ }
+
+ hasTransform = true;
+ }
+ } else {
+ item.addAttr(intersection[name]);
+ }
+
+ }
+ }
+
+ });
+
+ }
+
+ }
+
+};
+
+/**
+ * Intersect inheritable attributes.
+ *
+ * @param {Object} a first attrs object
+ * @param {Object} b second attrs object
+ *
+ * @return {Object} intersected attrs object
+ */
+function intersectInheritableAttrs(a, b) {
+
+ var c = {};
+
+ for (var n in a) {
+ if (
+ b.hasOwnProperty(n) &&
+ inheritableAttrs.indexOf(n) > -1 &&
+ a[n].name === b[n].name &&
+ a[n].value === b[n].value &&
+ a[n].prefix === b[n].prefix &&
+ a[n].local === b[n].local
+ ) {
+ c[n] = a[n];
+ }
+ }
+
+ if (!Object.keys(c).length) return false;
+
+ return c;
+
+}