/*******************************************************************************
* Copyright (c) 2010, 2011 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.docs.intent.markup.builder;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.mylyn.docs.intent.markup.builder.operation.DocumentLinkResolver;
import org.eclipse.mylyn.docs.intent.markup.builder.state.SDocument;
import org.eclipse.mylyn.docs.intent.markup.markup.Document;
import org.eclipse.mylyn.docs.intent.markup.markup.MarkupFactory;
import org.eclipse.mylyn.wikitext.core.parser.Attributes;
import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder;
/**
* Builder of a Markup model for a given Wikitext document.
*
* @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
*/
public class ModelDocumentBuilder extends DocumentBuilder {
/**
* Current state in the parser state machine.
*/
private BuilderState currentState;
/**
* List of the roots of the Markup model.
*/
private Collection<EObject> roots = new ArrayList<EObject>(1);
/**
* Returns the roots of the stored Markup model.
*
* @return roots of the stored Markup model
*/
public Collection<EObject> getRoots() {
return roots;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#acronym(java.lang.String, java.lang.String)
*/
@Override
public void acronym(String text, String definition) {
// System.out.println("ModelDocumentBuilder.acronym()");
currentState = currentState.acronym(text, definition);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#beginBlock(org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.BlockType,
* org.eclipse.mylyn.wikitext.core.parser.Attributes)
*/
@Override
public void beginBlock(BlockType type, Attributes attributes) {
// System.out.println("ModelDocumentBuilder.beginBlock(" + type.name() + ") / state : "
// + currentState.getClass().getName());
currentState = currentState.beginBlock(type, attributes);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#beginDocument()
*/
@Override
public void beginDocument() {
// System.out.println("ModelDocumentBuilder.beginDocument()");
Document doc = MarkupFactory.eINSTANCE.createDocument();
// FIXME change null with a dummy or root state.
currentState = new SDocument(null, doc);
roots.add(doc);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#beginHeading(int,
* org.eclipse.mylyn.wikitext.core.parser.Attributes)
*/
@Override
public void beginHeading(int level, Attributes attributes) {
// System.out.println("ModelDocumentBuilder.beginHeading()");
currentState = currentState.beginHeading(level, attributes);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#beginSpan(org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder.SpanType,
* org.eclipse.mylyn.wikitext.core.parser.Attributes)
*/
@Override
public void beginSpan(SpanType type, Attributes attributes) {
// System.out.println("ModelDocumentBuilder.beginSpan(" + type + ")/ " + currentState);
currentState = currentState.beginSpan(type, attributes);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#characters(java.lang.String)
*/
@Override
public void characters(String text) {
// System.out.println("ModelDocumentBuilder.characters() / " + text + currentState);
currentState = currentState.characters(text);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#charactersUnescaped(java.lang.String)
*/
@Override
public void charactersUnescaped(String literal) {
// System.out.println("ModelDocumentBuilder.charactersUnescaped(" + literal + ") / " + currentState);
currentState = currentState.charactersUnescaped(literal);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#endBlock()
*/
@Override
public void endBlock() {
// System.out.println("ModelDocumentBuilder.endBlock() /" + currentState);
currentState = currentState.endBlock();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#endDocument()
*/
@Override
public void endDocument() {
// System.out.println("ModelDocumentBuilder.endDocument() /" + currentState);
currentState = currentState.endDocument();
for (Document doc : Iterables.filter(roots, Document.class)) {
new DocumentLinkResolver(doc).resolveLinks();
}
// new
// DocumentReStructurer(Iterables.filter(roots,Container.class)).restructure();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#endHeading()
*/
@Override
public void endHeading() {
// System.out.println("ModelDocumentBuilder.endHeading() /" + currentState);
currentState = currentState.endHeading();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#endSpan()
*/
@Override
public void endSpan() {
// System.out.println("ModelDocumentBuilder.endSpan() /" + currentState);
currentState = currentState.endSpan();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#entityReference(java.lang.String)
*/
@Override
public void entityReference(String entity) {
// System.out.println("ModelDocumentBuilder.entityReference(" + entity + ") / state : "
// + currentState.getClass().getName());
currentState = currentState.entityReference(entity);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#image(org.eclipse.mylyn.wikitext.core.parser.Attributes,
* java.lang.String)
*/
@Override
public void image(Attributes attributes, String url) {
// System.out.println("ModelDocumentBuilder.image()");
currentState = currentState.image(attributes, url);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#imageLink(org.eclipse.mylyn.wikitext.core.parser.Attributes,
* org.eclipse.mylyn.wikitext.core.parser.Attributes, java.lang.String, java.lang.String)
*/
@Override
public void imageLink(Attributes linkAttributes, Attributes imageAttributes, String href, String imageUrl) {
// System.out.println("ModelDocumentBuilder.imageLink()");
currentState = currentState.imageLink(linkAttributes, imageAttributes, href, imageUrl);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#lineBreak()
*/
@Override
public void lineBreak() {
// //System.out.println("ModelDocumentBuilder.lineBreak()");
currentState = currentState.lineBreak();
}
/**
* {@inheritDoc}
*
* @see org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder#link(org.eclipse.mylyn.wikitext.core.parser.Attributes,
* java.lang.String, java.lang.String)
*/
@Override
public void link(Attributes attributes, String hrefOrHashName, String text) {
// System.out.println("ModelDocumentBuilder.link()");
currentState = currentState.link(attributes, hrefOrHashName, text);
}
}