次へ: 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日