package org.activityinfo.server.util.html; /* * #%L * ActivityInfo Server * %% * Copyright (C) 2009 - 2013 UNICEF * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import java.util.Stack; public class HtmlWriter { private StringBuilder sb = new StringBuilder(); private HtmlTag pendingTag = null; private Stack<String> openTags = new Stack<String>(); private boolean formatted = false; protected void writeTag(HtmlTag tag, boolean closed) { if (tag != null) { if (formatted) { sb.append("\r\n"); } sb.append('<'); sb.append(tag.getName()); for (HtmlAttribute attrib : tag.getAttributes()) { sb.append(' '); sb.append(attrib.getName()); sb.append("=\""); sb.append(attrib.getValue()); sb.append("\""); } if (closed) { sb.append("/>"); } else { sb.append(">"); } } } protected void writePendingTag() { if (pendingTag != null) { writeTag(pendingTag, (pendingTag.getInnerText() == null && pendingTag.isClosed())); if (pendingTag.getInnerText() != null) { sb.append(pendingTag.getInnerText()); if (pendingTag.isClosed()) { sb.append("</"); sb.append(pendingTag.getName()); sb.append(">"); } } if (!pendingTag.isClosed()) { openTags.push(pendingTag.getName()); } pendingTag = null; } } public HtmlTag open(HtmlTag tag) { writePendingTag(); pendingTag = tag; return tag; } public HtmlWriter single(HtmlTag tag) { writePendingTag(); writeTag(tag, true); return this; } public HtmlWriter text(String text) { writePendingTag(); sb.append(text); return this; } public HtmlWriter close() { writePendingTag(); if (formatted) { sb.append("\r\n"); } String tagName = openTags.pop(); sb.append("</"); sb.append(tagName); sb.append(">"); return this; } public HtmlWriter closeVerify(String tagName) { // if(!openTags.peek().equals(tagName)) { // throw new MismatchedTagError(openTags.peek()); // } return close(); } public HtmlTag startDocument() { return open(new HtmlTag("html")); } public HtmlTag startDocumentHeader() { return open(new HtmlTag("head")); } public HtmlTag startDocumentBody() { return open(new HtmlTag("body")); } public HtmlTag documentTitle(String text) { return open((new HtmlTag("title")).text(text).close()); } public HtmlTag httpHeader(String header, String value) { return open(new HtmlTag("meta")).at("http-equiv", header).at("content", value).close(); } public HtmlTag charsetDeclaration(String charset) { return httpHeader("Content-Type", "text/html; charset=" + charset); } public HtmlTag styleSheetLink(String cssPath) { return open(new HtmlTag("link")).at("rel", "stylesheet").at("type", "text/css").at("href", cssPath).close(); } public HtmlTag startDiv() { return open(new HtmlTag("div")); } public HtmlTag div(String text) { return startDiv().text(text).close(); } public HtmlTag div() { return startDiv().close(); } public HtmlTag image(String url) { return open(new HtmlTag("img")).at("src", url).close(); } public HtmlTag startTable() { return open(new HtmlTag("table")); } public HtmlTag startTableRow() { return open(new HtmlTag("tr")); } public HtmlTableCellTag startTableCell() { return (HtmlTableCellTag) open(new HtmlTableCellTag()); } public HtmlTableCellTag tableCell(String innerText) { return (HtmlTableCellTag) open((new HtmlTableCellTag()).text(innerText).close()); } public HtmlWriter newLine() { return text("<br>"); } public HtmlTableCellTag emptyTableCell() { return (HtmlTableCellTag) open((new HtmlTableCellTag()).nbsp().close()); } public HtmlTag startHeader(int level) { return open(new HtmlTag("h" + level)); } public HtmlTag header(int level, String text) { return startHeader(level).text(text).close(); } public HtmlWriter paragraph(String text) { open(new HtmlTag("p")).text(text).close(); return this; } public HtmlTag header(int level) { return startHeader(level).close(); } public HtmlTag startTableHeader() { return open(new HtmlTag("thead")); } public HtmlTag startTableBody() { return open(new HtmlTag("tbody")); } public HtmlWriter endDiv() { return closeVerify("div"); } public HtmlWriter endTable() { return closeVerify("table"); } public HtmlWriter endTableRow() { return closeVerify("tr"); } public HtmlWriter endTableCell() { return closeVerify("td"); } public HtmlWriter endTableHeader() { return closeVerify("thead"); } public HtmlWriter endTableBody() { return closeVerify("tbody"); } public HtmlWriter endHeader(int level) { return closeVerify("h" + level); } public HtmlWriter endDocument() { return closeVerify("html"); } public HtmlWriter endDocumentBody() { return closeVerify("body"); } public HtmlWriter endDocumentHeader() { return closeVerify("head"); } @Override public String toString() { return sb.toString(); } }