File: lib/redmine/helpers/diff.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Redmine#18
  module: Helpers#19
  class: Diff#20
includes
  Util ( ERB )
  TagHelper ( ActionView::Helpers )
  TextHelper ( ActionView::Helpers )
inherits from
  Object ( Builtin-Module )
has properties
attribute: diff [R] #24
attribute: words [R] #24
method: initialize / 2 #26
method: to_html #34

Class Hierarchy

Object ( Builtin-Module )
  Diff ( Redmine::Helpers ) #20

Code

   1  # Redmine - project management software
   2  # Copyright (C) 2006-2011  Jean-Philippe Lang
   3  #
   4  # This program is free software; you can redistribute it and/or
   5  # modify it under the terms of the GNU General Public License
   6  # as published by the Free Software Foundation; either version 2
   7  # of the License, or (at your option) any later version.
   8  #
   9  # This program is distributed in the hope that it will be useful,
  10  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  # GNU General Public License for more details.
  13  #
  14  # You should have received a copy of the GNU General Public License
  15  # along with this program; if not, write to the Free Software
  16  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17 
  18  module Redmine
  19    module Helpers
  20      class Diff
  21        include ERB::Util
  22        include ActionView::Helpers::TagHelper
  23        include ActionView::Helpers::TextHelper
  24        attr_reader :diff, :words
  25 
  26        def initialize(content_to, content_from)
  27          @words = content_to.to_s.split(/(\s+)/)
  28          @words = @words.select {|word| word != ' '}
  29          words_from = content_from.to_s.split(/(\s+)/)
  30          words_from = words_from.select {|word| word != ' '}
  31          @diff = words_from.diff @words
  32        end
  33 
  34        def to_html
  35          words = self.words.collect{|word| h(word)}
  36          words_add = 0
  37          words_del = 0
  38          dels = 0
  39          del_off = 0
  40          diff.diffs.each do |diff|
  41            add_at = nil
  42            add_to = nil
  43            del_at = nil
  44            deleted = ""
  45            diff.each do |change|
  46              pos = change[1]
  47              if change[0] == "+"
  48                add_at = pos + dels unless add_at
  49                add_to = pos + dels
  50                words_add += 1
  51              else
  52                del_at = pos unless del_at
  53                deleted << ' ' + h(change[2])
  54                words_del  += 1
  55              end
  56            end
  57            if add_at
  58              words[add_at] = '<span class="diff_in">' + words[add_at]
  59              words[add_to] = words[add_to] + '</span>'
  60            end
  61            if del_at
  62              words.insert del_at - del_off + dels + words_add, '<span class="diff_out">' + deleted + '</span>'
  63              dels += 1
  64              del_off += words_del
  65              words_del = 0
  66            end
  67          end
  68          words.join(' ').html_safe
  69        end
  70      end
  71    end
  72  end