diff --git a/CHANGELOG.md b/CHANGELOG.md index cc7784ce0..4d9b60813 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- [fj-doc-mod-fop] Support for SVG rendering +- [fj-doc-freemarker] FreeMarker function 'base64ToString' +- [fj-doc-base] 'svg' to accepted image types + ### Changed - [fj-doc-maven-plugin] spring-boot flavour version set to 3.4.4 diff --git a/fj-doc-base-kotlin/src/main/java/org/fugerit/java/doc/base/kotlin/dsl/HelperDSL.kt b/fj-doc-base-kotlin/src/main/java/org/fugerit/java/doc/base/kotlin/dsl/HelperDSL.kt index 78566e648..b6828ec55 100644 --- a/fj-doc-base-kotlin/src/main/java/org/fugerit/java/doc/base/kotlin/dsl/HelperDSL.kt +++ b/fj-doc-base-kotlin/src/main/java/org/fugerit/java/doc/base/kotlin/dsl/HelperDSL.kt @@ -132,7 +132,7 @@ class HelperDSL { private var checkFun12 : (v: String) -> Boolean = { v -> setOf( "middle", "top", "bottom" ).contains( v ) } private var checkFun13 : (v: String) -> Boolean = { v -> setOf( "ul", "uld", "ulm", "ol", "oln", "oll" ).contains( v ) } private var checkFun14 : (v: String) -> Boolean = { v -> v.length in 0..2048 } - private var checkFun15 : (v: String) -> Boolean = { v -> setOf( "png", "jpg", "gif" ).contains( v ) } + private var checkFun15 : (v: String) -> Boolean = { v -> setOf( "png", "jpg", "gif", "svg" ).contains( v ) } private var checkFun16 : (v: Int) -> Boolean = { v -> v in 1..7 } protected fun alignType( tag : T, name : String, v: String) : T = setAtt( tag, name, v, checkFun0 ) protected fun borderWidthType( tag : T, name : String, v: Int) : T = setAtt( tag, name, v, checkFun1 ) diff --git a/fj-doc-base/DocXsdChangelog.md b/fj-doc-base/DocXsdChangelog.md index 187378783..fa2dd5e69 100644 --- a/fj-doc-base/DocXsdChangelog.md +++ b/fj-doc-base/DocXsdChangelog.md @@ -1,9 +1,22 @@ + +2.1.0.rc.3 (2025-03-22) +------------------ + +* Added 'svg' among accepted image types. + +2.1.0.rc.2 (2024-10-14) +------------------ + +* 'h' elemented accepted as child of 'para'. + 2.1.0.rc.1 (2023-08-18) ------------------ + * Added 'caption' attribute for 'table' element. 2.0.0.rc.3 (2023-08-17) ------------------ + * Added documentation for table 'padding', 'spacing' attributes and info element values 2.0.0.rc.002 (2023-07-29) diff --git a/fj-doc-base/src/main/docs/doc_xsd_config_ref.html b/fj-doc-base/src/main/docs/doc_xsd_config_ref.html index 67b8811b3..817132565 100644 --- a/fj-doc-base/src/main/docs/doc_xsd_config_ref.html +++ b/fj-doc-base/src/main/docs/doc_xsd_config_ref.html @@ -1888,7 +1888,7 @@

