Skip to content

Commit caf29be

Browse files
committed
fix(icons-to-woff): ignore fill="none" in svgs
1 parent 1dbb1fd commit caf29be

File tree

7 files changed

+67
-22
lines changed

7 files changed

+67
-22
lines changed

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,21 @@ With this plugin it is pretty easy to use pixel images, svgs and font-icons side
8181

8282
## When should you use icon fonts over pure SVGs?
8383

84-
Icon fonts are dead - long live font icons.
8584
SVGs have some disadvantages and lack certain features especially when used inside pseudo elements:
8685

8786
* [CSS-Transform issues in older Internet Explorer versions](http://stackoverflow.com/questions/21298338/css-transform-on-svg-elements-ie9)
8887
* [IE9 - IE 11 scaling issues](https://gist.github.com/larrybotha/7881691)
8988
* Fill color doesn't work for background SVG images
9089
* Inline SVGs are resolved relative to the page not to the css
9190

91+
## What about all the rant on icon fonts?
92+
93+
Like all technologies there are disadvantages when using icon fonts.
94+
We tried to apply best practices to solve the main issues for you.
95+
96+
* Screen Reader friendly: All generated icons use the [Unicode Private Use Areas](https://en.wikipedia.org/wiki/Private_Use_Areas)
97+
* Prevents [FOUT](http://www.paulirish.com/2009/fighting-the-font-face-fout/)
98+
9299
# License
93100

94101
This project is licensed under [MIT](https://github.com/jantimon/iconfont-webpack-plugin/blob/master/LICENSE).

example/default/account.svg

Lines changed: 1 addition & 13 deletions
Loading

example/default/dist/index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
<link rel="stylesheet" type="text/css" href="./styles.css">
12
<script src="bundle.js"></script>
2-
<a>click me</a>
3+
<a href="#">click me</a>

example/default/dist/styles.css

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
@font-face {
22
font-family: i96002e;
3-
src: url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAQkAAsAAAAABlAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIwleU9TLzIAAAFEAAAAOwAAAFYvsTmFY21hcAAAAYAAAABKAAABcOEoo6pnbHlmAAABzAAAAJQAAACkZGNj1mhlYWQAAAJgAAAALAAAADYI84ykaGhlYQAAAowAAAAZAAAAJAPZAgNobXR4AAACqAAAAAgAAAAIAgAAAGxvY2EAAAKwAAAABgAAAAYAUgAAbWF4cAAAArgAAAAeAAAAIAENAEBuYW1lAAAC2AAAASkAAAIWm5e+CnBvc3QAAAQEAAAAHwAAADCXn3B2eJxjYGRgYOBiMGCwY2DKSSzJY+BzcfMJYZBiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCAClZBUgAeJxjYGRkYJzAwMrAwBDPmAYk3aH0VwZJhhYGBiYGVmYGrCAgzTWFweEBwwOgGiDQY4IIM4IIAGDIB5oAeJztkLENgDAQA8/KQ4EYgSo1s1Cxv9gk+RjYIpbOkk9fPbAAJTmTAN2IkSut7AubfVB9E8M/tPZ37nCjlZndfXzLv3pBHRomCVEAAHicFYrLCoMwEACza9yNJrpWIYEWEbS0goc+BHOqnvv/l177J7Uzt2EUqB34wFfNSsXl7wYrbDjHG8Q5Lpc9rRB8BwKBSYCYBsEOffA8aZ1bKQ9187ifCu0ICRHIOLl2/uhTkwImSZKyEZc/NRtNupfq3I61K/azX1wvPnBRWaGMnX0HMIYyy/lUtq8hs65uflchDfh4nGNgZGBgAOLVr5/Xx/PbfGXgZmIAgcv/lj5GphlvMD4EUhwMYGkAgX0NInicY2BkYGBiAAEIyXiDgZEBFTABABDqAOIAAAAAAAAAAgAAAAAAAAAAUgAAeJxjYGRgYGBiMGEA0SAWAwMXEDIw/AfzGQANqwFOAAB4nGWQPW7CQBSEx2BIAlKCFCkps1UKIpmfkgNAT0GXwpi1MbK91npBossJcoQcIaeIcoIcKGPzaGAtP38zb97uygAG+IWHenm4bWq9WrihOnGb9CDsk5+FO+jjRbhLfyjcwxumwn084p07eP4dnQFK4Rbu8SHcpv8p7JO/hDt4wrdwl/6PcA8r/An38eoN08gUsSncUif7LLRnef6utK1SU6hJMD5bC11oGzq9Ueujqg7J1LlYxdbkas6uzjKjSmt2OnLB1rlyNhrF4geRyZEigkGBuKkOS2gk2CNDCHvVvdQrpi0q+rVWmCDA+Cq1YKpokiGVxobJNY6sFQ48bUrXMa34Ws7kpLnMat4kIyv+77q3oxPRD7BtpkrMMOITX+SD5g75Pz0RXqgAAAB4nGNgYoAAVgbsgImRiZGZgS0zOT9P14CBAQAN+wIdAA==") format('woff');
3+
src: url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAQwAAsAAAAABkwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIwleU9TLzIAAAFEAAAAPwAAAFYvsjszY21hcAAAAYQAAABKAAABcOEoo6pnbHlmAAAB0AAAAJgAAACkgs5VC2hlYWQAAAJoAAAALgAAADYJC91ZaGhlYQAAApgAAAAeAAAAJAPxAe9obXR4AAACuAAAAAgAAAAIAe7//2xvY2EAAALAAAAABgAAAAYAUgAAbWF4cAAAAsgAAAAeAAAAIAENAEBuYW1lAAAC6AAAASkAAAIWm5e+CnBvc3QAAAQUAAAAGwAAACxqPAEEeJxjYGRgYOBiMGCwY2DKSSzJY+BzcfMJYZBiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCAClZBUgAeJxjYGT4zjiBgZWBgdGSMY2BgcEdSn9lkGRoYWBgYmBlZsAKAtJcUxgcHjA8AKoBAj0mZgZGIA3CDACcLwhKAHic7ZCxDYAwEAPPykOBGIEqNbNQsb/YJPkY2CKWzpJPXz2wACU5kwDdiJErrewLm31QfRPDP7T2d+5wo5WZ3X18y796QR0aJglRAAB4nA2IQQ6CMBAAu9vSLVBaqVJMDxKNgWiMhpDQhAPc/IH//4I/0M4kcxgGvwR8kbOJsXGOyQ1W2HCKL4hTnPu0Vmh9BxZakhZkCu/Qt54yobWr902zxM6KijghAuXGPa7hdMxyiSC4kCqvrV4yVQgSrr6fn94YjjCstnchKOsqR6Uy+hNQFVRqVcK4u7xvhbYHz9gfcc4RpXicY2BkYGAA4pNz7BPj+W2+MnAzMYDA5X/ndGH0fyBg/MDEDORyMIClAXeIDkgAAHicY2BkYGBiAAHGd//////H+IGBkQEVMAEAg2cF4gAAAAAAAAHu//8AAAAAAFIAAHicY2BkYGBgYjBhANEgFgMDFxAyMPwH8xkADasBTgAAeJxlkD1uwkAUhMdgSAJSghQpKbNVCiKZn5IDQE9Bl8KYtTGyvdZ6QaLLCXKEHCGniHKCHChj82hgLT9/M2/e7soABviFh3p5uG1qvVq4oTpxm/Qg7JOfhTvo40W4S38o3MMbpsJ9POKdO3j+HZ0BSuEW7vEh3Kb/KeyTv4Q7eMK3cJf+j3APK/wJ9/HqDdPIFLEp3FIn+yy0Z3n+rrStUlOoSTA+WwtdaBs6vVHro6oOydS5WMXW5GrOrs4yo0prdjpywda5cjYaxeIHkcmRIoJBgbipDktoJNgjQwh71b3UK6YtKvq1VpggwPgqtWCqaJIhlcaGyTWOrBUOPG1K1zGt+FrO5KS5zGreJCMr/u+6t6MT0Q+wbaZKzDDiE1/kg+YO+T89EV6oAAAAeJxjYGKAAFYG7ICJkYmRmYEp04CBAQADvgCsAA==") format('woff');
4+
font-weight: normal;
5+
font-style: normal;
46
}
57

68
a:before {
79
font-family: i96002e;
10+
text-rendering: auto;
11+
-webkit-font-smoothing: auto;
12+
-moz-osx-font-smoothing: auto;
13+
font-weight: normal;
814
content: '\E000';
915
transition: 0.5s color;
1016
}

lib/icons-to-woff.js

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var assert = require('assert');
22
var svgicons2svgfont = require('svgicons2svgfont');
33
var svg2ttf = require('svg2ttf');
44
var ttf2woff = require('ttf2woff');
5+
var Readable = require('stream').Readable;
56
var fs = require('fs');
67

78
module.exports = function createIconFont (icons, options) {
@@ -11,7 +12,10 @@ module.exports = function createIconFont (icons, options) {
1112
name: options.name,
1213
normalize: true,
1314
fontHeight: 512,
14-
log: function () {}
15+
log: function () {},
16+
error: function (err) {
17+
reject(err);
18+
}
1519
});
1620
var svgFont = '';
1721
fontStream
@@ -25,16 +29,26 @@ module.exports = function createIconFont (icons, options) {
2529
reject(err);
2630
});
2731
icons.forEach((filename, i) => {
28-
var glyph = fs.createReadStream(filename);
32+
var glyph = new Readable();
33+
glyph._read = function noop () {};
2934
glyph.metadata = {
3035
unicode: [String.fromCodePoint('\ue000'.charCodeAt(0) + i)],
31-
name: 'icon-' + i
36+
name: 'i' + i
3237
};
3338
fontStream.write(glyph);
39+
fs.readFile(filename, 'utf8', function (err, result) {
40+
if (err) {
41+
return reject(err);
42+
}
43+
// prevent svgs with fill="none" from beeing translated into an empty symbol
44+
result = result.replace(/\sfill\s*=\s*["']?none['"]?/ig, '');
45+
glyph.push(result);
46+
glyph.push(null);
47+
});
3448
});
3549
fontStream.end();
3650
})
3751
.then((svgFont) => svg2ttf(svgFont, {}).buffer)
3852
.then((ttfFont) => ttf2woff(ttfFont).buffer)
39-
.then((wofffont) => new Buffer(wofffont).toString('base64'));
53+
.then((woffFont) => new Buffer(woffFont).toString('base64'));
4054
};

lib/loader.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,12 @@ module.exports = function () {
1414
.then((result) => {
1515
var url = '"data:application/x-font-woff;charset=utf-8;base64,' + result + '"';
1616
callback(null, 'module.exports=' + JSON.stringify(url) + ';');
17-
}, callback);
17+
}, function (err) {
18+
var url = '"data:application/x-font-woff;charset=utf-8;base64,"';
19+
if (typeof err === 'string') {
20+
err = new Error(err);
21+
}
22+
err.message += ' - Tried to compile: ' + JSON.stringify(query.svgs, null, 2);
23+
callback(new Error(err), 'module.exports=' + JSON.stringify(url) + ';');
24+
});
1825
};

