@@ -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}
0 commit comments