[TOB-475] Fix star (*) in textblock pdf generate
* fixed bug in textblock parsing logic that failed parsing texts that
that contained a star character. Confliced with bulletpoint detection
Signed-off-by: Tobias Stummer <stummer@develop-group.de>
diff --git a/pom.xml b/pom.xml
index 3a620a5..b9e648c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
</parent>
<groupId>org.eclipse.openk</groupId>
<artifactId>statement-public-affairs</artifactId>
-<version>1.0.1</version>
+<version>1.0.2</version>
<name>statement-public-affairs</name>
<description>StatementPublicAffairs project for openKONSEQUENZ</description>
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/model/TextToken.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/model/TextToken.java
index 482eaf7..fe83724 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/model/TextToken.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/model/TextToken.java
@@ -56,5 +56,26 @@
return token;
}
+ public static TextToken newBulletToken() {
+ TextToken token = new TextToken();
+ token.setType(Token.TK_BULLET);
+ token.setValue(" *");
+ return token;
+ }
+
+ public static TextToken newBoldToken() {
+ TextToken token = new TextToken();
+ token.setType(Token.TK_BOLD);
+ token.setValue("**");
+ return token;
+ }
+
+ public static TextToken newItalicToken() {
+ TextToken token = new TextToken();
+ token.setType(Token.TK_ITALIC);
+ token.setValue("__");
+ return token;
+ }
+
}
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/StatementCompileService.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/StatementCompileService.java
index cbbc53d..5e8f88f 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/StatementCompileService.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/StatementCompileService.java
@@ -483,6 +483,7 @@
}
break;
case TK_UNDERSCORE:
+ case TK_STAR:
case STRING:
cont.setFont(fonts.get(currentFontMod), fontSize);
if (firstInLine && inBulletPoint) {
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Lexer.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Lexer.java
index d653438..96ca9a8 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Lexer.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Lexer.java
@@ -68,7 +68,7 @@
}
private boolean nextToken() {
- for (Token t : Token.values()) {
+ for (Token t : Token.lexerTokens()) {
int end = t.endOfMatch(input.toString());
if (end != -1) {
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtil.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtil.java
index 752b938..083779b 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtil.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtil.java
@@ -60,6 +60,66 @@
if (!lexer.isSuccessful()) {
throw new BadRequestException("Textblock could not be parsed: " + lexer.errorMessage());
}
+
+
+ // second stage filter
+
+ List<TextToken> filtered = new ArrayList<>();
+ boolean changes;
+ do {
+ changes = false;
+ for (int i=0; i < tokens.size(); i++) {
+ if (i == 0 && tokens.size() > 1) {
+ // Initial, Star, Space -> Bulletpoint
+ if (tokens.get(i).getType() == Token.TK_STAR && tokens.get(i+1).getType() == Token.TK_SPACE) {
+ tokens.remove(i);
+ tokens.remove(i);
+ tokens.add(i, TextToken.newBulletToken());
+ changes = true;
+ break;
+ }
+ }
+ if (i+2 < tokens.size()) {
+ // NL, Star, Space -> NL, Bulletpoint
+ if (tokens.get(i).getType() == Token.TK_NL && tokens.get(i+1).getType() == Token.TK_STAR && tokens.get(i+2).getType() == Token.TK_SPACE) {
+ tokens.remove(i+1);
+ tokens.remove(i+1);
+ tokens.add(i+1, TextToken.newBulletToken());
+ changes = true;
+ break;
+ }
+ }
+ if (i + 1 < tokens.size()) {
+ // Star, Star -> Bold
+ if (tokens.get(i).getType() == Token.TK_STAR && tokens.get(i+1).getType() == Token.TK_STAR) {
+ tokens.remove(i);
+ tokens.remove(i);
+ tokens.add(i, TextToken.newBoldToken());
+ changes = true;
+ break;
+ }
+
+ // _, _ -> Italic
+ if (tokens.get(i).getType() == Token.TK_UNDERSCORE && tokens.get(i+1).getType() == Token.TK_UNDERSCORE) {
+ tokens.remove(i);
+ tokens.remove(i);
+ tokens.add(i, TextToken.newItalicToken());
+ changes = true;
+ break;
+ }
+ }
+ }
+ } while (changes);
+
+ // cleanup change TK_UNDERSCORE and TK_STAR to STRING
+ for (TextToken token : tokens) {
+ if (Token.TK_STAR == token.getType()) {
+ token.setType(Token.STRING);
+ } else if (Token.TK_UNDERSCORE == token.getType()) {
+ token.setType(Token.STRING);
+ }
+ }
+
return tokens;
}
diff --git a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Token.java b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Token.java
index a4240d5..0fb8885 100644
--- a/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Token.java
+++ b/src/main/java/org/eclipse/openk/statementpublicaffairs/service/compile/Token.java
@@ -22,14 +22,20 @@
TK_PB("<PB>"),
TK_PAR("<PAR>"),
+ TK_NL ("\n"),
+ TK_SPACE(" "),
+ TK_BULLET(" \\*"),
+ TK_STAR("\\*"),
+ TK_UNDERSCORE("_"),
TK_BOLD ("\\*\\*"),
TK_ITALIC ("__"),
- TK_BULLET("\\* "),
- TK_UNDERSCORE("_"),
- TK_SPACE(" "),
- TK_NL ("\n"),
STRING ("[^ \\*_\n]+");
+ public static Token[] lexerTokens() {
+ Token[] lexertokens = {TK_PB, TK_PAR, TK_NL, TK_SPACE, TK_STAR, TK_UNDERSCORE, STRING};
+ return lexertokens;
+ }
+
private final Pattern pattern;
Token(String regex) {
@@ -44,4 +50,4 @@
}
return -1;
}
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtilTest.java b/src/test/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtilTest.java
index c9fb39f..1a9fc20 100644
--- a/src/test/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtilTest.java
+++ b/src/test/java/org/eclipse/openk/statementpublicaffairs/service/compile/TextCompileUtilTest.java
@@ -37,8 +37,125 @@
import org.junit.jupiter.api.Test;
class TextCompileUtilTest {
-
-
+
+ /**
+ * Special Testcase bulletpoints
+ */
+ @Test
+ void parseTextToTokenWithGoldenTextBulltepoints() {
+
+ // *
+ String testString1 = "*";
+ Token[] tokenarr1 = { Token.STRING};
+ assertTrue(compare(testString1, tokenarr1), "Error comparing " + testString1);
+ // *a
+ String testString2 = "*a";
+ Token[] tokenarr2 = { Token.STRING, Token.STRING};
+ assertTrue(compare(testString2, tokenarr2), "Error comparing " + testString2);
+ // *<SPC>
+ String testString3 = "* ";
+ Token[] tokenarr3 = { Token.TK_BULLET};
+ assertTrue(compare(testString3, tokenarr3), "Error comparing " + testString3);
+ // *<SPC><NL>
+ String testString4 = "* \n";
+ Token[] tokenarr4 = { Token.TK_BULLET, Token.TK_NL };
+ assertTrue(compare(testString4, tokenarr4), "Error comparing " + testString4);
+ // *<SPC>a
+ String testString5 = "* a";
+ Token[] tokenarr5 = { Token.TK_BULLET, Token.STRING };
+ assertTrue(compare(testString5, tokenarr5), "Error comparing " + testString5);
+ // **
+ String testString6 = "**";
+ Token[] tokenarr6 = { Token.TK_BOLD };
+ assertTrue(compare(testString6, tokenarr6), "Error comparing " + testString6);
+ // **a
+ String testString7 = "**a";
+ Token[] tokenarr7 = { Token.TK_BOLD, Token.STRING };
+ assertTrue(compare(testString7, tokenarr7), "Error comparing " + testString7);
+ // **<NL>
+ String testString8 = "**\n";
+ Token[] tokenarr8 = { Token.TK_BOLD, Token.TK_NL };
+ assertTrue(compare(testString8, tokenarr8), "Error comparing " + testString8);
+ // <NL>*
+ String testString9 = "\n*";
+ Token[] tokenarr9 = { Token.TK_NL, Token.STRING };
+ assertTrue(compare(testString9, tokenarr9), "Error comparing " + testString9);
+ // <NL>*a
+ String testString10 = "\n*a";
+ Token[] tokenarr10 = { Token.TK_NL, Token.STRING, Token.STRING };
+ assertTrue(compare(testString10, tokenarr10), "Error comparing " + testString10);
+ // <NL>*<SPC>
+ String testString11 = "\n* ";
+ Token[] tokenarr11 = { Token.TK_NL, Token.TK_BULLET };
+ assertTrue(compare(testString11, tokenarr11), "Error comparing " + testString11);
+ // <NL>*<SPC><NL>
+ String testString12 = "\n* \n";
+ Token[] tokenarr12 = { Token.TK_NL, Token.TK_BULLET, Token.TK_NL };
+ assertTrue(compare(testString12, tokenarr12), "Error comparing " + testString12);
+ // <NL>*<SPC>a
+ String testString13 = "\n* a";
+ Token[] tokenarr13 = { Token.TK_NL, Token.TK_BULLET, Token.STRING };
+ assertTrue(compare(testString13, tokenarr13), "Error comparing " + testString13);
+ // <NL>**
+ String testString14 = "\n**";
+ Token[] tokenarr14 = { Token.TK_NL, Token.TK_BOLD };
+ assertTrue(compare(testString14, tokenarr14), "Error comparing " + testString14);
+ // <NL>**a
+ String testString15 = "\n**a";
+ Token[] tokenarr15 = { Token.TK_NL, Token.TK_BOLD, Token.STRING };
+ assertTrue(compare(testString15, tokenarr15), "Error comparing " + testString15);
+ // <NL>**<NL>
+ String testString16 = "\n**\n";
+ Token[] tokenarr16 = { Token.TK_NL, Token.TK_BOLD, Token.TK_NL };
+ assertTrue(compare(testString16, tokenarr16), "Error comparing " + testString16);
+ // Das ist * ein Stern
+ String testString17 = "Ein * Stern";
+ Token[] tokenarr17 = {Token.STRING, Token.TK_SPACE, Token.STRING, Token.TK_SPACE, Token.STRING};
+ assertTrue(compare(testString17, tokenarr17), "Error comparing " + testString17);
+
+ }
+
+ private boolean compare(String teststring, Token[] tokenarr) {
+ List<TextToken> texttokens = TextCompileUtil.parseTextToToken(teststring);
+ List<Token> tokens = new ArrayList<>();
+ for (int i = 0; i < tokenarr.length; i++) {
+ tokens.add(tokenarr[i]);
+ }
+
+ boolean result = false;
+ if (tokens.size() == texttokens.size()) {
+ result = true;
+ for (int i = 0; i < tokens.size(); i++) {
+ if (tokens.get(i) != texttokens.get(i).getType()) {
+ result = false;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ @Test
+ void parseTextToTokenWithGoldenText3() {
+
+ String goldenString = "Test (7,03m*4,50m); Test";
+ List<TextToken> texttokens = TextCompileUtil.parseTextToToken(goldenString);
+ List<Token> tokens = new ArrayList<>();
+ tokens.add(Token.STRING);
+ tokens.add(Token.TK_SPACE);
+ tokens.add(Token.STRING);
+ tokens.add(Token.STRING);
+ tokens.add(Token.STRING);
+ tokens.add(Token.TK_SPACE);
+ tokens.add(Token.STRING);
+
+ assertTrue(tokens.size() == texttokens.size());
+
+ for (int i = 0; i < tokens.size(); i++) {
+ assertEquals(tokens.get(i), texttokens.get(i).getType());
+ }
+
+ }
@Test
void parseTextToTokenWithGoldenText() {
@@ -105,10 +222,9 @@
tokens.add(Token.STRING);
tokens.add(Token.TK_SPACE);
tokens.add(Token.STRING);
- tokens.add(Token.TK_UNDERSCORE);
tokens.add(Token.STRING);
-
-
+ tokens.add(Token.STRING);
+
assertTrue(tokens.size() == texttokens.size());
for (int i = 0; i < tokens.size(); i++) {