class Card::Content::Diff::Summary
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