Author: vmassol Date: Tue Jan 22 01:03:02 2008 New Revision: 614152 URL: http://svn.apache.org/viewvc?rev=614152&view=rev Log: DOXIA-200: Add a Parser for XWiki
* Added more unit tests and fixed the macro parsing code * Modified the Macro parsing to generate a FigureBlock when the macro is an {image} macro. Removed: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroBlock.java maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/resources/figure.xwiki Modified: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/blocks/MacroBlock.java maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/FigureBlockParser.java maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroParser.java maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/XWikiParserTest.java maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/parser/MacroParserTest.java Modified: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/blocks/MacroBlock.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/blocks/MacroBlock.java?rev=614152&r1=614151&r2=614152&view=diff ============================================================================== --- maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/blocks/MacroBlock.java (original) +++ maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/blocks/MacroBlock.java Tue Jan 22 01:03:02 2008 @@ -1,7 +1,5 @@ package org.apache.maven.doxia.module.xwiki.blocks; -import org.apache.maven.doxia.module.confluence.parser.Block; -import org.apache.maven.doxia.module.confluence.parser.FigureBlock; import org.apache.maven.doxia.sink.Sink; import java.util.HashMap; @@ -25,15 +23,7 @@ public void traverse( Sink sink ) { - if ( name.equalsIgnoreCase( "image" ) ) - { - FigureBlock block = new FigureBlock( (String) parameters.get( "default" ), (String) null ); - block.traverse( sink ); - } - else - { - // TODO - } + // TODO } public String getName() Modified: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/FigureBlockParser.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/FigureBlockParser.java?rev=614152&r1=614151&r2=614152&view=diff ============================================================================== --- maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/FigureBlockParser.java (original) +++ maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/FigureBlockParser.java Tue Jan 22 01:03:02 2008 @@ -25,7 +25,7 @@ import org.apache.maven.doxia.util.ByLineSource; /** - * This parser is left for performance reasons since it's very often that an image macro is found on a line by itself. + * This parser is required to handle image macro not inside a paragraph (i.e. found on a line by itself). * However note that macros (and thus this image macro) are also parsed by * [EMAIL PROTECTED] org.apache.maven.doxia.module.xwiki.parser.MacroParser} when they're inside a paragraph. */ @@ -46,20 +46,6 @@ { macroParser.setCompatibilityMode( isInCompatibilityMode() ); MacroParser.MacroParserResult result = macroParser.parse( line, 1 ); - - String caption = (String) result.block.getParameters().get( "alt" ); - String location = (String) result.block.getParameters().get( "default" ); - - if ( location == null ) - { - location = (String) result.block.getParameters().get( "file" ); - } - - if ( caption == null ) - { - return new FigureBlock( location ); - } - - return new FigureBlock( location, caption ); + return result.block; } } Modified: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroParser.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroParser.java?rev=614152&r1=614151&r2=614152&view=diff ============================================================================== --- maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroParser.java (original) +++ maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroParser.java Tue Jan 22 01:03:02 2008 @@ -1,5 +1,7 @@ package org.apache.maven.doxia.module.xwiki.parser; +import org.apache.maven.doxia.module.xwiki.blocks.Block; +import org.apache.maven.doxia.module.xwiki.blocks.FigureBlock; import org.apache.maven.doxia.module.xwiki.blocks.MacroBlock; import org.apache.maven.doxia.parser.ParseException; @@ -49,7 +51,7 @@ { public int position; - public MacroBlock block; + public Block block; } public MacroParser() @@ -317,7 +319,13 @@ { text.append( c ); } - else + else if (isInCompatibilityMode && state == STATE_PARAM_NAME) + { + parameters.put("default", text.toString()); + text = new StringBuffer(); + state = STATE_PARAM_NAME; + + } else { throw new ParseException( "Invalid position for character '|' in Macro" ); } @@ -345,7 +353,6 @@ { // Invalid macro, exit state = STATE_END; - i = position - 1; } else { @@ -356,12 +363,46 @@ i++; } - if ( macroName != null ) + if (state != STATE_END || macroName == null) { + // This is not a valid macro. We have two choices here: + // 1) decide that the code is not a macro and reset the cursor position at the beginning + // 2) throw a parsing exception + // For the moment we consider that the code is not a macro (option 1)). + result.position = position; + } else { - result.block = new MacroBlock( macroName, parameters, content ); + result.block = createAppropriateBlock( macroName, parameters, content ); + result.position = i; } - result.position = i; + return result; + } + + private Block createAppropriateBlock( String macroName, Map parameters, String content ) + { + Block result; + if ( macroName.equals( "image" ) ) + { + String caption = (String) parameters.get( "alt" ); + String location = (String) parameters.get( "default" ); + if ( location == null ) + { + location = (String) parameters.get( "file" ); + } + + if ( caption == null ) + { + result = new FigureBlock( location ); + } + else + { + result = new FigureBlock( location, caption ); + } + } + else + { + result = new MacroBlock( macroName, parameters, content ); + } return result; } Modified: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/XWikiParserTest.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/XWikiParserTest.java?rev=614152&r1=614151&r2=614152&view=diff ============================================================================== --- maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/XWikiParserTest.java (original) +++ maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/XWikiParserTest.java Tue Jan 22 01:03:02 2008 @@ -63,13 +63,9 @@ assertTrue( paraBlock.getBlocks().get( 0 ) instanceof TextBlock ); TextBlock textBlock1 = (TextBlock) paraBlock.getBlocks().get( 0 ); assertEquals( "Image inside a ", textBlock1.getText() ); - - // TODO: Decide if generate a MacroBlock or a FigureBlock - /* FigureBlock figureBlock = (FigureBlock) paraBlock.getBlocks().get( 1 ); - assertEquals( "photo.jpg ", figureBlock.getLocation() ); + assertEquals( "photo.jpg", figureBlock.getLocation() ); assertNull( figureBlock.getCaption() ); - */ TextBlock textBlock2 = (TextBlock) paraBlock.getBlocks().get( 2 ); assertEquals( " paragraph.", textBlock2.getText() ); } Modified: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/parser/MacroParserTest.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/parser/MacroParserTest.java?rev=614152&r1=614151&r2=614152&view=diff ============================================================================== --- maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/parser/MacroParserTest.java (original) +++ maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/parser/MacroParserTest.java Tue Jan 22 01:03:02 2008 @@ -1,6 +1,8 @@ package org.apache.maven.doxia.module.xwiki.parser; import junit.framework.TestCase; +import org.apache.maven.doxia.module.xwiki.blocks.MacroBlock; +import org.apache.maven.doxia.module.xwiki.blocks.FigureBlock; public class MacroParserTest extends TestCase @@ -20,9 +22,9 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "macro", result.block.getName() ); - assertEquals( "", result.block.getContent() ); - assertTrue( result.block.getParameters().isEmpty() ); + assertEquals( "macro", ((MacroBlock) result.block).getName() ); + assertEquals( "", ((MacroBlock) result.block).getContent() ); + assertTrue( ((MacroBlock) result.block).getParameters().isEmpty() ); } public void testParseSimplestMacroWithExpandedClosingStyle() @@ -33,9 +35,9 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "macro", result.block.getName() ); - assertEquals( "", result.block.getContent() ); - assertTrue( result.block.getParameters().isEmpty() ); + assertEquals( "macro", ((MacroBlock) result.block).getName() ); + assertEquals( "", ((MacroBlock) result.block).getContent() ); + assertTrue( ((MacroBlock) result.block).getParameters().isEmpty() ); } public void testParseMacroWithOneParameter() @@ -46,10 +48,10 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "macro", result.block.getName() ); - assertEquals( "", result.block.getContent() ); - assertEquals( 1, result.block.getParameters().size() ); - assertEquals( "value1", result.block.getParameters().get( "param1" ) ); + assertEquals( "macro", ((MacroBlock) result.block).getName() ); + assertEquals( "", ((MacroBlock) result.block).getContent() ); + assertEquals( 1, ((MacroBlock) result.block).getParameters().size() ); + assertEquals( "value1", ((MacroBlock) result.block).getParameters().get( "param1" ) ); } public void testParseMacroWithSeveralParameters() @@ -60,11 +62,11 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "macro", result.block.getName() ); - assertEquals( "", result.block.getContent() ); - assertEquals( 2, result.block.getParameters().size() ); - assertEquals( "value1", result.block.getParameters().get( "param1" ) ); - assertEquals( "value2", result.block.getParameters().get( "param2" ) ); + assertEquals( "macro", ((MacroBlock) result.block).getName() ); + assertEquals( "", ((MacroBlock) result.block).getContent() ); + assertEquals( 2, ((MacroBlock) result.block).getParameters().size() ); + assertEquals( "value1", ((MacroBlock) result.block).getParameters().get( "param1" ) ); + assertEquals( "value2", ((MacroBlock) result.block).getParameters().get( "param2" ) ); } public void testParseMacroWithContent() @@ -75,9 +77,9 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "macro", result.block.getName() ); - assertEquals( "Some /=|content", result.block.getContent() ); - assertEquals( 0, result.block.getParameters().size() ); + assertEquals( "macro", ((MacroBlock) result.block).getName() ); + assertEquals( "Some /=|content", ((MacroBlock) result.block).getContent() ); + assertEquals( 0, ((MacroBlock) result.block).getParameters().size() ); } public void testParseMacroWithInvalidMacroName() @@ -100,9 +102,9 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "code", result.block.getName() ); - assertEquals( "Some content here", result.block.getContent() ); - assertEquals( 0, result.block.getParameters().size() ); + assertEquals( "code", ((MacroBlock) result.block).getName() ); + assertEquals( "Some content here", ((MacroBlock) result.block).getContent() ); + assertEquals( 0, ((MacroBlock) result.block).getParameters().size() ); } public void testParseOldStyleMacroInCompatibilityModeWhenSinglelineMacro() @@ -114,9 +116,9 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "somesinglelinemacro", result.block.getName() ); - assertEquals( "", result.block.getContent() ); - assertEquals( 0, result.block.getParameters().size() ); + assertEquals( "somesinglelinemacro", ((MacroBlock) result.block).getName() ); + assertEquals( "", ((MacroBlock) result.block).getContent() ); + assertEquals( 0, ((MacroBlock) result.block).getParameters().size() ); } public void testParseOldStyleMacroWithDefaultParameterWithNoValue() @@ -128,10 +130,10 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "macro", result.block.getName() ); - assertEquals( "", result.block.getContent() ); - assertEquals( 1, result.block.getParameters().size() ); - assertEquals( "value", result.block.getParameters().get( "default" ) ); + assertEquals( "macro", ((MacroBlock) result.block).getName() ); + assertEquals( "", ((MacroBlock) result.block).getContent() ); + assertEquals( 1, ((MacroBlock) result.block).getParameters().size() ); + assertEquals( "value", ((MacroBlock) result.block).getParameters().get( "default" ) ); } public void testParseOldStyleMacroWithDefaultParameterWithNoValueAndOldClosingStyle() @@ -143,9 +145,50 @@ assertEquals( macro.length(), result.position ); assertNotNull( result.block ); - assertEquals( "macro", result.block.getName() ); - assertEquals( "", result.block.getContent() ); - assertEquals( 1, result.block.getParameters().size() ); - assertEquals( "value", result.block.getParameters().get( "default" ) ); + assertEquals( "macro", ((MacroBlock) result.block).getName() ); + assertEquals( "", ((MacroBlock) result.block).getContent() ); + assertEquals( 1, ((MacroBlock) result.block).getParameters().size() ); + assertEquals( "value", ((MacroBlock) result.block).getParameters().get( "default" ) ); + } + + public void testParseImageMacroWithCaptionOldStyle() + throws Exception + { + parser.setCompatibilityMode( true ); + String macro = "{image:my.png|alt=caption}"; + MacroParser.MacroParserResult result = parser.parse( macro + " ...", 1 ); + + assertEquals( macro.length(), result.position ); + assertNotNull( result.block ); + assertTrue(result.block instanceof FigureBlock ); + assertEquals( "my.png", ((FigureBlock) result.block).getLocation() ); + assertEquals( "caption", ((FigureBlock) result.block).getCaption()); + } + + public void testParseImageMacroWithoutCaptionOldStyle() + throws Exception + { + parser.setCompatibilityMode( true ); + String macro = "{image:my.png}"; + MacroParser.MacroParserResult result = parser.parse( macro + " ...", 1 ); + + assertEquals( macro.length(), result.position ); + assertNotNull( result.block ); + assertTrue(result.block instanceof FigureBlock ); + assertEquals( "my.png", ((FigureBlock) result.block).getLocation() ); + assertNull( ((FigureBlock) result.block).getCaption()); + } + + public void testParseImageMacroNewStyle() + throws Exception + { + String macro = "{image:file=my.png/}"; + MacroParser.MacroParserResult result = parser.parse( macro + " ...", 1 ); + + assertEquals( macro.length(), result.position ); + assertNotNull( result.block ); + assertTrue(result.block instanceof FigureBlock ); + assertEquals( "my.png", ((FigureBlock) result.block).getLocation() ); + assertNull( ((FigureBlock) result.block).getCaption()); } }