class HypDiff::ChangeRenderer

@api private

Attributes

deletions[R]
insertions[R]
new_text[R]

Public Class Methods

new(render_deletion, render_insertion) click to toggle source
# File lib/hyp_diff.rb, line 93
def initialize(render_deletion, render_insertion)
  @new_text = []
  @render_deletion = render_deletion
  @render_insertion = render_insertion
end
render(changes, render_deletion, render_insertion) click to toggle source
# File lib/hyp_diff.rb, line 89
def self.render(changes, render_deletion, render_insertion)
  renderer = new(render_deletion, render_insertion).render(changes).rendered_text
end

Public Instance Methods

render(changes) click to toggle source
# File lib/hyp_diff.rb, line 99
def render(changes)
  @insertions = []
  @deletions = []

  changes.each do |change|
    case change.action
    when "!" then
      deletions << change.old_element.text
      insertions << change.new_element.text
    when "=" then
      apply_insertions_and_deletions
      new_text << escape_html(change.new_element.text)
    when "+" then
      insertions << change.new_element.text
    when "-" then
      deletions << change.old_element.text
    else
      raise "unexpected change.action #{change.action}"
    end
  end

  apply_insertions_and_deletions

  self
end
rendered_text() click to toggle source
# File lib/hyp_diff.rb, line 125
def rendered_text
  new_text.join
end

Private Instance Methods

apply_insertions_and_deletions() click to toggle source
# File lib/hyp_diff.rb, line 133
def apply_insertions_and_deletions
  if deletions.length > 0
    new_text << deletion_tag(deletions.join)
  end
  if insertions.length > 0
    new_text << insertion_tag(insertions.join)
  end

  @insertions = []
  @deletions = []
end
deletion_tag(text) click to toggle source
# File lib/hyp_diff.rb, line 149
def deletion_tag(text)
  @render_deletion.call(escape_html(text))
end
escape_html(text) click to toggle source
# File lib/hyp_diff.rb, line 153
def escape_html(text)
  fragment = Nokogiri::HTML::DocumentFragment.parse("")
  fragment.content = text
  fragment.to_html
end
insertion_tag(text) click to toggle source
# File lib/hyp_diff.rb, line 145
def insertion_tag(text)
  @render_insertion.call(escape_html(text))
end