// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.html; import java.util.regex.Pattern; public class HtmlUtil { public static final HtmlElement BR = new RawHtml("<br/>"); public static final HtmlElement HR = new RawHtml("<hr/>"); public static final HtmlElement NBSP = new RawHtml(" "); private static final String[] specialHtmlChars = new String[]{"&", "<", ">"}; private static final String[] specialHtmlEscapes = new String[]{"&", "<", ">"}; private static final String[] specialWikiChars = new String[]{"!", "|", "$"}; private static final String[] specialWikiEscapes = new String[]{"&bang;", "&bar;", "$"}; // Source: http://dev.w3.org/html5/markup/common-models.html public static final String HTML_CELL_CONTENT_PATTERN_TEXT = "<(p|hr|pre|ul|ol|dl|div|h[1-6]|hgroup|address|" + "blockquote|ins|del|object|map|video|audio|figure|table|fieldset|canvas|a|em|strong|small|mark|" + "abbr|dfn|i|b|s|u|code|var|samp|kbd|sup|sub|q|cite|span|br|ins|del|img|embed|object|video|audio|label|" + "output|datalist|progress|command|canvas|time|meter)([ >].*</\\1>|[^>]*/>)"; private static final Pattern HTML_PATTERN = Pattern.compile("^" + HTML_CELL_CONTENT_PATTERN_TEXT + "$", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); public static HtmlTag makeBold(String content) { HtmlTag bold = new HtmlTag("b"); bold.add(content); return bold; } public static HtmlTag makeSpanTag(String spanClass, String content) { HtmlTag span = new HtmlTag("span"); span.addAttribute("class", spanClass); span.add(content); return span; } public static HtmlTag makeLink(String href, String text) { return makeLink(href, new RawHtml(text)); } public static HtmlTag makeLink(String href, HtmlElement content) { HtmlTag link = new HtmlTag("a"); link.addAttribute("href", href); link.add(content); return link; } public static boolean isValidTableCellContent(String text) { // performance improvement: First check 1st character. return text.startsWith("<") && HTML_PATTERN.matcher(text).matches(); } public static String escapeHTML(String value) { return replaceStrings(value, specialHtmlChars, specialHtmlEscapes); } public static String unescapeHTML(String value) { return replaceStrings(value, specialHtmlEscapes, specialHtmlChars); } public static String unescapeWiki(String value) { return replaceStrings(value, specialWikiEscapes, specialWikiChars); } public static String escapeWiki(String value) { return replaceStrings(value, specialWikiChars, specialWikiEscapes); } private static String replaceStrings(String value, String[] originalStrings, String[] replacementStrings) { String result = value; for (int i = 0; i < originalStrings.length; i++) if (result.contains(originalStrings[i])) result = result.replace(originalStrings[i], replacementStrings[i]); return result; } }