001package com.monochromeroad.grails.plugins.xwiki;
002
003import org.xwiki.rendering.block.XDOM;
004import org.xwiki.rendering.renderer.printer.DefaultWikiPrinter;
005import org.xwiki.rendering.syntax.Syntax;
006import org.xwiki.rendering.transformation.Transformation;
007
008import java.io.*;
009import java.util.Collections;
010
011/**
012 * XWiki Rendering System -- XDOM based
013 *
014 * <p>
015 * It needs to create a XDOM that represents the whole document structure in a memory.
016 * </p>
017 *
018 * <dl>
019 *     <dt>Default Syntax</dt>
020 *     <dd>xwiki/2.1</dd>
021 *     <dt>Output</dt>
022 *     <dd>xhtml/1.0</dd>
023 * </dl>
024 *
025 * @author Masatoshi Hayashi
026 */
027public class XWikiRenderer extends XWikiRenderingSystem {
028
029    public XWikiRenderer(XWikiComponentManager componentManager, XWikiConfigurationProvider configuration) {
030        super(componentManager, configuration);
031    }
032
033    /**
034     * For the Grails Default XWiki Rendering System.
035     * It need to be initialized after construction.
036     */
037    XWikiRenderer() {}
038
039    /**
040     * XWiki rendering
041     *
042     * @param source source text reader
043     * @param inputSyntax inputSyntax
044     * @param outputSyntax outputSyntax
045     * @return a rendered result
046     */
047    public String render(Reader source, Syntax inputSyntax, Syntax outputSyntax) {
048        return render(source, inputSyntax, outputSyntax, Collections.<Transformation>emptyList(), Collections.<Transformation>emptyList());
049    }
050
051    /**
052     * XWiki rendering
053     *
054     * @param source source text reader
055     * @param inputSyntax inputSyntax
056     * @param outputSyntax outputSyntax
057     * @param transformations transforms applied after macros
058     * @return a rendered result
059     */
060    public String render(Reader source, Syntax inputSyntax, Syntax outputSyntax, Iterable<Transformation> transformations) {
061        return render(source, inputSyntax, outputSyntax, Collections.<Transformation>emptyList(), transformations);
062    }
063
064    /**
065     * XWiki rendering
066     *
067     * @param source source text reader
068     * @param inputSyntax inputSyntax
069     * @param outputSyntax outputSyntax
070     * @param preTransformations transforms applied before macros
071     * @param postTransformations transforms applied after macros
072     * @return a rendered result
073     */
074    public String render(Reader source, Syntax inputSyntax, Syntax outputSyntax, Iterable<Transformation> preTransformations, Iterable<Transformation> postTransformations) {
075        XDOM xdom = buildXDOM(source, inputSyntax);
076        transform(xdom, inputSyntax, preTransformations, postTransformations);
077        return convertToString(xdom, outputSyntax);
078    }
079
080    /**
081     * XWiki XHTML rendering
082     *
083     * @param source a source text
084     * @param inputSyntax input syntax
085     * @return a rendered result
086     */
087    public String render(Reader source, Syntax inputSyntax) {
088        Syntax outputSyntax = configurationProvider.getDefaultOutputSyntax();
089        return render(source, inputSyntax, outputSyntax);
090    }
091
092    /**
093     * XWiki XHTML rendering
094     *
095     * @param source a source text
096     * @param inputSyntax input syntax
097     * @param transformations transforms applied after macros
098     * @return a rendered result
099     */
100    public String render(Reader source, Syntax inputSyntax, Iterable<Transformation> transformations) {
101        Syntax outputSyntax = configurationProvider.getDefaultOutputSyntax();
102        return render(source, inputSyntax, outputSyntax, transformations);
103    }
104
105    /**
106     * XWiki XHTML rendering
107     *
108     * @param source a source text
109     * @param inputSyntax input syntax
110     * @param preTransformations transforms applied before macros
111     * @param postTransformations transforms applied after macros
112     * @return a rendered result
113     */
114    public String render(Reader source, Syntax inputSyntax, Iterable<Transformation> preTransformations, Iterable<Transformation> postTransformations) {
115        Syntax outputSyntax = configurationProvider.getDefaultOutputSyntax();
116        return render(source, inputSyntax, outputSyntax, preTransformations, postTransformations);
117    }
118
119    /**
120     * XWiki XHTML rendering using default syntax.
121     *
122     * @param source a source text
123     * @return a rendered result
124     */
125    public String render(Reader source) {
126        Syntax inputSyntax = configurationProvider.getDefaultInputSyntax();
127        Syntax outputSyntax = configurationProvider.getDefaultOutputSyntax();
128        return render(source, inputSyntax, outputSyntax);
129    }
130
131    /**
132     * XWiki XHTML rendering using default syntax.
133     *
134     * @param source a source text
135     * @param transformations transforms applied after macros
136     * @return a rendered result
137     */
138    public String render(Reader source, Iterable<Transformation> transformations) {
139        Syntax inputSyntax = configurationProvider.getDefaultInputSyntax();
140        Syntax outputSyntax = configurationProvider.getDefaultOutputSyntax();
141        return render(source, inputSyntax, outputSyntax, transformations);
142    }
143
144    /**
145     * XWiki XHTML rendering using default syntax.
146     *
147     * @param source a source text
148     * @param preTransformations transforms applied before macros
149     * @param postTransformations transforms applied after macros
150     * @return a rendered result
151     */
152    public String render(Reader source, Iterable<Transformation> preTransformations, Iterable<Transformation> postTransformations) {
153        Syntax inputSyntax = configurationProvider.getDefaultInputSyntax();
154        Syntax outputSyntax = configurationProvider.getDefaultOutputSyntax();
155        return render(source, inputSyntax, outputSyntax, preTransformations, postTransformations);
156    }
157
158    /**
159     * XWiki rendering
160     *
161     * @param source a source text
162     * @param inputSyntax inputSyntax
163     * @param outputSyntax outputSyntax
164     * @return a rendered result
165     */
166    public String render(String source, Syntax inputSyntax, Syntax outputSyntax) {
167        return render(new StringReader(source), inputSyntax, outputSyntax);
168    }
169
170    /**
171     * XWiki rendering
172     *
173     * @param source a source text
174     * @param inputSyntax inputSyntax
175     * @param outputSyntax outputSyntax
176     * @param transformations transforms applied after macros
177     * @return a rendered result
178     */
179    public String render(String source, Syntax inputSyntax, Syntax outputSyntax, Iterable<Transformation> transformations) {
180        return render(new StringReader(source), inputSyntax, outputSyntax, transformations);
181    }
182
183    /**
184     * XWiki rendering
185     *
186     * @param source a source text
187     * @param inputSyntax inputSyntax
188     * @param outputSyntax outputSyntax
189     * @param preTransformations transforms applied before macros
190     * @param postTransformations transforms applied after macros
191     * @return a rendered result
192     */
193    public String render(String source, Syntax inputSyntax, Syntax outputSyntax, Iterable<Transformation> preTransformations, Iterable<Transformation> postTransformations) {
194        return render(new StringReader(source), inputSyntax, outputSyntax, preTransformations, postTransformations);
195    }
196
197    /**
198     * XWiki XHTML rendering
199     *
200     * @param source a source text
201     * @param inputSyntax inputSyntax
202     * @return a rendered result
203     */
204    public String render(String source, Syntax inputSyntax) {
205        return render(new StringReader(source), inputSyntax);
206    }
207
208    /**
209     * XWiki XHTML rendering
210     *
211     * @param source a source text
212     * @param inputSyntax inputSyntax
213     * @param transformations transforms applied after macros
214     * @return a rendered result
215     */
216    public String render(String source, Syntax inputSyntax, Iterable<Transformation> transformations) {
217        return render(new StringReader(source), inputSyntax, transformations);
218    }
219
220    /**
221     * XWiki XHTML rendering
222     *
223     * @param source a source text
224     * @param inputSyntax inputSyntax
225     * @param preTransformations transforms applied before macros
226     * @param postTransformations transforms applied after macros
227     * @return a rendered result
228     */
229    public String render(String source, Syntax inputSyntax, Iterable<Transformation> preTransformations, Iterable<Transformation> postTransformations) {
230        return render(new StringReader(source), inputSyntax, preTransformations, postTransformations);
231    }
232
233    /**
234     * XWiki XHTML rendering using default syntax
235     *
236     * @param source a source text
237     * @return a rendered result
238     */
239    public String render(String source) {
240        return render(new StringReader(source));
241    }
242
243    /**
244     * XWiki XHTML rendering using default syntax
245     *
246     * @param source a source text
247     * @param transformations transforms applied after macros
248     * @return a rendered result
249     */
250    public String render(String source, Iterable<Transformation> transformations) {
251        return render(new StringReader(source), transformations);
252    }
253
254    /**
255     * XWiki XHTML rendering using default syntax
256     *
257     * @param source a source text
258     * @param preTransformations transforms applied before macros
259     * @param postTransformations transforms applied after macros
260     * @return a rendered result
261     */
262    public String render(String source, Iterable<Transformation> preTransformations, Iterable<Transformation> postTransformations) {
263        return render(new StringReader(source), preTransformations, postTransformations);
264    }
265
266    private String convertToString(XDOM xdom, Syntax syntax) {
267        DefaultWikiPrinter printer = new DefaultWikiPrinter();
268        applyRenderer(xdom, syntax, printer);
269        return printer.toString();
270    }
271}
272