From: <tri...@us...> - 2008-06-03 18:58:41
|
Revision: 48 http://staticwiki.svn.sourceforge.net/staticwiki/?rev=48&view=rev Author: triathlon98 Date: 2008-06-03 11:58:38 -0700 (Tue, 03 Jun 2008) Log Message: ----------- SW-5 create table of contents for header lines Modified Paths: -------------- trunk/staticwiki-editor/src/site/wiki/index.wiki trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/HeaderLineHandler.java trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/LineRenderer.java trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/WikiLineContext.java trunk/staticwiki-renderer/src/test/java/org/staticwiki/wiki/WikiFactoryTest.java Added Paths: ----------- trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/WikiLineFlushHandler.java Modified: trunk/staticwiki-editor/src/site/wiki/index.wiki =================================================================== --- trunk/staticwiki-editor/src/site/wiki/index.wiki 2008-05-22 19:25:46 UTC (rev 47) +++ trunk/staticwiki-editor/src/site/wiki/index.wiki 2008-06-03 18:58:38 UTC (rev 48) @@ -4,6 +4,6 @@ To run this, just call {code} -java -jar staticwiki-editor\target\staticwiki-editor-0.8.jar +java -jar staticwiki-editor\target\staticwiki-editor-0.9.1.jar {code} (this from the project directory after compiling "mvn install"). \ No newline at end of file Modified: trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/HeaderLineHandler.java =================================================================== --- trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/HeaderLineHandler.java 2008-05-22 19:25:46 UTC (rev 47) +++ trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/HeaderLineHandler.java 2008-06-03 18:58:38 UTC (rev 48) @@ -21,23 +21,95 @@ * @author <a href="mailto:jo...@pr...">Joachim Van der Auwera</a> */ public class HeaderLineHandler - implements WikiLineHandler + implements WikiLineHandler { + private static final String CONTEXT = "org.staticwiki.wiki.renderer.line.HeaderLineHandler"; + public boolean render( TextBuilder result, CharSequence line, WikiSubRenderer subRenderer, WikiLineContext context ) { if ( line.length() > 4 && 'h' == line.charAt( 0 ) && Character.digit( line.charAt( 1 ), 7 ) > 0 && - '.' == line.charAt( 2 ) && ' ' == line.charAt( 3 ) ) + '.' == line.charAt( 2 ) && ' ' == line.charAt( 3 ) ) { + HeaderLineHandlerData data = (HeaderLineHandlerData) context.getContext( CONTEXT ); + if ( null == data ) + { + data = new HeaderLineHandlerData(); + data.content.append( "<ul>" ); + context.addContext( CONTEXT, data ); + context.addFlushHandler( new HeaderLineFlushHandler() ); + result.append( "<div id=\"toc\"></div>" ); + } context.flush( result ); context.setNewParagraph( true ); - String start = "<h" + line.charAt( 1 ) + ">"; - String end = "</h" + line.charAt( 1 ) + ">"; + char level = line.charAt( 1 ); + result.append( "<h" ).append( level ).append( ">" ); + String end = "</h" + level + ">"; context.setParagraphBreak( end ); context.setParagraphEnd( end ); - result.append( start ); - subRenderer.subRender( result, line.subSequence( 4, line.length() ) ); + TextBuilder tmp = result; + if ( isTocHeader( level ) ) tmp = TextBuilder.newInstance(); + subRenderer.subRender( tmp, line.subSequence( 4, line.length() ) ); + if ( isTocHeader( level ) ) + { + result.append( tmp ); + data.content.append( "<li><span class=\"toc-no\">" ); + if ( '1' == level ) + { + data.content.append( (char)( '0' + ( ++data.counter[ 0 ] ) ) ).append( '.' ); + data.counter[ 1 ] = 0; + data.counter[ 2 ] = 0; + } + if ( '2' == level ) + { + data.content.append( (char)( '0' + data.counter[ 0 ] ) ).append( '.' ); + data.content.append( (char)( '0' + ( ++data.counter[ 1 ] ) ) ).append( '.' ); + data.counter[ 2 ] = 0; + } + if ( '3' == level ) + { + data.content.append( (char)( '0' + data.counter[ 0 ] ) ).append( '.' ); + data.content.append( (char)( '0' + data.counter[ 1 ] ) ).append( '.' ); + data.content.append( (char)( '0' + ( ++data.counter[ 2 ] ) ) ).append( '.' ); + } + data.content.append( " </span>" ); + data.content.append( tmp ); + data.content.append( "</li>" ); + } return true; } return false; } + + private boolean isTocHeader( char headerChar ) + { + return '1' == headerChar || '2' == headerChar || '3' == headerChar; + } + + class HeaderLineHandlerData + { + public TextBuilder content = TextBuilder.newInstance(); + public int[] counter = new int[3]; + } + + class HeaderLineFlushHandler implements WikiLineFlushHandler + { + public void render( TextBuilder result, WikiLineContext context ) + { + HeaderLineHandlerData data = (HeaderLineHandlerData) context.getContext( CONTEXT ); + if ( null != data ) + { + result.append( "<div id=\"toc-content\">" ); + result.append( data.content ); + result.append( "</ul></div>" ); + result.append( "<script type=\"text/javascript\">\n" + + "<!--\n" + + "// note that the destination should be open+close tag!\n" + + "var dest = document.getElementById( \"toc\" );\n" + + "var org = document.getElementById( \"toc-content\" );\n" + + "dest.appendChild(org);\n" + + "// -->\n" + + "</script>" ); + } + } + } } Modified: trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/LineRenderer.java =================================================================== --- trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/LineRenderer.java 2008-05-22 19:25:46 UTC (rev 47) +++ trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/LineRenderer.java 2008-06-03 18:58:38 UTC (rev 48) @@ -69,6 +69,7 @@ { super.flush( wikiContext, output ); context.flush( output ); + context.flushFragment( output ); context = (WikiLineContext) wikiContext.getRenderMemory( getClass().getName() ); } } Modified: trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/WikiLineContext.java =================================================================== --- trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/WikiLineContext.java 2008-05-22 19:25:46 UTC (rev 47) +++ trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/WikiLineContext.java 2008-06-03 18:58:38 UTC (rev 48) @@ -14,6 +14,11 @@ import javolution.lang.TextBuilder; +import java.util.HashMap; +import java.util.Map; +import java.util.ArrayList; +import java.util.List; + /** * Context for line/paragraph rendering * @@ -21,10 +26,12 @@ */ public class WikiLineContext { - String paragraphBreak = "<br />"; - String paragraphEnd; - boolean newParagraph = true; - boolean suppressBreak = false; + private String paragraphBreak = "<br />"; + private String paragraphEnd; + private boolean newParagraph = true; + private boolean suppressBreak = false; + private Map<String,Object> map = new HashMap<String, Object>(); + private List<WikiLineFlushHandler> fragmentFlushers = new ArrayList<WikiLineFlushHandler>(); public boolean isNewParagraph() { @@ -71,4 +78,57 @@ if ( paragraphEnd != null ) result.append( paragraphEnd ); paragraphEnd = ""; } + + /** + * Add a new value into the context. + * + * @param name context name + * @param value context value + * @return previous value + */ + public Object addContext( String name, Object value ) + { + return map.put( name, value ); + } + + /** + * Get the context value for a given name. + * + * @param name context name + * @return context value + */ + public Object getContext( String name ) + { + return map.get( name ); + } + + /** + * Does a context value exist for a given name? + * + * @param name context name + * @return true when there is a value + */ + public boolean hasContext( String name ) + { + return map.containsKey( name ); + } + + /** + * Add a flush handler + * + * @param handler handler to add + */ + public void addFlushHandler( WikiLineFlushHandler handler ) + { + fragmentFlushers.add( handler ); + } + + public void flushFragment( TextBuilder output ) + { + for ( int i = fragmentFlushers.size() - 1 ; i >= 0 ; i-- ) + { + fragmentFlushers.get( i ).render( output, this ); + } + fragmentFlushers.clear(); + } } Added: trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/WikiLineFlushHandler.java =================================================================== --- trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/WikiLineFlushHandler.java (rev 0) +++ trunk/staticwiki-renderer/src/main/java/org/staticwiki/wiki/renderer/line/WikiLineFlushHandler.java 2008-06-03 18:58:38 UTC (rev 48) @@ -0,0 +1,33 @@ +/** + * This file is part of the staticwiki project. + * + * The contents of this file are subject to the GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * (the "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at http://www.fsf.org/licenses/lgpl.html + * + * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF + * ANY KIND, either express or implied. See the License for the specific language governing rights and + * limitations under the License. + */ + +package org.staticwiki.wiki.renderer.line; + +import javolution.lang.TextBuilder; + +/** + * Wiki line flush renderer, allows injecting code to handle the cleanup at the end of render. + * The flushes occur in reverse registrationo order. + * + * @author <a href="mailto:jo...@pr...">Joachim Van der Auwera</a> + */ +public interface WikiLineFlushHandler +{ + /** + * Try to render the given line. Return true when the line was rendered. + * The result and context should not be modified when returning false. + * + * @param result TextBuilder to build the result in + * @param context context for the flush + */ + void render( TextBuilder result, WikiLineContext context ); +} Modified: trunk/staticwiki-renderer/src/test/java/org/staticwiki/wiki/WikiFactoryTest.java =================================================================== --- trunk/staticwiki-renderer/src/test/java/org/staticwiki/wiki/WikiFactoryTest.java 2008-05-22 19:25:46 UTC (rev 47) +++ trunk/staticwiki-renderer/src/test/java/org/staticwiki/wiki/WikiFactoryTest.java 2008-06-03 18:58:38 UTC (rev 48) @@ -65,14 +65,40 @@ "\n"+ "h6. Smallest header\n"+ "\n"+ - "And some normal content."; - String result = "<div class=\"wiki\"><h1>Big header</h1>" + + "And some normal content.\n" + + "h1. Big again\n" + + "h3. Medium again\n" + + "h2. Small big again\n" + + ""; + String result = "<div class=\"wiki\">" + + "<div id=\"toc\"></div>" + + "<h1>Big header</h1>" + "<p>h7. Should be ignored.</p>" + "<h2>Smaller big header</h2>"+ "<h3>Medium header</h3>"+ "<p>With content</p>"+ "<h6>Smallest header</h6>"+ - "<p>And some normal content.</p></div>"; + "<p>And some normal content.</p>" + + "<h1>Big again</h1>" + + "<h3>Medium again</h3>" + + "<h2>Small big again</h2>" + + "<div id=\"toc-content\"><ul>" + + "<li><span class=\"toc-no\">1. </span>Big header</li>" + + "<li><span class=\"toc-no\">1.1. </span>Smaller big header</li>" + + "<li><span class=\"toc-no\">1.1.1. </span>Medium header</li>" + + "<li><span class=\"toc-no\">2. </span>Big again</li>" + + "<li><span class=\"toc-no\">2.0.1. </span>Medium again</li>" + + "<li><span class=\"toc-no\">2.1. </span>Small big again</li>" + + "</ul></div>" + + "<script type=\"text/javascript\">\n" + + "<!--\n" + + "// note that the destination should be open+close tag!\n" + + "var dest = document.getElementById( \"toc\" );\n" + + "var org = document.getElementById( \"toc-content\" );\n" + + "dest.appendChild(org);\n" + + "// -->\n" + + "</script>" + + "</div>"; WikiRenderer wr = WikiFactory.getWikiRenderer(); assertEquals( result, wr.render( test ) ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |