You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by vs...@apache.org on 2008/08/06 21:03:43 UTC

svn commit: r683374 - in /maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin: generator/PluginHelpGenerator.java util/PluginUtils.java

Author: vsiveton
Date: Wed Aug  6 12:03:43 2008
New Revision: 683374

URL: http://svn.apache.org/viewvc?rev=683374&view=rev
Log:
o deprecated toText and move this method to PluginUtils

Modified:
    maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/generator/PluginHelpGenerator.java
    maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/util/PluginUtils.java

Modified: maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/generator/PluginHelpGenerator.java
URL: http://svn.apache.org/viewvc/maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/generator/PluginHelpGenerator.java?rev=683374&r1=683373&r2=683374&view=diff
==============================================================================
--- maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/generator/PluginHelpGenerator.java (original)
+++ maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/generator/PluginHelpGenerator.java Wed Aug  6 12:03:43 2008
@@ -22,7 +22,6 @@
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.io.StringReader;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Date;
@@ -30,12 +29,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Stack;
-
-import javax.swing.text.MutableAttributeSet;
-import javax.swing.text.html.HTML;
-import javax.swing.text.html.HTMLEditorKit;
-import javax.swing.text.html.parser.ParserDelegator;
 
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.Parameter;
@@ -130,7 +123,7 @@
 
     /**
      * Creates a minimalistic mojo descriptor for the generated help goal.
-     * 
+     *
      * @param pluginDescriptor The descriptor of the plugin for which to generate a help goal, must not be
      *            <code>null</code>.
      * @return The mojo descriptor for the generated help goal, never <code>null</code>.
@@ -202,13 +195,13 @@
         {
             throw new RuntimeException( "Failed to setup parameters for help goal", e );
         }
-        
+
         return descriptor;
     }
 
     /**
      * Find the best package name, based on the number of hits of actual Mojo classes.
-     * 
+     *
      * @param pluginDescriptor
      * @return the best name of the package for the generated mojo
      */
@@ -257,7 +250,7 @@
 
     /**
      * Generates the <code>HelpMojo</code> class.
-     * 
+     *
      * @param writer
      * @param pluginDescriptor
      * @param helpDescriptor
@@ -622,7 +615,7 @@
 
     /**
      * Gets the effective string to use for the plugin/mojo/parameter description.
-     * 
+     *
      * @param description The description of the element, may be <code>null</code>.
      * @return The effective description string, never <code>null</code>.
      */
