class DiffGenerator

Constants

MAX_TIME

Public Class Methods

gen_ary(s1, s2) click to toggle source
# File vendor/qwik/lib/qwik/wabisabi-diff.rb, line 18
def self.gen_ary(s1, s2)
  s1 = s1.gsub(/\r/, '')
  s2 = s2.gsub(/\r/, '')
  a1 = s1.split("\n").collect! {|s| "#{s}\n"}
  a2 = s2.split("\n").collect! {|s| "#{s}\n"}
  Diff.diff(a1, a2) 
end
generate(s1, s2, maxtime=MAX_TIME) click to toggle source

ref. moonrock.jp/%7Edon/wikimodoki/security.html

# File vendor/qwik/lib/qwik/wabisabi-diff.rb, line 29
def self.generate(s1, s2, maxtime=MAX_TIME)
  result = nil
  begin
    Timeout.timeout(maxtime) {
      result = generate_internal(s1, s2)
    }
  rescue Timeout::Error
    return ['timeout']
  end
  result
end
generate_internal(s1, s2) click to toggle source
# File vendor/qwik/lib/qwik/wabisabi-diff.rb, line 41
def self.generate_internal(s1, s2)
  s1 = s1.gsub(/\r/, '')
  s2 = s2.gsub(/\r/, '')

  # why?
  #src = s1.split("\n").collect {|s| "#{s.escapeHTML}" }
  #src = s1
  src = s1.split("\n").collect {|s| s }

  si = 0
  di = 0
  e = []
  self.gen_ary(s1, s2).each {|action, position, elements|
    case action
    when :-
        while si < position
          e << src[si]
          e << [:br]
          si += 1
          di += 1
        end
      si += elements.length
      elements.each {|l|
        e << [:del, l.chomp]
        e << [:br]
      }
    when :+
        while di < position
          e << src[si]
          e << [:br]
          si += 1
          di += 1
        end
      di += elements.length
      elements.each {|l|
        e << [:ins, l.chomp]
        e << [:br]
      }
    end
  }
  while si < src.length
    e << src[si]
    e << [:br]
    si += 1
  end
  e
end