Class: Markdiff::Operations::TextDiffOperation

Inherits:
Base
  • Object
show all
Defined in:
lib/markdiff/operations/text_diff_operation.rb

Instance Attribute Summary

Attributes inherited from Base

#target_node

Instance Method Summary collapse

Constructor Details

#initialize(after_node:, **args) ⇒ TextDiffOperation

Returns a new instance of TextDiffOperation.

Parameters:

  • after_node (Nokogiri::XML::Node)


9
10
11
12
# File 'lib/markdiff/operations/text_diff_operation.rb', line 9

def initialize(after_node:, **args)
  super(**args)
  @after_node = after_node
end

Instance Method Details

#inserted_nodeNokogiri::XML::Node

Returns:

  • (Nokogiri::XML::Node)


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/markdiff/operations/text_diff_operation.rb', line 15

def inserted_node
  before_elements = target_node.to_s.split(" ")
  after_elements = @after_node.to_s.split(" ")
  last_deleted_pos = nil

  ::Diff::LCS.diff(before_elements, after_elements).flatten(1).each do |operation|
    type, position, element = *operation

    if type == "-"
      before_elements[position] = %(<del class="del">#{element}</del>)
      last_deleted_pos = position
    elsif type == "+"
      insert = "<ins>#{element}</ins>"

      if last_deleted_pos == position
        before_elements[position] = "#{before_elements[position]}#{insert}"
      else
        before_elements[position] = "#{insert}#{before_elements[position]}"
      end
    else
      raise "Unhandled type: #{type}"
    end
  end

  ::Nokogiri::HTML.fragment(before_elements.join(" "))
end

#priorityObject



42
43
44
# File 'lib/markdiff/operations/text_diff_operation.rb', line 42

def priority
  1
end