アイコンリサイズ用のnpmパッケージを作ってみた その3

ChainZ(クリエイター)
いろいろやってます。

前回できたiconcというコマンドツールの実行メッセージが表示されないとこを改善したいと思います。ファイル処理のメッセージはEventEmitterのemitメソードを利用して実現します。

EventEmitterについてはこの記事で詳しく説明しています:

早速実装をしてみます。修正するファイルは./index.jsとなります:

1
2
3
4
5
6
7
8
9
10
11
12
// ./index.js

const util = require('util');
const EventEmitter = require('events').EventEmitter;

function Iconc(params) {
    EventEmitter.call(this);

    ...
}

util.inherits(Iconc, EventEmitter);

これで、EventEmitterの継承完了しました。とりあえず下記のイベントを定義します:

  • EVENT_DATA ファイルが処理された時に発信
  • EVENT_END 全てのファイルが処理された時に発信

constで定義:

1
2
const EVENT_DATA = 'data';
const EVENT_END = 'end';

直接emit('data')みたいに、文字列を渡すことも可能だが、event名は定数にするのが一般的です。

リサイズ処理のところに:

1
2
3
4
5
6
7
8
                ...
                im.resize(opt, err => {
                    if (err) return done(err);
                    // EVENT_DATAイベントを発信する、生成したファイルパスを添付します
                    self.emit(EVENT_DATA, dst);
                    return done(null, dst);
                });
                ...

最後のコールバックに:

1
2
3
4
5
6
7
8
9
10
...
(err, files) => {
    if (err) return done(err);

    // EVENT_ENDイベントを発信
    self.emit(EVENT_END);

    return done();
});
...

イベント発信の実装が終わったら、bin/iconcスクリプトで受信してメッセージを表示する実装します:

1
2
3
4
5
6
7
8
9
10
    ...
    try {
        const iconc = new Iconc(opt);
        iconc.run(done);
        // EVENT_DATAを受信する、生成したファイルのパスを表示する
        iconc.on('data', (file) => console.log(`${' '.repeat(SPACE)}>>> `.green, file.white));
    } catch (e) {
        return done(e);
    }
    ...

はい、これでメッセージは表示するようになります。再インストールしてみよう:

1
2
npm uninstall iconc -g
npm install . -g

面倒くさいと思ったら、直接./bin/iconc$PATHに入れても大丈夫です

今回は、リサイズ設定を指定したファイルから読み込んで実行する実装も検証してみたい、適当なところに下記のyamlファイルを作成します:

1
2
3
4
5
6
7
8
9
10
11
12
// test.yaml

icon-1:
  w: 100
icon-2:
  w: 120
icon-3:
  w: 144
icon-4:
  w: 228
icon-5:
  p: 120

下記のコマンドで実行すると

1
iconc -f ~/path/to/your/pic.png -s test.yaml -d .

生成されたファイルのパスが表示されました!まだ細かいところは実装してないが、仕事の合間にちょこちょこ完成度を上げていきます。 今度はVagrantfileやDockerfileなどみたいにIconcFileをデフォルトに読み込む仕様にしたいと思います。