diff --git a/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java b/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java index 9313dfc..d4b9e0e 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java +++ b/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java @@ -107,7 +107,8 @@ public final class DiffRowGenerator { * @param tagGenerator the tag generator */ static void wrapInTag(List sequence, int startPosition, - int endPosition, Function tagGenerator) { + int endPosition, Function tagGenerator, + Function processDiffs) { int endPos = endPosition; while (endPos >= startPosition) { @@ -125,6 +126,10 @@ public final class DiffRowGenerator { } sequence.add(endPos, tagGenerator.apply(false)); + if (processDiffs != null) { + sequence.set(endPos - 1, + processDiffs.apply(sequence.get(endPos - 1))); + } endPos--; //search position for end tag @@ -132,16 +137,19 @@ public final class DiffRowGenerator { if ("\n".equals(sequence.get(endPos - 1))) { break; } + if (processDiffs != null) { + sequence.set(endPos - 1, + processDiffs.apply(sequence.get(endPos - 1))); + } endPos--; } sequence.add(endPos, tagGenerator.apply(true)); endPos--; } - -// sequence.add(endPosition, tagGenerator.apply(false)); -// sequence.add(startPosition, tagGenerator.apply(true)); } + + private final int columnWidth; private final BiPredicate equalizer; private final boolean ignoreWhiteSpaces; @@ -151,6 +159,7 @@ public final class DiffRowGenerator { private final Function oldTag; private final boolean reportLinesUnchanged; private final Function lineNormalizer; + private final Function processDiffs; private final boolean showInlineDiffs; @@ -165,6 +174,7 @@ public final class DiffRowGenerator { equalizer = ignoreWhiteSpaces ? IGNORE_WHITESPACE_EQUALIZER : DEFAULT_EQUALIZER; reportLinesUnchanged = builder.reportLinesUnchanged; lineNormalizer = builder.lineNormalizer; + processDiffs = builder.processDiffs; Objects.requireNonNull(inlineDiffSplitter); Objects.requireNonNull(lineNormalizer); @@ -178,7 +188,8 @@ public final class DiffRowGenerator { * @param revised the revised text * @return the DiffRows between original and revised texts */ - public List generateDiffRows(List original, List revised) throws DiffException { + public List generateDiffRows(List original, List revised) + throws DiffException { return generateDiffRows(original, DiffUtils.diff(original, revised, equalizer)); } @@ -190,7 +201,8 @@ public final class DiffRowGenerator { * @param patch the given patch * @return the DiffRows between original and revised texts */ - public List generateDiffRows(final List original, Patch patch) throws DiffException { + public List generateDiffRows(final List original, Patch patch) + throws DiffException { List diffRows = new ArrayList<>(); int endPos = 0; final List> deltaList = patch.getDeltas(); @@ -280,7 +292,8 @@ public final class DiffRowGenerator { * * @param delta the given delta */ - private List generateInlineDiffs(AbstractDelta delta) throws DiffException { + private List generateInlineDiffs(AbstractDelta delta) + throws DiffException { List orig = normalizeLines(delta.getSource().getLines()); List rev = normalizeLines(delta.getTarget().getLines()); List origList; @@ -300,32 +313,36 @@ public final class DiffRowGenerator { if (inlineDelta instanceof DeleteDelta) { wrapInTag(origList, inlineOrig.getPosition(), inlineOrig .getPosition() - + inlineOrig.size(), oldTag); + + inlineOrig.size(), oldTag, processDiffs); } else if (inlineDelta instanceof InsertDelta) { if (mergeOriginalRevised) { origList.addAll(inlineOrig.getPosition(), - revList.subList(inlineRev.getPosition(), inlineRev.getPosition() - + inlineRev.size())); - wrapInTag(origList, inlineOrig.getPosition(), inlineOrig.getPosition() - + inlineRev.size(), newTag); + revList.subList(inlineRev.getPosition(), + inlineRev.getPosition() + inlineRev.size())); + wrapInTag(origList, inlineOrig.getPosition(), + inlineOrig.getPosition() + inlineRev.size(), + newTag, processDiffs); } else { - wrapInTag(revList, inlineRev.getPosition(), inlineRev.getPosition() - + inlineRev.size(), newTag); + wrapInTag(revList, inlineRev.getPosition(), + inlineRev.getPosition() + inlineRev.size(), + newTag, processDiffs); } } else if (inlineDelta instanceof ChangeDelta) { if (mergeOriginalRevised) { origList.addAll(inlineOrig.getPosition() + inlineOrig.size(), - revList.subList(inlineRev.getPosition(), inlineRev.getPosition() - + inlineRev.size())); - wrapInTag(origList, inlineOrig.getPosition() + inlineOrig.size(), inlineOrig.getPosition() + inlineOrig.size() - + inlineRev.size(), newTag); + revList.subList(inlineRev.getPosition(), + inlineRev.getPosition() + inlineRev.size())); + wrapInTag(origList, inlineOrig.getPosition() + inlineOrig.size(), + inlineOrig.getPosition() + inlineOrig.size() + inlineRev.size(), + newTag, processDiffs); } else { - wrapInTag(revList, inlineRev.getPosition(), inlineRev.getPosition() - + inlineRev.size(), newTag); + wrapInTag(revList, inlineRev.getPosition(), + inlineRev.getPosition() + inlineRev.size(), + newTag, processDiffs); } - wrapInTag(origList, inlineOrig.getPosition(), inlineOrig - .getPosition() - + inlineOrig.size(), oldTag); + wrapInTag(origList, inlineOrig.getPosition(), + inlineOrig.getPosition() + inlineOrig.size(), + oldTag, processDiffs); } } StringBuilder origResult = new StringBuilder(); @@ -376,6 +393,7 @@ public final class DiffRowGenerator { private boolean reportLinesUnchanged = false; private Function> inlineDiffSplitter = SPLITTER_BY_CHARACTER; private Function lineNormalizer = LINE_NORMALIZER_FOR_HTML; + private Function processDiffs = null; private Builder() { } @@ -436,6 +454,18 @@ public final class DiffRowGenerator { return this; } + /** + * Processor for diffed text parts. Here e.g. whitecharacters could be replaced by something + * visible. + * + * @param processDiffs + * @return + */ + public Builder processDiffs(Function processDiffs) { + this.processDiffs = processDiffs; + return this; + } + /** * Set the column width of generated lines of original and revised texts. * diff --git a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java index be3fe39..be5b141 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java @@ -480,4 +480,23 @@ public class DiffRowGeneratorTest { "", "~testline~**another one**"); } + + @Test + public void testIgnoreWhitespaceIssue63() throws DiffException { + DiffRowGenerator generator = DiffRowGenerator.create() + .showInlineDiffs(true) + .inlineDiffByWord(true) + .mergeOriginalRevised(true) + .oldTag(f -> "~") //introduce markdown style for strikethrough + .newTag(f -> "**") //introduce markdown style for bold + .processDiffs(str -> str.replace(" ", "/")) + .build(); + + //compute the differences for two test texts. + List rows = generator.generateDiffRows( + Arrays.asList("This is a test."), + Arrays.asList("This is a test")); + + assertEquals("This~//~**/**is~//~**/**a~//~**/**test~.~", rows.get(0).getOldLine()); + } }