All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.mylyn.wikitext.parser.util.MarkupToEclipseToc Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2007, 2012 David Green and others.
 * 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:
 *     David Green - initial API and implementation
 *******************************************************************************/
package org.eclipse.mylyn.wikitext.parser.util;

import static com.google.common.base.Preconditions.checkArgument;

import java.io.StringWriter;
import java.io.Writer;
import java.util.List;

import org.eclipse.mylyn.wikitext.parser.markup.MarkupLanguage;
import org.eclipse.mylyn.wikitext.parser.outline.OutlineItem;
import org.eclipse.mylyn.wikitext.parser.outline.OutlineParser;
import org.eclipse.mylyn.wikitext.util.DefaultXmlStreamWriter;
import org.eclipse.mylyn.wikitext.util.FormattingXMLStreamWriter;
import org.eclipse.mylyn.wikitext.util.XmlStreamWriter;

/**
 * A conversion utility targeting the Eclipse help table of contents format.
 *
 * @author David Green
 * @since 3.0
 */
public class MarkupToEclipseToc {

	private String bookTitle;

	private String htmlFile;

	private MarkupLanguage markupLanguage;

	private String helpPrefix;

	private String copyrightNotice;

	private int anchorLevel = -1;

	public String parse(String markupContent) {
		if (markupLanguage == null) {
			throw new IllegalStateException("Must set markupLanguage"); //$NON-NLS-1$
		}
		OutlineParser parser = new OutlineParser(markupLanguage);

		OutlineItem root = parser.parse(markupContent);

		return createToc(root);
	}

	public String createToc(OutlineItem root) {
		StringWriter out = new StringWriter(8096);

		XmlStreamWriter writer = createXmlStreamWriter(out);

		writer.writeStartDocument("utf-8", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$

		if (copyrightNotice != null) {
			writer.writeComment(copyrightNotice);
		}

		writer.writeStartElement("toc"); //$NON-NLS-1$
		writer.writeAttribute("topic", adjustForPrefix(getHtmlFile())); //$NON-NLS-1$
		writer.writeAttribute("label", getBookTitle()); //$NON-NLS-1$

		emitToc(writer, root.getChildren());

		if (anchorLevel >= 0) {
			writer.writeEmptyElement("anchor"); //$NON-NLS-1$
			writer.writeAttribute("id", "additions"); //$NON-NLS-1$ //$NON-NLS-2$
		}

		writer.writeEndElement(); // toc

		writer.writeEndDocument();
		writer.close();

		return out.toString();
	}

	private void emitToc(XmlStreamWriter writer, List children) {
		for (OutlineItem item : children) {
			writer.writeStartElement("topic"); //$NON-NLS-1$

			String file = computeFile(item);

			file = adjustForPrefix(file);

			String suffix = ""; //$NON-NLS-1$

			// bug 260065: only append document anchor name if this is not the first item in the file.
			OutlineItem previous = item.getPrevious();
			boolean hasPrevious = previous != null && previous.getParent() != null;
			if (hasPrevious) {
				String fileOfPrevious = computeFile(previous);
				fileOfPrevious = adjustForPrefix(fileOfPrevious);

				if (file.equals(fileOfPrevious)) {
					suffix = "#" + item.getId(); //$NON-NLS-1$
				}
			}

			writer.writeAttribute("href", file + suffix); //$NON-NLS-1$
			writer.writeAttribute("label", item.getLabel()); //$NON-NLS-1$

			if (!item.getChildren().isEmpty()) {
				emitToc(writer, item.getChildren());
			}

			if (item.getLevel() <= anchorLevel) {
				writer.writeEmptyElement("anchor"); //$NON-NLS-1$
				writer.writeAttribute("id", item.getId() + "-additions"); //$NON-NLS-1$ //$NON-NLS-2$
			}

			writer.writeEndElement(); // topic
		}
	}

	private String adjustForPrefix(String file) {
		if (helpPrefix != null) {
			if (helpPrefix.endsWith("/")) { //$NON-NLS-1$
				file = helpPrefix + file;
			} else {
				file = helpPrefix + '/' + file;
			}
		}
		return file;
	}

	protected String computeFile(OutlineItem item) {
		return getHtmlFile();
	}

	public MarkupLanguage getMarkupLanguage() {
		return markupLanguage;
	}

	public void setMarkupLanguage(MarkupLanguage markupLanguage) {
		this.markupLanguage = markupLanguage;
	}

	public String getBookTitle() {
		return bookTitle;
	}

	public void setBookTitle(String bookTitle) {
		this.bookTitle = bookTitle;
	}

	public String getHtmlFile() {
		return htmlFile;
	}

	public void setHtmlFile(String htmlFile) {
		this.htmlFile = htmlFile;
	}

	/**
	 * Indicates the heading level at which anchors of the form {@code <anchor id="additions"/>} should be
	 * emitted. A level of 0 corresponds to the root of the document, and levels 1-6 correspond to heading levels h1,
	 * h2...h6.
	 * 

* The default is -1. *

* * @see #setAnchorLevel(int) */ public int getAnchorLevel() { return anchorLevel; } /** * Provides the heading level at which anchors should be emitted. * * @see #getAnchorLevel() * @param anchorLevel * a number >= 0 and <= 6 */ public void setAnchorLevel(int anchorLevel) { checkArgument(anchorLevel >= 0 && anchorLevel <= 6, "The anchor level must be >= 0 and <= 6"); //$NON-NLS-1$ this.anchorLevel = anchorLevel; } protected XmlStreamWriter createXmlStreamWriter(Writer out) { XmlStreamWriter writer = new DefaultXmlStreamWriter(out); return new FormattingXMLStreamWriter(writer); } /** * the prefix to URLs in the toc.xml, typically the relative path from the plugin to the help files. For example, if * the help file is in 'help/index.html' then the help prefix would be 'help' */ public void setHelpPrefix(String helpPrefix) { this.helpPrefix = helpPrefix; } /** * the copyright notice that should appear in the generated output */ public String getCopyrightNotice() { return copyrightNotice; } /** * the copyright notice that should appear in the generated output * * @param copyrightNotice * the notice, or null if there should be none */ public void setCopyrightNotice(String copyrightNotice) { this.copyrightNotice = copyrightNotice; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy