ハイパーマッスルエンジニアになりたい

Vim、ShellScriptについてよく書く

ソースコードを画像化する、Rust製のコマンドラインツールsiliconで使える日本語対応フォント一覧

f:id:rasukarusan:20210306094102p:plain

環境

  • macOS Catalina(10.15.5)

日本語対応フォント一覧

851MkPOP
AhahaMojimoji
Arial Unicode MS
Hannotate SC
HanziPen SC
Hiragino Maru Gothic ProN
Hiragino Mincho ProN
Hiragino Sans
Hiragino Sans GB
Osaka
PingFang HK
PingFang SC
PingFang TC
Ricty Diminished
Ricty Diminished Discord
ShigotoMemogaki
Toppan Bunkyu Gothic
Toppan Bunkyu Mincho
Tsukushi A Round Gothic
Tsukushi B Round Gothic
Wawati SC
Yuppy SC
Yuppy TC

たぶんOsakaとかはMacユーザーならデフォルトで入ってるんじゃないでしょうか。 利用できるフォントは環境によって違うので、下記のコマンドで実際に出力してみてください。

日本語対応フォント一覧を抜き出すコマンド

ワンライナーでサクッと探せる。

silicon --list-fonts | while read font; do [ -z "$(silicon test.md --to-clipboard -f "$font" 2>&1)" ] && echo $font; done

テスト用のソースコードtest.mdは下記。

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。
またそのなかでいっしょになったたくさんのひとたち、ファゼーロとロザーロ、羊飼のミーロや、顔の赤いこどもたち、地主のテーモ、
山猫博士のボーガント・デストゥパーゴなど、いまこの暗い巨きな石の建物のなかで考えていると、みんなむかし風のなつかしい青い幻燈のように思われます。
では、わたくしはいつかの小さなみだしをつけながら、しずかにあの年のイーハトーヴォの五月から十月までを書きつけましょう。

siliconって何?

ソースコードを画像化するRust製のコマンドラインツール。 github.com

brewでインストールできる。

brew install silicon

シンプルなコマンドで良い感じのソースコード画像が生成できる。

silicon test.vim -o test.png -f "Ricty Diminished"

f:id:rasukarusan:20210306092438p:plain
siliconコマンドで生成

指定したフォントで対応していない文字があったらエラーになる

例えばデフォルトの”Hack”フォントで日本語を含むソースで画像生成をすると、warningが出た上で日本語部分がすっぽ抜けた画像が生成する。

silicon test.vim -o test.png -f "Hack"

f:id:rasukarusan:20210306092704p:plain:w400
warningが出た上で

f:id:rasukarusan:20210306092448p:plain
日本語の部分はすっぽ抜ける

日本語対応しているフォントを探し出す

ということで冒頭のワンライナーが必要になった。

silicon --list-fonts | while read font; do [ -z "$(silicon test.md --to-clipboard -f "$font" 2>&1)" ] && echo $font; done

siliconで利用可能なフォント一覧はオプションで--list-fontsをつければ表示できる。

silicon --list-fonts

ただこれだけだと日本語対応していないものを出てくるので、実行した際にwarningが出るか否かで日本語対応しているかどうかを判断する。

[ -z "$(silicon test.md --to-clipboard -f "$font" 2>&1)" ] && echo $font;

silicon --list-fontsはどこを読み込んでいるのか

siliconではフォント読み込みライブラリにservo/font-kitを使用している。

silicon/src/bin/silicon/main.rs

} else if config.list_fonts {
    let source = font_kit::source::SystemSource::new();
    for font in source.all_families().unwrap_or_default() {
        println!("{}", font);
    }
    return Ok(());
} else if config.config_file {

servo/font-kitではsrc/sources/fs.rsでフォントディレクトリを指定していた。

src/sources/fs.rs

#[cfg(target_os = "macos")]
fn default_font_directories() -> Vec<PathBuf> {
    let mut directories = vec![
        PathBuf::from("/System/Library/Fonts"),
        PathBuf::from("/Library/Fonts"),
        PathBuf::from("/Network/Library/Fonts"),
    ];
    if let Some(mut path) = dirs_next::home_dir() {
        path.push("Library");
        path.push("Fonts");
        directories.push(path);
    }
    directories
}

つまりMacの場合

  • /System/Library/Fonts
  • /Library/Fonts
  • /Network/Library/Fonts
  • ~/Library/Fonts

からフォントが読み込まれるみたい。