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