このエントリーをはてなブックマークに追加

2017年3月6日月曜日

Electronでfont-managerを使う

# nodeでフォント情報の取得 PC/macに入っているフォント一覧を取得したかった。 昔ActionScript3.0でやったことはあるけれど、JavaScriptでできるんかいな。 nodeは色んなモジュールがあるけど、いいのないかなーと思ったら[font-manager](https://www.npmjs.com/package/font-manager)なるものがあった。 これを入れれば、
 
const fm = require('font-manager');
var fonts = fm.getAvailableFontsSync();
ってだけでフォントの取得ができるらしい。超便利。 ただ他のモジュールと違って、 `npm install --save-dev font-manager` ですぐ導入できるわけではなかった・・・。 インストールする際に注意&インストールしてからやらないといけないことがあった。


# それは何かというと、 - Python 2.xがないといけない - font-managerを入れた後、electron-rebuildをする必要がある というもの。 Python 3.6の環境で `npm install --save-dev font-manager` を実行すると、 Python 2.5 〜 Python 3.0 じゃないとダメ(うろ覚)みたいなことを言われました。 # 結局なにをすればいいかというと、 --- npm install --save-dev electron-prebuilt npm install --save-dev font-manager npm install --save-dev electron-rebuild ./node_modules/.bin/electron-rebuild --- です。最後のはWindowsなら electron-rebuild.cmd になるかと思います。
これでfont-managerが使えるようになりますが、取得したフォントは順番がバラバラだし、同じフォント名のものがいくつもあるので、重複排除とソートをした方が見やすいと思います。
const fm = require('font-manager');
var fonts = fm.getAvailableFontsSync();
object_array_sort(fonts, 'family', 'asc', function(fonts_sorted){

  console.log(fonts_sorted);  //fonts_sortedに整理されたフォントが入る

});

function object_array_sort(data,key,order,fn){
  //デフォは降順(DESC)
  var num_a = -1;
  var num_b = 1;

  if(order === 'asc'){//指定があれば昇順(ASC)
    num_a = 1;
    num_b = -1;
  }

  data = data.sort(function(a, b){
    var x = a[key];
    var y = b[key];
    if (x > y) return num_a;
    if (x < y) return num_b;
    return 0;
  });

  //重複排除
  var arrObj = {};
  for (var i = 0; i < data.length; i++) {
    arrObj[data[i]['family']] = data[i];
  }

  data = [];
  for (var key in arrObj) {
    data.push(arrObj[key]);
  }

  fn(data); // ソート後の配列を返す
}
# 参考 - [Javascriptでオブジェクトの配列をKey/Valueでソートする関数](http://qiita.com/n0bisuke/items/f2dd06bfb0e4daa1e0d8) - [オブジェクトの配列でkey/valueの重複したオブジェクトを削除する](http://qiita.com/hrfmmymt/items/350dd409bd82106e752a)

0 件のコメント:

コメントを投稿