/*
* Copyright (C) 2003-2010 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.wiki.rendering.render.confluence;
import org.xwiki.component.annotation.Component;
import org.xwiki.component.annotation.InstantiationStrategy;
import org.xwiki.component.annotation.Requirement;
import org.xwiki.component.descriptor.ComponentInstantiationStrategy;
import org.xwiki.component.phase.Initializable;
import org.xwiki.component.phase.InitializationException;
import org.xwiki.rendering.listener.chaining.BlockStateChainingListener;
import org.xwiki.rendering.listener.chaining.ConsecutiveNewLineStateChainingListener;
import org.xwiki.rendering.listener.chaining.GroupStateChainingListener;
import org.xwiki.rendering.listener.chaining.ListenerChain;
import org.xwiki.rendering.listener.chaining.LookaheadChainingListener;
import org.xwiki.rendering.renderer.AbstractChainingPrintRenderer;
import org.xwiki.rendering.renderer.reference.ResourceReferenceSerializer;
/**
* Created by The eXo Platform SAS
* Author : viet nguyen
* viet.nguyen@exoplatform.com
* Jul 2, 2010
*/
/**
* Generates Confluence Syntax from {@link org.xwiki.rendering.block.XDOM}.
*/
@Component("confluence/1.0")
@InstantiationStrategy(ComponentInstantiationStrategy.PER_LOOKUP)
public class ConfluenceSyntaxRenderer extends AbstractChainingPrintRenderer implements Initializable {
/**
* Needed by XWikiSyntaxChainingRenderer to serialize wiki link references.
*/
@Requirement("confluence/1.0/link")
private ResourceReferenceSerializer linkReferenceSerializer;
/**
* {@inheritDoc}
*
* @see Initializable#initialize()
*/
public void initialize() throws InitializationException {
ListenerChain chain = new ConfluenceSyntaxListenerChain();
setListenerChain(chain);
// Construct the listener chain in the right order. Listeners early in the chain are called before listeners
// placed later in the chain. This chain allows using several listeners that make it easier
// to write the Confluence Syntax chaining listener, for example for saving states (are we in a list, in a
// paragraph, are we starting a new line, etc).
chain.addListener(this);
chain.addListener(new LookaheadChainingListener(chain, 2));
chain.addListener(new GroupStateChainingListener(chain));
chain.addListener(new BlockStateChainingListener(chain));
chain.addListener(new ConsecutiveNewLineStateChainingListener(chain));
chain.addListener(new ConfluenceSyntaxChainingRenderer(chain, this.linkReferenceSerializer));
}
}