Skip to content
This repository was archived by the owner on Jun 6, 2021. It is now read-only.

Commit 0f42824

Browse files
committed
- Add option to skip data
1 parent 02d3d06 commit 0f42824

File tree

5 files changed

+99
-28
lines changed

5 files changed

+99
-28
lines changed

src/main/java/difflib/DiffAlgorithm.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
*/
1616
package difflib;
1717

18-
import java.util.*;
18+
import java.util.List;
19+
20+
import difflib.myers.Equalizer;
1921

2022
/**
2123
* The general interface for computing diffs between two lists of elements of type T.
@@ -44,4 +46,10 @@ public interface DiffAlgorithm<T> {
4446
* @return The patch representing the diff of the given sequences. Never {@code null}.
4547
*/
4648
public Patch<T> diff(List<T> original, List<T> revised);
49+
50+
/**
51+
* Get equalizer use to compare data.
52+
* @return
53+
*/
54+
public Equalizer<T> getEqualizer();
4755
}

src/main/java/difflib/DiffRow.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public DiffRow(@Nonnull Tag tag, @Nullable String oldLine, @Nullable String newL
4141
}
4242

4343
public static enum Tag {
44-
INSERT, DELETE, CHANGE, EQUAL
44+
INSERT, DELETE, CHANGE, EQUAL, SKIP
4545
}
4646