lib/postcss-plugin.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,22 @@ function replaceIconFontDeclarations (fontName, postCssRoot, unresolvedSvgPaths)
4949
prop: 'font-family',
5050
value: fontName
5151
});
52+
decl.cloneBefore({
53+
prop: 'text-rendering',
54+
value: 'auto'
55+
});
56+
decl.cloneBefore({
57+
prop: '-webkit-font-smoothing',
58+
value: 'auto'
59+
});
60+
decl.cloneBefore({
61+
prop: '-moz-osx-font-smoothing',
62+
value: 'auto'
63+
});
64+
decl.cloneBefore({
65+
prop: 'font-weight',
66+
value: 'normal'
67+
});
5268
// Look up the index of the svg in the array to generate the unicode char position
5369
var iconCharCode = unresolvedSvgPaths.indexOf(getRelativeIconPath(decl.value));
5470
decl.value = '\'\\e' + _.padStart(iconCharCode.toString(16), 3, '0') + '\'';
@@ -70,7 +86,13 @@ function addFontDeclaration (fontName, postCssRoot, resolvedSvgs) {
7086
// Use ~ to tell the loader-utils of the css loader that this is a webpack path
7187
// Use !! to tell webpack that we don't want any other loader to kick in
7288
var url = '~!!' + require.resolve('./loader.js') + '?' + JSON.stringify(options) + '!' + require.resolve('../');
73-
postCssRoot.prepend(postcss.parse('@font-face { font-family: ' + fontName + '; src:url(\'' + url + '\') format(\'woff\') }'));
89+
postCssRoot.prepend(postcss.parse(
90+
'@font-face { ' +
91+
'font-family: ' + fontName + '; src:url(\'' + url + '\') format(\'woff\');' +
92+
'font-weight: normal;' +
93+
'font-style: normal;' +
94+
'}'
95+
));
7496
}
7597

7698
module.exports = postcss.plugin('iconfont-webpack', function (opts) {

0 commit comments

Comments
 (0)