/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * 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: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.commons; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLEncoder; import java.util.Collection; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; public class HtmlBuilder { public static final String DEFAULT_TARGET = "_blank"; //$NON-NLS-1$ public static final String STYLE_LEFT_MARGIN = "leftMargin"; //$NON-NLS-1$ private StringBuilder sb; public HtmlBuilder() { this.sb = new StringBuilder(); } public HtmlBuilder(int capacity) { this.sb = new StringBuilder(capacity); } public HtmlBuilder(String s) { this.sb = new StringBuilder(s); } public HtmlBuilder(StringBuilder sb) { this.sb = new StringBuilder(sb.toString()); } public HtmlBuilder(CharSequence seq) { this.sb = new StringBuilder(seq); } public HtmlBuilder append(boolean b) { sb.append(b); return this; } public HtmlBuilder append(char c) { sb.append(c); return this; } public HtmlBuilder append(char[] str) { sb.append(str); return this; } public HtmlBuilder append(char[] str, int offset, int len) { sb.append(str, offset, len); return this; } public HtmlBuilder append(CharSequence s) { sb.append(s); return this; } public HtmlBuilder append(CharSequence s, int start, int end) { sb.append(s, start, end); return this; } public HtmlBuilder append(double d) { sb.append(d); return this; } public HtmlBuilder append(float f) { sb.append(f); return this; } public HtmlBuilder append(int i) { sb.append(i); return this; } public HtmlBuilder append(long lng) { sb.append(lng); return this; } public HtmlBuilder append(Object obj) { sb.append(obj); return this; } public HtmlBuilder append(String str) { sb.append(str); return this; } @SuppressWarnings("nls") public HtmlBuilder appendLineBreak() { sb.append("<br/>\n"); return this; } public HtmlBuilder appendIcon(String icon) { return appendIcon(icon, null, null, null); } @SuppressWarnings("nls") public HtmlBuilder appendIcon(String icon, String alt, String styleClass, String style) { if (StringUtils.isNotBlank(icon)) { sb.append("<img src=\"").append(icon).append("\""); if(StringUtils.isNotBlank(alt)) { sb.append(" alt=\"").append(alt).append("\""); } appendStyle(styleClass, style); sb.append("/>"); } return this; } public HtmlBuilder appendLink(String caption, String url) { appendLink(caption, url, DEFAULT_TARGET, null, null); return this; } public HtmlBuilder appendLink(String caption, URL url) { appendLink(caption, url, DEFAULT_TARGET, null, null); return this; } public HtmlBuilder appendLink(String caption, String url, String styleClass) { appendLink(caption, url, DEFAULT_TARGET, styleClass, null); return this; } public HtmlBuilder appendLink(String caption, URL url, String styleClass) { appendLink(caption, url, DEFAULT_TARGET, styleClass, null); return this; } @SuppressWarnings("nls") public HtmlBuilder appendLink(String caption, String url, String targetName, String styleClass, String style) { if (StringUtils.isNotBlank(url)) { sb.append("<a href=\"").append(url).append("\""); sb.append(" target=\"").append(StringUtils.isNotBlank(targetName)? targetName : DEFAULT_TARGET).append("\""); appendStyle(styleClass, style); sb.append(">"); } if (StringUtils.isNotBlank(caption)) { sb.append(caption); } else if (StringUtils.isNotBlank(url)) { sb.append(url); } else { sb.append("<!-- -->"); } if (StringUtils.isNotBlank(url)) { sb.append("</a>"); } return this; } public HtmlBuilder appendLink(String caption, URL url, String targetName, String styleClass, String style) { appendLink(caption, url != null? url.toExternalForm() : null, targetName, styleClass, style); return this; } public HtmlBuilder appendIconizedLink(String icon, String caption, String url) { appendIcon(icon); appendLink(caption, url); return this; } public HtmlBuilder appendLinks(String firstCaption, String alternativeCaption, Collection<String> urls) { if (urls != null) { boolean isFirst = true; for (String url : urls) { if (StringUtils.isNotBlank(url)) { String caption = null; if (isFirst) { caption = firstCaption; if (StringUtils.isBlank(caption)) { caption = alternativeCaption; } } else { caption = alternativeCaption; if (StringUtils.isBlank(caption)) { caption = firstCaption; } } String styleClass = isFirst? null : STYLE_LEFT_MARGIN; appendLink(caption, url, styleClass); isFirst = false; } } } return this; } public HtmlBuilder appendIconizedLinks(String icon, String firstCaption, String alternativeCaption, Collection<String> urls) { appendIcon(icon); appendLinks(firstCaption, alternativeCaption, urls); return this; } public HtmlBuilder appendLinks(Collection<Link> links) { if (links != null) { boolean isFirst = true; for (Link link : links) { String styleClass = isFirst? null : STYLE_LEFT_MARGIN; appendLink(link.getLabel(), link.getUrl(), styleClass); isFirst = false; } } return this; } public HtmlBuilder appendIconizedLinks(String icon, Collection<Link> links) { appendIcon(icon); appendLinks(links); return this; } public HtmlBuilder appendMailToLink(String link) { appendMailToLink(null, link, null); return this; } @SuppressWarnings("nls") public HtmlBuilder appendMailToLink(String icon, String link, String caption) { appendIcon(icon); if (StringUtils.isNotBlank(link)) { String urlEncoded = null; try { urlEncoded = URLEncoder.encode(link, "UTF-8"); } catch (UnsupportedEncodingException e) { // should never happen, UTF-8 is available on all platforms throw new RuntimeException(e); } sb.append("<a href=\"mailto:").append(urlEncoded).append("\">"); if (StringUtils.isBlank(caption)) { caption = link; } caption = StringEscapeUtils.escapeHtml(caption); sb.append(caption).append("</a>"); } return this; } public HtmlBuilder appendHeader(String caption, int level) { return appendHeader(caption, level, null, null); } @SuppressWarnings("nls") public HtmlBuilder appendHeader(String caption, int level, String styleClass, String style) { level = Math.max(1, Math.min(6, level)); sb.append("<h").append(level); appendStyle(styleClass, style); sb.append(">"); if (StringUtils.isNotBlank(caption)) { sb.append(caption); } else { sb.append("<!-- -->"); } sb.append("</h").append(level).append(">\n"); return this; } @SuppressWarnings("nls") void appendStyle(String styleClass, String style) { if (StringUtils.isNotBlank(styleClass)) { sb.append(" class=\"").append(styleClass).append("\""); } if (StringUtils.isNotBlank(style)) { sb.append(" style=\"").append(style).append("\""); } } public int length() { return sb.length(); } public int indexOf(String str) { return sb.indexOf(str); } public int indexOf(String str, int fromIndex) { return sb.indexOf(str, fromIndex); } public int lastIndexOf(String str) { return sb.lastIndexOf(str); } public int lastIndexOf(String str, int fromIndex) { return sb.lastIndexOf(str, fromIndex); } public boolean endsWith(String str) { if (str == null) { return false; } int pos = sb.length() - str.length(); return sb.lastIndexOf(str, pos) == pos; } public void clear() { sb.setLength(0); } public StringBuilder asStringBuilder() { return sb; } @Override public String toString() { return sb.toString(); } }