• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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    * Construct a new DocString initialized with the given image.
60    */
image(URI uri, String alt)61   public static DocString image(URI uri, String alt) {
62     return (new DocString()).appendImage(uri, alt);
63   }
64 
65   /**
66    * Append literal text to the given doc string.
67    * Returns this object.
68    */
append(String text)69   public DocString append(String text) {
70     mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(text));
71     return this;
72   }
73 
74   /**
75    * Append formatted text to the given doc string.
76    * Returns this object.
77    */
appendFormat(String format, Object... args)78   public DocString appendFormat(String format, Object... args) {
79     append(String.format(format, args));
80     return this;
81   }
82 
append(DocString str)83   public DocString append(DocString str) {
84     mStringBuilder.append(str.html());
85     return this;
86   }
87 
88   /**
89    * Adorn the given string to indicate it represents something added relative
90    * to a baseline.
91    */
added(DocString str)92   public static DocString added(DocString str) {
93     DocString string = new DocString();
94     string.mStringBuilder.append("<span class=\"added\">");
95     string.mStringBuilder.append(str.html());
96     string.mStringBuilder.append("</span>");
97     return string;
98   }
99 
100   /**
101    * Adorn the given string to indicate it represents something added relative
102    * to a baseline.
103    */
added(String str)104   public static DocString added(String str) {
105     return added(text(str));
106   }
107 
108   /**
109    * Adorn the given string to indicate it represents something removed relative
110    * to a baseline.
111    */
removed(DocString str)112   public static DocString removed(DocString str) {
113     DocString string = new DocString();
114     string.mStringBuilder.append("<span class=\"removed\">");
115     string.mStringBuilder.append(str.html());
116     string.mStringBuilder.append("</span>");
117     return string;
118   }
119 
120   /**
121    * Adorn the given string to indicate it represents something removed relative
122    * to a baseline.
123    */
removed(String str)124   public static DocString removed(String str) {
125     return removed(text(str));
126   }
127 
128   /**
129    * Standard formatted DocString for describing a change in size relative to
130    * a baseline.
131    * @param noCurrent - whether no current object exists.
132    * @param noBaseline - whether no basline object exists.
133    * @param current - the size of the current object.
134    * @param baseline - the size of the baseline object.
135    */
delta(boolean noCurrent, boolean noBaseline, long current, long baseline)136   public static DocString delta(boolean noCurrent, boolean noBaseline,
137       long current, long baseline) {
138     DocString doc = new DocString();
139     return doc.appendDelta(noCurrent, noBaseline, current, baseline);
140   }
141 
142   /**
143    * Standard formatted DocString for describing a change in size relative to
144    * a baseline.
145    */
appendDelta(boolean noCurrent, boolean noBaseline, long current, long baseline)146   public DocString appendDelta(boolean noCurrent, boolean noBaseline,
147       long current, long baseline) {
148     if (noCurrent) {
149       append(removed(format("%+,14d", 0 - baseline)));
150     } else if (noBaseline) {
151       append(added("new"));
152     } else if (current > baseline) {
153       append(added(format("%+,14d", current - baseline)));
154     } else if (current < baseline) {
155       append(removed(format("%+,14d", current - baseline)));
156     }
157     return this;
158   }
159 
appendLink(URI uri, DocString content)160   public DocString appendLink(URI uri, DocString content) {
161     mStringBuilder.append("<a href=\"");
162     mStringBuilder.append(uri.toASCIIString());
163     mStringBuilder.append("\">");
164     mStringBuilder.append(content.html());
165     mStringBuilder.append("</a>");
166     return this;
167   }
168 
appendImage(URI uri, String alt)169   public DocString appendImage(URI uri, String alt) {
170     mStringBuilder.append("<img alt=\"");
171     mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(alt));
172     mStringBuilder.append("\" src=\"");
173     mStringBuilder.append(uri.toASCIIString());
174     mStringBuilder.append("\" />");
175     return this;
176   }
177 
appendThumbnail(URI uri, String alt)178   public DocString appendThumbnail(URI uri, String alt) {
179     mStringBuilder.append("<img height=\"16\" alt=\"");
180     mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(alt));
181     mStringBuilder.append("\" src=\"");
182     mStringBuilder.append(uri.toASCIIString());
183     mStringBuilder.append("\" />");
184     return this;
185   }
186 
187   /**
188    * Convenience function for constructing a URI from a string with a uri
189    * known to be valid.
190    */
uri(String uriString)191   public static URI uri(String uriString) {
192     try {
193       return new URI(uriString);
194     } catch (URISyntaxException e) {
195       throw new IllegalStateException("Known good uri has syntax error: " + uriString, e);
196     }
197   }
198 
199   /**
200    * Convenience function for constructing a URI from a formatted string with
201    * a uri known to be valid.
202    */
formattedUri(String format, Object... args)203   public static URI formattedUri(String format, Object... args) {
204     return uri(String.format(format, args));
205   }
206 
207   /**
208    * Render the DocString as html.
209    */
html()210   public String html() {
211     return mStringBuilder.toString();
212   }
213 }
214