次へ: 8 最後に
上へ: AWK による HTML ファイルの整形
前へ: 6.5 サブルーチンと END ブロック部分
(PDF ファイル: awkhtml.pdf)
7 全体のソースコード
6 節のソースコードを全部つなげると以下のようになります。
##### タイトルの取得 #####
($0 ~ /<title>/){
titlestr=$0
while(titlestr !~ /<\/title>/){
if(getline<=0){ errorexit=1; exit }
titlestr = titlestr $0
}
sub(/.*<title>[ \t]*/,"",titlestr)
sub(/[ \t]*<\/title>.*/,"",titlestr)
next
}
##### 見出し部分の取得 #####
($0 ~ / CONTENTS_TITLE_TABLE/){
# 不要な行の読み飛ばし
while($0 !~ /<font size/)
if(getline<=0){ errorexit=2; exit }
# headline に行を保存
headline=$0
while(headline !~ /<\/small>/){
if(getline<=0){ errorexit=3; exit }
headline = headline $0
}
# 不要なタグ (font,small) を削除
gsub(/<\/?font[^>]*>/,"",headline)
sub(/[ \t]*<small>[ \t]*/,"",headline)
sub(/[ \t]*<\/small>.*/,"",headline)
while($0 !~ /\/CONTENTS_TITLE_TABLE/)
if(getline<=0){ errorexit=4; exit }
next
}
##### 記事本文の取得 #####
# N_ot = 何回目の OUTLINE_TABLE ブロックであるか
($0 ~ / OUTLINE_TABLE/){ N_ot++ }
# 最初の OUTLINE_TABLE ブロックのときだけ実行
(N_ot==1 && $0 ~ / OUTLINE_TABLE/){
# 不要な部分を読み飛ばし
while($0 !~ /<font size/)
if(getline<=0){ errorexit=5; exit }
# 本文の保存 (body[1] ~ body[N_body])
N_body=0
do{
if($0 ~ /<\/?font/) gsub(/<\/?font[^>]*>/,"")
body[++N_body]=$0
if(getline<=0){ errorexit=6; exit }
}while($0 !~ /<div/)
# 本文の最後の <div> タグ部分を改行 (<br>) に変換して保存
sub(/<div[^>]*>/,"<br>")
body[++N_body]=$0
# </div> までを保存
while($0 !~ /<\/div/){
if(getline<=0){ errorexit=7; exit }
body[++N_body]=$0
}
# </div> タグは単に削除
sub(/<\/div>/,"",body[N_body])
next
}
##### Copyright 以下の部分の取得 #####
($0 ~ /\/YBB module/){
while($0 !~ /Copyright/)
if(getline<=0){ errorexit=8; exit }
N_tail=0
do{
gsub(/<\/?small>/,"")
gsub(/<\/?center>/,"")
tail[++N_tail]=$0
}while($0 !~ /<\/html>/ && getline>0)
exit
}
##### END ブロック #####
END{
if(errorexit){
printf "エラー発生 (code = %d)\n",errorexit > "/dev/stderr"
exit
}
putheader(titlestr,headline)
putbody(body,N_body)
puttail(tail,N_tail)
}
##### 出力関数 #####
# ヘッダ部分の出力関数
function putheader(titlestr,headline)
{
print "<html>"
print "<head>"
printf "<title>%s</title>\n",titlestr
print "</head>"
print "<body>"
printf "<h1>%s</h1>\n",titlestr
printf "%s<hr>\n",headline
}
# 本文の出力関数
function putbody(body,N, j)
{
for(j=1;j<=N;j++) print body[j]
}
# 最後の部分の出力関数
function puttail(tail,N, j)
{
print "<hr>"
for(j=1;j<=N;j++) print tail[j]
}
次へ: 8 最後に
上へ: AWK による HTML ファイルの整形
前へ: 6.5 サブルーチンと END ブロック部分
竹野茂治@新潟工科大学
2006年8月14日