1 2 3 4 5 6 7 8 9 10 11 12 13 14 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
# TDiff
* [Source](https://github.com/postmodern/tdiff)
* [Issues](https://github.com/postmodern/tdiff/issues)
* [Documentation](https://rubydoc.info/gems/tdiff)
## Description
Calculates the differences between two tree-like structures. Similar to
Rubys built-in [TSort](http://rubydoc.info/docs/ruby-stdlib/1.9.2/TSort)
module.
## Features
* Provides the {TDiff} mixin.
* Provides the {TDiff::Unordered} mixin for unordered diffing.
* Allows custom node equality and traversal logic by overriding the
{TDiff#tdiff_equal} and {TDiff#tdiff_each_child} methods.
* Implements the [Longest Common Subsequence (LCS)](http://en.wikipedia.org/wiki/Longest_common_subsequence_problem) algorithm.
## Examples
Diff two HTML documents:
```ruby
require 'nokogiri'
require 'tdiff'
class Nokogiri::XML::Node
include TDiff
def tdiff_equal(node)
if (self.text? && node.text?)
self.text == node.text
elsif (self.respond_to?(:root) && node.respond_to?(:root))
self.root.tdiff_equal(node.root)
elsif (self.respond_to?(:name) && node.respond_to?(:name))
self.name == node.name
else
false
end
end
def tdiff_each_child(node,&block)
node.children.each(&block)
end
end
doc1 = Nokogiri::HTML('<div><p>one</p> <p>three</p></div>')
doc2 = Nokogiri::HTML('<div><p>one</p> <p>two</p> <p>three</p></div>')
doc1.at('div').tdiff(doc2.at('div')) do |change,node|
puts "#{change} #{node.to_html}".ljust(30) + node.parent.path
end
```
### Output
```
+ <p>one</p> /html/body/div
+ /html/body/div
<p>one</p> /html/body/div
/html/body/div
<p>three</p> /html/body/div
- one /html/body/div/p[1]
+ two /html/body/div/p[2]
three /html/body/div/p[2]
```
## Requirements
* [ruby](http://www.ruby-lang.org/) >= 2.0.0
## Install
```shell
$ gem install tdiff
```
## Copyright
See {file:LICENSE.txt} for details.
|