黒崎です。野分さん、ありがとうございます。

On Wed, 23 Jun 2004 02:59:03 +0900, in message
  "[ruby-list:39784] Re: SimpleDiff"
  <20040623022059.FADD.NOWAKE / fiercewinds.net>
  Nowake <nowake / fiercewinds.net> wrote...
> 差分データをいじくりたい場合は、DefaultResultCreatorから派生したクラスを作
> 成し、必要な挙動を定義したあと、Diffを実行するときにポリシークラス(モド
> キ……Modern C++ Design ですね)としてメソッドに指定します。

CVSのほうをダウンロードしてみて、なんとなくわかりました。
こんな感じで使えばよいのでしょうか。

メソッド名が patch でよかったのか自信がないですが…。

--
require 'simple-diff'

module Algorithm
  module SimpleDiff
    class HtmlResultCreator < DefaultResultCreator
      def self.tokenize(data)
        data.scan(/\W+|\w+/)
      end
      def self.create(diff)
        HtmlResult.new(create_diff_data(diff))
      end
      protected
      class HtmlResult < OriginalBaseResult
        EDIT_TAGS = { 1 => 'del', 2 => 'ins' }
        def patch(original)
          orig = HtmlResultCreator.tokenize(original)
          r = []
          i = 0
          j = 0
          while i < orig.size
            if j < @data.size && @data[j][0] == i then
              EDIT_TAGS.each do |k, tag|
                if @data[j][k].size > 0 then
                  r.push('<' + tag + '>')
                  r.concat(@data[j][k])
                  r.push('</' + tag + '>')
                end
              end
              i += @data[j][1].size
              j += 1
            else
              r.push(orig[i])
              i += 1
            end
          end
          if j < @data.size then
            r.push('<ins>')
            r.concat(@data[j][2])
            r.push('</ins>')
          end
          r.join
        end
      end
    end
  end
end

a = "How are you."
b = "How do you do."

result = Algorithm::SimpleDiff::Diff.new(a, b, Algorithm::SimpleDiff::HtmlResultCreator).result
puts result.patch(a)
--

結果:
How <del>are</del><ins>do</ins> you<ins> do</ins>.

--
Hiroyuki KUROSAKI
<noir / st.rim.or.jp>