-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathremoveUnknownsAndDefaults.js
More file actions
120 lines (95 loc) · 3.12 KB
/
removeUnknownsAndDefaults.js
File metadata and controls
120 lines (95 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
'use strict';
exports.type = 'perItem';
exports.active = true;
exports.params = {
SVGid: true,
unknownContent: true,
unknownAttrs: true,
defaultAttrs: true
};
var collections = require('./_collections'),
elems = collections.elems,
attrsGroups = collections.attrsGroups,
elemsGroups = collections.elemsGroups,
attrsGroupsDefaults = collections.attrsGroupsDefaults;
// collect and extend all references
for (var elem in elems) {
elem = elems[elem];
if (elem.attrsGroups) {
elem.attrs = elem.attrs || [];
elem.attrsGroups.forEach(function(attrsGroupName) {
elem.attrs = elem.attrs.concat(attrsGroups[attrsGroupName]);
var groupDefaults = attrsGroupsDefaults[attrsGroupName];
if (groupDefaults) {
elem.defaults = elem.defaults || {};
for(var attrName in groupDefaults) {
elem.defaults[attrName] = groupDefaults[attrName];
}
}
});
}
if (elem.contentGroups) {
elem.content = elem.content || [];
elem.contentGroups.forEach(function(contentGroupName) {
elem.content = elem.content.concat(elemsGroups[contentGroupName]);
});
}
}
/**
* Remove unknown elements content and attributes,
* remove attributes with default values.
*
* @param {Object} item current iteration item
* @param {Object} params plugin params
* @return {Boolean} if false, item will be filtered out
*
* @author Kir Belevich
*/
exports.fn = function(item, params) {
// elems w/o namespace prefix
if (item.isElem() && !item.prefix) {
var elem = item.elem;
// remove SVG id attr
if (params.SVGid && elem === 'svg') {
item.removeAttr('id');
}
// remove unknown element's content
if (
params.unknownContent &&
!item.isEmpty() &&
elems[elem].content
) {
item.content.forEach(function(content, i) {
if (
content.isElem() &&
!content.prefix &&
elems[elem].content.indexOf(content.elem) === -1
) {
item.content.splice(i, 1);
}
});
}
// remove element's unknown attrs and attrs with default values
if (elems[elem].attrs) {
item.eachAttr(function(attr) {
if (
attr.name !== 'xmlns' &&
(attr.prefix === 'xml' || !attr.prefix)
) {
if (
// unknown attrs
(params.unknownAttrs &&
elems[elem].attrs.indexOf(attr.name) === -1) ||
// attrs with default values
(params.defaultAttrs &&
elems[elem].defaults &&
elems[elem].defaults[attr.name] === attr.value
)
) {
item.removeAttr(attr.name);
}
}
});
}
}
};