1. Project Clover database Tue Dec 20 2016 21:24:09 CET
  2. Package org.xwiki.rendering.internal.parser.doxia

File XWikiGeneratorSink.java

 

Coverage histogram

../../../../../../img/srcFileCovDistChart5.png
74% of files have more coverage

Code metrics

12
187
134
1
1,057
770
141
0.75
1.4
134
1.05

Classes

Class Line # Actions
XWikiGeneratorSink 57 187 0% 141 172
0.483483548.3%
 

Contributing tests

This file is covered by 31 tests. .

Source view

1    /*
2    * See the NOTICE file distributed with this work for additional
3    * information regarding copyright ownership.
4    *
5    * This is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU Lesser General Public License as
7    * published by the Free Software Foundation; either version 2.1 of
8    * the License, or (at your option) any later version.
9    *
10    * This software is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13    * Lesser General Public License for more details.
14    *
15    * You should have received a copy of the GNU Lesser General Public
16    * License along with this software; if not, write to the Free
17    * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18    * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19    */
20    package org.xwiki.rendering.internal.parser.doxia;
21   
22    import java.io.StringReader;
23    import java.util.ArrayDeque;
24    import java.util.Collections;
25    import java.util.Deque;
26   
27    import org.apache.maven.doxia.logging.Log;
28    import org.apache.maven.doxia.sink.Sink;
29    import org.apache.maven.doxia.sink.SinkEventAttributes;
30    import org.xwiki.rendering.listener.CompositeListener;
31    import org.xwiki.rendering.listener.Format;
32    import org.xwiki.rendering.listener.HeaderLevel;
33    import org.xwiki.rendering.listener.InlineFilterListener;
34    import org.xwiki.rendering.listener.ListType;
35    import org.xwiki.rendering.listener.Listener;
36    import org.xwiki.rendering.listener.MetaData;
37    import org.xwiki.rendering.listener.QueueListener;
38    import org.xwiki.rendering.listener.VoidListener;
39    import org.xwiki.rendering.listener.WrappingListener;
40    import org.xwiki.rendering.listener.reference.ResourceReference;
41    import org.xwiki.rendering.listener.reference.ResourceType;
42    import org.xwiki.rendering.parser.ParseException;
43    import org.xwiki.rendering.parser.ResourceReferenceParser;
44    import org.xwiki.rendering.parser.StreamParser;
45    import org.xwiki.rendering.renderer.PrintRenderer;
46    import org.xwiki.rendering.renderer.PrintRendererFactory;
47    import org.xwiki.rendering.renderer.printer.DefaultWikiPrinter;
48    import org.xwiki.rendering.syntax.Syntax;
49    import org.xwiki.rendering.util.IdGenerator;
50   
51    /**
52    * Transforms Doxia events into XWiki Rendering events.
53    *
54    * @version $Id: 9697c19df458e7d17ab9d1b5692f89993861d95a $
55    * @since 2.1RC1
56    */
 