4747
/**

src/main/java/difflib/DiffRowGenerator.java

+54-12
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ public class DiffRowGenerator {
7171
public boolean equals(String original, String revised) {
7272
return Objects.equals(original, revised);
7373
}
74+
75+
@Override
76+
public boolean skip(String original) {
77+
return false;
78+
}
7479
});
7580

7681
private final boolean showInlineDiffs;
@@ -331,6 +336,9 @@ public List<DiffRow> generateDiffRows(List<String> original, List<String> revise
331336
int orgEndPos = 0;
332337
int revEndPos = 0;
333338
final List<Delta<String>> deltaList = patch.getDeltas();
339+
340+
Equalizer<String> equalizer = diffAlgorithm.getEqualizer();
341+
334342
for (int i = 0; i < deltaList.size(); i++) {
335343
Delta<String> delta = deltaList.get(i);
336344
Chunk<String> orig = delta.getOriginal();
@@ -345,14 +353,19 @@ public List<DiffRow> generateDiffRows(List<String> original, List<String> revise
345353
rev.setLines(StringUtills.wrapText(rev.getLines(), this.columnWidth));
346354
}
347355
// catch the equal prefix for each chunk
348-
copyEqualsLines(diffRows, original, orgEndPos, orig.getPosition(), revised, revEndPos, rev.getPosition());
356+
copyEqualsLines(equalizer, diffRows, original, orgEndPos, orig.getPosition(), revised, revEndPos,
357+
rev.getPosition());
349358

350359
// Inserted DiffRow
351360
if (delta.getClass() == InsertDelta.class) {
352361
orgEndPos = orig.last() + 1;
353362
revEndPos = rev.last() + 1;
354363
for (String line : rev.getLines()) {
355-
diffRows.add(new DiffRow(Tag.INSERT, defaultString, line));
364+
if (equalizer.skip(line)) {
365+
diffRows.add(new DiffRow(Tag.SKIP, defaultString, line));
366+
} else {
367+
diffRows.add(new DiffRow(Tag.INSERT, defaultString, line));
368+
}
356369
}
357370
continue;
358371
}
@@ -362,7 +375,11 @@ public List<DiffRow> generateDiffRows(List<String> original, List<String> revise
362375
orgEndPos = orig.last() + 1;
363376
revEndPos = rev.last() + 1;
364377
for (String line : orig.getLines()) {
365-
diffRows.add(new DiffRow(Tag.DELETE, line, defaultString));
378+
if (equalizer.skip(line)) {
379+
diffRows.add(new DiffRow(Tag.SKIP, line, defaultString));
380+
} else {
381+
diffRows.add(new DiffRow(Tag.DELETE, line, defaultString));
382+
}
366383
}
367384
continue;
368385
}
@@ -373,30 +390,49 @@ public List<DiffRow> generateDiffRows(List<String> original, List<String> revise
373390
// the changed size is match
374391
if (orig.size() == rev.size()) {
375392
for (int j = 0; j < orig.size(); j++) {
376-
diffRows.add(new DiffRow(Tag.CHANGE, orig.getLines().get(j), rev.getLines().get(j)));
393+
addChangeDiffRow(equalizer, diffRows, orig.getLines().get(j), rev.getLines().get(j), defaultString);
377394
}
378395
} else if (orig.size() > rev.size()) {
379396
for (int j = 0; j < orig.size(); j++) {
380-
diffRows.add(new DiffRow(Tag.CHANGE, orig.getLines().get(j),
381-
rev.getLines().size() > j ? (String) rev.getLines().get(j) : defaultString));
397+
final String orgLine = orig.getLines().get(j);
398+
final String revLine = rev.getLines().size() > j ? rev.getLines().get(j) : defaultString;
399+
addChangeDiffRow(equalizer, diffRows, orgLine, revLine, defaultString);
382400
}
383401
} else {
384402
for (int j = 0; j < rev.size(); j++) {
385-
diffRows.add(new DiffRow(Tag.CHANGE, orig.getLines().size() > j ? orig.getLines().get(j)
386-
: defaultString, rev.getLines().get(j)));
403+
final String orgLine = orig.getLines().size() > j ? orig.getLines().get(j) : defaultString;
404+
final String revLine = rev.getLines().get(j);
405+
addChangeDiffRow(equalizer, diffRows, orgLine, revLine, defaultString);
387406
}
388407
}
389408
orgEndPos = orig.last() + 1;
390409
revEndPos = rev.last() + 1;
391410
}
392411

393412
// Copy the final matching chunk if any.
394-
copyEqualsLines(diffRows, original, orgEndPos, original.size(), revised, revEndPos, revised.size());
413+
copyEqualsLines(equalizer, diffRows, original, orgEndPos, original.size(), revised, revEndPos, revised.size());
395414
return diffRows;
396415
}
397416

398-
protected void copyEqualsLines(List<DiffRow> diffRows, List<String> original, int originalStartPos,
399-
int originalEndPos, List<String> revised, int revisedStartPos, int revisedEndPos) {
417+
private static final void addChangeDiffRow(Equalizer<String> equalizer, List<DiffRow> diffRows, String orgLine,
418+
String revLine, String defaultString) {
419+
boolean skipOrg = equalizer.skip(orgLine);
420+
boolean skipRev = equalizer.skip(revLine);
421+
if (skipOrg && skipRev) {
422+
diffRows.add(new DiffRow(Tag.SKIP, orgLine, revLine));
423+
} else if (skipOrg) {
424+
diffRows.add(new DiffRow(Tag.SKIP, orgLine, defaultString));
425+
diffRows.add(new DiffRow(Tag.CHANGE, defaultString, revLine));
426+
} else if (skipRev) {
427+
diffRows.add(new DiffRow(Tag.CHANGE, orgLine, defaultString));
428+
diffRows.add(new DiffRow(Tag.SKIP, defaultString, revLine));
429+
} else {
430+
diffRows.add(new DiffRow(Tag.CHANGE, orgLine, revLine));
431+
}
432+
}
433+
434+
protected void copyEqualsLines(Equalizer<String> equalizer, List<DiffRow> diffRows, List<String> original,
435+
int originalStartPos, int originalEndPos, List<String> revised, int revisedStartPos, int revisedEndPos) {
400436
String[][] lines = new String[originalEndPos - originalStartPos][2];
401437
int idx = 0;
402438
for (String line : original.subList(originalStartPos, originalEndPos)) {
@@ -407,7 +443,13 @@ protected void copyEqualsLines(List<DiffRow> diffRows, List<String> original, in
407443
lines[idx++][1] = line;
408444
}
409445
for (String[] line : lines) {
410-
diffRows.add(new DiffRow(Tag.EQUAL, line[0], line[1]));
446+
String orgLine = line[0];
447+
String revLine = line[1];
448+
if (equalizer.skip(orgLine) && equalizer.skip(revLine)) {
449+
diffRows.add(new DiffRow(Tag.SKIP, orgLine, revLine));
450+
} else {
451+
diffRows.add(new DiffRow(Tag.EQUAL, orgLine, revLine));
452+
}
411453
}
412454
}
413455

src/main/java/difflib/myers/Equalizer.java

+16-8
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,21 @@
99
* @param T The type of the compared elements in the 'lines'.
1010
*/
1111
public interface Equalizer<T> {
12-
13-
/**
14-
* Indicates if two elements are equal according to the diff mechanism.
15-
* @param original The original element. Must not be {@code null}.
16-
* @param revised The revised element. Must not be {@code null}.
17-
* @return Returns true if the elements are equal.
18-
*/
12+
13+
/**
14+
* Indicates if two elements are equal according to the diff mechanism.
15+
* @param original The original element. Must not be {@code null}.
16+
* @param revised The revised element. Must not be {@code null}.
17+
* @return Returns true if the elements are equal.
18+
*/
19+
@CheckReturnValue
20+
public boolean equals(@Nullable T original, @Nullable T revised);
21+
22+
/**
23+
* Indicates if elements must be skipped.
24+
* @param original
25+
* @return
26+
*/
1927
@CheckReturnValue
20-
public boolean equals(@Nullable T original, @Nullable T revised);
28+
public boolean skip(@Nullable T original);
2129
}

src/main/java/difflib/myers/MyersDiff.java

+19-6
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,21 @@
7575
* @param T The type of the compared elements in the 'lines'.
7676
*/
7777
public class MyersDiff<T> implements DiffAlgorithm<T> {
78-
79-
/** Default equalizer. */
80-
private final Equalizer<T> DEFAULT_EQUALIZER = new Equalizer<T>() {
78+
/** Default equalizer. */
79+
private final Equalizer<T> DEFAULT_EQUALIZER = new Equalizer<T>() {
8180
public boolean equals(final T original, final T revised) {
82-
return original.equals(revised);
81+
if (original == null && revised == null) {
82+
return true;
83+
}
84+
if (original != null) {
85+
return original.equals(revised);
86+
}
87+
return false;
88+
}
89+
90+
@Override
91+
public boolean skip(T original) {
92+
return false;
8393
}
8494
};
8595

@@ -295,5 +305,8 @@ public static <T, U> T[] copyOfRange2(U[] original, int from, int to,
295305
System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength));
296306
return copy;
297307
}
298-
299-
}
308+
309+
public Equalizer<T> getEqualizer() {
310+
return equalizer;
311+
}
312+
}

0 commit comments

Comments
 (0)