Freemarker support for content items and ccm-cms-types-article

* getting template for content item for theme manifest data
* Freemarker macros for
** title for content item
** lead text of ccm-cms-types-article
** main text of ccm-cms-types-article



git-svn-id: https://svn.libreccm.org/ccm/trunk@5840 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2019-02-26 18:45:10 +00:00
parent 42ef378bff
commit f71d08a246
5 changed files with 175 additions and 5 deletions

View File

@ -0,0 +1,18 @@
<#ftl ns_prefixes={
"bebop":"http://www.arsdigita.com/bebop/1.0",
"cms":"http://www.arsdigita.com/cms/1.0",
"nav":"http://ccm.redhat.com/navigation",
"ui": "http://www.arsdigita.com/ui/1.0"}
>
<#macro lead item>
<#if (item["./lead"]?size > 0)>
${item["./lead"]}
</#if>
</#macro>
<#macro main item>
<#if (item["./textAsset"]?size > 0)>
${item["./textAsset/content"]}
</#if>
</#macro>

View File

@ -112,3 +112,9 @@
</#if>
</#macro>
<#macro greetingItem>
<#nested model["/bebop:page/nav:greetingItem/cms:item"]>
</#macro>

View File

@ -25,13 +25,13 @@ public class ContentItemTemplate {
@XmlElement(name = "view", namespace = THEMES_XML_NS)
private ContentItemViews view;
@XmlElement(name = "contenttype", namespace = THEMES_XML_NS)
@XmlElement(name = "contentType", namespace = THEMES_XML_NS)
private String contentType;
@XmlElement(name = "style", namespace = THEMES_XML_NS)
private String style;
@XmlElement(name = "contentsection", namespace = THEMES_XML_NS)
@XmlElement(name = "contentSection", namespace = THEMES_XML_NS)
private String contentSection;
@XmlElement(name = "category", namespace = THEMES_XML_NS)

View File

@ -5,14 +5,22 @@
*/
package org.libreccm.theming;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@XmlEnum
public enum ContentItemViews {
@XmlEnumValue(value = "detail")
DETAIL,
@XmlEnumValue(value = "greetingItem")
GREETING_ITEM,
@XmlEnumValue(value = "list")
LIST,
@XmlEnumValue(value = "portletItemf")
PORTLET_ITEM,
}

View File

@ -18,8 +18,12 @@ import freemarker.cache.TemplateLoader;
import freemarker.cache.WebappTemplateLoader;
import freemarker.ext.dom.NodeModel;
import freemarker.template.Configuration;
import freemarker.template.SimpleScalar;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateScalarModel;
import org.libreccm.theming.manifest.ThemeManifest;
import org.libreccm.theming.manifest.ThemeManifestUtil;
import org.w3c.dom.NamedNodeMap;
@ -30,6 +34,7 @@ import java.io.InputStream;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
@ -195,6 +200,8 @@ public class FreeMarkerPresentationManager implements PresentationManager {
// themePath);
configuration.setTemplateLoader(templateLoader);
configuration.setDefaultEncoding("UTF-8");
configuration.setSharedVariable("getContentItemTemplate",
new GetContentItemTemplate(templates));
final Map<String, Object> data = new HashMap<>();
@ -350,4 +357,135 @@ public class FreeMarkerPresentationManager implements PresentationManager {
&& template.getApplicationClass().equals(applicationClass);
}
private class GetContentItemTemplate implements TemplateMethodModelEx {
private final Templates templates;
public GetContentItemTemplate(final Templates templates) {
this.templates = templates;
}
@Override
public Object exec(final List list) throws TemplateModelException {
if (list.isEmpty()) {
throw new IllegalArgumentException("GetContentItemTemplate "
+ "requires the following parameters: "
+ "item: NodeModel, view: String, style: String");
}
final Object arg0 = list.get(0);
if (!(arg0 instanceof NodeModel)) {
throw new IllegalArgumentException(
"Parameter item must be a NodeModel.");
}
final NodeModel itemModel = (NodeModel) arg0;
final String view;
if (list.size() >= 2) {
view = ((TemplateScalarModel) list.get(1))
.getAsString()
.toUpperCase(Locale.ROOT);
} else {
view = "DETAIL";
}
final ContentItemViews contentItemView = ContentItemViews
.valueOf(view);
final String style;
if (list.size() >= 3) {
style = ((TemplateScalarModel) list.get(2)).getAsString();
} else {
style = "";
}
return findContentItemTemplate(templates,
itemModel,
contentItemView,
style);
}
}
private String findContentItemTemplate(
final Templates templates,
final NodeModel itemModel,
final ContentItemViews view,
final String style) throws TemplateModelException {
final String contentType = ((TemplateScalarModel) itemModel
.get("objectType"))
.getAsString();
final Optional<ContentItemTemplate> forTypeViewAndStyle = templates
.getContentItems()
.stream()
.filter(template -> filterContentItemTemplate(template,
contentType,
view,
style))
.findAny();
if (forTypeViewAndStyle.isPresent()) {
return forTypeViewAndStyle.get().getTemplate();
} else {
final Optional<ContentItemTemplate> forTypeAndView = templates
.getContentItems()
.stream()
.filter(template -> filterContentItemTemplate(template,
contentType,
view))
.findAny();
if (forTypeAndView.isPresent()) {
return forTypeAndView.get().getTemplate();
} else {
return templates.getDefaultContentItemsTemplate();
}
}
}
private boolean filterContentItemTemplate(
final ContentItemTemplate template,
final String contentType,
final ContentItemViews view) {
final ContentItemViews templateView;
if (template.getView() == null) {
templateView = ContentItemViews.DETAIL;
} else {
templateView = template.getView();
}
return template.getContentType().equals(contentType)
&& templateView == view;
}
private boolean filterContentItemTemplate(
final ContentItemTemplate template,
final String contentType,
final ContentItemViews view,
final String style) {
final ContentItemViews templateView;
if (template.getView() == null) {
templateView = ContentItemViews.DETAIL;
} else {
templateView = template.getView();
}
final String templateStyle;
if (template.getStyle() == null) {
templateStyle = "";
} else {
templateStyle = template.getStyle();
}
return template.getContentType().equals(contentType)
&& templateView == view
&& templateStyle.equals(style);
}
}