ファイルの中に別のファイルを読み込むスクリプト

ファイルの中に別のファイルを読み込むようなスクリプトが欲しい

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コメント部が正しく表示されないようです。以下のボックスが空欄の場合は、日付表示にして見てください。

<!-- コメントです -->