diff --git a/cms-api/src/main/java/com/condation/cms/api/Constants.java b/cms-api/src/main/java/com/condation/cms/api/Constants.java index 78ccab5a9..136102925 100644 --- a/cms-api/src/main/java/com/condation/cms/api/Constants.java +++ b/cms-api/src/main/java/com/condation/cms/api/Constants.java @@ -114,6 +114,8 @@ public static class ContentTypes { public static final String DEFAULT_CACHE_ENGINE = "local"; public static final boolean DEFAULT_CONTENT_CACHE_ENABLED = false; + + public static final String DEFAULT_MODULE_NAMESPACE = "mod"; public static class Taxonomy { public static final String DEFAULT_TEMPLATE = "taxonomy.html"; diff --git a/cms-api/src/main/java/com/condation/cms/api/extensions/TemplateModelExtendingExtensionPoint.java b/cms-api/src/main/java/com/condation/cms/api/extensions/TemplateModelExtendingExtensionPoint.java index 569d5929c..6afd7438e 100644 --- a/cms-api/src/main/java/com/condation/cms/api/extensions/TemplateModelExtendingExtensionPoint.java +++ b/cms-api/src/main/java/com/condation/cms/api/extensions/TemplateModelExtendingExtensionPoint.java @@ -1,5 +1,9 @@ package com.condation.cms.api.extensions; +import java.util.Map; + +import com.condation.cms.api.Constants; + /*- * #%L * cms-api @@ -26,6 +30,21 @@ public abstract class TemplateModelExtendingExtensionPoint extends AbstractExtensionPoint{ + /** + * deprecated: use @TemplateModelExtendingExtensionPoint.getModel instead + * @param model + */ + @Deprecated(since = "7.3.0", forRemoval = true) public abstract void extendModel (TemplateEngine.Model model); - + + public Map getModel () { + TemplateEngine.Model model = new TemplateEngine.Model(null, null); + extendModel(model); + return model.values; + } + + public String getNamespace () { + return Constants.DEFAULT_MODULE_NAMESPACE; + } + } diff --git a/cms-api/src/main/java/com/condation/cms/api/extensions/TemplateModelExtendingExtentionPoint.java b/cms-api/src/main/java/com/condation/cms/api/extensions/TemplateModelExtendingExtentionPoint.java index 985577437..499e458a7 100644 --- a/cms-api/src/main/java/com/condation/cms/api/extensions/TemplateModelExtendingExtentionPoint.java +++ b/cms-api/src/main/java/com/condation/cms/api/extensions/TemplateModelExtendingExtentionPoint.java @@ -1,5 +1,9 @@ package com.condation.cms.api.extensions; +import java.util.Map; + +import com.condation.cms.api.Constants; + /*- * #%L * cms-api @@ -35,4 +39,13 @@ public abstract class TemplateModelExtendingExtentionPoint extends AbstractExten public abstract void extendModel (TemplateEngine.Model model); + public Map getModel () { + TemplateEngine.Model model = new TemplateEngine.Model(null, null); + extendModel(model); + return model.values; + } + + public String getNamespace () { + return Constants.DEFAULT_MODULE_NAMESPACE; + } } diff --git a/cms-content/pom.xml b/cms-content/pom.xml index f0e116194..c386d5660 100644 --- a/cms-content/pom.xml +++ b/cms-content/pom.xml @@ -1,5 +1,7 @@ - + 4.0.0 com.condation.cms @@ -8,7 +10,7 @@ cms-content jar - + com.condation.cms diff --git a/cms-content/src/main/java/com/condation/cms/content/DefaultContentRenderer.java b/cms-content/src/main/java/com/condation/cms/content/DefaultContentRenderer.java index 915250d37..2f83379d5 100644 --- a/cms-content/src/main/java/com/condation/cms/content/DefaultContentRenderer.java +++ b/cms-content/src/main/java/com/condation/cms/content/DefaultContentRenderer.java @@ -1,5 +1,6 @@ package com.condation.cms.content; +import com.condation.cms.api.Constants; /*- * #%L * cms-content @@ -139,20 +140,41 @@ public String render(final ReadOnlyFile contentFile, final RequestContext contex modelExtending.accept(model); + //model.values.put("cms", Namespace.create("cms", meta)); + + Namespace namespace = new Namespace(); + model.values.put("meta", new MapAccess(meta)); model.values.put("sections", sections); - model.values.put("shortCodes", createShortCodeFunction(context)); - model.values.put("navigation", createNavigationFunction(contentFile, context)); - model.values.put("nodeList", createNodeListFunction(contentFile, context)); - model.values.put("query", createQueryFunction(contentFile, context)); + namespace.add("node", "meta", new MapAccess(meta)); + namespace.add("node", "sections", sections); + + ShortCodeTemplateFunction shortCodeFunction = createShortCodeFunction(context); + model.values.put("shortCodes", shortCodeFunction); + namespace.add("cms", "shortCodes", shortCodeFunction); + + NavigationFunction navigationFunction = createNavigationFunction(contentFile, context); + model.values.put("navigation", navigationFunction); + namespace.add("cms", "navigation", shortCodeFunction); + + NodeListFunctionBuilder nodeListFunction = createNodeListFunction(contentFile, context); + model.values.put("nodeList", nodeListFunction); + namespace.add("cms", "nodeList", nodeListFunction); + + QueryFunction queryFunction = createQueryFunction(contentFile, context); + model.values.put("query", queryFunction); + namespace.add("cms", "query", queryFunction); + model.values.put("requestContext", context.get(RequestFeature.class)); model.values.put("theme", context.get(RenderContext.class).theme()); model.values.put("site", siteProperties); model.values.put("mediaService", context.get(SiteMediaServiceFeature.class).mediaService()); + namespace.add("cms", "mediaService", context.get(SiteMediaServiceFeature.class).mediaService()); model.values.put("taxonomies", context.get(InjectorFeature.class).injector().getInstance(TaxonomyFunction.class)); - + namespace.add("cms", "taxonomies", context.get(InjectorFeature.class).injector().getInstance(TaxonomyFunction.class)); + var theme = context.get(RenderContext.class).theme(); if (theme.empty()) { model.values.put("messages", context.get(InjectorFeature.class).injector().getInstance(MessageSource.class)); @@ -161,8 +183,10 @@ public String render(final ReadOnlyFile contentFile, final RequestContext contex } model.values.put("hooks", context.get(HookSystemFeature.class).hookSystem()); + namespace.add("cms", "hooks", context.get(HookSystemFeature.class).hookSystem()); model.values.put("links", new LinkFunction(context)); + namespace.add("cms", "links", new LinkFunction(context)); model.values.put("PREVIEW_MODE", isPreview(context)); model.values.put("DEV_MODE", isDevMode(context)); @@ -174,17 +198,21 @@ public String render(final ReadOnlyFile contentFile, final RequestContext contex context.get(TemplateHooks.class).getTemplateSupplier().getRegisterTemplateSupplier().forEach(service -> { model.values.put(service.name(), service.supplier()); + namespace.add(Constants.DEFAULT_MODULE_NAMESPACE, service.name(), service.supplier()); }); context.get(TemplateHooks.class).getTemplateFunctions().getRegisterTemplateFunctions().forEach(service -> { model.values.put(service.name(), service.function()); + namespace.add(Constants.DEFAULT_MODULE_NAMESPACE, service.name(), service.function()); }); - extendModel(model); + extendModel(model, namespace); - model.values.put("content", - renderContent(rawContent, context, model) - ); + String content = renderContent(rawContent, context, model); + model.values.put("content", content); + namespace.add("node", "content", content); + model.values.putAll(namespace.getNamespaces()); + return templates.get().render((String) meta.get("template"), model); } @@ -223,9 +251,27 @@ private boolean isDevMode(final RequestContext context) { return context.has(IsDevModeFeature.class); } - private void extendModel(final TemplateEngine.Model model) { - moduleManager.extensions(TemplateModelExtendingExtentionPoint.class).forEach(extensionPoint -> extensionPoint.extendModel(model)); - moduleManager.extensions(TemplateModelExtendingExtensionPoint.class).forEach(extensionPoint -> extensionPoint.extendModel(model)); + private void extendModel(final TemplateEngine.Model model, Namespace namespace) { + moduleManager.extensions(TemplateModelExtendingExtentionPoint.class).forEach(extensionPoint -> { + var modModel = extensionPoint.getModel(); + // deprecated: module extensions on root will be remove in 8.0.0 + model.values.putAll(modModel); + modModel.entrySet().forEach(entry -> namespace.add( + extensionPoint.getNamespace(), + entry.getKey(), + entry.getValue() + )); + }); + moduleManager.extensions(TemplateModelExtendingExtensionPoint.class).forEach(extensionPoint -> { + var modModel = extensionPoint.getModel(); + // deprecated: module extensions on root will be remove in 8.0.0 + model.values.putAll(modModel); + modModel.entrySet().forEach(entry -> namespace.add( + extensionPoint.getNamespace(), + entry.getKey(), + entry.getValue() + )); + }); } @Override diff --git a/cms-content/src/main/java/com/condation/cms/content/Namespace.java b/cms-content/src/main/java/com/condation/cms/content/Namespace.java new file mode 100644 index 000000000..eb6aa2fc0 --- /dev/null +++ b/cms-content/src/main/java/com/condation/cms/content/Namespace.java @@ -0,0 +1,41 @@ +package com.condation.cms.content; + +/*- + * #%L + * cms-content + * %% + * Copyright (C) 2023 - 2024 CondationCMS + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * . + * #L% + */ + +import java.util.HashMap; +import java.util.Map; + +import lombok.Getter; + + +public class Namespace { + + @Getter + Map> namespaces = new HashMap<>(); + + public void add (String namespace, String key, Object object) { + var namespaceMap = namespaces.computeIfAbsent(namespace, k -> new HashMap<>()); + namespaceMap.put(key, object); + } + +} diff --git a/modules/example-module/src/main/java/com/condation/cms/modules/example/ExampleTemplateModelExtendingExtensionEndPoint.java b/modules/example-module/src/main/java/com/condation/cms/modules/example/ExampleTemplateModelExtendingExtensionEndPoint.java index a376d386b..adc50d9b4 100644 --- a/modules/example-module/src/main/java/com/condation/cms/modules/example/ExampleTemplateModelExtendingExtensionEndPoint.java +++ b/modules/example-module/src/main/java/com/condation/cms/modules/example/ExampleTemplateModelExtendingExtensionEndPoint.java @@ -1,6 +1,7 @@ package com.condation.cms.modules.example; import java.util.List; +import java.util.Map; import java.util.UUID; import com.condation.cms.api.extensions.TemplateModelExtendingExtensionPoint; @@ -40,7 +41,11 @@ public class ExampleTemplateModelExtendingExtensionEndPoint extends TemplateMode @Override public void extendModel(TemplateEngine.Model model) { - model.values.put("searcher", new Searcher()); + } + + @Override + public Map getModel() { + return Map.of("searcher", new Searcher()); } @Override diff --git a/test-server/hosts/features/site-dev.toml b/test-server/hosts/features/site-dev.toml new file mode 100644 index 000000000..4751939c1 --- /dev/null +++ b/test-server/hosts/features/site-dev.toml @@ -0,0 +1,2 @@ +[modules] +active = [ "example-module" ] diff --git a/test-server/hosts/features/site-dev.yaml b/test-server/hosts/features/site-dev.yaml deleted file mode 100644 index 59ce601ac..000000000 --- a/test-server/hosts/features/site-dev.yaml +++ /dev/null @@ -1,3 +0,0 @@ -modules: - active: - - example-module \ No newline at end of file diff --git a/test-server/hosts/features/site.toml b/test-server/hosts/features/site.toml new file mode 100644 index 000000000..61882d1d3 --- /dev/null +++ b/test-server/hosts/features/site.toml @@ -0,0 +1,15 @@ +id = "feature-site" +hostname = [ "localhost2" ] +baseurl = "http://localhost2:1010" +language = "en" +test = "Hallo" +theme = "test" + +[cache] +content = true + +[query.index] +mode = "PERSISTENT" + +[modules] +active = [ "forms-module" ] diff --git a/test-server/hosts/features/site.yaml b/test-server/hosts/features/site.yaml deleted file mode 100644 index c42eb0216..000000000 --- a/test-server/hosts/features/site.yaml +++ /dev/null @@ -1,32 +0,0 @@ -id: feature-site -hostname: - - localhost2 -baseurl: "http://localhost2:1010" -language: en -test: Hallo -theme: test -cache: - content: true -query: - index: - mode: PERSISTENT -modules: - active: - - forms-module -media: - formats: - - name: small - width: 256 - height: 256 - format: webp - compression: true - - name: big - width: 512 - height: 512 - format: webp - compression: true - - name: test2 - width: 72 - height: 72 - format: webp - compression: true \ No newline at end of file diff --git a/test-server/hosts/features/templates/start.html b/test-server/hosts/features/templates/start.html index 2e30e4591..f9e73b518 100644 --- a/test-server/hosts/features/templates/start.html +++ b/test-server/hosts/features/templates/start.html @@ -88,6 +88,11 @@

Call ShortCode from template

[(${shortCodes.call('hello', #{'name': 'CondationCMS'})})] +
+

Test mod-Namespace

+

+
+ diff --git a/test-server/themes/demo/templates/libs/fragments.html b/test-server/themes/demo/templates/libs/fragments.html index 41d934f49..f26214aa4 100644 --- a/test-server/themes/demo/templates/libs/fragments.html +++ b/test-server/themes/demo/templates/libs/fragments.html @@ -2,7 +2,7 @@ - + diff --git a/test-server/themes/demo/templates/start.html b/test-server/themes/demo/templates/start.html index a1ce49bf4..9bdb759b2 100644 --- a/test-server/themes/demo/templates/start.html +++ b/test-server/themes/demo/templates/start.html @@ -9,7 +9,7 @@
-
+
diff --git a/test-server/themes/parent/templates/blog-entry.html b/test-server/themes/parent/templates/blog-entry.html index 3d0e361ee..59a5b0a4f 100644 --- a/test-server/themes/parent/templates/blog-entry.html +++ b/test-server/themes/parent/templates/blog-entry.html @@ -14,7 +14,7 @@

-

+

-
+
diff --git a/test-server/themes/parent/templates/content.html b/test-server/themes/parent/templates/content.html index 6c834165d..46e2d3ccf 100644 --- a/test-server/themes/parent/templates/content.html +++ b/test-server/themes/parent/templates/content.html @@ -11,7 +11,7 @@
-
+
diff --git a/test-server/themes/parent/templates/content.part.html b/test-server/themes/parent/templates/content.part.html index 69d109321..9f9ed58b9 100644 --- a/test-server/themes/parent/templates/content.part.html +++ b/test-server/themes/parent/templates/content.part.html @@ -1,7 +1,7 @@
-
-

+
+

\ No newline at end of file diff --git a/test-server/themes/parent/templates/error.html b/test-server/themes/parent/templates/error.html index 8839f58b1..1e9d29291 100644 --- a/test-server/themes/parent/templates/error.html +++ b/test-server/themes/parent/templates/error.html @@ -6,7 +6,7 @@
- + \ No newline at end of file diff --git a/test-server/themes/parent/templates/libs/fragments.html b/test-server/themes/parent/templates/libs/fragments.html index 460bd8bcf..d1704c573 100644 --- a/test-server/themes/parent/templates/libs/fragments.html +++ b/test-server/themes/parent/templates/libs/fragments.html @@ -2,7 +2,7 @@ - + diff --git a/test-server/themes/parent/templates/navigation.html b/test-server/themes/parent/templates/navigation.html index 2bccb8c2c..3bf3fd660 100644 --- a/test-server/themes/parent/templates/navigation.html +++ b/test-server/themes/parent/templates/navigation.html @@ -15,7 +15,7 @@
-
+
diff --git a/test-server/themes/parent/templates/search.html b/test-server/themes/parent/templates/search.html index 070d226d4..4ea61961d 100644 --- a/test-server/themes/parent/templates/search.html +++ b/test-server/themes/parent/templates/search.html @@ -18,7 +18,7 @@ -
+
diff --git a/test-server/themes/parent/templates/start.html b/test-server/themes/parent/templates/start.html index 2c8429c2d..2b4d92ab6 100644 --- a/test-server/themes/parent/templates/start.html +++ b/test-server/themes/parent/templates/start.html @@ -10,7 +10,7 @@
-
+
diff --git a/test-server/themes/test/templates/content.html b/test-server/themes/test/templates/content.html index 2962af304..6af41c775 100644 --- a/test-server/themes/test/templates/content.html +++ b/test-server/themes/test/templates/content.html @@ -15,7 +15,7 @@

Overridden template from parent

-
+