Author: bdelacretaz
Date: Wed Jun 25 09:15:56 2008
New Revision: 671596
URL: http://svn.apache.org/viewvc?rev=671596&view=rev
Log:
SLING-558 - breadcrumbs and child node links added to default HTML rendering
Added:
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlContentRenderer.java
(with props)
Modified:
incubator/sling/trunk/scripting/jst/pom.xml
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlCodeGenerator.java
incubator/sling/trunk/scripting/jst/src/main/resources/xslt/script-transform.xsl
incubator/sling/trunk/scripting/jst/src/test/resources/htmlcode/htmlcode1.expected.html
Modified: incubator/sling/trunk/scripting/jst/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/jst/pom.xml?rev=671596&r1=671595&r2=671596&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/jst/pom.xml (original)
+++ incubator/sling/trunk/scripting/jst/pom.xml Wed Jun 25 09:15:56 2008
@@ -65,7 +65,6 @@
<Private-Package>
org.apache.sling.scripting.jst,
org.apache.sling.scripting.javascript.io.*,
- org.apache.sling.servlets.get.helpers.*,
org.cyberneko.html.*,
org.apache.xerces.*,
org.w3c.dom.*,
@@ -122,12 +121,6 @@
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
- <artifactId>org.apache.sling.servlets.get</artifactId>
- <version>${pom.version}</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.json</artifactId>
<version>${pom.version}</version>
<scope>provided</scope>
Modified:
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlCodeGenerator.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlCodeGenerator.java?rev=671596&r1=671595&r2=671596&view=diff
==============================================================================
---
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlCodeGenerator.java
(original)
+++
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlCodeGenerator.java
Wed Jun 25 09:15:56 2008
@@ -40,7 +40,6 @@
import org.apache.sling.api.wrappers.SlingRequestPaths;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.jcr.JsonItemWriter;
-import org.apache.sling.servlets.get.helpers.HtmlRendererServlet;
import org.cyberneko.html.parsers.DOMParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -50,7 +49,7 @@
/** Generates HTML code for JST templates */
class HtmlCodeGenerator {
private final List<String> libraryScripts = new LinkedList<String>();
- private final HtmlRendererServlet htmlRenderer;
+ private final HtmlContentRenderer htmlRenderer;
private final Logger log = LoggerFactory.getLogger(getClass());
// TODO should be configurable or synced with the actual location
@@ -65,7 +64,7 @@
public HtmlCodeGenerator() {
libraryScripts.add(SLING_JS_PATH);
- htmlRenderer = new HtmlRendererServlet();
+ htmlRenderer = new HtmlContentRenderer();
}
/** Generate HTML code for the given request and script path */
@@ -96,7 +95,7 @@
final StringWriter defaultRendering = new StringWriter();
if(n!=null) {
final PrintWriter pw = new PrintWriter(defaultRendering);
- htmlRenderer.render(pw, r, n);
+ htmlRenderer.render(pw, r, n, pageTitle);
pw.flush();
}
Added:
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlContentRenderer.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlContentRenderer.java?rev=671596&view=auto
==============================================================================
---
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlContentRenderer.java
(added)
+++
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlContentRenderer.java
Wed Jun 25 09:15:56 2008
@@ -0,0 +1,121 @@
+package org.apache.sling.scripting.jst;
+
+import java.io.PrintWriter;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+
+import org.apache.sling.api.resource.Resource;
+
+public class HtmlContentRenderer {
+
+ // TODO make this configurable
+ public static final String BREADCRUMB_PREFIX = "/content";
+
+ public void render(PrintWriter pw, Resource r, Node n, String title)
+ throws RepositoryException {
+ pw.print("<h1 class='title'>");
+ pw.print(escape(title));
+ pw.println("</h1>");
+
+ renderBreadcrumbs(pw, n);
+ renderChildNodes(pw, n);
+
+ for (PropertyIterator pi = n.getProperties(); pi.hasNext();) {
+ final Property p = pi.nextProperty();
+ if(displayProperty(p.getName())) {
+ renderPropertyValue(pw, p);
+ }
+ }
+ }
+
+ protected void renderBreadcrumbs(PrintWriter pw, Node n) throws
RepositoryException {
+ final String path = n.getPath();
+ pw.println("<div class='breadcrumbs'>");
+ if(path.startsWith(BREADCRUMB_PREFIX)) {
+ final String [] crumbs =
path.substring(BREADCRUMB_PREFIX.length() + 1).split("/");
+ // omit the last path element when iterating, it's this
node's name
+ for(int i=0; i < crumbs.length - 1; i++) {
+ final String c = crumbs[i];
+ pw.print("<a href='");
+ pw.print(getDotDots(i, crumbs.length));
+ pw.print(c);
+ pw.print("'>");
+ pw.print(c);
+ pw.println("</a>");
+ }
+ }
+ pw.println("</div>");
+ }
+
+ protected String getDotDots(int start, int len) {
+ final StringBuffer sb = new StringBuffer();
+ for(int i=start; i < len - 1; i++) {
+ sb.append("../");
+ }
+ return sb.toString();
+ }
+
+ protected void renderChildNodes(PrintWriter pw, Node parent) throws
RepositoryException {
+ pw.println("<div class='childnodes'>");
+ final String prefix = parent.getName() + "/";
+ final NodeIterator it = parent.getNodes();
+ while(it.hasNext()) {
+ final Node kid = it.nextNode();
+ pw.print("<a href='");
+ pw.print(prefix);
+ pw.print(kid.getName());
+ pw.print("'>");
+ pw.print(kid.getName());
+ pw.println("</a>");
+ }
+ pw.println("</div>");
+ }
+
+ protected void renderPropertyValue(PrintWriter pw, Property p)
+ throws RepositoryException {
+
+ pw.print("<div class='" + p.getName() + "'>");
+
+ if (p.getDefinition().isMultiple()) {
+ Value[] values = p.getValues();
+ pw.print('[');
+ for (int i = 0; i < values.length; i++) {
+ if (i > 0) {
+ pw.print(", ");
+ }
+ pw.print(escape(values[i].getString()));
+ }
+ pw.print(']');
+ } else {
+ pw.print(escape(p.getValue().getString()));
+ }
+
+ pw.println("</div>");
+ }
+
+ protected String escape(String str) {
+ final StringBuffer sb = new StringBuffer();
+ for(int i = 0; i < str.length(); i++) {
+ final char c = str.charAt(i);
+ if(c == '<') {
+ sb.append("<");
+ } else if(c == '>') {
+ sb.append(">");
+ } else if(c == '&') {
+ sb.append("&");
+ } else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ protected boolean displayProperty(String name) {
+ return !name.startsWith("jcr:") && !name.startsWith("sling:");
+ }
+}
Propchange:
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlContentRenderer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
incubator/sling/trunk/scripting/jst/src/main/java/org/apache/sling/scripting/jst/HtmlContentRenderer.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified:
incubator/sling/trunk/scripting/jst/src/main/resources/xslt/script-transform.xsl
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/jst/src/main/resources/xslt/script-transform.xsl?rev=671596&r1=671595&r2=671596&view=diff
==============================================================================
---
incubator/sling/trunk/scripting/jst/src/main/resources/xslt/script-transform.xsl
(original)
+++
incubator/sling/trunk/scripting/jst/src/main/resources/xslt/script-transform.xsl
Wed Jun 25 09:15:56 2008
@@ -68,11 +68,11 @@
<!-- replace body with default rendering + script reference -->
<xsl:template match="body|BODY" mode="inner">
<div id="JstDefaultRendering">
- <xsl:text>
- </xsl:text>
+<xsl:text>
+</xsl:text>
<xsl:value-of select="$defaultRendering" disable-output-escaping="yes" />
- <xsl:text>
- </xsl:text>
+<xsl:text>
+</xsl:text>
</div>
<script language="javascript">
var e = document.getElementById("JstDefaultRendering");
Modified:
incubator/sling/trunk/scripting/jst/src/test/resources/htmlcode/htmlcode1.expected.html
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/jst/src/test/resources/htmlcode/htmlcode1.expected.html?rev=671596&r1=671595&r2=671596&view=diff
==============================================================================
---
incubator/sling/trunk/scripting/jst/src/test/resources/htmlcode/htmlcode1.expected.html
(original)
+++
incubator/sling/trunk/scripting/jst/src/test/resources/htmlcode/htmlcode1.expected.html
Wed Jun 25 09:15:56 2008
@@ -8,14 +8,18 @@
<script language="javascript">var
currentNode={"title":"test.title","desc":"test.desc"};</script>
</head>
<body>
- <div id="JstDefaultRendering">
- <h1>Node dumped by HtmlRendererServlet</h1>
- <p>Node path: <b>/foo/node</b></p>
- <p>Resource metadata: <b>{sling.resolutionPath=/foo/node}</b></p>
- <h2>Node properties</h2>
- title: <b>test.title</b><br/>desc: <b>test.desc</b><br/>
- </div>
- <script language="javascript">
+
+ <div id="JstDefaultRendering">
+ <h1 class='title'>test.title</h1>
+ <div class='breadcrumbs'>
+ </div>
+ <div class='childnodes'>
+ </div>
+ <div class='title'>test.title</div>
+ <div class='desc'>test.desc</div>
+ </div>
+
+<script language="javascript">
var e = document.getElementById("JstDefaultRendering");
e.parentNode.removeChild(e);
</script>