View Javadoc
1   package org.apache.maven.doxia.module.confluence;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.Reader;
23  import java.util.ArrayList;
24  import java.util.List;
25  
26  import org.apache.maven.doxia.module.confluence.parser.Block;
27  import org.apache.maven.doxia.module.confluence.parser.BlockParser;
28  import org.apache.maven.doxia.module.confluence.parser.DefinitionListBlockParser;
29  import org.apache.maven.doxia.module.confluence.parser.FigureBlockParser;
30  import org.apache.maven.doxia.module.confluence.parser.HorizontalRuleBlockParser;
31  import org.apache.maven.doxia.module.confluence.parser.ParagraphBlockParser;
32  import org.apache.maven.doxia.module.confluence.parser.SectionBlockParser;
33  import org.apache.maven.doxia.module.confluence.parser.VerbatimBlockParser;
34  import org.apache.maven.doxia.module.confluence.parser.list.ListBlockParser;
35  import org.apache.maven.doxia.module.confluence.parser.table.TableBlockParser;
36  import org.apache.maven.doxia.parser.AbstractTextParser;
37  import org.apache.maven.doxia.parser.ParseException;
38  import org.apache.maven.doxia.parser.Parser;
39  import org.apache.maven.doxia.sink.Sink;
40  import org.apache.maven.doxia.util.ByLineReaderSource;
41  import org.apache.maven.doxia.util.ByLineSource;
42  import org.codehaus.plexus.component.annotations.Component;
43  
44  /**
45   * Parse the <a href="http://www.atlassian.com/software/confluence/">Confluence</a>.
46   * See <a href="http://confluence.atlassian.com/display/CONF25/Confluence+Notation+Guide+Overview">
47   * Confluence Notation Guide Overview</a>
48   *
49   * @since 1.0
50   */
51  @Component( role = Parser.class, hint = "confluence" )
52  public class ConfluenceParser
53      extends AbstractTextParser
54  {
55      private BlockParser[] parsers;
56  
57      /**
58       * <p>Constructor for ConfluenceParser.</p>
59       */
60      public ConfluenceParser()
61      {
62          init();
63      }
64  
65      private List<Block> parse( ByLineSource source )
66          throws ParseException
67      {
68          init();
69  
70          List<Block> blocks = new ArrayList<>();
71  
72          String line;
73  
74          while ( ( line = source.getNextLine() ) != null )
75          {
76              //boolean accepted = false;
77  
78              for ( BlockParser parser : parsers )
79              {
80                  if ( line.trim().length() == 0 )
81                  {
82                      continue;
83                  }
84  
85                  if ( parser.accept( line, source ) )
86                  {
87                      //accepted = true;
88  
89                      blocks.add( parser.visit( line, source ) );
90  
91                      break;
92                  }
93              }
94  
95  /*
96              if ( !accepted )
97              {
98                  throw new ParseException( "don't know how to handle line: " + source.getLineNumber() + ": " + line );
99              }
100 */
101         }
102 
103         return blocks;
104     }
105 
106     /** {@inheritDoc} */
107     @Override
108     public void parse( Reader source, Sink sink )
109         throws ParseException
110     {
111         parse( source, sink, "" );
112     }
113 
114     /** {@inheritDoc} */
115     @Override
116     public synchronized void parse( Reader source, Sink sink, String reference )
117         throws ParseException
118     {
119         ByLineSource src = new ByLineReaderSource( source, reference );
120 
121         try
122         {
123             List<Block> blocks = parse( src );
124 
125             sink.head();
126 
127             sink.head_();
128 
129             sink.body();
130 
131             for ( Block block : blocks )
132             {
133                 block.traverse( sink );
134             }
135 
136             sink.body_();
137         }
138         catch ( Exception e )
139         {
140             // TODO handle column number
141             throw new ParseException( e, src.getName(), src.getLineNumber(), -1 );
142         }
143         finally
144         {
145             setSecondParsing( false );
146             init();
147         }
148     }
149 
150     /**
151      * {@inheritDoc}
152      */
153     protected void init()
154     {
155         super.init();
156 
157         BlockParser headingParser = new SectionBlockParser();
158         BlockParser figureParser = new FigureBlockParser();
159         BlockParser verbatimParser = new VerbatimBlockParser();
160         BlockParser definitionParser = new DefinitionListBlockParser();
161         BlockParser horizontalRuleParser = new HorizontalRuleBlockParser();
162         BlockParser listParser = new ListBlockParser();
163         BlockParser tableParser = new TableBlockParser();
164 
165         BlockParser[] subparsers =
166                 new BlockParser[] { headingParser, figureParser, listParser, tableParser, verbatimParser };
167         BlockParser paragraphParser = new ParagraphBlockParser( subparsers );
168 
169         this.parsers =
170             new BlockParser[] { headingParser, figureParser, verbatimParser, definitionParser, horizontalRuleParser,
171                 listParser, tableParser, paragraphParser };
172     }
173 }