@@ -630,7 +623,7 @@
     {
         if ( StringUtils.isNotEmpty( description ) )
         {
-            return StringUtils.escape( toText( description ) );
+            return StringUtils.escape( PluginUtils.toText( description ) );
         }
         else
         {
@@ -650,253 +643,13 @@
      * to a single space. The resulting space denotes a possible point for line wrapping.</li>
      * <li>Each space in preformatted text will be converted to a non-breaking space (U+00A0).</li>
      * </ul>
-     * 
+     *
      * @param html The HTML fragment to convert to plain text, may be <code>null</code>.
      * @return A string with HTML tags converted into pure text, never <code>null</code>.
+     * @deprecated since 2.4.3, using {@link PluginUtils#toText(String)} instead of.
      */
     protected static String toText( String html )
     {
-        if ( StringUtils.isEmpty( html ) )
-        {
-            return "";
-        }
-
-        final StringBuffer sb = new StringBuffer();
-
-        HTMLEditorKit.Parser parser = new ParserDelegator();
-        HTMLEditorKit.ParserCallback htmlCallback = new HTMLEditorKit.ParserCallback()
-        {
-            /**
-             * Holds the index of the current item in a numbered list.
-             */
-            class Counter
-            {
-                public int value;
-            }
-
-            /**
-             * A flag whether the parser is currently in the body element.
-             */
-            private boolean body;
-
-            /**
-             * A flag whether the parser is currently processing preformatted text, actually a counter to track nesting.
-             */
-            private int preformatted;
-
-            /**
-             * The current indentation depth for the output.
-             */
-            private int depth;
-
-            /**
-             * A stack of {@link Counter} objects corresponding to the nesting of (un-)ordered lists. A
-             * <code>null</code> element denotes an unordered list.
-             */
-            private Stack numbering = new Stack();
-
-            /**
-             * A flag whether an implicit line break is pending in the output buffer. This flag is used to postpone the
-             * output of implicit line breaks until we are sure that are not to be merged with other implicit line
-             * breaks.
-             */
-            private boolean pendingNewline;
-
-            /**
-             * A flag whether we have just parsed a simple tag.
-             */
-            private boolean simpleTag;
-
-            /** {@inheritDoc} */
-            public void handleSimpleTag( HTML.Tag t, MutableAttributeSet a, int pos )
-            {
-                simpleTag = true;
-                if ( body && HTML.Tag.BR.equals( t ) )
-                {
-                    newline( false );
-                }
-            }
-
-            /** {@inheritDoc} */
-            public void handleStartTag( HTML.Tag t, MutableAttributeSet a, int pos )
-            {
-                simpleTag = false;
-                if ( body && ( t.breaksFlow() || t.isBlock() ) )
-                {
-                    newline( true );
-                }
-                if ( HTML.Tag.OL.equals( t ) )
-                {
-                    numbering.push( new Counter() );
-                }
-                else if ( HTML.Tag.UL.equals( t ) )
-                {
-                    numbering.push( null );
-                }
-                else if ( HTML.Tag.LI.equals( t ) )
-                {
-                    Counter counter = (Counter) numbering.peek();
-                    if ( counter == null )
-                    {
-                        text( "-\t" );
-                    }
-                    else
-                    {
-                        text( ++counter.value + ".\t" );
-                    }
-                    depth++;
-                }
-                else if ( HTML.Tag.DD.equals( t ) )
-                {
-                    depth++;
-                }
-                else if ( t.isPreformatted() )
-                {
-                    preformatted++;
-                }
-                else if ( HTML.Tag.BODY.equals( t ) )
-                {
-                    body = true;
-                }
-            }
-
-            /** {@inheritDoc} */
-            public void handleEndTag( HTML.Tag t, int pos )
-            {
-                if ( HTML.Tag.OL.equals( t ) || HTML.Tag.UL.equals( t ) )
-                {
-                    numbering.pop();
-                }
-                else if ( HTML.Tag.LI.equals( t ) || HTML.Tag.DD.equals( t ) )
-                {
-                    depth--;
-                }
-                else if ( t.isPreformatted() )
-                {
-                    preformatted--;
-                }
-                else if ( HTML.Tag.BODY.equals( t ) )
-                {
-                    body = false;
-                }
-                if ( body && ( t.breaksFlow() || t.isBlock() ) && !HTML.Tag.LI.equals( t ) )
-                {
-                    if ( ( HTML.Tag.P.equals( t ) || HTML.Tag.PRE.equals( t ) || HTML.Tag.OL.equals( t )
-                        || HTML.Tag.UL.equals( t ) || HTML.Tag.DL.equals( t ) )
-                        && numbering.isEmpty() )
-                    {
-                        newline( pendingNewline = false );
-                    }
-                    else
-                    {
-                        newline( true );
-                    }
-                }
-            }
-
-            /** {@inheritDoc} */
-            public void handleText( char[] data, int pos )
-            {
-                /*
-                 * NOTE: Parsers before JRE 1.6 will parse XML-conform simple tags like <br/> as "<br>" followed by
-                 * the text event ">..." so we need to watch out for the closing angle bracket.
-                 */
-                int offset = 0;
-                if ( simpleTag && data[0] == '>' )
-                {
-                    simpleTag = false;
-                    for ( ++offset; offset < data.length && data[offset] <= ' '; )
-                    {
-                        offset++;
-                    }
-                }
-                if ( offset < data.length )
-                {
-                    String text = new String( data, offset, data.length - offset );
-                    text( text );
-                }
-            }
-
-            /** {@inheritDoc} */
-            public void flush()
-            {
-                flushPendingNewline();
-            }
-
-            /**
-             * Writes a line break to the plain text output.
-             * 
-             * @param implicit A flag whether this is an explicit or implicit line break. Explicit line breaks are
-             *            always written to the output whereas consecutive implicit line breaks are merged into a single
-             *            line break.
-             */
-            private void newline( boolean implicit )
-            {
-                if ( implicit )
-                {
-                    pendingNewline = true;
-                }
-                else
-                {
-                    flushPendingNewline();
-                    sb.append( '\n' );
-                }
-            }
-
-            /**
-             * Flushes a pending newline (if any).
-             */
-            private void flushPendingNewline()
-            {
-                if ( pendingNewline )
-                {
-                    pendingNewline = false;
-                    if ( sb.length() > 0 )
-                    {
-                        sb.append( '\n' );
-                    }
-                }
-            }
-
-            /**
-             * Writes the specified character data to the plain text output. If the last output was a line break, the
-             * character data will automatically be prefixed with the current indent.
-             * 
-             * @param data The character data, must not be <code>null</code>.
-             */
-            private void text( String data )
-            {
-                flushPendingNewline();
-                if ( sb.length() <= 0 || sb.charAt( sb.length() - 1 ) == '\n' )
-                {
-                    for ( int i = 0; i < depth; i++ )
-                    {
-                        sb.append( '\t' );
-                    }
-                }
-                String text;
-                if ( preformatted > 0 )
-                {
-                    text = data.replace( ' ', '\u00A0' );
-                }
-                else
-                {
-                    text = data.replace( '\n', ' ' );
-                }
-                sb.append( text );
-            }
-        };
-
-        try
-        {
-            parser.parse( new StringReader( PluginUtils.makeHtmlValid( html ) ), htmlCallback, true );
-        }
-        catch ( IOException e )
-        {
-            throw new RuntimeException( e );
-        }
-
-        return sb.toString().replace( '\"', '\'' ); // for CDATA
+        return PluginUtils.toText( html );
     }
-
 }

Modified: maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/util/PluginUtils.java
URL: http://svn.apache.org/viewvc/maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/util/PluginUtils.java?rev=683374&r1=683373&r2=683374&view=diff
==============================================================================
--- maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/util/PluginUtils.java (original)
+++ maven/plugin-tools/trunk/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/util/PluginUtils.java Wed Aug  6 12:03:43 2008
@@ -22,6 +22,8 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -32,9 +34,15 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Stack;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.swing.text.MutableAttributeSet;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.parser.ParserDelegator;
+
 import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
@@ -237,7 +245,7 @@
 
     /**
      * Fixes some javadoc comment to become a valid XHTML snippet.
-     * 
+     *
      * @param description Javadoc description with HTML tags, may be <code>null</code>.
      * @return The description with valid XHTML tags, never <code>null</code>.
      */
@@ -398,7 +406,7 @@
 
     /**
      * Sorts the specified mojo descriptors by goal name.
-     * 
+     *
      * @param mojoDescriptors The mojo descriptors to sort, may be <code>null</code>.
      */
     public static void sortMojos( List mojoDescriptors )
@@ -419,4 +427,265 @@
         }
     }
 
