ちょっとしたプログラムパッケージや LaTeX ドキュメントを作成する時に、Makefile やその他ファイルのスケルトンをまとめて生成する算段を検討中。 例えば Perl の h2xs のような感じ。
基本的には Template Toolkit ベースでいってみたい。 ttree あたりを使えばだいたいできそうだ。 ここで --define var=value で全て間違えずに指定するのは大変になってくるだろう。 ということでテンプレート変数定義をまとめたテンプレートファイルを作成し、各テンプレート処理をする際にプリプロセスするようにする。
でこのテンプレート変数定義のテンプレートファイルは対話的に作成できるようにしたい。 テンプレートファイルのテンプレートファイルを処理して。
で対話的入力の方法なのだが、探してもそのようなディレクティブもプラグインもみつからない。ありそうなもんだけどなぁ。
しょうがないので、PERL ディレクィブ内で Term::ReadLineを使って入力。 こんな感じ。
[% TAGS [- -] -%] [- PERL -] use Term::ReadLine; my $term = new Term::ReadLine('template'); $stash->set('readline' => sub { my $prompt = shift || 'input:'; my $text = $term->readline($prompt); if (defined $text) { $term->addhistory($text); } return $text; }); [- END --] [% project.name = '[- readline('project name:') -]' -%] [% project.author = '[- readline('author:') -]' -%]
tpage でこのテンプレートファイルを処理すると、対話的に値を入力しながらテンプレートファイルを生成できる。 実際は文字列のエスケープなどもうちょっと工夫が必要。
ちなみに Debian GNU/Linux sid の libtemplate-perl は 2.10-1 で、このバージョンの Template Toolkit の tpage だと EVAL_PERL が有効になっておらずうまく動かない。 手元にコピーして Template オブジェクトの初期化部分に EVAL_PERL => 1 を追加する必要あり (2.14 の tpage は --eval_perl オプションで有効にできる)。
Term::ReadLine を使ってみたのだが、ヒストリ機能も行編集機能も働かない。あれ?
で調べたらTerm::ReadLine::Gnu がはいっていないせいだった。 インストールしたらあっさり解決。
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。