You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by vm...@apache.org on 2008/01/10 11:42:19 UTC
svn commit: r610749 - in /maven/sandbox/trunk/doxia/doxia-module-xwiki/src:
main/java/org/apache/maven/doxia/module/xwiki/parser/
test/java/org/apache/maven/doxia/module/xwiki/parser/
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());
+ }
+}