タオルケット体操

サツバツいんたーねっと

Japont (日本語Webフォントのダイナミックにサブセット化するやつ)のサブセット化部分だけを分離してモジュール化したよ

3846masa.hatenablog.jp

という良い感じの記事があって、これは欲しい! でも僕はデプロイ時に静的に生成しておきたい! と思ったのでサブセット化の部分だけをPythonのモジュール化して、ついでにコマンドラインからも使えるようにしておいたっていうおはなし。

モジュールのリポジトリは例によってGitHubにあります。
まだちょっとテストコードをどう書いたものか考えあぐねてます。完全フリーなフォントをサンプルに使うのが良いかな。

github.com

とりあえず僕が欲しいから作っちまえな感じでソースを改造して勝手にモジュール化して、Japontの作者の方には後了解をとるような形になってしまったのですが、リポジトリやPyPIでの公開に関して快く許可を頂きました。ありがとうございます!

インストール方法

$ pip install FontReducer

でどうぞ。
コマンドだけ使いたい方はpipsiを使っても良いとおもいます。(Pythonの開発をしている人でPython製の便利スクリプトを導入するならpipsiが便利っぽい - タオルケット体操

書き忘れましたが、FontForgeと、FontForgeが+python-extension的なオプションでコンパイルされていることを前提としているので注意してください。

使い方

$ echo "abcdefgあいうえお!" | fontreducer SOME_NICE_FONT.ttf REDUCED_FONT.ttf

みたいにすると、abcdefgあいうえお!だけが含まれたREDUCED_FONT.ttfというフォントファイルが生成されるはずです。
fontreducerコマンドにパイプで種となる文字列を食わせることを想定しているので、例えばfind grepと組み合わせてもいいんじゃないでしょうかね。

もちろんモジュール自体はPythonから使うことも出来て、例えば以下は疑似コードですが

from pyquery import PyQuery

with open('hoge.html') as html_file:
    pq = PyQuery(html_file.read())
    chars_used_in_template = pq('div,p,a').text()

from fontreducer import chars_to_codepoints, generate_subset
code_pointes = chars_to_codepoints(chars_used_in_template)
font = generate_subset(code_pointes, 'SOME_NICE_FONT.ttf')
font.generate('SOME_NICE_FONT.min.ttf')

みたいな処理をタスクに登録しておくことで、watchdogs的なスクリプトやgulpなどのMake的ななんかと連動したフォントのサブセット化が可能になるわけですね。
ユーザの入力に応じた動的な生成をしたい場合はJapont、静的なタスクと連動したい場合はFontReducerという感じでやるのが良いんじゃあないでしょうか。

処理の詳細な説明については3846masa氏による説明(Japont (日本語Webフォントのダイナミックサブセット化) について - 3846masa's memo)が詳しいので省略します。

要はchars_to_codepointsで文字列のコードポイント化を行い、それをgenerate_subset関数に食わせることでサブセットフォントを生成する感じです。
例えばFontForgeオブジェクトのgenerateメソッドを呼び出すことでファイルに出力出来るわけですね。

TODO

現時点では単なる文字列を種としたサブセット生成しか出来ず、Webフォントみたいなコードポイントを直接指定してアレコレするような奴に対応出来てません。
NotoSansのcjkもそうなんですが、Webフォントのサブセット化にも対応したくてモジュールを切り出したのでそこのところも対応したいですね。

あとテストコードと、FontForge次第ですがPython3対応も……

おしまい!