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

File WikiModelGeneratorListener.java

 

Coverage histogram

../../../../../../img/srcFileCovDistChart4.png
78% of files have more coverage

Code metrics

4
109
56
2
493
382
74
0.68
1.95
28
1.32

Classes

Class Line # Actions
WikiModelGeneratorListener 49 109 0% 74 109
0.3550295835.5%
WikiModelGeneratorListener.Context 57 0 - 0 0
-1.0 -
 

Contributing tests

This file is covered by 12 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.renderer.wikimodel;
21   
22    import java.util.ArrayDeque;
23    import java.util.ArrayList;
24    import java.util.Collections;
25    import java.util.Deque;
26    import java.util.List;
27    import java.util.Map;
28   
29    import org.xwiki.rendering.internal.parser.wikimodel.DefaultXWikiGeneratorListener;
30    import org.xwiki.rendering.listener.Format;
31    import org.xwiki.rendering.listener.HeaderLevel;
32    import org.xwiki.rendering.listener.ListType;
33    import org.xwiki.rendering.listener.Listener;
34    import org.xwiki.rendering.listener.MetaData;
35    import org.xwiki.rendering.listener.reference.ResourceReference;
36    import org.xwiki.rendering.syntax.Syntax;
37    import org.xwiki.rendering.wikimodel.IWemConstants;
38    import org.xwiki.rendering.wikimodel.IWemListener;
39    import org.xwiki.rendering.wikimodel.WikiFormat;
40    import org.xwiki.rendering.wikimodel.WikiParameter;
41    import org.xwiki.rendering.wikimodel.WikiParameters;
42   
43    /**
44    * Map XWiki Listener events on to WikiModel events.
45    *
46    * @version $Id: fca74e8855f1c7dc3ebbf724152b100c43f405e9 $
47    * @since 1.5RC1
48    */
 
