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("&lt;");
+                       } else if(c == '>') {
+                               sb.append("&gt;");
+                       } else if(c == '&') {
+                               sb.append("&amp;");
+                       } 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>


Reply via email to