From 4d97a84034d8888f89067cf3559eaaf5c7ba867a Mon Sep 17 00:00:00 2001 From: pmoehl Date: Thu, 7 Mar 2019 14:20:18 +0100 Subject: [PATCH 1/5] preserve spaces between scripts --- .../scriptlet4docx/docx/DocxTemplater.java | 13 +++- .../docx/DocxTemplaterTest.java | 12 ++++ .../resources/docx/DocxTemplaterTest-21.xml | 64 +++++++++++++++++++ 3 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/docx/DocxTemplaterTest-21.xml diff --git a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java index 5fc91b0..3d67778 100644 --- a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java +++ b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java @@ -110,6 +110,9 @@ protected TemplateContent processCleanedTemplate(TemplateContent content, Map"; + private static String SPACE_PRESERVE = "xml:space=\"preserve\""; protected static Map processParams(Map params) { Map res = new HashMap(); @@ -166,10 +169,16 @@ protected String processCleanedTemplate(String template, Map par int i = 0; for (String piece : pieces) { + Placeholder nextScript = i < scripts.size() ? scripts.get(i) : null; + if (piece.endsWith(WT_NO_PRESERVE) && nextScript != null && nextScript.text.contains(SPACE_PRESERVE)) { + // Preserve spaces if one of the elements inside the following script block preserves them + piece = piece.substring(0, piece.length() - WT_NO_PRESERVE.length()) + WT_SPACE_PRESERVE; + } + tplSkeleton.add(new Placeholder(UUID.randomUUID().toString(), piece, PlaceholderType.TEXT)); - if (i < scripts.size()) { - tplSkeleton.add(scripts.get(i)); + if (nextScript != null) { + tplSkeleton.add(nextScript); } i++; } diff --git a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java index 280284d..12103db 100644 --- a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java +++ b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java @@ -633,4 +633,16 @@ public void testProcessScriptedTemplate_newLine() throws Exception { assertTrue(result.contains("this is A")); assertTrue(StringUtils.countMatches(result, "this is A") == 4); } + + @Test + public void testProcessScriptedTemplate_spacePreserveAfterScript() throws Exception { + String template = TestUtils.readResource("/docx/DocxTemplaterTest-21.xml"); + DocxTemplater templater = new DocxTemplater(none); + template = templater.cleanupTemplate(template); + String result = templater.processCleanedTemplate(template, params); + + assertTrue(result != null); + assertTrue(result.contains("First ")); + assertTrue(result.contains("Second")); + } } diff --git a/src/test/resources/docx/DocxTemplaterTest-21.xml b/src/test/resources/docx/DocxTemplaterTest-21.xml new file mode 100644 index 0000000..44dcea5 --- /dev/null +++ b/src/test/resources/docx/DocxTemplaterTest-21.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + <%out.print(' + + + + + + + First + + + + + + + '); %> + + + + + + <%out.print + + + + + + + (' + + + + + + + Second + + + + + + '); %> + + + + + + + + + + \ No newline at end of file From d6ef9ee6710ce9c0d9f2c4d7c2cd89f0aae4dae9 Mon Sep 17 00:00:00 2001 From: pmoehl Date: Thu, 7 Mar 2019 15:29:57 +0100 Subject: [PATCH 2/5] always preserve spaces of scripts --- .../scriptlet4docx/docx/DocxTemplater.java | 5 ++--- .../docx/DocxTemplaterTest.java | 4 ++-- .../resources/docx/DocxTemplaterTest-21.xml | 20 ++++++++++++++++--- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java index 3d67778..0269f54 100644 --- a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java +++ b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java @@ -112,7 +112,6 @@ protected TemplateContent processCleanedTemplate(TemplateContent content, Map"; - private static String SPACE_PRESERVE = "xml:space=\"preserve\""; protected static Map processParams(Map params) { Map res = new HashMap(); @@ -170,8 +169,8 @@ protected String processCleanedTemplate(String template, Map par int i = 0; for (String piece : pieces) { Placeholder nextScript = i < scripts.size() ? scripts.get(i) : null; - if (piece.endsWith(WT_NO_PRESERVE) && nextScript != null && nextScript.text.contains(SPACE_PRESERVE)) { - // Preserve spaces if one of the elements inside the following script block preserves them + if (nextScript != null && piece.endsWith(WT_NO_PRESERVE)) { + // Always preserve spaces of scripts and between scripts piece = piece.substring(0, piece.length() - WT_NO_PRESERVE.length()) + WT_SPACE_PRESERVE; } diff --git a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java index 12103db..8859d93 100644 --- a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java +++ b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java @@ -642,7 +642,7 @@ public void testProcessScriptedTemplate_spacePreserveAfterScript() throws Except String result = templater.processCleanedTemplate(template, params); assertTrue(result != null); - assertTrue(result.contains("First ")); - assertTrue(result.contains("Second")); + assertTrue(result.contains("one two ")); + assertTrue(result.contains("three")); } } diff --git a/src/test/resources/docx/DocxTemplaterTest-21.xml b/src/test/resources/docx/DocxTemplaterTest-21.xml index 44dcea5..7382c4d 100644 --- a/src/test/resources/docx/DocxTemplaterTest-21.xml +++ b/src/test/resources/docx/DocxTemplaterTest-21.xml @@ -18,7 +18,21 @@ - First + one + + + + + + + '); %> <%out.print(' + + + + + + + two @@ -45,13 +59,13 @@ - Second + three - '); %> + '); %> From 7dcb3d746db604468c69ddeeb5b4f744a11f6adb Mon Sep 17 00:00:00 2001 From: pmoehl Date: Thu, 7 Mar 2019 15:46:44 +0100 Subject: [PATCH 3/5] code cleanup --- src/main/java/org/scriptlet4docx/docx/DocxTemplater.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java index 0269f54..bc2ec4d 100644 --- a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java +++ b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java @@ -168,16 +168,15 @@ protected String processCleanedTemplate(String template, Map par int i = 0; for (String piece : pieces) { - Placeholder nextScript = i < scripts.size() ? scripts.get(i) : null; - if (nextScript != null && piece.endsWith(WT_NO_PRESERVE)) { - // Always preserve spaces of scripts and between scripts + if (i < scripts.size() && piece.endsWith(WT_NO_PRESERVE)) { + // Always preserve spaces of the following scripts piece = piece.substring(0, piece.length() - WT_NO_PRESERVE.length()) + WT_SPACE_PRESERVE; } tplSkeleton.add(new Placeholder(UUID.randomUUID().toString(), piece, PlaceholderType.TEXT)); - if (nextScript != null) { - tplSkeleton.add(nextScript); + if (i < scripts.size()) { + tplSkeleton.add(scripts.get(i)); } i++; } From 35a9236539e516e5b2f43e423be38043d417732b Mon Sep 17 00:00:00 2001 From: pmoehl Date: Thu, 7 Mar 2019 15:49:31 +0100 Subject: [PATCH 4/5] test code cleanup --- src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java index 8859d93..22eeb1b 100644 --- a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java +++ b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java @@ -635,7 +635,7 @@ public void testProcessScriptedTemplate_newLine() throws Exception { } @Test - public void testProcessScriptedTemplate_spacePreserveAfterScript() throws Exception { + public void testProcessScriptedTemplate_spacePreserveScript() throws Exception { String template = TestUtils.readResource("/docx/DocxTemplaterTest-21.xml"); DocxTemplater templater = new DocxTemplater(none); template = templater.cleanupTemplate(template); From 9dafbb2ff3d88b1fc477886f0547b8b0ca220056 Mon Sep 17 00:00:00 2001 From: pmoehl Date: Fri, 8 Mar 2019 17:14:48 +0100 Subject: [PATCH 5/5] opt-in space preserve --- .../java/org/scriptlet4docx/docx/DocxTemplater.java | 13 ++++++++++++- .../org/scriptlet4docx/docx/DocxTemplaterTest.java | 13 +++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java index bc2ec4d..b1036dd 100644 --- a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java +++ b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java @@ -36,6 +36,7 @@ public class DocxTemplater { private InputStream templateStream; private String streamTemplateKey; private TemplateEngine templateEngine; + private boolean spacePreserve; /** * Set default Template Engine @@ -168,7 +169,7 @@ protected String processCleanedTemplate(String template, Map par int i = 0; for (String piece : pieces) { - if (i < scripts.size() && piece.endsWith(WT_NO_PRESERVE)) { + if (spacePreserve && i < scripts.size() && piece.endsWith(WT_NO_PRESERVE)) { // Always preserve spaces of the following scripts piece = piece.substring(0, piece.length() - WT_NO_PRESERVE.length()) + WT_SPACE_PRESERVE; } @@ -405,4 +406,14 @@ public void setTemplateEngine(TemplateEngine templateEngine) { this.templateEngine = templateEngine; } + /** + * When spaces around scripts should be preserved. + * Defaults to false + * + * @param spacePreserve Preserve spaces around scripts? + */ + public void setSpacePreserve(boolean spacePreserve) { + this.spacePreserve = spacePreserve; + } + } diff --git a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java index 22eeb1b..999611a 100644 --- a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java +++ b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java @@ -638,6 +638,7 @@ public void testProcessScriptedTemplate_newLine() throws Exception { public void testProcessScriptedTemplate_spacePreserveScript() throws Exception { String template = TestUtils.readResource("/docx/DocxTemplaterTest-21.xml"); DocxTemplater templater = new DocxTemplater(none); + templater.setSpacePreserve(true); template = templater.cleanupTemplate(template); String result = templater.processCleanedTemplate(template, params); @@ -645,4 +646,16 @@ public void testProcessScriptedTemplate_spacePreserveScript() throws Exception { assertTrue(result.contains("one two ")); assertTrue(result.contains("three")); } + + @Test + public void testProcessScriptedTemplate_noSpacePreserveScript() throws Exception { + String template = TestUtils.readResource("/docx/DocxTemplaterTest-21.xml"); + DocxTemplater templater = new DocxTemplater(none); + template = templater.cleanupTemplate(template); + String result = templater.processCleanedTemplate(template, params); + + assertTrue(result != null); + assertTrue(result.contains("one two ")); + assertTrue(result.contains("three")); + } }