Skip to content

Commit ed5830c

Browse files
committed
refactor: allow passing a custom algorithm to DiffRowGenerator
1 parent 7a21157 commit ed5830c

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

src/commonMain/kotlin/io/github/petertrr/diffutils/text/DiffRowGenerator.kt

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@
1818
*/
1919
package io.github.petertrr.diffutils.text
2020

21-
import io.github.petertrr.diffutils.algorithm.DiffEqualizer
21+
import io.github.petertrr.diffutils.algorithm.DiffAlgorithm
2222
import io.github.petertrr.diffutils.algorithm.EqualsDiffEqualizer
2323
import io.github.petertrr.diffutils.algorithm.IgnoreWsStringDiffEqualizer
24+
import io.github.petertrr.diffutils.algorithm.myers.MyersDiff
2425
import io.github.petertrr.diffutils.diff
2526
import io.github.petertrr.diffutils.patch.ChangeDelta
2627
import io.github.petertrr.diffutils.patch.Chunk
@@ -42,7 +43,7 @@ import kotlin.math.min
4243
* @param columnWidth Set the column width of generated lines of original and revised texts.
4344
* Making it < 0 doesn't make any sense.
4445
* @param ignoreWhiteSpaces Ignore white spaces in generating diff rows or not
45-
* @param equalizer Provide an equalizer for diff processing
46+
* @param algorithm The diffing algorithm to use. By default [MyersDiff].
4647
* @param inlineDiffByWord Per default each character is separately processed.
4748
* Setting this parameter to `true` introduces processing by word, which does
4849
* not deliver in word changes. Therefore, the whole word will be tagged as changed:
@@ -80,9 +81,9 @@ import kotlin.math.min
8081
public class DiffRowGenerator(
8182
private val columnWidth: Int = 80,
8283
private val ignoreWhiteSpaces: Boolean = false,
83-
private var equalizer: DiffEqualizer<String> = if (ignoreWhiteSpaces) IgnoreWsStringDiffEqualizer() else EqualsDiffEqualizer(),
84+
private val algorithm: DiffAlgorithm<String> = defaultAlgorithm(ignoreWhiteSpaces),
8485
inlineDiffByWord: Boolean = false,
85-
private val inlineDiffSplitter: DiffSplitter = if (inlineDiffByWord) WordDiffSplitter() else CharDiffSplitter(),
86+
private val inlineDiffSplitter: DiffSplitter = defaultSplitter(inlineDiffByWord),
8687
private val mergeOriginalRevised: Boolean = false,
8788
private val newTag: DiffTagGenerator = HtmlDiffTagGenerator("editNewInline"),
8889
private val oldTag: DiffTagGenerator = HtmlDiffTagGenerator("editOldInline"),
@@ -102,7 +103,7 @@ public class DiffRowGenerator(
102103
* @return The [DiffRow]s between original and revised texts
103104
*/
104105
public fun generateDiffRows(original: List<String>, revised: List<String>): List<DiffRow> =
105-
generateDiffRows(original, diff(original, revised, equalizer))
106+
generateDiffRows(original, diff(original, revised, algorithm))
106107

107108
/**
108109
* Generates the [DiffRow]s describing the difference between original and
@@ -278,7 +279,7 @@ public class DiffRowGenerator(
278279
val origList = inlineDiffSplitter.split(joinedOrig)
279280
val revList = inlineDiffSplitter.split(joinedRev)
280281

281-
val diff = diff(origList, revList, equalizer)
282+
val diff = diff(origList, revList, algorithm)
282283
val inlineDeltas = diff.deltas.reversed()
283284

284285
for (inlineDelta in inlineDeltas) {
@@ -470,3 +471,11 @@ public class DiffRowGenerator(
470471
return sequence
471472
}
472473
}
474+
475+
private fun defaultAlgorithm(ignoreWhiteSpaces: Boolean): DiffAlgorithm<String> {
476+
val equalizer = if (ignoreWhiteSpaces) IgnoreWsStringDiffEqualizer() else EqualsDiffEqualizer()
477+
return MyersDiff(equalizer)
478+
}
479+
480+
private fun defaultSplitter(inlineDiffByWord: Boolean): DiffSplitter =
481+
if (inlineDiffByWord) WordDiffSplitter() else CharDiffSplitter()

0 commit comments

Comments
 (0)