From 8489491ba4210ca209b02c4f749066be33749bca Mon Sep 17 00:00:00 2001 From: philipr Date: Tue, 25 Jan 2022 13:04:35 +1100 Subject: [PATCH 1/3] Updated for release --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 0fd84a1..a32577c 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.8.26 \ No newline at end of file +0.8.27-SNAPSHOT \ No newline at end of file From 0c22758548ce3fb1c6136d8dcd40b9c839762240 Mon Sep 17 00:00:00 2001 From: philipr Date: Mon, 14 Mar 2022 13:11:11 +1100 Subject: [PATCH 2/3] Added support for elements/@fragmentlabel in export config --- .../fragmentlabel-qualification/document.xml | 1 + .../fragmentlabel-qualification.psml | 229 + .../word-export-config.xml | 55 + .../word-export-template.docx | Bin 0 -> 33276 bytes .../pageseeder/docx/ant/ExportTaskTest.java | 1377 ++--- .../docx/schema/word-export-config.xsd | 3 +- .../docx/xslt/export/apply-styles.xsl | 28 + .../pageseeder/docx/xslt/export/config.xsl | 4766 +++++++++-------- .../pageseeder/docx/xslt/export/variables.xsl | 7 + 9 files changed, 3503 insertions(+), 2963 deletions(-) create mode 100644 pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/document.xml create mode 100644 pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/fragmentlabel-qualification.psml create mode 100644 pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/word-export-config.xml create mode 100644 pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/word-export-template.docx diff --git a/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/document.xml b/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/document.xml new file mode 100644 index 0000000..9a9f09d --- /dev/null +++ b/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/document.xml @@ -0,0 +1 @@ +XRef-footnotesFootnotes-contentA headingA paraBlock 1 paraList item 1 List item 1AList item 1Numbered item 1 Numbered item 1ANumbered item 1A headingA paraTranscluded paraBlock 3 paraList item 1 List item 1AList item 1Numbered item 1 Numbered item 1ANumbered item 1Footnotes-content2A headingA paraBlock 1 paraList item 1 List item 1AList item 1Numbered item 1 Numbered item 1ANumbered item 1A headingA paraTranscluded paraBlock 3 paraList item 1 List item 1AList item 1Numbered item 1 Numbered item 1ANumbered item 1 \ No newline at end of file diff --git a/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/fragmentlabel-qualification.psml b/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/fragmentlabel-qualification.psml new file mode 100644 index 0000000..b6f835c --- /dev/null +++ b/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/fragmentlabel-qualification.psml @@ -0,0 +1,229 @@ + + + + + XRef-footnotes + + + + + + +
+ + XRef-footnotes + +
+ +
+ + + + + + Footnotes-content + + + + + + + + + +
+ + Footnotes-content + +
+
+ + A heading + A para + + + Block 1 para + + + + List item 1 + + List item 1A + + + List item 1 + + + Numbered item 1 + + Numbered item 1A + + + Numbered item 1 + + + + + + A heading + A para + Transcluded para + + + + Block 3 para + + + + + List item 1 + + List item 1A + + + List item 1 + + + Numbered item 1 + + Numbered item 1A + + + Numbered item 1 + + + + +
+
+
+ + + + + Footnotes-content2 + test,appendix + + + + + + + + + +
+ + Footnotes-content2 + +
+
+ + A heading + A para + + + Block 1 para + + + + List item 1 + + List item 1A + + + List item 1 + + + Numbered item 1 + + Numbered item 1A + + + Numbered item 1 + + + + + + A heading + A para + Transcluded para + + + + Block 3 para + + + + + List item 1 + + List item 1A + + + List item 1 + + + Numbered item 1 + + Numbered item 1A + + + Numbered item 1 + + + + +
+
+
+
+
+
\ No newline at end of file diff --git a/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/word-export-config.xml b/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/word-export-config.xml new file mode 100644 index 0000000..c5dec88 --- /dev/null +++ b/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/word-export-config.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/word-export-template.docx b/pso-docx-ant/src/test/export/cases/fragmentlabel-qualification/word-export-template.docx new file mode 100644 index 0000000000000000000000000000000000000000..85dd5f0976f2d36d31838291c01b866553992e97 GIT binary patch literal 33276 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 z%0D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 literal 0 HcmV?d00001 diff --git a/pso-docx-ant/src/test/java/org/pageseeder/docx/ant/ExportTaskTest.java b/pso-docx-ant/src/test/java/org/pageseeder/docx/ant/ExportTaskTest.java index a449e09..408b6c1 100644 --- a/pso-docx-ant/src/test/java/org/pageseeder/docx/ant/ExportTaskTest.java +++ b/pso-docx-ant/src/test/java/org/pageseeder/docx/ant/ExportTaskTest.java @@ -1,686 +1,691 @@ -package org.pageseeder.docx.ant; - -import org.junit.Assert; -import org.junit.Test; -import org.pageseeder.docx.util.Files; -import org.xml.sax.SAXException; -import org.xmlunit.matchers.CompareMatcher; - -import java.io.File; -import java.io.IOException; - -/** - * Test cases for export task - */ -public final class ExportTaskTest { - - private static final File CASES = new File("src/test/export/cases"); - - private static final File RESULTS = new File("test/export/results"); - - @Test - public void testBlockDefaultNone() throws IOException, SAXException { - testIndividual("block-default-none"); - } - - @Test - public void testBlockDefaultNoneWithBlockGeneration() throws IOException, SAXException { - testIndividual("block-default-none-with-block-generation"); - } - - @Test - public void testBlockDefaultNoneWithBlockGenerationIgnore() throws IOException, SAXException { - testIndividual("block-default-none-with-block-generation-ignore"); - } - - @Test - public void testBlockDefaultNoneWithBlockPSStyle() throws IOException, SAXException { - testIndividual("block-default-none-with-block-psstyle"); - } - - @Test - public void testBlockDefaultPSStyle() throws IOException, SAXException { - testIndividual("block-default-psstyle"); - } - - @Test - public void testBlockDefaultPSStyleWithBlockGeneration() throws IOException, SAXException { - testIndividual("block-default-psstyle-with-block-generation"); - } - - @Test - public void testBlockDefaultPSStyleWithBlockGenerationIgnore() throws IOException, SAXException { - testIndividual("block-default-psstyle-with-block-generation-ignore"); - } - - @Test - public void testBlockDefaultStyle() throws IOException, SAXException { - testIndividual("block-default-style"); - } - - @Test - public void testBlockDefaultStyleWithBlockGeneration() throws IOException, SAXException { - testIndividual("block-default-style-with-block-generation"); - } - - @Test - public void testBlockDefaultStyleWithBlockGenerationIgnore() throws IOException, SAXException { - testIndividual("block-default-style-with-block-generation-ignore"); - } - - @Test - public void testBlockDefaultStyleWithBlockPSStyle() throws IOException, SAXException { - testIndividual("block-default-style-with-block-psstyle"); - } - - @Test - public void testBlockWhitespace() throws IOException, SAXException { - testIndividual("block-whitespace"); - } - - @Test - public void testBlocklabelQualification() throws IOException, SAXException { - testIndividual("blocklabel-qualification"); - } - - @Test - public void testCommentsFalse() throws IOException, SAXException { - testIndividual("comments-false"); - } - - @Test - public void testCommentsTrue() throws IOException, SAXException { - testIndividual("comments-true"); - } - - @Test - public void testCoreProperties() throws IOException, SAXException { - testIndividual("core-properties", "document,core,custom"); - } - - @Test - public void testCorePropertiesPartial() throws IOException, SAXException { - testIndividual("core-properties-partial", "document,core"); - } - - @Test - public void testCorePropertiesTokens() throws IOException, SAXException { - testIndividual("core-properties-tokens", "document,core"); - } - - @Test - public void testCustomTemplateHeadings() throws IOException, SAXException { - testIndividual("custom-template-headings"); - } - - @Test - public void testCustomTemplateLists() throws IOException, SAXException { - testIndividual("custom-template-lists", "document,numbering"); - } - - @Test - public void testCustomTemplateListsWithRole() throws IOException, SAXException { - testIndividual("custom-template-lists-with-role", "document,numbering"); - } - - @Test - public void testCustomTemplateTables() throws IOException, SAXException { - testIndividual("custom-template-tables"); - } - - @Test - public void testDefaultcharacterstyleNone() throws IOException, SAXException { - testIndividual("defaultcharacterstyle-none"); - } - - @Test - public void testDefaultcharacterstyleSet() throws IOException, SAXException { - testIndividual("defaultcharacterstyle-set"); - } - - @Test - public void testDefaultparagraphstyleNone() throws IOException, SAXException { - testIndividual("defaultparagraphstyle-none"); - } - - @Test - public void testDefaultparagraphstyleSet() throws IOException, SAXException { - testIndividual("defaultparagraphstyle-set"); - } - - @Test - public void testEmptyConfigurationBasicDocument() throws IOException, SAXException { - testIndividual("empty-configuration-basic-document"); - } - - @Test - public void testEmptyConfigurationBlock() throws IOException, SAXException { - testIndividual("empty-configuration-block"); - } - - @Test - public void testEmptyConfigurationCharacterStyles() throws IOException, SAXException { - testIndividual("empty-configuration-character-styles"); - } - - @Test - public void testEmptyConfigurationListsStartSet() throws IOException, SAXException { - testIndividual("empty-configuration-lists-start-set", "document,numbering"); - } - - @Test - public void testEmptyConfigurationHeadings() throws IOException, SAXException { - testIndividual("empty-configuration-headings"); - } - - @Test - public void testEmptyConfigurationImages() throws IOException, SAXException { - testIndividual("empty-configuration-images", - "document,document.xml.rels,footer3.xml.rels,header3.xml.rels"); - } - - @Test - public void testEmptyConfigurationInline() throws IOException, SAXException { - testIndividual("empty-configuration-inline"); - } - - @Test - public void testEmptyConfigurationLinks() throws IOException, SAXException { - testIndividual("empty-configuration-links"); - } - - @Test - public void testEmptyConfigurationLists() throws IOException, SAXException { - testIndividual("empty-configuration-lists", "document,numbering"); - } - - @Test - public void testEmptyConfigurationNumberedHeadings() throws IOException, SAXException { - testIndividual("empty-configuration-numbered-headings"); - } - - @Test - public void testParagraphIndentStylesSet() throws IOException, SAXException { - testIndividual("paragraph-indent-style-set"); - } - - @Test - public void testEmptyConfigurationSections() throws IOException, SAXException { - testIndividual("empty-configuration-sections"); - } - - @Test - public void testEmptyConfigurationTables() throws IOException, SAXException { - testIndividual("empty-configuration-tables"); - } - - @Test - public void testHeadingsBlockParaKeephWithNext() throws IOException, SAXException { - testIndividual("headings-block-para-keep-with-next"); - } - - @Test - public void testHeadingsStyleSet() throws IOException, SAXException { - testIndividual("headings-style-set"); - } - - @Test - public void testImagesStyleSet() throws IOException, SAXException { - testIndividual("images-style-set"); - } - - @Test - public void testInlineDefaultNone() throws IOException, SAXException { - testIndividual("inline-default-none"); - } - - @Test - public void testInlineDefaultNoneWithFieldcode() throws IOException, SAXException { - testIndividual("inline-default-none-with-fieldcode"); - } - - @Test - public void testInlineDefaultNoneWithInlineGeneration() throws IOException, SAXException { - testIndividual("inline-default-none-with-inline-generation"); - } - - @Test - public void testInlineDefaultNoneWithInlineGenerationIgnore() throws IOException, SAXException { - testIndividual("inline-default-none-with-inline-generation-ignore"); - } - - @Test - public void testInlineDefaultNoneWithInlineGenerationTab() throws IOException, SAXException { - testIndividual("inline-default-none-with-inline-generation-tab"); - } - - @Test - public void testInlineDefaultNoneWithInlinePSStyle() throws IOException, SAXException { - testIndividual("inline-default-none-with-inline-psstyle"); - } - - @Test - public void testInlineDefaultPSStyle() throws IOException, SAXException { - testIndividual("inline-default-psstyle"); - } - - @Test - public void testInlineDefaultPSStyleWithFieldcode() throws IOException, SAXException { - testIndividual("inline-default-psstyle-with-fieldcode"); - } - - @Test - public void testInlineDefaultPSStyleWithInlineGeneration() throws IOException, SAXException { - testIndividual("inline-default-psstyle-with-inline-generation"); - } - - @Test - public void testInlineDefaultPSStyleWithInlineGenerationIgnore() throws IOException, SAXException { - testIndividual("inline-default-psstyle-with-inline-generation-ignore"); - } - - @Test - public void testInlineDefaultPSStyleWithInlineGenerationTab() throws IOException, SAXException { - testIndividual("inline-default-psstyle-with-inline-generation-tab"); - } - - @Test - public void testInlineDefaultStyle() throws IOException, SAXException { - testIndividual("inline-default-style"); - } - - @Test - public void testInlineDefaultStyleWithFieldcode() throws IOException, SAXException { - testIndividual("inline-default-style-with-fieldcode"); - } - - @Test - public void testInlineDefaultStyleWithInlineGeneration() throws IOException, SAXException { - testIndividual("inline-default-style-with-inline-generation"); - } - - @Test - public void testInlineDefaultStyleWithInlineGenerationIgnore() throws IOException, SAXException { - testIndividual("inline-default-style-with-inline-generation-ignore"); - } - - @Test - public void testInlineDefaultStyleWithInlineGenerationTab() throws IOException, SAXException { - testIndividual("inline-default-style-with-inline-generation-tab"); - } - - @Test - public void testInlineDefaultStyleWithInlinePSStyle() throws IOException, SAXException { - testIndividual("inline-default-style-with-inline-psstyle"); - } - - @Test - public void testInlineIndexLabel() throws IOException, SAXException { - testIndividual("inline-index-label"); - } - - @Test - public void testLargePSML() throws IOException, SAXException { - long start = System.currentTimeMillis(); - testIndividual("large-psml", "document"); - long end = System.currentTimeMillis(); - long time = end - start; - System.out.println("Large PSML time (ms): " + time); - Assert.assertTrue(40000 > time); // 40 seconds - } - - @Test - public void testListDefaultWithMultipleParas() throws IOException, SAXException { - testIndividual("list-default-with-multiple-paras", "document,numbering"); - } - - @Test - public void testListDefaultWithRoleSet() throws IOException, SAXException { - testIndividual("list-default-with-role-set", "document,numbering"); - } - - @Test - public void testListDefaultWithTypeSet() throws IOException, SAXException { - testIndividual("list-default-with-type-set", "document,numbering"); - } - - @Test - public void testListItemWhitespace() throws IOException, SAXException { - testIndividual("list-item-whitespace"); - } - - @Test - public void testMathML() throws IOException, SAXException { - testIndividual("mathml"); - } - - @Test - public void testPlaceholder() throws IOException, SAXException { - testIndividual("placeholder"); - } - - @Test - public void testPlaceholderStyle() throws IOException, SAXException { - testIndividual("placeholder-style"); - } - - @Test - public void testPreformatSet() throws IOException, SAXException { - testIndividual("preformat-set"); - } - - @Test - public void testPropertiesFragment() throws IOException, SAXException { - testIndividual("properties-fragment"); - } - - @Test - public void testSectionSet() throws IOException, SAXException { - testIndividual("section-set"); - } - - @Test - public void testTableCellWhitespace() throws IOException, SAXException { - testIndividual("table-cell-whitespace"); - } - - @Test - public void testTablesColRowHcellCellRole() throws IOException, SAXException { - testIndividual("tables-col-row-hcell-cell-role"); - } - - @Test - public void testTablesDefaultEmpty() throws IOException, SAXException { - testIndividual("tables-default-empty"); - } - - @Test - public void testTablesDefaultEmptyWithRole() throws IOException, SAXException { - testIndividual("tables-default-empty-with-role"); - } - - @Test - public void testTablesDefaultEmptyWithRoleMultiple() throws IOException, SAXException { - testIndividual("tables-default-empty-with-role-multiple"); - } - - @Test - public void testTablesDefaultSet() throws IOException, SAXException { - testIndividual("tables-default-set"); - } - - @Test - public void testTablesDefaultSetWithRole() throws IOException, SAXException { - testIndividual("tables-default-set-with-role"); - } - - @Test - public void testTablesDefaultSetWithRoleMultiple() throws IOException, SAXException { - testIndividual("tables-default-set-with-role-multiple"); - } - - @Test - public void testTablesDefaultWithWidthAuto() throws IOException, SAXException { - testIndividual("tables-default-with-width-auto"); - } - - @Test - public void testTablesDefaultWithWidthDxa() throws IOException, SAXException { - testIndividual("tables-default-with-width-dxa"); - } - - @Test - public void testTablesDefaultWithWidthPct() throws IOException, SAXException { - testIndividual("tables-default-with-width-pct"); - } - - @Test - public void testTablesRoleWithWidthAuto() throws IOException, SAXException { - testIndividual("tables-role-with-width-auto"); - } - - @Test - public void testTablesRoleWithWidthDxa() throws IOException, SAXException { - testIndividual("tables-role-with-width-dxa"); - } - - @Test - public void testTablesRoleWithWidthPct() throws IOException, SAXException { - testIndividual("tables-role-with-width-pct"); - } - - //@Test - //public void testTemplateLists() throws IOException, SAXException { - // testIndividual("template-lists", "document,numbering"); - //} - - @Test - public void testTocFalse() throws IOException, SAXException { - testIndividual("toc-false"); - } - - @Test - public void testTocTrue() throws IOException, SAXException { - testIndividual("toc-true"); - } - - @Test - public void testTocTrueHeadingFalse() throws IOException, SAXException { - testIndividual("toc-true-heading-false"); - } - - @Test - public void testTocTrueHeadingParagraphOutline() throws IOException, SAXException { - testIndividual("toc-true-heading-paragraph-outline"); - } - - @Test - public void testTocTrueHeadingTrue() throws IOException, SAXException { - testIndividual("toc-true-heading-true"); - } - - @Test - public void testTocTrueHeadingTrueMultiple() throws IOException, SAXException { - testIndividual("toc-true-heading-true-multiple"); - } - - @Test - public void testTocTrueOutlineFalse() throws IOException, SAXException { - testIndividual("toc-true-outline-false"); - } - - @Test - public void testTocTrueOutlineTrue() throws IOException, SAXException { - testIndividual("toc-true-outline-true"); - } - - @Test - public void testTocTrueOutlineTrueMultiple() throws IOException, SAXException { - testIndividual("toc-true-outline-true-multiple"); - } - - @Test - public void testTocTrueParagraphFalse() throws IOException, SAXException { - testIndividual("toc-true-paragraph-false"); - } - - @Test - public void testTocTrueParagraphTrue() throws IOException, SAXException { - testIndividual("toc-true-paragraph-true"); - } - - @Test - public void testTocTrueParagraphTrueMultiple() throws IOException, SAXException { - testIndividual("toc-true-paragraph-true-multiple"); - } - - @Test - public void testXrefCitations() throws IOException, SAXException { - // NOTE: To open docx result file first replace customXml/item1.xml with transformed-item1.xml. - testIndividual("xref-citations", "document,item1"); - } - - @Test - public void testXrefCitationsStyleSet() throws IOException, SAXException { - // NOTE: To open docx result file first replace customXml/item1.xml with transformed-item1.xml. - testIndividual("xref-citations-style-set", "document,item1"); - } - - @Test - public void testXrefEndnotes() throws IOException, SAXException { - testIndividual("xref-endnotes", "document,endnotes"); - } - - @Test - public void testXrefEndnotesStyleSet() throws IOException, SAXException { - testIndividual("xref-endnotes-style-set", "document,endnotes"); - } - - @Test - public void testXrefFootnotes() throws IOException, SAXException { - testIndividual("xref-footnotes", "document,footnotes"); - } - - @Test - public void testXrefFootnotesStyleSet() throws IOException, SAXException { - testIndividual("xref-footnotes-style-set", "document,footnotes"); - } - - @Test - public void testXrefStyle() throws IOException, SAXException { - testIndividual("xref-style", "document,endnotes,footnotes"); - } - - @Test - public void testXrefTypeCrossReference() throws IOException, SAXException { - testIndividual("xref-type-cross-reference"); - } - - public void testAll() throws IOException, SAXException { - File[] tests = CASES.listFiles(); - for (File test : tests) { - testIndividual(test, "document", false); - } - } - - public void testIndividual(String folderName) throws IOException, SAXException { - testIndividual(new File(CASES, folderName), "document", false); - } - - public void testIndividual(String folderName, boolean saveWorking) throws IOException, SAXException { - testIndividual(new File(CASES, folderName), "document", saveWorking); - } - - public void testIndividual(String folderName, String filenames) throws IOException, SAXException { - testIndividual(new File(CASES, folderName), filenames, true); - } - - public void testIndividual(File dir, String filenames, boolean saveWorking) throws IOException, SAXException { - if (dir.isDirectory()) { - - if (new File(dir, dir.getName() + ".psml").exists()) { - System.out.println(dir.getName()); - File result = new File(RESULTS, dir.getName()); - result.mkdirs(); - process(dir, result, saveWorking); - String[] names = filenames.split(","); - for (String name : names) { - File actual = new File(result, - ("document".equals(name) ? "" : - ("core".equals(name) || "custom".equals(name)) ? "working/prepacked/docProps/" : - "item1".equals(name) ? "working/prepacked/customXml/" : - "working/prepacked/word/") + name + ".xml"); - if (name.endsWith(".rels")) { - actual = new File(result, "working/prepacked/word/_rels/" + name); - } - File expected = new File(dir, name + ".xml"); - - // Check that the files exist - Assert.assertTrue(actual.exists()); - Assert.assertTrue(expected.exists()); - - Assert.assertTrue(actual.length() > 0); - Assert.assertTrue(expected.length() > 0); - assertXMLEqual(expected, actual, result); - } - } else { - System.out.println("Unable to find PSML file for test:" + dir.getName()); - } - } - } - - - private void process(File test, File result, boolean saveWorking) { - - ExportTask task = new ExportTask(); - - // validate test PSML - File psml = new File(test, test.getName() + ".psml"); - Assert.assertThat(psml, XML.validates("psml-processed.xsd")); - task.setSrc(psml); - - // validate config file - File export_config = new File(test, "word-export-config.xml"); - Assert.assertThat(export_config, XML.validates("word-export-config.xsd")); - task.setConfig(export_config); - - File template = new File(test, "word-export-template.dotx"); - if (!template.exists()) { - template = new File(test, "word-export-template.docx"); - } - task.setWordTemplate(template); - task.setDest(new File(result, test.getName() + ".docx")); - if (saveWorking) { - File working = new File(result, "working"); - if (working.exists()) deleteDir(working); - task.setWorking(working); - } - File media = new File(test, "media"); - if (media.exists()) { - task.setMedia(media); - } - - Parameter parameter = task.createParam(); - parameter.setName("generate-processed-psml"); - parameter.setValue("true"); - - Parameter parameter2 = task.createParam(); - parameter2.setName("current-user"); - parameter2.setValue("Jane Smith"); - - Parameter parameter3 = task.createParam(); - parameter3.setName("manual-core"); - parameter3.setValue("Config"); - - task.execute(); - - return; - } - - private static void deleteDir(File file) { - File[] contents = file.listFiles(); - if (contents != null) { - for (File f : contents) { - deleteDir(f); - } - } - file.delete(); - } - - private static void assertXMLEqual(File expected, File actual, File result) throws IOException, SAXException { - try { - Assert.assertThat(actual, CompareMatcher.isIdenticalTo(expected)); - } catch (AssertionError error) { - File expfile = new File(result, "expected-" + actual.getName()); - File actfile = new File(result, "actual-" + actual.getName()); - System.err.println("Expected: " + expfile.getCanonicalPath()); - System.err.println("Actual: " + actfile.getCanonicalPath()); - Files.copy(expected, expfile); - Files.copy(actual, actfile); - // uncomment the following to bulk update expected files for changes effecting all documents - //Files.copy(actual, expected); - throw error; - } - } - -} +package org.pageseeder.docx.ant; + +import org.junit.Assert; +import org.junit.Test; +import org.pageseeder.docx.util.Files; +import org.xml.sax.SAXException; +import org.xmlunit.matchers.CompareMatcher; + +import java.io.File; +import java.io.IOException; + +/** + * Test cases for export task + */ +public final class ExportTaskTest { + + private static final File CASES = new File("src/test/export/cases"); + + private static final File RESULTS = new File("test/export/results"); + + @Test + public void testBlockDefaultNone() throws IOException, SAXException { + testIndividual("block-default-none"); + } + + @Test + public void testBlockDefaultNoneWithBlockGeneration() throws IOException, SAXException { + testIndividual("block-default-none-with-block-generation"); + } + + @Test + public void testBlockDefaultNoneWithBlockGenerationIgnore() throws IOException, SAXException { + testIndividual("block-default-none-with-block-generation-ignore"); + } + + @Test + public void testBlockDefaultNoneWithBlockPSStyle() throws IOException, SAXException { + testIndividual("block-default-none-with-block-psstyle"); + } + + @Test + public void testBlockDefaultPSStyle() throws IOException, SAXException { + testIndividual("block-default-psstyle"); + } + + @Test + public void testBlockDefaultPSStyleWithBlockGeneration() throws IOException, SAXException { + testIndividual("block-default-psstyle-with-block-generation"); + } + + @Test + public void testBlockDefaultPSStyleWithBlockGenerationIgnore() throws IOException, SAXException { + testIndividual("block-default-psstyle-with-block-generation-ignore"); + } + + @Test + public void testBlockDefaultStyle() throws IOException, SAXException { + testIndividual("block-default-style"); + } + + @Test + public void testBlockDefaultStyleWithBlockGeneration() throws IOException, SAXException { + testIndividual("block-default-style-with-block-generation"); + } + + @Test + public void testBlockDefaultStyleWithBlockGenerationIgnore() throws IOException, SAXException { + testIndividual("block-default-style-with-block-generation-ignore"); + } + + @Test + public void testBlockDefaultStyleWithBlockPSStyle() throws IOException, SAXException { + testIndividual("block-default-style-with-block-psstyle"); + } + + @Test + public void testBlockWhitespace() throws IOException, SAXException { + testIndividual("block-whitespace"); + } + + @Test + public void testBlocklabelQualification() throws IOException, SAXException { + testIndividual("blocklabel-qualification"); + } + + @Test + public void testCommentsFalse() throws IOException, SAXException { + testIndividual("comments-false"); + } + + @Test + public void testCommentsTrue() throws IOException, SAXException { + testIndividual("comments-true"); + } + + @Test + public void testCoreProperties() throws IOException, SAXException { + testIndividual("core-properties", "document,core,custom"); + } + + @Test + public void testCorePropertiesPartial() throws IOException, SAXException { + testIndividual("core-properties-partial", "document,core"); + } + + @Test + public void testCorePropertiesTokens() throws IOException, SAXException { + testIndividual("core-properties-tokens", "document,core"); + } + + @Test + public void testCustomTemplateHeadings() throws IOException, SAXException { + testIndividual("custom-template-headings"); + } + + @Test + public void testCustomTemplateLists() throws IOException, SAXException { + testIndividual("custom-template-lists", "document,numbering"); + } + + @Test + public void testCustomTemplateListsWithRole() throws IOException, SAXException { + testIndividual("custom-template-lists-with-role", "document,numbering"); + } + + @Test + public void testCustomTemplateTables() throws IOException, SAXException { + testIndividual("custom-template-tables"); + } + + @Test + public void testDefaultcharacterstyleNone() throws IOException, SAXException { + testIndividual("defaultcharacterstyle-none"); + } + + @Test + public void testDefaultcharacterstyleSet() throws IOException, SAXException { + testIndividual("defaultcharacterstyle-set"); + } + + @Test + public void testDefaultparagraphstyleNone() throws IOException, SAXException { + testIndividual("defaultparagraphstyle-none"); + } + + @Test + public void testDefaultparagraphstyleSet() throws IOException, SAXException { + testIndividual("defaultparagraphstyle-set"); + } + + @Test + public void testEmptyConfigurationBasicDocument() throws IOException, SAXException { + testIndividual("empty-configuration-basic-document"); + } + + @Test + public void testEmptyConfigurationBlock() throws IOException, SAXException { + testIndividual("empty-configuration-block"); + } + + @Test + public void testEmptyConfigurationCharacterStyles() throws IOException, SAXException { + testIndividual("empty-configuration-character-styles"); + } + + @Test + public void testEmptyConfigurationListsStartSet() throws IOException, SAXException { + testIndividual("empty-configuration-lists-start-set", "document,numbering"); + } + + @Test + public void testEmptyConfigurationHeadings() throws IOException, SAXException { + testIndividual("empty-configuration-headings"); + } + + @Test + public void testEmptyConfigurationImages() throws IOException, SAXException { + testIndividual("empty-configuration-images", + "document,document.xml.rels,footer3.xml.rels,header3.xml.rels"); + } + + @Test + public void testEmptyConfigurationInline() throws IOException, SAXException { + testIndividual("empty-configuration-inline"); + } + + @Test + public void testEmptyConfigurationLinks() throws IOException, SAXException { + testIndividual("empty-configuration-links"); + } + + @Test + public void testEmptyConfigurationLists() throws IOException, SAXException { + testIndividual("empty-configuration-lists", "document,numbering"); + } + + @Test + public void testEmptyConfigurationNumberedHeadings() throws IOException, SAXException { + testIndividual("empty-configuration-numbered-headings"); + } + + @Test + public void testFragmentlabelQualification() throws IOException, SAXException { + testIndividual("fragmentlabel-qualification"); + } + + @Test + public void testParagraphIndentStylesSet() throws IOException, SAXException { + testIndividual("paragraph-indent-style-set"); + } + + @Test + public void testEmptyConfigurationSections() throws IOException, SAXException { + testIndividual("empty-configuration-sections"); + } + + @Test + public void testEmptyConfigurationTables() throws IOException, SAXException { + testIndividual("empty-configuration-tables"); + } + + @Test + public void testHeadingsBlockParaKeephWithNext() throws IOException, SAXException { + testIndividual("headings-block-para-keep-with-next"); + } + + @Test + public void testHeadingsStyleSet() throws IOException, SAXException { + testIndividual("headings-style-set"); + } + + @Test + public void testImagesStyleSet() throws IOException, SAXException { + testIndividual("images-style-set"); + } + + @Test + public void testInlineDefaultNone() throws IOException, SAXException { + testIndividual("inline-default-none"); + } + + @Test + public void testInlineDefaultNoneWithFieldcode() throws IOException, SAXException { + testIndividual("inline-default-none-with-fieldcode"); + } + + @Test + public void testInlineDefaultNoneWithInlineGeneration() throws IOException, SAXException { + testIndividual("inline-default-none-with-inline-generation"); + } + + @Test + public void testInlineDefaultNoneWithInlineGenerationIgnore() throws IOException, SAXException { + testIndividual("inline-default-none-with-inline-generation-ignore"); + } + + @Test + public void testInlineDefaultNoneWithInlineGenerationTab() throws IOException, SAXException { + testIndividual("inline-default-none-with-inline-generation-tab"); + } + + @Test + public void testInlineDefaultNoneWithInlinePSStyle() throws IOException, SAXException { + testIndividual("inline-default-none-with-inline-psstyle"); + } + + @Test + public void testInlineDefaultPSStyle() throws IOException, SAXException { + testIndividual("inline-default-psstyle"); + } + + @Test + public void testInlineDefaultPSStyleWithFieldcode() throws IOException, SAXException { + testIndividual("inline-default-psstyle-with-fieldcode"); + } + + @Test + public void testInlineDefaultPSStyleWithInlineGeneration() throws IOException, SAXException { + testIndividual("inline-default-psstyle-with-inline-generation"); + } + + @Test + public void testInlineDefaultPSStyleWithInlineGenerationIgnore() throws IOException, SAXException { + testIndividual("inline-default-psstyle-with-inline-generation-ignore"); + } + + @Test + public void testInlineDefaultPSStyleWithInlineGenerationTab() throws IOException, SAXException { + testIndividual("inline-default-psstyle-with-inline-generation-tab"); + } + + @Test + public void testInlineDefaultStyle() throws IOException, SAXException { + testIndividual("inline-default-style"); + } + + @Test + public void testInlineDefaultStyleWithFieldcode() throws IOException, SAXException { + testIndividual("inline-default-style-with-fieldcode"); + } + + @Test + public void testInlineDefaultStyleWithInlineGeneration() throws IOException, SAXException { + testIndividual("inline-default-style-with-inline-generation"); + } + + @Test + public void testInlineDefaultStyleWithInlineGenerationIgnore() throws IOException, SAXException { + testIndividual("inline-default-style-with-inline-generation-ignore"); + } + + @Test + public void testInlineDefaultStyleWithInlineGenerationTab() throws IOException, SAXException { + testIndividual("inline-default-style-with-inline-generation-tab"); + } + + @Test + public void testInlineDefaultStyleWithInlinePSStyle() throws IOException, SAXException { + testIndividual("inline-default-style-with-inline-psstyle"); + } + + @Test + public void testInlineIndexLabel() throws IOException, SAXException { + testIndividual("inline-index-label"); + } + + @Test + public void testLargePSML() throws IOException, SAXException { + long start = System.currentTimeMillis(); + testIndividual("large-psml", "document"); + long end = System.currentTimeMillis(); + long time = end - start; + System.out.println("Large PSML time (ms): " + time); + Assert.assertTrue(40000 > time); // 40 seconds + } + + @Test + public void testListDefaultWithMultipleParas() throws IOException, SAXException { + testIndividual("list-default-with-multiple-paras", "document,numbering"); + } + + @Test + public void testListDefaultWithRoleSet() throws IOException, SAXException { + testIndividual("list-default-with-role-set", "document,numbering"); + } + + @Test + public void testListDefaultWithTypeSet() throws IOException, SAXException { + testIndividual("list-default-with-type-set", "document,numbering"); + } + + @Test + public void testListItemWhitespace() throws IOException, SAXException { + testIndividual("list-item-whitespace"); + } + + @Test + public void testMathML() throws IOException, SAXException { + testIndividual("mathml"); + } + + @Test + public void testPlaceholder() throws IOException, SAXException { + testIndividual("placeholder"); + } + + @Test + public void testPlaceholderStyle() throws IOException, SAXException { + testIndividual("placeholder-style"); + } + + @Test + public void testPreformatSet() throws IOException, SAXException { + testIndividual("preformat-set"); + } + + @Test + public void testPropertiesFragment() throws IOException, SAXException { + testIndividual("properties-fragment"); + } + + @Test + public void testSectionSet() throws IOException, SAXException { + testIndividual("section-set"); + } + + @Test + public void testTableCellWhitespace() throws IOException, SAXException { + testIndividual("table-cell-whitespace"); + } + + @Test + public void testTablesColRowHcellCellRole() throws IOException, SAXException { + testIndividual("tables-col-row-hcell-cell-role"); + } + + @Test + public void testTablesDefaultEmpty() throws IOException, SAXException { + testIndividual("tables-default-empty"); + } + + @Test + public void testTablesDefaultEmptyWithRole() throws IOException, SAXException { + testIndividual("tables-default-empty-with-role"); + } + + @Test + public void testTablesDefaultEmptyWithRoleMultiple() throws IOException, SAXException { + testIndividual("tables-default-empty-with-role-multiple"); + } + + @Test + public void testTablesDefaultSet() throws IOException, SAXException { + testIndividual("tables-default-set"); + } + + @Test + public void testTablesDefaultSetWithRole() throws IOException, SAXException { + testIndividual("tables-default-set-with-role"); + } + + @Test + public void testTablesDefaultSetWithRoleMultiple() throws IOException, SAXException { + testIndividual("tables-default-set-with-role-multiple"); + } + + @Test + public void testTablesDefaultWithWidthAuto() throws IOException, SAXException { + testIndividual("tables-default-with-width-auto"); + } + + @Test + public void testTablesDefaultWithWidthDxa() throws IOException, SAXException { + testIndividual("tables-default-with-width-dxa"); + } + + @Test + public void testTablesDefaultWithWidthPct() throws IOException, SAXException { + testIndividual("tables-default-with-width-pct"); + } + + @Test + public void testTablesRoleWithWidthAuto() throws IOException, SAXException { + testIndividual("tables-role-with-width-auto"); + } + + @Test + public void testTablesRoleWithWidthDxa() throws IOException, SAXException { + testIndividual("tables-role-with-width-dxa"); + } + + @Test + public void testTablesRoleWithWidthPct() throws IOException, SAXException { + testIndividual("tables-role-with-width-pct"); + } + + //@Test + //public void testTemplateLists() throws IOException, SAXException { + // testIndividual("template-lists", "document,numbering"); + //} + + @Test + public void testTocFalse() throws IOException, SAXException { + testIndividual("toc-false"); + } + + @Test + public void testTocTrue() throws IOException, SAXException { + testIndividual("toc-true"); + } + + @Test + public void testTocTrueHeadingFalse() throws IOException, SAXException { + testIndividual("toc-true-heading-false"); + } + + @Test + public void testTocTrueHeadingParagraphOutline() throws IOException, SAXException { + testIndividual("toc-true-heading-paragraph-outline"); + } + + @Test + public void testTocTrueHeadingTrue() throws IOException, SAXException { + testIndividual("toc-true-heading-true"); + } + + @Test + public void testTocTrueHeadingTrueMultiple() throws IOException, SAXException { + testIndividual("toc-true-heading-true-multiple"); + } + + @Test + public void testTocTrueOutlineFalse() throws IOException, SAXException { + testIndividual("toc-true-outline-false"); + } + + @Test + public void testTocTrueOutlineTrue() throws IOException, SAXException { + testIndividual("toc-true-outline-true"); + } + + @Test + public void testTocTrueOutlineTrueMultiple() throws IOException, SAXException { + testIndividual("toc-true-outline-true-multiple"); + } + + @Test + public void testTocTrueParagraphFalse() throws IOException, SAXException { + testIndividual("toc-true-paragraph-false"); + } + + @Test + public void testTocTrueParagraphTrue() throws IOException, SAXException { + testIndividual("toc-true-paragraph-true"); + } + + @Test + public void testTocTrueParagraphTrueMultiple() throws IOException, SAXException { + testIndividual("toc-true-paragraph-true-multiple"); + } + + @Test + public void testXrefCitations() throws IOException, SAXException { + // NOTE: To open docx result file first replace customXml/item1.xml with transformed-item1.xml. + testIndividual("xref-citations", "document,item1"); + } + + @Test + public void testXrefCitationsStyleSet() throws IOException, SAXException { + // NOTE: To open docx result file first replace customXml/item1.xml with transformed-item1.xml. + testIndividual("xref-citations-style-set", "document,item1"); + } + + @Test + public void testXrefEndnotes() throws IOException, SAXException { + testIndividual("xref-endnotes", "document,endnotes"); + } + + @Test + public void testXrefEndnotesStyleSet() throws IOException, SAXException { + testIndividual("xref-endnotes-style-set", "document,endnotes"); + } + + @Test + public void testXrefFootnotes() throws IOException, SAXException { + testIndividual("xref-footnotes", "document,footnotes"); + } + + @Test + public void testXrefFootnotesStyleSet() throws IOException, SAXException { + testIndividual("xref-footnotes-style-set", "document,footnotes"); + } + + @Test + public void testXrefStyle() throws IOException, SAXException { + testIndividual("xref-style", "document,endnotes,footnotes"); + } + + @Test + public void testXrefTypeCrossReference() throws IOException, SAXException { + testIndividual("xref-type-cross-reference"); + } + + public void testAll() throws IOException, SAXException { + File[] tests = CASES.listFiles(); + for (File test : tests) { + testIndividual(test, "document", false); + } + } + + public void testIndividual(String folderName) throws IOException, SAXException { + testIndividual(new File(CASES, folderName), "document", false); + } + + public void testIndividual(String folderName, boolean saveWorking) throws IOException, SAXException { + testIndividual(new File(CASES, folderName), "document", saveWorking); + } + + public void testIndividual(String folderName, String filenames) throws IOException, SAXException { + testIndividual(new File(CASES, folderName), filenames, true); + } + + public void testIndividual(File dir, String filenames, boolean saveWorking) throws IOException, SAXException { + if (dir.isDirectory()) { + + if (new File(dir, dir.getName() + ".psml").exists()) { + System.out.println(dir.getName()); + File result = new File(RESULTS, dir.getName()); + result.mkdirs(); + process(dir, result, saveWorking); + String[] names = filenames.split(","); + for (String name : names) { + File actual = new File(result, + ("document".equals(name) ? "" : + ("core".equals(name) || "custom".equals(name)) ? "working/prepacked/docProps/" : + "item1".equals(name) ? "working/prepacked/customXml/" : + "working/prepacked/word/") + name + ".xml"); + if (name.endsWith(".rels")) { + actual = new File(result, "working/prepacked/word/_rels/" + name); + } + File expected = new File(dir, name + ".xml"); + + // Check that the files exist + Assert.assertTrue(actual.exists()); + Assert.assertTrue(expected.exists()); + + Assert.assertTrue(actual.length() > 0); + Assert.assertTrue(expected.length() > 0); + assertXMLEqual(expected, actual, result); + } + } else { + System.out.println("Unable to find PSML file for test:" + dir.getName()); + } + } + } + + + private void process(File test, File result, boolean saveWorking) { + + ExportTask task = new ExportTask(); + + // validate test PSML + File psml = new File(test, test.getName() + ".psml"); + Assert.assertThat(psml, XML.validates("psml-processed.xsd")); + task.setSrc(psml); + + // validate config file + File export_config = new File(test, "word-export-config.xml"); + Assert.assertThat(export_config, XML.validates("word-export-config.xsd")); + task.setConfig(export_config); + + File template = new File(test, "word-export-template.dotx"); + if (!template.exists()) { + template = new File(test, "word-export-template.docx"); + } + task.setWordTemplate(template); + task.setDest(new File(result, test.getName() + ".docx")); + if (saveWorking) { + File working = new File(result, "working"); + if (working.exists()) deleteDir(working); + task.setWorking(working); + } + File media = new File(test, "media"); + if (media.exists()) { + task.setMedia(media); + } + + Parameter parameter = task.createParam(); + parameter.setName("generate-processed-psml"); + parameter.setValue("true"); + + Parameter parameter2 = task.createParam(); + parameter2.setName("current-user"); + parameter2.setValue("Jane Smith"); + + Parameter parameter3 = task.createParam(); + parameter3.setName("manual-core"); + parameter3.setValue("Config"); + + task.execute(); + + return; + } + + private static void deleteDir(File file) { + File[] contents = file.listFiles(); + if (contents != null) { + for (File f : contents) { + deleteDir(f); + } + } + file.delete(); + } + + private static void assertXMLEqual(File expected, File actual, File result) throws IOException, SAXException { + try { + Assert.assertThat(actual, CompareMatcher.isIdenticalTo(expected)); + } catch (AssertionError error) { + File expfile = new File(result, "expected-" + actual.getName()); + File actfile = new File(result, "actual-" + actual.getName()); + System.err.println("Expected: " + expfile.getCanonicalPath()); + System.err.println("Actual: " + actfile.getCanonicalPath()); + Files.copy(expected, expfile); + Files.copy(actual, actfile); + // uncomment the following to bulk update expected files for changes effecting all documents + //Files.copy(actual, expected); + throw error; + } + } + +} diff --git a/pso-docx-core/src/main/resources/org/pageseeder/docx/schema/word-export-config.xsd b/pso-docx-core/src/main/resources/org/pageseeder/docx/schema/word-export-config.xsd index b6feff3..48f1ad4 100644 --- a/pso-docx-core/src/main/resources/org/pageseeder/docx/schema/word-export-config.xsd +++ b/pso-docx-core/src/main/resources/org/pageseeder/docx/schema/word-export-config.xsd @@ -1,4 +1,4 @@ - + @@ -250,6 +250,7 @@ + diff --git a/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/apply-styles.xsl b/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/apply-styles.xsl index baaf7d4..0e506cb 100644 --- a/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/apply-styles.xsl +++ b/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/apply-styles.xsl @@ -32,6 +32,7 @@ + @@ -39,6 +40,12 @@ + + + + + + @@ -200,6 +207,7 @@ + @@ -207,6 +215,12 @@ + + + + + + @@ -237,6 +251,7 @@ + @@ -247,6 +262,12 @@ + + + + + + @@ -261,6 +282,7 @@ + @@ -268,6 +290,12 @@ + + + + + + diff --git a/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/config.xsl b/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/config.xsl index 56088ac..1f7195f 100644 --- a/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/config.xsl +++ b/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/config.xsl @@ -1,2277 +1,2491 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 620 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 620 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/variables.xsl b/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/variables.xsl index 822427e..9990234 100644 --- a/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/variables.xsl +++ b/pso-docx-core/src/main/resources/org/pageseeder/docx/xslt/export/variables.xsl @@ -1031,6 +1031,7 @@ + @@ -1039,6 +1040,12 @@ + + + + + + From 3099885d5f13d62484299a1ba2510fb662e1c89a Mon Sep 17 00:00:00 2001 From: philipr Date: Wed, 23 Mar 2022 10:55:32 +1100 Subject: [PATCH 3/3] Updated for release --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index a32577c..bdf3118 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.8.27-SNAPSHOT \ No newline at end of file +0.8.27 \ No newline at end of file