Author: vmassol Date: Thu Jan 10 02:42:18 2008 New Revision: 610749 URL: http://svn.apache.org/viewvc?rev=610749&view=rev Log: DOXIA-200: Add a Parser for XWiki
* Continue work on the macro parsing Added: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/parser/ 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/parser/MacroBlock.java maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroParser.java Modified: maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroBlock.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroBlock.java?rev=610749&r1=610748&r2=610749&view=diff ============================================================================== --- maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroBlock.java (original) +++ maven/sandbox/trunk/doxia/doxia-module-xwiki/src/main/java/org/apache/maven/doxia/module/xwiki/parser/MacroBlock.java Thu Jan 10 02:42:18 2008 @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; +import java.util.HashMap; public class MacroBlock extends AbstractFatherBlock @@ -13,11 +14,14 @@ private Map parameters; - public MacroBlock( String name, Map parameters, List childBlocks ) + private String content; + + public MacroBlock( String name, Map parameters, String content, List childBlocks ) { super( childBlocks ); this.name = name; this.parameters = parameters; + this.content = content; } public void before( Sink sink ) @@ -28,5 +32,21 @@ public void after( Sink sink ) { + } + + public String getName() + { + return this.name; + } + + public Map getParameters() + { + Map newParameters = new HashMap(this.parameters); + return newParameters; + } + + public String getContent() + { + return this.content; } } 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=610749&r1=610748&r2=610749&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 Thu Jan 10 02:42:18 2008 @@ -47,8 +47,8 @@ { String macroName = null; Map parameters = new HashMap(); - String parameterName; - String parameterValue; + String parameterName = null; + String content = ""; int state = STATE_NAME; StringBuffer text = new StringBuffer(); @@ -81,15 +81,16 @@ break; // {macroname:... /}. Contraction of {macroname:...}{/macroname} case '/': - if ( state != STATE_PARAM_VALUE ) - { - throw new ParseException( "Invalid position for character '/' in Macro" ); - } - else + if ( state == STATE_PARAM_VALUE || state == STATE_NAME) { if ( charAt( input, i ) == '}' ) { i++; + if (state == STATE_PARAM_VALUE) { + parameters.put(parameterName, text.toString()); + } else { + macroName = text.toString(); + } state = STATE_END; } else @@ -98,6 +99,11 @@ text.append( c ); } } + else if (state == STATE_CONTENT) { + text.append(c); + } else { + throw new ParseException( "Invalid position for character '/' in Macro" ); + } break; // {macro:...} or {macro:...}...{macro} or {macro:...}...{/macro} case '}': @@ -106,8 +112,26 @@ // * {oldsinglelinemacro:...} // * {oldmultilinemacro:...}...{oldmultilinemacro} // * {oldmultilinemacro:...}...{/oldmultilinemacro} - if ( state == STATE_PARAM_VALUE ) + if ( state == STATE_PARAM_VALUE) { + parameters.put(parameterName, text.toString()); + text = new StringBuffer(); + + // {macro:...} + if ( isInCompatibilityMode ) + { + // TODO + throw new ParseException( "Compatibility mode for macros not implemented yet" ); + } + else + { + state = STATE_CONTENT; + } + } + else if ( state == STATE_NAME) { + macroName = text.toString(); + text = new StringBuffer(); + // {macro:...} if ( isInCompatibilityMode ) { @@ -145,6 +169,13 @@ // TODO: We should probably verify here that the name of the closed macro // corresponds to the current macro being parsed. For now we just assume it // is. + content = text.toString(); + i++; + char cc; + do { + i++; + cc = input.charAt( i ); + } while ( cc != '}' && i < input.length() ); state = STATE_END; } else @@ -176,7 +207,7 @@ // supported too in param values. if ( state == STATE_PARAM_VALUE ) { - parameterValue = text.toString(); + parameters.put(parameterName, text.toString()); text = new StringBuffer(); state = STATE_PARAM_NAME; } @@ -192,7 +223,7 @@ case '=': if ( state == STATE_PARAM_NAME ) { - parameterValue = text.toString(); + parameterName = text.toString(); text = new StringBuffer(); state = STATE_PARAM_VALUE; } @@ -212,7 +243,7 @@ i++; } - blocks.add( new MacroBlock( macroName, new HashMap(), new ArrayList() ) ); + blocks.add( new MacroBlock( macroName, parameters, content, new ArrayList() ) ); return i; } Added: 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=610749&view=auto ============================================================================== --- maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/parser/MacroParserTest.java (added) +++ maven/sandbox/trunk/doxia/doxia-module-xwiki/src/test/java/org/apache/maven/doxia/module/xwiki/parser/MacroParserTest.java Thu Jan 10 02:42:18 2008 @@ -0,0 +1,89 @@ +package org.apache.maven.doxia.module.xwiki.parser; + +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +public class MacroParserTest extends TestCase +{ + private MacroParser parser; + + protected void setUp() + { + parser = new MacroParser(); + } + + public void testParseSimplestMacroWithCondensedClosingStyle() throws Exception + { + List blocks = new ArrayList(); + String macro = "{macro/}"; + int pos = parser.parse( macro + " ...", 1, blocks); + + assertEquals(macro.length(), pos); + assertEquals(1, blocks.size()); + MacroBlock macroBlock = (MacroBlock) blocks.get(0); + assertEquals("macro", macroBlock.getName()); + assertEquals("", macroBlock.getContent()); + assertTrue(macroBlock.getParameters().isEmpty()); + } + + public void testParseSimplestMacroWithExpandedClosingStyle() throws Exception + { + List blocks = new ArrayList(); + String macro = "{macro}{/macro}"; + int pos = parser.parse( macro + " ...", 1, blocks); + + assertEquals(macro.length(), pos); + assertEquals(1, blocks.size()); + MacroBlock macroBlock = (MacroBlock) blocks.get(0); + assertEquals("macro", macroBlock.getName()); + assertEquals("", macroBlock.getContent()); + assertTrue(macroBlock.getParameters().isEmpty()); + } + + public void testParseMacroWithOneParameter() throws Exception + { + List blocks = new ArrayList(); + String macro = "{macro:param1=value1/}"; + int pos = parser.parse( macro + " ...", 1, blocks); + + assertEquals(macro.length(), pos); + assertEquals(1, blocks.size()); + MacroBlock macroBlock = (MacroBlock) blocks.get(0); + assertEquals("macro", macroBlock.getName()); + assertEquals("", macroBlock.getContent()); + assertEquals(1, macroBlock.getParameters().size()); + assertEquals("value1", macroBlock.getParameters().get("param1")); + } + + public void testParseMacroWithSeveralParameters() throws Exception + { + List blocks = new ArrayList(); + String macro = "{macro:param1=value1|param2=value2/}"; + int pos = parser.parse( macro + " ...", 1, blocks); + + assertEquals(macro.length(), pos); + assertEquals(1, blocks.size()); + MacroBlock macroBlock = (MacroBlock) blocks.get(0); + assertEquals("macro", macroBlock.getName()); + assertEquals("", macroBlock.getContent()); + assertEquals(2, macroBlock.getParameters().size()); + assertEquals("value1", macroBlock.getParameters().get("param1")); + assertEquals("value2", macroBlock.getParameters().get("param2")); + } + + public void testParseMacroWithContent() throws Exception + { + List blocks = new ArrayList(); + String macro = "{macro}Some /=|content{/macro}"; + int pos = parser.parse( macro + " ...", 1, blocks); + + assertEquals(macro.length(), pos); + assertEquals(1, blocks.size()); + MacroBlock macroBlock = (MacroBlock) blocks.get(0); + assertEquals("macro", macroBlock.getName()); + assertEquals("Some /=|content", macroBlock.getContent()); + assertEquals(0, macroBlock.getParameters().size()); + } +}