/*
* Copyright (C) 2010 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wikbook.core.render.docbook;
import org.wikbook.core.model.ElementContainer;
import org.wikbook.core.model.DocbookElement;
import org.wikbook.core.model.content.block.AdmonitionElement;
import org.wikbook.core.model.content.block.BlockElement;
import org.wikbook.core.model.content.block.BlockQuotationElement;
import org.wikbook.core.model.content.block.CalloutElement;
import org.wikbook.core.model.content.block.DOMElement;
import org.wikbook.core.model.content.block.ExampleElement;
import org.wikbook.core.model.content.block.GroupElement;
import org.wikbook.core.model.content.block.ImageElement;
import org.wikbook.core.model.content.block.ListElement;
import org.wikbook.core.model.content.block.ListItemElement;
import org.wikbook.core.model.content.block.ParagraphElement;
import org.wikbook.core.model.content.block.ProgramListingElement;
import org.wikbook.core.model.content.block.ScreenElement;
import org.wikbook.core.model.content.block.list.TermElement;
import org.wikbook.core.model.content.block.list.VariableListElement;
import org.wikbook.core.model.content.block.table.TableCellElement;
import org.wikbook.core.model.content.block.table.TableElement;
import org.wikbook.core.model.content.block.table.TableRowElement;
import org.wikbook.core.model.content.inline.AnchorElement;
import org.wikbook.core.model.content.inline.FormatElement;
import org.wikbook.core.model.content.inline.InlineImageElement;
import org.wikbook.core.model.content.inline.LinkElement;
import org.wikbook.core.model.content.inline.TextElement;
import org.wikbook.core.model.structural.BookElement;
import org.wikbook.core.model.structural.ComponentElement;
import org.wikbook.core.model.structural.PrefaceElement;
import org.wikbook.core.render.docbook.content.block.AdmonitionTransformer;
import org.wikbook.core.render.docbook.content.block.BlockQuotationTransformer;
import org.wikbook.core.render.docbook.content.block.CalloutTransformer;
import org.wikbook.core.render.docbook.content.block.DOMTransformer;
import org.wikbook.core.render.docbook.content.block.ExampleTransformer;
import org.wikbook.core.render.docbook.content.block.GroupTransformer;
import org.wikbook.core.render.docbook.content.block.ImageTransformer;
import org.wikbook.core.render.docbook.content.block.ListItemTransformer;
import org.wikbook.core.render.docbook.content.block.ListTransformer;
import org.wikbook.core.render.docbook.content.block.ParagraphTransformer;
import org.wikbook.core.render.docbook.content.block.ProgramListingTransformer;
import org.wikbook.core.render.docbook.content.block.ScreenTransformer;
import org.wikbook.core.render.docbook.content.block.list.TermTransformer;
import org.wikbook.core.render.docbook.content.block.list.VariableListTransformer;
import org.wikbook.core.render.docbook.content.block.table.TableCellTransformer;
import org.wikbook.core.render.docbook.content.block.table.TableRowTransformer;
import org.wikbook.core.render.docbook.content.block.table.TableTransformer;
import org.wikbook.core.render.docbook.content.inline.AnchorTransformer;
import org.wikbook.core.render.docbook.content.inline.FormatTransformer;
import org.wikbook.core.render.docbook.content.inline.InlineImageTransformer;
import org.wikbook.core.render.docbook.content.inline.LinkTransformer;
import org.wikbook.core.render.docbook.content.inline.TextTransformer;
import org.wikbook.core.render.docbook.structural.BookTransformer;
import org.wikbook.core.render.docbook.structural.ComponentTransformer;
import org.wikbook.core.render.docbook.structural.PrefaceTransformer;
import org.wikbook.core.xml.ElementEmitter;
import org.wikbook.core.xml.XMLEmitter;
import java.util.HashMap;
import java.util.Map;
/**
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public abstract class ElementTransformer<E extends DocbookElement>
{
/** . */
private static final Map<Class<? extends DocbookElement>, ElementTransformer<?>> writers = new HashMap<Class<? extends DocbookElement>, ElementTransformer<?>>();
static
{
writers.put(BookElement.class, new BookTransformer());
writers.put(ComponentElement.class, new ComponentTransformer());
writers.put(PrefaceElement.class, new PrefaceTransformer());
//
writers.put(AnchorElement.class, new AnchorTransformer());
writers.put(FormatElement.class, new FormatTransformer());
writers.put(LinkElement.class, new LinkTransformer());
writers.put(TextElement.class, new TextTransformer());
writers.put(InlineImageElement.class, new InlineImageTransformer());
//
writers.put(AdmonitionElement.class, new AdmonitionTransformer());
writers.put(BlockQuotationElement.class, new BlockQuotationTransformer());
writers.put(CalloutElement.class, new CalloutTransformer());
writers.put(DOMElement.class, new DOMTransformer());
writers.put(ExampleElement.class, new ExampleTransformer());
writers.put(GroupElement.class, new GroupTransformer());
writers.put(ImageElement.class, new ImageTransformer());
writers.put(ListItemElement.class, new ListItemTransformer());
writers.put(ListElement.class, new ListTransformer());
writers.put(ParagraphElement.class, new ParagraphTransformer());
writers.put(ProgramListingElement.class, new ProgramListingTransformer());
writers.put(ScreenElement.class, new ScreenTransformer());
//
writers.put(TermElement.class, new TermTransformer());
writers.put(VariableListElement.class, new VariableListTransformer());
//
writers.put(TableElement.class, new TableTransformer());
writers.put(TableRowElement.class, new TableRowTransformer());
writers.put(TableCellElement.class, new TableCellTransformer());
}
public static <E extends DocbookElement> ElementTransformer<E> getWriter(Class<E> elementType)
{
return (ElementTransformer<E>)writers.get(elementType);
}
public static <E extends DocbookElement> ElementTransformer<E> getWriter(E element)
{
ElementTransformer<E> writer = (ElementTransformer<E>)writers.get(element.getType());
if (writer == null)
{
throw new IllegalArgumentException("No writer found for element " + element + " of type " + element.getType().getName());
}
return writer;
}
/**
* <p>Write an element container to the specified emitter.</p>
*
* <p>When the argument {@code blockContainer} value is false, the writing process iterates over the container elements
* and render them sequentially.</p>
* <p>When the argument {@code blockContainer} value is true, the container is considered as a block container,
* the writing process takes care of wrapping the elements that are not block elements by a paragraph element (which
* is a block itself).</p>
*
* @param container the container
* @param blockContainer denotes a container acting as a block container when set to true
* @param emitter the emmitter
* @param <E> the container element parameter type
*/
protected <E extends DocbookElement> void write(
ElementContainer<E> container,
boolean blockContainer,
XMLEmitter emitter)
{
if (blockContainer)
{
ElementEmitter paraXML = null;
for (DocbookElement e : container)
{
ElementTransformer<DocbookElement> writer = getWriter(e);
if (e instanceof BlockElement)
{
if (paraXML != null)
{
paraXML = null;
}
writer.write(e, emitter);
}
else
{
if (paraXML == null)
{
paraXML = emitter.element("para");
}
writer.write(e, paraXML);
}
}
}
else
{
for (E elt : container)
{
ElementTransformer<E> writer = getWriter(elt);
writer.write(elt, emitter);
}
}
}
/**
* Writes an element to the emitter.
*
* @param element the element to write
* @param emitter the emitter
*/
public abstract void write(E element, XMLEmitter emitter);
}