@@ -61,6 +61,7 @@ public final class DiffRowGenerator {
6161 }
6262return list ;
6363 };
64+
6465public 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 */
107108static void wrapInTag (List <String >sequence ,int startPosition ,
108109int endPosition ,Tag tag ,BiFunction <Tag ,Boolean ,String >tagGenerator ,
109- Function <String ,String >processDiffs ) {
110+ Function <String ,String >processDiffs , boolean replaceLinefeedWithSpace ) {
110111int endPos =endPosition ;
111112
112113while (endPos >=startPosition ) {
@@ -115,6 +116,9 @@ static void wrapInTag(List<String> sequence, int startPosition,
115116while (endPos >startPosition ) {
116117if (!"\n " .equals (sequence .get (endPos -1 ))) {
117118break ;
119+ }else if (replaceLinefeedWithSpace ) {
120+ sequence .set (endPos -1 ," " );
121+ break ;
118122 }
119123endPos --;
120124 }
@@ -133,7 +137,11 @@ static void wrapInTag(List<String> sequence, int startPosition,
133137//search position for end tag
134138while (endPos >startPosition ) {
135139if ("\n " .equals (sequence .get (endPos -1 ))) {
136- break ;
140+ if (replaceLinefeedWithSpace ) {
141+ sequence .set (endPos -1 ," " );
142+ }else {
143+ break ;
144+ }
137145 }
138146if (processDiffs !=null ) {
139147sequence .set (endPos -1 ,
@@ -159,6 +167,7 @@ static void wrapInTag(List<String> sequence, int startPosition,
159167private final Function <String ,String >processDiffs ;
160168
161169private final boolean showInlineDiffs ;
170+ private final boolean replaceOriginalLinefeedInChangesWithSpaces ;
162171
163172private DiffRowGenerator (Builder builder ) {
164173showInlineDiffs =builder .showInlineDiffs ;
@@ -178,6 +187,8 @@ private DiffRowGenerator(Builder builder) {
178187reportLinesUnchanged =builder .reportLinesUnchanged ;
179188lineNormalizer =builder .lineNormalizer ;
180189processDiffs =builder .processDiffs ;
190+
191+ replaceOriginalLinefeedInChangesWithSpaces =builder .replaceOriginalLinefeedInChangesWithSpaces ;
181192
182193Objects .requireNonNull (inlineDiffSplitter );
183194Objects .requireNonNull (lineNormalizer );
@@ -313,19 +324,19 @@ private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) {
313324if (inlineDelta .getType () ==DeltaType .DELETE ) {
314325wrapInTag (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 ) {
318329if (mergeOriginalRevised ) {
319330origList .addAll (inlineOrig .getPosition (),
320331revList .subList (inlineRev .getPosition (),
321332inlineRev .getPosition () +inlineRev .size ()));
322333wrapInTag (origList ,inlineOrig .getPosition (),
323334inlineOrig .getPosition () +inlineRev .size (),
324- Tag .INSERT ,newTag ,processDiffs );
335+ Tag .INSERT ,newTag ,processDiffs , false );
325336 }else {
326337wrapInTag (revList ,inlineRev .getPosition (),
327338inlineRev .getPosition () +inlineRev .size (),
328- Tag .INSERT ,newTag ,processDiffs );
339+ Tag .INSERT ,newTag ,processDiffs , false );
329340 }
330341 }else if (inlineDelta .getType () ==DeltaType .CHANGE ) {
331342if (mergeOriginalRevised ) {
@@ -334,15 +345,15 @@ private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) {
334345inlineRev .getPosition () +inlineRev .size ()));
335346wrapInTag (origList ,inlineOrig .getPosition () +inlineOrig .size (),
336347inlineOrig .getPosition () +inlineOrig .size () +inlineRev .size (),
337- Tag .CHANGE ,newTag ,processDiffs );
348+ Tag .CHANGE ,newTag ,processDiffs , false );
338349 }else {
339350wrapInTag (revList ,inlineRev .getPosition (),
340351inlineRev .getPosition () +inlineRev .size (),
341- Tag .CHANGE ,newTag ,processDiffs );
352+ Tag .CHANGE ,newTag ,processDiffs , false );
342353 }
343354wrapInTag (origList ,inlineOrig .getPosition (),
344355inlineOrig .getPosition () +inlineOrig .size (),
345- Tag .CHANGE ,oldTag ,processDiffs );
356+ Tag .CHANGE ,oldTag ,processDiffs , replaceOriginalLinefeedInChangesWithSpaces && mergeOriginalRevised );
346357 }
347358 }
348359StringBuilder origResult =new StringBuilder ();
@@ -385,10 +396,10 @@ public static class Builder {
385396private boolean showInlineDiffs =false ;
386397private 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
393404private int columnWidth =0 ;
394405private boolean mergeOriginalRevised =false ;
@@ -397,6 +408,7 @@ public static class Builder {
397408private Function <String ,String >lineNormalizer =LINE_NORMALIZER_FOR_HTML ;
398409private Function <String ,String >processDiffs =null ;
399410private BiPredicate <String ,String >equalizer =null ;
411+ private boolean replaceOriginalLinefeedInChangesWithSpaces =false ;
400412
401413private Builder () {
402414 }
@@ -445,7 +457,7 @@ public Builder oldTag(BiFunction<Tag, Boolean, String> generator) {
445457this .oldTag =generator ;
446458return this ;
447459 }
448-
460+
449461/**
450462 * Generator for Old-Text-Tags.
451463 *
@@ -467,7 +479,7 @@ public Builder newTag(BiFunction<Tag, Boolean, String> generator) {
467479this .newTag =generator ;
468480return this ;
469481 }
470-
482+
471483/**
472484 * Generator for New-Text-Tags.
473485 *
@@ -575,5 +587,17 @@ public Builder equalizer(BiPredicate<String, String> equalizer) {
575587this .equalizer =equalizer ;
576588return 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}