-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
86 lines (72 loc) · 2.82 KB
/
index.js
File metadata and controls
86 lines (72 loc) · 2.82 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
const fs = require('fs');
const folders = ['./icons/svg/brands', './icons/svg/regular', './icons/svg/solid'];
// Method to clean up SVG 'strings'
const add = string => {
return string
.replace(/<\?xml (.*?)\?>/g, '')
.replace(/<!DOCTYPE(.*?)>/g, '')
.replace(/PUBLIC "(.*?)"/g, '')
.replace(/width="(.*?)"/g, '')
.replace(/height="(.*?)"/g, '')
.replace(/id="(.*?)"/g, '')
.replace(/class="(.*?)"/g, '')
.replace(/fill="(.*?)"/g, '')
.replace(/opacity="(.*?)"/g, '')
.replace(/stroke="(.*?)"/g, '')
.replace(/stroke-width="(.*?)"/g, '')
.replace(/ {3}stroke-/g, '')
.replace(/<g >/g, '<g>')
.replace(/path {3}/g, 'path ')
.replace(/path /g, 'path fill="currentColor" stroke="currentColor" strokeWidth="1" ')
.replace(/svg {3}/g, 'svg ')
.replace(/svg /g, 'svg fill="currentColor" ')
.replace(/(\r\n)+|\r+|\n+|\t+/igm, '')
.replace(/"/g, "'")
// Allow for prop drilling
.replace(/<svg(.*)>/, instance => instance.replace('>', ' { ...props }>'));
};
const createMultipleFiles = (names, folder) => {
names.forEach(name => {
let svg = fs.readFileSync(`${folder}/${name.originalFileName}`, { encoding: 'utf8' });
// Fix slight top cut off on the emoji icons
if(name.componentName.toUpperCase().includes('EMOJI'))
svg = svg.replace(/viewBox="(.*?)"/g, 'viewBox="-5 -5 210 210"');
// Template for component
const component = 'import React from \'react\';' + '\n\n' +
add(`export const ${add(name.componentName)}Icon = props => {`) + '\n' +
' return (' + '\n' +
` ${add(svg)}` + '\n' +
' );' + '\n' +
'};';
if(name.originalFileName.includes('.svg')) {
const directory = folder.split('/').reverse()[0];
// If output directory doesn't exist, create one
if(!fs.existsSync('./src')) fs.mkdirSync('./src');
if(!fs.existsSync('./src/icons')) fs.mkdirSync('./src/icons');
if(!fs.existsSync(`./src/icons/${directory}`)) fs.mkdirSync(`./src/icons/${directory}`);
// Write component to output directory
fs.writeFileSync(add(`./src/icons/${directory}/${name.newFileName}Icon.js`), component);
}
});
};
// Convert text with dashes into PascalCase
const pascalCased = string => {
return string.charAt(0).toUpperCase() +
string.replace(/-([a-z])/g, letters => letters[1].toUpperCase()).slice(1);
};
// Determine option for single or multiple files
// const option = process.argv[2];
folders.forEach(folder => {
// Determine filename, new filename, and component name
const files = fs.readdirSync(folder).reduce((accumulator, file) => {
return [
...accumulator,
{
originalFileName: file,
newFileName: pascalCased(file).replace('.svg', ''),
componentName: pascalCased(file).replace('.svg', '')
}
];
}, []);
createMultipleFiles(files, folder);
});