これからはじめるGulp #22:gulp-iconfontとgulp-sketchを使ったアイコンフォント作成の自動化

2014.12.22

はじめに

前回のこれからはじめるGulp(21):gulp-awspublishプラグインを使ったAmazon S3への静的WebサイトパブリッシュでAmazon S3への静的サイトパブリッシュを試しました。今回はSketch 3のデザインデータからgulp-iconfontとgulp-sketchプラグインを使ってアイコンフォント作成を自動化してみたいと思います。

gulp-iconfontについて

gulp-iconfontはSVGアイコンを使ってSVG/TTF/EOT/WOFF形式のフォントを作ることができます。

gulp-sketchについて

gulp-sketchこれからはじめるGulp(19):gulp-sketchとgulp-execを使ったSketch 3デザインデータの画像書き出しの回で紹介した通り、Sketchをコマンドラインから呼び出して画像を書き出すSketchToolを使ったプラグインです。

アイコン用のデザインファイルを用意する

Sketchで512 * 512のアートボードを用意して各アートボードに背景指定なしのアイコンを作りました。シンボルはすべて結合ツール結合しておきます。フォントを含む場合は必ずアウトライン化します。

design

今回は4つの矢印をアイコンフォント化してみます。

プラグインのインストール

必要なプラグインをインストールします。

gulp-iconfont

$ sudo npm install --save-dev gulp-iconfont
gulp-iconfont@1.0.0 node_modules/gulp-iconfont
├── plexer@0.0.3 (readable-stream@1.0.33)
├── gulp-ttf2eot@1.0.0 (bufferstreams@0.0.2, ttf2eot@1.3.0, readable-stream@1.0.33)
├── gulp-util@3.0.1 (lodash._reinterpolate@2.4.1, minimist@1.1.0, vinyl@0.4.6, chalk@0.5.1, through2@0.6.3, lodash.template@2.4.1, dateformat@1.0.11, multipipe@0.1.2, lodash@2.4.1)
├── gulp-svg2ttf@1.0.0 (bufferstreams@0.0.2, readable-stream@1.0.33, svg2ttf@1.2.0)
├── gulp-svgicons2svgfont@1.0.0 (readable-stream@1.0.33, svgicons2svgfont@1.0.0)
└── gulp-ttf2woff@1.0.0 (bufferstreams@0.0.2, readable-stream@1.0.33, ttf2woff@1.3.0)

gulp-sketch

$ vi gulpfile.js
$ sudo npm install gulp-sketch --save-dev
Password:
gulp-sketch@0.0.6 node_modules/gulp-sketch
├── clean-sketch@1.0.1
├── temporary@0.0.8 (package@1.0.1)
├── through2@0.6.3 (xtend@4.0.0, readable-stream@1.0.33)
└── gulp-util@3.0.1 (lodash._reinterpolate@2.4.1, minimist@1.1.0, vinyl@0.4.6, chalk@0.5.1, multipipe@0.1.2, lodash@2.4.1, dateformat@1.0.11, lodash.template@2.4.1)

iconfontタスクを作る

gulp-sketchとgulp-iconfontプラグインを使ってタスクを作ります。gulp-iconfontプラグインのオプションはこちらに詳しく記載されています。

iconfont.js

var gulp     = require('gulp');
var sketch   = require('gulp-sketch');
var iconfont = require('gulp-iconfont');

var paths = {
  srcDir : 'assets/_design',
  dstDir : 'assets/fonts'
}

gulp.task('iconfont', function(){
  var fontName = 'arrow-font';
  var srcGlob  = paths.srcDir + '/icons.sketch';
  var dstGlob  = paths.dstDir + '/' + fontName;

  var sketchOptions = {
    export : 'artboards',
    formats: 'svg'
  }
  var fontOptions = {
    fontName         : fontName
  }

  gulp.src( srcGlob )
    .pipe(sketch( sketchOptions ))
    .pipe(iconfont( fontOptions ))
    .on('codepoints', function(codepoints, options) {
      // CSS templating, e.g.
      console.log(codepoints, options);
    })
    .pipe(gulp.dest( dstGlob ));
});

実行

実行するとSketchから書き出されたSVGはそのままgulp-iconfontプラグインでフォントとなります。

$ gulp iconfont
[17:19:25] Using gulpfile ~/Projects/Labs/iconfont.gulp/gulpfile.js
[17:19:25] Starting 'iconfont'...
[17:19:25] Finished 'iconfont' after 11 ms
[ { name: 'arrow-bottom', codepoint: 57345 },
  { name: 'arrow-left', codepoint: 57346 },
  { name: 'arrow-right', codepoint: 57347 },
  { name: 'arrow-top', codepoint: 57348 } ] { fontName: 'arrow-font',
  ignoreExt: false,
  log: [Function],
  error: [Function],
  fixedWidth: false,
  descent: 0,
  round: 10000000000000 }
[17:19:25] gulp-svgicons2svgfont: Font created

できあがったアイコンフォント

できあがったアイコンフォントは4つの形式で保存されます。

assets
├── _design
│   └── icons.sketch
└── fonts
      └── arrow-font
          ├── arrow-font.eot
          ├── arrow-font.svg
          ├── arrow-font.ttf
          └── arrow-font.woff

実際にHTMLで表示してみるとこのようになります。

arrow-font

アイコンを追加してgulpコマンドをたたくだけでアイコンフォントが作れるようになりました。便利すぎますね。明日は上記のサンプルのようにSymbols for Sketchを参考にしてアイコン一覧が載ったHTMLドキュメントを作ってみたいと思います。

参考サイト

この記事はこれからはじめるGulp(22):gulp-iconfontとgulp-sketchを使ったアイコンフォント作成の自動化の転載です。