Sun, 10 Oct 2021 14:46:10 +0200
add diffs to RSS feed
build.gradle.kts | file | annotate | diff | comparison | revisions | |
src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt | file | annotate | diff | comparison | revisions |
1.1 --- a/build.gradle.kts Sat Oct 09 20:05:39 2021 +0200 1.2 +++ b/build.gradle.kts Sun Oct 10 14:46:10 2021 +0200 1.3 @@ -43,6 +43,7 @@ 1.4 implementation("com.vladsch.flexmark:flexmark-util-data:${flexmarkVersion}") 1.5 implementation("com.vladsch.flexmark:flexmark-ext-tables:${flexmarkVersion}") 1.6 implementation("com.vladsch.flexmark:flexmark-ext-gfm-strikethrough:${flexmarkVersion}") 1.7 + implementation("io.github.java-diff-utils:java-diff-utils:4.5") 1.8 } 1.9 } 1.10 }
2.1 --- a/src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt Sat Oct 09 20:05:39 2021 +0200 2.2 +++ b/src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt Sun Oct 10 14:46:10 2021 +0200 2.3 @@ -25,6 +25,8 @@ 2.4 2.5 package de.uapcore.lightpit.servlet 2.6 2.7 +import com.github.difflib.text.DiffRow 2.8 +import com.github.difflib.text.DiffRowGenerator 2.9 import de.uapcore.lightpit.AbstractServlet 2.10 import de.uapcore.lightpit.HttpRequest 2.11 import de.uapcore.lightpit.dao.DataAccessObject 2.12 @@ -36,6 +38,7 @@ 2.13 import java.text.SimpleDateFormat 2.14 import javax.servlet.annotation.WebServlet 2.15 2.16 + 2.17 @WebServlet(urlPatterns = ["/feed/*"]) 2.18 class FeedServlet : AbstractServlet() { 2.19 2.20 @@ -43,8 +46,6 @@ 2.21 get("/%project/issues.rss", this::issues) 2.22 } 2.23 2.24 - private fun String.convertLF() = replace("\r", "").replace("\n", "<br>") 2.25 - 2.26 private fun fullContent(issue: IssueHistoryData) = IssueDiff( 2.27 issue.id, 2.28 issue.subject, 2.29 @@ -52,7 +53,7 @@ 2.30 issue.status.name, 2.31 issue.category.name, 2.32 issue.subject, 2.33 - issue.description.convertLF(), 2.34 + issue.description.replace("\r", ""), 2.35 issue.assignee, 2.36 issue.eta?.let { SimpleDateFormat("dd.MM.yyyy").format(it) } ?: "", 2.37 issue.affected, 2.38 @@ -60,9 +61,38 @@ 2.39 ) 2.40 2.41 private fun diffContent(cur: IssueHistoryData, next: IssueHistoryData): IssueDiff { 2.42 + val generator = DiffRowGenerator.create() 2.43 + .showInlineDiffs(true) 2.44 + .mergeOriginalRevised(true) 2.45 + .inlineDiffByWord(true) 2.46 + .oldTag { start -> if (start) "<strike style=\"color:red\">" else "</strike>" } 2.47 + .newTag { start -> if (start) "<i style=\"color: green\">" else "</i>" } 2.48 + .build() 2.49 + 2.50 val prev = fullContent(next) 2.51 val diff = fullContent(cur) 2.52 - // TODO: compute and apply diff 2.53 + 2.54 + val result = generator.generateDiffRows( 2.55 + listOf(prev.subject, prev.component, prev.status, 2.56 + prev.category, prev.assignee, prev.eta, prev.affected, prev.resolved), 2.57 + listOf(diff.subject, diff.component, diff.status, 2.58 + diff.category, diff.assignee, diff.eta, diff.affected, diff.resolved) 2.59 + ) 2.60 + 2.61 + diff.subject = result[0].oldLine 2.62 + diff.component = result[1].oldLine 2.63 + diff.status = result[2].oldLine 2.64 + diff.category = result[3].oldLine 2.65 + diff.assignee = result[4].oldLine 2.66 + diff.eta = result[5].oldLine 2.67 + diff.affected = result[6].oldLine 2.68 + diff.resolved = result[7].oldLine 2.69 + 2.70 + diff.description = generator.generateDiffRows( 2.71 + prev.description.split('\n'), 2.72 + diff.description.split('\n') 2.73 + ).joinToString("<br>", transform = DiffRow::getOldLine) 2.74 + 2.75 return diff 2.76 } 2.77