1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.nuiton.jrst.convertisor;
23
24 import java.util.ArrayList;
25 import java.util.List;
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.dom4j.Element;
29 import org.dom4j.VisitorSupport;
30 import org.nuiton.jrst.legacy.ReStructuredText;
31
32
33
34
35
36 public abstract class DocUtilsVisitor extends VisitorSupport {
37
38 public static final String EMPTY_STRING = "";
39 public static final String LINE_SEPARATOR = "\n";
40 public static final String SPACE = " ";
41
42 private static Log log = LogFactory.getLog(DocUtilsVisitor.class);
43
44 protected List<Element> cachedElements;
45
46 protected StringBuilder rstResult;
47
48
49
50
51 public abstract String composeDocument(Element e);
52
53
54
55
56 public abstract String composeTitle(Element e);
57
58 public abstract String composeSubTitle(Element e);
59
60
61
62
63 public abstract String composeDocInfo(Element e);
64
65
66 public abstract String composeAutor(Element e);
67
68 public abstract String composeAutors(Element e);
69
70 public abstract String composeOrganisation(Element e);
71
72 public abstract String composeAddress(Element e);
73
74 public abstract String composeContact(Element e);
75
76 public abstract String composeVersion(Element e);
77
78 public abstract String composeResvision(Element e);
79
80 public abstract String composeStatus(Element e);
81
82 public abstract String composeDate(Element e);
83
84 public abstract String composeCopyright(Element e);
85
86
87
88
89 public abstract String composeDecoration(Element e);
90
91 public abstract String composeHeader(Element e);
92
93 public abstract String composeFooter(Element e);
94
95
96
97
98 public abstract String composeSection(Element e);
99
100 public abstract String composeTopic(Element e);
101
102 public abstract String composeSideBar(Element e);
103
104 public abstract String composeTransition(Element e);
105
106
107
108
109 public abstract String composeParagraph(Element e);
110
111 public abstract String composeCompound(Element e);
112
113 public abstract String composeContainer(Element e);
114
115 public abstract String composeBulletList(Element e);
116
117 public abstract String composeEnumeratedList(Element e);
118
119 public abstract String composeListItem(Element e);
120
121 public abstract String composeDefinitionList(Element e);
122
123 public abstract String composeDefinitionListItem(Element e);
124
125 public abstract String composeTerm(Element e);
126
127 public abstract String composeClassifier(Element e);
128
129 public abstract String composeDefinition(Element e);
130
131 public abstract String composeFieldList(Element e);
132
133 public abstract String composeField(Element e);
134
135 public abstract String composeFieldName(Element e);
136
137 public abstract String composeFieldBody(Element e);
138
139 public abstract String composeOptionList(Element e);
140
141 public abstract String composeOptionListItem(Element e);
142
143 public abstract String composeOptionGroup(Element e);
144
145 public abstract String composeOption(Element e);
146
147 public abstract String composeOptionString(Element e);
148
149 public abstract String composeOptionArgument(Element e);
150
151 public abstract String composeDescription(Element e);
152
153 public abstract String composeLiteralBlock(Element e);
154
155 public abstract String composeLineBlock(Element e);
156
157 public abstract String composeLine(Element e);
158
159 public abstract String composeBlockQuote(Element e);
160
161 public abstract String composeAttribution(Element e);
162
163 public abstract String composeDocTestBlock(Element e);
164
165 public abstract String composeAttention(Element e);
166
167 public abstract String composeCaution(Element e);
168
169 public abstract String composeDanger(Element e);
170
171 public abstract String composeError(Element e);
172
173 public abstract String composeHint(Element e);
174
175 public abstract String composeImportant(Element e);
176
177 public abstract String composeNote(Element e);
178
179 public abstract String composeTip(Element e);
180
181 public abstract String composeWarning(Element e);
182
183 public abstract String composeAdmonition(Element e);
184
185 public abstract String composeFootnote(Element e);
186
187 public abstract String composeCitation(Element e);
188
189 public abstract String composeLabel(Element e);
190
191 public abstract String composeRubric(Element e);
192
193 public abstract String composeTarget(Element e);
194
195 public abstract String composeSubstitutionDefinition(Element e);
196
197 public abstract String composeComment(Element e);
198
199 public abstract String composePending(Element e);
200
201 public abstract String composeFigure(Element e);
202
203 public abstract String composeImage(Element e);
204
205 public abstract String composeCaption(Element e);
206
207 public abstract String composeLegend(Element e);
208
209 public abstract String composeSystemMessage(Element e);
210
211 public abstract String composeRaw(Element e);
212
213
214 public abstract String composeTable(Element e);
215
216 public abstract String composeTgroup(Element e);
217
218 public abstract String composeColspec(Element e);
219
220 public abstract String composeThead(Element e);
221
222 public abstract String composeTbody(Element e);
223
224 public abstract String composeRow(Element e);
225
226 public abstract String composeEntry(Element e);
227
228
229
230
231 public abstract String composeEmphasis(Element e);
232
233 public abstract String composeStrong(Element e);
234
235 public abstract String composeLiteral(Element e);
236
237 public abstract String composeReference(Element e);
238
239 public abstract String composeFootnoteReference(Element e);
240
241 public abstract String composeCitationReference(Element e);
242
243 public abstract String composeSubstitutionReference(Element e);
244
245 public abstract String composeTitleReference(Element e);
246
247 public abstract String composeAbbreviation(Element e);
248
249 public abstract String composeAcronyme(Element e);
250
251 public abstract String composeSuperscipt(Element e);
252
253 public abstract String composeSubscript(Element e);
254
255 public abstract String composeInline(Element e);
256
257 public abstract String composeProblematic(Element e);
258
259 public abstract String composeGenerated(Element e);
260
261 public DocUtilsVisitor() {
262 cachedElements = new ArrayList<Element>();
263 rstResult = new StringBuilder();
264 }
265
266 @Override
267 public void visit(Element e) {
268
269 if (!cachedElements.contains(e)) {
270 log.debug("entre element " + e.getName());
271 addCachedElement(e);
272
273
274
275
276 if (elementEquals(ReStructuredText.DOCUMENT, e)) {
277 appendResult(composeDocument(e));
278 }
279
280
281 else if (elementEquals(ReStructuredText.TITLE, e)) {
282 appendResult(composeTitle(e));
283 } else if (elementEquals(ReStructuredText.SUBTITLE, e)) {
284 appendResult(composeSubTitle(e));
285 }
286
287
288 else if (elementEquals(ReStructuredText.DOCINFO, e)) {
289 appendResult(composeDocInfo(e));
290
291
292 } else if (elementEquals(ReStructuredText.AUTHOR, e)) {
293 appendResult(composeAutor(e));
294 } else if (elementEquals(ReStructuredText.AUTHORS, e)) {
295 appendResult(composeAutors(e));
296 } else if (elementEquals(ReStructuredText.ORGANIZATION, e)) {
297 appendResult(composeOrganisation(e));
298 } else if (elementEquals(ReStructuredText.ADDRESS, e)) {
299 appendResult(composeAddress(e));
300 } else if (elementEquals(ReStructuredText.CONTACT, e)) {
301 appendResult(composeContact(e));
302 } else if (elementEquals(ReStructuredText.VERSION, e)) {
303 appendResult(composeVersion(e));
304 } else if (elementEquals(ReStructuredText.REVISION, e)) {
305 appendResult(composeResvision(e));
306 } else if (elementEquals(ReStructuredText.STATUS, e)) {
307 appendResult(composeStatus(e));
308 } else if (elementEquals(ReStructuredText.DATE, e)) {
309 appendResult(composeDate(e));
310 } else if (elementEquals(ReStructuredText.COPYRIGHT, e)) {
311 appendResult(composeCopyright(e));
312 }
313
314
315 else if (elementEquals(ReStructuredText.DECORATION, e)) {
316 appendResult(composeDecoration(e));
317 } else if (elementEquals(ReStructuredText.HEADER, e)) {
318 appendResult(composeHeader(e));
319 } else if (elementEquals(ReStructuredText.FOOTER, e)) {
320 appendResult(composeFooter(e));
321 }
322
323
324 else if (elementEquals(ReStructuredText.SECTION, e)) {
325 appendResult(composeSection(e));
326 } else if (elementEquals(ReStructuredText.TOPIC, e)) {
327 appendResult(composeTopic(e));
328 } else if (elementEquals(ReStructuredText.SIDEBAR, e)) {
329 appendResult(composeSideBar(e));
330 } else if (elementEquals(ReStructuredText.TRANSITION, e)) {
331 appendResult(composeTransition(e));
332 }
333
334
335 else if (elementEquals(ReStructuredText.PARAGRAPH, e)) {
336 appendResult(composeParagraph(e));
337 } else if (elementEquals(ReStructuredText.COMPOUND, e)) {
338 appendResult(composeCompound(e));
339 } else if (elementEquals(ReStructuredText.CONTAINER, e)) {
340 appendResult(composeContainer(e));
341 } else if (elementEquals(ReStructuredText.BULLET_LIST, e)) {
342 appendResult(composeBulletList(e));
343 } else if (elementEquals(ReStructuredText.ENUMERATED_LIST, e)) {
344 appendResult(composeEnumeratedList(e));
345 } else if (elementEquals(ReStructuredText.LIST_ITEM, e)) {
346 appendResult(composeListItem(e));
347 } else if (elementEquals(ReStructuredText.DEFINITION_LIST, e)) {
348 appendResult(composeDefinitionList(e));
349 } else if (elementEquals(ReStructuredText.DEFINITION_LIST_ITEM, e)) {
350 appendResult(composeDefinitionListItem(e));
351 } else if (elementEquals(ReStructuredText.TERM, e)) {
352 appendResult(composeTerm(e));
353 } else if (elementEquals(ReStructuredText.CLASSIFIER, e)) {
354 appendResult(composeClassifier(e));
355 } else if (elementEquals(ReStructuredText.DEFINITION, e)) {
356 appendResult(composeDefinition(e));
357 } else if (elementEquals(ReStructuredText.FIELD_LIST, e)) {
358 appendResult(composeFieldList(e));
359 } else if (elementEquals(ReStructuredText.FIELD, e)) {
360 appendResult(composeField(e));
361 } else if (elementEquals(ReStructuredText.FIELD_NAME, e)) {
362 appendResult(composeFieldName(e));
363 } else if (elementEquals(ReStructuredText.FIELD_BODY, e)) {
364 appendResult(composeFieldBody(e));
365 } else if (elementEquals(ReStructuredText.OPTION_LIST, e)) {
366 appendResult(composeOptionList(e));
367 } else if (elementEquals(ReStructuredText.OPTION_LIST_ITEM, e)) {
368 appendResult(composeOptionListItem(e));
369 } else if (elementEquals(ReStructuredText.OPTION_GROUP, e)) {
370 appendResult(composeOptionGroup(e));
371 } else if (elementEquals(ReStructuredText.OPTION, e)) {
372 appendResult(composeOption(e));
373 } else if (elementEquals(ReStructuredText.OPTION_STRING, e)) {
374 appendResult(composeOptionString(e));
375 } else if (elementEquals(ReStructuredText.OPTION_ARGUMENT, e)) {
376 appendResult(composeOptionArgument(e));
377 } else if (elementEquals(ReStructuredText.DESCRIPTION, e)) {
378 appendResult(composeDescription(e));
379 } else if (elementEquals(ReStructuredText.LITERAL_BLOCK, e)) {
380 appendResult(composeLiteralBlock(e));
381 } else if (elementEquals(ReStructuredText.LINE_BLOCK, e)) {
382 appendResult(composeLineBlock(e));
383 } else if (elementEquals(ReStructuredText.LINE, e)) {
384 appendResult(composeLine(e));
385 } else if (elementEquals(ReStructuredText.BLOCK_QUOTE, e)) {
386 appendResult(composeBlockQuote(e));
387 } else if (elementEquals(ReStructuredText.ATTRIBUTION, e)) {
388 appendResult(composeAttribution(e));
389 } else if (elementEquals(ReStructuredText.DOCTEST_BLOCK, e)) {
390 appendResult(composeDocTestBlock(e));
391 } else if (elementEquals(ReStructuredText.ATTENTION, e)) {
392 appendResult(composeAttention(e));
393 } else if (elementEquals(ReStructuredText.CAUTION, e)) {
394 appendResult(composeCaution(e));
395 } else if (elementEquals(ReStructuredText.DANGER, e)) {
396 appendResult(composeDanger(e));
397 } else if (elementEquals(ReStructuredText.ERROR, e)) {
398 appendResult(composeError(e));
399 } else if (elementEquals(ReStructuredText.HINT, e)) {
400 appendResult(composeHint(e));
401 } else if (elementEquals(ReStructuredText.IMPORTANT, e)) {
402 appendResult(composeImportant(e));
403 } else if (elementEquals(ReStructuredText.NOTE, e)) {
404 appendResult(composeNote(e));
405 } else if (elementEquals(ReStructuredText.TIP, e)) {
406 appendResult(composeTip(e));
407 } else if (elementEquals(ReStructuredText.WARNING, e)) {
408 appendResult(composeWarning(e));
409 } else if (elementEquals(ReStructuredText.ADMONITION, e)) {
410 appendResult(composeAdmonition(e));
411 } else if (elementEquals(ReStructuredText.FOOTNOTE, e)) {
412 appendResult(composeFootnote(e));
413 } else if (elementEquals(ReStructuredText.CITATION, e)) {
414 appendResult(composeCitation(e));
415 } else if (elementEquals(ReStructuredText.LABEL, e)) {
416 appendResult(composeLabel(e));
417 } else if (elementEquals(ReStructuredText.RUBRIC, e)) {
418 appendResult(composeRubric(e));
419 } else if (elementEquals(ReStructuredText.TARGET, e)) {
420 appendResult(composeTarget(e));
421 } else if (elementEquals(ReStructuredText.SUBSTITUTION_DEFINITION, e)) {
422 appendResult(composeSubstitutionDefinition(e));
423 } else if (elementEquals(ReStructuredText.COMMENT, e)) {
424 appendResult(composeComment(e));
425 } else if (elementEquals(ReStructuredText.PENDING, e)) {
426 appendResult(composePending(e));
427 } else if (elementEquals(ReStructuredText.FIGURE, e)) {
428 appendResult(composeFigure(e));
429 } else if (elementEquals(ReStructuredText.IMAGE, e)) {
430 appendResult(composeImage(e));
431 } else if (elementEquals(ReStructuredText.CAPTION, e)) {
432 appendResult(composeCaption(e));
433 } else if (elementEquals(ReStructuredText.LEGEND, e)) {
434 appendResult(composeLegend(e));
435 } else if (elementEquals(ReStructuredText.SYSTEM_MESSAGE, e)) {
436 appendResult(composeSystemMessage(e));
437 } else if (elementEquals(ReStructuredText.RAW, e)) {
438 appendResult(composeRaw(e));
439
440
441 } else if (elementEquals(ReStructuredText.TABLE, e)) {
442 appendResult(composeTable(e));
443 } else if (elementEquals(ReStructuredText.TGROUP, e)) {
444 appendResult(composeTgroup(e));
445 } else if (elementEquals(ReStructuredText.COLSPEC, e)) {
446 appendResult(composeColspec(e));
447 } else if (elementEquals(ReStructuredText.THEAD, e)) {
448 appendResult(composeThead(e));
449 } else if (elementEquals(ReStructuredText.TBODY, e)) {
450 appendResult(composeTbody(e));
451 } else if (elementEquals(ReStructuredText.ROW, e)) {
452 appendResult(composeRow(e));
453 } else if (elementEquals(ReStructuredText.ENTRY, e)) {
454 appendResult(composeEntry(e));
455 }
456
457
458 else if (elementEquals(ReStructuredText.EMPHASIS, e)) {
459 appendResult(composeEmphasis(e));
460 } else if (elementEquals(ReStructuredText.STRONG, e)) {
461 appendResult(composeStrong(e));
462 } else if (elementEquals(ReStructuredText.LITERAL, e)) {
463 appendResult(composeLiteral(e));
464 } else if (elementEquals(ReStructuredText.REFERENCE, e)) {
465 appendResult(composeReference(e));
466 } else if (elementEquals(ReStructuredText.FOOTNOTE_REFERENCE, e)) {
467 appendResult(composeFootnoteReference(e));
468 } else if (elementEquals(ReStructuredText.CITATION_REFERENCE, e)) {
469 appendResult(composeCitationReference(e));
470 } else if (elementEquals(ReStructuredText.SUBSTITUTION_REFERENCE, e)) {
471 appendResult(composeSubstitutionReference(e));
472 } else if (elementEquals(ReStructuredText.TITLE_REFERENCE, e)) {
473 appendResult(composeTitleReference(e));
474 } else if (elementEquals(ReStructuredText.ABBREVIATION, e)) {
475 appendResult(composeAbbreviation(e));
476 } else if (elementEquals(ReStructuredText.ACRONYM, e)) {
477 appendResult(composeAcronyme(e));
478 } else if (elementEquals(ReStructuredText.SUPERSCRIPT, e)) {
479 appendResult(composeSuperscipt(e));
480 } else if (elementEquals(ReStructuredText.SUBSCRIPT, e)) {
481 appendResult(composeSubscript(e));
482 } else if (elementEquals(ReStructuredText.INLINE, e)) {
483 appendResult(composeInline(e));
484 } else if (elementEquals(ReStructuredText.PROBLEMATIC, e)) {
485 appendResult(composeProblematic(e));
486 } else if (elementEquals(ReStructuredText.GENERATED, e)) {
487 appendResult(composeGenerated(e));
488 }
489
490 }
491 }
492
493 public String parseDocument(Element el) {
494 try {
495
496 if (log.isDebugEnabled()) {
497 log.debug("This element : " + el.getName());
498 }
499
500
501 DocUtilsVisitor visitor = getClass().newInstance();
502
503
504 try {
505 el.accept(visitor);
506 String result = visitor.getResult();
507 if (log.isDebugEnabled()) {
508 log.debug("document parsing result:\n" + result);
509 }
510 return result;
511 } finally {
512
513 addCachedElements(visitor.getCachedElements());
514
515 visitor.clear();
516 }
517
518 } catch (Exception ex) {
519 if (log.isErrorEnabled()) {
520 log.error("Cant compose document for reason " + ex.getMessage(), ex);
521 }
522
523 return EMPTY_STRING;
524 }
525 }
526
527 public String getResult() {
528 return rstResult.toString();
529 }
530
531 public void clear() {
532 cachedElements.clear();
533 rstResult = null;
534 }
535
536 protected void appendResult(String result) {
537 rstResult.append(result);
538 }
539
540 protected boolean elementEquals(String name, Element e) {
541 return e.getName().equals(name);
542 }
543
544 protected List<Element> getCachedElements() {
545 return cachedElements;
546 }
547
548
549 protected void addCachedElement(Element e) {
550 cachedElements.add(e);
551 }
552
553 protected void addCachedElements(List<Element> elements) {
554 cachedElements.addAll(elements);
555 }
556
557 protected String indent(String toIndent, int l) {
558 String prefix = EMPTY_STRING;
559 for (int i = 0; i < l; i++) {
560 prefix += SPACE;
561 }
562 StringBuilder buffer = new StringBuilder();
563 for (String s : toIndent.split(LINE_SEPARATOR)) {
564 buffer.append(prefix).append(s).append(LINE_SEPARATOR);
565 }
566 return buffer.toString();
567 }
568 }