diff --git a/src/main/java/difflib/text/DiffRowGenerator.java b/src/main/java/difflib/text/DiffRowGenerator.java index e318fa1..7f83e2b 100644 --- a/src/main/java/difflib/text/DiffRowGenerator.java +++ b/src/main/java/difflib/text/DiffRowGenerator.java @@ -73,6 +73,9 @@ public class DiffRowGenerator { private String inlineNewCssClass = "editNewInline"; private int columnWidth = 80; + private Builder() { + } + /** * Show inline diffs in generating diff rows or not. * @@ -161,7 +164,7 @@ public class DiffRowGenerator { return new DiffRowGenerator(this); } } - + public static Builder create() { return new Builder(); } @@ -195,7 +198,13 @@ public class DiffRowGenerator { * @return the DiffRows between original and revised texts */ public List generateDiffRows(List original, List revised) throws DiffException { - return generateDiffRows(original, revised, DiffUtils.diff(original, revised, equalizer)); + return generateDiffRows(original, DiffUtils.diff(original, revised, equalizer)); + } + + private DiffRow buildDiffRow(Tag type, String orgline, String newline) { + return new DiffRow(type, + StringUtils.wrapText(StringUtils.normalize(orgline), columnWidth), + StringUtils.wrapText(StringUtils.normalize(newline), columnWidth)); } /** @@ -207,15 +216,15 @@ public class DiffRowGenerator { * @param patch the given patch * @return the DiffRows between original and revised texts */ - public List generateDiffRows(final List originalText, final List revisedText, Patch patch) throws DiffException { + public List generateDiffRows(final List original, Patch patch) throws DiffException { // normalize the lines (expand tabs, escape html entities) - List original = StringUtils.normalize(originalText); - List revised = StringUtils.normalize(revisedText); + //List original = originalText; + //List revised = StringUtils.normalize(revisedText); // wrap to the column width - original = StringUtils.wrapText(original, this.columnWidth); - revised = StringUtils.wrapText(revised, this.columnWidth); - + // TODO: we want to process original text und not wrapped text + //original = StringUtils.wrapText(original, this.columnWidth); + //revised = StringUtils.wrapText(revised, this.columnWidth); List diffRows = new ArrayList<>(); int endPos = 0; final List> deltaList = patch.getDeltas(); @@ -225,22 +234,23 @@ public class DiffRowGenerator { Chunk rev = delta.getRevised(); // We should normalize and wrap lines in deltas too. - orig.setLines(StringUtils.normalize((List) orig.getLines())); - rev.setLines(StringUtils.normalize((List) rev.getLines())); - - orig.setLines(StringUtils.wrapText((List) orig.getLines(), this.columnWidth)); - rev.setLines(StringUtils.wrapText((List) rev.getLines(), this.columnWidth)); + // TODO: not in Deltas + //orig.setLines(StringUtils.normalize((List) orig.getLines())); + //rev.setLines(StringUtils.normalize((List) rev.getLines())); + //TODO: no we shouldnt: Deltas should not be used for display purposes + //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())) { - diffRows.add(new DiffRow(Tag.EQUAL, line, line)); + diffRows.add(buildDiffRow(Tag.EQUAL, line, line)); } // Inserted DiffRow if (delta instanceof InsertDelta) { endPos = orig.last() + 1; for (String line : (List) rev.getLines()) { - diffRows.add(new DiffRow(Tag.INSERT, "", line)); + diffRows.add(buildDiffRow(Tag.INSERT, "", line)); } continue; } @@ -249,29 +259,29 @@ public class DiffRowGenerator { if (delta instanceof DeleteDelta) { endPos = orig.last() + 1; for (String line : (List) orig.getLines()) { - diffRows.add(new DiffRow(Tag.DELETE, line, "")); + diffRows.add(buildDiffRow(Tag.DELETE, line, "")); } continue; } if (showInlineDiffs) { - addInlineDiffs(delta); - } - // the changed size is match - if (orig.size() == rev.size()) { - for (int j = 0; j < orig.size(); j++) { - diffRows.add(new DiffRow(Tag.CHANGE, (String) orig.getLines().get(j), - (String) rev.getLines().get(j))); - } - } else if (orig.size() > rev.size()) { - for (int j = 0; j < orig.size(); j++) { - diffRows.add(new DiffRow(Tag.CHANGE, (String) orig.getLines().get(j), rev - .getLines().size() > j ? (String) rev.getLines().get(j) : "")); - } + diffRows.addAll(generateInlineDiffs(delta, false)); } else { - for (int j = 0; j < rev.size(); j++) { - diffRows.add(new DiffRow(Tag.CHANGE, orig.getLines().size() > j ? (String) orig - .getLines().get(j) : "", (String) rev.getLines().get(j))); + if (orig.size() == rev.size()) { + for (int j = 0; j < orig.size(); j++) { + diffRows.add(buildDiffRow(Tag.CHANGE, (String) orig.getLines().get(j), + (String) rev.getLines().get(j))); + } + } else if (orig.size() > rev.size()) { + for (int j = 0; j < orig.size(); j++) { + diffRows.add(buildDiffRow(Tag.CHANGE, (String) orig.getLines().get(j), rev + .getLines().size() > j ? (String) rev.getLines().get(j) : "")); + } + } else { + for (int j = 0; j < rev.size(); j++) { + diffRows.add(buildDiffRow(Tag.CHANGE, orig.getLines().size() > j ? (String) orig + .getLines().get(j) : "", (String) rev.getLines().get(j))); + } } } endPos = orig.last() + 1; @@ -279,58 +289,70 @@ public class DiffRowGenerator { // Copy the final matching chunk if any. for (String line : original.subList(endPos, original.size())) { - diffRows.add(new DiffRow(Tag.EQUAL, line, line)); + diffRows.add(buildDiffRow(Tag.EQUAL, line, line)); } return diffRows; } - + /** * Add the inline diffs for given delta * * @param delta the given delta */ - private void addInlineDiffs(Delta delta) throws DiffException { - List orig = (List) delta.getOriginal().getLines(); - List rev = (List) delta.getRevised().getLines(); - LinkedList origList = new LinkedList<>(); - for (Character character : String.join("\n", orig).toCharArray()) { - origList.add(character.toString()); - } - LinkedList revList = new LinkedList<>(); - for (Character character : String.join("\n", rev).toCharArray()) { - revList.add(character.toString()); - } - List> inlineDeltas = DiffUtils.diff(origList, revList).getDeltas(); - if (inlineDeltas.size() < 3) { - Collections.reverse(inlineDeltas); - for (Delta inlineDelta : inlineDeltas) { - Chunk inlineOrig = inlineDelta.getOriginal(); - Chunk inlineRev = inlineDelta.getRevised(); - if (inlineDelta instanceof DeleteDelta) { - origList = wrapInTag(origList, inlineOrig.getPosition(), inlineOrig - .getPosition() - + inlineOrig.size() + 1, this.inlineOldTag, this.inlineOldCssClass); - } else if (inlineDelta instanceof InsertDelta) { - revList = wrapInTag(revList, inlineRev.getPosition(), inlineRev.getPosition() - + inlineRev.size() + 1, this.inlineNewTag, this.inlineNewCssClass); - } else if (inlineDelta instanceof ChangeDelta) { - origList = wrapInTag(origList, inlineOrig.getPosition(), inlineOrig - .getPosition() - + inlineOrig.size() + 1, this.inlineOldTag, this.inlineOldCssClass); - revList = wrapInTag(revList, inlineRev.getPosition(), inlineRev.getPosition() - + inlineRev.size() + 1, this.inlineNewTag, this.inlineNewCssClass); - } + private List generateInlineDiffs(Delta delta, boolean mergeToTarget) throws DiffException { + if (delta.getType()!=Delta.DeltaType.CHANGE) + throw new IllegalArgumentException("only for change deltas allowed"); +// List orig = delta.getOriginal().getLines(); +// List rev = delta.getRevised().getLines(); +// LinkedList origList = new LinkedList<>(); +// for (Character character : String.join("\n", orig).toCharArray()) { +// origList.add(character.toString()); +// } +// LinkedList revList = new LinkedList<>(); +// for (Character character : String.join("\n", rev).toCharArray()) { +// revList.add(character.toString()); +// } +// List> inlineDeltas = DiffUtils.diff(origList, revList).getDeltas(); + Patch patch = DiffUtils.diffInline(String.join("\n", delta.getOriginal().getLines()), String.join("\n", delta.getRevised().getLines())); + if (patch.getDeltas().size() < 3) { + List> deltas = new ArrayList<>(patch.getDeltas()); + Collections.reverse(deltas); + + for (Delta inlineDelta : deltas) { + System.out.println(inlineDelta); } - StringBuilder origResult = new StringBuilder(), revResult = new StringBuilder(); - for (String character : origList) { - origResult.append(character); - } - for (String character : revList) { - revResult.append(character); - } - delta.getOriginal().setLines(Arrays.asList(origResult.toString().split("\n"))); - delta.getRevised().setLines(Arrays.asList(revResult.toString().split("\n"))); - } + + + return Collections.EMPTY_LIST; +// Collections.reverse(inlineDeltas); +// for (Delta inlineDelta : inlineDeltas) { +// Chunk inlineOrig = inlineDelta.getOriginal(); +// Chunk inlineRev = inlineDelta.getRevised(); +// if (inlineDelta instanceof DeleteDelta) { +// origList = wrapInTag(origList, inlineOrig.getPosition(), inlineOrig +// .getPosition() +// + inlineOrig.size() + 1, this.inlineOldTag, this.inlineOldCssClass); +// } else if (inlineDelta instanceof InsertDelta) { +// revList = wrapInTag(revList, inlineRev.getPosition(), inlineRev.getPosition() +// + inlineRev.size() + 1, this.inlineNewTag, this.inlineNewCssClass); +// } else if (inlineDelta instanceof ChangeDelta) { +// origList = wrapInTag(origList, inlineOrig.getPosition(), inlineOrig +// .getPosition() +// + inlineOrig.size() + 1, this.inlineOldTag, this.inlineOldCssClass); +// revList = wrapInTag(revList, inlineRev.getPosition(), inlineRev.getPosition() +// + inlineRev.size() + 1, this.inlineNewTag, this.inlineNewCssClass); +// } +// } +// StringBuilder origResult = new StringBuilder(), revResult = new StringBuilder(); +// for (String character : origList) { +// origResult.append(character); +// } +// for (String character : revList) { +// revResult.append(character); +// } +// delta.getOriginal().setLines(Arrays.asList(origResult.toString().split("\n"))); +// delta.getRevised().setLines(Arrays.asList(revResult.toString().split("\n"))); + } else return Collections.emptyList(); } /** diff --git a/src/test/java/diffutils/DiffUtilsTest.java b/src/test/java/difflib/DiffUtilsTest.java similarity index 99% rename from src/test/java/diffutils/DiffUtilsTest.java rename to src/test/java/difflib/DiffUtilsTest.java index 4b84606..5d78891 100644 --- a/src/test/java/diffutils/DiffUtilsTest.java +++ b/src/test/java/difflib/DiffUtilsTest.java @@ -1,4 +1,4 @@ -package diffutils; +package difflib; import difflib.*; import difflib.algorithm.DiffException; diff --git a/src/test/java/diffutils/GenerateUnifiedDiffTest.java b/src/test/java/difflib/GenerateUnifiedDiffTest.java similarity index 99% rename from src/test/java/diffutils/GenerateUnifiedDiffTest.java rename to src/test/java/difflib/GenerateUnifiedDiffTest.java index 4f2e2b8..72d9aec 100644 --- a/src/test/java/diffutils/GenerateUnifiedDiffTest.java +++ b/src/test/java/difflib/GenerateUnifiedDiffTest.java @@ -1,4 +1,4 @@ -package diffutils; +package difflib; import difflib.DiffUtils; import difflib.algorithm.DiffException; diff --git a/src/test/java/diffutils/TestConstants.java b/src/test/java/difflib/TestConstants.java similarity index 97% rename from src/test/java/diffutils/TestConstants.java rename to src/test/java/difflib/TestConstants.java index 5560332..253f022 100644 --- a/src/test/java/diffutils/TestConstants.java +++ b/src/test/java/difflib/TestConstants.java @@ -1,4 +1,4 @@ -package diffutils; +package difflib; import java.io.File; diff --git a/src/test/java/diffutils/examples/ApplyPatch.java b/src/test/java/difflib/examples/ApplyPatch.java similarity index 93% rename from src/test/java/diffutils/examples/ApplyPatch.java rename to src/test/java/difflib/examples/ApplyPatch.java index 596e27c..db798ea 100644 --- a/src/test/java/diffutils/examples/ApplyPatch.java +++ b/src/test/java/difflib/examples/ApplyPatch.java @@ -1,9 +1,9 @@ -package diffutils.examples; +package difflib.examples; import difflib.DiffUtils; import difflib.patch.Patch; import difflib.patch.PatchFailedException; -import diffutils.TestConstants; +import difflib.TestConstants; import java.util.List; public class ApplyPatch extends Example { diff --git a/src/test/java/diffutils/examples/ComputeDifference.java b/src/test/java/difflib/examples/ComputeDifference.java similarity index 93% rename from src/test/java/diffutils/examples/ComputeDifference.java rename to src/test/java/difflib/examples/ComputeDifference.java index 0c76dd4..e71cebc 100644 --- a/src/test/java/diffutils/examples/ComputeDifference.java +++ b/src/test/java/difflib/examples/ComputeDifference.java @@ -1,10 +1,10 @@ -package diffutils.examples; +package difflib.examples; import difflib.DiffUtils; import difflib.algorithm.DiffException; import difflib.patch.Delta; import difflib.patch.Patch; -import diffutils.TestConstants; +import difflib.TestConstants; import java.util.List; public class ComputeDifference extends Example { diff --git a/src/test/java/diffutils/examples/Example.java b/src/test/java/difflib/examples/Example.java similarity index 97% rename from src/test/java/diffutils/examples/Example.java rename to src/test/java/difflib/examples/Example.java index 58682b3..502a6ef 100644 --- a/src/test/java/diffutils/examples/Example.java +++ b/src/test/java/difflib/examples/Example.java @@ -1,4 +1,4 @@ -package diffutils.examples; +package difflib.examples; import java.io.BufferedReader; import java.io.File; diff --git a/src/test/java/diffutils/patch/PatchTest.java b/src/test/java/difflib/patch/PatchTest.java similarity index 98% rename from src/test/java/diffutils/patch/PatchTest.java rename to src/test/java/difflib/patch/PatchTest.java index 9919176..7079a4b 100644 --- a/src/test/java/diffutils/patch/PatchTest.java +++ b/src/test/java/difflib/patch/PatchTest.java @@ -1,4 +1,4 @@ -package diffutils.patch; +package difflib.patch; import difflib.DiffUtils; import difflib.algorithm.DiffException; diff --git a/src/test/java/diffutils/rows/DiffRowGeneratorTest.java b/src/test/java/difflib/text/DiffRowGeneratorTest.java similarity index 71% rename from src/test/java/diffutils/rows/DiffRowGeneratorTest.java rename to src/test/java/difflib/text/DiffRowGeneratorTest.java index effdc8b..29cff1b 100644 --- a/src/test/java/diffutils/rows/DiffRowGeneratorTest.java +++ b/src/test/java/difflib/text/DiffRowGeneratorTest.java @@ -1,4 +1,4 @@ -package diffutils.rows; +package difflib.text; import difflib.algorithm.DiffException; import difflib.text.DiffRow; @@ -16,7 +16,7 @@ public class DiffRowGeneratorTest { String first = "anything \n \nother"; String second = "anything\n\nother"; - DiffRowGenerator generator = new DiffRowGenerator.Builder() + DiffRowGenerator generator = DiffRowGenerator.create() .columnWidth(Integer.MAX_VALUE) // do not wrap .build(); List rows = generator.generateDiffRows(split(first), split(second)); @@ -30,7 +30,7 @@ public class DiffRowGeneratorTest { String first = "anything \n \nother"; String second = "anything\n\nother"; - DiffRowGenerator generator = new DiffRowGenerator.Builder() + DiffRowGenerator generator = DiffRowGenerator.create() .showInlineDiffs(true) .columnWidth(Integer.MAX_VALUE) // do not wrap .build(); @@ -46,7 +46,7 @@ public class DiffRowGeneratorTest { String first = "anything \n \nother\nmore lines"; String second = "anything\n\nother\nsome more lines"; - DiffRowGenerator generator = new DiffRowGenerator.Builder() + DiffRowGenerator generator = DiffRowGenerator.create() .ignoreWhiteSpaces(true) .columnWidth(Integer.MAX_VALUE) // do not wrap .build(); @@ -69,4 +69,21 @@ public class DiffRowGeneratorTest { System.out.println(row); } } + + @Test + public void testGeneratorWithWordWrap() throws DiffException { + String first = "anything \n \nother"; + String second = "anything\n\nother"; + + DiffRowGenerator generator = DiffRowGenerator.create() + .columnWidth(5) + .build(); + List rows = generator.generateDiffRows(split(first), split(second)); + print(rows); + + assertEquals(3, rows.size()); + assertEquals("[CHANGE,anyth
ing ,anyth
ing]", rows.get(0).toString()); + assertEquals("[CHANGE, ,]", rows.get(1).toString()); + assertEquals("[EQUAL,other,other]", rows.get(2).toString()); + } } diff --git a/src/test/java/difflib/text/StringUtilsTest.java b/src/test/java/difflib/text/StringUtilsTest.java index 7db40e5..ac22ddf 100644 --- a/src/test/java/difflib/text/StringUtilsTest.java +++ b/src/test/java/difflib/text/StringUtilsTest.java @@ -15,6 +15,7 @@ */ package difflib.text; +import difflib.text.StringUtils; import java.util.Collections; import org.junit.After; import org.junit.AfterClass;