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
| const micromatch = require('micromatch');
|
| const { getRoot } = require('../utils');
|
| const defaultConfig = {
| id: undefined,
| preserve: [
| 'viewBox',
| 'preserveAspectRatio',
| 'class',
| 'overflow',
| 'stroke?(-*)',
| 'fill?(-*)',
| 'xmlns?(:*)',
| 'role',
| 'aria-*'
| ]
| };
|
| /**
| * @param {Object} [config] {@see defaultConfig}
| * @return {Function} PostHTML plugin
| */
| function svgToSymbol(config = null) {
| const cfg = Object.assign({}, defaultConfig, config);
|
| return (tree) => {
| const root = getRoot(tree);
| root.tag = 'symbol';
| root.attrs = root.attrs || {};
|
| const attrNames = Object.keys(root.attrs);
| const attrNamesToPreserve = micromatch(attrNames, cfg.preserve);
|
| attrNames.forEach((name) => {
| if (!attrNamesToPreserve.includes(name)) {
| delete root.attrs[name];
| }
| });
|
| if (cfg.id) {
| root.attrs.id = cfg.id;
| }
|
| // Remove all elements and add symbol node
| tree.splice(0, tree.length, root);
|
| return tree;
| };
| }
|
| module.exports = svgToSymbol;
|
|