Skip to content

Commit 89f2659

Browse files
committed
fixes #41
1 parent fd64d15 commit 89f2659

File tree

4 files changed

+55
-20
lines changed

4 files changed

+55
-20
lines changed

src/main/java/com/github/difflib/text/DiffRowGenerator.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.function.Function;
3030
import java.util.regex.Matcher;
3131
import java.util.regex.Pattern;
32+
import static java.util.stream.Collectors.toList;
3233

3334
/**
3435
* This class for generating DiffRows for side-by-sidy view. You can customize the way of generating. For example, show
@@ -42,13 +43,16 @@
4243
* ignoreWhiteSpaces(true).columnWidth(100).build();
4344
* </code>
4445
*/
45-
public class DiffRowGenerator {
46+
public final class DiffRowGenerator {
4647

4748
public static final BiPredicate<String, String> DEFAULT_EQUALIZER = Object::equals;
4849

4950
public static final BiPredicate<String, String> IGNORE_WHITESPACE_EQUALIZER = (original, revised)
5051
-> adjustWhitespace(original).equals(adjustWhitespace(revised));
5152

53+
public static final Function<String, String> LINE_NORMALIZER_FOR_HTML = StringUtils::normalize;
54+
55+
5256
/**
5357
* Splitting lines by character to achieve char by char diff checking.
5458
*/
@@ -60,6 +64,7 @@ public class DiffRowGenerator {
6064
return list;
6165
};
6266
public static final Pattern SPLIT_BY_WORD_PATTERN = Pattern.compile("\\s+|[,.\\[\\](){}/\\\\*+\\-#]");
67+
6368
/**
6469
* Splitting lines by word to achieve word by word diff checking.
6570
*/
@@ -144,6 +149,7 @@ static void wrapInTag(List<String> sequence, int startPosition,
144149
private final Function<Boolean, String> newTag;
145150
private final Function<Boolean, String> oldTag;
146151
private final boolean reportLinesUnchanged;
152+
private final Function<String, String> lineNormalizer;
147153

148154
private final boolean showInlineDiffs;
149155

@@ -157,8 +163,10 @@ private DiffRowGenerator(Builder builder) {
157163
inlineDiffSplitter = builder.inlineDiffSplitter;
158164
equalizer = ignoreWhiteSpaces ? IGNORE_WHITESPACE_EQUALIZER : DEFAULT_EQUALIZER;
159165
reportLinesUnchanged = builder.reportLinesUnchanged;
166+
lineNormalizer = builder.lineNormalizer;
160167

161168
Objects.requireNonNull(inlineDiffSplitter);
169+
Objects.requireNonNull(lineNormalizer);
162170
}
163171

164172
/**
@@ -258,14 +266,20 @@ private DiffRow buildDiffRowWithoutNormalizing(Tag type, String orgline, String
258266
StringUtils.wrapText(newline, columnWidth));
259267
}
260268

269+
List<String> normalizeLines(List<String> list) {
270+
return list.stream()
271+
.map(lineNormalizer::apply)
272+
.collect(toList());
273+
}
274+
261275
/**
262276
* Add the inline diffs for given delta
263277
*
264278
* @param delta the given delta
265279
*/
266280
private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) throws DiffException {
267-
List<String> orig = StringUtils.normalize(delta.getSource().getLines());
268-
List<String> rev = StringUtils.normalize(delta.getTarget().getLines());
281+
List<String> orig = normalizeLines(delta.getSource().getLines());
282+
List<String> rev = normalizeLines(delta.getTarget().getLines());
269283
List<String> origList;
270284
List<String> revList;
271285
String joinedOrig = String.join("\n", orig);
@@ -334,9 +348,9 @@ private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) throws Di
334348

335349
private String preprocessLine(String line) {
336350
if (columnWidth == 0) {
337-
return StringUtils.normalize(line);
351+
return lineNormalizer.apply(line);
338352
} else {
339-
return StringUtils.wrapText(StringUtils.normalize(line), columnWidth);
353+
return StringUtils.wrapText(lineNormalizer.apply(line), columnWidth);
340354
}
341355
}
342356

@@ -358,6 +372,7 @@ public static class Builder {
358372
private boolean mergeOriginalRevised = false;
359373
private boolean reportLinesUnchanged = false;
360374
private Function<String, List<String>> inlineDiffSplitter = SPLITTER_BY_CHARACTER;
375+
private Function<String, String> lineNormalizer = LINE_NORMALIZER_FOR_HTML;
361376

362377
private Builder() {
363378
}
@@ -463,5 +478,10 @@ public Builder inlineDiffBySplitter(Function<String, List<String>> inlineDiffSpl
463478
this.inlineDiffSplitter = inlineDiffSplitter;
464479
return this;
465480
}
481+
482+
public Builder lineNormalizer(Function<String, String> lineNormalizer) {
483+
this.lineNormalizer = lineNormalizer;
484+
return this;
485+
}
466486
}
467487
}

src/main/java/com/github/difflib/text/StringUtils.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,6 @@ public static String normalize(String str) {
3434
return htmlEntites(str).replace("\t", " ");
3535
}
3636

37-
public static List<String> normalize(List<String> list) {
38-
return list.stream()
39-
.map(StringUtils::normalize)
40-
.collect(toList());
41-
}
42-
4337
public static List<String> wrapText(List<String> list, int columnWidth) {
4438
return list.stream()
4539
.map(line -> wrapText(line, columnWidth))

src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.io.IOException;
66
import java.nio.file.Files;
77
import java.util.Arrays;
8+
import java.util.Collections;
89
import java.util.List;
910
import java.util.regex.Pattern;
1011
import static java.util.stream.Collectors.toList;
@@ -28,6 +29,16 @@ public void testGenerator_Default() throws DiffException {
2829
assertEquals(3, rows.size());
2930
}
3031

32+
/**
33+
* Test of normalize method, of class StringUtils.
34+
*/
35+
@Test
36+
public void testNormalize_List() {
37+
DiffRowGenerator generator = DiffRowGenerator.create()
38+
.build();
39+
assertEquals(Collections.singletonList(" test"), generator.normalizeLines(Collections.singletonList("\ttest")));
40+
}
41+
3142
@Test
3243
public void testGenerator_Default2() throws DiffException {
3344
String first = "anything \n \nother";
@@ -375,4 +386,23 @@ public void testGeneratorIssue22_3() throws DiffException {
375386
assertEquals("[[CHANGE,This is a test ~senctence~.,This is a test **for diffutils**.], [CHANGE,,**This is the second line.**], [CHANGE,,**And one more.**]]",
376387
rows.toString());
377388
}
389+
390+
@Test
391+
public void testGeneratorIssue41DefaultNormalizer() throws DiffException {
392+
DiffRowGenerator generator = DiffRowGenerator.create()
393+
.build();
394+
List<DiffRow> rows = generator.generateDiffRows(Arrays.asList("<"), Arrays.asList("<"));
395+
assertEquals("[[EQUAL,&lt;,&lt;]]", rows.toString());
396+
}
397+
398+
@Test
399+
public void testGeneratorIssue41UserNormalizer() throws DiffException {
400+
DiffRowGenerator generator = DiffRowGenerator.create()
401+
.lineNormalizer(str -> str.replace("\t", " "))
402+
.build();
403+
List<DiffRow> rows = generator.generateDiffRows(Arrays.asList("<"), Arrays.asList("<"));
404+
assertEquals("[[EQUAL,<,<]]", rows.toString());
405+
rows = generator.generateDiffRows(Arrays.asList("\t<"), Arrays.asList("<"));
406+
assertEquals("[[CHANGE, <,<]]", rows.toString());
407+
}
378408
}

src/test/java/com/github/difflib/text/StringUtilsTest.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package com.github.difflib.text;
1717

18-
import java.util.Collections;
1918
import static org.junit.Assert.*;
2019
import org.junit.Test;
2120

@@ -41,14 +40,6 @@ public void testNormalize_String() {
4140
assertEquals(" test", StringUtils.normalize("\ttest"));
4241
}
4342

44-
/**
45-
* Test of normalize method, of class StringUtils.
46-
*/
47-
@Test
48-
public void testNormalize_List() {
49-
assertEquals(Collections.singletonList(" test"), StringUtils.normalize(Collections.singletonList("\ttest")));
50-
}
51-
5243
/**
5344
* Test of wrapText method, of class StringUtils.
5445
*/

0 commit comments

Comments
 (0)