Skip to content

Commit 141ac91

Browse files
committed
feat(icons-to-woff): Allow to generate variable height fonts
1 parent 3671d0c commit 141ac91

File tree

5 files changed

+36
-8
lines changed

5 files changed

+36
-8
lines changed

example/default/dist/styles.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@font-face {
22
font-family: M6002e;
3-
src: url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAQwAAsAAAAABkwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIwleU9TLzIAAAFEAAAAPwAAAFYvsjszY21hcAAAAYQAAABKAAABcOEoo6pnbHlmAAAB0AAAAJgAAACkgs5VC2hlYWQAAAJoAAAALwAAADYJDAPFaGhlYQAAApgAAAAeAAAAJAPxAe9obXR4AAACuAAAAAgAAAAIAe7//2xvY2EAAALAAAAABgAAAAYAUgAAbWF4cAAAAsgAAAAeAAAAIAENAEBuYW1lAAAC6AAAASkAAAIWm5e+CnBvc3QAAAQUAAAAGwAAACxqPAEEeJxjYGRgYOBiMGCwY2DKSSzJY+BzcfMJYZBiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCAClZBUgAeJxjYGT4zjiBgZWBgdGSMY2BgcEdSn9lkGRoYWBgYmBlZsAKAtJcUxgcHjA8AKoBAj0mZgZGIA3CDACcLwhKAHic7ZCxDYAwEAPPykOBGIEqNbNQsb/YJPkY2CKWzpJPXz2wACU5kwDdiJErrewLm31QfRPDP7T2d+5wo5WZ3X18y796QR0aJglRAAB4nA2IQQ6CMBAAu9vSLVBaqVJMDxKNgWiMhpDQhAPc/IH//4I/0M4kcxgGvwR8kbOJsXGOyQ1W2HCKL4hTnPu0Vmh9BxZakhZkCu/Qt54yobWr902zxM6KijghAuXGPa7hdMxyiSC4kCqvrV4yVQgSrr6fn94YjjCstnchKOsqR6Uy+hNQFVRqVcK4u7xvhbYHz9gfcc4RpXicY2BkYGAA4pOzP3XG89t8ZeBmYgCBy/8eJsPo/0DA+IGJGcjlYABLAwCqGw+0AHicY2BkYGBiAAHGd//////H+IGBkQEVMAEAg2cF4gAAAAAAAAHu//8AAAAAAFIAAHicY2BkYGBgYjBhANEgFgMDFxAyMPwH8xkADasBTgAAeJxlkD1uwkAUhMdgSAJSghQpKbNVCiKZn5IDQE9Bl8KYtTGyvdZ6QaLLCXKEHCGniHKCHChj82hgLT9/M2/e7soABviFh3p5uG1qvVq4oTpxm/Qg7JOfhTvo40W4S38o3MMbpsJ9POKdO3j+HZ0BSuEW7vEh3Kb/KeyTv4Q7eMK3cJf+j3APK/wJ9/HqDdPIFLEp3FIn+yy0Z3n+rrStUlOoSTA+WwtdaBs6vVHro6oOydS5WMXW5GrOrs4yo0prdjpywda5cjYaxeIHkcmRIoJBgbipDktoJNgjQwh71b3UK6YtKvq1VpggwPgqtWCqaJIhlcaGyTWOrBUOPG1K1zGt+FrO5KS5zGreJCMr/u+6t6MT0Q+wbaZKzDDiE1/kg+YO+T89EV6oAAAAeJxjYGKAAFYG7ICJkYmRmYEp04CBAQADvgCsAA==") format('woff');
3+
src: url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAQwAAsAAAAABkwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADsAAABUIIwleU9TLzIAAAFEAAAAPwAAAFYvsjszY21hcAAAAYQAAABKAAABcOEoo6pnbHlmAAAB0AAAAJgAAACkgs5VC2hlYWQAAAJoAAAALgAAADYJHf2zaGhlYQAAApgAAAAeAAAAJAPxAe9obXR4AAACuAAAAAgAAAAIAe7//2xvY2EAAALAAAAABgAAAAYAUgAAbWF4cAAAAsgAAAAeAAAAIAENAEBuYW1lAAAC6AAAASkAAAIWm5e+CnBvc3QAAAQUAAAAGwAAACxqPAEEeJxjYGRgYOBiMGCwY2DKSSzJY+BzcfMJYZBiYGGAAJA8MpsxJzM9kYEDxgPKsYBpDiBmg4gCAClZBUgAeJxjYGT4zjiBgZWBgdGSMY2BgcEdSn9lkGRoYWBgYmBlZsAKAtJcUxgcHjA8AKoBAj0mZgZGIA3CDACcLwhKAHic7ZCxDYAwEAPPykOBGIEqNbNQsb/YJPkY2CKWzpJPXz2wACU5kwDdiJErrewLm31QfRPDP7T2d+5wo5WZ3X18y796QR0aJglRAAB4nA2IQQ6CMBAAu9vSLVBaqVJMDxKNgWiMhpDQhAPc/IH//4I/0M4kcxgGvwR8kbOJsXGOyQ1W2HCKL4hTnPu0Vmh9BxZakhZkCu/Qt54yobWr902zxM6KijghAuXGPa7hdMxyiSC4kCqvrV4yVQgSrr6fn94YjjCstnchKOsqR6Uy+hNQFVRqVcK4u7xvhbYHz9gfcc4RpXicY2BkYGAA4pPl/9bG89t8ZeBmYgCBK+z3omD0fyBg/MDEDORyMIClAXmrDbwAAHicY2BkYGBiAAHGd//////H+IGBkQEVMAEAg2cF4gAAAAAAAAHu//8AAAAAAFIAAHicY2BkYGBgYjBhANEgFgMDFxAyMPwH8xkADasBTgAAeJxlkD1uwkAUhMdgSAJSghQpKbNVCiKZn5IDQE9Bl8KYtTGyvdZ6QaLLCXKEHCGniHKCHChj82hgLT9/M2/e7soABviFh3p5uG1qvVq4oTpxm/Qg7JOfhTvo40W4S38o3MMbpsJ9POKdO3j+HZ0BSuEW7vEh3Kb/KeyTv4Q7eMK3cJf+j3APK/wJ9/HqDdPIFLEp3FIn+yy0Z3n+rrStUlOoSTA+WwtdaBs6vVHro6oOydS5WMXW5GrOrs4yo0prdjpywda5cjYaxeIHkcmRIoJBgbipDktoJNgjQwh71b3UK6YtKvq1VpggwPgqtWCqaJIhlcaGyTWOrBUOPG1K1zGt+FrO5KS5zGreJCMr/u+6t6MT0Q+wbaZKzDDiE1/kg+YO+T89EV6oAAAAeJxjYGKAAFYG7ICJkYmRmYEp04CBAQADvgCsAA==") format('woff');
44
font-weight: normal;
55
font-style: normal;
66
}

