package ilarkesto.ui.web;
import ilarkesto.base.Str;
import ilarkesto.base.Url;
import ilarkesto.id.CountingIdGenerator;
import ilarkesto.id.IdGenerator;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
public class HtmlRenderer {
private PrintWriter out;
private String encoding;
private String startingTag;
private Tag tag = new Tag();
public HtmlRenderer(PrintWriter out, String encoding) {
this.encoding = encoding;
this.out = out;
}
public HtmlRenderer(OutputStream out, String encoding) throws UnsupportedEncodingException {
this(new PrintWriter(new OutputStreamWriter(out, encoding)), encoding);
}
public void flush() {
out.flush();
}
public void flattrCompactJs(String url) {
SCRIPTjavascript(null, "var flattr_url = '" + url + "';\n" + "var flattr_btn='compact';");
SCRIPTjavascript("http://api.flattr.com/button/load.js", null);
}
// --- IFRAME ---
private static final String IFRAME = "iframe";
public void IFRAME(String src, String height) {
Tag tag = startTag(IFRAME).set("src", src).set("frameborder", 0).setWidth("100%").set("height", height);
A(src, src);
endTag(IFRAME);
}
// --- TEXTAREA ---
private static final String TEXTAREA = "textarea";
public void TEXTAREA(String name, String id, String text, Integer cols, int rows, boolean wysiwyg, String width) {
Tag tag = startTag(TEXTAREA).set("name", name).setId(id).set("rows", rows).set("cols", cols)
.set("wrap", "virtual").setWidth(width).setStyle("width: " + width + ";");
if (wysiwyg) tag.setClass("wysiwyg");
html(text);
endTag(TEXTAREA);
}
// --- PRE ---
private static final String PRE = "pre";
public void PRE(String text) {
startTag(PRE);
text(text);
endTag(PRE);
}
// --- UL ---
private static final String UL = "ul";
public Tag startUL() {
return startTag(UL);
}
public void endUL() {
endTag(UL);
}
// --- LI ---
private static final String LI = "li";
public Tag startLI() {
return startTag(LI);
}
public void endLI() {
endTag(LI);
}
public void LI(String text) {
startLI();
text(text);
endLI();
}
// --- EM ---
private static final String EM = "em";
public Tag startEM() {
return startTag(EM);
}
public void endEM() {
endTag(EM);
}
public void EM(String text) {
startEM();
text(text);
endEM();
}
// --- SPAN ---
private static final IdGenerator hintIdGenerator = new CountingIdGenerator("hint");
private static final String SPAN = "span";
public void startSPANwithHint(String clazz, String content) {
Tag tag = startSPAN(clazz);
if (content == null) return;
String hintDivId = hintIdGenerator.generateId();
tag.setOnmouseover("showHint('" + hintDivId + "')").setOnmouseout("hideHint()");
startDIV("hint").setId(hintDivId);
text(content);
endDIV();
}
public Tag startSPAN(String clazz) {
return startTag(SPAN).setClass(clazz);
}
public void endSPAN() {
endTag(SPAN);
}
public void SPAN(String clazz, String text) {
startSPAN(clazz);
text(text);
endSPAN();
}
// --- LABEL ---
private static final String LABEL = "label";
public Tag startLABEL(String for_) {
return startTag(LABEL).set("for", for_);
}
public void endLABEL() {
endTag(LABEL);
}
public void LABEL(String for_, String text) {
startLABEL(for_);
text(text);
endLABEL();
}
// --- HR ---
private static final String HR = "hr";
public void HR() {
startTag(HR);
endShortTag();
}
// --- BR ---
private static final String BR = "br";
public void BR() {
startTag(BR);
endShortTag();
}
// --- CENTER ---
private static final String CENTER = "center";
public void startCENTER() {
startTag(CENTER);
}
public void endCENTER() {
endTag(CENTER);
}
// --- FORM ---
private static final String FORM = "form";
private static final String INPUT = "input";
private static final String SELECT = "select";
private static final String OPTION = "option";
private static final String BUTTON = "button";
public Tag startFORM(Url actionUrl, String name, boolean multipart) {
return startFORM(actionUrl, "post", name, multipart);
}
public Tag startFORM(Url actionUrl, String method, String name, boolean multipart) {
String action = actionUrl == null ? null : actionUrl.toString();
Tag tag = startTag(FORM, true).set("action", action).set("method", method).setName(name)
.set("accept-charset", encoding);
if (multipart) {
tag.set("enctype", "multipart/form-data");
}
return tag;
}
public void endFORM() {
endTag(FORM);
}
public void startSELECT(String name, int size) {
startTag(SELECT, true).setName(name).set("size", size);
}
public void endSELECT() {
endTag(SELECT);
}
public void OPTION(String value, String text, boolean selected) {
Tag tag = startTag(OPTION).set("value", value);
if (selected) tag.set("selected", "true");
text(text);
endTag(OPTION);
}
public void INPUTreset(String value, String onclick) {
Tag tag = startTag(INPUT).set("type", "reset").set("value", value).setOnclick(onclick);
endShortTag();
}
private static final IdGenerator dateIdGenerator = new CountingIdGenerator("date");
public void INPUTdate(String name, String value) {
String id = dateIdGenerator.generateId();
// INPUTtext(id, name, value, 10);
// String buttonName = "b_" + name;
// INPUTreset("...", "return showCalendar('"+id+"', '%d.%m.%Y', '24', false, true);");
INPUTtext(id, name, value, 10);
String buttonId = "b_" + id;
BUTTON("button", buttonId, null, "Kalender", null, null, "/img/kde/16x16/apps/cal.png");
StringBuilder code = new StringBuilder();
code.append("Calendar.setup({\n");
code.append(" inputField: \"" + id + "\",\n");
code.append(" ifFormat: \"%d.%m.%Y\",\n");
code.append(" button: \"").append(buttonId).append("\",\n");
code.append("});\n");
SCRIPTjavascript(null, code.toString());
}
public void INPUThidden(String name, String value) {
INPUT("hidden", name, value);
endShortTag();
}
public void INPUTsubmit(String name, String label, String onclick, Character accessKey) {
INPUTsubmit(name, label, onclick, accessKey, null);
}
public void INPUTsubmit(String name, String label, String onclick, Character accessKey, String style) {
Tag tag = INPUT("submit", name, label);
tag.set("class", "inputButton");
tag.set("accesskey", accessKey);
tag.setStyle(style);
if (onclick != null) tag.setOnclick(onclick);
endShortTag();
}
public void INPUTtext(String name, String value, int width) {
INPUTtext(null, name, value, width);
}
public void INPUTtext(String id, String name, String value, int width) {
Tag tag = INPUT("text", name, value).setId(id).set("size", width).setClass("inputText");
tag.setOnfocus("javascript:select();");
endShortTag();
}
public void INPUTpassword(String name, int width, String value) {
INPUT("password", name, value).set("size", width).setClass("inputText");
endShortTag();
}
public void INPUTpassword(String id, String name, int width, String value) {
INPUT("password", name, value).set("id", id).set("size", width).setClass("inputText");
endShortTag();
}
public void INPUTcheckbox(String id, String name, boolean checked) {
Tag tag = INPUT("checkbox", name, "true").setId(id).setClass("inputCheckbox");
if (checked) {
tag.set("checked", "checked");
}
}
public void INPUTcheckbox(String name, boolean checked) {
Tag tag = INPUT("checkbox", name, "true").setClass("inputCheckbox");
if (checked) {
tag.set("checked", "checked");
}
}
public void INPUTcheckbox(String name, boolean checked, String text) {
Tag tag = INPUT("checkbox", name, "true").setClass("inputCheckbox");
if (checked) {
tag.set("checked", "checked");
}
String id = "cb_" + name;
tag.setId(id);
LABEL(id, text);
}
public void INPUTradio(String name, String value, boolean checked) {
Tag tag = INPUT("radio", name, value).setClass("inputRadio");
if (checked) {
tag.set("checked", "checked");
}
}
public void INPUTfile(String name, Integer maxlength) {
INPUT("file", name, null).set("maxlength", maxlength).setClass("inputText");
}
private Tag INPUT(String type, String name, String value) {
Tag tag = startTag(INPUT, true).set("type", type).set("name", name);
if (value != null) tag.set("value", Str.replaceForHtml(value));
return tag;
}
public Tag startBUTTON() {
Tag tag = startTag(BUTTON);
return tag;
}
public void endBUTTON() {
endTag(BUTTON);
}
public void BUTTON(String type, String id, String name, String text, String onclick, Character accessKey,
String icon) {
Tag tag = startTag(BUTTON, true).set("value", text).set("type", type).setId(id).setName(name)
.setClass("button");
tag.set("accesskey", accessKey);
if (onclick != null) {
tag.setOnclick(onclick);
}
if (icon != null) {
// tag.setStyle("background: transparent url(" + icon + ") 2px center no-repeat; padding: 2px 2px
// 2px 20px;");
IMG(icon, "icon", null, 12, 12);
nbsp();
}
text(text);
nbsp();
endTag(BUTTON);
}
// --- HTML ---
private static final String HTML = "html";
private static final String HEAD = "head";
private static final String TITLE = "title";
private static final String META = "meta";
private static final String LINK = "link";
private static final String SCRIPT = "script";
private static final String BODY = "body";
public void startHTML() {
// out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"
// \"http://www.w3.org/TR/html4/loose.dtd\">");
// out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.print("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">");
startTag(HTML);
}
public void startHTMLstandard() {
out.print("<!DOCTYPE html>");
startTag(HTML);
}
public void endHTML() {
endTag(HTML);
}
public void startHEAD(String title, String language) {
startTag(HEAD);
startTag(META, true).set("name", "viewport").set("content",
"width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no");
endShortTag();
META("Content-Language", language);
startTag(TITLE);
text(title);
endTag(TITLE);
}
public void endHEAD() {
endTag(HEAD);
}
public void META(String httpEquiv, String content) {
startTag(META, true).set("http-equiv", httpEquiv).set("content", content);
endShortTag();
}
public void METArefresh(int seconds, String url) {
StringBuilder content = new StringBuilder();
content.append(seconds);
if (url != null) content.append("; URL=").append(url);
META("refresh", content.toString());
}
public void LINK(String rel, String type, String title, String href) {
startTag(LINK, true).set("rel", rel).set("type", type).set("title", title).setHref(href);
endShortTag();
}
public void LINK(String rel, String type, String href) {
LINK(rel, type, null, href);
}
public void LINKfavicon() {
LINK("shortcut icon", "image/x-icon", "favicon.ico");
}
public void LINKcss(Url href) {
LINKcss(toString(href));
}
public void LINKcss(String href) {
LINK("stylesheet", "text/css", href);
}
public void SCRIPT(String type, String language, String src, String code) {
startTag(SCRIPT, true).set("type", type).set("language", language).set("src", src);
html(code);
endTag(SCRIPT);
}
public void SCRIPTjavascript(String src, String code) {
SCRIPT("text/javascript", "javascript", src, code);
}
public Tag startBODY() {
return startTag(BODY, true).setId("body");
}
public void endBODY() {
endTag(BODY);
}
// --- google analytics ---
public void googleAnalytics(String webPropertyId) {
html("<script type=\"text/javascript\">\r\n"
+ "var gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");\r\n"
+ "document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\r\n"
+ "</script>\r\n" + "<script type=\"text/javascript\">\r\n" + "try {\r\n"
+ "var pageTracker = _gat._getTracker(\"" + webPropertyId + "\");\r\n"
+ "pageTracker._trackPageview();\r\n" + "} catch(err) {}</script>");
}
// --- helper ---
private String toString(Url url) {
if (url == null) return null;
return url.toString();
}
// --- STYLE ---
private static final String STYLE = "style";
public CssRenderer startSTYLEcss() {
startTag(STYLE).set("type", "text/css");
closeStartingTag();
CssRenderer css = new CssRenderer(out);
return css;
}
public void endSTYLE() {
endTag(STYLE);
}
// --- IMG ---
private static final String IMG = "img";
public void IMG(String src, String alternatieText, String align, Integer width, Integer height) {
Tag tag = startTag(IMG).setSrc(src).setAlt(alternatieText).setBorder(0);
if (width != null) tag.setWidth(width);
if (height != null) tag.set("height", height);
if (align != null) tag.setAlign("top");
endShortTag();
}
// --- DIV ---
private static final String DIV = "div";
public void DIVclean() {
startDIV("clean");
IMG("dot.png", "", null, null, null);
endDIV();
}
public void DIVclear() {
startDIV().setStyle("clear: both;");
endDIV();
}
public Tag startDIV(String clazz) {
return startDIV().setClass(clazz);
}
public Tag startDIV() {
return startTag(DIV, true);
}
public void startDIVwithHint(String clazz, String content) {
Tag tag = startDIV(clazz);
if (content == null) return;
String hintDivId = hintIdGenerator.generateId();
tag.setOnmouseover("showHint('" + hintDivId + "')").setOnmouseout("hideHint()");
startDIV("hint").setId(hintDivId).setStyle("display: none;");
text(content);
endDIV();
}
public void endDIV() {
endTag(DIV);
}
public void DIV(String clazz, String text) {
startDIV(clazz);
text(text);
endDIV();
}
// --- H ---
private static final String H1 = "h1";
public Tag startH1() {
return startTag(H1);
}
public void endH1() {
endTag(H1);
}
public void H1(String text) {
startH1();
text(text);
endH1();
}
private static final String H2 = "h2";
public Tag startH2() {
return startTag(H2);
}
public void endH2() {
endTag(H2);
}
public void H2(String text) {
startH2();
text(text);
endH2();
}
private static final String H3 = "h3";
public Tag startH3() {
return startTag(H3);
}
public void endH3() {
endTag(H3);
}
public void H3(String text) {
startH3();
text(text);
endH3();
}
// --- P ---
private static final String P = "p";
public Tag startP() {
return startTag(P);
}
public void endP() {
endTag(P);
}
// --- CODE ---
private static final String CODE = "CODE";
public Tag startCODE() {
return startTag(CODE);
}
public void endCODE() {
endTag(CODE);
}
public void CODE(String text) {
startCODE();
text(text);
endCODE();
}
// --- A ---
private static final String A = "a";
public Tag startA(String clazz, String href) {
return startTag(A).setClass(clazz).setHref(href);
}
public Tag startA(String href) {
return startTag(A).setHref(href);
}
public void endA() {
endTag(A);
}
public void A(String href, String text) {
startA(href);
text(text);
endA();
}
// --- TABLE ---
private static final String TABLE = "table";
private static final String TR = "tr";
private static final String TD = "td";
private static final String TH = "th";
public Tag startTABLE() {
startTag(TABLE, true).setBorder(0).set("cellpadding", 0).set("cellspacing", 0);
return tag;
}
public Tag startTABLE(String clazz) {
return startTABLE(clazz, 0, 0, 0);
}
public Tag startTABLE(String clazz, int border, int cellpadding, int cellspacing) {
startTag(TABLE, true).setClass(clazz).setBorder(border).set("cellpadding", cellpadding)
.set("cellspacing", cellspacing);
return tag;
}
public void endTABLE() {
endTag(TABLE);
}
public Tag startTR() {
return startTag(TR, true);
}
public void endTR() {
endTag(TR);
}
public Tag startTD() {
return startTag(TD).setValign(VALIGN_TOP);
}
public Tag startTD(String clazz) {
return startTag(TD).setClass(clazz).setValign(VALIGN_TOP);
}
public Tag startTD(String clazz, int colspan) {
return startTag(TD).setClass(clazz).set("colspan", colspan).setValign(VALIGN_TOP);
}
public void endTD() {
endTag(TD);
}
public void TD(String text) {
startTD();
text(text);
endTD();
}
public void TD(String clazz, String content) {
startTD().setClass(clazz);
text(content);
endTD();
}
public Tag startTH() {
return startTag(TH);
}
public void endTH() {
endTag(TH);
}
public void TH(String text) {
startTH();
text(text);
endTH();
}
public void TH(String text, String width) {
Tag tag = startTH();
tag.setWidth(width);
text(text);
endTH();
}
// --- core ---
public void nbsp() {
closeStartingTag();
out.print(" ");
}
private void nl() {
out.println();
}
public Tag startTag(String name) {
return startTag(name, true);
}
private int depth;
private void printPrefix() {
// increases html file size
// for (int i = 0; i < depth; i++) out.print(" ");
}
public Tag startTag(String name, boolean nl) {
closeStartingTag();
startingTag = name;
if (nl) {
nl();
printPrefix();
}
out.print('<');
out.print(name);
depth++;
return tag;
}
public void text(String text) {
text(text, false);
}
public void text(String text, boolean activateLinks) {
closeStartingTag();
if (text != null) {
if (text.startsWith("<html>")) {
if (text.length() > 6) {
text = text.substring(6);
if (activateLinks) text = Str.activateLinksInHtml(text);
out.print(text);
}
} else {
text = Str.replaceForHtml(text);
// text = StringEscapeUtils.escapeHtml(text);
// text = text.replace("\n", "<BR/>");
if (activateLinks) text = Str.activateLinksInHtml(text);
out.print(text);
}
}
}
public void html(String html) {
closeStartingTag();
if (html != null) {
out.print(html);
}
}
public void comment(String text) {
comment(text, true);
}
public void comment(String text, boolean nl) {
closeStartingTag();
if (nl) {
nl();
printPrefix();
}
out.print("<!-- ");
out.print(text);
out.print(" -->");
}
public void endTag(String name) {
closeStartingTag();
depth--;
// nl();
// printPrefix();
out.print("</");
out.print(name);
out.print(">");
}
public void endShortTag() {
depth--;
out.print(" />");
startingTag = null;
}
private void closeStartingTag() {
if (startingTag != null) {
out.print(">");
startingTag = null;
}
}
public static final String VALIGN_TOP = "top";
public static final String ALIGN_RIGHT = "right";
public static final String TARGET_BLANK = "_blank";
public class Tag {
public Tag setTarget(String value) {
return set("target", value);
}
public Tag setTargetBlank() {
return setTarget(TARGET_BLANK);
}
public Tag setWidth(int value) {
return set("width", value);
}
public Tag setWidth(String value) {
return set("width", value);
}
public Tag setHeight(String value) {
return set("height", value);
}
public Tag setId(String value) {
return set("id", value);
}
public Tag setSrc(String value) {
return set("src", value);
}
public Tag setAlt(String value) {
return set("alt", value);
}
public Tag setHref(String value) {
if (value == null) return this;
return set("href", value.replace("&", "&"));
}
public Tag setAlign(String value) {
return set("align", value);
}
public Tag setAlignCenter() {
return setAlign("center");
}
public Tag setAlignRight() {
return setAlign("right");
}
public Tag setValign(String value) {
return set("valign", value);
}
public Tag setBorder(int value) {
return set("border", value);
}
public Tag setClass(String value) {
return set("class", value);
}
public Tag setName(String value) {
return set("name", value);
}
public Tag setOnclick(String value) {
return set("onclick", value);
}
public Tag setOnfocus(String value) {
return set("onfocus", value);
}
public Tag setOnmouseover(String value) {
return set("onmouseover", value);
}
public Tag setOnmouseout(String value) {
return set("onmouseout", value);
}
public Tag setOnload(String value) {
return set("onload", value);
}
public Tag setStyle(String... values) {
StringBuilder sb = new StringBuilder();
for (String value : values) {
sb.append(value).append("; ");
}
return setStyle(sb.toString());
}
public Tag setStyle(String value) {
return set("style", value);
}
public Tag setColspan(int value) {
return set("colspan", value);
}
public Tag setRowspan(int value) {
return set("rowspan", value);
}
private Tag set(String name, Character value) {
if (value == null) return this;
return set(name, value.toString());
}
public Tag set(String name, Integer value) {
if (value == null) return this;
return set(name, String.valueOf(value));
}
public Tag set(String name, String value) {
if (value == null) return this;
out.print(" ");
out.print(name);
out.print("=\"");
out.print(value);
out.print("\"");
return this;
}
}
}