@@ -107,7 +107,8 @@ protected final static List<String> splitStringPreserveDelimiter(String str, Pat
107
107
* @param tagGenerator the tag generator
108
108
*/
109
109
static void wrapInTag (List <String > sequence , int startPosition ,
110
- int endPosition , Function <Boolean , String > tagGenerator ) {
110
+ int endPosition , Function <Boolean , String > tagGenerator ,
111
+ Function <String , String > processDiffs ) {
111
112
int endPos = endPosition ;
112
113
113
114
while (endPos >= startPosition ) {
@@ -125,23 +126,30 @@ static void wrapInTag(List<String> sequence, int startPosition,
125
126
}
126
127
127
128
sequence .add (endPos , tagGenerator .apply (false ));
129
+ if (processDiffs != null ) {
130
+ sequence .set (endPos - 1 ,
131
+ processDiffs .apply (sequence .get (endPos - 1 )));
132
+ }
128
133
endPos --;
129
134
130
135
//search position for end tag
131
136
while (endPos > startPosition ) {
132
137
if ("\n " .equals (sequence .get (endPos - 1 ))) {
133
138
break ;
134
139
}
140
+ if (processDiffs != null ) {
141
+ sequence .set (endPos - 1 ,
142
+ processDiffs .apply (sequence .get (endPos - 1 )));
143
+ }
135
144
endPos --;
136
145
}
137
146
138
147
sequence .add (endPos , tagGenerator .apply (true ));
139
148
endPos --;
140
149
}
141
-
142
- // sequence.add(endPosition, tagGenerator.apply(false));
143
- // sequence.add(startPosition, tagGenerator.apply(true));
144
150
}
151
+
152
+
145
153
private final int columnWidth ;
146
154
private final BiPredicate <String , String > equalizer ;
147
155
private final boolean ignoreWhiteSpaces ;
@@ -151,6 +159,7 @@ static void wrapInTag(List<String> sequence, int startPosition,
151
159
private final Function <Boolean , String > oldTag ;
152
160
private final boolean reportLinesUnchanged ;
153
161
private final Function <String , String > lineNormalizer ;
162
+ private final Function <String , String > processDiffs ;
154
163
155
164
private final boolean showInlineDiffs ;
156
165
@@ -165,6 +174,7 @@ private DiffRowGenerator(Builder builder) {
165
174
equalizer = ignoreWhiteSpaces ? IGNORE_WHITESPACE_EQUALIZER : DEFAULT_EQUALIZER ;
166
175
reportLinesUnchanged = builder .reportLinesUnchanged ;
167
176
lineNormalizer = builder .lineNormalizer ;
177
+ processDiffs = builder .processDiffs ;
168
178
169
179
Objects .requireNonNull (inlineDiffSplitter );
170
180
Objects .requireNonNull (lineNormalizer );
@@ -178,7 +188,8 @@ private DiffRowGenerator(Builder builder) {
178
188
* @param revised the revised text
179
189
* @return the DiffRows between original and revised texts
180
190
*/
181
- public List <DiffRow > generateDiffRows (List <String > original , List <String > revised ) throws DiffException {
191
+ public List <DiffRow > generateDiffRows (List <String > original , List <String > revised )
192
+ throws DiffException {
182
193
return generateDiffRows (original , DiffUtils .diff (original , revised , equalizer ));
183
194
}
184
195
@@ -190,7 +201,8 @@ public List<DiffRow> generateDiffRows(List<String> original, List<String> revise
190
201
* @param patch the given patch
191
202
* @return the DiffRows between original and revised texts
192
203
*/
193
- public List <DiffRow > generateDiffRows (final List <String > original , Patch <String > patch ) throws DiffException {
204
+ public List <DiffRow > generateDiffRows (final List <String > original , Patch <String > patch )
205
+ throws DiffException {
194
206
List <DiffRow > diffRows = new ArrayList <>();
195
207
int endPos = 0 ;
196
208
final List <AbstractDelta <String >> deltaList = patch .getDeltas ();
@@ -280,7 +292,8 @@ List<String> normalizeLines(List<String> list) {
280
292
*
281
293
* @param delta the given delta
282
294
*/
283
- private List <DiffRow > generateInlineDiffs (AbstractDelta <String > delta ) throws DiffException {
295
+ private List <DiffRow > generateInlineDiffs (AbstractDelta <String > delta )
296
+ throws DiffException {
284
297
List <String > orig = normalizeLines (delta .getSource ().getLines ());
285
298
List <String > rev = normalizeLines (delta .getTarget ().getLines ());
286
299
List <String > origList ;
@@ -300,32 +313,36 @@ private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) throws Di
300
313
if (inlineDelta instanceof DeleteDelta ) {
301
314
wrapInTag (origList , inlineOrig .getPosition (), inlineOrig
302
315
.getPosition ()
303
- + inlineOrig .size (), oldTag );
316
+ + inlineOrig .size (), oldTag , processDiffs );
304
317
} else if (inlineDelta instanceof InsertDelta ) {
305
318
if (mergeOriginalRevised ) {
306
319
origList .addAll (inlineOrig .getPosition (),
307
- revList .subList (inlineRev .getPosition (), inlineRev .getPosition ()
308
- + inlineRev .size ()));
309
- wrapInTag (origList , inlineOrig .getPosition (), inlineOrig .getPosition ()
310
- + inlineRev .size (), newTag );
320
+ revList .subList (inlineRev .getPosition (),
321
+ inlineRev .getPosition () + inlineRev .size ()));
322
+ wrapInTag (origList , inlineOrig .getPosition (),
323
+ inlineOrig .getPosition () + inlineRev .size (),
324
+ newTag , processDiffs );
311
325
} else {
312
- wrapInTag (revList , inlineRev .getPosition (), inlineRev .getPosition ()
313
- + inlineRev .size (), newTag );
326
+ wrapInTag (revList , inlineRev .getPosition (),
327
+ inlineRev .getPosition () + inlineRev .size (),
328
+ newTag , processDiffs );
314
329
}
315
330
} else if (inlineDelta instanceof ChangeDelta ) {
316
331
if (mergeOriginalRevised ) {
317
332
origList .addAll (inlineOrig .getPosition () + inlineOrig .size (),
318
- revList .subList (inlineRev .getPosition (), inlineRev .getPosition ()
319
- + inlineRev .size ()));
320
- wrapInTag (origList , inlineOrig .getPosition () + inlineOrig .size (), inlineOrig .getPosition () + inlineOrig .size ()
321
- + inlineRev .size (), newTag );
333
+ revList .subList (inlineRev .getPosition (),
334
+ inlineRev .getPosition () + inlineRev .size ()));
335
+ wrapInTag (origList , inlineOrig .getPosition () + inlineOrig .size (),
336
+ inlineOrig .getPosition () + inlineOrig .size () + inlineRev .size (),
337
+ newTag , processDiffs );
322
338
} else {
323
- wrapInTag (revList , inlineRev .getPosition (), inlineRev .getPosition ()
324
- + inlineRev .size (), newTag );
339
+ wrapInTag (revList , inlineRev .getPosition (),
340
+ inlineRev .getPosition () + inlineRev .size (),
341
+ newTag , processDiffs );
325
342
}
326
- wrapInTag (origList , inlineOrig .getPosition (), inlineOrig
327
- .getPosition ()
328
- + inlineOrig . size (), oldTag );
343
+ wrapInTag (origList , inlineOrig .getPosition (),
344
+ inlineOrig .getPosition () + inlineOrig . size (),
345
+ oldTag , processDiffs );
329
346
}
330
347
}
331
348
StringBuilder origResult = new StringBuilder ();
@@ -376,6 +393,7 @@ public static class Builder {
376
393
private boolean reportLinesUnchanged = false ;
377
394
private Function <String , List <String >> inlineDiffSplitter = SPLITTER_BY_CHARACTER ;
378
395
private Function <String , String > lineNormalizer = LINE_NORMALIZER_FOR_HTML ;
396
+ private Function <String , String > processDiffs = null ;
379
397
380
398
private Builder () {
381
399
}
@@ -436,6 +454,18 @@ public Builder newTag(Function<Boolean, String> generator) {
436
454
return this ;
437
455
}
438
456
457
+ /**
458
+ * Processor for diffed text parts. Here e.g. whitecharacters could be replaced by something
459
+ * visible.
460
+ *
461
+ * @param processDiffs
462
+ * @return
463
+ */
464
+ public Builder processDiffs (Function <String , String > processDiffs ) {
465
+ this .processDiffs = processDiffs ;
466
+ return this ;
467
+ }
468
+
439
469
/**
440
470
* Set the column width of generated lines of original and revised texts.
441
471
*
0 commit comments