package org.tldgen.writers;
import org.tldgen.model.AbstractTldElement;
import org.tldgen.model.Function;
import org.tldgen.model.Library;
import org.tldgen.model.Listener;
import org.tldgen.model.Tag;
import java.io.IOException;
import java.io.StringWriter;
/**
* Create a single HTML file
* @author carlos
*
*/
public abstract class AbstractHtmlWriter extends AbstractWriter {
private static final String YUI_VERSION = "2.7.0";
/** buffered contents of this writer */
protected StringWriter out;
/** filename to write */
private String filename;
protected AbstractHtmlWriter(String htmlFile) throws IOException {
out = new StringWriter();
this.filename = htmlFile;
}
/**
* Format the HTML output and writes to the output filename
*/
public void close() {
formatAndWriteXml(out.toString(), filename);
}
/**
* @param title HTML title
*/
protected void startDocument(String title) throws IOException {
print("<!DOCTYPE html>");
startTag("html");
startTag("head");
startTag("title").print(title).endTag("title");
startTag("link", "rel", "stylesheet", "type", "text/css", "href", "yui-" + YUI_VERSION + "/reset-fonts-grids.css").endTag("link");
startTag("link", "rel", "stylesheet", "type", "text/css", "href", "styles.css").endTag("link");
endTag("head");
}
protected void endDocument() throws IOException {
endTag("html");
}
protected void startBody() throws IOException {
startTag("body");
startTag("div", "id","custom-doc","class","yui-t2");
startTag("div", "id","bd", "role","main");
startTag("div", "id","yui-main");
startTag("div", "id", "wrapper", "class","yui-b left-delimiter");
}
protected void endBody(String footerName) throws IOException {
startTag("div", "id","ft", "role","contentinfo");
print(footerName + " TLD Documentation");
startTag("p");
print("Generated by ").startTag("a", "href","https://github.com/icoloma/tldgen").print("TLDGen").endTag("a");
endTag("p");
endTag("div");
endTag("div");
endTag("body");
}
/**
*
* @param selectedItem If not null, the selected tag or the first function instance
*/
protected void printMenu(Library library, AbstractTldElement selectedItem) throws IOException {
endTag("div");
endTag("div");
startTag("div", "class","yui-b menu");
startTag("ol");
for (Tag tag : library.getTags()) {
printMenuItem(tag.getName() + ".html", tag.getName(), tag == selectedItem);
}
if (!library.getFunctions().isEmpty()) {
printMenuItem("functions.html", "functions", selectedItem instanceof Function);
}
if (!library.getListeners().isEmpty()) {
printMenuItem("listeners.html", "listeners", selectedItem instanceof Listener);
}
endTag("ol");
endTag("div");
endTag("div");
}
protected void printMenuItem(String link, String itemName, boolean selected) throws IOException {
startTag("li", "class", selected? "selected" : null);
startTag("a", "href", link);
print(itemName);
endTag("a");
endTag("li");
}
protected void printHeader(int headerId, String value, String...attributes) throws IOException {
startTag("h" + headerId, attributes);
print(value);
endTag("h" + headerId);
}
/**
* Write the name and the value of a table row if value not null or false
*/
protected void printTableEntry(String name, String value) throws IOException {
if (isPrintable(value)) {
printTableRow(name,value);
}
}
/**
* Write all the provided values inside a table row
*/
protected void printTableRow(String... values) throws IOException {
startTag("tr");
for (String value: values) {
startTag("td").print(value).endTag("td");
}
endTag("tr");
}
/**
* Write the table headers inside a table row
*/
protected void printTableHeaders(String... headers) throws IOException {
startTag("tr");
for (String value: headers) {
startTag("th").print(value).endTag("th");
}
endTag("tr");
}
/**
*
* @param tag the tag to write
* @param attributes the list of pairs attribute / value, if any
*/
protected AbstractHtmlWriter startTag(String tag, String... attributes) throws IOException{
print("<").print(tag);
for (int i = 0; i < attributes.length; i += 2) {
if (attributes[i + 1] != null) {
print(" ").print(attributes[i]).print("=\"").print(attributes[i + 1]).print("\"");
}
}
print(">");
return this;
}
protected AbstractHtmlWriter endTag(String tag) throws IOException{
print("</").print(tag).print(">");
return this;
}
protected boolean isPrintable(String value) {
return value != null;
}
protected AbstractHtmlWriter print(String s) throws IOException {
if (isPrintable(s)) {
out.write(s);
}
return this;
}
}