Generates a FOOTER tag with role attribute.

@return an HtmlTree object for the FOOTER tag
168917
public static HtmlTree FOOTER() {
        HtmlTree htmltree = new HtmlTree(HtmlTag.FOOTER);
        htmltree.setRole(Role.CONTENTINFO);
        return htmltree;
    }
518532
public static Element createRootElement(String tagName) throws AlipayApiException {
        Document doc = newDocument();
        Element root = doc.createElement(tagName);
        doc.appendChild(root);
        return root;
    }
1091202
public String defaultActionHtml() {

        String params = allParamsAsRequest();
        String titleUri = CmsEncoder.escapeXml(getJsp().getRequest().getParameter(PARAM_TITLE_URI));
        if (CmsStringUtil.isEmptyOrWhitespaceOnly(titleUri)) {
            titleUri = CmsToolManager.ADMINVIEW_ROOT_LOCATION + "/list-title.jsp";
        }
        String titleSrc = getFrameSource("tool_title", getJsp().link(titleUri + "?" + params));
        String contentSrc = getFrameSource(
            "tool_content",
            getJsp().link(CmsToolManager.ADMINVIEW_ROOT_LOCATION + "/list-explorer.jsp") + "?" + params);
        StringBuffer html = new StringBuffer(1024);
        html.append("<!DOCTYPE html>\n");
        html.append("<html>\n");
        html.append("\t<head>\n");
        html.append("\t\t<meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=\"").append(
            getEncoding()).append("\">\n");
        String uplink = "/opencms_a/opencms/system/workplace/views/admin/admin-main.jsp?path=/projects/files&action=initial&projectid=fa9f561f-be30-11e2-bac3-21ebf444feef&showexplorer=true";
        html.append(
            "<script type='text/javascript'>var uplink = \""
                + CmsStringUtil.escapeJavaScript(uplink)
                + "\";</script>\n");
        html.append("\t\t<title>\n");
        html.append(
            "\t\t\t").append(
                key(
                    org.opencms.workplace.Messages.GUI_LABEL_WPTITLE_1,
                    new Object[] {getSettings().getUser().getFullName()})).append("\n");
        html.append("\t\t</title>\n");
        html.append("\t</head>\n");
        html.append("\t<frameset rows='57,*' border='0' frameborder='0' framespacing='0'>\n");
        html.append("\t\t<frame ").append(titleSrc).append(" frameborder='0' border='0' noresize scrolling='no'>\n");
        html.append("\t\t<frame ").append(contentSrc).append(
            " frameborder='0' border='0' noresize scrolling='auto' framespacing='0' marginheight='2' marginwidth='2' >\n");
        html.append("\t</frameset>\n");
        html.append("</html>\n");
        return html.toString();
    }
525024
def to_xml_string(str = '')
      serialized_tag('headerFooter', str) do
        serialized_element_attributes(str) do |value|
          value = ::CGI.escapeHTML(value)
        end
      end
    end
572687
public static HtmlTree SPAN(HtmlStyle styleClass, Content body) {
        HtmlTree htmltree = new HtmlTree(HtmlTag.SPAN, nullCheck(body));
        if (styleClass != null)
            htmltree.addStyle(styleClass);
        return htmltree;
    }
640156
protected DCTree html() {
        int p = bp;
        nextChar();
        if (isIdentifierStart(ch)) {
            Name name = readIdentifier();
            List<DCTree> attrs = htmlAttrs();
            if (attrs != null) {
                boolean selfClosing = false;
                if (ch == '/') {
                    nextChar();
                    selfClosing = true;
                }
                if (ch == '>') {
                    nextChar();
                    DCTree dctree = m.at(p).newStartElementTree(name, attrs, selfClosing).setEndPos(bp);
                    return dctree;
                }
            }
        } else if (ch == '/') {
            nextChar();
            if (isIdentifierStart(ch)) {
                Name name = readIdentifier();
                skipWhitespace();
                if (ch == '>') {
                    nextChar();
                    return m.at(p).newEndElementTree(name);
                }
            }
        } else if (ch == '!') {
            nextChar();
            if (ch == '-') {
                nextChar();
                if (ch == '-') {
                    nextChar();
                    while (bp < buflen) {
                        int dash = 0;
                        while (ch == '-') {
                            dash++;
                            nextChar();
                        }
                        // Strictly speaking, a comment should not contain "--"
                        // so dash > 2 is an error, dash == 2 implies ch == '>'
                        // See http://www.w3.org/TR/html-markup/syntax.html#syntax-comments
                        // for more details.
                        if (dash >= 2 && ch == '>') {
                            nextChar();
                            return m.at(p).newCommentTree(newString(p, bp));
                        }

                        nextChar();
                    }
                }
            }
        }

        bp = p + 1;
        ch = buf[bp];
        return erroneous("dc.malformed.html", p);
    }
