diff --git a/cms-api/pom.xml b/cms-api/pom.xml index 4e6ed8382..bcde7c921 100644 --- a/cms-api/pom.xml +++ b/cms-api/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-api jar 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 ec77e0218..49d033a16 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 @@ -23,6 +23,7 @@ */ +import java.util.List; import java.util.function.Function; import java.util.regex.Pattern; import lombok.AccessLevel; @@ -105,6 +106,7 @@ public static class ContentTypes { public static final int DEFAULT_PAGE_SIZE = 5; public static final String DEFAULT_CONTENT_TYPE = ContentTypes.HTML; + public static final List DEFAULT_CONTENT_PIPELINE = List.of("markdown", "shortcode"); public static final int DEFAULT_REDIRECT_STATUS = 301; diff --git a/cms-api/src/main/java/com/condation/cms/api/SiteProperties.java b/cms-api/src/main/java/com/condation/cms/api/SiteProperties.java index fb9ad7c4c..58740ef64 100644 --- a/cms-api/src/main/java/com/condation/cms/api/SiteProperties.java +++ b/cms-api/src/main/java/com/condation/cms/api/SiteProperties.java @@ -80,6 +80,10 @@ public String defaultContentType () { return (String)getSubMap("content").getOrDefault("type", Constants.DEFAULT_CONTENT_TYPE); } + public List contentPipeline () { + return (List)getSubMap("content").getOrDefault("pipeline", Constants.DEFAULT_CONTENT_PIPELINE); + } + public String cacheEngine() { return (String) getSubMap("cache").getOrDefault("engine", Constants.DEFAULT_CACHE_ENGINE); } diff --git a/cms-api/src/main/java/com/condation/cms/api/feature/features/TemplateEngineFeature.java b/cms-api/src/main/java/com/condation/cms/api/feature/features/TemplateEngineFeature.java new file mode 100644 index 000000000..5ff1352a4 --- /dev/null +++ b/cms-api/src/main/java/com/condation/cms/api/feature/features/TemplateEngineFeature.java @@ -0,0 +1,37 @@ +package com.condation.cms.api.feature.features; + +/*- + * #%L + * cms-api + * %% + * 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 com.condation.cms.api.annotations.FeatureScope; +import com.condation.cms.api.feature.Feature; +import com.condation.cms.api.template.TemplateEngine; + +/** + * + * @author t.marx + */ +@FeatureScope({FeatureScope.Scope.REQUEST}) +public record TemplateEngineFeature(TemplateEngine templateEngine) implements Feature { + +} diff --git a/cms-api/src/main/java/com/condation/cms/api/template/TemplateEngine.java b/cms-api/src/main/java/com/condation/cms/api/template/TemplateEngine.java index 29b1b0b0d..877fb50ee 100644 --- a/cms-api/src/main/java/com/condation/cms/api/template/TemplateEngine.java +++ b/cms-api/src/main/java/com/condation/cms/api/template/TemplateEngine.java @@ -42,6 +42,10 @@ public interface TemplateEngine { String render(final String template, final TemplateEngine.Model model) throws IOException; + default String renderFromString(final String templateString, final TemplateEngine.Model model) throws IOException { + return templateString; + } + @RequiredArgsConstructor public static class Model { public final Map values = new HashMap<>(); diff --git a/cms-auth/pom.xml b/cms-auth/pom.xml index d860dfe62..a4c59730e 100644 --- a/cms-auth/pom.xml +++ b/cms-auth/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-auth jar diff --git a/cms-content/pom.xml b/cms-content/pom.xml index 536a21032..d4076ac80 100644 --- a/cms-content/pom.xml +++ b/cms-content/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-content jar 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 921839c05..e9fa9a147 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 @@ -49,7 +49,6 @@ import com.condation.cms.content.views.model.View; import com.condation.cms.extensions.hooks.DBHooks; import com.condation.cms.extensions.hooks.TemplateHooks; -import com.condation.cms.extensions.request.RequestExtensions; import com.condation.cms.content.template.functions.LinkFunction; import com.condation.cms.content.template.functions.list.NodeListFunctionBuilder; import com.condation.cms.content.template.functions.navigation.NavigationFunction; @@ -129,8 +128,8 @@ private Object getFeatureValueOrDefault(RequestContext conte return defaultValue; } - private String renderMarkdown(final String rawContent, final RequestContext context) { - var pipeline = ContentPipelineFactory.create(context); + private String renderMarkdown(final String rawContent, final RequestContext context, final TemplateEngine.Model model) { + var pipeline = ContentPipelineFactory.create(context, model); return pipeline.process(rawContent); } @@ -149,9 +148,6 @@ public String render(final ReadOnlyFile contentFile, final RequestContext contex modelExtending.accept(model); model.values.put("meta", meta); - model.values.put("content", - renderMarkdown(rawContent, context) - ); model.values.put("sections", sections); model.values.put("shortCodes", createShortCodeFunction(context)); @@ -187,6 +183,10 @@ public String render(final ReadOnlyFile contentFile, final RequestContext contex extendModel(model); + model.values.put("content", + renderMarkdown(rawContent, context, model) + ); + return templates.get().render((String) meta.get("template"), model); } diff --git a/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipeline.java b/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipeline.java index 494106bde..852b03346 100644 --- a/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipeline.java +++ b/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipeline.java @@ -21,44 +21,76 @@ * . * #L% */ - +import com.condation.cms.api.configuration.configs.SiteConfiguration; import com.condation.cms.api.feature.Feature; +import com.condation.cms.api.feature.features.ConfigurationFeature; +import com.condation.cms.api.feature.features.TemplateEngineFeature; import com.condation.cms.api.hooks.FilterContext; import com.condation.cms.api.hooks.HookSystem; import com.condation.cms.api.hooks.Hooks; import com.condation.cms.api.request.RequestContext; +import com.condation.cms.api.template.TemplateEngine; import com.condation.cms.content.RenderContext; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; /** * * @author thmar */ +@Slf4j @RequiredArgsConstructor(access = AccessLevel.PROTECTED) public class ContentPipeline { private final HookSystem hookSystem; private final RequestContext requestContext; + + private final TemplateEngine.Model model; - void init () { - hookSystem.registerFilter(Hooks.CONTENT_FILTER.hook(), this::markdown, 20); - hookSystem.registerFilter(Hooks.CONTENT_FILTER.hook(), this::shortCodes, 30); + void init() { + + List pipeline = requestContext.get(ConfigurationFeature.class) + .configuration().get(SiteConfiguration.class) + .siteProperties().contentPipeline(); + + AtomicInteger prio = new AtomicInteger(10); + pipeline.forEach(processor -> { + switch (processor) { + case "markdown" -> hookSystem.registerFilter(Hooks.CONTENT_FILTER.hook(), this::processMarkdown, prio.getAndAdd(10)); + case "shortcode" -> hookSystem.registerFilter(Hooks.CONTENT_FILTER.hook(), this::processShortCodes, prio.getAndAdd(10)); + case "template" -> hookSystem.registerFilter(Hooks.CONTENT_FILTER.hook(), this::processTemplate, prio.getAndAdd(10)); + } + }); + } - - public String process (String rawContent) { + + public String process(String rawContent) { return hookSystem.filter(Hooks.CONTENT_FILTER.hook(), rawContent).value(); } - - private String markdown (FilterContext context) { + + private String processMarkdown(FilterContext context) { return requestContext.get(RenderContext.class).markdownRenderer().render(context.value()); } - - private String shortCodes (FilterContext context) { + + private String processShortCodes(FilterContext context) { return requestContext.get(RenderContext.class).shortCodes().replace(context.value()); } - + + private String processTemplate(FilterContext context) { + try { + return requestContext.get(TemplateEngineFeature.class).templateEngine() + .renderFromString(context.value(), model); + } catch (IOException ex) { + log.error("", ex); + return context.value(); + } + } + private Object getFeatureValueOrDefault(RequestContext context, Class feature, Function valueFunction, Object defaultValue) { if (context.has(feature)) { diff --git a/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipelineFactory.java b/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipelineFactory.java index 9fc533ad4..9cd1a31dd 100644 --- a/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipelineFactory.java +++ b/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipelineFactory.java @@ -24,6 +24,7 @@ import com.condation.cms.api.feature.features.HookSystemFeature; import com.condation.cms.api.request.RequestContext; +import com.condation.cms.api.template.TemplateEngine; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -34,10 +35,10 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ContentPipelineFactory { - public static ContentPipeline create (final RequestContext requestContext) { + public static ContentPipeline create (final RequestContext requestContext, final TemplateEngine.Model model) { var hookSystem = requestContext.get(HookSystemFeature.class).hookSystem(); - var pipeline = new ContentPipeline(hookSystem.clone(), requestContext); + var pipeline = new ContentPipeline(hookSystem.clone(), requestContext, model); pipeline.init(); return pipeline; diff --git a/cms-core/pom.xml b/cms-core/pom.xml index 06737f722..84238b219 100644 --- a/cms-core/pom.xml +++ b/cms-core/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-core jar diff --git a/cms-extensions/pom.xml b/cms-extensions/pom.xml index 299df7881..123d1f8d5 100644 --- a/cms-extensions/pom.xml +++ b/cms-extensions/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-extensions jar diff --git a/cms-filesystem/pom.xml b/cms-filesystem/pom.xml index ce2ce5605..11611dd23 100644 --- a/cms-filesystem/pom.xml +++ b/cms-filesystem/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-filesystem jar diff --git a/cms-git/pom.xml b/cms-git/pom.xml index 3a859eeb6..b93363b8c 100644 --- a/cms-git/pom.xml +++ b/cms-git/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-git jar diff --git a/cms-media/pom.xml b/cms-media/pom.xml index 00c23b740..d6ea9d0b0 100644 --- a/cms-media/pom.xml +++ b/cms-media/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-media jar diff --git a/cms-sandbox/pom.xml b/cms-sandbox/pom.xml index 04c96c9a0..7d6224783 100644 --- a/cms-sandbox/pom.xml +++ b/cms-sandbox/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-sandbox pom diff --git a/cms-server/hosts/demo2/content/index.md b/cms-server/hosts/demo2/content/index.md index 7addcf52e..4fd279cae 100644 --- a/cms-server/hosts/demo2/content/index.md +++ b/cms-server/hosts/demo2/content/index.md @@ -4,3 +4,7 @@ template: start.html --- Test Page + +{% if DEV_MODE %} +# It's the dev mode! +{% endif %} \ No newline at end of file diff --git a/cms-server/hosts/demo2/extensions/test.extension.js b/cms-server/hosts/demo2/extensions/test.extension.js index 7b705cf6c..e69de29bb 100644 --- a/cms-server/hosts/demo2/extensions/test.extension.js +++ b/cms-server/hosts/demo2/extensions/test.extension.js @@ -1,38 +0,0 @@ -import { UTF_8 } from 'system/charsets.mjs'; -import { $http } from 'system/http.mjs'; -import { $template } from 'system/template.mjs'; -import { getLogger } from 'system/logging.mjs'; -import { $hooks } from 'system/hooks.mjs'; - - -const logger = getLogger("extensions"); -logger.info("debug log from test extension"); - -// callable via /extensions/test -$http.get("/test", (request, response) => { - response.addHeader("Content-Type", "text/html; charset=utf-8") - response.write("ich bin einen test extension!öäü", UTF_8) -}) -$http.post("/form", (request, response) => { - const body = JSON.parse(request.getBody(UTF_8)) - console.log("body", request.getBody(UTF_8)) - console.log(body.form) - response.addHeader("Content-Type", "text/html; charset=utf-8") - response.write("ich bin einen test extension!öäü", UTF_8) -}) - - - -$template.registerTemplateFunction( - "getHello", - (name) => "Hello " + name + "!" -) - -$hooks.registerAction( - "test/content", - (context) => { - return ` -
Test Content
- `; - } -); \ No newline at end of file diff --git a/cms-server/hosts/demo2/site.yaml b/cms-server/hosts/demo2/site.yaml index 2a13a06c8..38fec9708 100644 --- a/cms-server/hosts/demo2/site.yaml +++ b/cms-server/hosts/demo2/site.yaml @@ -5,4 +5,9 @@ template: engine: pebble modules: active: - - pebble-module \ No newline at end of file + - pebble-module +content: + pipeline: + - template + - markdown + - shortcode \ No newline at end of file diff --git a/cms-server/hosts/demo2/templates/start.html b/cms-server/hosts/demo2/templates/start.html index 9f7d88660..724c798aa 100644 --- a/cms-server/hosts/demo2/templates/start.html +++ b/cms-server/hosts/demo2/templates/start.html @@ -1,3 +1,7 @@ +
+{{ content | raw}} +
+

featured

{% set news = query.create("/blog").where('featured', true).get() %} {% for entry in news %} @@ -16,8 +20,6 @@

featured with in with operator

{{entry.name}}

{% endfor %} -{{ getHello.apply("thorsten") }} - {{ messages.getLabel("labels", "contact.form.title", ['test']) }}

test hooks

diff --git a/cms-server/pom.xml b/cms-server/pom.xml index a6a0f9249..8d5ffa55d 100644 --- a/cms-server/pom.xml +++ b/cms-server/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 cms-server jar diff --git a/cms-server/src/main/java/com/condation/cms/request/RequestContextFactory.java b/cms-server/src/main/java/com/condation/cms/request/RequestContextFactory.java index 03bf47bf6..3fe24525c 100644 --- a/cms-server/src/main/java/com/condation/cms/request/RequestContextFactory.java +++ b/cms-server/src/main/java/com/condation/cms/request/RequestContextFactory.java @@ -40,6 +40,7 @@ import com.condation.cms.api.feature.features.ServerPropertiesFeature; import com.condation.cms.api.feature.features.SiteMediaServiceFeature; import com.condation.cms.api.feature.features.SitePropertiesFeature; +import com.condation.cms.api.feature.features.TemplateEngineFeature; import com.condation.cms.api.feature.features.ThemeFeature; import com.condation.cms.api.hooks.HookSystem; import com.condation.cms.api.mapper.ContentNodeMapper; @@ -47,6 +48,7 @@ import com.condation.cms.api.media.MediaService; import com.condation.cms.api.model.Parameter; import com.condation.cms.api.request.RequestContext; +import com.condation.cms.api.template.TemplateEngine; import com.condation.cms.api.theme.Theme; import com.condation.cms.api.utils.HTTPUtil; import com.condation.cms.api.utils.RequestUtil; @@ -109,6 +111,7 @@ public RequestContext createContext () { requestContext.add(HookSystemFeature.class, new HookSystemFeature(injector.getInstance(HookSystem.class))); requestContext.add(MarkdownRendererFeature.class, new MarkdownRendererFeature(injector.getInstance(MarkdownRenderer.class))); + requestContext.add(TemplateEngineFeature.class, new TemplateEngineFeature(injector.getInstance(TemplateEngine.class))); return requestContext; } @@ -134,7 +137,7 @@ public void initContext (RequestContext requestContext, Request request) throws RenderContext renderContext = new RenderContext( markdownRenderer, - initShortCodes(requestExtensions, requestContext), + initShortCodes(requestContext), theme); requestContext.add(RenderContext.class, renderContext); @@ -149,7 +152,7 @@ private HookSystem initHookSystem(RequestContext requestContext) { return hookSystem; } - private ShortCodes initShortCodes(RequestExtensions requestExtensions, RequestContext requestContext) { + private ShortCodes initShortCodes(RequestContext requestContext) { Map> codes = new HashMap<>(); injector.getInstance(ModuleManager.class).extensions(RegisterShortCodesExtensionPoint.class) @@ -160,53 +163,6 @@ private ShortCodes initShortCodes(RequestExtensions requestExtensions, RequestCo return new ShortCodes(wrapper.getShortCodes()); } - - - private RequestContext init(RequestContext requestContext) throws IOException { - - var theme = injector.getInstance(Theme.class); - var markdownRenderer = injector.getInstance(MarkdownRenderer.class); - var extensionManager = injector.getInstance(ExtensionManager.class); - var siteProperties = injector.getInstance(SiteProperties.class); - var siteMediaService = injector.getInstance(MediaService.class); - - requestContext.add(InjectorFeature.class, new InjectorFeature(injector)); - - requestContext.add(ThemeFeature.class, new ThemeFeature(theme)); - requestContext.add(ContentParserFeature.class, new ContentParserFeature(injector.getInstance(ContentParser.class))); - requestContext.add(ContentNodeMapperFeature.class, new ContentNodeMapperFeature(injector.getInstance(ContentNodeMapper.class))); - if (ServerContext.IS_DEV) { - requestContext.add(IsDevModeFeature.class, new IsDevModeFeature()); - } - requestContext.add(ConfigurationFeature.class, new ConfigurationFeature(injector.getInstance(Configuration.class))); - requestContext.add(ServerPropertiesFeature.class, new ServerPropertiesFeature( - injector.getInstance(Configuration.class) - .get(ServerConfiguration.class).serverProperties() - )); - requestContext.add(SitePropertiesFeature.class, new SitePropertiesFeature(siteProperties)); - requestContext.add(SiteMediaServiceFeature.class, new SiteMediaServiceFeature(siteMediaService)); - - requestContext.add(ServerHooks.class, new ServerHooks(requestContext)); - requestContext.add(TemplateHooks.class, new TemplateHooks(requestContext)); - requestContext.add(DBHooks.class, new DBHooks(requestContext)); - requestContext.add(ContentHooks.class, new ContentHooks(requestContext)); - - requestContext.add(HookSystemFeature.class, new HookSystemFeature(setupHookSystem(requestContext))); - - RequestExtensions requestExtensions = extensionManager.newContext(theme, requestContext); - - RenderContext renderContext = new RenderContext( - markdownRenderer, - createShortCodes(requestExtensions, requestContext), - theme); - requestContext.add(RenderContext.class, renderContext); - requestContext.add(MarkdownRendererFeature.class, new MarkdownRendererFeature(renderContext.markdownRenderer())); - - requestContext.add(RequestExtensions.class, requestExtensions); - - return requestContext; - } - public RequestContext create() throws IOException { var theme = injector.getInstance(Theme.class); @@ -237,38 +193,31 @@ public RequestContext create() throws IOException { requestContext.add(DBHooks.class, new DBHooks(requestContext)); requestContext.add(ContentHooks.class, new ContentHooks(requestContext)); - requestContext.add(HookSystemFeature.class, new HookSystemFeature(setupHookSystem(requestContext))); + requestContext.add(HookSystemFeature.class, new HookSystemFeature(setupHookSystem())); RequestExtensions requestExtensions = extensionManager.newContext(theme, requestContext); RenderContext renderContext = new RenderContext( markdownRenderer, - createShortCodes(requestExtensions, requestContext), + createShortCodes(requestContext), theme); requestContext.add(RenderContext.class, renderContext); - requestContext.add(MarkdownRendererFeature.class, new MarkdownRendererFeature(renderContext.markdownRenderer())); + requestContext.add(MarkdownRendererFeature.class, new MarkdownRendererFeature(markdownRenderer)); + requestContext.add(TemplateEngineFeature.class, new TemplateEngineFeature(injector.getInstance(TemplateEngine.class))); requestContext.add(RequestExtensions.class, requestExtensions); return requestContext; } - public RequestContext create( - Request request) throws IOException { - -// var uri = request.getHttpURI().getPath(); - var uri = RequestUtil.getContentPath(request); - var queryParameters = HTTPUtil.queryParameters(request.getHttpURI().getQuery()); - - return create(request.getContext().getContextPath(), uri, queryParameters, Optional.of(request)); - } - + // used public RequestContext create( String contextPath, String uri, Map> queryParameters) throws IOException { return create(contextPath, uri, queryParameters, Optional.empty()); } + // used public RequestContext create( String contextPath, String uri, Map> queryParameters, Optional request) throws IOException { @@ -292,7 +241,7 @@ public RequestContext create( * @param requestContext * @return */ - private HookSystem setupHookSystem(RequestContext requestContext) { + private HookSystem setupHookSystem() { var hookSystem = injector.getInstance(HookSystem.class); var moduleManager = injector.getInstance(ModuleManager.class); moduleManager.extensions(HookSystemRegisterExtentionPoint.class).forEach(extensionPoint -> extensionPoint.register(hookSystem)); @@ -300,7 +249,7 @@ private HookSystem setupHookSystem(RequestContext requestContext) { return hookSystem; } - private ShortCodes createShortCodes(RequestExtensions requestExtensions, RequestContext requestContext) { + private ShortCodes createShortCodes(RequestContext requestContext) { Map> codes = new HashMap<>(); injector.getInstance(ModuleManager.class).extensions(RegisterShortCodesExtensionPoint.class) diff --git a/cms-server/src/test/java/com/condation/cms/TestHelper.java b/cms-server/src/test/java/com/condation/cms/TestHelper.java index ea28d6ce0..43559bd56 100644 --- a/cms-server/src/test/java/com/condation/cms/TestHelper.java +++ b/cms-server/src/test/java/com/condation/cms/TestHelper.java @@ -25,7 +25,10 @@ import com.condation.cms.api.ServerProperties; import com.condation.cms.api.SiteProperties; +import com.condation.cms.api.configuration.Configuration; +import com.condation.cms.api.configuration.configs.SiteConfiguration; import com.condation.cms.api.content.ContentParser; +import com.condation.cms.api.feature.features.ConfigurationFeature; import com.condation.cms.api.feature.features.ContentNodeMapperFeature; import com.condation.cms.api.feature.features.ContentParserFeature; import com.condation.cms.api.feature.features.HookSystemFeature; @@ -67,6 +70,8 @@ public static RequestContext requestContext() { public static RequestContext requestContext(String uri) { var markdownRenderer = TestHelper.getRenderer(); RequestContext context = new RequestContext(); + + context.add(RequestFeature.class, new RequestFeature(uri, Map.of())); context.add(RequestExtensions.class, new RequestExtensions(null)); context.add(RenderContext.class, new RenderContext(markdownRenderer, new ShortCodes(Map.of()), DefaultTheme.EMPTY)); @@ -79,9 +84,17 @@ public static RequestContext requestContext(String uri) { context.add(MarkdownRendererFeature.class, new MarkdownRendererFeature(null)); context.add(ContentParserFeature.class, new ContentParserFeature(null)); - context.add(SitePropertiesFeature.class, new SitePropertiesFeature(new SiteProperties(Map.of( + final SiteProperties siteProperties = new SiteProperties(Map.of( "context_path", "/" - )))); + )); + context.add(SitePropertiesFeature.class, new SitePropertiesFeature(siteProperties)); + + Configuration config = Mockito.mock(Configuration.class); + SiteConfiguration siteConfig = Mockito.mock(SiteConfiguration.class); + Mockito.when(siteConfig.siteProperties()).thenReturn(siteProperties); + Mockito.when(config.get(SiteConfiguration.class)).thenReturn(siteConfig); + context.add(ConfigurationFeature.class, new ConfigurationFeature(config)); + context.add(ServerPropertiesFeature.class, new ServerPropertiesFeature(new ServerProperties(Map.of( )))); diff --git a/cms-server/themes/demo/extensions/theme.extension.js b/cms-server/themes/demo/extensions/theme.extension.js index 49c1d93fa..798b1ff7b 100644 --- a/cms-server/themes/demo/extensions/theme.extension.js +++ b/cms-server/themes/demo/extensions/theme.extension.js @@ -1,6 +1,10 @@ -import { $shortcodes } from 'system/shortcodes.mjs'; +import { $hooks } from 'system/hooks.mjs'; -$shortcodes.register( - "theme_name", - (params) => `Hello, I'm your default theme.` -) \ No newline at end of file + +$hooks.registerAction("system/content/shortcodes", (context) => { + context.arguments().get("shortCodes").put( + "theme_name", + (params) => `Hello, I'm your demo theme.` + ) + return null; +}) \ No newline at end of file diff --git a/cms-server/themes/test/extensions/theme.extension.js b/cms-server/themes/test/extensions/theme.extension.js index 49c1d93fa..d97089edd 100644 --- a/cms-server/themes/test/extensions/theme.extension.js +++ b/cms-server/themes/test/extensions/theme.extension.js @@ -1,6 +1,10 @@ -import { $shortcodes } from 'system/shortcodes.mjs'; +import { $hooks } from 'system/hooks.mjs'; -$shortcodes.register( - "theme_name", - (params) => `Hello, I'm your default theme.` -) \ No newline at end of file + +$hooks.registerAction("system/content/shortcodes", (context) => { + context.arguments().get("shortCodes").put( + "theme_name", + (params) => `Hello, I'm your test theme.` + ) + return null; +}) \ No newline at end of file diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index b7a6b3c58..f74716159 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 integration-tests jar diff --git a/modules-framework/api/pom.xml b/modules-framework/api/pom.xml index 60443b509..909126e47 100644 --- a/modules-framework/api/pom.xml +++ b/modules-framework/api/pom.xml @@ -4,7 +4,7 @@ com.condation.cms.module.framework module-framework - 6.1.1 + 6.2.0 modules-api jar diff --git a/modules-framework/manager/pom.xml b/modules-framework/manager/pom.xml index 6b15db815..4a6429e41 100644 --- a/modules-framework/manager/pom.xml +++ b/modules-framework/manager/pom.xml @@ -4,7 +4,7 @@ com.condation.cms.module.framework module-framework - 6.1.1 + 6.2.0 modules-manager jar diff --git a/modules-framework/pom.xml b/modules-framework/pom.xml index b1f292e5f..8f6e754b2 100644 --- a/modules-framework/pom.xml +++ b/modules-framework/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 com.condation.cms.module.framework module-framework diff --git a/modules/example-module/pom.xml b/modules/example-module/pom.xml index 91288473a..e9a5f25e7 100644 --- a/modules/example-module/pom.xml +++ b/modules/example-module/pom.xml @@ -4,7 +4,7 @@ com.condation.cms.modules cms-modules - 6.1.1 + 6.2.0 example-module jar diff --git a/modules/pom.xml b/modules/pom.xml index e322b51da..f786268fd 100644 --- a/modules/pom.xml +++ b/modules/pom.xml @@ -4,7 +4,7 @@ com.condation.cms cms-parent - 6.1.1 + 6.2.0 com.condation.cms.modules cms-modules diff --git a/pom.xml b/pom.xml index dc79feab5..922730670 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.condation.cms cms-parent - 6.1.1 + 6.2.0 pom UTF-8