ファイルの中に別のファイルを読み込むスクリプト
ファイルの中に別のファイルを読み込むようなスクリプトが欲しい
Webサイトを作っているとき、複数のHTMLファイルに同じものを入れたいことがある。たとえば画面上部のバナーとか、サイドバーとか。こういったときはDreamweaverのようなWebデザインツールのテンプレート機能を使えばいいんだろうけど、「このページはサイドバーが要らない」といったようにページによって必要な要素が異なっている場合、全部の組み合わせに対応できるテンプレートを作ったり管理するのが難しいという問題がある。
そこで、ファイルの中に別のファイルを読み込むようなスクリプトを作ることにした。バナーやサイドバーのような共通部分のソースを別ファイルとして用意しておいて、各HTMLファイルの中に「ここにバナーを読み込む」「ここにサイドバーを読み込む」のような指定を入れることで、テンプレートを使わなくても同じ要素を入れられるようになる。
スクリプト
誰かの役に立つかも知れないので恥ずかしながらスクリプトを晒しちゃう。スクリプトはRubyで作ったけれど、最近Haskellの勉強をしているため次のようなコードになった。明らかにRubyっぽくないが反省はしていないw
include.rb:
#!ruby -Ks # include.rb: ファイル中に別のファイルをインクルードして出力する。 # Usage: ruby include.rb [inputfile] [outputfile] # inputfile, outputfileが省略された場合は # それぞれ標準入力、標準出力が使われる。 # 読み込み指定は行に単独で <!--#include file="includefile" --> と書く。 def main outputfile.puts(inputfile.readlines.map { |line| includefile(line) }) end def inputfile ARGV.length >= 1 ? open(ARGV[0], "r") : $stdin end def outputfile ARGV.length >= 2 ? open(ARGV[1], "w") : $stdout end def includefile(line) line =~ /<!--#include file="(.*)" -->/ ? open($1, "r").read : line end main
先頭の“ruby -Ks”はシフトJISの指定になっているので、必要に応じて変更する。
読み込みの指定はSSIのものを拝借した。ファイル中に次のような行があると、その場所に指定されたファイルの内容を展開する。次の場合にはheader.txtの内容が展開される。
<!--#include file="header.txt" -->
実行結果
たとえば次のようなtest.txtがあったとき
abc def <!--#include file="hoge.txt" --> ghi
hoge.txtの中身が次のようになっていたとして
hogehoge fugafuga
スクリプトを実行すると
ruby include.rb test.txt out.txt
出力結果のout.txtは次のようになる。
abc def hogehoge fugafuga ghi
<追記>
はてなのバグにより、記事表示ではプログラム中のHTMLコメント部が正しく表示されないようです。以下のボックスが空欄の場合は、日付表示にして見てください。
<!-- コメントです -->