973956
public String generateHtml() {

        StringBuffer result = new StringBuffer(2048);
        result.append(htmlStart(null));
        result.append(CmsListExplorerColumn.getExplorerStyleDef());
        result.append(bodyStart("dialog", null));
        result.append(dialogStart());
        result.append(dialogContentStart(getParamTitle()));
        result.append(m_list.printableHtml());
        result.append(dialogContentEnd());
        result.append(dialogEnd());
        result.append(bodyEnd());
        result.append(htmlEnd());
        return result.toString();
    }
761763
public static HtmlTree CAPTION(Content body) {
        HtmlTree htmltree = new HtmlTree(HtmlTag.CAPTION, nullCheck(body));
        return htmltree;
    }
1059783
public Content getMemberTree(HtmlStyle style, Content contentTree) {
        Content div = HtmlTree.DIV(style, getMemberTree(contentTree));
        return div;
    }
1043351
public static HtmlTree TITLE(Content body) {
        HtmlTree htmltree = new HtmlTree(HtmlTag.TITLE, nullCheck(body));
        return htmltree;
    }
943658
public void printHtmlFooter(PrintWriter out, ResourceBundle reg)
    {
        String strHTML = reg.getString("htmlFooter");
        if ((strHTML == null) || (strHTML.length() == 0))
            strHTML = "</body>\n</html>";
        out.println(strHTML);
        out.flush();
    }
29428
public function getConfigTreeBuilder ()
    {
        $treeBuilder = new TreeBuilder();
        $root = $treeBuilder->root("becklyn_static_roles");

        $root
            ->children()
                ->arrayNode("roles")
                    ->useAttributeAsKey("role")
                    ->prototype('array')
                        ->children()
                            ->scalarNode("title")->isRequired()->end()
                            ->scalarNode("description")->end()
                            ->booleanNode("hidden")->defaultFalse()->end()
                            ->arrayNode("included_roles")
                                ->prototype('scalar')->end()
                            ->end()
                            ->arrayNode("tags")
                                ->prototype('scalar')->end()
                            ->end()
                            ->arrayNode("actions")
                                ->prototype('scalar')->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end();

        return $treeBuilder;
    }
685043
protected HtmlTree getPackageTreeHeader() {
        String packageName = packageElement.isUnnamed() ? "" : utils.getPackageName(packageElement);
        String title = packageName + " " + configuration.getText("doclet.Window_Class_Hierarchy");
        HtmlTree bodyTree = getBody(true, getWindowTitle(title));
        HtmlTree htmlTree = (configuration.allowTag(HtmlTag.HEADER))
                ? HtmlTree.HEADER()
                : bodyTree;
        addTop(htmlTree);
        addNavLinks(true, htmlTree);
        if (configuration.allowTag(HtmlTag.HEADER)) {
            bodyTree.addContent(htmlTree);
        }
        return bodyTree;
    }
206019
public function footer()
    {
        foreach ($this->footerElements as $element) {
            if ($element instanceof ReportBaseElement) {
                $element->render($this);
            } elseif ($element === 'footnotetexts') {
                $this->footnotes();
            } elseif ($element === 'addpage') {
                $this->newPage();
            }
        }
    }
1095909
public static HtmlTree DL(Content body) {
        HtmlTree htmltree = new HtmlTree(HtmlTag.DL, nullCheck(body));
        return htmltree;
    }
