001 /** 002 * 003 * Copyright 2005 Jeremy Rayner 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 package org.codehaus.groovy.antlr.treewalker; 019 020 import java.io.PrintStream; 021 import org.codehaus.groovy.antlr.GroovySourceAST; 022 import org.codehaus.groovy.antlr.parser.GroovyTokenTypes; 023 024 /** 025 * A visitor that prints a html tags of each node to the supplied PrintStream 026 * 027 * @author <a href="mailto:groovy@ross-rayner.com">Jeremy Rayner</a> 028 * @version $Revision: 1.1 $ 029 */ 030 031 public class NodeAsHTMLPrinter extends VisitorAdapter { 032 private String[] tokenNames; 033 private PrintStream out; 034 035 /** 036 * A visitor that prints a html tags, for each node, to the supplied PrintStream. 037 * @param out supplied PrintStream to output nodes to 038 * @param tokenNames an array of token names to use 039 */ 040 public NodeAsHTMLPrinter(PrintStream out,String[] tokenNames) { 041 this.tokenNames = tokenNames; 042 this.out = out; 043 } 044 045 public void setUp() { 046 out.println("<html><head></head><body><pre>"); 047 } 048 049 public void visitDefault(GroovySourceAST t,int visit) { 050 if (visit == OPENING_VISIT) { 051 out.print("<code title='" + tokenNames[t.getType()] + "'><font color='#" + colour(t) + "'>"); 052 } else { 053 out.print("</font></code>"); 054 } 055 } 056 057 public void tearDown() { 058 out.println("</pre></body></html>"); 059 } 060 061 private String colour(GroovySourceAST t) { 062 String black = "000000"; 063 String blue = "17178B"; 064 String green = "008000"; 065 //String purple = "7C308D"; 066 String colour = black; 067 switch (t.getType()) { 068 case GroovyTokenTypes.ABSTRACT : 069 case GroovyTokenTypes.ANNOTATION : 070 case GroovyTokenTypes.ANNOTATIONS : 071 case GroovyTokenTypes.ANNOTATION_ARRAY_INIT : 072 case GroovyTokenTypes.ANNOTATION_DEF : 073 case GroovyTokenTypes.ANNOTATION_FIELD_DEF : 074 case GroovyTokenTypes.ANNOTATION_MEMBER_VALUE_PAIR : 075 case GroovyTokenTypes.ARRAY_DECLARATOR : 076 case GroovyTokenTypes.ASSIGN : 077 case GroovyTokenTypes.AT : 078 case GroovyTokenTypes.BAND : 079 case GroovyTokenTypes.BAND_ASSIGN : 080 case GroovyTokenTypes.BIG_SUFFIX : 081 case GroovyTokenTypes.BLOCK : 082 case GroovyTokenTypes.BNOT : 083 case GroovyTokenTypes.BOR : 084 case GroovyTokenTypes.BOR_ASSIGN : 085 case GroovyTokenTypes.BSR : 086 case GroovyTokenTypes.BSR_ASSIGN : 087 case GroovyTokenTypes.BXOR : 088 case GroovyTokenTypes.BXOR_ASSIGN : 089 case GroovyTokenTypes.CASE_GROUP : 090 case GroovyTokenTypes.CLOSED_BLOCK : 091 case GroovyTokenTypes.CLOSURE_OP : 092 case GroovyTokenTypes.COLON : 093 case GroovyTokenTypes.COMMA : 094 case GroovyTokenTypes.COMPARE_TO : 095 case GroovyTokenTypes.CTOR_CALL : 096 case GroovyTokenTypes.CTOR_IDENT : 097 case GroovyTokenTypes.DEC : 098 case GroovyTokenTypes.DIGIT : 099 case GroovyTokenTypes.DIV : 100 case GroovyTokenTypes.DIV_ASSIGN : 101 case GroovyTokenTypes.DOLLAR : 102 case GroovyTokenTypes.DOT : 103 case GroovyTokenTypes.DYNAMIC_MEMBER : 104 case GroovyTokenTypes.ELIST : 105 case GroovyTokenTypes.EMPTY_STAT : 106 case GroovyTokenTypes.ENUM_CONSTANT_DEF : 107 case GroovyTokenTypes.ENUM_DEF : 108 case GroovyTokenTypes.EOF : 109 case GroovyTokenTypes.EQUAL : 110 case GroovyTokenTypes.ESC : 111 case GroovyTokenTypes.EXPONENT : 112 case GroovyTokenTypes.EXPR : 113 case GroovyTokenTypes.FINAL : 114 case GroovyTokenTypes.FLOAT_SUFFIX : 115 case GroovyTokenTypes.FOR_CONDITION : 116 case GroovyTokenTypes.FOR_EACH_CLAUSE : 117 case GroovyTokenTypes.FOR_INIT : 118 case GroovyTokenTypes.FOR_IN_ITERABLE : 119 case GroovyTokenTypes.FOR_ITERATOR : 120 case GroovyTokenTypes.GE : 121 case GroovyTokenTypes.GT : 122 case GroovyTokenTypes.HEX_DIGIT : 123 case GroovyTokenTypes.IDENT : 124 case GroovyTokenTypes.IMPLICIT_PARAMETERS : 125 case GroovyTokenTypes.INC : 126 case GroovyTokenTypes.INDEX_OP : 127 case GroovyTokenTypes.INSTANCE_INIT : 128 case GroovyTokenTypes.INTERFACE_DEF : 129 case GroovyTokenTypes.LABELED_ARG : 130 case GroovyTokenTypes.LABELED_STAT : 131 case GroovyTokenTypes.LAND : 132 case GroovyTokenTypes.LBRACK : 133 case GroovyTokenTypes.LCURLY : 134 case GroovyTokenTypes.LE : 135 case GroovyTokenTypes.LETTER : 136 case GroovyTokenTypes.LIST_CONSTRUCTOR : 137 case GroovyTokenTypes.LNOT : 138 case GroovyTokenTypes.LOR : 139 case GroovyTokenTypes.LPAREN : 140 case GroovyTokenTypes.LT : 141 case GroovyTokenTypes.MAP_CONSTRUCTOR : 142 case GroovyTokenTypes.MEMBER_POINTER : 143 case GroovyTokenTypes.METHOD_CALL : 144 case GroovyTokenTypes.METHOD_DEF : 145 case GroovyTokenTypes.MINUS : 146 case GroovyTokenTypes.MINUS_ASSIGN : 147 case GroovyTokenTypes.ML_COMMENT : 148 case GroovyTokenTypes.MOD : 149 case GroovyTokenTypes.MODIFIERS : 150 case GroovyTokenTypes.MOD_ASSIGN : 151 case GroovyTokenTypes.NLS : 152 case GroovyTokenTypes.NOT_EQUAL : 153 case GroovyTokenTypes.NULL_TREE_LOOKAHEAD : 154 case GroovyTokenTypes.NUM_BIG_DECIMAL : 155 case GroovyTokenTypes.NUM_BIG_INT : 156 case GroovyTokenTypes.NUM_DOUBLE : 157 case GroovyTokenTypes.NUM_FLOAT : 158 case GroovyTokenTypes.NUM_INT : 159 case GroovyTokenTypes.NUM_LONG : 160 case GroovyTokenTypes.OBJBLOCK : 161 case GroovyTokenTypes.ONE_NL : 162 case GroovyTokenTypes.OPTIONAL_DOT : 163 case GroovyTokenTypes.PARAMETERS : 164 case GroovyTokenTypes.PARAMETER_DEF : 165 case GroovyTokenTypes.PLUS : 166 case GroovyTokenTypes.PLUS_ASSIGN : 167 case GroovyTokenTypes.POST_DEC : 168 case GroovyTokenTypes.POST_INC : 169 case GroovyTokenTypes.QUESTION : 170 case GroovyTokenTypes.RANGE_EXCLUSIVE : 171 case GroovyTokenTypes.RANGE_INCLUSIVE : 172 case GroovyTokenTypes.RBRACK : 173 case GroovyTokenTypes.RCURLY : 174 case GroovyTokenTypes.REGEXP_CTOR_END : 175 case GroovyTokenTypes.REGEXP_SYMBOL : 176 case GroovyTokenTypes.REGEX_FIND : 177 case GroovyTokenTypes.REGEX_MATCH : 178 case GroovyTokenTypes.RPAREN : 179 case GroovyTokenTypes.SCOPE_ESCAPE : 180 case GroovyTokenTypes.SELECT_SLOT : 181 case GroovyTokenTypes.SEMI : 182 case GroovyTokenTypes.SH_COMMENT : 183 case GroovyTokenTypes.SL : 184 case GroovyTokenTypes.SLIST : 185 case GroovyTokenTypes.SL_ASSIGN : 186 case GroovyTokenTypes.SL_COMMENT : 187 case GroovyTokenTypes.SPREAD_ARG : 188 case GroovyTokenTypes.SPREAD_DOT : 189 case GroovyTokenTypes.SPREAD_MAP_ARG : 190 case GroovyTokenTypes.SR : 191 case GroovyTokenTypes.SR_ASSIGN : 192 case GroovyTokenTypes.STAR : 193 case GroovyTokenTypes.STAR_ASSIGN : 194 case GroovyTokenTypes.STAR_STAR : 195 case GroovyTokenTypes.STAR_STAR_ASSIGN : 196 case GroovyTokenTypes.STATIC_IMPORT : 197 case GroovyTokenTypes.STATIC_INIT : 198 case GroovyTokenTypes.STRICTFP : 199 case GroovyTokenTypes.STRING_CH : 200 case GroovyTokenTypes.STRING_CONSTRUCTOR : 201 case GroovyTokenTypes.STRING_CTOR_END : 202 case GroovyTokenTypes.STRING_CTOR_MIDDLE : 203 case GroovyTokenTypes.STRING_CTOR_START : 204 case GroovyTokenTypes.STRING_NL : 205 case GroovyTokenTypes.SUPER_CTOR_CALL : 206 case GroovyTokenTypes.TRIPLE_DOT : 207 case GroovyTokenTypes.TYPECAST : 208 case GroovyTokenTypes.TYPE_ARGUMENT : 209 case GroovyTokenTypes.TYPE_ARGUMENTS : 210 case GroovyTokenTypes.TYPE_LOWER_BOUNDS : 211 case GroovyTokenTypes.TYPE_PARAMETER : 212 case GroovyTokenTypes.TYPE_PARAMETERS : 213 case GroovyTokenTypes.TYPE_UPPER_BOUNDS : 214 case GroovyTokenTypes.UNARY_MINUS : 215 case GroovyTokenTypes.UNARY_PLUS : 216 case GroovyTokenTypes.UNUSED_CONST : 217 case GroovyTokenTypes.UNUSED_DO : 218 case GroovyTokenTypes.UNUSED_GOTO : 219 case GroovyTokenTypes.VARIABLE_DEF : 220 case GroovyTokenTypes.VARIABLE_PARAMETER_DEF : 221 case GroovyTokenTypes.VOCAB : 222 case GroovyTokenTypes.WILDCARD_TYPE : 223 case GroovyTokenTypes.WS : 224 colour = black; 225 break; 226 227 case GroovyTokenTypes.STRING_LITERAL : 228 case GroovyTokenTypes.REGEXP_LITERAL : 229 colour = green; 230 break; 231 232 case GroovyTokenTypes.CLASS_DEF : 233 case GroovyTokenTypes.EXTENDS_CLAUSE : 234 case GroovyTokenTypes.IMPLEMENTS_CLAUSE : 235 case GroovyTokenTypes.IMPORT : 236 case GroovyTokenTypes.LITERAL_any : 237 case GroovyTokenTypes.LITERAL_as : 238 case GroovyTokenTypes.LITERAL_assert : 239 case GroovyTokenTypes.LITERAL_boolean : 240 case GroovyTokenTypes.LITERAL_break : 241 case GroovyTokenTypes.LITERAL_byte : 242 case GroovyTokenTypes.LITERAL_case : 243 case GroovyTokenTypes.LITERAL_catch : 244 case GroovyTokenTypes.LITERAL_char : 245 case GroovyTokenTypes.LITERAL_class : 246 case GroovyTokenTypes.LITERAL_continue : 247 case GroovyTokenTypes.LITERAL_def : 248 case GroovyTokenTypes.LITERAL_default : 249 case GroovyTokenTypes.LITERAL_double : 250 case GroovyTokenTypes.LITERAL_else : 251 case GroovyTokenTypes.LITERAL_enum : 252 case GroovyTokenTypes.LITERAL_extends : 253 case GroovyTokenTypes.LITERAL_false : 254 case GroovyTokenTypes.LITERAL_finally : 255 case GroovyTokenTypes.LITERAL_float : 256 case GroovyTokenTypes.LITERAL_for : 257 case GroovyTokenTypes.LITERAL_if : 258 case GroovyTokenTypes.LITERAL_implements : 259 case GroovyTokenTypes.LITERAL_import : 260 case GroovyTokenTypes.LITERAL_in : 261 case GroovyTokenTypes.LITERAL_instanceof : 262 case GroovyTokenTypes.LITERAL_int : 263 case GroovyTokenTypes.LITERAL_interface : 264 case GroovyTokenTypes.LITERAL_long : 265 case GroovyTokenTypes.LITERAL_native : 266 case GroovyTokenTypes.LITERAL_new : 267 case GroovyTokenTypes.LITERAL_null : 268 case GroovyTokenTypes.LITERAL_package : 269 case GroovyTokenTypes.LITERAL_private : 270 case GroovyTokenTypes.LITERAL_protected : 271 case GroovyTokenTypes.LITERAL_public : 272 case GroovyTokenTypes.LITERAL_return : 273 case GroovyTokenTypes.LITERAL_short : 274 case GroovyTokenTypes.LITERAL_static : 275 case GroovyTokenTypes.LITERAL_super : 276 case GroovyTokenTypes.LITERAL_switch : 277 case GroovyTokenTypes.LITERAL_synchronized : 278 case GroovyTokenTypes.LITERAL_this : 279 case GroovyTokenTypes.LITERAL_threadsafe : 280 case GroovyTokenTypes.LITERAL_throw : 281 case GroovyTokenTypes.LITERAL_throws : 282 case GroovyTokenTypes.LITERAL_transient : 283 case GroovyTokenTypes.LITERAL_true : 284 case GroovyTokenTypes.LITERAL_try : 285 case GroovyTokenTypes.LITERAL_void : 286 case GroovyTokenTypes.LITERAL_volatile : 287 case GroovyTokenTypes.LITERAL_while : 288 case GroovyTokenTypes.LITERAL_with : 289 case GroovyTokenTypes.PACKAGE_DEF : 290 case GroovyTokenTypes.TYPE : 291 colour = blue; 292 break; 293 294 default: 295 colour = black; 296 break; 297 } 298 return colour; 299 } 300 }