package org.eclipse.iee.web.renderer; import java.io.IOException; import java.io.Writer; import java.util.List; import org.eclipse.iee.core.document.DirectiveBlock; import org.eclipse.iee.core.document.Document; import org.eclipse.iee.core.document.DocumentPart; import org.eclipse.iee.core.document.PadDocumentPart; import org.eclipse.iee.core.document.TextDocumentPart; public class DefaultHTMLDocumentRenderer implements IHTMLDocumentRenderer { private final IHTMLRendererManager manager; public DefaultHTMLDocumentRenderer(IHTMLRendererManager manager) { this.manager = manager; } @Override public void renderHTMLHead(Document document, IHTMLRendererContext context) throws IOException { Writer writer = context.getWriter(); writer.append("<style type='text/css'>"); writer.append(appendStyles()); writer.append("</style>"); } @Override public void renderHTMLBody(Document document, IHTMLRendererContext context) throws IOException { Writer writer = context.getWriter(); writer.append("<div class='source'><pre>"); List<DocumentPart> children = document.getRoot().getChildren(); appendChildren(context, children); writer.append("</pre></div>"); } private void appendChildren(IHTMLRendererContext context, List<DocumentPart> children) throws IOException { for (DocumentPart documentPart : children) { appendPart(documentPart, context); } } private String appendStyles() { StringBuilder sb = new StringBuilder(); sb.append(".source .keyword {color: #7F0055;}"); sb.append(".source .linecomment {color: #3F7F5F;}"); sb.append(".source .comment {color: #3F7F5F;}"); sb.append(".source .javadoc {color: #3F5FBF;}"); sb.append(".source .stringliteral {color: #2A00FF;}"); sb.append(".source .hidden-block {display:none}"); return sb.toString(); } private void appendPart(DocumentPart documentPart, IHTMLRendererContext context) throws IOException { Writer writer = context.getWriter(); if (documentPart instanceof PadDocumentPart) { IHTMLRenderer<DocumentPart> renderer = manager.getPadHTMLRenderer(documentPart); writer.append("<div style='display:inline-block;'>"); if (renderer != null) { renderer.renderPad(documentPart, context); } else { writer.append("Unknow pad type " + documentPart.getClass()); } writer.append("</div>"); } else if (documentPart instanceof TextDocumentPart) { new DefaultTextRenderer().renderPad((TextDocumentPart) documentPart, context); } else if (documentPart instanceof DirectiveBlock) { String directive = ((DirectiveBlock) documentPart).getDirective(); if ("hide".equals(directive)) { writer.append("<div class='hidden-block'>"); appendChildren(context, documentPart.getChildren()); writer.append("</div>"); } else { appendChildren(context, documentPart.getChildren()); } } } @Override public void renderResource(Document document, String padId, String resourceId, IResourceRenderContext context) throws IOException { for (DocumentPart documentPart : document.getRoot().getChildren()) { if (documentPart instanceof PadDocumentPart) { if (padId.equals(((PadDocumentPart)documentPart).getId())) { IHTMLRenderer<DocumentPart> renderer = manager.getPadHTMLRenderer(documentPart); renderer.renderResource(documentPart, resourceId, context); } } } } }