Author: vsiveton
Date: Wed May 27 13:21:38 2009
New Revision: 779161

URL: http://svn.apache.org/viewvc?rev=779161&view=rev
Log:
o fixed internal link ie href="#1" becomes href="#a1"
o updated tests

Modified:
    
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
    
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java

Modified: 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java?rev=779161&r1=779160&r2=779161&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/XhtmlBaseParser.java
 Wed May 27 13:21:38 2009
@@ -19,6 +19,11 @@
  * under the License.
  */
 
+import java.io.Reader;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.TreeSet;
+
 import javax.swing.text.html.HTML.Attribute;
 import javax.swing.text.html.HTML.Tag;
 
@@ -64,6 +69,29 @@
     /** Decoration properties, eg for texts. */
     private final SinkEventAttributeSet decoration = new 
SinkEventAttributeSet();
 
+    /** Used to add warn message when links are modified. */
+    private Set modifiedLinks;
+
+    /** {...@inheritdoc} */
+    public void parse( Reader source, Sink sink )
+        throws ParseException
+    {
+        super.parse( source, sink );
+
+        if ( getLog().isWarnEnabled() )
+        {
+            if ( this.modifiedLinks != null )
+            {
+                for ( Iterator it = this.modifiedLinks.iterator(); 
it.hasNext(); )
+                {
+                    getLog().warn( it.next().toString() );
+                }
+
+                this.modifiedLinks = null;
+            }
+        }
+    }
+
     /**
      * <p>
      *   Goes through a common list of possible html start tags. These include 
only tags that can go into
@@ -611,9 +639,10 @@
     {
         if ( !DoxiaUtils.isValidId( id ) )
         {
-            getLog().warn( "Modified invalid anchor name: " + id );
+            String linkAnchor = DoxiaUtils.encodeId( id, true );
+            addModifiedLinkMessage( id, linkAnchor );
 
-            return DoxiaUtils.encodeId( id, true );
+            return linkAnchor;
         }
 
         return id;
@@ -639,6 +668,18 @@
 
         if ( href != null )
         {
+            int hashIndex = href.indexOf( "#" );
+            if ( hashIndex != -1 && !DoxiaUtils.isExternalLink( href ) )
+            {
+                String hash = href.substring( hashIndex + 1 );
+
+                if ( !DoxiaUtils.isValidId( hash ) )
+                {
+                    href = href.substring( 0, hashIndex ) + "#" + 
DoxiaUtils.encodeId( hash, true );
+
+                    addModifiedLinkMessage( hash, href );
+                }
+            }
             sink.link( href, attribs );
             isLink = true;
         }
@@ -833,4 +874,15 @@
 
         sink.tableRows( justif, grid );
     }
+
+    private void addModifiedLinkMessage( String hash, String linkAnchor )
+    {
+        if ( modifiedLinks == null )
+        {
+            modifiedLinks = new TreeSet();
+        }
+
+        String msg = "[Xhtml Parser] Modified invalid link: '" + hash + "' to 
'" + linkAnchor + "'";
+        modifiedLinks.add( msg );
+    }
 }

Modified: 
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
URL: 
http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java?rev=779161&r1=779160&r2=779161&view=diff
==============================================================================
--- 
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
 (original)
+++ 
maven/doxia/doxia/trunk/doxia-core/src/test/java/org/apache/maven/doxia/parser/XhtmlBaseParserTest.java
 Wed May 27 13:21:38 2009
@@ -584,15 +584,44 @@
     public void testAnchorLink()
         throws Exception
     {
-        String text = "<div><a href=\"\"></a><a name=\"valid\"></a><a 
id=\"1invalid\"></a></div>";
+        String text = "<div><a href=\"\"></a>" +
+                "<a href=\"valid\"></a>" +
+                "<a href=\"#1invalid\"></a>" +
+                "<a name=\"valid\"></a>" +
+                "<a name=\"1invalid\"></a>" +
+                "<a id=\"1invalid\"></a></div>";
+
         parser.parse( text, sink );
         Iterator it = sink.getEventList().iterator();
 
-        assertEquals( "link", ( (SinkEventElement) it.next() ).getName() );
+        SinkEventElement element = (SinkEventElement) it.next();
+        assertEquals( "link", element.getName() );
+        assertEquals( "", element.getArgs()[0] );
+        assertEquals( "link_", ( (SinkEventElement) it.next() ).getName() );
+
+        element = (SinkEventElement) it.next();
+        assertEquals( "link", element.getName() );
+        assertEquals( "valid", element.getArgs()[0] );
+        assertEquals( "link_", ( (SinkEventElement) it.next() ).getName() );
+
+        element = (SinkEventElement) it.next();
+        assertEquals( "link", element.getName() );
+        assertEquals( "#a1invalid", element.getArgs()[0] );
         assertEquals( "link_", ( (SinkEventElement) it.next() ).getName() );
-        assertEquals( "anchor", ( (SinkEventElement) it.next() ).getName() );
+
+        element = (SinkEventElement) it.next();
+        assertEquals( "anchor", element.getName() );
+        assertEquals( "valid", element.getArgs()[0] );
+        assertEquals( "anchor_", ( (SinkEventElement) it.next() ).getName() );
+
+        element = (SinkEventElement) it.next();
+        assertEquals( "anchor", element.getName() );
+        assertEquals( "a1invalid", element.getArgs()[0] );
         assertEquals( "anchor_", ( (SinkEventElement) it.next() ).getName() );
-        assertEquals( "anchor", ( (SinkEventElement) it.next() ).getName() );
+
+        element = (SinkEventElement) it.next();
+        assertEquals( "anchor", element.getName() );
+        assertEquals( "a1invalid", element.getArgs()[0] );
         assertEquals( "anchor_", ( (SinkEventElement) it.next() ).getName() );
     }
 }


Reply via email to