From cb2cc6f79e69136df585befa34c6c0cf0fe84e3e Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Mon, 13 Mar 2023 15:01:55 +0800 Subject: [PATCH 1/6] Add generateOriginalAndDiff method and test class --- .../com/github/difflib/UnifiedDiffUtils.java | 143 +++++++++++++++++- .../difflib/examples/OriginalAndDiffTest.java | 39 +++++ 2 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java diff --git a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java index 06a61073..b65550b9 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java @@ -19,11 +19,11 @@ import com.github.difflib.patch.Chunk; import com.github.difflib.patch.AbstractDelta; import com.github.difflib.patch.Patch; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; + +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * @@ -313,4 +313,141 @@ private static List getDeltaText(AbstractDelta delta) { private UnifiedDiffUtils() { } + + /** + * Compare the differences between two files and return to the original file and diff format + * + * (This method compares the original file with the comparison file to obtain a diff, and inserts the diff into the corresponding position of the original file. + * You can see all the differences and unmodified places from the original file. + * Also, this will be very easy and useful for making side-by-side comparison display applications, + * for example, if you use diff2html (https://github.com/rtfpessoa/diff2html#usage) + * Wait for tools to display your differences on html pages, you only need to insert the return value into your js code) + * + * @param original Original file content + * @param revised revised file content + * + */ + public static List generateOriginalAndDiff(List original, List revised) { + return generateOriginalAndDiff(original, revised, null, null); + } + + + /** + * Compare the differences between two files and return to the original file and diff format + * + * (This method compares the original file with the comparison file to obtain a diff, and inserts the diff into the corresponding position of the original file. + * You can see all the differences and unmodified places from the original file. + * Also, this will be very easy and useful for making side-by-side comparison display applications, + * for example, if you use diff2html (https://github.com/rtfpessoa/diff2html#usage) + * Wait for tools to display your differences on html pages, you only need to insert the return value into your js code) + * + * @param original Original file content + * @param revised revised file content + * @param originalFileName Original file name + * @param revisedFileName revised file name + */ + public static List generateOriginalAndDiff(List original, List revised, String originalFileName, String revisedFileName) { + originalFileName = originalFileName == null ? "original" : originalFileName; + revisedFileName = revisedFileName == null ? "revised" : revisedFileName; + Patch patch = com.github.difflib.DiffUtils.diff(original, revised); + List unifiedDiff = generateUnifiedDiff(originalFileName, revisedFileName, original, patch, 0); + if (unifiedDiff.size() == 0) { + unifiedDiff.add("--- " + originalFileName); + unifiedDiff.add("+++ " + revisedFileName); + unifiedDiff.add("@@ -0,0 +0,0 @@"); + } else if (unifiedDiff.size() >= 3 && !unifiedDiff.get(2).contains("@@ -1,")) { + unifiedDiff.set(1, unifiedDiff.get(1)); + unifiedDiff.add(2, "@@ -0,0 +0,0 @@"); + } + List original1 = original.stream().map(v -> " " + v).collect(Collectors.toList()); + return insertOrig(original1, unifiedDiff); + } + + + //Insert the diff format to the original file + private static List insertOrig(List original, List unifiedDiff) { + List result = new ArrayList<>(); + List> diffList = new ArrayList<>(); + List d = new ArrayList<>(); + for (int i = 0; i < unifiedDiff.size(); i++) { + String u = unifiedDiff.get(i); + if (u.startsWith("@@") && !"@@ -0,0 +0,0 @@".equals(u) && !u.contains("@@ -1,")) { + List twoList = new ArrayList<>(); + twoList.addAll(d); + diffList.add(twoList); + d.clear(); + d.add(u); + continue; + } + if (i == unifiedDiff.size() - 1) { + d.add(u); + List twoList = new ArrayList<>(); + twoList.addAll(d); + diffList.add(twoList); + d.clear(); + break; + } + d.add(u); + } + for (int i = 0; i < diffList.size(); i++) { + List diff = diffList.get(i); + List nexDiff = i == diffList.size() - 1 ? null : diffList.get(i + 1); + String simb = i == 0 ? diff.get(2) : diff.get(0); + String nexSimb = nexDiff == null ? null : nexDiff.get(0); + insert(result, diff); + Map map = getRowMap(simb); + if (null != nexSimb) { + Map nexMap = getRowMap(nexSimb); + int start = 0; + if (map.get("orgRow") != 0) { + start = map.get("orgRow") + map.get("orgDel") - 1; + } + int end = nexMap.get("revRow") - 2; + insert(result, getOrigList(original, start, end)); + } + + if (simb.contains("@@ -1,") && null == nexSimb && map.get("orgDel") != original.size()) { + insert(result, getOrigList(original, 0, original.size() - 1)); + } else if (null == nexSimb && (map.get("orgRow") + map.get("orgDel") - 1) < original.size()) { + int start = (map.get("orgRow") + map.get("orgDel") - 1); + start = start == -1 ? 0 : start; + insert(result, getOrigList(original, start, original.size() - 1)); + } + } + return result; + } + + //Insert the unchanged content in the source file into result + private static void insert(List result, List noChangeContent) { + for (String ins : noChangeContent) { + result.add(ins); + } + } + + //Parse the line containing @@ to get the modified line number to delete or add a few lines + private static Map getRowMap(String str) { + Map map = new HashMap<>(); + if (str.startsWith("@@")) { + String[] sp = str.split(" "); + String org = sp[1]; + String[] orgSp = org.split(","); + map.put("orgRow", Integer.valueOf(orgSp[0].substring(1))); + map.put("orgDel", Integer.valueOf(orgSp[1])); + String[] revSp = org.split(","); + map.put("revRow", Integer.valueOf(revSp[0].substring(1))); + map.put("revAdd", Integer.valueOf(revSp[1])); + } + return map; + } + + //Get the specified part of the line from the original file + private static List getOrigList(List original1, int start, int end) { + List list = new ArrayList<>(); + if (original1.size() >= 1 && start <= end && end < original1.size()) { + for (; start <= end; start++) { + list.add(original1.get(start)); + } + } + return list; + } } diff --git a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java new file mode 100644 index 00000000..060fb47f --- /dev/null +++ b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java @@ -0,0 +1,39 @@ +package com.github.difflib.examples; + +import com.github.difflib.TestConstants; +import com.github.difflib.UnifiedDiffUtils; +import org.junit.jupiter.api.Test; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static java.util.stream.Collectors.joining; + +public class OriginalAndDiffTest { + + @Test + public void testGenerateOriginalAndDiff() throws IOException { + List origLines = fileToLines(TestConstants.MOCK_FOLDER + "original.txt"); + List revLines = fileToLines(TestConstants.MOCK_FOLDER + "revised.txt"); + + List originalAndDiff = UnifiedDiffUtils.generateOriginalAndDiff(origLines,revLines); + System.out.println(originalAndDiff.stream().collect(joining("\n"))); + } + + public static List fileToLines(String filename) throws FileNotFoundException, IOException { + List lines = new ArrayList<>(); + String line = ""; + try (BufferedReader in = new BufferedReader(new FileReader(filename))) { + while ((line = in.readLine()) != null) { + lines.add(line); + } + } + return lines; + } + + +} From e7910910693d60eb82c0f08a7ae0429993c155c0 Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Tue, 14 Mar 2023 10:27:32 +0800 Subject: [PATCH 2/6] Add generateOriginalAndDiff method and test class.I split long code into short methods, changed ambiguous variable names to explicit variable names --- .../com/github/difflib/UnifiedDiffUtils.java | 42 +++++++++++-------- .../difflib/examples/OriginalAndDiffTest.java | 2 - 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java index b65550b9..575a30e5 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java @@ -20,7 +20,11 @@ import com.github.difflib.patch.AbstractDelta; import com.github.difflib.patch.Patch; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -351,7 +355,7 @@ public static List generateOriginalAndDiff(List original, List patch = com.github.difflib.DiffUtils.diff(original, revised); List unifiedDiff = generateUnifiedDiff(originalFileName, revisedFileName, original, patch, 0); - if (unifiedDiff.size() == 0) { + if (unifiedDiff.isEmpty()) { unifiedDiff.add("--- " + originalFileName); unifiedDiff.add("+++ " + revisedFileName); unifiedDiff.add("@@ -0,0 +0,0 @@"); @@ -359,8 +363,8 @@ public static List generateOriginalAndDiff(List original, List original1 = original.stream().map(v -> " " + v).collect(Collectors.toList()); - return insertOrig(original1, unifiedDiff); + List originalWithPrefix = original.stream().map(v -> " " + v).collect(Collectors.toList()); + return insertOrig(originalWithPrefix, unifiedDiff); } @@ -368,27 +372,33 @@ public static List generateOriginalAndDiff(List original, List insertOrig(List original, List unifiedDiff) { List result = new ArrayList<>(); List> diffList = new ArrayList<>(); - List d = new ArrayList<>(); + List diff = new ArrayList<>(); for (int i = 0; i < unifiedDiff.size(); i++) { String u = unifiedDiff.get(i); if (u.startsWith("@@") && !"@@ -0,0 +0,0 @@".equals(u) && !u.contains("@@ -1,")) { List twoList = new ArrayList<>(); - twoList.addAll(d); + twoList.addAll(diff); diffList.add(twoList); - d.clear(); - d.add(u); + diff.clear(); + diff.add(u); continue; } if (i == unifiedDiff.size() - 1) { - d.add(u); + diff.add(u); List twoList = new ArrayList<>(); - twoList.addAll(d); + twoList.addAll(diff); diffList.add(twoList); - d.clear(); + diff.clear(); break; } - d.add(u); + diff.add(u); } + insertOrig(diffList,result,original); + return result; + } + + //Insert the diff format to the original file + private static void insertOrig(List> diffList, List result,List original) { for (int i = 0; i < diffList.size(); i++) { List diff = diffList.get(i); List nexDiff = i == diffList.size() - 1 ? null : diffList.get(i + 1); @@ -405,7 +415,6 @@ private static List insertOrig(List original, List unifi int end = nexMap.get("revRow") - 2; insert(result, getOrigList(original, start, end)); } - if (simb.contains("@@ -1,") && null == nexSimb && map.get("orgDel") != original.size()) { insert(result, getOrigList(original, 0, original.size() - 1)); } else if (null == nexSimb && (map.get("orgRow") + map.get("orgDel") - 1) < original.size()) { @@ -414,7 +423,6 @@ private static List insertOrig(List original, List unifi insert(result, getOrigList(original, start, original.size() - 1)); } } - return result; } //Insert the unchanged content in the source file into result @@ -441,11 +449,11 @@ private static Map getRowMap(String str) { } //Get the specified part of the line from the original file - private static List getOrigList(List original1, int start, int end) { + private static List getOrigList(List originalWithPrefix, int start, int end) { List list = new ArrayList<>(); - if (original1.size() >= 1 && start <= end && end < original1.size()) { + if (originalWithPrefix.size() >= 1 && start <= end && end < originalWithPrefix.size()) { for (; start <= end; start++) { - list.add(original1.get(start)); + list.add(originalWithPrefix.get(start)); } } return list; diff --git a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java index 060fb47f..62057cc7 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java @@ -34,6 +34,4 @@ public static List fileToLines(String filename) throws FileNotFoundExcep } return lines; } - - } From 61407b49c39ae6aa2442f917ae038c78dd7d32a1 Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Tue, 14 Mar 2023 11:02:32 +0800 Subject: [PATCH 3/6] fixes #164 --- .../java/com/github/difflib/UnifiedDiffUtils.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java index 575a30e5..c5e1d103 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java @@ -351,9 +351,13 @@ public static List generateOriginalAndDiff(List original, List generateOriginalAndDiff(List original, List revised, String originalFileName, String revisedFileName) { - originalFileName = originalFileName == null ? "original" : originalFileName; - revisedFileName = revisedFileName == null ? "revised" : revisedFileName; - Patch patch = com.github.difflib.DiffUtils.diff(original, revised); + if (originalFileName == null) { + originalFileName = "original"; + } + if (revisedFileName == null) { + revisedFileName = "revised"; + } + Patch patch = DiffUtils.diff(original, revised); List unifiedDiff = generateUnifiedDiff(originalFileName, revisedFileName, original, patch, 0); if (unifiedDiff.isEmpty()) { unifiedDiff.add("--- " + originalFileName); @@ -367,7 +371,6 @@ public static List generateOriginalAndDiff(List original, List insertOrig(List original, List unifiedDiff) { List result = new ArrayList<>(); From 7d9d1ca2f6b059ebfb1faacd0c5e2933f34f9b35 Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Wed, 22 Mar 2023 10:07:37 +0800 Subject: [PATCH 4/6] fix build issues --- .../com/github/difflib/UnifiedDiffUtils.java | 27 ++++++++++--------- .../difflib/examples/OriginalAndDiffTest.java | 15 ++++++++--- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java index c5e1d103..e926560d 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java @@ -351,17 +351,19 @@ public static List generateOriginalAndDiff(List original, List generateOriginalAndDiff(List original, List revised, String originalFileName, String revisedFileName) { - if (originalFileName == null) { - originalFileName = "original"; + String originalFileNameTemp = originalFileName; + String revisedFileNameTemp = originalFileName; + if (originalFileNameTemp == null) { + originalFileNameTemp = "original"; } - if (revisedFileName == null) { - revisedFileName = "revised"; + if (revisedFileNameTemp == null) { + revisedFileNameTemp = "revised"; } Patch patch = DiffUtils.diff(original, revised); - List unifiedDiff = generateUnifiedDiff(originalFileName, revisedFileName, original, patch, 0); + List unifiedDiff = generateUnifiedDiff(originalFileNameTemp, revisedFileNameTemp, original, patch, 0); if (unifiedDiff.isEmpty()) { - unifiedDiff.add("--- " + originalFileName); - unifiedDiff.add("+++ " + revisedFileName); + unifiedDiff.add("--- " + originalFileNameTemp); + unifiedDiff.add("+++ " + revisedFileNameTemp); unifiedDiff.add("@@ -0,0 +0,0 @@"); } else if (unifiedDiff.size() >= 3 && !unifiedDiff.get(2).contains("@@ -1,")) { unifiedDiff.set(1, unifiedDiff.get(1)); @@ -396,12 +398,12 @@ private static List insertOrig(List original, List unifi } diff.add(u); } - insertOrig(diffList,result,original); + insertOrig(diffList, result, original); return result; } //Insert the diff format to the original file - private static void insertOrig(List> diffList, List result,List original) { + private static void insertOrig(List> diffList, List result, List original) { for (int i = 0; i < diffList.size(); i++) { List diff = diffList.get(i); List nexDiff = i == diffList.size() - 1 ? null : diffList.get(i + 1); @@ -421,7 +423,7 @@ private static void insertOrig(List> diffList, List result, if (simb.contains("@@ -1,") && null == nexSimb && map.get("orgDel") != original.size()) { insert(result, getOrigList(original, 0, original.size() - 1)); } else if (null == nexSimb && (map.get("orgRow") + map.get("orgDel") - 1) < original.size()) { - int start = (map.get("orgRow") + map.get("orgDel") - 1); + int start = map.get("orgRow") + map.get("orgDel") - 1; start = start == -1 ? 0 : start; insert(result, getOrigList(original, start, original.size() - 1)); } @@ -455,8 +457,9 @@ private static Map getRowMap(String str) { private static List getOrigList(List originalWithPrefix, int start, int end) { List list = new ArrayList<>(); if (originalWithPrefix.size() >= 1 && start <= end && end < originalWithPrefix.size()) { - for (; start <= end; start++) { - list.add(originalWithPrefix.get(start)); + int startTemp = start; + for (; startTemp <= end; startTemp++) { + list.add(originalWithPrefix.get(startTemp)); } } return list; diff --git a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java index 62057cc7..7f2d3b29 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java @@ -12,15 +12,22 @@ import java.util.List; import static java.util.stream.Collectors.joining; +import static org.junit.jupiter.api.Assertions.fail; public class OriginalAndDiffTest { @Test - public void testGenerateOriginalAndDiff() throws IOException { - List origLines = fileToLines(TestConstants.MOCK_FOLDER + "original.txt"); - List revLines = fileToLines(TestConstants.MOCK_FOLDER + "revised.txt"); + public void testGenerateOriginalAndDiff() { + List origLines = null; + List revLines = null; + try { + origLines = fileToLines(TestConstants.MOCK_FOLDER + "original.txt"); + revLines = fileToLines(TestConstants.MOCK_FOLDER + "revised.txt"); + } catch (IOException e) { + fail(e.getMessage()); + } - List originalAndDiff = UnifiedDiffUtils.generateOriginalAndDiff(origLines,revLines); + List originalAndDiff = UnifiedDiffUtils.generateOriginalAndDiff(origLines, revLines); System.out.println(originalAndDiff.stream().collect(joining("\n"))); } From 9da4012b478e06d722e43306d4fdb550ec2e85a1 Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Fri, 16 Jun 2023 15:00:25 +0800 Subject: [PATCH 5/6] fix issues about (#164),detail: When deleting the first line of comparison text and adding several lines of text, the first diff of the result returned by the generateOriginalAndDiff method is inserted incorrectly --- .../src/main/java/com/github/difflib/UnifiedDiffUtils.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java index e926560d..727008db 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java @@ -420,11 +420,11 @@ private static void insertOrig(List> diffList, List result, int end = nexMap.get("revRow") - 2; insert(result, getOrigList(original, start, end)); } + int start = map.get("orgRow") + map.get("orgDel") - 1; + start = start == -1 ? 0 : start; if (simb.contains("@@ -1,") && null == nexSimb && map.get("orgDel") != original.size()) { - insert(result, getOrigList(original, 0, original.size() - 1)); + insert(result, getOrigList(original, start, original.size() - 1)); } else if (null == nexSimb && (map.get("orgRow") + map.get("orgDel") - 1) < original.size()) { - int start = map.get("orgRow") + map.get("orgDel") - 1; - start = start == -1 ? 0 : start; insert(result, getOrigList(original, start, original.size() - 1)); } } From d0b42504f35d797b45c1a6b8b0904ad9088b8a8d Mon Sep 17 00:00:00 2001 From: xutao Date: Sun, 18 Jun 2023 16:49:28 +0800 Subject: [PATCH 6/6] add a test for #170 --- .../difflib/examples/OriginalAndDiffTest.java | 15 +++ .../resources/mocks/issue_170_original.txt | 95 +++++++++++++++ .../resources/mocks/issue_170_revised.txt | 114 ++++++++++++++++++ 3 files changed, 224 insertions(+) create mode 100644 java-diff-utils/src/test/resources/mocks/issue_170_original.txt create mode 100644 java-diff-utils/src/test/resources/mocks/issue_170_revised.txt diff --git a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java index 7f2d3b29..17283b4d 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java @@ -31,6 +31,21 @@ public void testGenerateOriginalAndDiff() { System.out.println(originalAndDiff.stream().collect(joining("\n"))); } + @Test + public void testGenerateOriginalAndDiffFirstLineChange() { + List origLines = null; + List revLines = null; + try { + origLines = fileToLines(TestConstants.MOCK_FOLDER + "issue_170_original.txt"); + revLines = fileToLines(TestConstants.MOCK_FOLDER + "issue_170_revised.txt"); + } catch (IOException e) { + fail(e.getMessage()); + } + + List originalAndDiff = UnifiedDiffUtils.generateOriginalAndDiff(origLines, revLines); + System.out.println(originalAndDiff.stream().collect(joining("\n"))); + } + public static List fileToLines(String filename) throws FileNotFoundException, IOException { List lines = new ArrayList<>(); String line = ""; diff --git a/java-diff-utils/src/test/resources/mocks/issue_170_original.txt b/java-diff-utils/src/test/resources/mocks/issue_170_original.txt new file mode 100644 index 00000000..8aa703f0 --- /dev/null +++ b/java-diff-utils/src/test/resources/mocks/issue_170_original.txt @@ -0,0 +1,95 @@ +//According to the original text, an html will be generated by comparing the text +public class generateDiffHtmlTest { + /** + * Here's a simple example of getting a nice html page based on the original text and the contrasted text,Read n1.txt and n2.txt of D disk, and finally generate an html file + * + */ + @Test + public static void generateOriginalAndDiffDemo(){ + List origLines = getFileContent("D:\\n1.txt"); + List revLines =getFileContent("D:\\n2.txt"); + List originalAndDiff =UnifiedDiffUtils.generateOriginalAndDiff(origLines, revLines); + //System.out.println(originalAndDiff.size()); + generateDiffHtml(originalAndDiff,"D:\\diff.html"); + } + + /** + * get file content + * @param filePath file path + */ + public static List getFileContent(String filePath) { + //origin + List fileContent =null; + File file = new File(filePath); + try { + fileContent = Files.readAllLines(file.toPath()); + } catch (IOException e) { + e.printStackTrace(); + } + return fileContent; + } + + /** + * The html file is generated by the difference diff between the two files, and the detailed content of the file comparison can be seen by opening the html file + * + */ + public static void generateDiffHtml(List diffString, String htmlPath) { + StringBuilder builder = new StringBuilder(); + for (String line : diffString) { + builder.append(line); + builder.append("\n"); + } + String githubCss = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.1/styles/github.min.css"; + String diff2htmlCss = "https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css"; + String diff2htmlJs = "https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"; + + String template = "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + ""; + template = template.replace("temp", builder.toString()); + FileWriter fileWriter = null; + try { + fileWriter = new FileWriter(htmlPath); + BufferedWriter buf = new BufferedWriter(fileWriter); + buf.write(template); + buf.close(); + fileWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/java-diff-utils/src/test/resources/mocks/issue_170_revised.txt b/java-diff-utils/src/test/resources/mocks/issue_170_revised.txt new file mode 100644 index 00000000..7aa91dc2 --- /dev/null +++ b/java-diff-utils/src/test/resources/mocks/issue_170_revised.txt @@ -0,0 +1,114 @@ +package com.github.difflib.examples; + +import com.github.difflib.UnifiedDiffUtils; +import org.junit.jupiter.api.Test; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.util.List; + +// According to the original text, an html will be generated by comparing the text. +public class generateDiffHtmlTest { + + /** + * Here's a simple example of getting a nice html page based on the original text and the contrasted text, + * Read n1.txt and n2.txt of D disk, and finally generate an html file + * + */ + @Test + public static void generateOriginalAndDiffDemo(){ + List origLines = getFileContent("D:\\n1.txt"); + List revLines = getFileContent("D:\\n2.txt"); + List originalAndDiff = UnifiedDiffUtils.generateOriginalAndDiff(origLines, revLines); + + //generateDiffHtml + generateDiffHtml(originalAndDiff,"D:\\diff.html"); + } + + /** + * get file content + * + * @param filePath file path + */ + public static List getFileContent(String filePath) { + //原始文件 + List fileContent = null; + File file = new File(filePath); + try { + fileContent = Files.readAllLines(file.toPath()); + } catch (IOException e) { + e.printStackTrace(); + } + return fileContent; + } + + /** + * The html file is generated by the difference diff between the two files, + * and the detailed content of the file comparison can be seen by opening the html file + * + * @param diffString The comparison result obtained by calling the above diffString method + * @param htmlPath Generated html path,e.g:/user/var/mbos/ent/21231/diff.html + */ + public static void generateDiffHtml(List diffString, String htmlPath) { + StringBuilder builder = new StringBuilder(); + for (String line : diffString) { + builder.append(line); + builder.append("\n"); + } + String githubCss = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.1/styles/github.min.css"; + String diff2htmlCss = "https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css"; + String diff2htmlJs = "https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"; + + String template = "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + ""; + template = template.replace("temp", builder.toString()); + FileWriter fileWriter = null; + try { + fileWriter = new FileWriter(htmlPath); + BufferedWriter buf = new BufferedWriter(fileWriter); + buf.write(template); + buf.close(); + fileWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} +