diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/profiler/output/HtmlPrinter.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/profiler/output/HtmlPrinter.java | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/output/HtmlPrinter.java b/src/main/java/com/google/devtools/build/lib/profiler/output/HtmlPrinter.java new file mode 100644 index 0000000000..531e0f6fa0 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/profiler/output/HtmlPrinter.java @@ -0,0 +1,104 @@ +// Copyright 2015 Google Inc. All rights reserved. +// +// 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.google.devtools.build.lib.profiler.output; + +import java.io.PrintStream; +import java.util.ArrayDeque; +import java.util.Deque; + +/** + * Utility function for writing HTML data to a {@link PrintStream}. + */ +public abstract class HtmlPrinter extends TextPrinter { + + private Deque<String> currentlyOpenTags; + + protected HtmlPrinter(PrintStream out) { + super(out); + currentlyOpenTags = new ArrayDeque<>(); + } + + /** + * Print an open tag with attributes and possibly content and increase indentation level. + * + * <p>All array elements are taken in pairs for attributes and their values. If odd, the last + * element is taken as the content of the element. It is printed directly after the opening tag. + * @param attributesAndContent must have the form: attribute1, value1, attribute2, value2, ..., + * content + */ + protected void open(String tag, Object... attributesAndContent) { + printf("<%s", tag); + for (int index = 0; index < attributesAndContent.length - 1; index += 2) { + printf(" %s=\"%s\"", attributesAndContent[index], attributesAndContent[index + 1]); + } + print(">"); + if (attributesAndContent.length % 2 == 1) { + print(attributesAndContent[attributesAndContent.length - 1]); + } + down(); + currentlyOpenTags.addFirst(tag); + } + + /** + * Print a newline, an open tag with attributes and possibly content and increase indentation + * level + * @see #open(String, Object...) + */ + protected void lnOpen(String tag, Object... attributes) { + lnIndent(); + open(tag, attributes); + } + + /** + * Decrease indentation level and close the most recently opened tag + */ + protected void close() { + up(); + printf("</%s>", currentlyOpenTags.pop()); + } + + /** + * Decrease indentation level, print newline, indentation and close the most recently opened tag + */ + protected void lnClose() { + up(); + lnPrintf("</%s>", currentlyOpenTags.pop()); + } + + protected void lnElement(String tag, Object content) { + lnIndent(); + element(tag, content); + } + + /** + * Print a single element with attributes and possibly content. + * + * @see #open(String, Object...) + */ + protected void element(String tag, Object... attributesAndContent) { + open(tag, attributesAndContent); + close(); + } + + /** + * Print a newline, indent and a single element with attributes and possibly content. + * + * @see #lnOpen(String, Object...) + */ + protected void lnElement(String tag, Object... attributesAndContent) { + lnOpen(tag, attributesAndContent); + close(); + } +} + |