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