29
29
import java .util .function .Function ;
30
30
import java .util .regex .Matcher ;
31
31
import java .util .regex .Pattern ;
32
+ import static java .util .stream .Collectors .toList ;
32
33
33
34
/**
34
35
* This class for generating DiffRows for side-by-sidy view. You can customize the way of generating. For example, show
42
43
* ignoreWhiteSpaces(true).columnWidth(100).build();
43
44
* </code>
44
45
*/
45
- public class DiffRowGenerator {
46
+ public final class DiffRowGenerator {
46
47
47
48
public static final BiPredicate <String , String > DEFAULT_EQUALIZER = Object ::equals ;
48
49
49
50
public static final BiPredicate <String , String > IGNORE_WHITESPACE_EQUALIZER = (original , revised )
50
51
-> adjustWhitespace (original ).equals (adjustWhitespace (revised ));
51
52
53
+ public static final Function <String , String > LINE_NORMALIZER_FOR_HTML = StringUtils ::normalize ;
54
+
55
+
52
56
/**
53
57
* Splitting lines by character to achieve char by char diff checking.
54
58
*/
@@ -60,6 +64,7 @@ public class DiffRowGenerator {
60
64
return list ;
61
65
};
62
66
public static final Pattern SPLIT_BY_WORD_PATTERN = Pattern .compile ("\\ s+|[,.\\ [\\ ](){}/\\ \\ *+\\ -#]" );
67
+
63
68
/**
64
69
* Splitting lines by word to achieve word by word diff checking.
65
70
*/
@@ -144,6 +149,7 @@ static void wrapInTag(List<String> sequence, int startPosition,
144
149
private final Function <Boolean , String > newTag ;
145
150
private final Function <Boolean , String > oldTag ;
146
151
private final boolean reportLinesUnchanged ;
152
+ private final Function <String , String > lineNormalizer ;
147
153
148
154
private final boolean showInlineDiffs ;
149
155
@@ -157,8 +163,10 @@ private DiffRowGenerator(Builder builder) {
157
163
inlineDiffSplitter = builder .inlineDiffSplitter ;
158
164
equalizer = ignoreWhiteSpaces ? IGNORE_WHITESPACE_EQUALIZER : DEFAULT_EQUALIZER ;
159
165
reportLinesUnchanged = builder .reportLinesUnchanged ;
166
+ lineNormalizer = builder .lineNormalizer ;
160
167
161
168
Objects .requireNonNull (inlineDiffSplitter );
169
+ Objects .requireNonNull (lineNormalizer );
162
170
}
163
171
164
172
/**
@@ -258,14 +266,20 @@ private DiffRow buildDiffRowWithoutNormalizing(Tag type, String orgline, String
258
266
StringUtils .wrapText (newline , columnWidth ));
259
267
}
260
268
269
+ List <String > normalizeLines (List <String > list ) {
270
+ return list .stream ()
271
+ .map (lineNormalizer ::apply )
272
+ .collect (toList ());
273
+ }
274
+
261
275
/**
262
276
* Add the inline diffs for given delta
263
277
*
264
278
* @param delta the given delta
265
279
*/
266
280
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 ());
269
283
List <String > origList ;
270
284
List <String > revList ;
271
285
String joinedOrig = String .join ("\n " , orig );
@@ -334,9 +348,9 @@ private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) throws Di
334
348
335
349
private String preprocessLine (String line ) {
336
350
if (columnWidth == 0 ) {
337
- return StringUtils . normalize (line );
351
+ return lineNormalizer . apply (line );
338
352
} else {
339
- return StringUtils .wrapText (StringUtils . normalize (line ), columnWidth );
353
+ return StringUtils .wrapText (lineNormalizer . apply (line ), columnWidth );
340
354
}
341
355
}
342
356
@@ -358,6 +372,7 @@ public static class Builder {
358
372
private boolean mergeOriginalRevised = false ;
359
373
private boolean reportLinesUnchanged = false ;
360
374
private Function <String , List <String >> inlineDiffSplitter = SPLITTER_BY_CHARACTER ;
375
+ private Function <String , String > lineNormalizer = LINE_NORMALIZER_FOR_HTML ;
361
376
362
377
private Builder () {
363
378
}
@@ -463,5 +478,10 @@ public Builder inlineDiffBySplitter(Function<String, List<String>> inlineDiffSpl
463
478
this .inlineDiffSplitter = inlineDiffSplitter ;
464
479
return this ;
465
480
}
481
+
482
+ public Builder lineNormalizer (Function <String , String > lineNormalizer ) {
483
+ this .lineNormalizer = lineNormalizer ;
484
+ return this ;
485
+ }
466
486
}
467
487
}
0 commit comments