001package com.monochromeroad.grails.plugins.xwiki;
002
003import org.xwiki.rendering.block.XDOM;
004import org.xwiki.rendering.parser.ParseException;
005import org.xwiki.rendering.parser.Parser;
006import org.xwiki.rendering.renderer.PrintRendererFactory;
007import org.xwiki.rendering.renderer.Renderer;
008import org.xwiki.rendering.renderer.printer.WikiPrinter;
009import org.xwiki.rendering.syntax.Syntax;
010import org.xwiki.rendering.transformation.Transformation;
011import org.xwiki.rendering.transformation.TransformationContext;
012import org.xwiki.rendering.transformation.TransformationException;
013
014import java.io.Reader;
015
016/**
017 * Base functions for XWiki rendering system.
018 *
019 * @author Masatoshi Hayashi
020 */
021public abstract class XWikiRenderingSystem {
022
023    protected XWikiConfigurationProvider configurationProvider;
024
025    protected XWikiComponentManager componentManager;
026
027    protected XWikiRenderingSystem(XWikiComponentManager componentManager, XWikiConfigurationProvider configuration) {
028        initialize(componentManager, configuration);
029    }
030
031    protected XWikiRenderingSystem() { }
032
033    final void initialize(XWikiComponentManager componentManager, XWikiConfigurationProvider configurationProvider) {
034        this.componentManager = componentManager;
035        this.configurationProvider = configurationProvider;
036    }
037
038    protected final XDOM buildXDOM(Reader source, Syntax input) {
039        Parser parser = componentManager.getInstance(Parser.class, input.toIdString());
040        try {
041            return parser.parse(source);
042        } catch (ParseException e) {
043            throw new IllegalStateException(e);
044        }
045    }
046
047    protected final void transform(XDOM xdom, Syntax syntax, Iterable<Transformation> preTransformations, Iterable<Transformation> postTransformations) {
048        TransformationContext txContext = new TransformationContext(xdom, syntax);
049
050        try {
051            for (Transformation transformation : preTransformations) {
052                transformation.transform(xdom, txContext);
053            }
054            if (configurationProvider.isMacrosEnabled()) {
055                getTransformationForMacro().transform(xdom, txContext);
056            }
057            for (Transformation transformation : postTransformations) {
058                transformation.transform(xdom, txContext);
059            }
060        } catch (TransformationException e) {
061            throw new IllegalStateException(e);
062        }
063    }
064
065    protected final Transformation getTransformationForMacro() {
066        return componentManager.getInstance(Transformation.class, "macro");
067    }
068
069    protected final void applyRenderer(XDOM xdom, Syntax syntax, WikiPrinter printer) {
070        Renderer renderer = createRenderer(syntax, printer);
071        xdom.traverse(renderer);
072    }
073
074    protected final Renderer createRenderer(Syntax output, WikiPrinter printer) {
075        PrintRendererFactory rendererFactory = componentManager.getInstance(PrintRendererFactory.class, output.toIdString());
076        return rendererFactory.createRenderer(printer);
077    }
078
079}