class Card::Content::Diff::Summary

Summary object for Diff processing

Constants

JOINT_REPLACEMENT

Public Class Methods

new(opts) click to toggle source
# File lib/card/content/diff/summary.rb, line 6
def initialize opts
  opts ||= {}
  @remaining_chars = opts[:length] || 50
  @joint = opts[:joint] || "..."
  @chunks = []
end

Public Instance Methods

add(text) click to toggle source
# File lib/card/content/diff/summary.rb, line 17
def add text
  add_chunk text, :added
end
delete(text) click to toggle source
# File lib/card/content/diff/summary.rb, line 21
def delete text
  add_chunk text, :deleted
end
omit() click to toggle source
# File lib/card/content/diff/summary.rb, line 25
def omit
  return unless @chunks.empty? || @chunks.last[:action] != :ellipsis

  add_chunk @joint, :ellipsis
end
omits_content?() click to toggle source
# File lib/card/content/diff/summary.rb, line 31
def omits_content?
  @content_omitted || @remaining_chars.negative?
end
rendered() click to toggle source
# File lib/card/content/diff/summary.rb, line 13
def rendered
  @rendered ||= render
end

Private Instance Methods

add_chunk(text, action) click to toggle source
# File lib/card/content/diff/summary.rb, line 45
def add_chunk text, action
  return unless @remaining_chars.positive?

  add_chunk_to_list text, action
  @remaining_chars -= text.size
end
add_chunk_to_list(text, action) click to toggle source
# File lib/card/content/diff/summary.rb, line 52
def add_chunk_to_list text, action
  @chunks << { action: action, text: text }
end
chunk_text(index) click to toggle source
# File lib/card/content/diff/summary.rb, line 82
def chunk_text index
  @chunks[index][:text]
end
cut_with_joint(index) click to toggle source
# File lib/card/content/diff/summary.rb, line 114
def cut_with_joint index
  cut_range = 0..(@remaining_chars - @joint.size - 1)
  @chunks[index][:text] = chunk_text(index)[cut_range]
  @chunks[index][:text] += @joint
end
overlap_finished(index) click to toggle source
# File lib/card/content/diff/summary.rb, line 102
def overlap_finished index
  overlap_size = @remaining_chars + chunk_text(index).size
  if overlap_size == @joint.size
    replace_with_joint index
  elsif overlap_size > @joint.size
    cut_with_joint index
  else
    return false
  end
  true
end
process_ellipsis() click to toggle source
# File lib/card/content/diff/summary.rb, line 86
def process_ellipsis
  return unless @chunks.last[:action] == :ellipsis

  @chunks.pop
  @content_omitted = true
  @remaining_chars += @joint.size
end
process_overlap(index) click to toggle source
# File lib/card/content/diff/summary.rb, line 94
def process_overlap index
  return true if overlap_finished index

  @remaining_chars += chunk_text(index).size
  @chunks.delete_at(index)
  false
end
process_remaining(index) click to toggle source
# File lib/card/content/diff/summary.rb, line 74
def process_remaining index
  process_overlap(index) ? break : (index -= 1) while process_remaining? index
end
process_remaining?(index) click to toggle source
# File lib/card/content/diff/summary.rb, line 78
def process_remaining? index
  @remaining_chars < @joint.size && index >= 0
end
render() click to toggle source
# File lib/card/content/diff/summary.rb, line 37
def render
  truncate_overlap
  @chunks.map do |chunk|
    @content_omitted ||= chunk[:action] == :ellipsis
    render_chunk chunk[:action], chunk[:text]
  end.join
end
render_chunk(action, text) click to toggle source
# File lib/card/content/diff/summary.rb, line 56
def render_chunk action, text
  case action
  when "+", :added
    Diff.render_added_chunk text
  when "-", :deleted
    Diff.render_deleted_chunk text
  else text
  end
end
replace_with_joint(index) click to toggle source
# File lib/card/content/diff/summary.rb, line 122
def replace_with_joint index
  @chunks.pop
  return unless index.positive? &&
                (previous_action = JOINT_REPLACEMENT[@chunks[index - 1][:action]])

  add_chunk_to_list @joint, previous_action
end
truncate_overlap() click to toggle source
# File lib/card/content/diff/summary.rb, line 66
def truncate_overlap
  return unless @remaining_chars.negative?

  process_ellipsis
  index = @chunks.size - 1
  process_remaining index
end