+    /**
+     * Converts a HTML fragment as extracted from a javadoc comment to a plain text string. This method tries to retain
+     * as much of the text formatting as possible by means of the following transformations:
+     * <ul>
+     * <li>List items are converted to leading tabs (U+0009), followed by the item number/bullet, another tab and
+     * finally the item contents. Each tab denotes an increase of indentation.</li>
+     * <li>Flow breaking elements as well as literal line terminators in preformatted text are converted to a newline
+     * (U+000A) to denote a mandatory line break.</li>
+     * <li>Consecutive spaces and line terminators from character data outside of preformatted text will be normalized
+     * to a single space. The resulting space denotes a possible point for line wrapping.</li>
+     * <li>Each space in preformatted text will be converted to a non-breaking space (U+00A0).</li>
+     * </ul>
+     *
+     * @param html The HTML fragment to convert to plain text, may be <code>null</code>.
+     * @return A string with HTML tags converted into pure text, never <code>null</code>.
+     * @since 2.4.3
+     */
+    public static String toText( String html )
+    {
+        if ( StringUtils.isEmpty( html ) )
+        {
+            return "";
+        }
+
+        final StringBuffer sb = new StringBuffer();
+
+        HTMLEditorKit.Parser parser = new ParserDelegator();
+        HTMLEditorKit.ParserCallback htmlCallback = new HTMLEditorKit.ParserCallback()
+        {
+            /**
+             * Holds the index of the current item in a numbered list.
+             */
+            class Counter
+            {
+                public int value;
+            }
+
+            /**
+             * A flag whether the parser is currently in the body element.
+             */
+            private boolean body;
+
+            /**
+             * A flag whether the parser is currently processing preformatted text, actually a counter to track nesting.
+             */
+            private int preformatted;
+
+            /**
+             * The current indentation depth for the output.
+             */
+            private int depth;
+
+            /**
+             * A stack of {@link Counter} objects corresponding to the nesting of (un-)ordered lists. A
+             * <code>null</code> element denotes an unordered list.
+             */
+            private Stack numbering = new Stack();
+
+            /**
+             * A flag whether an implicit line break is pending in the output buffer. This flag is used to postpone the
+             * output of implicit line breaks until we are sure that are not to be merged with other implicit line
+             * breaks.
+             */
+            private boolean pendingNewline;
+
+            /**
+             * A flag whether we have just parsed a simple tag.
+             */
+            private boolean simpleTag;
+
+            /** {@inheritDoc} */
+            public void handleSimpleTag( HTML.Tag t, MutableAttributeSet a, int pos )
+            {
+                simpleTag = true;
+                if ( body && HTML.Tag.BR.equals( t ) )
+                {
+                    newline( false );
+                }
+            }
+
+            /** {@inheritDoc} */
+            public void handleStartTag( HTML.Tag t, MutableAttributeSet a, int pos )
+            {
+                simpleTag = false;
+                if ( body && ( t.breaksFlow() || t.isBlock() ) )
+                {
+                    newline( true );
+                }
+                if ( HTML.Tag.OL.equals( t ) )
+                {
+                    numbering.push( new Counter() );
+                }
+                else if ( HTML.Tag.UL.equals( t ) )
+                {
+                    numbering.push( null );
+                }
+                else if ( HTML.Tag.LI.equals( t ) )
+                {
+                    Counter counter = (Counter) numbering.peek();
+                    if ( counter == null )
+                    {
+                        text( "-\t" );
+                    }
+                    else
+                    {
+                        text( ++counter.value + ".\t" );
+                    }
+                    depth++;
+                }
+                else if ( HTML.Tag.DD.equals( t ) )
+                {
+                    depth++;
+                }
+                else if ( t.isPreformatted() )
+                {
+                    preformatted++;
+                }
+                else if ( HTML.Tag.BODY.equals( t ) )
+                {
+                    body = true;
+                }
+            }
+
+            /** {@inheritDoc} */
+            public void handleEndTag( HTML.Tag t, int pos )
+            {
+                if ( HTML.Tag.OL.equals( t ) || HTML.Tag.UL.equals( t ) )
+                {
+                    numbering.pop();
+                }
+                else if ( HTML.Tag.LI.equals( t ) || HTML.Tag.DD.equals( t ) )
+                {
+                    depth--;
+                }
+                else if ( t.isPreformatted() )
+                {
+                    preformatted--;
+                }
+                else if ( HTML.Tag.BODY.equals( t ) )
+                {
+                    body = false;
+                }
+                if ( body && ( t.breaksFlow() || t.isBlock() ) && !HTML.Tag.LI.equals( t ) )
+                {
+                    if ( ( HTML.Tag.P.equals( t ) || HTML.Tag.PRE.equals( t ) || HTML.Tag.OL.equals( t )
+                        || HTML.Tag.UL.equals( t ) || HTML.Tag.DL.equals( t ) )
+                        && numbering.isEmpty() )
+                    {
+                        newline( pendingNewline = false );
+                    }
+                    else
+                    {
+                        newline( true );
+                    }
+                }
+            }
+
+            /** {@inheritDoc} */
+            public void handleText( char[] data, int pos )
+            {
+                /*
+                 * NOTE: Parsers before JRE 1.6 will parse XML-conform simple tags like <br/> as "<br>" followed by
+                 * the text event ">..." so we need to watch out for the closing angle bracket.
+                 */
+                int offset = 0;
+                if ( simpleTag && data[0] == '>' )
+                {
+                    simpleTag = false;
+                    for ( ++offset; offset < data.length && data[offset] <= ' '; )
+                    {
+                        offset++;
+                    }
+                }
+                if ( offset < data.length )
+                {
+                    String text = new String( data, offset, data.length - offset );
+                    text( text );
+                }
+            }
+
+            /** {@inheritDoc} */
+            public void flush()
+            {
+                flushPendingNewline();
+            }
+
+            /**
+             * Writes a line break to the plain text output.
+             *
+             * @param implicit A flag whether this is an explicit or implicit line break. Explicit line breaks are
+             *            always written to the output whereas consecutive implicit line breaks are merged into a single
+             *            line break.
+             */
+            private void newline( boolean implicit )
+            {
+                if ( implicit )
+                {
+                    pendingNewline = true;
+                }
+                else
+                {
+                    flushPendingNewline();
+                    sb.append( '\n' );
+                }
+            }
+
+            /**
+             * Flushes a pending newline (if any).
+             */
+            private void flushPendingNewline()
+            {
+                if ( pendingNewline )
+                {
+                    pendingNewline = false;
+                    if ( sb.length() > 0 )
+                    {
+                        sb.append( '\n' );
+                    }
+                }
+            }
+
+            /**
+             * Writes the specified character data to the plain text output. If the last output was a line break, the
+             * character data will automatically be prefixed with the current indent.
+             *
+             * @param data The character data, must not be <code>null</code>.
+             */
+            private void text( String data )
+            {
+                flushPendingNewline();
+                if ( sb.length() <= 0 || sb.charAt( sb.length() - 1 ) == '\n' )
+                {
+                    for ( int i = 0; i < depth; i++ )
+                    {
+                        sb.append( '\t' );
+                    }
+                }
+                String text;
+                if ( preformatted > 0 )
+                {
+                    text = data.replace( ' ', '\u00A0' );
+                }
+                else
+                {
+                    text = data.replace( '\n', ' ' );
+                }
+                sb.append( text );
+            }
+        };
+
+        try
+        {
+            parser.parse( new StringReader( makeHtmlValid( html ) ), htmlCallback, true );
+        }
+        catch ( IOException e )
+        {
+            throw new RuntimeException( e );
+        }
+
+        return sb.toString().replace( '\"', '\'' ); // for CDATA
+    }
 }