diff --git a/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java b/src/main/java/org/scriptlet4docx/docx/DocxTemplater.java index 5fc91b0..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 @@ -110,6 +111,8 @@ protected TemplateContent processCleanedTemplate(TemplateContent content, Map"; protected static Map processParams(Map params) { Map res = new HashMap(); @@ -166,6 +169,11 @@ protected String processCleanedTemplate(String template, Map par int i = 0; for (String piece : pieces) { + 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; + } + tplSkeleton.add(new Placeholder(UUID.randomUUID().toString(), piece, PlaceholderType.TEXT)); if (i < scripts.size()) { @@ -398,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 280284d..999611a 100644 --- a/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java +++ b/src/test/java/org/scriptlet4docx/docx/DocxTemplaterTest.java @@ -633,4 +633,29 @@ public void testProcessScriptedTemplate_newLine() throws Exception { assertTrue(result.contains("this is A")); assertTrue(StringUtils.countMatches(result, "this is A") == 4); } + + @Test + 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); + + assertTrue(result != null); + 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")); + } } diff --git a/src/test/resources/docx/DocxTemplaterTest-21.xml b/src/test/resources/docx/DocxTemplaterTest-21.xml new file mode 100644 index 0000000..7382c4d --- /dev/null +++ b/src/test/resources/docx/DocxTemplaterTest-21.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + <%out.print(' + + + + + + + one + + + + + + + '); %> <%out.print(' + + + + + + + two + + + + + + + '); %> + + + + + + <%out.print + + + + + + + (' + + + + + + + three + + + + + + '); %> + + + + + + + + + + \ No newline at end of file