808126
public void appendFooterHeaderStyleXMLToAutomaticStyle(final XMLUtil util,
														   final Appendable appendable, final Type pageSectionType) throws IOException {
		appendable.append("<style:").append(pageSectionType.getTypeName())
				.append("-style>");
		appendable.append("<style:header-footer-properties");
		util.appendAttribute(appendable, "fo:min-height", this.minHeight.toString());
		this.margins.appendXMLContent(util, appendable);
		appendable.append("/></style:").append(pageSectionType.getTypeName())
				.append("-style>");
	}
875137
public function toHtml()
	{
		if ( $this->hierarchies === null )
		{
			throw new Exception( "Hierarchies have not been generated.  Run preparePresentation() first." );
		}

		$this->log()->info( "Generate HTML" );

		$countYears = count( $this->years );
		$countEntities = count( $this->entities );
		$this->maxDepth++; // We're counting from zero
		$this->maxDepth++; // The sections are the zero'th items but do not figure in the depth calculation
		$totalColumns = $this->maxDepth + 0 + $countYears;

		// An array of alignments for the different elements
		// types such as string, number, date, boolean.
		// The type is taken from the element definition and
		// given an alignment by calling the 'valueAlignment'
		// function of the taxonomy class.  This information
		// is used to create CSS styles.
		$types = array();

		$dimensionInfos = array();
		$rows = array();
		// Process each of the roles to create report rows.
		// Each $rows entry is an array representing a <tr></tr> pair
		// and may contain sub-arrays representing the <td> elements
		foreach ( $this->hierarchies as $roleKey => $role )
		{
			if ( $this->taxonomy->excludeFromOutput( $roleKey ) ) continue;

			$roleHasItems = isset( $role['hierarchy'] ) && count( $role['hierarchy'] ) > 0;
			if ( ! $roleHasItems ) continue;

			$roleHypercubes = $this->getTaxonomy()->getPresentationRoleHypercubes( $roleKey );

			$roleHasDimensions = false;
			$roleHasDefaultDimensionMembers = false;
			$dimensionInfo = "";
			if ( $roleHypercubes )
			{
				$roleHasDimensions = array_reduce( $roleHypercubes, function( $carry, $hypercube ) { return $hypercube['dimensioncount'] + $carry; }, 0 );
			}

			if ( $roleHasDimensions )
			{
				$roleHasDefaultDimensionMembers = array_reduce( $roleHypercubes, function( $carry, $hypercube ) {
					return isset( $hypercube['hasdefaults'] ) ? $hypercube['hasdefaults'] + $carry : $carry;
				}, 0 );
			}

			if ( $roleHypercubes )
			{
				$countHypercubes = count( $roleHypercubes );
				$dimensionInfo = "(";

				$dimensionInfo .= $countHypercubes === 1 ? "1 hypercube" : "$countHypercubes hypercubes";

				if ( $roleHasDimensions )
				{
					$dimensionInfo .= " with $roleHasDimensions dimension" . ( $roleHasDimensions === 1 ? " " : "s " );
				}

				if ( $roleHasDimensions )
				{
					$dimensionInfo .= " - " . ($roleHasDefaultDimensionMembers ? "Has $roleHasDefaultDimensionMembers" : "No") . " default" . ( $roleHasDefaultDimensionMembers === 1 ? " " : "s " );
				}
				else
				{
					$dimensionInfo .= " No dimensions";
				}

				$dimensionInfo .= ")";

				$dimensionInfos[ $roleKey ] = $dimensionInfo;
			}

			unset( $roleHasHypercubes );

			$roleRows = array();
			if ( ( $rowCount = $this->processNode(
				$role['hierarchy'],
				$this->taxonomy,
				$types,
				$roleRows,
				$depth = 0,
				array(
					'maxDepth' => $this->maxDepth,
					'totalColumns' => $totalColumns,
					'countYears' => $countYears,
					'countEntities' => $countEntities,
				)
			) ) && $rowCount > 1 )
			{
				$companies = array();

				foreach ( $this->entities as $entity => $contexts )
					$companies[] = "<td class=\"value company\" colspan=\"{$countYears}\">{$entity}</td>";

				$rows[] = array(
					"<tr class=\"companies\" id=\"$roleKey-companies\">",
					array( "<td colspan=\"{$this->maxDepth}\">Section</td>" ),
					$companies,
					"</tr>",
				);

				$columns = array();

				foreach ( $this->entities as $entity => $contexts )
					foreach ( $this->years as $year => $contexts )
						$columns[] = "<td class=\"value heading\">{$year}</td>";

				$rows[] = array(
					"<tr class=\"years role\" id=\"$roleKey-years\">",
					array( "<td colspan=\"{$this->maxDepth}\">{$role['text']} $dimensionInfo</td>" ),
					$columns,
					"</tr>",
				);

				foreach ( $roleRows as $row ) $rows[] = $row;
			}
		}

		$column_count = ( $countYears * $countEntities ) + $this->maxDepth;
		$column_count_minus1 = $column_count -1;

		$content = array();
		end( $this->hierarchies );
		$lastKey = key( $this->hierarchies );
		foreach ( $this->hierarchies as $roleKey => $role )
		{
			$last = $roleKey === $lastKey ? " last" : "";
			$dimensionInfo = isset( $dimensionInfos[ $roleKey ] ) ? "<strong>{$dimensionInfos[ $roleKey ]}</strong>" : "";

			$content[] = array(
				"<tr id=\"$roleKey\" class=\"content-page$last\">",
				"<td/>",
				"<td colspan=\"{$column_count_minus1}\"><a href=\"#$roleKey-companies\">{$role['text']}</a> $dimensionInfo</td>",
				"</tr>",
			);
		}

		$heading = array( "<td class=\"filename\" colspan=\"{$this->maxDepth}\"></td>" );
		foreach ( $this->entities as $entityKey => $entity )
		{
			$document_name = $this->entityInstanceMap[ $entityKey ];
			$heading[] = "<td class=\"filename\" colspan=\"$countYears\">{$document_name}</td>";
		}

		$body = array(
			"<table class=\"reportTable\" cellspacing=\"0\" cellpadding=\"0\" >",
			array(
				"<thead>",
				"<meta charset=\"utf-8\"/>",
				array(
					"<tr>",
					array_fill( 0, $this->maxDepth -1, "<th class=\"text-columns\" />" ),
					array( "<th class=\"gap-column\"  />" ),
					array_fill( 0, $countYears * $countEntities, "<th class=\"value-columns\"  />" ),
					"</tr>",
				),
				"</thead>",
				"<tbody>",
				array(
					"<tr>",
					$heading,
					"</tr>",
				),
				$content,
				$rows,
				"</tbody>",
			),
			"</table>",
		);

		$style = array();
		foreach ( $types as $type => $alignment )
		{
			$style[] = "tr td." . str_replace( ":", "-", $type ) . " { text-align: $alignment; }";
		}

		// Build the head
		$head = array(
			"<style>",
			array(
				".reportTable tr.content-page.last td { padding-bottom: 30px; }",
				".reportTable td { border: 1px dotted #999999; }",
				".reportTable th.text-columns { min-width: 20px; }",
				".reportTable th.gap-column { width: 100%; }",
				".reportTable th.value-columns { min-width: 160px; }",
				".reportTable td.filename { text-align: center; }",
				"td { padding: 2px; vertical-align: top; min-width: 20px }",
				"tr.role{ border-top: 1px solid #999999; font-weight: bold; }",
				"tr.role td { border-top: 1px solid #999999; }",
				"tr td.value { border-left: 1px solid #999999; }",
				"tr td.value { text-align: left; }",
				"tr td.value.company, tr td.value.heading { text-align: center; }",
				"tr.tuple-gap > td.tuple { padding-top: 4px; border-top: 1px solid gray }",
				"tr.tuple-gap > td.description.tuple { padding-top: 4px; border-top: 1px solid gray }",
			),
			$style,
			"</style>",
		);

		$html = array(
			"<html>",
			array(
				"<head>",
				$head,
				"</head>",
			),
			array(
				"<body>",
				$body,
				"</body>",
			),
			"</html>",
		);

		$this->log()->info( "Flatten: {$this->elapsedTime()}" );
		$x = $this->flatten( $html );
		$this->log()->info( "Write: {$this->elapsedTime()}" );
		return join( "\n", $x );
	}