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}