forked from po-ui/po-style
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathicon-generator.js
130 lines (108 loc) · 3.25 KB
/
icon-generator.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
/* ICON GENERATOR
*
* Para atualizar as classes dos ícones siga os seguintes passos:
* 1: atualizar os arquivos da pasta "/src/assets/icons/" com os arquivos enviados
* pelo time de UX;
* 2: rodar o comando "npm run build:icon";
* 3: verificar se os arquivos foram atualizados:
* - /src/css/commons/po-icon/po-icon.css
* - /src/css/commons/po-icon/po-icon.html
* - /docs/guides/icons.md
*
* ATENÇÃO1: Os ícones já existentes não deverão ser alterados pelo script. Caso
* aconteça, valide a alteração dos hexadecimais com o time de UX.
*
* ATENÇÃO2: Os ícones po-icon-ok e po-icon-minus são usados pelos componentes e
* são referenciados pelos seus códigos hexadecimais, caso os mesmo sejam
* alterados devem ser atualizados também.
* Os mesmos são usados pelos componentes: checkbox-group, multiselect,
* radio-group e table.
*/
const fs = require('fs');
const parseString = require('xml2js').parseString;
const xml = fs.readFileSync(__dirname + '/src/assets/icons/PortinariIcon.svg');
const xmlCleanedUnicode = xml.toString().replace(/&#x/g, '').replace(/;/g, '');
let icons = [];
parseString(xmlCleanedUnicode, (err, result) => {
const glyphs = result.svg.defs[0].font[0].glyph;
icons = glyphs
.map(glyph => ({ className: glyph['$']['glyph-name'], content: glyph['$'].unicode }))
.filter(glyph => glyph.className && glyph.content)
.sort((iconA, iconB) => {
if (iconA.className > iconB.className) {
return 1;
}
if (iconA.className < iconB.className) {
return -1;
}
return 0;
});
});
const classIcons = icons
.map(icon =>
`
.po-icon.po-icon-${icon.className}:before {
content: '\\${icon.content}';
}
`);
const sampleIcons = icons
.map(icon => `
<li>
<span class="po-icon po-icon-${icon.className}"></span>
<span>po-icon po-icon-${icon.className}</span>
</li>
`);
const sampleIconsHtml =
`<!-- GENERATE BY ICON GENERATOR -->
<style>
.icon-container {
padding: 8px;
}
.icon-container li {
list-style: none;
padding: 8px;
}
.po-icon {
font-size: 24px;
}
</style>
<article>
<section>
<div class="icon-container">
<ul>
${sampleIcons.join('')}
</ul>
</div>
</section>
</article>
`;
const docIcons = icons
.map(icon => {
return `
<li>
<a>
<span class="po-icon po-icon-${icon.className}"></span>
<span>po-icon po-icon-${icon.className}</span>
</a>
</li>
`;
})
const docIconsMD =
`[comment]: # (GENERATED BY ICON GENERATOR)
[comment]: # (@label Biblioteca de ícones)
[comment]: # (@link guides/icons)
O PO conta com uma Biblioteca de ícones disponibilizada pela equipe de UX.
### Como Usar?
\`\`\` html
<span class="po-icon po-icon-portinari"></span>
\`\`\`
<span style="font-size:50px;" class="po-icon po-icon-portinari po-icon-sample"></span>
----------------------------------------
### Ícones Disponíveis
<ul class="po-icon-list">
${docIcons.join('')}
</ul>
`;
fs.writeFileSync(__dirname + '/src/css/commons/po-icon/po-icon.css', classIcons.join(''));
fs.writeFileSync(__dirname + '/src/css/commons/po-icon/po-icon.html', sampleIconsHtml);
fs.writeFileSync(__dirname + '/docs/guides/icons.md', docIconsMD);