次へ: 7 最後に 上へ: AWK による HTML ファイルの整形 その 3 前へ: 5 分野依存部分の分離 (PDF ファイル: awkwww3.pdf)


6 全体のソースコード

以上をまとめて、全体のソースコードを紹介します。

ここでは、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 重配列 $hs[]$ をそっくり関数に渡してしまうことになるので、 それなら for 文もその関数の中に入れてしまって 全部出力させても同じことになりますからそのようにしました。


次へ: 7 最後に 上へ: AWK による HTML ファイルの整形 その 3 前へ: 5 分野依存部分の分離
竹野茂治@新潟工科大学
2006年9月8日