2424import com .github .difflib .patch .InsertDelta ;
2525import com .github .difflib .patch .Patch ;
2626import com .github .difflib .text .DiffRow .Tag ;
27+ import com .github .difflib .text .deltamerge .DeltaMergeUtils ;
28+ import com .github .difflib .text .deltamerge .InlineDeltaMergeInfo ;
2729import java .util .*;
2830import java .util .function .BiFunction ;
2931import java .util .function .BiPredicate ;
@@ -75,6 +77,14 @@ public final class DiffRowGenerator {
7577 public static final Function <String , List <String >> SPLITTER_BY_WORD = line -> splitStringPreserveDelimiter (line , SPLIT_BY_WORD_PATTERN );
7678 public static final Pattern WHITESPACE_PATTERN = Pattern .compile ("\\ s+" );
7779
80+ public static final Function <InlineDeltaMergeInfo , List <AbstractDelta <String >>> DEFAULT_INLINE_DELTA_MERGER = InlineDeltaMergeInfo ::getDeltas ;
81+
82+ /**
83+ * Merge diffs which are separated by equalities consisting of whitespace only.
84+ */
85+ public static final Function <InlineDeltaMergeInfo , List <AbstractDelta <String >>> WHITESPACE_EQUALITIES_MERGER = deltaMergeInfo -> DeltaMergeUtils
86+ .mergeInlineDeltas (deltaMergeInfo , (equalities -> equalities .stream ().allMatch (String ::isBlank )));
87+
7888 public static Builder create () {
7989 return new Builder ();
8090 }
@@ -170,6 +180,7 @@ static void wrapInTag(List<String> sequence, int startPosition,
170180 private final boolean reportLinesUnchanged ;
171181 private final Function <String , String > lineNormalizer ;
172182 private final Function <String , String > processDiffs ;
183+ private final Function <InlineDeltaMergeInfo , List <AbstractDelta <String >>> inlineDeltaMerger ;
173184
174185 private final boolean showInlineDiffs ;
175186 private final boolean replaceOriginalLinefeedInChangesWithSpaces ;
@@ -194,11 +205,13 @@ private DiffRowGenerator(Builder builder) {
194205 reportLinesUnchanged = builder .reportLinesUnchanged ;
195206 lineNormalizer = builder .lineNormalizer ;
196207 processDiffs = builder .processDiffs ;
208+ inlineDeltaMerger = builder .inlineDeltaMerger ;
197209
198210 replaceOriginalLinefeedInChangesWithSpaces = builder .replaceOriginalLinefeedInChangesWithSpaces ;
199211
200212 Objects .requireNonNull (inlineDiffSplitter );
201213 Objects .requireNonNull (lineNormalizer );
214+ Objects .requireNonNull (inlineDeltaMerger );
202215 }
203216
204217 /**
@@ -370,7 +383,10 @@ private List<DiffRow> generateInlineDiffs(AbstractDelta<String> delta) {
370383 origList = inlineDiffSplitter .apply (joinedOrig );
371384 revList = inlineDiffSplitter .apply (joinedRev );
372385
373- List <AbstractDelta <String >> inlineDeltas = DiffUtils .diff (origList , revList , equalizer ).getDeltas ();
386+ List <AbstractDelta <String >> originalInlineDeltas = DiffUtils .diff (origList , revList , equalizer )
387+ .getDeltas ();
388+ List <AbstractDelta <String >> inlineDeltas = inlineDeltaMerger
389+ .apply (new InlineDeltaMergeInfo (originalInlineDeltas , origList , revList ));
374390
375391 Collections .reverse (inlineDeltas );
376392 for (AbstractDelta <String > inlineDelta : inlineDeltas ) {
@@ -465,6 +481,7 @@ public static class Builder {
465481 private Function <String , String > processDiffs = null ;
466482 private BiPredicate <String , String > equalizer = null ;
467483 private boolean replaceOriginalLinefeedInChangesWithSpaces = false ;
484+ private Function <InlineDeltaMergeInfo , List <AbstractDelta <String >>> inlineDeltaMerger = DEFAULT_INLINE_DELTA_MERGER ;
468485
469486 private Builder () {
470487 }
@@ -673,5 +690,17 @@ public Builder replaceOriginalLinefeedInChangesWithSpaces(boolean replace) {
673690 this .replaceOriginalLinefeedInChangesWithSpaces = replace ;
674691 return this ;
675692 }
693+
694+ /**
695+ * Provide an inline delta merger for use case specific delta optimizations.
696+ *
697+ * @param inlineDeltaMerger
698+ * @return
699+ */
700+ public Builder inlineDeltaMerger (
701+ Function <InlineDeltaMergeInfo , List <AbstractDelta <String >>> inlineDeltaMerger ) {
702+ this .inlineDeltaMerger = inlineDeltaMerger ;
703+ return this ;
704+ }
676705 }
677706}
0 commit comments