blob: 1d997dc9690a1145e761d718f4f9da4e76233f0e [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ahat;
import com.google.common.html.HtmlEscapers;
import java.net.URI;
import java.net.URISyntaxException;
/**
* A class representing a small string of document content consisting of text,
* links, images, etc.
*/
class DocString {
private StringBuilder mStringBuilder;
public DocString() {
mStringBuilder = new StringBuilder();
}
/**
* Construct a new DocString, initialized with the given text.
* Format arguments are supported.
*/
public static DocString text(String format, Object... args) {
DocString doc = new DocString();
return doc.append(format, args);
}
/**
* Construct a new DocString, initialized with the given link.
*/
public static DocString link(URI uri, DocString content) {
DocString doc = new DocString();
return doc.appendLink(uri, content);
}
/**
* Construct a new DocString initialized with the given image.
*/
public static DocString image(URI uri, String alt) {
return (new DocString()).appendImage(uri, alt);
}
/**
* Append literal text to the given doc string.
* Format arguments are supported.
* Returns this object.
*/
public DocString append(String format, Object... args) {
String text = String.format(format, args);
mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(text));
return this;
}
public DocString append(DocString str) {
mStringBuilder.append(str.html());
return this;
}
public DocString appendLink(URI uri, DocString content) {
mStringBuilder.append("<a href=\"");
mStringBuilder.append(uri.toASCIIString());
mStringBuilder.append("\">");
mStringBuilder.append(content.html());
mStringBuilder.append("</a>");
return this;
}
public DocString appendImage(URI uri, String alt) {
mStringBuilder.append("<img alt=\"");
mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(alt));
mStringBuilder.append("\" src=\"");
mStringBuilder.append(uri.toASCIIString());
mStringBuilder.append("\" />");
return this;
}
public DocString appendThumbnail(URI uri, String alt) {
mStringBuilder.append("<img height=\"16\" alt=\"");
mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(alt));
mStringBuilder.append("\" src=\"");
mStringBuilder.append(uri.toASCIIString());
mStringBuilder.append("\" />");
return this;
}
/**
* Convenience function for constructing a URI from a string with a uri
* known to be valid. Format arguments are supported.
*/
public static URI uri(String format, Object... args) {
String uriString = String.format(format, args);
try {
return new URI(uriString);
} catch (URISyntaxException e) {
throw new IllegalStateException("Known good uri has syntax error: " + uriString, e);
}
}
/**
* Render the DocString as html.
*/
public String html() {
return mStringBuilder.toString();
}
}