57    public class XWikiGeneratorSink implements Sink
58    {
59    private Deque<Listener> listener = new ArrayDeque<Listener>();
60   
61    private Deque<Object> parameters = new ArrayDeque<Object>();
62   
63    private ResourceReferenceParser linkReferenceParser;
64   
65    private IdGenerator idGenerator;
66   
67    private PrintRendererFactory plainRendererFactory;
68   
69    private StreamParser plainParser;
70   
71    private int lineBreaks = 0;
72   
73    private int inlineDepth = 0;
74   
75    private Syntax syntax;
76   
77    private MetaData documentMetadata;
78   
79    private boolean isInVerbatim;
80   
81    private StringBuffer accumulatedText = new StringBuffer();
82   
83    /**
84    * @since 3.0M3
85    */
 
86  31 toggle public XWikiGeneratorSink(Listener listener, ResourceReferenceParser linkReferenceParser,
87    PrintRendererFactory plainRendererFactory, IdGenerator idGenerator, StreamParser plainParser, Syntax syntax)
88    {
89  31 pushListener(listener);
90   
91  31 this.linkReferenceParser = linkReferenceParser;
92  31 this.idGenerator = idGenerator != null ? idGenerator : new IdGenerator();
93  31 this.plainRendererFactory = plainRendererFactory;
94  31 this.plainParser = plainParser;
95  31 this.syntax = syntax;
96  31 this.documentMetadata = new MetaData();
97  31 this.documentMetadata.addMetaData(MetaData.SYNTAX, this.syntax);
98    }
99   
 
100  481 toggle public Listener getListener()
101    {
102  481 return this.listener.peek();
103    }
104   
 
105  74 toggle private Listener pushListener(Listener listener)
106    {
107  74 this.listener.push(listener);
108  74 return listener;
109    }
110   
 
111  43 toggle private Listener popListener()
112    {
113  43 return this.listener.pop();
114    }
115   
 
116  0 toggle private boolean isInline()
117    {
118  0 return this.inlineDepth > 0;
119    }
120   
 
121  321 toggle private void flushEmptyLines()
122    {
123  321 if (this.lineBreaks > 0) {
124  0 if (isInline()) {
125  0 for (int i = 0; i < this.lineBreaks; ++i) {
126  0 getListener().onNewLine();
127    }
128    } else {
129  0 if (this.lineBreaks >= 2) {
130  0 getListener().onEmptyLines(this.lineBreaks - 1);
131    } else {
132  0 getListener().onNewLine();
133    }
134    }
135    }
136    }
137   
 
138  7 toggle @Override
139    public void flush()
140    {
141  7 flushEmptyLines();
142    }
143   
 
144  24 toggle @Override
145    public void enableLogging(Log arg0)
146    {
147    // Not used.
148    }
149   
 
150  0 toggle @Override
151    public void anchor(String name, SinkEventAttributes attributes)
152    {
153  0 flushEmptyLines();
154   
155  0 getListener().onId(name);
156    }
157   
 
158  0 toggle @Override
159    public void anchor(String name)
160    {
161  0 anchor(name, null);
162    }
163   
 
164  0 toggle @Override
165    public void anchor_()
166    {
167    // Nothing to do since for XWiki anchors don't have children and thus the XWiki Block is generated in the Sink
168    // anchor start event
169    }
170   
 
171  0 toggle @Override
172    public void author(SinkEventAttributes attributes)
173    {
174    // XWiki's Listener model doesn't support authors. Don't do anything.
175    }
176   
 
177  0 toggle @Override
178    public void author()
179    {
180    // XWiki's Listener model doesn't support authors. Don't do anything.
181    }
182   
 
183  0 toggle @Override
184    public void author_()
185    {
186    // XWiki's Listener model doesn't support authors. Don't do anything.
187    }
188   
 
189  0 toggle @Override
190    public void body(SinkEventAttributes attributes)
191    {
192  0 body();
193    }
194   
 
195  31 toggle @Override
196    public void body()
197    {
198  31 getListener().beginDocument(this.documentMetadata);
199    }
200   
 
201  31 toggle @Override
202    public void body_()
203    {
204  31 getListener().endDocument(this.documentMetadata);
205    }
206   
 
207  8 toggle @Override
208    public void bold()
209    {
210  8 flushEmptyLines();
211   
212  8 getListener().beginFormat(Format.BOLD, Listener.EMPTY_PARAMETERS);
213    }
214   
 
215  8 toggle @Override
216    public void bold_()
217    {
218  8 flushEmptyLines();
219   
220  8 getListener().endFormat(Format.BOLD, Listener.EMPTY_PARAMETERS);
221    }
222   
 
223  7 toggle @Override
224    public void close()
225    {
226    // Not used.
227    }
228   
 
229  0 toggle @Override
230    public void comment(String comment)
231    {
232    // TODO: Not supported yet by the XDOM.
233    }
234   
 
235  0 toggle @Override
236    public void date(SinkEventAttributes attributes)
237    {
238    // XWiki's Listener model doesn't support dates. Don't do anything.
239    }
240   
 
241  0 toggle @Override
242    public void date()
243    {
244    // XWiki's Listener model doesn't support dates. Don't do anything.
245    }
246   
 
247  0 toggle @Override
248    public void date_()
249    {
250    // XWiki's Listener model doesn't support dates. Don't do anything.
251    }
252   
 
253  0 toggle @Override
254    public void definedTerm(SinkEventAttributes attributes)
255    {
256  0 getListener().beginDefinitionTerm();
257   
258  0 ++this.inlineDepth;
259    }
260   
 
261  0 toggle @Override
262    public void definedTerm()
263    {
264  0 definedTerm(null);
265    }
266   
 
267  0 toggle @Override
268    public void definedTerm_()
269    {
270  0 flushEmptyLines();
271   
272    // Limitation: XWiki doesn't use parameters on this Block.
273  0 getListener().endDefinitionTerm();
274   
275  0 --this.inlineDepth;
276    }
277   
 
278  0 toggle @Override
279    public void definition(SinkEventAttributes attributes)
280    {
281  0 getListener().beginDefinitionDescription();
282   
283  0 ++this.inlineDepth;
284    }
285   
 
286  0 toggle @Override
287    public void definition()
288    {
289  0 definition(null);
290    }
291   
 
292  0 toggle @Override
293    public void definition_()
294    {
295  0 flushEmptyLines();
296   
297    // Limitation: XWiki doesn't use parameters on this Block.
298  0 getListener().endDefinitionDescription();
299   
300  0 --this.inlineDepth;
301    }
302   
 
303  0 toggle @Override
304    public void definitionList(SinkEventAttributes attributes)
305    {
306  0 flushEmptyLines();
307   
308  0 getListener().beginDefinitionList(Listener.EMPTY_PARAMETERS);
309    }
310   
 
311  0 toggle @Override
312    public void definitionList()
313    {
314  0 definitionList(null);
315    }
316   
 
317  0 toggle @Override
318    public void definitionList_()
319    {
320    // TODO: Handle parameters
321  0 getListener().endDefinitionList(Listener.EMPTY_PARAMETERS);
322    }
323   
 
324  0 toggle @Override
325    public void definitionListItem(SinkEventAttributes attributes)
326    {
327    // Nothing to do since for XWiki the definition list items are the definition term/descriptions.
328    }
329   
 
330  0 toggle @Override
331    public void definitionListItem()
332    {
333    // Nothing to do since for XWiki the definition list items are the definition term/descriptions.
334    }
335   
 
336  0 toggle @Override
337    public void definitionListItem_()
338    {
339    // Nothing to do since for XWiki the definition list items are the definition term/descriptions.
340    }
341   
 
342  0 toggle @Override
343    public void figure(SinkEventAttributes attributes)
344    {
345    // Nothing to do
346    }
347   
 
348  0 toggle @Override
349    public void figure()
350    {
351    // Nothing to do
352    }
353   
 
354  0 toggle @Override
355    public void figure_()
356    {
357    // Nothing to do
358    }
359   
 
360  0 toggle @Override
361    public void figureCaption(SinkEventAttributes attributes)
362    {
363    // TODO: Handle caption as parameters in the future
364    }
365   
 
366  0 toggle @Override
367    public void figureCaption()
368    {
369  0 figureCaption(null);
370    }
371   
 
372  0 toggle @Override
373    public void figureCaption_()
374    {
375    // TODO: Handle caption as parameters in the future
376    }
377   
 
378  0 toggle @Override
379    public void figureGraphics(String source, SinkEventAttributes attributes)
380    {
381  0 flushEmptyLines();
382   
383    // TODO: Handle image to attachments. For now we only handle URLs.
384  0 getListener().onImage(new ResourceReference(source, ResourceType.URL), false, Listener.EMPTY_PARAMETERS);
385    }
386   
 
387  0 toggle @Override
388    public void figureGraphics(String source)
389    {
390  0 figureGraphics(source, null);
391    }
392   
 
393  17 toggle @Override
394    public void head(SinkEventAttributes sinkEventAttributes)
395    {
396  17 head();
397    }
398   
 
399  31 toggle @Override
400    public void head()
401    {
402    // When in head don't output anything
403  31 pushListener(new VoidListener());
404    }
405   
 
406  31 toggle @Override
407    public void head_()
408    {
409    // Start generating stuff again...
410  31 popListener();
411    }
412   
 
413  0 toggle @Override
414    public void horizontalRule(SinkEventAttributes attributes)
415    {
416  0 flushEmptyLines();
417   
418    // TODO: Handle parameters
419  0 getListener().onHorizontalLine(Listener.EMPTY_PARAMETERS);
420    }
421   
 
422  0 toggle @Override
423    public void horizontalRule()
424    {
425  0 horizontalRule(null);
426    }
427   
 
428  6 toggle @Override
429    public void italic()
430    {
431  6 flushEmptyLines();
432   
433  6 getListener().beginFormat(Format.ITALIC, Listener.EMPTY_PARAMETERS);
434    }
435   
 
436  6 toggle @Override
437    public void italic_()
438    {
439  6 flushEmptyLines();
440   
441  6 getListener().endFormat(Format.ITALIC, Listener.EMPTY_PARAMETERS);
442    }
443   
 
444  0 toggle @Override
445    public void lineBreak(SinkEventAttributes attributes)
446    {
447  0 ++this.lineBreaks;
448    }
449   
 
450  0 toggle @Override
451    public void lineBreak()
452    {
453  0 lineBreak(null);
454    }
455   
 
456  1 toggle @Override
457    public void link(String name, SinkEventAttributes attributes)
458    {
459  1 flushEmptyLines();
460   
461  1 ResourceReference resourceReference = this.linkReferenceParser.parse(name);
462   
463  1 getListener().beginLink(resourceReference, false, Listener.EMPTY_PARAMETERS);
464   
465  1 this.parameters.push(resourceReference);
466    }
467   
 
468  1 toggle @Override
469    public void link(String name)
470    {
471  1 link(name, null);
472    }
473   
 
474  1 toggle @Override
475    public void link_()
476    {
477  1 flushEmptyLines();
478   
479  1 getListener().endLink((ResourceReference) this.parameters.pop(), false, Listener.EMPTY_PARAMETERS);
480    }
481   
 
482  15 toggle @Override
483    public void list(SinkEventAttributes attributes)
484    {
485  15 flushEmptyLines();
486   
487    // TODO: Handle parameters
488  15 getListener().beginList(ListType.BULLETED, Listener.EMPTY_PARAMETERS);
489    }
490   
 
491  5 toggle @Override
492    public void list()
493    {
494  5 list(null);
495    }
496   
 
497  15 toggle @Override
498    public void list_()
499    {
500  15 getListener().endList(ListType.BULLETED, Listener.EMPTY_PARAMETERS);
501    }
502   
 
503  27 toggle @Override
504    public void listItem(SinkEventAttributes attributes)
505    {
506    // TODO: Handle parameters
507  27 getListener().beginListItem();
508   
509  27 ++this.inlineDepth;
510    }
511   
 
512  9 toggle @Override
513    public void listItem()
514    {
515  9 listItem(null);
516    }
517   
 
518  27 toggle @Override
519    public void listItem_()
520    {
521  27 flushEmptyLines();
522   
523  27 getListener().endListItem();
524   
525  27 --this.inlineDepth;
526    }
527   
 
528  2 toggle @Override
529    public void monospaced()
530    {
531  2 flushEmptyLines();
532   
533  2 getListener().beginFormat(Format.MONOSPACE, Listener.EMPTY_PARAMETERS);
534    }
535   
 
536  2 toggle @Override
537    public void monospaced_()
538    {
539  2 flushEmptyLines();
540   
541  2 getListener().endFormat(Format.MONOSPACE, Listener.EMPTY_PARAMETERS);
542    }
543   
 
544  0 toggle @Override
545    public void nonBreakingSpace()
546    {
547  0 flushEmptyLines();
548   
549  0 getListener().onSpace();
550    }
551   
 
552  0 toggle @Override
553    public void numberedList(int numbering, SinkEventAttributes sinkEventAttributes)
554    {
555  0 flushEmptyLines();
556   
557  0 getListener().beginList(ListType.NUMBERED, Listener.EMPTY_PARAMETERS);
558    }
559   
 
560  0 toggle @Override
561    public void numberedList(int numbering)
562    {
563  0 numberedList(numbering, null);
564    }
565   
 
566  0 toggle @Override
567    public void numberedList_()
568    {
569  0 getListener().endList(ListType.NUMBERED, Listener.EMPTY_PARAMETERS);
570    }
571   
 
572  0 toggle @Override
573    public void numberedListItem(SinkEventAttributes attributes)
574    {
575  0 getListener().beginListItem();
576   
577  0 ++this.inlineDepth;
578    }
579   
 
580  0 toggle @Override
581    public void numberedListItem()
582    {
583  0 numberedListItem(null);
584    }
585   
 
586  0 toggle @Override
587    public void numberedListItem_()
588    {
589  0 flushEmptyLines();
590   
591  0 getListener().endListItem();
592   
593  0 --this.inlineDepth;
594    }
595   
 
596  0 toggle @Override
597    public void pageBreak()
598    {
599    // Not supported in XWiki.
600    }
601   
 
602  31 toggle @Override
603    public void paragraph(SinkEventAttributes attributes)
604    {
605  31 flushEmptyLines();
606   
607    // TODO: handle parameters
608  31 getListener().beginParagraph(Listener.EMPTY_PARAMETERS);
609   
610  31 ++this.inlineDepth;
611    }
612   
 
613  16 toggle @Override
614    public void paragraph()
615    {
616  16 paragraph(null);
617    }
618   
 
619  31 toggle @Override
620    public void paragraph_()
621    {
622  31 flushEmptyLines();
623   
624  31 getListener().endParagraph(Listener.EMPTY_PARAMETERS);
625   
626  31 --this.inlineDepth;
627    }
628   
 
629  0 toggle @Override
630    public void rawText(String text)
631    {
632  0 flushEmptyLines();
633   
634  0 getListener().onVerbatim(text, isInline(), Listener.EMPTY_PARAMETERS);
635    }
636   
 
637  12 toggle @Override
638    public void section(int level, SinkEventAttributes attributes)
639    {
640  12 flushEmptyLines();
641   
642  12 getListener().beginSection(Listener.EMPTY_PARAMETERS);
643    }
644   
 
645  12 toggle @Override
646    public void section_(int level)
647    {
648  12 flushEmptyLines();
649   
650  12 getListener().endSection(Listener.EMPTY_PARAMETERS);
651    }
652   
 
653  0 toggle @Override
654    public void section1()
655    {
656  0 section(1, null);
657    }
658   
 
659  0 toggle @Override
660    public void section1_()
661    {
662  0 section_(1);
663    }
664   
 
665  0 toggle @Override
666    public void section2()
667    {
668  0 section(2, null);
669    }
670   
 
671  0 toggle @Override
672    public void section2_()
673    {
674  0 section_(2);
675    }
676   
 
677  0 toggle @Override
678    public void section3()
679    {
680  0 section(3, null);
681    }
682   
 
683  0 toggle @Override
684    public void section3_()
685    {
686  0 section_(3);
687    }
688   
 
689  0 toggle @Override
690    public void section4()
691    {
692  0 section(4, null);
693    }
694   
 
695  0 toggle @Override
696    public void section4_()
697    {
698  0 section_(4);
699    }
700   
 
701  0 toggle @Override
702    public void section5()
703    {
704  0 section(5, null);
705    }
706   
 
707  0 toggle @Override
708    public void section5_()
709    {
710  0 section_(5);
711    }
712   
 
713  0 toggle @Override
714    public void section6()
715    {
716  0 section(6, null);
717    }
718   
 
719  0 toggle @Override
720    public void section6_()
721    {
722  0 section_(6);
723    }
724   
 
725  12 toggle @Override
726    public void sectionTitle(int level, SinkEventAttributes attributes)
727    {
728  12 flushEmptyLines();
729   
730  12 CompositeListener composite = new CompositeListener();
731   
732  12 composite.addListener(new QueueListener());
733  12 composite.addListener(this.plainRendererFactory.createRenderer(new DefaultWikiPrinter()));
734   
735  12 pushListener(composite);
736   
737  12 ++this.inlineDepth;
738    }
739   
 
740  0 toggle @Override
741    public void sectionTitle()
742    {
743    // Should be deprecated in Doxia
744    }
745   
 
746  12 toggle @Override
747    public void sectionTitle_(int level)
748    {
749  12 flushEmptyLines();
750   
751  12 CompositeListener composite = (CompositeListener) getListener();
752   
753  12 QueueListener queue = (QueueListener) composite.getListener(0);
754  12 PrintRenderer renderer = (PrintRenderer) composite.getListener(1);
755   
756  12 popListener();
757   
758  12 HeaderLevel headerLevel = HeaderLevel.parseInt(level);
759  12 String id = this.idGenerator.generateUniqueId("H", renderer.getPrinter().toString());
760   
761  12 getListener().beginHeader(headerLevel, id, Listener.EMPTY_PARAMETERS);
762  12 queue.consumeEvents(getListener());
763  12 getListener().endHeader(headerLevel, id, Listener.EMPTY_PARAMETERS);
764   
765  12 --this.inlineDepth;
766    }
767   
 
768  0 toggle @Override
769    public void sectionTitle_()
770    {
771    // Should be deprecated in Doxia
772    }
773   
 
774  0 toggle @Override
775    public void sectionTitle1()
776    {
777  0 sectionTitle(1, null);
778    }
779   
 
780  0 toggle @Override
781    public void sectionTitle1_()
782    {
783  0 sectionTitle_(1);
784    }
785   
 
786  0 toggle @Override
787    public void sectionTitle2()
788    {
789  0 sectionTitle(2, null);
790    }
791   
 
792  0 toggle @Override
793    public void sectionTitle2_()
794    {
795  0 sectionTitle_(2);
796    }
797   
 
798  0 toggle @Override
799    public void sectionTitle3()
800    {
801  0 sectionTitle(3, null);
802    }
803   
 
804  0 toggle @Override
805    public void sectionTitle3_()
806    {
807  0 sectionTitle_(3);
808    }
809   
 
810  0 toggle @Override
811    public void sectionTitle4()
812    {
813  0 sectionTitle(4, null);
814    }
815   
 
816  0 toggle @Override
817    public void sectionTitle4_()
818    {
819  0 sectionTitle_(4);
820    }
821   
 
822  0 toggle @Override
823    public void sectionTitle5()
824    {
825  0 sectionTitle(5, null);
826    }
827   
 
828  0 toggle @Override
829    public void sectionTitle5_()
830    {
831  0 sectionTitle_(5);
832    }
833   
 
834  0 toggle @Override
835    public void sectionTitle6()
836    {
837  0 sectionTitle(6, null);
838    }
839   
 
840  0 toggle @Override
841    public void sectionTitle6_()
842    {
843  0 sectionTitle_(6);
844    }
845   
 
846  3 toggle @Override
847    public void table(SinkEventAttributes attributes)
848    {
849  3 flushEmptyLines();
850   
851    // TODO: Handle parameters
852  3 getListener().beginTable(Listener.EMPTY_PARAMETERS);
853    }
854   
 
855  1 toggle @Override
856    public void table()
857    {
858  1 table(null);
859    }
860   
 
861  3 toggle @Override
862    public void table_()
863    {
864  3 getListener().endTable(Listener.EMPTY_PARAMETERS);
865    }
866   
 
867  0 toggle @Override
868    public void tableCaption(SinkEventAttributes attributes)
869    {
870    // TODO: Handle this
871    }
872   
 
873  0 toggle @Override
874    public void tableCaption()
875    {
876  0 tableCaption(null);
877    }
878   
 
879  0 toggle @Override
880    public void tableCaption_()
881    {
882    // TODO: Handle this
883    }
884   
 
885  12 toggle @Override
886    public void tableCell(SinkEventAttributes attributes)
887    {
888    // TODO: Handle parameters
889  12 getListener().beginTableCell(Listener.EMPTY_PARAMETERS);
890   
891  12 ++this.inlineDepth;
892    }
893   
 
894  0 toggle @Override
895    public void tableCell()
896    {
897  0 tableCell((SinkEventAttributes) null);
898    }
899   
 
900  0 toggle @Override
901    public void tableCell(String width)
902    {
903    // TODO: Handle width
904  0 tableCell((SinkEventAttributes) null);
905    }
906   
 
907  12 toggle @Override
908    public void tableCell_()
909    {
910  12 flushEmptyLines();
911   
912  12 getListener().endTableCell(Listener.EMPTY_PARAMETERS);
913   
914  12 --this.inlineDepth;
915    }
916   
 
917  6 toggle @Override
918    public void tableHeaderCell(SinkEventAttributes attributes)
919    {
920    // TODO: Handle parameters
921  6 getListener().beginTableHeadCell(Listener.EMPTY_PARAMETERS);
922   
923  6 ++this.inlineDepth;
924    }
925   
 
926  0 toggle @Override
927    public void tableHeaderCell()
928    {
929  0 tableHeaderCell((SinkEventAttributes) null);
930    }
931   
 
932  0 toggle @Override
933    public void tableHeaderCell(String width)
934    {
935    // TODO: Handle width
936  0 tableHeaderCell((SinkEventAttributes) null);
937    }
938   
 
939  6 toggle @Override
940    public void tableHeaderCell_()
941    {
942  6 flushEmptyLines();
943   
944  6 getListener().endTableHeadCell(Listener.EMPTY_PARAMETERS);
945   
946  6 --this.inlineDepth;
947    }
948   
 
949  9 toggle @Override
950    public void tableRow(SinkEventAttributes attributes)
951    {
952    // TODO: Handle parameters
953  9 getListener().beginTableRow(Listener.EMPTY_PARAMETERS);
954    }
955   
 
956  3 toggle @Override
957    public void tableRow()
958    {
959  3 tableRow(null);
960    }
961   
 
962  9 toggle @Override
963    public void tableRow_()
964    {
965  9 getListener().endTableRow(Listener.EMPTY_PARAMETERS);
966    }
967   
 
968  1 toggle @Override
969    public void tableRows(int[] arg0, boolean arg1)
970    {
971    // Not supported by XWiki.
972    }
973   
 
974  1 toggle @Override
975    public void tableRows_()
976    {
977    // Not supported by XWiki.
978    }
979   
 
980  107 toggle @Override
981    public void text(String text, SinkEventAttributes attributes)
982    {
983  107 flushEmptyLines();
984   
985  107 if (this.isInVerbatim) {
986  2 this.accumulatedText.append(text);
987  2 return;
988    }
989   
990    // TODO Handle parameters
991    // Since Doxia doesn't generate events at the word level we need to reparse the
992    // text to extract spaces, special symbols and words.
993   
994    // TODO: Use an inline parser. See http://jira.xwiki.org/jira/browse/XWIKI-2748
995  105 WrappingListener inlineFilterListener = new InlineFilterListener();
996  105 inlineFilterListener.setWrappedListener(getListener());
997   
998    // Parse the text using the plain text parser
999  105 try {
1000  105 this.plainParser.parse(new StringReader(text), inlineFilterListener);
1001    } catch (ParseException e) {
1002    // Shouldn't happen since we use a StringReader which shouldn't generate any IO.
1003  0 throw new RuntimeException("Failed to parse raw text [" + text + "]", e);
1004    }
1005    }
1006   
 
1007  107 toggle @Override
1008    public void text(String text)
1009    {
1010  107 text(text, null);
1011    }
1012   
 
1013  0 toggle @Override
1014    public void title(SinkEventAttributes attributes)
1015    {
1016    // XWiki's Listener model doesn't support titles. Don't do anything.
1017    }
1018   
 
1019  0 toggle @Override
1020    public void title()
1021    {
1022    // XWiki's Listener model doesn't support titles. Don't do anything.
1023    }
1024   
 
1025  0 toggle @Override
1026    public void title_()
1027    {
1028    // XWiki's Listener model doesn't support titles. Don't do anything.
1029    }
1030   
 
1031  2 toggle @Override
1032    public void verbatim(SinkEventAttributes attributes)
1033    {
1034  2 this.isInVerbatim = true;
1035    }
1036   
 
1037  0 toggle @Override
1038    public void verbatim(boolean boxed)
1039    {
1040  0 this.isInVerbatim = true;
1041    }
1042   
 
1043  2 toggle @Override
1044    public void verbatim_()
1045    {
1046    // TODO: Handle inline or not inline for verbatim
1047  2 getListener().onVerbatim(this.accumulatedText.toString(), true, Collections.<String, String>emptyMap());
1048  2 this.accumulatedText.setLength(0);
1049  2 this.isInVerbatim = false;
1050    }
1051   
 
1052  0 toggle @Override
1053    public void unknown(String arg0, Object[] arg1, SinkEventAttributes arg2)
1054    {
1055    // TODO: Not supported yet by the XDOM.
1056    }
1057    }