diff --git a/eclipse-scout-core/src/encoder/PlainTextEncoder.ts b/eclipse-scout-core/src/encoder/PlainTextEncoder.ts
index f24a7d13b8a..4552e169ab7 100644
--- a/eclipse-scout-core/src/encoder/PlainTextEncoder.ts
+++ b/eclipse-scout-core/src/encoder/PlainTextEncoder.ts
@@ -17,7 +17,8 @@ export interface PlainTextEncoderOptions {
compact?: boolean;
/**
- * Calls string.trim(). White space at the beginning and the end of the text gets removed. Default is false.
+ * Calls string.trim(). Empty lines at the beginning and the end of the text get removed. Default is false.
+ * Spaces are always removed.
*/
trim?: boolean;
diff --git a/eclipse-scout-core/test/encoder/PlainTextEncoderSpec.ts b/eclipse-scout-core/test/encoder/PlainTextEncoderSpec.ts
index a58c93b068b..c4d6c27cbab 100644
--- a/eclipse-scout-core/test/encoder/PlainTextEncoderSpec.ts
+++ b/eclipse-scout-core/test/encoder/PlainTextEncoderSpec.ts
@@ -15,6 +15,7 @@ describe('PlainTextEncoder', () => {
let encoder = new PlainTextEncoder();
it('converts HTML to plain text', () => {
+ expect(encoder.encode(null)).toBe(null);
expect(encoder.encode('')).toBe('');
let htmlText = 'hello';
@@ -113,6 +114,15 @@ describe('PlainTextEncoder', () => {
it('removes leading and trailing newlines if configured', () => {
let htmlText = '\n\nHello!\n\n';
+ expect(encoder.encode(htmlText, {trim: false})).toBe('\n\nHello!\n\n');
+ expect(encoder.encode(htmlText, {trim: true})).toBe('Hello!');
+
+ htmlText = '\n\n Hello! \n\n';
+ expect(encoder.encode(htmlText, {trim: false})).toBe('\n\nHello!\n\n');
+ expect(encoder.encode(htmlText, {trim: true})).toBe('Hello!');
+
+ htmlText = ' \n \n Hello! \n \n ';
+ expect(encoder.encode(htmlText, {trim: false})).toBe('\n\nHello!\n\n');
expect(encoder.encode(htmlText, {trim: true})).toBe('Hello!');
});
@@ -259,4 +269,23 @@ describe('PlainTextEncoder', () => {
htmlText = '<\tabc attr=\'someText\'>';
expect(encoder.removeAttributeValues(htmlText)).toBe('<\tabc attr=\'someText\'>');
});
+
+ it('trims lines, but preserves other white-space', () => {
+ expect(encoder.encode('hello')).toBe('hello');
+ expect(encoder.encode('one\ntwo')).toBe('one\ntwo');
+ expect(encoder.encode('one\r\ntwo')).toBe('one\ntwo');
+ expect(encoder.encode('one\rtwo')).toBe('one\ntwo');
+ expect(encoder.encode('one two')).toBe('one two');
+ expect(encoder.encode('one two')).toBe('one\u00a0\u00a0 two');
+ expect(encoder.encode('one two')).toBe('one \t two');
+ expect(encoder.encode(' one \n two \n three ')).toBe('one\ntwo\nthree');
+ expect(encoder.encode('a\n b\n c')).toBe('a\n\u00A0\u00A0b\n\u00A0\u00A0\u00A0\u00A0c');
+ });
+
+ it('decodes special characters', () => {
+ expect(encoder.encode('&')).toBe('&');
+ expect(encoder.encode('&&amp;')).toBe('&&');
+ expect(encoder.encode('Hellö!')).toBe('Hellö!');
+ expect(encoder.encode('a<br>b')).toBe('a
b');
+ });
});
diff --git a/org.eclipse.scout.rt.platform.test/src/test/java/org/eclipse/scout/rt/platform/html/HtmlEntitiesTest.java b/org.eclipse.scout.rt.platform.test/src/test/java/org/eclipse/scout/rt/platform/html/HtmlEntitiesTest.java
new file mode 100644
index 00000000000..f4fce4b36d9
--- /dev/null
+++ b/org.eclipse.scout.rt.platform.test/src/test/java/org/eclipse/scout/rt/platform/html/HtmlEntitiesTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2010, 2025 BSI Business Systems Integration AG
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.scout.rt.platform.html;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.scout.rt.platform.BEANS;
+import org.eclipse.scout.rt.testing.platform.runner.PlatformTestRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SuppressWarnings({"ConcatenationWithEmptyString", "SpellCheckingInspection", "TextBlockMigration"})
+@RunWith(PlatformTestRunner.class)
+public class HtmlEntitiesTest {
+
+ @Test
+ public void testUnescapeAll_Empty() {
+ final HtmlEntities entities = BEANS.get(HtmlEntities.class);
+ assertNull(entities.unescapeAll(null));
+ assertEquals("", entities.unescapeAll(""));
+ assertEquals(" ", entities.unescapeAll(" "));
+ }
+
+ @Test
+ public void testUnescapeAll_Named() {
+ final HtmlEntities entities = BEANS.get(HtmlEntities.class);
+ assertEquals("ß", entities.unescapeAll("ß"));
+ assertEquals("Ü", entities.unescapeAll("Ü"));
+ assertEquals("&", entities.unescapeAll("&"));
+ assertEquals("A&&Z", entities.unescapeAll("A&&Z"));
+ assertEquals("ä", entities.unescapeAll("ä"));
+ assertEquals("auml;", entities.unescapeAll("auml;"));
+ assertEquals("drag&drop", entities.unescapeAll("drag&drop"));
+ }
+
+ @Test
+ public void testUnescapeAll_NumericDecimal() {
+ final HtmlEntities entities = BEANS.get(HtmlEntities.class);
+ assertEquals("'", entities.unescapeAll("'"));
+ assertEquals("€", entities.unescapeAll("€"));
+ assertEquals("A€€Z", entities.unescapeAll("A€€Z"));
+ }
+
+ @Test
+ public void testUnescapeAll_NumericHex() {
+ final HtmlEntities entities = BEANS.get(HtmlEntities.class);
+ assertEquals("B", entities.unescapeAll("B"));
+ assertEquals("B", entities.unescapeAll("B"));
+ assertEquals("?", entities.unescapeAll("?"));
+ assertEquals("?", entities.unescapeAll("?"));
+ assertEquals("🦕", entities.unescapeAll("🦕"));
+ assertEquals("A🦕🦕Z", entities.unescapeAll("A🦕🦕Z"));
+ }
+
+ @Test
+ public void testUnescapeAll_ComplexStrings() {
+ final HtmlEntities entities = BEANS.get(HtmlEntities.class);
+ assertEquals("text'text", entities.unescapeAll("text'text"));
+ assertEquals("'€", entities.unescapeAll("'€"));
+ assertEquals("/ˈʊmlaʊt/", entities.unescapeAll("/ˈʊmlaʊt/"));
+ assertEquals("Kühlflüssigkeitsüberlaufbehälter", entities.unescapeAll("Kühlflüssigkeitsüberlaufbehälter"));
+ assertEquals(" [Viele Kühe machen Mühe!] ", entities.unescapeAll(" [Viele Kühe machen Mühe!] "));
+ assertEquals("🤸🏾♀️", entities.unescapeAll("🤸🏾♀️"));
+ assertEquals("🏴☠️", entities.unescapeAll("🏴☠️"));
+ assertEquals(""
+ + "Face with Tears of Joy Emoji: \uD83D\uDE02\n"
+ + "Party Popper Emoji: \uD83C\uDF89\n"
+ + "Man Technologist: Medium-light Skin Tone: \uD83D\uDC68\uD83C\uDFFC\u200D\uD83D\uDCBB",
+ entities.unescapeAll(""
+ + "Face with Tears of Joy Emoji: 😂\n"
+ + "Party Popper Emoji: 🎉\n"
+ + "Man Technologist: Medium-light Skin Tone: 👨🏼💻"));
+ assertEquals("
Z1
Z2
")); + assertEquals("Guten Tag\n\n\u00A0\n\nZeile 2", helper.toPlainText("Guten Tag
Zeile 2
line1
\nx
line2
")); assertEquals("line1 x\nline2", helper.toPlainText("| Ut wisi enim ad minim veniam | -|
| Typi | -Habent | -
| Nam: * | -Tempor | -
| Claritas: * | -Voluptaria/vide | -
| Facilisi: * | -Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu. - -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam |
-
| - | |
| Luptatum | -|
| Quodsi | -Menandri | -
| Explicari: * | -Nonumes | -
| Rationibus: * | -Constituam | -
| Noster: * | -Pri | -
| Posse / Facer: | -Iisque has 26 | -
| MEA: | -1598 | -
| Malis: | -Perpetua Duo | -
| Utamur: | -Graece | -
| Cum: * | -0265134987 | -
| Ridens: * | -x.postulant@referrentur.org | -
| - | |
-Est ea phaedrum , mea tation voluptatum contentiones no.
-
-Nec te omittam qualisque, delectus periculis argumentum est no.
-
| Ut wisi enim ad minim veniam | -|
| Typi | -Habent | -
Nam: * |
-Tempor | -
| Claritas: * | -Voluptaria /vide |
-
| Facilisi: * | -Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu.- -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam |
-
| - | |
| Luptatum | -|
| Quodsi | -Menandri | -
| Explicari: * | -Nonumes | -
| Rationibus: * | -Constituam | -
| Noster: * | -Pri | -
| Posse / Facer: | -Iisque has 26 | -
| MEA: | -1598 | -
| Malis: | -Perpetua Duo | -
| Utamur: | -Graece | -
| Cum: * | -0265134987 | -
| Ridens: * | -x.postulant@referrentur.org | -
| - | |
Lorem: -http://www.eclipse.org/legal/
- - diff --git a/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_bodyAndHeadTagMissing.html b/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_bodyAndHeadTagMissing.html deleted file mode 100644 index d2b2cd8501d..00000000000 --- a/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_bodyAndHeadTagMissing.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - -| Ut wisi enim ad minim veniam | -|
| Typi | -Habent | -
| Nam: * | -Tempor | -
| Claritas: * | -Voluptaria/vide | -
| Facilisi: * | -Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu. - -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam |
-
| - | |
| Luptatum | -|
| Quodsi | -Menandri | -
| Explicari: * | -Nonumes | -
| Rationibus: * | -Constituam | -
| Noster: * | -Pri | -
| Posse / Facer: | -Iisque has 26 | -
| MEA: | -1598 | -
| Malis: | -Perpetua Duo | -
| Utamur: | -Graece | -
| Cum: * | -0265134987 | -
| Ridens: * | -x.postulant@referrentur.org | -
| - | |
-Est ea phaedrum , mea tation voluptatum contentiones no.
-
-Nec te omittam qualisque, delectus periculis argumentum est no.
-
| Ut wisi enim ad minim veniam | -|
| Typi | -Habent | -
Nam: * |
-Tempor | -
| Claritas: * | -Voluptaria /vide |
-
| Facilisi: * | -Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu.- -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam |
-
| - | |
| Luptatum | -|
| Quodsi | -Menandri | -
| Explicari: * | -Nonumes | -
| Rationibus: * | -Constituam | -
| Noster: * | -Pri | -
| Posse / Facer: | -Iisque has 26 | -
| MEA: | -1598 | -
| Malis: | -Perpetua Duo | -
| Utamur: | -Graece | -
| Cum: * | -0265134987 | -
| Ridens: * | -x.postulant@referrentur.org | -
| - | |
Lorem: -http://www.eclipse.org/legal/
- diff --git a/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_bodyTagMissing.html b/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_bodyTagMissing.html deleted file mode 100644 index 3d99a904c6a..00000000000 --- a/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_bodyTagMissing.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - - -| Ut wisi enim ad minim veniam | -|
| Typi | -Habent | -
| Nam: * | -Tempor | -
| Claritas: * | -Voluptaria/vide | -
| Facilisi: * | -Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu. - -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam |
-
| - | |
| Luptatum | -|
| Quodsi | -Menandri | -
| Explicari: * | -Nonumes | -
| Rationibus: * | -Constituam | -
| Noster: * | -Pri | -
| Posse / Facer: | -Iisque has 26 | -
| MEA: | -1598 | -
| Malis: | -Perpetua Duo | -
| Utamur: | -Graece | -
| Cum: * | -0265134987 | -
| Ridens: * | -x.postulant@referrentur.org | -
| - | |
-Est ea phaedrum , mea tation voluptatum contentiones no.
-
-Nec te omittam qualisque, delectus periculis argumentum est no.
-
| Ut wisi enim ad minim veniam | -|
| Typi | -Habent | -
Nam: * |
-Tempor | -
| Claritas: * | -Voluptaria /vide |
-
| Facilisi: * | -Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu.- -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam |
-
| - | |
| Luptatum | -|
| Quodsi | -Menandri | -
| Explicari: * | -Nonumes | -
| Rationibus: * | -Constituam | -
| Noster: * | -Pri | -
| Posse / Facer: | -Iisque has 26 | -
| MEA: | -1598 | -
| Malis: | -Perpetua Duo | -
| Utamur: | -Graece | -
| Cum: * | -0265134987 | -
| Ridens: * | -x.postulant@referrentur.org | -
| - | |
Lorem: -http://www.eclipse.org/legal/
- diff --git a/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_headTagMissing.html b/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_headTagMissing.html deleted file mode 100644 index 5d01ec41166..00000000000 --- a/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlExample_headTagMissing.html +++ /dev/null @@ -1,239 +0,0 @@ - - - - -| Ut wisi enim ad minim veniam | -|
| Typi | -Habent | -
| Nam: * | -Tempor | -
| Claritas: * | -Voluptaria/vide | -
| Facilisi: * | -Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu. - -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam |
-
| - | |
| Luptatum | -|
| Quodsi | -Menandri | -
| Explicari: * | -Nonumes | -
| Rationibus: * | -Constituam | -
| Noster: * | -Pri | -
| Posse / Facer: | -Iisque has 26 | -
| MEA: | -1598 | -
| Malis: | -Perpetua Duo | -
| Utamur: | -Graece | -
| Cum: * | -0265134987 | -
| Ridens: * | -x.postulant@referrentur.org | -
| - | |
-Est ea phaedrum , mea tation voluptatum contentiones no.
-
-Nec te omittam qualisque, delectus periculis argumentum est no.
-
| Ut wisi enim ad minim veniam | -|
| Typi | -Habent | -
Nam: * |
-Tempor | -
| Claritas: * | -Voluptaria /vide |
-
| Facilisi: * | -Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu.- -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam |
-
| - | |
| Luptatum | -|
| Quodsi | -Menandri | -
| Explicari: * | -Nonumes | -
| Rationibus: * | -Constituam | -
| Noster: * | -Pri | -
| Posse / Facer: | -Iisque has 26 | -
| MEA: | -1598 | -
| Malis: | -Perpetua Duo | -
| Utamur: | -Graece | -
| Cum: * | -0265134987 | -
| Ridens: * | -x.postulant@referrentur.org | -
| - | |
Lorem: -http://www.eclipse.org/legal/
- - diff --git a/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlToPlain_expectedResult.txt b/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlToPlain_expectedResult.txt deleted file mode 100644 index 981802c2f74..00000000000 --- a/org.eclipse.scout.rt.platform.test/src/test/resources/org/eclipse/scout/rt/platform/util/htmlToPlain_expectedResult.txt +++ /dev/null @@ -1,50 +0,0 @@ -Ut wisi enim ad minim veniam | -Typi | Habent | -Nam: * | Tempor | -Claritas: * | Voluptaria/vide | -Facilisi: * | Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu. - -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam | - | -Luptatum | -Quodsi | Menandri | -Explicari: * | Nonumes | -Rationibus: * | Constituam | -Noster: * | Pri | -Posse / Facer: | Iisque has 26 | -MEA: | 1598 | -Malis: | Perpetua Duo | -Utamur: | Graece | -Cum: * | 0265134987 | -Ridens: * | x.postulant@referrentur.org | - | - -Est ea phaedrum , mea tation voluptatum contentiones no. - -Nec te omittam qualisque, delectus periculis argumentum est no. -Ut wisi enim ad minim veniam | -Typi | Habent | -Nam: * | Tempor | -Claritas: * | Voluptaria/vide | -Facilisi: * | Te mel modo meis ullamcorper. Eos verear dissentiet in, eam dico solum accusamus eu. - -Sonet aliquam suscipit -Justo putent usu -Ex. Quidam | - | -Luptatum | -Quodsi | Menandri | -Explicari: * | Nonumes | -Rationibus: * | Constituam | -Noster: * | Pri | -Posse / Facer: | Iisque has 26 | -MEA: | 1598 | -Malis: | Perpetua Duo | -Utamur: | Graece | -Cum: * | 0265134987 | -Ridens: * | x.postulant@referrentur.org | - | - -Lorem: http://www.eclipse.org/legal/ diff --git a/org.eclipse.scout.rt.platform/src/main/java/org/eclipse/scout/rt/platform/html/HtmlEntities.java b/org.eclipse.scout.rt.platform/src/main/java/org/eclipse/scout/rt/platform/html/HtmlEntities.java new file mode 100644 index 00000000000..50bd71d8d67 --- /dev/null +++ b/org.eclipse.scout.rt.platform/src/main/java/org/eclipse/scout/rt/platform/html/HtmlEntities.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2010, 2025 BSI Business Systems Integration AG + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.scout.rt.platform.html; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.scout.rt.platform.ApplicationScoped; +import org.eclipse.scout.rt.platform.exception.ProcessingException; +import org.eclipse.scout.rt.platform.util.IOUtility; +import org.json.JSONObject; + +@ApplicationScoped +public class HtmlEntities { + + /** + * Key = Escaped character name (e.g. {@code "ö"}) + *