[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++) {