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    }