理系学生日記

おまえはいつまで学生気分なのか

フォルダ一式を iPhone に入れてソース・リーディングするためのスクリプト

iPhone はソース・リーディングのお供ですが,基本的にはシンタックス・ハイライトの機能はありません *1.そこで Text::VimColor を使ってシンタックス・ハイライト済みの HTML を生成後 iPhone に転送してやり,iPhone からはブラウジング機能を持つアプリで閲覧するという解決策があります.
前も同じようなのを書きましたが,今後の方針としてクソスクリプトであっても blog に晒すということが決まりましたのでとりあえず.

Text::VimColor はコンストラクタに filetype を渡すことで,どの言語のシンタックス・ハイライトを適用するかを指定できますが,試してみたところ,それをせずともかなりの確率で適切な言語を選択してくれます*2
オープンソースプロジェクトには C や Perl,シェルスクリプトなど多種多様な言語が使われる場合もありますが,とりあえずは大丈夫かと.

$ ./make-iphone source-dir new-dir

こんな感じで実行すると,source-dir の中身がシンタックス・ハイライトされたファイルが,元のディレクトリ構造を保ったまま new-dir に格納される.後は Air Sharing とかで iPhone に転送してやればいい

#!/opt/local/bin/perl
use strict;
use warnings;
use Text::VimColor;
use File::Find::Rule;
use File::Copy qw(copy);
use Path::Class qw(file dir);
use File::Path qw(make_path);

# html 化したくないファイルの拡張子を指定
my @ignores = qw(html gif pdf ps jpe?g gz tar);

die "[usage] $0 dir newdir" unless @ARGV == 2;
my ($dir, $newdir) = @ARGV;
make_path( $newdir ) unless -e $newdir and -d _;
my $re_ignore = '\.(:?' . join( '|', @ignores ) . ')$';

my @paths = File::Find::Rule->file()->in( $dir );
for my $path (@paths) {
    my $file = file( $path );
    my $dir  = dir( $newdir, $file->dir->relative( $dir ) )->stringify;
    make_path( $dir ) unless -e $dir and -d _;

    my $name  = file( $dir, $file->basename )->stringify;
       $name .= ".html" unless $name =~ /$re_ignore/o;
    print "$path =====> $name\n";

    if ( $file->basename =~ /$re_ignore/o ) {
        copy( $path, $name );
        next;
    }

    # Text::VimColor の異常終了によって,スクリプトまで終了してしまうのを防ぐ
    eval {
        my $syntax = Text::VimColor->new(
            file           => $path,
            html_full_page => 1
        );
        open my $fh, '>', $name or die "cannot create '$name': $!";
        print {$fh} $syntax->html;
    };
}

余談ですが,いつのまにか File::Path の mkpath が legacy になってました.v2.00 からは make_path を使うようです.

*1:Air Sharing はファイルの拡張子でシンタックス・ハイライトをしてくれますが,解析に時間がかかります

*2:例え拡張子がなくとも