From 135699b7f867fe83495686ce7c44b1fd7b85d4a0 Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Mon, 3 Feb 2025 11:07:07 +0100
Subject: [PATCH] OZG-4095 html: Reduce html rendering to only replace newlines

---
 pom.xml                                       |  6 --
 .../osiv2/transfer/Osi2HtmlDocument.java      | 44 +----------
 .../osiv2/transfer/Osi2ResponseMapper.java    |  1 -
 .../factory/V1ReplyMessageTestFactory.java    |  2 +-
 .../osiv2/transfer/Osi2HtmlDocumentTest.java  | 73 +------------------
 5 files changed, 4 insertions(+), 122 deletions(-)

diff --git a/pom.xml b/pom.xml
index 30a0179..6da03db 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,6 @@
 		<openapi-generator.version>7.10.0</openapi-generator.version>
 		<swagger-parser.version>2.1.23</swagger-parser.version>
 		<wiremock-spring-boot.version>3.6.0</wiremock-spring-boot.version>
-		<jsoup.version>1.18.3</jsoup.version>
 	</properties>
 	<dependencies>
 		<!-- OZG-Cloud -->
@@ -60,11 +59,6 @@
 			<artifactId>swagger-parser</artifactId>
 			<version>${swagger-parser.version}</version>
 		</dependency>
-		<dependency>
-			<groupId>org.jsoup</groupId>
-			<artifactId>jsoup</artifactId>
-			<version>${jsoup.version}</version>
-		</dependency>
 
 		<!-- test -->
 		<dependency>
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java
index 5273da3..b6a5497 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java
@@ -1,51 +1,9 @@
 package de.ozgcloud.nachrichten.postfach.osiv2.transfer;
 
-import java.util.List;
-import java.util.function.Function;
-
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-
 public record Osi2HtmlDocument(String html) {
 
-	private record SpanRendering(String tag, Function<Element, String> markdownReplacement) {
-		static SpanRendering of(String tag, Function<Element, String> markdownReplacement) {
-			return new SpanRendering(tag, markdownReplacement);
-		}
-
-		void replaceElementsWithMarkdownSpansIn(Document document) {
-			document.body()
-					.select(tag)
-					.replaceAll(anchor -> new Element("span")
-							.text(markdownReplacement.apply(anchor))
-					);
-		}
-	}
-
-	static final List<SpanRendering> SPAN_RENDERINGS = List.of(
-			SpanRendering.of("a", anchor -> "[" + anchor.text() + "](" + anchor.attr("href") + ")"),
-			SpanRendering.of("img", image -> "![" + image.attr("alt") + "](" + image.attr("src") + ")"),
-			SpanRendering.of("i", italic -> "_" + italic.text() + "_"),
-			SpanRendering.of("em", italic -> "_" + italic.text() + "_"),
-			SpanRendering.of("b", bold -> "__" + bold.text() + "__"),
-			SpanRendering.of("strong", bold -> "__" + bold.text() + "__"),
-			SpanRendering.of("h1", heading -> "# " + heading.text()),
-			SpanRendering.of("h2", heading -> "## " + heading.text()),
-			SpanRendering.of("h3", heading -> "### " + heading.text()),
-			SpanRendering.of("blockquote", bold -> "> " + bold.text())
-	);
-
 	public String renderToPlainText() {
-		var document = Jsoup.parse(html);
-		applySpanRenderings(document);
-		return document.wholeText();
-	}
-
-	private void applySpanRenderings(Document document) {
-		for (var entry : SPAN_RENDERINGS) {
-			entry.replaceElementsWithMarkdownSpansIn(document);
-		}
+		return html.replaceAll("<br/?>", "\n");
 	}
 
 	public static String renderToPlainText(String html) {
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java
index aef50b4..0b20678 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java
@@ -2,7 +2,6 @@ package de.ozgcloud.nachrichten.postfach.osiv2.transfer;
 
 import java.time.ZoneOffset;
 
-import org.jsoup.Jsoup;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.ReportingPolicy;
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java
index e51f5ef..4df9e39 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java
@@ -15,7 +15,7 @@ public class V1ReplyMessageTestFactory {
 			Das ist das Multiline&amp;&lt;b&gt;a&lt;/b&gt<br><br/>
 			Body""";
 	public static final String REPLY_BODY = """
-			Das ist das Multiline&<b>a</b>
+			Das ist das Multiline&amp;&lt;b&gt;a&lt;/b&gt
 			
 			
 			Body""";
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java
index c4a928a..205145c 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java
@@ -4,84 +4,15 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.*;
 
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ValueSource;
 
 class Osi2HtmlDocumentTest {
 
 	@DisplayName("should render anchor link")
 	@Test
 	void shouldRenderAnchorLink() {
-		var plainText = renderPlainText("<a href=\"https://www.example.com\">Example</a>");
+		var plainText = renderPlainText("<a href=\"https://www.example.com\">Example<br></a><br/>text");
 
-		assertThat("[Example](https://www.example.com)").isEqualTo(plainText);
-	}
-
-	@DisplayName("should render h1 heading")
-	@Test
-	void shouldRenderH1Heading() {
-		var plainText = renderPlainText("<h1>Example</h1>");
-
-		assertThat(plainText).isEqualTo("# Example");
-	}
-
-	@DisplayName("should render h2 heading")
-	@Test
-	void shouldRenderH2Heading() {
-		var plainText = renderPlainText("<h2>Example</h2>");
-
-		assertThat(plainText).isEqualTo("## Example");
-	}
-
-	@DisplayName("should render h3  heading")
-	@Test
-	void shouldRenderH3Heading() {
-		var plainText = renderPlainText("<h3>Example</h3>");
-
-		assertThat(plainText ).isEqualTo("### Example");
-	}
-
-
-	@DisplayName("should render italic")
-	@ParameterizedTest
-	@ValueSource(strings = { "<i>Example</i>", "<em>Example</em>" })
-	void shouldRenderItalic(String italicExample) {
-		var plainText = renderPlainText(italicExample);
-
-		assertThat(plainText).isEqualTo("_Example_");
-	}
-
-	@DisplayName("should render bold")
-	@ParameterizedTest
-	@ValueSource(strings = { "<b>Example</b>", "<strong>Example</strong>" })
-	void shouldRenderBold(String boldExample) {
-		var plainText = renderPlainText(boldExample);
-
-		assertThat(plainText).isEqualTo("__Example__");
-	}
-
-	@DisplayName("should render image")
-	@Test
-	void shouldRenderImage() {
-		var plainText = renderPlainText("<img src=\"https://www.example.com/image.jpg\" alt=\"Example\">");
-
-		assertThat(plainText).isEqualTo("![Example](https://www.example.com/image.jpg)");
-	}
-
-	@DisplayName("should render blockquote")
-	@Test
-	void shouldRenderBlockquote() {
-		var plainText = renderPlainText("<blockquote><p>Example</p>\n<p>Example2</p></blockquote>");
-
-		assertThat(plainText).isEqualTo("> Example Example2");
-	}
-
-	@DisplayName("should render html")
-	@Test
-	void shouldRenderHtml() {
-		var plainText = renderPlainText("<p>Example&#128566;</p><br/><p>Example2</p><b>");
-
-		assertThat(plainText).isEqualTo("Example\uD83D\uDE36\nExample2____");
+		assertThat("<a href=\"https://www.example.com\">Example\n</a>\ntext").isEqualTo(plainText);
 	}
 	
 	private String renderPlainText(String html) {
-- 
GitLab