Reference xsd documentation for Venus - Fugerit The type of the image - imageType , base : string , enumeration : [ png , jpg , gif ] + imageType , base : string , enumeration : [ png , jpg , gif , svg ] diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/model/DocImage.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/model/DocImage.java index 0055f6365..9462cd8cf 100644 --- a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/model/DocImage.java +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/model/DocImage.java @@ -48,9 +48,11 @@ public class DocImage extends DocElement { public static final String TYPE_JPG = "jpg"; public static final String TYPE_GIF = "gif"; - + + public static final String TYPE_SVG = "svg"; + public static Collection getAcceptedImageTypes() { - return Arrays.asList( TYPE_PNG, TYPE_JPG, TYPE_GIF ); + return Arrays.asList( TYPE_PNG, TYPE_JPG, TYPE_GIF, TYPE_SVG ); } public static final String TAG_NAME = "image"; @@ -85,5 +87,9 @@ public String getResolvedBase64() { public String getResolvedType() { return StringUtils.valueWithDefault( this.getType() , this.getUrl() ); } - + + public boolean isSvg() { + return TYPE_SVG.equals( this.getResolvedType() ); + } + } diff --git a/fj-doc-base/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-base/reflect-config.json b/fj-doc-base/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-base/reflect-config.json index ad7bff26a..53c8f70f7 100644 --- a/fj-doc-base/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-base/reflect-config.json +++ b/fj-doc-base/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-base/reflect-config.json @@ -1155,6 +1155,9 @@ }, { "name" : "hashCode", "parameterTypes" : [ ] + }, { + "name" : "isSvg", + "parameterTypes" : [ ] }, { "name" : "notify", "parameterTypes" : [ ] diff --git a/fj-doc-base/src/main/resources/config/doc-2-1.xsd b/fj-doc-base/src/main/resources/config/doc-2-1.xsd index 8af43e8f5..e6817940b 100644 --- a/fj-doc-base/src/main/resources/config/doc-2-1.xsd +++ b/fj-doc-base/src/main/resources/config/doc-2-1.xsd @@ -6,7 +6,7 @@ * * @project : fj-doc-base * @creation : 2023-08-18 - * @version : 2.1.0-rc.2 (2024-10-14) + * @version : 2.1.0-rc.3 (2025-03-22) * * XSD for fugerit doc configuration */ @@ -543,6 +543,7 @@ + diff --git a/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/model/TestDocImage.java b/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/model/TestDocImage.java index cc33cca8a..c116e166c 100644 --- a/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/model/TestDocImage.java +++ b/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/model/TestDocImage.java @@ -16,6 +16,9 @@ void testElement1() { Assertions.assertEquals( DocImage.TYPE_JPG, image.getResolvedType() ); image.setType( DocImage.TYPE_PNG ); Assertions.assertEquals( DocImage.TYPE_PNG, image.getResolvedType() ); + Assertions.assertFalse( image.isSvg() ); + image.setType( DocImage.TYPE_SVG ); + Assertions.assertTrue( image.isSvg() ); log.info( "accepted types : {}", DocImage.getAcceptedImageTypes() ); } diff --git a/fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/config/FreeMarkerConfigStep.java b/fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/config/FreeMarkerConfigStep.java index f2139f7d7..bfc0ad8a5 100644 --- a/fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/config/FreeMarkerConfigStep.java +++ b/fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/config/FreeMarkerConfigStep.java @@ -152,6 +152,7 @@ public int process(DocProcessContext context, DocProcessData data) throws Except map.put(CleanXmlFun.DEFAULT_NAME, new CleanXmlFun()); map.put(CleanTextFun.DEFAULT_NAME, new CleanTextFun()); map.put(FormatLocalDateTimeFun.DEFAULT_NAME, new FormatLocalDateTimeFun()); + map.put(Base64ToStringFun.DEFAULT_NAME, new Base64ToStringFun()); } return res; } diff --git a/fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/fun/Base64ToStringFun.java b/fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/fun/Base64ToStringFun.java new file mode 100644 index 000000000..f1b6bc696 --- /dev/null +++ b/fj-doc-freemarker/src/main/java/org/fugerit/java/doc/freemarker/fun/Base64ToStringFun.java @@ -0,0 +1,22 @@ +package org.fugerit.java.doc.freemarker.fun; + +import freemarker.template.SimpleScalar; +import freemarker.template.TemplateMethodModelEx; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateScalarModel; + +import java.util.Base64; +import java.util.List; + +public class Base64ToStringFun implements TemplateMethodModelEx { + + public static final String DEFAULT_NAME = "base64ToString"; + + @Override + public Object exec(@SuppressWarnings("rawtypes") List arguments) throws TemplateModelException { + FMFunHelper.checkParameterNumber( arguments, 1 ); + String base64 = ((TemplateScalarModel)arguments.get( 0 )).getAsString(); + return new SimpleScalar( new String( Base64.getDecoder().decode( base64 ) ) ); + } + +} diff --git a/fj-doc-freemarker/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-freemarker/reflect-config.json b/fj-doc-freemarker/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-freemarker/reflect-config.json index 414e11ef3..d04c9e283 100644 --- a/fj-doc-freemarker/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-freemarker/reflect-config.json +++ b/fj-doc-freemarker/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-freemarker/reflect-config.json @@ -1792,6 +1792,42 @@ "name" : "wait", "parameterTypes" : [ "long", "int" ] } ] +}, { + "name" : "org.fugerit.java.doc.freemarker.fun.Base64ToStringFun", + "methods" : [ { + "name" : "", + "parameterTypes" : [ ] + }, { + "name" : "equals", + "parameterTypes" : [ "java.lang.Object" ] + }, { + "name" : "exec", + "parameterTypes" : [ "java.util.List" ] + }, { + "name" : "getClass", + "parameterTypes" : [ ] + }, { + "name" : "hashCode", + "parameterTypes" : [ ] + }, { + "name" : "notify", + "parameterTypes" : [ ] + }, { + "name" : "notifyAll", + "parameterTypes" : [ ] + }, { + "name" : "toString", + "parameterTypes" : [ ] + }, { + "name" : "wait", + "parameterTypes" : [ ] + }, { + "name" : "wait", + "parameterTypes" : [ "long" ] + }, { + "name" : "wait", + "parameterTypes" : [ "long", "int" ] + } ] }, { "name" : "org.fugerit.java.doc.freemarker.fun.CleanTextFun", "methods" : [ { diff --git a/fj-doc-freemarker/src/test/resources/fj_doc_test/freemarker-doc-process_alt.xml b/fj-doc-freemarker/src/test/resources/fj_doc_test/freemarker-doc-process_alt.xml index 31ffaca55..91c4f9eca 100644 --- a/fj-doc-freemarker/src/test/resources/fj_doc_test/freemarker-doc-process_alt.xml +++ b/fj-doc-freemarker/src/test/resources/fj_doc_test/freemarker-doc-process_alt.xml @@ -25,6 +25,7 @@ + diff --git a/fj-doc-freemarker/src/test/resources/fj_doc_test/template/test_01.ftl b/fj-doc-freemarker/src/test/resources/fj_doc_test/template/test_01.ftl index 8635c932e..0f89f4be3 100644 --- a/fj-doc-freemarker/src/test/resources/fj_doc_test/template/test_01.ftl +++ b/fj-doc-freemarker/src/test/resources/fj_doc_test/template/test_01.ftl @@ -61,6 +61,8 @@ italic ${sumLong(10, 20)} + base64ToString ${base64ToString('VEVTVA==')} + italic ${messageFormat()} diff --git a/fj-doc-mod-fop/src/main/resources/fj_doc_mod_fop_config/fm-fop-process-config.xml b/fj-doc-mod-fop/src/main/resources/fj_doc_mod_fop_config/fm-fop-process-config.xml index 68bf04013..e5084e926 100644 --- a/fj-doc-mod-fop/src/main/resources/fj_doc_mod_fop_config/fm-fop-process-config.xml +++ b/fj-doc-mod-fop/src/main/resources/fj_doc_mod_fop_config/fm-fop-process-config.xml @@ -24,6 +24,9 @@ wrap-unchecked-exceptions="true" /> + + + diff --git a/fj-doc-mod-fop/src/main/resources/fj_doc_mod_fop_config/template/macro/doc_element.ftl b/fj-doc-mod-fop/src/main/resources/fj_doc_mod_fop_config/template/macro/doc_element.ftl index 830dd7426..789b5a1e8 100644 --- a/fj-doc-mod-fop/src/main/resources/fj_doc_mod_fop_config/template/macro/doc_element.ftl +++ b/fj-doc-mod-fop/src/main/resources/fj_doc_mod_fop_config/template/macro/doc_element.ftl @@ -54,14 +54,17 @@ <#macro handleImage docImage> - <#if (docImage.scaling)??> - <#assign imageScaling="height='${docImage.scaling}%' content-height='${docImage.scaling}%' content-width='scale-to-fit' scaling='uniform' width='${docImage.scaling}%'"/> - <#else> - <#assign imageScaling=""/> - > - fox:alt-text="${docImage.alt}" ${imageScaling} xmlns:fo="http://www.w3.org/1999/XSL/Format" - src="data:image;base64,${docImage.resolvedBase64}"/> + <#if docImage.svg> + ${base64ToString(docImage.resolvedBase64)} + <#else> + <#if (docImage.scaling)??> + <#assign imageScaling="height='${docImage.scaling}%' content-height='${docImage.scaling}%' content-width='scale-to-fit' scaling='uniform' width='${docImage.scaling}%'"/> + <#else> + <#assign imageScaling=""/> + + fox:alt-text="${docImage.alt}" ${imageScaling} xmlns:fo="http://www.w3.org/1999/XSL/Format" src="data:image;base64,${docImage.resolvedBase64}"/> + diff --git a/fj-doc-mod-fop/src/test/resources/sample/doc_alt_01.xml b/fj-doc-mod-fop/src/test/resources/sample/doc_alt_01.xml index bcb268b6f..279304683 100644 --- a/fj-doc-mod-fop/src/test/resources/sample/doc_alt_01.xml +++ b/fj-doc-mod-fop/src/test/resources/sample/doc_alt_01.xml @@ -10,6 +10,9 @@ Alternative sample doc + Test SGV +