1 package org.apache.maven.doxia.module.twiki;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.doxia.module.twiki.parser.Block;
23 import org.apache.maven.doxia.module.twiki.parser.BlockParser;
24 import org.apache.maven.doxia.module.twiki.parser.FormatedTextParser;
25 import org.apache.maven.doxia.module.twiki.parser.GenericListBlockParser;
26 import org.apache.maven.doxia.module.twiki.parser.HRuleBlockParser;
27 import org.apache.maven.doxia.module.twiki.parser.ParagraphBlockParser;
28 import org.apache.maven.doxia.module.twiki.parser.SectionBlock;
29 import org.apache.maven.doxia.module.twiki.parser.SectionBlockParser;
30 import org.apache.maven.doxia.module.twiki.parser.TableBlockParser;
31 import org.apache.maven.doxia.module.twiki.parser.TextParser;
32 import org.apache.maven.doxia.module.twiki.parser.VerbatimBlockParser;
33 import org.apache.maven.doxia.module.twiki.parser.XHTMLWikiWordLinkResolver;
34 import org.apache.maven.doxia.parser.AbstractTextParser;
35 import org.apache.maven.doxia.parser.ParseException;
36 import org.apache.maven.doxia.parser.Parser;
37 import org.apache.maven.doxia.sink.Sink;
38 import org.apache.maven.doxia.util.ByLineReaderSource;
39 import org.apache.maven.doxia.util.ByLineSource;
40 import org.codehaus.plexus.component.annotations.Component;
41
42 import java.io.Reader;
43 import java.util.ArrayList;
44 import java.util.List;
45
46
47
48
49
50
51
52
53
54 @Component( role = Parser.class, hint = "twiki" )
55 public class TWikiParser
56 extends AbstractTextParser
57 {
58 private static final int EXTENSION_LENGTH = 6;
59
60
61 private final ParagraphBlockParser paraParser = new ParagraphBlockParser();
62
63
64 private final SectionBlockParser sectionParser = new SectionBlockParser();
65
66
67 private final GenericListBlockParser listParser = new GenericListBlockParser();
68
69
70 private final FormatedTextParser formatTextParser = new FormatedTextParser();
71
72
73
74
75
76
77 private final TextParser textParser = new TextParser( new XHTMLWikiWordLinkResolver() );
78
79
80 private final HRuleBlockParser hrulerParser = new HRuleBlockParser();
81
82
83 private final TableBlockParser tableParser = new TableBlockParser();
84
85
86 private final VerbatimBlockParser verbatimParser = new VerbatimBlockParser();
87
88
89 private BlockParser[] parsers;
90
91
92
93
94 public TWikiParser()
95 {
96 init();
97 }
98
99
100
101
102
103
104
105
106 public final List<Block> parse( final ByLineSource source )
107 throws ParseException
108 {
109 final List<Block> ret = new ArrayList<Block>();
110
111 String line;
112 while ( ( line = source.getNextLine() ) != null )
113 {
114 boolean accepted = false;
115
116 for ( BlockParser parser : parsers )
117 {
118 if ( parser.accept( line ) )
119 {
120 accepted = true;
121 ret.add( parser.visit( line, source ) );
122 break;
123 }
124 }
125 if ( !accepted )
126 {
127 throw new ParseException( "Line number not handle : " + source.getLineNumber() + ": " + line );
128 }
129 }
130
131 return ret;
132 }
133
134
135 public final synchronized void parse( final Reader source, final Sink sink )
136 throws ParseException
137 {
138 init();
139
140 List<Block> blocks;
141 final ByLineSource src = new ByLineReaderSource( source );
142
143 try
144 {
145 blocks = parse( src );
146 }
147 catch ( final Exception e )
148 {
149
150 throw new ParseException( e, src.getName(), src.getLineNumber(), -1 );
151 }
152
153 sink.head();
154
155 final String title = getTitle( blocks, src );
156 if ( title != null )
157 {
158 sink.title();
159 sink.text( title );
160 sink.title_();
161 }
162
163 sink.head_();
164 sink.body();
165 for ( Block block : blocks )
166 {
167 block.traverse( sink );
168 }
169 sink.body_();
170 sink.flush();
171 sink.close();
172
173 setSecondParsing( false );
174 init();
175 }
176
177
178
179
180
181
182
183
184
185
186
187 public final String getTitle( final List<Block> blocks, final ByLineSource source )
188 {
189 String title = null;
190
191 for ( Block block : blocks )
192 {
193 if ( block instanceof SectionBlock )
194 {
195 final SectionBlock sectionBlock = (SectionBlock) block;
196 title = sectionBlock.getTitle();
197 break;
198 }
199 }
200
201 if ( title == null )
202 {
203 String name = source.getName();
204 if ( name != null )
205 {
206 name = name.trim();
207
208 if ( name.length() != 0 )
209 {
210 if ( name.endsWith( ".twiki" ) )
211 {
212 title = name.substring( 0, name.length() - EXTENSION_LENGTH );
213 }
214 else
215 {
216 title = name;
217 }
218 }
219 }
220 }
221
222 return title;
223 }
224
225
226 protected void init()
227 {
228 super.init();
229
230 paraParser.setSectionParser( sectionParser );
231 paraParser.setListParser( listParser );
232 paraParser.setTextParser( formatTextParser );
233 paraParser.setHrulerParser( hrulerParser );
234 paraParser.setTableBlockParser( tableParser );
235 paraParser.setVerbatimParser( verbatimParser );
236 sectionParser.setParaParser( paraParser );
237 sectionParser.setHrulerParser( hrulerParser );
238 sectionParser.setVerbatimBlockParser( verbatimParser );
239 listParser.setTextParser( formatTextParser );
240 formatTextParser.setTextParser( textParser );
241 tableParser.setTextParser( formatTextParser );
242
243 this.parsers = new BlockParser[] { sectionParser, hrulerParser, verbatimParser, paraParser };
244 }
245 }