This is an automated email from the ASF dual-hosted git repository.
bdelacretaz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
The following commit(s) were added to refs/heads/master by this push:
new 40e01b0 SLING-9950 - nested renderers
40e01b0 is described below
commit 40e01b0484b4ed1819be98a7aeb7bd943f772929
Author: Bertrand Delacretaz <[email protected]>
AuthorDate: Fri Dec 4 15:19:41 2020 +0100
SLING-9950 - nested renderers
---
.../openwhisk-rendering/content-renderer.js | 115 ++++++++++++++++-----
.../openwhisk-rendering/http-rendering-proxy.js | 6 +-
2 files changed, 97 insertions(+), 24 deletions(-)
diff --git a/remote-content-api/openwhisk-rendering/content-renderer.js
b/remote-content-api/openwhisk-rendering/content-renderer.js
index 3f7f505..f7acc22 100644
--- a/remote-content-api/openwhisk-rendering/content-renderer.js
+++ b/remote-content-api/openwhisk-rendering/content-renderer.js
@@ -34,10 +34,21 @@ class HandlebarsRenderer {
var renderers = {}
+var JUST_RECURSE_RENDERER = new HandlebarsRenderer('\
+ {{#each this}}\
+ <div class="nested">\
+ {{{renderObject this}}}\
+ </div>\n\
+ {{/each}}\
+ ')
+
var DEFAULT_RENDERER = new HandlebarsRenderer('\
- <h3>Default renderer</h3>\
- <b>Path</b>:{{path}}<br>\
- <b>sling:resourceType</b>:{{sling:resourceType}}<br>\
+ <em>Default renderer for resourceType
<b>{{sling:resourceType}}</b></em><br>\n\
+ {{#each this}}\
+ <div class="nested">\
+ {{{renderObject this}}}\
+ </div>\n\
+ {{/each}}\
')
renderers["samples/article"] = new HandlebarsRenderer('\
@@ -70,6 +81,7 @@ class WkndPageRenderer extends HandlebarsRenderer {
render(content) {
content.rendererInfo = { resourceTypes:new Set() }
+ content.omitdefaultRendering = true
this.collectResourceTypes(content, content.rendererInfo.resourceTypes)
return super.render(content)
}
@@ -77,38 +89,95 @@ class WkndPageRenderer extends HandlebarsRenderer {
renderers["wknd/components/page"] = new WkndPageRenderer('\
<h3>WKND page renderer</h3>\n\
<div>tags: {{jcr:content.cq:tags}}</div>\n\
- <h4>We will need renderers for the following resource types, found in the
page content:</h4>\n\
+ <h4>We need renderers for the following resource types, found in the page
content:</h4>\n\
<ul>\n\
{{#each rendererInfo.resourceTypes}}\n\
<li>{{this}}</li>\n\
{{/each}}\
- </ul></div>\n\
+ </ul>\n\
+ \
+ {{#each this}}\
+ <div class="nested">\
+ {{{renderObject this}}}\
+ </div>\n\
+ {{/each}}\
+ \
');
-class ContentRenderer {
- info() {
- return `The ContentRenderer only supports a limited set of
sling:resourceType values: ${Object.keys(renderers)}`
+renderers["wknd/components/image"] = new HandlebarsRenderer('\
+ The image from <b>{{fileReference}}</b> comes here\n\
+ ')
+
+renderers["wknd/components/contentfragment"] = new HandlebarsRenderer('\
+ Content Fragment <b>{{fragmentPath}}</b> comes here\n\
+ {{#if text}}\n\
+ <blockquote>{{text}}</blockquote></div>\n\
+ {{/if}}\n\
+ ')
+
+renderers["wknd/components/image-list"] = new HandlebarsRenderer('\
+ Image list with tags <b>{{tags}}</b>\
+')
+
+class NamedComponentRenderer extends HandlebarsRenderer {
+ constructor(name) {
+ super(`\
+ Rendering a <b>${name}</b> component\
+ {{#each this}}\
+ <div class="nested">\
+ {{{renderObject this}}}\
+ </div>\n\
+ {{/each}}\
+ `)
}
+}
+
+[
+ "wknd/components/breadcrumb",
+].forEach(rt => renderers[rt] = JUST_RECURSE_RENDERER);
- getResourceType(content, supertype) {
- var result = null;
- var key = supertype ? "sling:resourceSuperType" : "sling:resourceType"
- result = content[key]
- if(!result && content["jcr:content"]) {
- result = content["jcr:content"][key]
+[
+ "wknd/components/container",
+ "wknd/components/grid",
+ "wknd/components/tabs",
+].forEach(rt => renderers[rt] = new NamedComponentRenderer(rt));
+
+function renderObject(content) {
+ if(typeof content != "object") {
+ return
+ }
+ var renderer = renderers[getResourceType(content, false)]
+ if(!renderer) {
+ renderer = renderers[getResourceType(content, true)]
+ }
+ if(!renderer) {
+ if(content["jcr:content"]) {
+ renderer = JUST_RECURSE_RENDERER
+ } else if(!getResourceType(content, false) &&
!getResourceType(content, true)) {
+ renderer = JUST_RECURSE_RENDERER
+ } else {
+ renderer = DEFAULT_RENDERER
}
- return result;
+ }
+ return renderer.render(content)
+}
+
+Handlebars.registerHelper("renderObject", renderObject)
+
+function getResourceType(content, supertype) {
+ var result = null;
+ var key = supertype ? "sling:resourceSuperType" : "sling:resourceType"
+ result = content[key]
+ return result;
+}
+
+class ContentRenderer {
+ info() {
+ return `The ContentRenderer only supports a limited set of
sling:resourceType values: ${Object.keys(renderers)}`
}
render(content) {
- var renderer = renderers[this.getResourceType(content, false)]
- if(!renderer) {
- renderer = renderers[this.getResourceType(content, true)]
- }
- if(!renderer) {
- renderer = DEFAULT_RENDERER
- }
- return renderer.render(content)
+ return renderObject(content)
}
}
diff --git a/remote-content-api/openwhisk-rendering/http-rendering-proxy.js
b/remote-content-api/openwhisk-rendering/http-rendering-proxy.js
index 2416687..377e77c 100644
--- a/remote-content-api/openwhisk-rendering/http-rendering-proxy.js
+++ b/remote-content-api/openwhisk-rendering/http-rendering-proxy.js
@@ -40,7 +40,8 @@ var templateSource = '\
ul {\
list-style-type: none;\
}\
- .navigation li {\
+ .navigation li,\
+ .content li {\
margin:0;\
padding:0;\
}\
@@ -58,6 +59,9 @@ var templateSource = '\
.raw pre {\
background-color: #EEE;\
}\
+ .nested {\
+ margin-left:1em;\
+ }\
</style>\
</head>\
<body> \