Skip to content

Commit e5622a3

Browse files
committed
introduced diffInline, some cleanup
1 parent 5287a78 commit e5622a3

File tree

5 files changed

+78
-13
lines changed

5 files changed

+78
-13
lines changed

src/main/java/difflib/DiffRowGenerator.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,12 @@ private List<String> removeBlankLines(List<String> lines) {
217217
*/
218218
public List<DiffRow> generateDiffRows(List<String> original, List<String> revised, Patch<String> patch) {
219219
// normalize the lines (expand tabs, escape html entities)
220-
original = StringUtills.normalize(original);
221-
revised = StringUtills.normalize(revised);
220+
original = StringUtils.normalize(original);
221+
revised = StringUtils.normalize(revised);
222222

223223
// wrap to the column width
224-
original = StringUtills.wrapText(original, this.columnWidth);
225-
revised = StringUtills.wrapText(revised, this.columnWidth);
224+
original = StringUtils.wrapText(original, this.columnWidth);
225+
revised = StringUtils.wrapText(revised, this.columnWidth);
226226

227227
List<DiffRow> diffRows = new ArrayList<>();
228228
int endPos = 0;
@@ -233,11 +233,11 @@ public List<DiffRow> generateDiffRows(List<String> original, List<String> revise
233233
Chunk<String> rev = delta.getRevised();
234234

235235
// We should normalize and wrap lines in deltas too.
236-
orig.setLines(StringUtills.normalize((List<String>) orig.getLines()));
237-
rev.setLines(StringUtills.normalize((List<String>) rev.getLines()));
236+
orig.setLines(StringUtils.normalize((List<String>) orig.getLines()));
237+
rev.setLines(StringUtils.normalize((List<String>) rev.getLines()));
238238

239-
orig.setLines(StringUtills.wrapText((List<String>) orig.getLines(), this.columnWidth));
240-
rev.setLines(StringUtills.wrapText((List<String>) rev.getLines(), this.columnWidth));
239+
orig.setLines(StringUtils.wrapText((List<String>) orig.getLines(), this.columnWidth));
240+
rev.setLines(StringUtils.wrapText((List<String>) rev.getLines(), this.columnWidth));
241241

242242
// catch the equal prefix for each chunk
243243
for (String line : original.subList(endPos, orig.getPosition())) {
@@ -291,7 +291,7 @@ public List<DiffRow> generateDiffRows(List<String> original, List<String> revise
291291
}
292292
return diffRows;
293293
}
294-
294+
295295
/**
296296
* Add the inline diffs for given delta
297297
*

src/main/java/difflib/DiffUtils.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import difflib.myers.Equalizer;
1919
import difflib.myers.MyersDiff;
2020
import java.util.ArrayList;
21+
import java.util.Collections;
22+
import java.util.LinkedList;
2123
import java.util.List;
2224
import java.util.regex.Matcher;
2325
import java.util.regex.Pattern;
@@ -92,6 +94,46 @@ public static <T> Patch<T> diff(List<T> original, List<T> revised,
9294
return algorithm.diff(original, revised);
9395
}
9496

97+
/**
98+
* Computes the difference between the given texts inline. This one uses the "trick" to make out
99+
* of texts lists of characters, like DiffRowGenerator does and merges those changes at the end
100+
* together again.
101+
*
102+
* @param original
103+
* @param revised
104+
* @return
105+
*/
106+
public static Patch<String> diffInline(String original, String revised) {
107+
LinkedList<String> origList = new LinkedList<>();
108+
LinkedList<String> revList = new LinkedList<>();
109+
for (Character character : original.toCharArray()) {
110+
origList.add(character.toString());
111+
}
112+
for (Character character : revised.toCharArray()) {
113+
revList.add(character.toString());
114+
}
115+
Patch<String> patch = DiffUtils.diff(origList, revList);
116+
for (Delta<String> delta : patch.getDeltas()) {
117+
delta.getOriginal().setLines(compressLines(delta.getOriginal().getLines(), ""));
118+
delta.getRevised().setLines(compressLines(delta.getRevised().getLines(), ""));
119+
}
120+
return patch;
121+
}
122+
123+
private static List<String> compressLines(List<String> lines, String delimiter) {
124+
StringBuilder b = new StringBuilder();
125+
for (String line : lines) {
126+
b.append(line);
127+
b.append(delimiter);
128+
}
129+
if (b.length() > 0) {
130+
b.setLength(b.length() - delimiter.length());
131+
return Collections.singletonList(b.toString());
132+
} else {
133+
return Collections.EMPTY_LIST;
134+
}
135+
}
136+
95137
/**
96138
* Patch the original text with given patch
97139
*

src/main/java/difflib/Patch.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
*/
2929
public class Patch<T> {
3030

31-
private List<Delta<T>> deltas = new LinkedList<>();
31+
private final List<Delta<T>> deltas = new LinkedList<>();
3232

3333
/**
3434
* Apply this patch to the given target
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.util.LinkedList;
2020
import java.util.List;
2121

22-
public final class StringUtills {
22+
public final class StringUtils {
2323

2424
public static <T> String join(final Iterable<T> objs, final String delimiter) {
2525
Iterator<T> iter = objs.iterator();
@@ -94,6 +94,6 @@ public static String wrapText(String line, int columnWidth) {
9494
return line;
9595
}
9696

97-
private StringUtills() {
97+
private StringUtils() {
9898
}
9999
}

src/test/java/diffutils/DiffTest.java renamed to src/test/java/diffutils/DiffUtilsTest.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import static org.junit.Assert.assertTrue;
1111
import org.junit.Test;
1212

13-
public class DiffTest {
13+
public class DiffUtilsTest {
1414

1515
@Test
1616
public void testDiff_Insert() {
@@ -65,4 +65,27 @@ public void testDiff_EmptyListWithNonEmpty() {
6565
final Delta<String> delta = patch.getDeltas().get(0);
6666
assertTrue(delta instanceof InsertDelta);
6767
}
68+
69+
@Test
70+
public void testDiffInline() {
71+
final Patch<String> patch = DiffUtils.diffInline("", "test");
72+
assertEquals(1, patch.getDeltas().size());
73+
assertTrue(patch.getDeltas().get(0) instanceof InsertDelta);
74+
assertEquals(0, patch.getDeltas().get(0).getOriginal().getPosition());
75+
assertEquals(0, patch.getDeltas().get(0).getOriginal().getLines().size());
76+
assertEquals("test", patch.getDeltas().get(0).getRevised().getLines().get(0));
77+
}
78+
79+
@Test
80+
public void testDiffInline2() {
81+
final Patch<String> patch = DiffUtils.diffInline("es", "fest");
82+
assertEquals(2, patch.getDeltas().size());
83+
assertTrue(patch.getDeltas().get(0) instanceof InsertDelta);
84+
assertEquals(0, patch.getDeltas().get(0).getOriginal().getPosition());
85+
assertEquals(2, patch.getDeltas().get(1).getOriginal().getPosition());
86+
assertEquals(0, patch.getDeltas().get(0).getOriginal().getLines().size());
87+
assertEquals(0, patch.getDeltas().get(1).getOriginal().getLines().size());
88+
assertEquals("f", patch.getDeltas().get(0).getRevised().getLines().get(0));
89+
assertEquals("t", patch.getDeltas().get(1).getRevised().getLines().get(0));
90+
}
6891
}

0 commit comments

Comments
 (0)