lib/icons-to-woff.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,25 @@ var svgicons2svgfont = require('svgicons2svgfont');
33
var svg2ttf = require('svg2ttf');
44
var ttf2woff = require('ttf2woff');
55
var Readable = require('stream').Readable;
6-
var fs = require('fs');
76

8-
module.exports = function createIconFont (icons, options) {
7+
/**
8+
* @param {InputFileSystem} fs An input file system
9+
* @param {String[]} icons Array of icon file paths
10+
* @param {Object} options SVG-Font options
11+
* @return {Promise<String>} Base64 encoded font
12+
*/
13+
module.exports = function createIconFont (fs, icons, options) {
914
assert(typeof options === 'object', 'Options are mandatory.');
15+
1016
return new Promise((resolve, reject) => {
1117
var fontStream = svgicons2svgfont({
1218
name: options.name,
13-
normalize: true,
14-
fontHeight: 512,
1519
log: function () {},
1620
error: function (err) {
1721
reject(err);
1822
}
1923
});
24+
var fontIconHeight;
2025
var svgFont = '';
2126
fontStream
2227
.on('finish', function () {
@@ -36,10 +41,17 @@ module.exports = function createIconFont (icons, options) {
3641
name: 'i' + i
3742
};
3843
fontStream.write(glyph);
39-
fs.readFile(filename, 'utf8', function (err, result) {
44+
fs.readFile(filename, function (err, result) {
45+
result = result.toString();
4046
if (err) {
4147
return reject(err);
4248
}
49+
var iconHeight = getSvgHeight(result, filename);
50+
if (fontIconHeight && fontIconHeight !== iconHeight) {
51+
return reject(`SVG font generation failed as not all icons have the same height. ` +
52+
`Found: "${fontIconHeight}" and "${iconHeight}".`);
53+
}
54+
fontIconHeight = iconHeight;
4355
// prevent svgs with fill="none" from beeing translated into an empty symbol
4456
result = result.replace(/\sfill\s*=\s*["']?none['"]?/ig, '');
4557
glyph.push(result);
@@ -52,3 +64,18 @@ module.exports = function createIconFont (icons, options) {
5264
.then((ttfFont) => ttf2woff(ttfFont).buffer)
5365
.then((woffFont) => new Buffer(woffFont).toString('base64'));
5466
};
67+
68+
/**
69+
* Reads the height of the svg
70+
*
71+
* @param {String} svg the svg content
72+
* @param {String} filename the file name for error reporting
73+
* @return {Number} height
74+
*/
75+
function getSvgHeight (svg, filename) {
76+
const parseSvg = /<svg[^>]+height\s*=\s*["']?(\d+)\s*(pt|)["']?/i.exec(svg);
77+
if (!parseSvg) {
78+
throw new Error(`could not read height for '${filename}'.`);
79+
}
80+
return parseSvg[1];
81+
}

lib/loader.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module.exports = function () {
1010
var callback = this.async();
1111
var query = loaderUtils.parseQuery(this.query);
1212
query.svgs.forEach((svg) => this.addDependency(path.resolve(svg)));
13-
createIconFont(query.svgs, query)
13+
createIconFont(this._compiler.inputFileSystem, query.svgs, query)
1414
.then((result) => {
1515
var url = '"data:application/x-font-woff;charset=utf-8;base64,' + result + '"';
1616
callback(null, 'module.exports=' + JSON.stringify(url) + ';');

lib/postcss-plugin.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ module.exports = postcss.plugin('iconfont-webpack', function (opts) {
111111
var fontName = md5sum.digest('hex').substr(0, 6);
112112
// Prefix the fontname with a letter as fonts with a leading number are not allowed
113113
fontName = String.fromCharCode(fontName.charCodeAt(0) + 20) + fontName.substr(1);
114+
114115
// Update the css
115116
return Promise.all([
116117
addFontDeclaration(fontName, root, svgPaths.resolved),

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "iconfont-webpack-plugin",
3-
"version": "0.0.4",
3+
"version": "0.0.5",
44
"description": "Simple icon font handling for webpack",
55
"main": "index.js",
66
"files": [

0 commit comments

Comments
 (0)