fontgen-loader
Version:
A WebPack loader to automaticaly generate font files and CSS to make your own icon font
124 lines (86 loc) • 5.25 kB
Markdown
# `fontgen-loader` - Bam, easy webfonts!
Have you faced this? You have 4 icons from FontAwesome, and 19 from Glyphicons, and maybe you are eying at another webfont's icons and wishing to use them?
What a mess! Okay okay, so what do we do? We make our own. And how? ...good question. In fact, this question comes up just so often... So I decided to write a little thing to help out.
## How `fontgen-loader` works.
There is a tool that lets us generate fonts automaticaly by a configuration. The font is created by putting several SVG icons together and generating the proper file(s). That includes:
- A font file for WOF, EOT, TTF and WOFF2. Also SVG, if you want. But there is a trend of removal within browsers - you can see more on [caniuse](http://caniuse.com).
- A CSS has your font configured. That means, it's a proper `-face` declaration inclusive icon classes.
- If you want, a HTML demo page.
In order to use this loader, you need to be aware that this is a "trigger loader". That means, it can not just be added to your `webpack.config.js` like any other loader, you need to be aware of what it does in the long run.
## configuration
```javascript
module.exports = {
resolve: {
loaders: [
{
test: /\.font\.(js|json)$/,
loader: "style!css!fontgen"
}
]
}
}
```
This loader returns CSS. Therefore, you have to pipe it through the proper loaders. You should be able to use this with the `extract-text-plugin` as well.
However, there are more configurations. you could also specify a custom template to use, to return different kinds of source. A LESS or SCSS version, for instance? Up to you.
## Usage
Now that we have the loader configured, it's about time we give this a go. First, you want to load your font like so, within your entry code:
```javascript
// main.js
require("./Awesomecons.font"); // .js or .json does not matter if you used the config above.
```
Now, the loader will load in the font from the given configuration, and the CSS is added to your webpack project, properly rendered and prepared. Now, this is what a configuration should look like. The following is an example, and I am using JSON here, since I know that my code is more static, but you may have a varying requirement, which is why JS will be allowed. Make sure the configuration ends up being the contents of `module.exports`.
Example:
module style
```javascript
module.exports = {
"files": [
"icon/my.svg",
"icon/awesome.svg",
"icon/stuff.svg",
"icon/special/*.svg" // glob style
],
"fontName": "Awesomecons",
"classPrefix": "ai-",
"baseClass": "ai",
"fixedWidth": true,
"types": ["eot", "woff", "ttf", "svg"] // this is the default
}
```
or .json (content should be an object)
```json
{
"files": []
}
```
Now, the loader will pick up this config, pull it through the generator and:
- Generate CSS with the base and class prefix.
- Font files for the three SVG icons.
And there you are - your webfont is done. Now, here is one thing: You can use JavaScript too. A useful thing is, that there are two additional options that I did not mention:
In addition, you also have these options:
- `.rename`: This should be a function that returns the icon's name based on the input (filename).
- `.log`: You can log stuff here.
- `.formatOptions`: An object containing options to their specific transformers. See [this PR](https://github.com/sunflowerdeath/webfonts-generator/pull/6) and [this README entry](https://github.com/sunflowerdeath/webfonts-generator#formatoptions) to learn more.
You also can use a module like `glob` to pick up a variable set of icons, too. Mix and match and mind the various licenses - and make your own webfont!
# Configuration
## Loader parameters
- `template`, String
Which template to use? By default, a CSS one is used. The template is to be processed by Handlebars. See [the generator](https://github.com/sunflowerdeath/webfonts-generator)'s readme itself for more info.
- `embed`, Boolean
Should the fonts be embedded in the CSS? By default the fonts are written to disk. If `embed` is specified the font is base64 encoded and embedded inside the `-face` declaration. Example configuration: `loader: "style!css!fontgen?embed&types=woff"`.
## Font configuration (`*.font.js` or `*.font.json`)
- `files`, Array
An array of SVG icon files. Supports glob
- `fontName`, String
Name of your font.
- `classPrefix`, String
The prefix to be used with each icon class.
- `baseClass`, String
The base class, under which each icon class is to be crated.
- `types`, Array
Possible values are: `["svg", "eot", "wof", "ttf"]`.
For additional options, see the generator's README file.
### Special configuration
There is one special configuration optin that exists in both, the actual font configuration and as a query parameter: `fileName`. This one decides the output of the font filenames. You can create a filename template with these elements (will likely become more in the future):
- `[fontname]`: The name of the font. I.e. "Awesomefont".
- `[ext]`: The extension. I.e.: `.woff`.
- `[hash]`: The hash of your current compilation.