1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.ahat;
18 
19 import com.google.common.html.HtmlEscapers;
20 import java.net.URI;
21 import java.net.URISyntaxException;
22 
23 /**
24  * A class representing a small string of document content consisting of text,
25  * links, images, etc.
26  */
27 class DocString {
28   private StringBuilder mStringBuilder;
29 
DocString()30   public DocString() {
31     mStringBuilder = new StringBuilder();
32   }
33 
34   /**
35    * Construct a new DocString, initialized with the given text.
36    */
text(String str)37   public static DocString text(String str) {
38     DocString doc = new DocString();
39     return doc.append(str);
40   }
41 
42   /**
43    * Construct a new DocString, initialized with the given formatted text.
44    */
format(String format, Object... args)45   public static DocString format(String format, Object... args) {
46     DocString doc = new DocString();
47     return doc.appendFormat(format, args);
48   }
49 
50   /**
51    * Construct a new DocString, initialized with the given link.
52    */
link(URI uri, DocString content)53   public static DocString link(URI uri, DocString content) {
54     DocString doc = new DocString();
55     return doc.appendLink(uri, content);
56 
57   }
58 
59   /**
60    * Construct a new DocString initialized with the given image.
61    */
image(URI uri, String alt)62   public static DocString image(URI uri, String alt) {
63     return (new DocString()).appendImage(uri, alt);
64   }
65 
66   /**
67    * Append literal text to the given doc string.
68    * Returns this object.
69    */
append(String text)70   public DocString append(String text) {
71     mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(text));
72     return this;
73   }
74 
75   /**
76    * Append formatted text to the given doc string.
77    * Returns this object.
78    */
appendFormat(String format, Object... args)79   public DocString appendFormat(String format, Object... args) {
80     append(String.format(format, args));
81     return this;
82   }
83 
append(DocString str)84   public DocString append(DocString str) {
85     mStringBuilder.append(str.html());
86     return this;
87   }
88 
appendLink(URI uri, DocString content)89   public DocString appendLink(URI uri, DocString content) {
90     mStringBuilder.append("<a href=\"");
91     mStringBuilder.append(uri.toASCIIString());
92     mStringBuilder.append("\">");
93     mStringBuilder.append(content.html());
94     mStringBuilder.append("</a>");
95     return this;
96   }
97 
appendImage(URI uri, String alt)98   public DocString appendImage(URI uri, String alt) {
99     mStringBuilder.append("<img alt=\"");
100     mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(alt));
101     mStringBuilder.append("\" src=\"");
102     mStringBuilder.append(uri.toASCIIString());
103     mStringBuilder.append("\" />");
104     return this;
105   }
106 
appendThumbnail(URI uri, String alt)107   public DocString appendThumbnail(URI uri, String alt) {
108     mStringBuilder.append("<img height=\"16\" alt=\"");
109     mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(alt));
110     mStringBuilder.append("\" src=\"");
111     mStringBuilder.append(uri.toASCIIString());
112     mStringBuilder.append("\" />");
113     return this;
114   }
115 
116   /**
117    * Convenience function for constructing a URI from a string with a uri
118    * known to be valid.
119    */
uri(String uriString)120   public static URI uri(String uriString) {
121     try {
122       return new URI(uriString);
123     } catch (URISyntaxException e) {
124       throw new IllegalStateException("Known good uri has syntax error: " + uriString, e);
125     }
126   }
127 
128   /**
129    * Convenience function for constructing a URI from a formatted string with
130    * a uri known to be valid.
131    */
formattedUri(String format, Object... args)132   public static URI formattedUri(String format, Object... args) {
133     return uri(String.format(format, args));
134   }
135 
136   /**
137    * Render the DocString as html.
138    */
html()139   public String html() {
140     return mStringBuilder.toString();
141   }
142 }
143