forked from WeareJH/gulp-material-icons
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
138 lines (104 loc) · 3.83 KB
/
index.js
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
var Transform = require("stream").Transform;
var File = require("gulp-util").File;
var gutil = require("gulp-util");
var cloneDeep = require("lodash.clonedeep");
const PLUGIN_NAME = "gulp-material-icons";
module.exports = function (opts) {
opts = opts || {};
var items = [];
if (!opts.tasks) {
throw new gutil.PluginError({
plugin: PLUGIN_NAME,
message: "You didn't provide the required `tasks` array"
});
}
opts.tasks.forEach(function (task) {
return task.fills.forEach(function (fill, i) {
var clone = cloneDeep(task);
clone.fill = fill;
clone.id = task.ids[i];
clone.icons = task.icons.reduce(function (all, item) {
var split = item.split("/");
var key = split[0];
var icon = split[1];
if (!all[key]) {
all[key] = [icon];
} else {
all[key].push(icon);
}
return all;
}, {});
items.push(clone);
});
});
var ts = new Transform({objectMode: true});
ts._write = function (file, enc, next) {
var xml2js = require("xml2js");
var parseString = require("xml2js").parseString;
var builder = new xml2js.Builder();
var stream = this;
var key = require("path").relative(process.cwd(), file.path);
parseString(file.contents.toString(), function (err, result) {
srcs[key].tasks.forEach(function (task) {
var endname = task.name;
if (task.fill) {
result.svg.path[0].$.fill = task.fill;
}
if (task.id) {
endname += "-" + task.id;
}
if (task.size) {
endname += "-" + task.size;
}
stream.push(new File({
path: endname + ".svg",
cwd: file.cwd,
contents: new Buffer(builder.buildObject(result))
}));
});
next();
});
};
var srcs = {};
items.forEach(function (item) {
Object.keys(item.icons).forEach(function (key) {
var prefix = require("path").dirname(require.resolve("material-design-icons")) +
"/" + key + "/svg/production/";
if (!require("fs").existsSync(require("path").resolve(prefix))) {
throw new gutil.PluginError({
plugin: PLUGIN_NAME,
message: "Section " + prefix + " does not exist"
});
}
var icons = item.icons[key];
icons.forEach(function (name) {
item.sizes.forEach(function (size) {
var src = prefix + "ic_" + name + "_" + size + "px.svg";
src = require("path").relative(process.cwd(), src);
if (!require("fs").existsSync(src)) {
throw new gutil.PluginError({
plugin: PLUGIN_NAME,
message: src + " Does not exist..."
});
}
if (!srcs[src]) {
srcs[src] = {
tasks: [getTasks(item, name, size)]
};
} else {
srcs[src].tasks = srcs[src].tasks.concat(getTasks(item, name, size));
}
});
});
});
});
function getTasks(item, name, size) {
return {
fill: item.fill || false,
id: item.id,
name: name,
size: size
};
}
return require("vinyl-fs").src(Object.keys(srcs)).pipe(ts);
};