/*
* 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.
*/
public static DocString text(String str) {
DocString doc = new DocString();
return doc.append(str);
}
/**
* Construct a new DocString, initialized with the given formatted text.
*/
public static DocString format(String format, Object... args) {
DocString doc = new DocString();
return doc.appendFormat(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.
* Returns this object.
*/
public DocString append(String text) {
mStringBuilder.append(HtmlEscapers.htmlEscaper().escape(text));
return this;
}
/**
* Append formatted text to the given doc string.
* Returns this object.
*/
public DocString appendFormat(String format, Object... args) {
append(String.format(format, args));
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.
*/
public static URI uri(String uriString) {
try {
return new URI(uriString);
} catch (URISyntaxException e) {
throw new IllegalStateException("Known good uri has syntax error: " + uriString, e);
}
}
/**
* Convenience function for constructing a URI from a formatted string with
* a uri known to be valid.
*/
public static URI formattedUri(String format, Object... args) {
return uri(String.format(format, args));
}
/**
* Render the DocString as html.
*/
public String html() {
return mStringBuilder.toString();
}
}