| /******************************************************************************* |
| * Copyright (c) 2009, 2018 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(); |
| } |
| |
| } |