1 package net.sf.statcvs.pages.xml;
2
3 import java.text.SimpleDateFormat;
4 import java.util.Date;
5
6 import net.sf.statcvs.Messages;
7 import net.sf.statcvs.model.Author;
8 import net.sf.statcvs.model.Directory;
9 import net.sf.statcvs.pages.DirectoryPageMaker;
10 import net.sf.statcvs.pages.ReportSuiteMaker;
11
12 /**
13 * TODO: Can we turn this into an abstract base class of MarkupHTML and MarkupXDoc?
14 *
15 * @author Anja Jentzsch
16 * @author Richard Cyganiak (richard@cyganiak.de)
17 * @version $Id: XML.java,v 1.5 2009/03/13 23:04:28 benoitx Exp $
18 */
19 public final class XML {
20 private static final SimpleDateFormat OUTPUT_DATE_FORMAT = new SimpleDateFormat(Messages.getString("DATE_FORMAT"));
21 private static final SimpleDateFormat OUTPUT_DATE_TIME_FORMAT = new SimpleDateFormat(Messages.getString("DATE_TIME_FORMAT"));
22
23 /**
24 * Creates a HTML representation of a hyperlink
25 * @param link URL
26 * @param linkName Name of the Link
27 * @return String HTML code of the hyperlink
28 */
29 public static String getLink(final String link, final String linkName) {
30 return getLink(link, linkName, "", "");
31 }
32
33 /**
34 * Creates a HTML representation of a hyperlink
35 * @param link URL
36 * @param linkName Name of the Link
37 * @param prefix A prefix to be inserted before the link label; no HTML escaping is performed
38 * @param prefix A suffix to be inserted after the link label; no HTML escaping is performed
39 * @return String HTML code of the hyperlink
40 */
41 public static String getLink(final String link, final String linkName, final String prefix, final String suffix) {
42 if (link == null) {
43 return prefix + escape(linkName) + suffix;
44 }
45 return "<a href=\"" + escape(link) + "\">" + prefix + escape(linkName) + suffix + "</a>";
46 }
47
48 /**
49 * Returns HTML code for a link to an author page
50 * @param author the author
51 * @return HTML code for the link
52 */
53 public static String getAuthorLink(final Author author) {
54 return escape(author.getName());
55 }
56
57 /**
58 * Returns HTML code for a link to an author Id page
59 * @param author the author
60 * @return HTML code for the link
61 */
62 public static String getAuthorIdLink(final Author author) {
63 return escape(author.getName());
64 }
65
66 /**
67 * Returns HTML code for a date
68 * @param date the date
69 * @return HTML code for the date
70 */
71 public static String getDate(final Date date) {
72 return OUTPUT_DATE_FORMAT.format(date);
73 }
74
75 /**
76 * Returns HTML code for a date, including time
77 * @param date the date
78 * @return HTML code for the date
79 */
80 public static String getDateAndTime(final Date date) {
81 return OUTPUT_DATE_TIME_FORMAT.format(date);
82 }
83
84 /**
85 * Returns HTML code for a directory page link
86 * @param directory a directory
87 * @return HTML code for the link
88 */
89 public static String getDirectoryLink(final Directory directory) {
90 final String caption = directory.isRoot() ? "/" : directory.getPath();
91 return escape(DirectoryPageMaker.getURL(directory)) + escape(caption);
92 }
93
94 /**
95 * Generates HTML for an icon
96 * @param iconFilename an icon filename (HTMLOutput.XXXX_ICON constants)
97 * @return HTML string
98 */
99 public static String getIcon(final String iconFilename) {
100 final StringBuffer result = new StringBuffer("<img src=\"");
101 result.append(escape(iconFilename)).append("\" width=\"");
102 result.append(ReportSuiteMaker.ICON_WIDTH).append("\" height=\"");
103 result.append(ReportSuiteMaker.ICON_HEIGHT).append("\" alt=\"\"/>");
104 return result.toString();
105 }
106
107 /**
108 * <p>
109 * Escapes evil characters in author's names. E.g. "#" must be escaped
110 * because for an author "my#name" a page "author_my#name.html" will be
111 * created, and you can't link to that in HTML
112 * </p>
113 *
114 * TODO: Replace everything *but* known good characters, instead of just
115 * evil ones
116 *
117 * @param authorName an author's name
118 * @return a version safe for creation of files and URLs
119 */
120 public static String escapeAuthorName(final String authorName) {
121 return authorName.replaceAll("#", "_").replaceAll("\\\\", "_");
122 }
123
124 public static String escapeDirectoryName(String directoryName) {
125 if (!directoryName.startsWith("/")) {
126 directoryName = "/" + directoryName;
127 }
128 return directoryName.substring(0, directoryName.length() - 1).replaceAll("/", "_");
129 }
130
131 /**
132 * Escapes HTML meta characters "&", "<", ">" and turns "\n" line breaks
133 * into HTML line breaks ("<br />");
134 * @param text some string, for example "x > 0 && y < 100"
135 * @return HTML-escaped string, for example "x > 0 && y < 100"
136 */
137 public static String escape(final String text) {
138 final String result = text;
139
140
141
142 return result;
143 }
144
145 /**
146 * A utility class (only static methods) should be final and have
147 * a private constructor.
148 */
149 private XML() {
150 }
151 }