You are viewing a plain text version of this content. The canonical link for it is here.
Posted to doxia-commits@maven.apache.org by jv...@apache.org on 2006/12/15 00:39:30 UTC

svn commit: r487394 - in /maven/doxia/trunk/doxia-core/src: main/java/org/apache/maven/doxia/module/apt/AptSink.java test/java/org/apache/maven/doxia/module/apt/ test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java

Author: jvanzyl
Date: Thu Dec 14 15:39:30 2006
New Revision: 487394

URL: http://svn.apache.org/viewvc?view=rev&rev=487394
Log:
DOXIA-80: Adding an APT Sink with tests. Coolness!
Submitted by: Eric Redmond

Added:
    maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java   (with props)
    maven/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/module/apt/
    maven/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java   (with props)

Added: maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java
URL: http://svn.apache.org/viewvc/maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java?view=auto&rev=487394
==============================================================================
--- maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java (added)
+++ maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java Thu Dec 14 15:39:30 2006
@@ -0,0 +1,681 @@
+package org.apache.maven.doxia.module.apt;
+
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.util.Stack;
+
+import org.apache.maven.doxia.module.HtmlTools;
+import org.apache.maven.doxia.sink.SinkAdapter;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * APT Sink implementation.
+ * @author eredmond
+ */
+public class AptSink extends SinkAdapter
+{
+    private static final String EOL = System.getProperty("line.separator");
+    private StringBuffer buffer;
+    private StringBuffer tableCaptionBuffer;
+    private String author;
+    private String title;
+    private String date;
+    private boolean tableCaptionFlag;
+    private boolean headerFlag;
+    private boolean bufferFlag;
+    private boolean itemFlag;
+    private boolean verbatimFlag;
+    private boolean boxed;
+    private boolean gridFlag;
+    private int cellCount;
+    private PrintWriter writer;
+    private int cellJustif[];
+    private String rowLine;
+    private String listNestingIndent;
+    private Stack listStyles;
+
+    public AptSink( Writer writer )
+    {
+    	this.buffer = new StringBuffer();
+        this.tableCaptionBuffer = new StringBuffer();
+        this.writer = new PrintWriter(writer);
+        this.listNestingIndent = "";
+        this.listStyles = new Stack();
+    }
+
+    protected StringBuffer getBuffer()
+    {
+        return buffer;
+    }
+
+    protected void setHeadFlag(boolean headFlag)
+    {
+        this.headerFlag = headFlag;
+    }
+
+    protected void resetState()
+    {
+        headerFlag = false;
+        resetBuffer();
+        itemFlag = false;
+        verbatimFlag = false;
+        cellCount = 0;
+    }
+
+    protected void resetBuffer()
+    {
+        buffer = new StringBuffer();
+    }
+
+    protected void resetTableCaptionBuffer()
+    {
+    	tableCaptionBuffer = new StringBuffer();
+    }
+
+    public void head()
+    {
+    	resetState();
+    	headerFlag = true;
+    }
+
+    public void head_()
+    {
+        headerFlag = false;
+
+        write( " -----" + EOL );
+        write( " " + title + EOL  );
+        write( " -----" + EOL );
+        write( " " + author + EOL  );
+        write( " -----" + EOL );
+        write( " " + date + EOL  );
+        write( " -----" + EOL );
+    }
+
+    public void title_()
+    {
+        if(buffer.length() > 0)
+        {
+        	title = buffer.toString();
+            resetBuffer();
+        }
+    }
+
+    public void author_()
+    {
+        if(buffer.length() > 0)
+        {
+        	author = buffer.toString();
+            resetBuffer();
+        }
+    }
+
+    public void date_()
+    {
+        if(buffer.length() > 0)
+        {
+        	date = buffer.toString();
+            resetBuffer();
+        }
+    }
+
+    public void section1_()
+    {
+        write( EOL );
+    }
+
+    public void section2_()
+    {
+        write( EOL );
+    }
+
+    public void section3_()
+    {
+        write( EOL );
+    }
+
+    public void section4_()
+    {
+        write( EOL );
+    }
+
+    public void section5_()
+    {
+        write( EOL );
+    }
+
+    public void sectionTitle1()
+    {
+        write( EOL );
+    }
+
+    public void sectionTitle1_()
+    {
+        write( EOL + EOL );
+    }
+
+    public void sectionTitle2()
+    {
+        write( EOL + "*" );
+    }
+
+    public void sectionTitle2_()
+    {
+        write( EOL + EOL );
+    }
+
+    public void sectionTitle3()
+    {
+        write( EOL + "**" );
+    }
+
+    public void sectionTitle3_()
+    {
+        write( EOL + EOL );
+    }
+
+    public void sectionTitle4()
+    {
+        write( EOL + "***" );
+    }
+
+    public void sectionTitle4_()
+    {
+        write( EOL + EOL );
+    }
+
+    public void sectionTitle5()
+    {
+        write( EOL + "****" );
+    }
+
+    public void sectionTitle5_()
+    {
+        write( EOL + EOL );
+    }
+
+    public void list()
+    {
+    	listNestingIndent += " ";
+    	listStyles.push( "*" );
+    	write( EOL );
+    }
+
+    public void list_()
+    {
+    	if( listNestingIndent.length() <= 1 )
+    		write( EOL + listNestingIndent + "[]" + EOL );
+    	else
+    		write( EOL );
+        listNestingIndent = StringUtils.chomp( listNestingIndent, " " );
+    	listStyles.pop();
+    	itemFlag = false;
+    }
+
+    public void listItem()
+    {
+    	//if( !numberedList )
+    	//write( EOL + listNestingIndent + "*" );
+    	//else
+    	numberedListItem();
+        itemFlag = true;
+    }
+
+    public void listItem_()
+    {
+    	write( EOL );
+    }
+
+    public void numberedList( int numbering )
+    {
+    	listNestingIndent += " ";
+        write( EOL );
+
+        String style;
+        switch ( numbering )
+        {
+            case NUMBERING_UPPER_ALPHA:
+                style = "A";
+                break;
+            case NUMBERING_LOWER_ALPHA:
+                style = "a";
+                break;
+            case NUMBERING_UPPER_ROMAN:
+                style = "I";
+                break;
+            case NUMBERING_LOWER_ROMAN:
+                style = "i";
+                break;
+            case NUMBERING_DECIMAL:
+            default:
+                style = "1";
+        }
+
+        listStyles.push( style );
+    }
+
+    public void numberedList_()
+    {
+    	if( listNestingIndent.length() <= 1 )
+    		write( EOL + listNestingIndent + "[]" + EOL );
+    	else
+    		write( EOL );
+    	listNestingIndent = StringUtils.chomp( listNestingIndent, " " );
+    	listStyles.pop();
+        itemFlag = false;
+    }
+
+    public void numberedListItem()
+    {
+    	String style = (String)listStyles.peek();
+    	if( style == "*" )
+        	write( EOL + listNestingIndent + "* " );
+    	else
+    		write( EOL + listNestingIndent + "[[" + style + "]] " );
+        itemFlag = true;
+    }
+
+    public void numberedListItem_()
+    {
+        write( EOL );
+    }
+
+    public void definitionList()
+    {
+        write( EOL );
+    }
+
+    public void definitionList_()
+    {
+        write( EOL );
+        itemFlag = false;
+    }
+
+    public void definedTerm()
+    {
+        write( EOL + " [" );
+    }
+
+    public void definedTerm_()
+    {
+        write("]");
+    }
+
+    public void definition()
+    {
+        itemFlag = true;
+    }
+
+    public void definition_()
+    {
+        write( EOL );
+    }
+
+    public void pageBreak()
+    {
+    	// TODO: APT parse defect... pagebreak is never used.
+    	write( EOL + "^L" + EOL );
+    }
+
+    public void paragraph()
+    {
+        if(!itemFlag)
+            write( EOL + " ");
+    }
+
+    public void paragraph_()
+    {
+        if(itemFlag)
+            itemFlag = false;
+        else
+            write( EOL + EOL );
+    }
+
+    public void verbatim( boolean boxed )
+    {
+        verbatimFlag = true;
+        this.boxed = boxed;
+        if( boxed )
+        	write("\n+------+\n");
+        else
+        	write("\n------\n");
+    }
+
+    public void verbatim_()
+    {
+        if( boxed )
+        	write("\n+------+\n");
+        else
+        	write("\n------\n");
+        boxed = false;
+        verbatimFlag = false;
+    }
+
+    public void horizontalRule()
+    {
+        write(EOL + "========" + EOL );
+    }
+
+    public void table()
+    {
+    	write( EOL );
+    }
+
+    public void table_()
+    {
+    	if( rowLine != null )
+    		write( rowLine );
+    	rowLine = null;
+
+    	if( tableCaptionBuffer.length() > 0 )
+    		text( tableCaptionBuffer.toString() + EOL );
+
+    	resetTableCaptionBuffer();
+    }
+
+    public void tableRows(int justification[], boolean grid)
+    {
+        cellJustif = justification;
+        gridFlag = grid;
+    }
+
+    public void tableRows_()
+    {
+        cellJustif = null;
+        gridFlag = false;
+    }
+
+    public void tableRow()
+    {
+    	bufferFlag = true;
+    	cellCount = 0;
+    }
+
+    public void tableRow_()
+    {
+    	bufferFlag = false;
+
+    	// write out the header row first, then the data in the buffer
+    	buildRowLine();
+
+    	write( rowLine );
+
+    	// TODO: This will need to be more clever, for multi-line cells
+    	if( gridFlag )
+    		write( "|" );
+
+		write( buffer.toString() );
+
+    	resetBuffer();
+
+    	write( EOL );
+
+    	// only reset cell count if this is the last row
+    	cellCount = 0;
+    }
+
+    private void buildRowLine()
+    {
+    	StringBuffer rowLine = new StringBuffer();
+    	rowLine.append( "*--" );
+
+    	for(int i = 0; i < cellCount; i++)
+    	{
+    		if(cellJustif != null)
+    			switch(cellJustif[i])
+    			{
+    			case 1:
+    				rowLine.append( "--+" );
+    				break;
+    			case 2:
+    				rowLine.append( "--:" );
+    				break;
+    			default:
+    				rowLine.append( "--*" );
+    			}
+    		else
+    			rowLine.append( "--*" );
+    	}
+    	rowLine.append( EOL );
+
+    	this.rowLine = rowLine.toString();
+    }
+
+    public void tableCell_()
+    {
+        tableCell_(false);
+    }
+
+    public void tableHeaderCell_()
+    {
+        tableCell_(true);
+    }
+
+    public void tableCell_(boolean headerRow)
+    {
+        buffer.append("|");
+        cellCount++;
+    }
+
+    public void tableCaption()
+    {
+    	tableCaptionFlag = true;
+    }
+
+    public void tableCaption_()
+    {
+    	tableCaptionFlag = false;
+    }
+
+    public void figureCaption_()
+    {
+        write( EOL );
+    }
+
+    public void figureGraphics(String name)
+    {
+        write( EOL + "[" + name + "] ");
+    }
+
+    public void anchor(String name)
+    {
+//    	String id = HtmlTools.encodeId(name);
+    	write("{");
+    }
+
+    public void anchor_()
+    {
+    	write("}");
+    }
+
+    public void link(String name)
+    {
+        if(!headerFlag)
+        {
+        	write("{{{");
+        	text( name );
+        	write( "}" );
+        }
+    }
+
+    public void link_()
+    {
+        if(!headerFlag)
+        {
+        	write( "}}" );
+        }
+    }
+
+    public void link(String name, String target)
+    {
+        if(!headerFlag)
+        {
+        	write("{{{");
+        	text( target );
+        	write( "}" );
+        	text( name );
+        }
+    }
+
+    public void italic()
+    {
+        if(!headerFlag)
+        	write("<");
+    }
+
+    public void italic_()
+    {
+        if(!headerFlag)
+        	write(">");
+    }
+
+    public void bold()
+    {
+        if(!headerFlag)
+        	write("<<");
+    }
+
+    public void bold_()
+    {
+        if(!headerFlag)
+        	write(">>");
+    }
+
+    public void monospaced()
+    {
+        if(!headerFlag)
+        	write("<<<");
+    }
+
+    public void monospaced_()
+    {
+        if(!headerFlag)
+        	write(">>>");
+    }
+
+    public void lineBreak()
+    {
+        if(headerFlag || bufferFlag)
+            buffer.append(EOL);
+        else
+            write( "\\" + EOL);
+    }
+
+    public void nonBreakingSpace()
+    {
+        if(headerFlag || bufferFlag)
+            buffer.append("\\ ");
+        else
+            write( "\\ " );
+    }
+
+    public void text( String text )
+    {
+    	if( tableCaptionFlag )
+    		tableCaptionBuffer.append( text );
+    	else if( headerFlag || bufferFlag )
+            buffer.append(text);
+        else if( verbatimFlag )
+            verbatimContent(text);
+        else
+            content(text);
+    }
+
+    public void rawText(String text)
+    {
+        write(text);
+    }
+
+    protected void write(String text)
+    {
+    	writer.write(text);
+    }
+
+    protected void content(String text)
+    {
+        write(escapeAPT(text));
+    }
+
+    protected void verbatimContent(String text)
+    {
+        write(escapeAPT(text));
+    }
+
+    public static String encodeFragment(String text)
+    {
+        return HtmlTools.encodeFragment(text);
+    }
+
+    public static String encodeURL(String text)
+    {
+        return HtmlTools.encodeURL(text);
+    }
+
+    public void flush()
+    {
+        writer.flush();
+    }
+
+    public void close()
+    {
+        writer.close();
+    }
+
+    /**
+     * Escape special characters in a text in APT:
+     *
+     * <pre>
+     * \~, \=, \-, \+, \*, \[, \], \<, \>, \{, \}, \\
+     * </pre>
+     *
+     * @param text the String to escape, may be null
+     * @return the text escaped, "" if null String input
+     */
+    private static String escapeAPT( String text )
+    {
+        if ( text == null )
+        {
+            return "";
+        }
+
+        int length = text.length();
+        StringBuffer buffer = new StringBuffer( length );
+
+        for ( int i = 0; i < length; ++i )
+        {
+            char c = text.charAt( i );
+            switch ( c )
+            { // 0080
+                case '\\':
+                case '~':
+                case '=':
+                case '-':
+                case '+':
+                case '*':
+                case '[':
+                case ']':
+                case '<':
+                case '>':
+                case '{':
+                case '}':
+                    buffer.append( '\\' );
+                    buffer.append( c );
+                    break;
+                default:
+                	if( c > 127 )
+                	{
+                		buffer.append( "\\u" );
+                		String hex = Integer.toHexString( c );
+                		if( hex.length() == 2 )
+                    		buffer.append( "00" );
+                		else if( hex.length() == 3 )
+                    		buffer.append( "0" );
+                		buffer.append( hex );
+                	}
+                	else
+                		buffer.append( c );
+            }
+        }
+
+        return buffer.toString();
+    }
+}

Propchange: maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/module/apt/AptSink.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java
URL: http://svn.apache.org/viewvc/maven/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java?view=auto&rev=487394
==============================================================================
--- maven/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java (added)
+++ maven/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java Thu Dec 14 15:39:30 2006
@@ -0,0 +1,29 @@
+package org.apache.maven.doxia.module.apt;
+
+import org.apache.maven.doxia.sink.AbstractSinkTestCase;
+import org.apache.maven.doxia.sink.Sink;
+
+public class AptSinkTest
+	extends AbstractSinkTestCase
+{
+    protected String outputExtension()
+    {
+        return "apt";
+    }
+
+    public void testApt()
+	    throws Exception
+	{
+	    Sink sink = createSink();
+
+	    new AptParser().parse( getTestReader(), createSink() );
+
+	    sink.flush();
+	}
+
+    protected Sink createSink()
+        throws Exception
+    {
+        return new AptSink( getTestWriter() );
+    }
+}

Propchange: maven/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/module/apt/AptSinkTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"