ここでは、5 節で紹介した共通部分のみ紹介します。 各分野に依存した部分のソースコードは、 4 節で紹介した BEGIN ブロックがそれになります。
3 節で紹介したおおまかなソースコードからは、 多少拡張してある部分もあります。
##### ジャンル分け共有部分 #####
## おのおの分野に依存する部分では、
## NG, p[j] (1<=j<=NG), Gname[j] (1<=j<=NG+1) を定義しておくこと。
##
BEGIN{
if(DIV=="") DIV=5 # 区切りを入れる個数
}
/^<title>/{ headtitle=$0; next } # HTML ヘッダの <title> 行を取得
/^<h2>/{ title=$0; next } # HTML 本文のタイトル部分を取得
/^<li>/{
str=$0
sub(/^.*yahoonews\">/,"",str)
sub(/<\/a>.*/,"",str)
for(j=1;j<=NG;j++){
if(str ~ pat[j]){
hn[j]++
hs[j, hn[j]]=$0
next
}
}
hn[j]++
hs[j, hn[j]]=$0
}
END{
putheader(headtitle,title)
puttoc(NG,hn,Gname) # 目次の出力
putgenre(NG,hn,hs,Gname)
putfooter()
}
##### ヘッダ出力 #####
function putheader(headtitle,title)
{
printf "<html>\n"
printf "<head>\n"
printf "<meta http-equiv=\"Content-Type\""
printf " content=\"text/html; charset=EUC-JP\">\n"
printf "%s\n",headtitle
printf "<body>\n"
printf "<a name=\"top\"></a>\n" # 先頭へのページ内リンク
printf "%s\n",title
printf "<hr>\n"
}
##### 目次出力 #####
function puttoc(NG,hn,Gname, j)
{
printf "<h2><a name=\"toc\">目次</a></h2>\n"
printf "<ul>\n"
for(j=1;j<=NG+1;j++)
printf "<li><a href=\"#S%d\">%s</a> (%d 件)\n",j,Gname[j],hn[j]
# S1, S2, 等を各ジャンルへのページ内リンクとする
printf "</ul>\n"
printf "<a href=\"#top\">先頭へ戻る</a>\n"
printf "<hr>\n"
}
##### 各セクションの一覧出力 #####
function putgenre(NG,hn,hs,Gname, j,k)
{
for(j=1;j<=NG+1;j++){
printf "<h2><a name=\"S%d\">%s</a>",j,Gname[j]
# ページ内リンクの定義
printf " (%d 件)</h2>\n",hn[j]
printf "<ul>\n"
for(k=1;k<=hn[j];k++){
printf "%s\n",hs[j,k]
if(k%DIV==0) printf "<br>(ここまで %d 件)<br><br>\n",k
}
printf "</ul>\n"
printf "<a href=\"#top\">先頭へ戻る</a>\n"
printf "<hr>\n"
}
}
##### フッタ出力 #####
function putfooter()
{
printf "</body>\n"
printf "</html>\n"
}
3 節に対する拡張、修正は、
最後の putgenre() は、3 節のように
END ブロック内に for 文を書いて、
各ジャンル毎の出力関数を作ってそれを使うという手もあるのですが、
いずれにせよ 2 重配列
をそっくり関数に渡してしまうことになるので、
それなら for 文もその関数の中に入れてしまって
全部出力させても同じことになりますからそのようにしました。