1 package org.apache.maven.doxia.siterenderer.sink;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.StringWriter;
23 import java.io.Writer;
24 import java.util.ArrayList;
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Set;
28
29 import javax.swing.text.html.HTML.Attribute;
30
31 import org.apache.maven.doxia.module.xhtml.XhtmlSink;
32 import org.apache.maven.doxia.sink.Sink;
33 import org.apache.maven.doxia.sink.SinkEventAttributes;
34 import org.apache.maven.doxia.siterenderer.RenderingContext;
35 import org.apache.maven.doxia.util.HtmlTools;
36 import org.codehaus.plexus.util.StringUtils;
37
38
39
40
41
42
43
44 public class SiteRendererSink
45 extends XhtmlSink
46 implements Sink, org.codehaus.doxia.sink.Sink
47 {
48 private String date = "";
49
50 private String title = "";
51
52 private List<String> authors = new ArrayList<String>();
53
54 private final StringWriter headWriter;
55
56 private StringBuilder sectionTitleBuffer;
57
58 private StringBuilder sectionTitleWriteBuffer;
59
60 private boolean sectionHasID;
61
62 private boolean isSectionTitle;
63
64 private Set<String> anchorsInSectionTitle;
65
66 private final Writer writer;
67
68 private RenderingContext renderingContext;
69
70
71
72
73
74
75 public SiteRendererSink( RenderingContext renderingContext )
76 {
77 this( new StringWriter(), renderingContext );
78 }
79
80
81
82
83
84
85
86 private SiteRendererSink( StringWriter writer, RenderingContext renderingContext )
87 {
88 super( writer );
89
90 this.writer = writer;
91 this.headWriter = new StringWriter();
92 this.renderingContext = renderingContext;
93 }
94
95
96 @Override
97 public void title_()
98 {
99 if ( getTextBuffer().length() > 0 )
100 {
101 title = getTextBuffer().toString();
102 }
103
104 resetTextBuffer();
105 }
106
107
108
109
110
111
112
113 @Override
114 public void title()
115 {
116 resetTextBuffer();
117 }
118
119
120
121
122
123
124 public String getTitle()
125 {
126 return title;
127 }
128
129
130 @Override
131 public void author()
132 {
133 resetTextBuffer();
134 }
135
136
137 @Override
138 public void author_()
139 {
140 if ( getTextBuffer().length() > 0 )
141 {
142 String text = HtmlTools.escapeHTML( getTextBuffer().toString() );
143 text = StringUtils.replace( text, "&#", "&#" );
144 authors.add( text.trim() );
145 }
146
147 resetTextBuffer();
148 }
149
150
151
152
153
154
155 public List<String> getAuthors()
156 {
157 return authors;
158 }
159
160
161 @Override
162 public void date()
163 {
164 resetTextBuffer();
165 }
166
167
168 @Override
169 public void date_()
170 {
171 if ( getTextBuffer().length() > 0 )
172 {
173 date = getTextBuffer().toString().trim();
174 }
175
176 resetTextBuffer();
177 }
178
179
180
181
182
183
184 public String getDate()
185 {
186 return date;
187 }
188
189
190
191
192
193
194
195 @Override
196 public void body_()
197 {
198
199 }
200
201
202
203
204
205
206
207 @Override
208 public void body()
209 {
210
211 }
212
213
214
215
216
217
218 public String getBody()
219 {
220 return writer.toString();
221 }
222
223
224
225
226
227
228
229
230 public String getHead()
231 {
232 return headWriter.toString();
233 }
234
235
236 @Override
237 public void head_()
238 {
239 setHeadFlag( false );
240 }
241
242
243 @Override
244 public void head()
245 {
246 setHeadFlag( true );
247 }
248
249
250 @Override
251 public void anchor( String name, SinkEventAttributes attributes )
252 {
253 super.anchor( name, attributes );
254 if ( isSectionTitle )
255 {
256 if ( anchorsInSectionTitle == null )
257 {
258 anchorsInSectionTitle = new HashSet<String>();
259 }
260 anchorsInSectionTitle.add( name );
261 }
262 }
263
264
265 @Override
266 protected void onSectionTitle( int depth, SinkEventAttributes attributes )
267 {
268 sectionHasID = ( attributes != null && attributes.isDefined ( Attribute.ID.toString() ) );
269 isSectionTitle = true;
270
271 super.onSectionTitle( depth, attributes );
272
273 this.sectionTitleBuffer = new StringBuilder();
274 this.sectionTitleWriteBuffer = new StringBuilder();
275 }
276
277
278 @Override
279 protected void onSectionTitle_( int depth )
280 {
281 String sectionTitle = sectionTitleBuffer.toString();
282 this.sectionTitleBuffer = null;
283 String sectionWriteTitle = sectionTitleWriteBuffer.toString();
284 this.sectionTitleWriteBuffer = null;
285
286 if ( !StringUtils.isEmpty( sectionTitle ) )
287 {
288 if ( sectionHasID )
289 {
290 sectionHasID = false;
291 }
292 else
293 {
294 String id = HtmlTools.encodeId( sectionTitle );
295 if ( ( anchorsInSectionTitle == null ) || ( !anchorsInSectionTitle.contains( id ) ) )
296 {
297 anchor( id );
298 anchor_();
299 }
300 }
301 }
302
303 super.write( sectionWriteTitle );
304
305 this.isSectionTitle = false;
306 anchorsInSectionTitle = null;
307 super.onSectionTitle_( depth );
308 }
309
310
311
312
313
314
315
316 public RenderingContext getRenderingContext()
317 {
318 return renderingContext;
319 }
320
321
322 @Override
323 public void text( String text )
324 {
325 if ( sectionTitleBuffer != null )
326 {
327
328 sectionTitleBuffer.append( text );
329 }
330
331 super.text( text );
332 }
333
334
335 @Override
336 protected void write( String text )
337 {
338 String txt = text;
339
340 if ( isHeadFlag() )
341 {
342 headWriter.write( unifyEOLs( txt ) );
343
344 return;
345 }
346
347 if ( renderingContext != null )
348 {
349 String relativePathToBasedir = renderingContext.getRelativePath();
350
351 if ( relativePathToBasedir == null )
352 {
353 txt = StringUtils.replace( txt, "$relativePath", "." );
354 }
355 else
356 {
357 txt = StringUtils.replace( txt, "$relativePath", relativePathToBasedir );
358 }
359 }
360
361 if ( sectionTitleWriteBuffer != null )
362 {
363
364 sectionTitleWriteBuffer.append( txt );
365 }
366 else
367 {
368 super.write( txt );
369 }
370 }
371 }