From e5622a3b3ed7302f12e7c7aa50a3a291ca4a0bbf Mon Sep 17 00:00:00 2001 From: wumpz Date: Fri, 31 Mar 2017 09:36:44 +0200 Subject: [PATCH] introduced diffInline, some cleanup --- src/main/java/difflib/DiffRowGenerator.java | 18 ++++---- src/main/java/difflib/DiffUtils.java | 42 +++++++++++++++++++ src/main/java/difflib/Patch.java | 2 +- .../{StringUtills.java => StringUtils.java} | 4 +- .../{DiffTest.java => DiffUtilsTest.java} | 25 ++++++++++- 5 files changed, 78 insertions(+), 13 deletions(-) rename src/main/java/difflib/{StringUtills.java => StringUtils.java} (97%) rename src/test/java/diffutils/{DiffTest.java => DiffUtilsTest.java} (67%) diff --git a/src/main/java/difflib/DiffRowGenerator.java b/src/main/java/difflib/DiffRowGenerator.java index fbd1f3f..e0562d9 100644 --- a/src/main/java/difflib/DiffRowGenerator.java +++ b/src/main/java/difflib/DiffRowGenerator.java @@ -217,12 +217,12 @@ public class DiffRowGenerator { */ public List generateDiffRows(List original, List revised, Patch patch) { // normalize the lines (expand tabs, escape html entities) - original = StringUtills.normalize(original); - revised = StringUtills.normalize(revised); + original = StringUtils.normalize(original); + revised = StringUtils.normalize(revised); // wrap to the column width - original = StringUtills.wrapText(original, this.columnWidth); - revised = StringUtills.wrapText(revised, this.columnWidth); + original = StringUtils.wrapText(original, this.columnWidth); + revised = StringUtils.wrapText(revised, this.columnWidth); List diffRows = new ArrayList<>(); int endPos = 0; @@ -233,11 +233,11 @@ public class DiffRowGenerator { Chunk rev = delta.getRevised(); // We should normalize and wrap lines in deltas too. - orig.setLines(StringUtills.normalize((List) orig.getLines())); - rev.setLines(StringUtills.normalize((List) rev.getLines())); + orig.setLines(StringUtils.normalize((List) orig.getLines())); + rev.setLines(StringUtils.normalize((List) rev.getLines())); - orig.setLines(StringUtills.wrapText((List) orig.getLines(), this.columnWidth)); - rev.setLines(StringUtills.wrapText((List) rev.getLines(), this.columnWidth)); + orig.setLines(StringUtils.wrapText((List) orig.getLines(), this.columnWidth)); + rev.setLines(StringUtils.wrapText((List) rev.getLines(), this.columnWidth)); // catch the equal prefix for each chunk for (String line : original.subList(endPos, orig.getPosition())) { @@ -291,7 +291,7 @@ public class DiffRowGenerator { } return diffRows; } - + /** * Add the inline diffs for given delta * diff --git a/src/main/java/difflib/DiffUtils.java b/src/main/java/difflib/DiffUtils.java index 2e694e3..d310d90 100644 --- a/src/main/java/difflib/DiffUtils.java +++ b/src/main/java/difflib/DiffUtils.java @@ -18,6 +18,8 @@ package difflib; import difflib.myers.Equalizer; import difflib.myers.MyersDiff; import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -92,6 +94,46 @@ public final class DiffUtils { return algorithm.diff(original, revised); } + /** + * Computes the difference between the given texts inline. This one uses the "trick" to make out + * of texts lists of characters, like DiffRowGenerator does and merges those changes at the end + * together again. + * + * @param original + * @param revised + * @return + */ + public static Patch diffInline(String original, String revised) { + LinkedList origList = new LinkedList<>(); + LinkedList revList = new LinkedList<>(); + for (Character character : original.toCharArray()) { + origList.add(character.toString()); + } + for (Character character : revised.toCharArray()) { + revList.add(character.toString()); + } + Patch patch = DiffUtils.diff(origList, revList); + for (Delta delta : patch.getDeltas()) { + delta.getOriginal().setLines(compressLines(delta.getOriginal().getLines(), "")); + delta.getRevised().setLines(compressLines(delta.getRevised().getLines(), "")); + } + return patch; + } + + private static List compressLines(List lines, String delimiter) { + StringBuilder b = new StringBuilder(); + for (String line : lines) { + b.append(line); + b.append(delimiter); + } + if (b.length() > 0) { + b.setLength(b.length() - delimiter.length()); + return Collections.singletonList(b.toString()); + } else { + return Collections.EMPTY_LIST; + } + } + /** * Patch the original text with given patch * diff --git a/src/main/java/difflib/Patch.java b/src/main/java/difflib/Patch.java index 5a6f082..63257ff 100644 --- a/src/main/java/difflib/Patch.java +++ b/src/main/java/difflib/Patch.java @@ -28,7 +28,7 @@ import java.util.ListIterator; */ public class Patch { - private List> deltas = new LinkedList<>(); + private final List> deltas = new LinkedList<>(); /** * Apply this patch to the given target diff --git a/src/main/java/difflib/StringUtills.java b/src/main/java/difflib/StringUtils.java similarity index 97% rename from src/main/java/difflib/StringUtills.java rename to src/main/java/difflib/StringUtils.java index 443bd99..768b0cc 100644 --- a/src/main/java/difflib/StringUtills.java +++ b/src/main/java/difflib/StringUtils.java @@ -19,7 +19,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; -public final class StringUtills { +public final class StringUtils { public static String join(final Iterable objs, final String delimiter) { Iterator iter = objs.iterator(); @@ -94,6 +94,6 @@ public final class StringUtills { return line; } - private StringUtills() { + private StringUtils() { } } diff --git a/src/test/java/diffutils/DiffTest.java b/src/test/java/diffutils/DiffUtilsTest.java similarity index 67% rename from src/test/java/diffutils/DiffTest.java rename to src/test/java/diffutils/DiffUtilsTest.java index 82d678b..6e65deb 100644 --- a/src/test/java/diffutils/DiffTest.java +++ b/src/test/java/diffutils/DiffUtilsTest.java @@ -10,7 +10,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.Test; -public class DiffTest { +public class DiffUtilsTest { @Test public void testDiff_Insert() { @@ -65,4 +65,27 @@ public class DiffTest { final Delta delta = patch.getDeltas().get(0); assertTrue(delta instanceof InsertDelta); } + + @Test + public void testDiffInline() { + final Patch patch = DiffUtils.diffInline("", "test"); + assertEquals(1, patch.getDeltas().size()); + assertTrue(patch.getDeltas().get(0) instanceof InsertDelta); + assertEquals(0, patch.getDeltas().get(0).getOriginal().getPosition()); + assertEquals(0, patch.getDeltas().get(0).getOriginal().getLines().size()); + assertEquals("test", patch.getDeltas().get(0).getRevised().getLines().get(0)); + } + + @Test + public void testDiffInline2() { + final Patch patch = DiffUtils.diffInline("es", "fest"); + assertEquals(2, patch.getDeltas().size()); + assertTrue(patch.getDeltas().get(0) instanceof InsertDelta); + assertEquals(0, patch.getDeltas().get(0).getOriginal().getPosition()); + assertEquals(2, patch.getDeltas().get(1).getOriginal().getPosition()); + assertEquals(0, patch.getDeltas().get(0).getOriginal().getLines().size()); + assertEquals(0, patch.getDeltas().get(1).getOriginal().getLines().size()); + assertEquals("f", patch.getDeltas().get(0).getRevised().getLines().get(0)); + assertEquals("t", patch.getDeltas().get(1).getRevised().getLines().get(0)); + } }