Skip to content

Commit a8e4ce2

Browse files
committed
fixes #65
1 parent 9bd7aaa commit a8e4ce2

File tree

2 files changed

+119
-14
lines changed

2 files changed

+119
-14
lines changed

java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public final class DiffRowGenerator {
6161
}
6262
return list;
6363
};
64+
6465
public static final Pattern SPLIT_BY_WORD_PATTERN = Pattern.compile("\\s+|[,.\\[\\](){}/\\\\*+\\-#]");
6566

6667
/**
@@ -106,7 +107,7 @@ protected final static List<String> splitStringPreserveDelimiter(String str, Pat
106107
*/
107108
static void wrapInTag(List<String> sequence, int startPosition,
108109
int endPosition, Tag tag, BiFunction<Tag, Boolean, String> tagGenerator,
109-
Function<String, String> processDiffs) {
110+
Function<String, String> processDiffs, boolean replaceLinefeedWithSpace) {
110111
int endPos = endPosition;
111112

112113
while (endPos >= startPosition) {
@@ -115,6 +116,9 @@ static void wrapInTag(List<String> sequence, int startPosition,
115116
while (endPos > startPosition) {
116117
if (!"\n".equals(sequence.get(endPos - 1))) {
117118
break;
119+
} else if (replaceLinefeedWithSpace) {
120+
sequence.set(endPos - 1, " ");
121+
break;
118122
}
119123
endPos--;
120124
}
@@ -133,7 +137,11 @@ static void wrapInTag(List<String> sequence, int startPosition,
133137
//search position for end tag
134138
while (endPos > startPosition) {
135139
if ("\n".equals(sequence.get(endPos - 1))) {
136-
break;
140+
if (replaceLinefeedWithSpace) {
141+
sequence.set(endPos - 1, " ");
142+
} else {
143+
break;
144+
}
137145
}
138146
if (processDiffs != null) {
139147
sequence.set(endPos - 1,
@@ -159,6 +167,7 @@ static void wrapInTag(List<String> sequence, int startPosition,
159167
private final Function<String, String> processDiffs;
160168

161169
private final boolean showInlineDiffs;
170+
private final boolean replaceOriginalLinefeedInChangesWithSpaces;
162171

163172
private DiffRowGenerator(Builder builder) {
164173
showInlineDiffs = builder.showInlineDiffs;
@@ -178,6 +187,8 @@ private DiffRowGenerator(Builder builder) {
178187
reportLinesUnchanged = builder.reportLinesUnchanged;
179188
lineNormalizer = builder.lineNormalizer;
180189
processDiffs = builder.processDiffs;
190+
191+
replaceOriginalLinefeedInChangesWithSpaces = builder.replaceOriginalLinefeedInChangesWithSpaces;
181192

182193
Objects.requireNonNull(inlineDiffSplitter);
183194
Objects.requireNonNull(lineNormalizer);
@@ -313,19 +324,19 @@ private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) {
313324
if (inlineDelta.getType() == DeltaType.DELETE) {
314325
wrapInTag(origList, inlineOrig.getPosition(), inlineOrig
315326
.getPosition()
316-
+ inlineOrig.size(), Tag.DELETE, oldTag, processDiffs);
327+
+ inlineOrig.size(), Tag.DELETE, oldTag, processDiffs, replaceOriginalLinefeedInChangesWithSpaces && mergeOriginalRevised);
317328
} else if (inlineDelta.getType() == DeltaType.INSERT) {
318329
if (mergeOriginalRevised) {
319330
origList.addAll(inlineOrig.getPosition(),
320331
revList.subList(inlineRev.getPosition(),
321332
inlineRev.getPosition() + inlineRev.size()));
322333
wrapInTag(origList, inlineOrig.getPosition(),
323334
inlineOrig.getPosition() + inlineRev.size(),
324-
Tag.INSERT, newTag, processDiffs);
335+
Tag.INSERT, newTag, processDiffs, false);
325336
} else {
326337
wrapInTag(revList, inlineRev.getPosition(),
327338
inlineRev.getPosition() + inlineRev.size(),
328-
Tag.INSERT, newTag, processDiffs);
339+
Tag.INSERT, newTag, processDiffs, false);
329340
}
330341
} else if (inlineDelta.getType() == DeltaType.CHANGE) {
331342
if (mergeOriginalRevised) {
@@ -334,15 +345,15 @@ private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) {
334345
inlineRev.getPosition() + inlineRev.size()));
335346
wrapInTag(origList, inlineOrig.getPosition() + inlineOrig.size(),
336347
inlineOrig.getPosition() + inlineOrig.size() + inlineRev.size(),
337-
Tag.CHANGE, newTag, processDiffs);
348+
Tag.CHANGE, newTag, processDiffs, false);
338349
} else {
339350
wrapInTag(revList, inlineRev.getPosition(),
340351
inlineRev.getPosition() + inlineRev.size(),
341-
Tag.CHANGE, newTag, processDiffs);
352+
Tag.CHANGE, newTag, processDiffs, false);
342353
}
343354
wrapInTag(origList, inlineOrig.getPosition(),
344355
inlineOrig.getPosition() + inlineOrig.size(),
345-
Tag.CHANGE, oldTag, processDiffs);
356+
Tag.CHANGE, oldTag, processDiffs, replaceOriginalLinefeedInChangesWithSpaces && mergeOriginalRevised);
346357
}
347358
}
348359
StringBuilder origResult = new StringBuilder();
@@ -385,10 +396,10 @@ public static class Builder {
385396
private boolean showInlineDiffs = false;
386397
private boolean ignoreWhiteSpaces = false;
387398

388-
private BiFunction<Tag, Boolean, String> oldTag =
389-
(tag, f) -> f ? "<span class=\"editOldInline\">" : "</span>";
390-
private BiFunction<Tag, Boolean, String> newTag =
391-
(tag, f) -> f ? "<span class=\"editNewInline\">" : "</span>";
399+
private BiFunction<Tag, Boolean, String> oldTag
400+
= (tag, f) -> f ? "<span class=\"editOldInline\">" : "</span>";
401+
private BiFunction<Tag, Boolean, String> newTag
402+
= (tag, f) -> f ? "<span class=\"editNewInline\">" : "</span>";
392403

393404
private int columnWidth = 0;
394405
private boolean mergeOriginalRevised = false;
@@ -397,6 +408,7 @@ public static class Builder {
397408
private Function<String, String> lineNormalizer = LINE_NORMALIZER_FOR_HTML;
398409
private Function<String, String> processDiffs = null;
399410
private BiPredicate<String, String> equalizer = null;
411+
private boolean replaceOriginalLinefeedInChangesWithSpaces = false;
400412

401413
private Builder() {
402414
}
@@ -445,7 +457,7 @@ public Builder oldTag(BiFunction<Tag, Boolean, String> generator) {
445457
this.oldTag = generator;
446458
return this;
447459
}
448-
460+
449461
/**
450462
* Generator for Old-Text-Tags.
451463
*
@@ -467,7 +479,7 @@ public Builder newTag(BiFunction<Tag, Boolean, String> generator) {
467479
this.newTag = generator;
468480
return this;
469481
}
470-
482+
471483
/**
472484
* Generator for New-Text-Tags.
473485
*
@@ -575,5 +587,17 @@ public Builder equalizer(BiPredicate<String, String> equalizer) {
575587
this.equalizer = equalizer;
576588
return this;
577589
}
590+
591+
/**
592+
* Sometimes it happens that a change contains multiple lines. If there is no correspondence
593+
* in old and new. To keep the merged line more readable the linefeeds could be replaced
594+
* by spaces.
595+
* @param replace
596+
* @return
597+
*/
598+
public Builder replaceOriginalLinefeedInChangesWithSpaces(boolean replace) {
599+
this.replaceOriginalLinefeedInChangesWithSpaces = replace;
600+
return this;
601+
}
578602
}
579603
}

java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,4 +498,85 @@ public void testReplaceDiffsIssue63() {
498498

499499
assertEquals("This~//~**/**is~//~**/**a~//~**/**test~.~", rows.get(0).getOldLine());
500500
}
501+
502+
@Test
503+
public void testProblemTooManyDiffRowsIssue65() {
504+
DiffRowGenerator generator = DiffRowGenerator.create()
505+
.showInlineDiffs(true)
506+
.reportLinesUnchanged(true)
507+
.oldTag(f -> "~")
508+
.newTag(f -> "**")
509+
.mergeOriginalRevised(true)
510+
.inlineDiffByWord(false)
511+
.replaceOriginalLinefeedInChangesWithSpaces(true)
512+
.build();
513+
514+
List<DiffRow> diffRows = generator.generateDiffRows(
515+
Arrays.asList("Ich möchte nicht mit einem Bot sprechen.", "Ich soll das schon wieder wiederholen?"),
516+
Arrays.asList("Ich möchte nicht mehr mit dir sprechen. Leite mich weiter.", "Kannst du mich zum Kundendienst weiterleiten?"));
517+
518+
print(diffRows);
519+
520+
assertThat(diffRows).hasSize(2);
521+
}
522+
523+
@Test
524+
public void testProblemTooManyDiffRowsIssue65_NoMerge() {
525+
DiffRowGenerator generator = DiffRowGenerator.create()
526+
.showInlineDiffs(true)
527+
.reportLinesUnchanged(true)
528+
.oldTag(f -> "~")
529+
.newTag(f -> "**")
530+
.mergeOriginalRevised(false)
531+
.inlineDiffByWord(false)
532+
.build();
533+
534+
List<DiffRow> diffRows = generator.generateDiffRows(
535+
Arrays.asList("Ich möchte nicht mit einem Bot sprechen.", "Ich soll das schon wieder wiederholen?"),
536+
Arrays.asList("Ich möchte nicht mehr mit dir sprechen. Leite mich weiter.", "Kannst du mich zum Kundendienst weiterleiten?"));
537+
538+
System.out.println(diffRows);
539+
540+
assertThat(diffRows).hasSize(2);
541+
}
542+
543+
@Test
544+
public void testProblemTooManyDiffRowsIssue65_DiffByWord() {
545+
DiffRowGenerator generator = DiffRowGenerator.create()
546+
.showInlineDiffs(true)
547+
.reportLinesUnchanged(true)
548+
.oldTag(f -> "~")
549+
.newTag(f -> "**")
550+
.mergeOriginalRevised(true)
551+
.inlineDiffByWord(true)
552+
.build();
553+
554+
List<DiffRow> diffRows = generator.generateDiffRows(
555+
Arrays.asList("Ich möchte nicht mit einem Bot sprechen.", "Ich soll das schon wieder wiederholen?"),
556+
Arrays.asList("Ich möchte nicht mehr mit dir sprechen. Leite mich weiter.", "Kannst du mich zum Kundendienst weiterleiten?"));
557+
558+
System.out.println(diffRows);
559+
560+
assertThat(diffRows).hasSize(2);
561+
}
562+
563+
@Test
564+
public void testProblemTooManyDiffRowsIssue65_NoInlineDiff() {
565+
DiffRowGenerator generator = DiffRowGenerator.create()
566+
.showInlineDiffs(false)
567+
.reportLinesUnchanged(true)
568+
.oldTag(f -> "~")
569+
.newTag(f -> "**")
570+
.mergeOriginalRevised(true)
571+
.inlineDiffByWord(false)
572+
.build();
573+
574+
List<DiffRow> diffRows = generator.generateDiffRows(
575+
Arrays.asList("Ich möchte nicht mit einem Bot sprechen.", "Ich soll das schon wieder wiederholen?"),
576+
Arrays.asList("Ich möchte nicht mehr mit dir sprechen. Leite mich weiter.", "Kannst du mich zum Kundendienst weiterleiten?"));
577+
578+
System.out.println(diffRows);
579+
580+
assertThat(diffRows).hasSize(2);
581+
}
501582
}

0 commit comments

Comments
 (0)