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

File ConfluenceXHTMLParser.java

 

Coverage histogram

../../../../../../img/srcFileCovDistChart10.png
0% of files have more coverage

Code metrics

0
38
7
1
199
131
8
0.21
5.43
7
1.14

Classes

Class Line # Actions
ConfluenceXHTMLParser 72 38 0% 8 1
0.977777897.8%
 

Contributing tests

This file is covered by 21 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.confluencexhtml;
21   
22    import java.io.IOException;
23    import java.io.Reader;
24    import java.io.StringReader;
25    import java.util.HashMap;
26    import java.util.Map;
27   
28    import javax.inject.Inject;
29    import javax.inject.Named;
30    import javax.inject.Singleton;
31   
32    import org.apache.commons.io.IOUtils;
33    import org.xwiki.component.annotation.Component;
34    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.AttachmentTagHandler;
35    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.ConfluenceXWikiGeneratorListener;
36    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.ImageTagHandler;
37    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.LinkTagHandler;
38    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.MacroTagHandler;
39    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.PageTagHandler;
40    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.ParameterTagHandler;
41    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.PlainTextBodyTagHandler;
42    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.PlainTextLinkBodyTagHandler;
43    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.RichTextBodyTagHandler;
44    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.SpaceTagHandler;
45    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.URLTagHandler;
46    import org.xwiki.rendering.internal.parser.confluencexhtml.wikimodel.UserTagHandler;
47    import org.xwiki.rendering.internal.parser.wikimodel.AbstractWikiModelParser;
48    import org.xwiki.rendering.internal.parser.wikimodel.XWikiGeneratorListener;
49    import org.xwiki.rendering.internal.parser.xhtml.wikimodel.XWikiCommentHandler;
50    import org.xwiki.rendering.internal.parser.xhtml.wikimodel.XWikiHeaderTagHandler;
51    import org.xwiki.rendering.internal.parser.xhtml.wikimodel.XWikiReferenceTagHandler;
52    import org.xwiki.rendering.listener.Listener;
53    import org.xwiki.rendering.parser.ParseException;
54    import org.xwiki.rendering.parser.ResourceReferenceParser;
55    import org.xwiki.rendering.parser.StreamParser;
56    import org.xwiki.rendering.renderer.PrintRendererFactory;
57    import org.xwiki.rendering.syntax.Syntax;
58    import org.xwiki.rendering.util.IdGenerator;
59    import org.xwiki.rendering.wikimodel.IWikiParser;
60    import org.xwiki.rendering.wikimodel.xhtml.XhtmlParser;
61    import org.xwiki.rendering.wikimodel.xhtml.handler.TagHandler;
62   
63    /**
64    * Parses Confluence XHTML and generate rendering events.
65    *
66    * @version $Id: 7f6adc4a5a40a4136d150e56cd91803ca92f5944 $
67    * @since 5.3M2
68    */
69    @Component
70    @Named("confluence+xhtml/1.0")
71    @Singleton
 
72    public class ConfluenceXHTMLParser extends AbstractWikiModelParser
73    {
74    /**
75    * The parser used for the link label parsing. For (x)html parsing, this will be an xwiki 2.0 parser, since it's
76    * more convenient to pass link labels in xwiki syntax. See referred resource for more details.
77    *
78    * @see XWikiCommentHandler#handleLinkCommentStop(String,
79    * org.xwiki.rendering.wikimodel.xhtml.impl.TagStack)
80    */
81    @Inject
82    @Named("xdom+xml/current")
83    private StreamParser xmlParser;
84   
85    @Inject
86    @Named("xdom+xml/current")
87    private PrintRendererFactory xmlRenderer;
88   
89    /**
90    * @see #getLinkReferenceParser()
91    */
92    @Inject
93    @Named("link")
94    private ResourceReferenceParser linkReferenceParser;
95   
96    /**
97    * @see #getImageReferenceParser()
98    */
99    @Inject
100    @Named("image")
101    private ResourceReferenceParser imageReferenceParser;
102   
103    @Inject
104    @Named("plain/1.0")
105    private StreamParser plainParser;
106   
 
107  47 toggle @Override
108    public Syntax getSyntax()
109    {
110  47 return Syntax.CONFLUENCEXHTML_1_0;
111    }
112   
 
113  47 toggle @Override
114    public StreamParser getLinkLabelParser()
115    {
116  47 return this.xmlParser;
117    }
118   
 
119  44 toggle @Override
120    public IWikiParser createWikiModelParser() throws ParseException
121    {
122  44 XhtmlParser parser = new XhtmlParser();
123   
124  44 parser.setNamespacesEnabled(false);
125   
126    // Override some of the WikiModel XHTML parser tag handlers to introduce our own logic.
127  44 Map<String, TagHandler> handlers = new HashMap<String, TagHandler>();
128   
129  44 TagHandler handler = new XWikiHeaderTagHandler();
130  44 handlers.put("h1", handler);
131  44 handlers.put("h2", handler);
132  44 handlers.put("h3", handler);
133  44 handlers.put("h4", handler);
134  44 handlers.put("h5", handler);
135  44 handlers.put("h6", handler);
136  44 handlers.put("a", new XWikiReferenceTagHandler(this, this.xmlRenderer));
137   
138  44 handlers.put("ac:macro", new MacroTagHandler());
139  44 handlers.put("ac:structured-macro", new MacroTagHandler());
140  44 handlers.put("ac:parameter", new ParameterTagHandler());
141  44 handlers.put("ac:plain-text-body", new PlainTextBodyTagHandler());
142  44 handlers.put("ac:rich-text-body", new RichTextBodyTagHandler());
143   
144  44 handlers.put("ac:image", new ImageTagHandler());
145  44 handlers.put("ri:url", new URLTagHandler());
146   
147  44 handlers.put("ac:link", new LinkTagHandler());
148  44 handlers.put("ri:page", new PageTagHandler());
149  44 handlers.put("ri:space", new SpaceTagHandler());
150  44 handlers.put("ri:user", new UserTagHandler());
151  44 handlers.put("ac:plain-text-link-body", new PlainTextLinkBodyTagHandler());
152   
153  44 handlers.put("ri:attachment", new AttachmentTagHandler());
154   
155  44 parser.setExtraHandlers(handlers);
156   
157  44 return parser;
158    }
159   
 
160  44 toggle @Override
161    protected void parse(final Reader source, Listener listener, IdGenerator idGenerator) throws ParseException
162    {
163  44 String content;
164  44 try {
165  44 content = IOUtils.toString(source);
166    } catch (IOException e) {
167  0 throw new ParseException("Failed to read source", e);
168    }
169   
170    // Add <void> element around the content to make sure to have valid xml
171  44 content = "<void>" + content + "</void>";
172   
173    // Add XHTML entities
174  44 content =
175    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\""
176    + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">" + content;
177   
178  44 super.parse(new StringReader(content), listener, idGenerator);
179    }
180   
 
181  47 toggle @Override
182    public ResourceReferenceParser getLinkReferenceParser()
183    {
184  47 return this.linkReferenceParser;
185    }
186   
 
187  47 toggle @Override
188    public ResourceReferenceParser getImageReferenceParser()
189    {
190  47 return this.imageReferenceParser;
191    }
192   
 
193  47 toggle @Override
194    public XWikiGeneratorListener createXWikiGeneratorListener(Listener listener, IdGenerator idGenerator)
195    {
196  47 return new ConfluenceXWikiGeneratorListener(getLinkLabelParser(), listener, getLinkReferenceParser(),
197    getImageReferenceParser(), this.plainRendererFactory, idGenerator, getSyntax(), this.plainParser);
198    }
199    }