# HTMLElement.java

    /*******************************************************************************
     * Copyright (c) 2009, 2013 Mountainminds GmbH & Co. KG and Contributors
     * 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:
     *    Marc R. Hoffmann - initial API and implementation
     *
     *******************************************************************************/
    package org.jacoco.report.internal.html;

    import java.io.IOException;
    import java.io.Writer;

    import org.jacoco.report.internal.ReportOutputFolder;
    import org.jacoco.report.internal.xml.XMLElement;

    /**
     * A {@link XMLElement} with utility methods to create XHTML documents. It
     * provides methods of HTML tags to avoid magic strings in the generators.
     */
    public class HTMLElement extends XMLElement {

    	/**
    	 * Creates a new element for a HTML document.
    	 *
    	 * @param writer
    	 *            all output will be written directly to this
    	 * @param name
    	 *            element name
    	 */
    	protected HTMLElement(final Writer writer, final String name) {
    		super(writer, name);
    	}

    	@Override
    	public HTMLElement element(final String name) throws IOException {
    		final HTMLElement element = new HTMLElement(writer, name);
    		addChildElement(element);
    		return element;
    	}

    	private void classattr(final String classattr) throws IOException {
    		attr("class", classattr);
    	}

    	/**
    	 * Creates a 'meta' element.
    	 *
    	 * @param httpequivattr
    	 *            value of the http-equiv attribute
    	 * @param contentattr
    	 *            value for the content attribute
    	 * @return 'meta' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement meta(final String httpequivattr, final String contentattr)
    			throws IOException {
    		final HTMLElement meta = element("meta");
    		meta.attr("http-equiv", httpequivattr);
    		meta.attr("content", contentattr);
    		return meta;
    	}

    	/**
    	 * Creates a 'link' element.
    	 *
    	 * @param relattr
    	 *            value of the rel attribute
    	 * @param hrefattr
    	 *            value for the href attribute
    	 * @param typeattr
    	 *            value for the type attribute
    	 * @return 'link' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement link(final String relattr, final String hrefattr,
    			final String typeattr) throws IOException {
    		final HTMLElement link = element("link");
    		link.attr("rel", relattr);
    		link.attr("href", hrefattr);
    		link.attr("type", typeattr);
    		return link;
    	}

    	/**
    	 * Creates a 'title' element.
    	 *
    	 * @return 'title' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement title() throws IOException {
    		return element("title");
    	}

    	/**
    	 * Creates a 'h1' element.
    	 *
    	 * @return 'h1' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement h1() throws IOException {
    		return element("h1");
    	}

    	/**
    	 * Creates a 'p' element.
    	 *
    	 * @return 'p' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement p() throws IOException {
    		return element("p");
    	}

    	/**
    	 * Creates a 'span' element.
    	 *
    	 * @return 'span' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement span() throws IOException {
    		return element("span");
    	}

    	/**
    	 * Creates a 'span' element.
    	 *
    	 * @param classattr
    	 *            value of the class attribute
    	 * @return 'span' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement span(final String classattr) throws IOException {
    		final HTMLElement span = span();
    		span.classattr(classattr);
    		return span;
    	}

    	/**
    	 * Creates a 'span' element.
    	 *
    	 * @param classattr
    	 *            value of the class attribute
    	 * @param idattr
    	 *            value of the id attribute
    	 * @return 'span' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement span(final String classattr, final String idattr)
    			throws IOException {
    		final HTMLElement span = span(classattr);
    		span.attr("id", idattr);
    		return span;
    	}

    	/**
    	 * Creates a 'div' element.
    	 *
    	 * @param classattr
    	 *            value of the class attribute
    	 * @return 'div' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement div(final String classattr) throws IOException {
    		final HTMLElement div = element("div");
    		div.classattr(classattr);
    		return div;
    	}

    	/**
    	 * Creates a 'code' element.
    	 *
    	 * @return 'code' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement code() throws IOException {
    		return element("code");
    	}

    	/**
    	 * Creates a 'pre' element.
    	 *
    	 * @param classattr
    	 *            value of the class attribute
    	 * @return 'pre' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement pre(final String classattr) throws IOException {
    		final HTMLElement pre = element("pre");
    		pre.classattr(classattr);
    		return pre;
    	}

    	/**
    	 * Creates a 'a' element.
    	 *
    	 * @param hrefattr
    	 *            value of the href attribute
    	 * @return 'a' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement a(final String hrefattr) throws IOException {
    		final HTMLElement a = element("a");
    		a.attr("href", hrefattr);
    		return a;
    	}

    	/**
    	 * Creates a 'a' element.
    	 *
    	 * @param hrefattr
    	 *            value of the href attribute
    	 * @param classattr
    	 *            value of the class attribute
    	 * @return 'a' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement a(final String hrefattr, final String classattr)
    			throws IOException {
    		final HTMLElement a = a(hrefattr);
    		a.classattr(classattr);
    		return a;
    	}

    	/**
    	 * Creates a link to the given {@link ILinkable}.
    	 *
    	 * @param linkable
    	 *            object to link to
    	 * @param base
    	 *            base folder where the link should be placed
    	 * @return 'a' element or 'span' element, if the link target does not exist
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement a(final ILinkable linkable, final ReportOutputFolder base)
    			throws IOException {
    		final HTMLElement a;
    		final String link = linkable.getLink(base);
    		if (link == null) {
    			a = span(linkable.getLinkStyle());
    		} else {
    			a = a(link, linkable.getLinkStyle());
    		}
    		a.text(linkable.getLinkLabel());
    		return a;
    	}

    	/**
    	 * Creates a 'table' element.
    	 *
    	 * @param classattr
    	 *            value of the class attribute
    	 * @return 'table' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement table(final String classattr) throws IOException {
    		final HTMLElement table = element("table");
    		table.classattr(classattr);
    		table.attr("cellspacing", "0");
    		return table;
    	}

    	/**
    	 * Creates a 'thead' element.
    	 *
    	 * @return 'thead' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement thead() throws IOException {
    		return element("thead");
    	}

    	/**
    	 * Creates a 'tfoot' element.
    	 *
    	 * @return 'tfoot' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement tfoot() throws IOException {
    		return element("tfoot");
    	}

    	/**
    	 * Creates a 'tbody' element.
    	 *
    	 * @return 'tbody' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement tbody() throws IOException {
    		return element("tbody");
    	}

    	/**
    	 * Creates a 'tr' element.
    	 *
    	 * @return 'tr' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement tr() throws IOException {
    		return element("tr");
    	}

    	/**
    	 * Creates a 'td' element.
    	 *
    	 * @return 'td' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement td() throws IOException {
    		return element("td");
    	}

    	/**
    	 * Creates a 'td' element.
    	 *
    	 * @param classattr
    	 *            value of the class attribute
    	 * @return 'td' element
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public HTMLElement td(final String classattr) throws IOException {
    		final HTMLElement td = td();
    		td.classattr(classattr);
    		return td;
    	}

    	/**
    	 * Creates a 'img' element.
    	 *
    	 * @param srcattr
    	 *            value of the src attribute
    	 * @param widthattr
    	 *            value of the width attribute
    	 * @param heightattr
    	 *            value of the height attribute
    	 * @param titleattr
    	 *            value of the title and alt attribute
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public void img(final String srcattr, final int widthattr,
    			final int heightattr, final String titleattr) throws IOException {
    		final HTMLElement img = element("img");
    		img.attr("src", srcattr);
    		img.attr("width", widthattr);
    		img.attr("height", heightattr);
    		img.attr("title", titleattr);
    		img.attr("alt", titleattr);
    		img.close();
    	}

    	/**
    	 * Creates a 'script' element.
    	 *
    	 * @param typeattr
    	 *            value of the type attribute
    	 * @param srcattr
    	 *            value of the src attribute
    	 * @throws IOException
    	 *             in case of problems with the writer
    	 */
    	public void script(final String typeattr, final String srcattr)
    			throws IOException {
    		final HTMLElement script = element("script");
    		script.attr("type", typeattr);
    		script.attr("src", srcattr);
    		// Enforce open and closing tag otherwise it won't work in browsers:
    		script.text("");
    		script.close();
    	}

    }