A simple diff library in Elixir
Compares 2 terms that have an implementation of the Diff.Diffable
protocol and returns a list of changes from the first given binary with the second
The diff function can take the following options:
:keep_unchanged
- keeps unchanged binary parts in the returned patches:ignore
- a regex used to ignore element. Ignored parts are kept in returned in patches
Usage:
iex(1)> Diff.diff("test", "taste")
[%Diff.Modified{index: 1, length: 1, old_element: ["e"], element: ["a"]},
%Diff.Insert{index: 4, length: 1, element: ["e"]}]
Applies the given patches to the term. Takes an optional third parameter to turn the patched list created from applying the patches back into the type needed.
Usage:
iex(1)> patches = Diff.diff([1, 2, 3, 4], [1, 5, 6, 4, 8])
[%Diff.Modified{element: [5, 6], index: 1, length: 2, old_element: [2, 3]},
%Diff.Insert{element: '\b', index: 4, length: 1}]
iex(2)> Diff.patch([1, 2, 3, 4], patches)
[1, 5, 6, 4, 8]
iex(1)> patches = Diff.diff("test", "taste")
[%Diff.Modified{index: 1, length: 1, old_element: ["e"], element: ["a"]},
%Diff.Insert{index: 4, length: 1, element: ["e"]}]
iex(2)> Diff.patch("test", patches, &Enum.join/1)
"taste"
Diff.annotated_patch
takes a a data structure of annotations, and uses them when applying the patch.
Usage:
iex(1)> annotations = [
...(1)> %{delete: %{before: "<span class='deleted'>",
...(1)> after: "</span>"}},
...(1)> %{insert: %{before: "<span class='inserted'>",
...(1)> after: "</span>"}},
...(1)> %{modified: %{before: "<span class='modified'>",
...(1)> after: "</span>"}}
...(1)> ]
[%{delete: %{after: "</span>", before: "<span class='deleted'>"}},
%{insert: %{after: "</span>", before: "<span class='inserted'>"}},
%{modified: %{after: "</span>", before: "<span class='modified'>"}}]
iex(2)> patches = Diff.diff("test", "tast")
[%Diff.Modified{element: ["a"], index: 1, length: 1, old_element: ["e"]}]
iex(3)> Diff.annotated_patch("test", patches, annotations)
iex(3)> Diff.annotated_patch("test", patches, annotations)
["t", "<span class='modified'>", "a", "</span>", "s", "t"]
It takes the same optional join function as Diff.patch
as you would expect
Diff.diff
, Diff.patch
and Diff.annotated_patch
all take as a first parameter a term that has an implementation of the Diff.Diffable
protocol.
By default one exist for BitString
and List