package jd.cli.printer.html;
import jd.cli.util.VersionUtil;
import jd.core.CoreConstants;
import jd.core.printer.Printer;
import java.io.PrintStream;
/*
* CSS
* .javacode{font-size:11px}
* .javacode .linenumber, .javacode .l, i{color:#3f7f5f}
* .javacode .keyword, .javacode .k, b{color:#7f0055;font-weight:bold}
* .javacode .comment, .javacode .t, cite{color:#3f7f5f}
* .javacode .javadoc, .javacode .d, dfn{color:#3f5fbf}
* .javacode .error, .javacode .e, span{color:#ff0000}
* .javacode .annotationname, .javacode .a, del{color:#646464}
* .javacode .constant, .javacode .c, u{color:#2a00ff}
* .javacode .field, .javacode .f, var{color:#0000c0}
* .javacode .staticfield, .javacode .g, em{color:#0000c0;font-style:italic}
* .javacode .staticmethod, .javacode .n, samp{font-style:italic}
* .javacode .debuglayoutblock{background-color:#ccffff;border:1px solid #99eeee}
* .javacode .debugseparatorlayoutblock{background-color:#ccffcc;border:1px solid #99ee99}
* .javacode .debugstatementblocklayoutblock{background-color:#ffcccc;border:1px solid #ee9999}
* .javacode .debugenumblocklayoutblock{background-color:#ffffcc;border:1px solid #eeee99}
* .javacode .debugcommentdeprecatedlayoutblock{background-color:#fefefe;border:1px solid #e9e9e9}
* .javacode .debugmarker{background-color:#ffd2ff;border:1px solid #cfb2cf}
* .javacode .extraline, .javacode .x, s
* .javacode .optionalthisprefix, .javacode .o, kbd
* .javacode .metadata, .javacode .m, ins
*/
public class HtmlPrinter implements Printer
{
private final static boolean DEBUG = true;
private PrintStream printStream;
private StringBuffer sbLineNumber;
private StringBuffer sbCode;
private int maxLineNumber;
private int majorVersion;
private int minorVersion;
private int realLineNumber;
private String realLineNumberFormatPrefix;
private String lineNumberFormatPrefix;
private String unknownLineNumberPrefix;
private int indentationCount;
private int commentJavadocErrorDepth;
public HtmlPrinter(PrintStream printStream)
{
this.printStream = printStream;
this.sbLineNumber = new StringBuffer(10*1024);
this.sbCode = new StringBuffer(30*1024);
}
public void print(byte b) { this.sbCode.append(String.valueOf(b)); }
public void print(char c)
{
switch (c)
{
case '<':
this.sbCode.append("<");
break;
case '>':
this.sbCode.append(">");
break;
default:
this.sbCode.append(String.valueOf(c));
break;
}
}
public void print(int i) { this.sbCode.append(String.valueOf(i)); }
public void print(String s) { this.sbCode.append(s); }
public void printNumeric(String s)
{
this.sbCode.append("<u>");
this.sbCode.append(s);
this.sbCode.append("</u>");
}
public void printString(String s, String scopeInternalName)
{
this.sbCode.append("<u>");
// Replace '<' by '<'
int length = s.length();
if (length > 0)
{
for (int i=0; i<length; i++)
{
char c = s.charAt(i);
if (c == '<')
this.sbCode.append("<");
else
this.sbCode.append(c);
}
}
this.sbCode.append("</u>");
}
public void printKeyword(String s)
{
if (this.commentJavadocErrorDepth == 0)
{
this.sbCode.append("<b>");
this.sbCode.append(s);
this.sbCode.append("</b>");
}
else
{
this.sbCode.append(s);
}
}
public void printJavaWord(String s) { printKeyword(s); }
public void printType(String internalName, String name, String scopeInternalName)
{
this.sbCode.append(name);
}
public void printTypeDeclaration(String internalName, String name)
{
this.sbCode.append(name);
}
public void printTypeImport(String internalName, String name)
{
this.sbCode.append(name);
}
public void printField(
String internalName, String name,
String descriptor, String scopeInternalName)
{
printFieldDeclaration(internalName, name, descriptor);
}
public void printFieldDeclaration(
String internalName, String name, String descriptor)
{
this.sbCode.append("<var>");
this.sbCode.append(name);
this.sbCode.append("</var>");
}
public void printStaticField(
String internalName, String name,
String descriptor, String scopeInternalName)
{
printStaticFieldDeclaration(internalName, name, descriptor);
}
public void printStaticFieldDeclaration(
String internalName, String name, String descriptor)
{
this.sbCode.append("<em>");
this.sbCode.append(name);
this.sbCode.append("</em>");
}
public void printConstructor(
String internalName, String name,
String descriptor, String scopeInternalName)
{
this.sbCode.append(name);
}
public void printConstructorDeclaration(
String internalName, String name, String descriptor)
{
this.sbCode.append(name);
}
public void printStaticConstructorDeclaration(
String internalName, String name)
{
this.sbCode.append("<samp>");
this.sbCode.append(name);
this.sbCode.append("</samp>");
}
public void printMethod(
String internalName, String name,
String descriptor, String scopeInternalName)
{
this.sbCode.append(name);
}
public void printMethodDeclaration(
String internalName, String name, String descriptor)
{
this.sbCode.append(name);
}
public void printStaticMethod(
String internalName, String name,
String descriptor, String scopeInternalName)
{
printStaticMethodDeclaration(internalName, name, descriptor);
}
public void printStaticMethodDeclaration(
String internalName, String name, String descriptor)
{
this.sbCode.append("<samp>");
this.sbCode.append(name);
this.sbCode.append("</samp>");
}
public void start(int maxLineNumber, int majorVersion, int minorVersion)
{
this.maxLineNumber = maxLineNumber;
this.majorVersion = majorVersion;
this.minorVersion = minorVersion;
this.realLineNumber = 0;
this.indentationCount = 0;
this.commentJavadocErrorDepth = 0;
int digitCount = 1;
int maximum = 9;
while (maximum < maxLineNumber)
{
digitCount++;
maximum = maximum*10 + 9;
}
this.realLineNumberFormatPrefix = "%" + (digitCount+1) + "d:";
this.lineNumberFormatPrefix = "%" + digitCount + "d<br>";
StringBuilder sb = new StringBuilder(digitCount + 7);
sb.append("%" + (digitCount+1) + "d:");
for (int i=0; i<digitCount; i++) sb.append(' ');
sb.append("<br>");
this.unknownLineNumberPrefix = sb.toString();
this.printStream.print(
"<html><head><style type='text/css'>" +
"body,html{font-family:Lucida Grande,Lucida Sans Unicode,Arial,sans-serif;font-size:90%}" +
"#demo .out{background-color:#FFFFFF}" +
"#demo .out .content{padding:0px;font-size:12px;font-family:courier new,courier;white-space:pre;border-radius:0 0 10px 10px}" +
"#demo .out .content .e{color:#FF0000;margin:10px}" +
"#linenumber{float:left;margin:0;padding:1px 8px 5px 1px;border-style:solid;border-color:#888888;border-width:0 1px 0 0;color:#888888}" +
"#linenumber s{text-decoration:none}" +
"#linenumber span{color:#FF0000;font-style:normal}" +
"#javacode{padding:0 0 5px 0;margin:1px 5px 1px 5px;color:black}" +
"#javacode i{color:#3f7f5f;font-style:normal}" +
"#javacode b{color:#7f0055;font-weight:bold;line-height:1}" +
"#javacode s{text-decoration:none}" +
"#javacode cite{color:#3F7F5F;font-style:normal}" +
"#javacode dfn{color:#3f5fbf;font-style:normal}" +
"#javacode dfn b{color:#3F5FBF}" +
"#javacode span{color:#FF0000;font-style:normal}" +
"#javacode del{color:#646464;text-decoration:none}" +
"#javacode kbd{font-family:courier new,courier}" +
"#javacode u{color:#2a00ff;text-decoration:none}" +
"#javacode var{color:#0000c0;font-style:normal}" +
"#javacode em{color:#0000c0;font-style:italic;line-height:1}" +
"#javacode samp{font-style:italic;line-height:1}" +
"#javacode .debuglayoutblock{color:#000000;background-color:#ccffff;border:1px solid #99eeee}" +
"#javacode .debugseparatorlayoutblock{color:#000000;background-color:#ccffcc;border:1px solid #99ee99}" +
"#javacode .debugstatementblocklayoutblock{color:#000000;background-color:#ffcccc;border:1px solid #ee9999}" +
"#javacode .debugenumblocklayoutblock{color:#000000;background-color:#ffffcc;border:1px solid #eeee99}" +
"#javacode .debugcommentdeprecatedlayoutblock{color:#000000;background-color:#fefefe;border:1px solid #e9e9e9}" +
"#javacode .debugmarker{color:#000000;background-color:#ffd2ff;border:1px solid #cfb2cf}" +
"#javacode .debugcaseblocklayoutblock{color:#000000;background-color:#ffde66;border:1px solid #ff9a11}" +
"#metadata{padding:5px;color:#444444;background-color:#EEEEEE;border-radius:0 0 10px 10px;font-size:11px}" +
"</style>" +
"</head><body>" +
"<h1>Preview</h1>" +
"<div id='demo'><div class='out'><div class='content'>");
}
public void end()
{
if (this.maxLineNumber > 0)
{
this.printStream.print("<div id='linenumber'>");
this.printStream.print(this.sbLineNumber.toString());
this.printStream.print("</div>");
}
this.printStream.print("<div id='javacode'>");
this.printStream.print(this.sbCode.toString());
this.printStream.print("</div>");
this.printStream.print("<div id='metadata'>");
this.printStream.print("Java Class Version: " + VersionUtil.getJDKVersion(this.majorVersion, this.minorVersion) + "<br>");
this.printStream.print("JD-CL Version: " + "0.1.0" + "<br>");
this.printStream.print("JD-Core Version: " + CoreConstants.JD_CORE_VERSION);
this.printStream.print("</div>");
this.printStream.print("</div></div></div></body></html>");
}
public void indent()
{
this.indentationCount++;
}
public void desindent()
{
if (this.indentationCount > 0)
this.indentationCount--;
}
public void startOfLine(int lineNumber)
{
this.realLineNumber++;
if (this.maxLineNumber > 0)
{
if (lineNumber == UNKNOWN_LINE_NUMBER)
{
this.sbLineNumber.append(String.format(
this.unknownLineNumberPrefix, this.realLineNumber));
}
else
{
this.sbLineNumber.append(String.format(
this.realLineNumberFormatPrefix, this.realLineNumber));
if (this.realLineNumber == lineNumber)
{
this.sbLineNumber.append(String.format(
this.lineNumberFormatPrefix, lineNumber));
}
else
{
this.sbLineNumber.append("<span>");
this.sbLineNumber.append(String.format(
this.lineNumberFormatPrefix, lineNumber));
this.sbLineNumber.append("</span>");
}
}
}
for (int i=0; i<indentationCount; i++)
this.sbCode.append(" ");
}
public void endOfLine()
{
this.sbCode.append("<br>");
}
public void extraLine(int count)
{
if (this.maxLineNumber > 0)
{
this.sbLineNumber.append("<s>");
}
this.sbCode.append("<s>");
while (count-- > 0)
{
this.realLineNumber++;
if (this.maxLineNumber > 0)
{
this.sbLineNumber.append(String.format(
this.unknownLineNumberPrefix, this.realLineNumber));
}
this.sbCode.append("<br>");
}
if (this.maxLineNumber > 0)
{
this.sbLineNumber.append("</s>");
}
this.sbCode.append("</s>");
}
public void startOfComment()
{
this.sbCode.append("<cite>");
this.commentJavadocErrorDepth++;
}
public void endOfComment()
{
this.sbCode.append("</cite>");
this.commentJavadocErrorDepth--;
}
public void startOfJavadoc()
{
this.sbCode.append("<dfn>");
this.commentJavadocErrorDepth++;
}
public void endOfJavadoc()
{
this.sbCode.append("</dfn>");
this.commentJavadocErrorDepth--;
}
public void startOfXdoclet() { this.sbCode.append("<b>"); }
public void endOfXdoclet() { this.sbCode.append("</b>"); }
public void startOfError()
{
this.sbCode.append("<span>");
this.commentJavadocErrorDepth++;
}
public void endOfError()
{
this.sbCode.append("</span>");
this.commentJavadocErrorDepth--;
}
public void startOfImportStatements() {}
public void endOfImportStatements() {}
public void startOfTypeDeclaration(String internalPath) {}
public void endOfTypeDeclaration() {}
public void startOfAnnotationName()
{
this.sbCode.append("<del>");
}
public void endOfAnnotationName()
{
this.sbCode.append("</del>");
}
public void startOfOptionalPrefix()
{
this.sbCode.append("<kbd>");
}
public void endOfOptionalPrefix()
{
this.sbCode.append("</kbd>");
}
public void debugStartOfLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("<span class='debuglayoutblock' alt='block'>");
}
}
public void debugEndOfLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("</span>");
}
}
public void debugStartOfSeparatorLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("<span class='debugseparatorlayoutblock' alr='separator'>");
}
}
public void debugEndOfSeparatorLayoutBlock(int min, int value, int max)
{
if (DEBUG)
{
// DEBUG // this.sb.append(min);
// DEBUG // this.sb.append("<=");
// DEBUG // this.sb.append(value);
// DEBUG // this.sb.append("<=");
// DEBUG // this.sb.append(max);
this.sbCode.append("</span>");
}
}
public void debugStartOfStatementsBlockLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("<span class='debugstatementblocklayoutblock' alt='statement'>");
}
}
public void debugEndOfStatementsBlockLayoutBlock(int min, int value, int max)
{
if (DEBUG)
{
// DEBUG // this.sb.append(min);
// DEBUG // this.sb.append("<=");
// DEBUG // this.sb.append(value);
// DEBUG // this.sb.append("<=");
// DEBUG // this.sb.append(max);
this.sbCode.append("</span>");
}
}
public void debugStartOfInstructionBlockLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("<span class='debugenumblocklayoutblock' alt='numeric block'>");
}
}
public void debugEndOfInstructionBlockLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("</span>");
}
}
public void debugStartOfCommentDeprecatedLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("<span class='debugcommentdeprecatedlayoutblock' alt='comment deprecated'>");
}
}
public void debugEndOfCommentDeprecatedLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("</span>");
}
}
public void debugMarker(String marker)
{
if (DEBUG)
{
// DEBUG // this.sb.append("<span class='debugmarker'>");
// DEBUG // this.sb.append(marker);
// DEBUG // this.sb.append("</span>");
}
}
public void debugStartOfCaseBlockLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("<span class='debugcaseblocklayoutblock' alt='case block'>");
}
}
public void debugEndOfCaseBlockLayoutBlock()
{
if (DEBUG)
{
this.sbCode.append("</span>");
}
}
}