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() ); } }