Hail2u.net

Data URIに変換するPerlスクリプト

Data URIはまだそれほど使いまくっているわけでもないので、ブラウザーでやったりVimからWSHでやったりいろいろしてたけど、必要な時はだいたい複数ファイルを何回も変換する必要があったりしていろいろ大変なのでPerlで書き直して右クリックから使う方法も考えた。@cho45が書いたのを見て重い腰が上がった。

#!/usr/bin/env perl

use strict;
use warnings;

use MIME::Base64;
use MIME::Types;
use Path::Extended qw(file);

my $mt = MIME::Types->new();
my @r;

foreach (@ARGV) {
  my $f = file($_);
  my $t = $mt->mimeTypeOf($file->stringify);
  push(@r, 'data:' . ($t ? $t : 'text/plain') . ';base64,' . encode_base64(scalar($f->slurp(binmode => 1)), ''));
}

print join("\n", @r);

exit;

URIモジュールでのnew('data:')だとBase64でエンコードするかどうかよしなにしてくれちゃうので、普通にMIME::Base64を使った。メディアタイプ判別のモジュールはいくつか試したけど、未知の時に例外吐いて死ぬ奴とか常に配列で返す奴とか色々アレなのが多くて、未知の場合は空で返ってくるMIME::Typesが結局一番ましな感じだった。

右クリックから使う場合は、

@echo off

perl -S convert-to-data-uri.pl %* | clip

というようなバッチファイルを送るに置いておくとクリップボードに即コピーとかできる。

Sassでコンパイル時にData URIに変換する関数とか書いて使ってたことも少しあったけど、コンパイルが遅くなりがちで辛いので直ぐに止めた……。

追記

Windowsだとバイナリ・ファイルがうまくいかないのでPath::Extendedに変えて明示的にbinmodeを指定して読むようにした。自分で書いてて、id:charsbarに教えてもらったのをきれいさっぱり忘れてた……。