新井です。

In message "[ruby-list:38068] Re: ファイル書換え?"
  on 11 Aug 2003 00:12:02 +0900,
  中村文建 <tx6f-nkmr / asahi-net.or.jp> wrote:
> 中村です。

> まだ先が長いような気がします・・

> (1)現フォルダのファイル全てを変換(上書き変換する)
> (2)タグ:大文字→小文字変換
> (3)文字コード:SJIS→JIS変換
> (4)HTML整形・・etc

(1) は、先のメールでよいですね?

(2) を(簡略版で)示すと。

HTMLRegexp = /<.*?>/m

while data = ARGF.gets(nil)
  data.gsub!(HTMLRegexp){|match|
    match.downcase
  }
  print data
end

こんな感じです。さらにタグの中の "..." を処理から除外すると
こんな感じです。これはさらに複雑にしたいときのサンプルとして
示しました。

while data = ARGF.gets(nil)
  data.gsub!(HTMLRegexp){|match|

    match.gsub(/([^"]+)|(".+?")/m) {
      s, qs = $1, $2
      if s
	s.downcase
      else
	qs                 # "..." で囲まれた文字列はそのまま
      end
    }

  }
  print data
end


> こういう初歩的な事は実は既にプログラムが存在していると思うのですが、
> どなたかご存知の方がいましたら教えて下さい。

ライブラリはあると思いますが(私はあまりHTMLを触らないので知
らないのですが)。元のスクリプトを修正するとこんな感じですか
ね?(あまりテストしてません。処理結果に関しては無保証で ^^;)

HTMLRegexp = /
               ( <!--.*?--\s*> )  |
               ( <.*?> )          |
               ( [^<>]+ )
             /xmu

while data = ARGF.gets(nil)
  data.gsub!(HTMLRegexp){
    comment, tag, tdata = $1, $2, $3
    if comment                              # コメントにマッチした場合
      p [:comment, comment] if $DEBUG
      comment
    elsif tag                               # タグにマッチした場合
      p [:tag, tag] if $DEBUG
      tag.gsub(/([^"]+)|(".+?")/m) {
        s, qs = $1, $2
        if s
          s.downcase
        else
          qs
        end
      }
    elsif tdata                             # テキストデータにマッチした場合
      p [:tdata, tdata] if $DEBUG
      tdata.gsub!(/[ \t]+/, " ")            # 空白をまとめる
      tdata.gsub!(/ $/, "")                 # 末尾の空白を削除する
      tdata.gsub!(/\n+/, "\n")              # 改行をまとめる
      tdata
    end
  }
  print data
end

--
新井康司 (Koji Arai)