49    public class WikiModelGeneratorListener implements Listener
50    {
51    private IWemListener wikimodelListener;
52   
53    private int docLevel = 1;
54   
55    private Deque<Context> context = new ArrayDeque<Context>();
56   
 
57    private class Context
58    {
59    int headerLevel;
60    }
61   
 
62  12 toggle public WikiModelGeneratorListener(IWemListener wikimodelListener)
63    {
64  12 this.wikimodelListener = wikimodelListener;
65    }
66   
 
67  24 toggle private Context getContext()
68    {
69  24 return this.context.peek();
70    }
71   
 
72  12 toggle private Context pushContext()
73    {
74  12 Context ctx = new Context();
75  12 this.context.push(ctx);
76  12 return ctx;
77    }
78   
 
79  12 toggle private Context popContext()
80    {
81  12 return this.context.pop();
82    }
83   
 
84  12 toggle @Override
85    public void beginDocument(MetaData metadata)
86    {
87  12 pushContext();
88   
89  12 this.wikimodelListener.beginDocument(WikiParameters.EMPTY);
90  12 this.wikimodelListener.beginSection(this.docLevel++, getContext().headerLevel++, WikiParameters.EMPTY);
91    }
92   
 
93  12 toggle @Override
94    public void endDocument(MetaData metadata)
95    {
96  12 this.wikimodelListener.endSection(this.docLevel--, getContext().headerLevel, WikiParameters.EMPTY);
97  12 this.wikimodelListener.endDocument(WikiParameters.EMPTY);
98   
99  12 popContext();
100    }
101   
 
102  0 toggle @Override
103    public void beginGroup(Map<String, String> parameters)
104    {
105  0 this.wikimodelListener.beginDocument(createWikiParameters(parameters));
106    }
107   
 
108  0 toggle @Override
109    public void endGroup(Map<String, String> parameters)
110    {
111  0 this.wikimodelListener.endDocument(createWikiParameters(parameters));
112    }
113   
 
114  0 toggle @Override
115    public void beginFormat(Format format, Map<String, String> parameters)
116    {
117  0 switch (format) {
118  0 case BOLD:
119  0 this.wikimodelListener.beginFormat(new WikiFormat(IWemConstants.STRONG,
120    createWikiParameters(parameters).toList()));
121  0 break;
122  0 case ITALIC:
123  0 this.wikimodelListener.beginFormat(new WikiFormat(IWemConstants.EM, createWikiParameters(parameters)
124    .toList()));
125  0 break;
126  0 case STRIKEDOUT:
127  0 this.wikimodelListener.beginFormat(new WikiFormat(IWemConstants.STRIKE,
128    createWikiParameters(parameters).toList()));
129  0 break;
130  0 case UNDERLINED:
131  0 this.wikimodelListener.beginFormat(new WikiFormat(IWemConstants.INS, createWikiParameters(parameters)
132    .toList()));
133  0 break;
134  0 case MONOSPACE:
135  0 this.wikimodelListener.beginFormat(new WikiFormat(IWemConstants.MONO, createWikiParameters(parameters)
136    .toList()));
137  0 break;
138  0 case SUBSCRIPT:
139  0 this.wikimodelListener.beginFormat(new WikiFormat(IWemConstants.SUB, createWikiParameters(parameters)
140    .toList()));
141  0 break;
142  0 case SUPERSCRIPT:
143  0 this.wikimodelListener.beginFormat(new WikiFormat(IWemConstants.SUP, createWikiParameters(parameters)
144    .toList()));
145  0 break;
146  0 case NONE:
147  0 this.wikimodelListener.beginFormat(new WikiFormat(createWikiParameters(parameters).toList()));
148  0 break;
149    }
150    }
151   
 
152  0 toggle @Override
153    public void endFormat(Format format, Map<String, String> parameters)
154    {
155  0 switch (format) {
156  0 case BOLD:
157  0 this.wikimodelListener.endFormat(new WikiFormat(IWemConstants.STRONG, createWikiParameters(parameters)
158    .toList()));
159  0 break;
160  0 case ITALIC:
161  0 this.wikimodelListener.endFormat(new WikiFormat(IWemConstants.EM, createWikiParameters(parameters)
162    .toList()));
163  0 break;
164  0 case STRIKEDOUT:
165  0 this.wikimodelListener.endFormat(new WikiFormat(IWemConstants.STRIKE, createWikiParameters(parameters)
166    .toList()));
167  0 break;
168  0 case UNDERLINED:
169  0 this.wikimodelListener.endFormat(new WikiFormat(IWemConstants.INS, createWikiParameters(parameters)
170    .toList()));
171  0 break;
172  0 case MONOSPACE:
173  0 this.wikimodelListener.endFormat(new WikiFormat(IWemConstants.MONO, createWikiParameters(parameters)
174    .toList()));
175  0 break;
176  0 case SUBSCRIPT:
177  0 this.wikimodelListener.endFormat(new WikiFormat(IWemConstants.SUB, createWikiParameters(parameters)
178    .toList()));
179  0 break;
180  0 case SUPERSCRIPT:
181  0 this.wikimodelListener.endFormat(new WikiFormat(IWemConstants.SUP, createWikiParameters(parameters)
182    .toList()));
183  0 break;
184  0 case NONE:
185  0 this.wikimodelListener.endFormat(new WikiFormat(createWikiParameters(parameters).toList()));
186  0 break;
187    }
188    }
189   
 
190  17 toggle @Override
191    public void beginList(ListType type, Map<String, String> parameters)
192    {
193  17 this.wikimodelListener.beginList(createWikiParameters(parameters), type == ListType.NUMBERED);
194    }
195   
 
196  30 toggle @Override
197    public void beginListItem()
198    {
199  30 this.wikimodelListener.beginListItem();
200    }
201   
 
202  0 toggle @Override
203    public void beginMacroMarker(String name, Map<String, String> parameters, String content, boolean isInline)
204    {
205    // Don't do anything since there's no notion of Macro marker in WikiModel and anyway
206    // there's nothing to render for a marker...
207    }
208   
 
209  9 toggle @Override
210    public void beginParagraph(Map<String, String> parameters)
211    {
212  9 this.wikimodelListener.beginParagraph(createWikiParameters(parameters));
213    }
214   
 
215  0 toggle @Override
216    public void beginSection(Map<String, String> parameters)
217    {
218  0 this.wikimodelListener
219    .beginSection(this.docLevel, getContext().headerLevel++, createWikiParameters(parameters));
220    }
221   
 
222  0 toggle @Override
223    public void beginHeader(HeaderLevel level, String id, Map<String, String> parameters)
224    {
225  0 this.wikimodelListener.beginHeader(level.getAsInt(), createWikiParameters(parameters));
226    }
227   
 
228  17 toggle @Override
229    public void endList(ListType type, Map<String, String> parameters)
230    {
231  17 this.wikimodelListener.endList(createWikiParameters(parameters), type == ListType.NUMBERED);
232    }
233   
 
234  30 toggle @Override
235    public void endListItem()
236    {
237  30 this.wikimodelListener.endListItem();
238    }
239   
 
240  0 toggle @Override
241    public void endMacroMarker(String name, Map<String, String> parameters, String content, boolean isInline)
242    {
243    // Don't do anything since there's no notion of Macro marker in WikiModel and anyway
244    // there's nothing to render for a marker...
245    }
246   
 
247  9 toggle @Override
248    public void endParagraph(Map<String, String> parameters)
249    {
250  9 this.wikimodelListener.endParagraph(createWikiParameters(parameters));
251    }
252   
 
253  0 toggle @Override
254    public void endSection(Map<String, String> parameters)
255    {
256  0 this.wikimodelListener
257    .beginSection(this.docLevel, getContext().headerLevel--, createWikiParameters(parameters));
258    }
259   
 
260  0 toggle @Override
261    public void endHeader(HeaderLevel level, String id, Map<String, String> parameters)
262    {
263  0 this.wikimodelListener.endHeader(level.getAsInt(), createWikiParameters(parameters));
264    }
265   
 
266  0 toggle @Override
267    public void beginLink(ResourceReference reference, boolean freestanding, Map<String, String> parameters)
268    {
269    // TODO wait for WikiModel to support wiki syntax in links
270    // See http://code.google.com/p/wikimodel/issues/detail?id=87
271    }
272   
 
273  0 toggle @Override
274    public void endLink(ResourceReference reference, boolean freestanding, Map<String, String> parameters)
275    {
276    // TODO wait for WikiModel to support wiki syntax in links
277    // See http://code.google.com/p/wikimodel/issues/detail?id=87
278    }
279   
 
280  0 toggle @Override
281    public void onMacro(String id, Map<String, String> parameters, String content, boolean inline)
282    {
283  0 if (inline) {
284  0 this.wikimodelListener.onMacroInline(id, createWikiParameters(parameters), content);
285    } else {
286  0 this.wikimodelListener.onMacroBlock(id, createWikiParameters(parameters), content);
287    }
288    }
289   
 
290  0 toggle @Override
291    public void onNewLine()
292    {
293    // TODO: Decide when to generate a line break and when to generate a new line
294  0 this.wikimodelListener.onNewLine();
295    }
296   
 
297  46 toggle @Override
298    public void onSpace()
299    {
300  46 this.wikimodelListener.onSpace(" ");
301    }
302   
 
303  0 toggle @Override
304    public void onSpecialSymbol(char symbol)
305    {
306  0 this.wikimodelListener.onSpecialSymbol("" + symbol);
307    }
308   
 
309  88 toggle @Override
310    public void onWord(String word)
311    {
312  88 this.wikimodelListener.onWord(word);
313    }
314   
 
315  0 toggle @Override
316    public void onId(String name)
317    {
318  0 this.wikimodelListener.onExtensionBlock(DefaultXWikiGeneratorListener.EXT_ID, createWikiParameters(Collections
319    .singletonMap("name", name)));
320    }
321   
 
322  0 toggle @Override
323    public void onRawText(String text, Syntax syntax)
324    {
325    // Nothing to do since wikimodel doesn't support raw content.
326    }
327   
 
328  0 toggle @Override
329    public void onHorizontalLine(Map<String, String> parameters)
330    {
331  0 this.wikimodelListener.onHorizontalLine(createWikiParameters(parameters));
332    }
333   
 
334  0 toggle @Override
335    public void onEmptyLines(int count)
336    {
337  0 this.wikimodelListener.onEmptyLines(count);
338    }
339   
 
340  2 toggle @Override
341    public void onVerbatim(String content, boolean inline, Map<String, String> parameters)
342    {
343  2 if (inline) {
344    // TODO: we're currently not handling any inline verbatim parameters (we don't have support for this in
345    // XWiki Blocks for now).
346  1 this.wikimodelListener.onVerbatimInline(content, WikiParameters.EMPTY);
347    } else {
348  1 this.wikimodelListener.onVerbatimBlock(content, createWikiParameters(parameters));
349    }
350    }
351   
 
352  0 toggle @Override
353    public void beginDefinitionList(Map<String, String> parameters)
354    {
355  0 this.wikimodelListener.beginDefinitionList(createWikiParameters(parameters));
356    }
357   
 
358  0 toggle @Override
359    public void endDefinitionList(Map<String, String> parameters)
360    {
361  0 this.wikimodelListener.endDefinitionList(createWikiParameters(parameters));
362    }
363   
 
364  0 toggle @Override
365    public void beginDefinitionTerm()
366    {
367  0 this.wikimodelListener.beginDefinitionTerm();
368    }
369   
 
370  0 toggle @Override
371    public void beginDefinitionDescription()
372    {
373  0 this.wikimodelListener.beginDefinitionDescription();
374    }
375   
 
376  0 toggle @Override
377    public void endDefinitionTerm()
378    {
379  0 this.wikimodelListener.endDefinitionTerm();
380    }
381   
 
382  0 toggle @Override
383    public void endDefinitionDescription()
384    {
385  0 this.wikimodelListener.endDefinitionDescription();
386    }
387   
 
388  0 toggle @Override
389    public void beginQuotation(Map<String, String> parameters)
390    {
391  0 this.wikimodelListener.beginQuotation(createWikiParameters(parameters));
392    }
393   
 
394  0 toggle @Override
395    public void endQuotation(Map<String, String> parameters)
396    {
397  0 this.wikimodelListener.endQuotation(createWikiParameters(parameters));
398    }
399   
 
400  0 toggle @Override
401    public void beginQuotationLine()
402    {
403  0 this.wikimodelListener.beginQuotationLine();
404    }
405   
 
406  0 toggle @Override
407    public void endQuotationLine()
408    {
409  0 this.wikimodelListener.endQuotationLine();
410    }
411   
 
412  1 toggle @Override
413    public void beginTable(Map<String, String> parameters)
414    {
415  1 this.wikimodelListener.beginTable(createWikiParameters(parameters));
416    }
417   
 
418  4 toggle @Override
419    public void beginTableCell(Map<String, String> parameters)
420    {
421  4 this.wikimodelListener.beginTableCell(false, createWikiParameters(parameters));
422    }
423   
 
424  2 toggle @Override
425    public void beginTableHeadCell(Map<String, String> parameters)
426    {
427  2 this.wikimodelListener.beginTableCell(true, createWikiParameters(parameters));
428    }
429   
 
430  3 toggle @Override
431    public void beginTableRow(Map<String, String> parameters)
432    {
433  3 this.wikimodelListener.beginTableRow(createWikiParameters(parameters));
434    }
435   
 
436  1 toggle @Override
437    public void endTable(Map<String, String> parameters)
438    {
439  1 this.wikimodelListener.endTable(createWikiParameters(parameters));
440    }
441   
 
442  4 toggle @Override
443    public void endTableCell(Map<String, String> parameters)
444    {
445  4 this.wikimodelListener.endTableCell(false, createWikiParameters(parameters));
446    }
447   
 
448  2 toggle @Override
449    public void endTableHeadCell(Map<String, String> parameters)
450    {
451  2 this.wikimodelListener.endTableCell(true, createWikiParameters(parameters));
452    }
453   
 
454  3 toggle @Override
455    public void endTableRow(Map<String, String> parameters)
456    {
457  3 this.wikimodelListener.endTableRow(createWikiParameters(parameters));
458    }
459   
 
460  0 toggle @Override
461    public void onImage(ResourceReference reference, boolean freestanding, Map<String, String> parameters)
462    {
463    // Note: This means that any WikiModel listener needs to be overridden with a XWiki specific
464    // version that knows how to handle XWiki image location format.
465    // TODO this.wikimodelListener.onReference("image:" + imageLocation);
466    }
467   
 
468  0 toggle @Override
469    public void beginMetaData(MetaData metadata)
470    {
471    // WikiModel has a notion of Property but it's different from XWiki's notion of MetaData. We could map some
472    // specific metadata as WikiModel's property but it's not important since it would be useful only to benefit
473    // from WikiModel's Renderer implementations and such implementation won't use XWiki's metadata anyway.
474    }
475   
 
476  0 toggle @Override
477    public void endMetaData(MetaData metadata)
478    {
479    // WikiModel has a notion of Property but it's different from XWiki's notion of MetaData. We could map some
480    // specific metadata as WikiModel's property but it's not important since it would be useful only to benefit
481    // from WikiModel's Renderer implementations and such implementation won't use XWiki's metadata anyway.
482    }
483   
 
484  73 toggle private WikiParameters createWikiParameters(Map<String, String> parameters)
485    {
486  73 List<WikiParameter> wikiParams = new ArrayList<WikiParameter>();
487  73 for (Map.Entry<String, String> entry : parameters.entrySet()) {
488  0 wikiParams.add(new WikiParameter(entry.getKey(), entry.getValue()));
489    }
490   
491  73 return new WikiParameters(wikiParams);
492    }
493    }