Fixed bug: ArrayIndexOutOfBoundsException
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / HTMLCodeScanner.java
1 /**********************************************************************
2 Copyright (c) 2000, 2002 IBM Corp. and others.
3 All rights reserved. This program and the accompanying materials
4 are made available under the terms of the Common Public License v1.0
5 which accompanies this distribution, and is available at
6 http://www.eclipse.org/legal/cpl-v10.html
7
8 Contributors:
9     IBM Corporation - Initial implementation
10     www.phpeclipse.de
11 **********************************************************************/
12 package net.sourceforge.phpeclipse.phpeditor.php;
13
14 import java.util.ArrayList;
15 import java.util.List;
16
17 import net.sourceforge.phpdt.internal.ui.text.AbstractJavaScanner;
18 import net.sourceforge.phpdt.ui.text.IColorManager;
19 import net.sourceforge.phpeclipse.IPreferenceConstants;
20 import net.sourceforge.phpeclipse.phpeditor.util.HTMLWordDetector;
21 import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
22 import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector;
23
24 import org.eclipse.jface.preference.IPreferenceStore;
25 import org.eclipse.jface.text.TextAttribute;
26 import org.eclipse.jface.text.rules.ICharacterScanner;
27 import org.eclipse.jface.text.rules.IToken;
28 import org.eclipse.jface.text.rules.IWordDetector;
29 import org.eclipse.jface.text.rules.SingleLineRule;
30 import org.eclipse.jface.text.rules.Token;
31 import org.eclipse.jface.text.rules.WhitespaceRule;
32 import org.eclipse.jface.text.rules.WordRule;
33
34 /**
35  * A HTML code scanner.
36  */
37 public class HTMLCodeScanner extends AbstractJavaScanner {
38
39 //  private static String[] fgKeywords = {
40 //  };
41 //
42 //  private static String[] fgTypes = {
43 //  };
44
45 //  private IToken keyword;
46   private static String[] fgTokenProperties =
47   {
48     IPreferenceConstants.PHP_MULTILINE_COMMENT,
49     IPreferenceConstants.PHP_SINGLELINE_COMMENT,
50           IPreferenceConstants.PHP_TAG,
51     IPreferenceConstants.PHP_KEYWORD,
52     IPreferenceConstants.PHP_FUNCTIONNAME,
53     IPreferenceConstants.PHP_VARIABLE,
54     IPreferenceConstants.PHP_VARIABLE_DOLLAR,
55     IPreferenceConstants.PHP_STRING_DQ,
56     IPreferenceConstants.PHP_STRING_SQ,
57     IPreferenceConstants.PHP_TYPE,
58     IPreferenceConstants.PHP_CONSTANT,
59     IPreferenceConstants.PHP_DEFAULT,
60     IPreferenceConstants.PHP_OPERATOR,
61     IPreferenceConstants.PHP_BRACE_OPERATOR,
62     IPreferenceConstants.PHP_KEYWORD_RETURN};
63   /*
64    * @see AbstractJavaScanner#getTokenProperties()
65    */
66   protected String[] getTokenProperties() {
67     return fgTokenProperties;
68   }
69   private class HTMLWordRule extends WordRule {
70     private StringBuffer fBuffer = new StringBuffer();
71
72     public HTMLWordRule(IWordDetector detector) {
73       super(detector, Token.UNDEFINED);
74     }
75
76     public HTMLWordRule(IWordDetector detector, IToken defaultToken) {
77       super(detector, defaultToken);
78     }
79
80     public IToken evaluate(ICharacterScanner scanner) {
81       int c = scanner.read();
82       boolean tagBegin = false;
83       if (fDetector.isWordStart((char) c)) {
84         if (c == '<') {
85           tagBegin = true;
86         }
87         if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
88
89           fBuffer.setLength(0);
90           do {
91             fBuffer.append((char) c);
92             c = scanner.read();
93             if (c == '>') {
94               fBuffer.append((char) c);
95               c = scanner.read();
96               break;
97             }
98             if (c == '/' && (fBuffer.length() > 2) ) {
99               break;
100             }
101           } while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c));
102           scanner.unread();
103
104           if (tagBegin) {
105             return getToken(IPreferenceConstants.PHP_KEYWORD);
106           }
107           IToken token = (IToken) fWords.get(fBuffer.toString());
108           if (token != null)
109             return token;
110
111           if (fDefaultToken.isUndefined())
112             unreadBuffer(scanner);
113
114           return fDefaultToken;
115         }
116       }
117
118       scanner.unread();
119       return Token.UNDEFINED;
120     }
121
122   }
123
124   //private static String[] fgConstants = { "__LINE__", "__FILE__", "true", "false" };
125   private TextAttribute fComment;
126   private TextAttribute fKeyword;
127   private TextAttribute fType;
128   private TextAttribute fString;
129   private PHPColorProvider fColorProvider;
130
131   /**
132    * Creates a Java code scanner
133    */
134   public HTMLCodeScanner(IColorManager manager, IPreferenceStore store) {
135     super(manager, store);
136     initialize();
137   }
138
139   /*
140    * @see AbstractJavaScanner#createRules()
141    */
142   protected List createRules() {
143     List rules = new ArrayList();
144
145 //  keyword = new Token(new TextAttribute(provider.getColor(PHPColorProvider.KEYWORD)));
146 //  IToken type = new Token(new TextAttribute(provider.getColor(PHPColorProvider.FUNCTION_NAME)));
147 //    IToken string = new Token(new TextAttribute(provider.getColor(PHPColorProvider.STRING_DQ)));
148 //  IToken comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.SINGLE_LINE_COMMENT)));
149 //  IToken multi_comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.MULTI_LINE_COMMENT)));
150 //    IToken other = new Token(new TextAttribute(provider.getColor(PHPColorProvider.DEFAULT)));
151
152   //variable = new Token(new TextAttribute(provider.getColor(PHPColorProvider.VARIABLE)));
153
154
155   // Add rule for single line comments.
156   //rules.add(new EndOfLineRule("//", comment)); //$NON-NLS-1$
157   //rules.add(new EndOfLineRule("#", comment));
158
159   // Add rule for strings and character constants.
160   rules.add(new SingleLineRule("\"", "\"", getToken(IPreferenceConstants.PHP_STRING_DQ))); //$NON-NLS-2$ //$NON-NLS-1$
161   // rules.add(new SingleLineRule("'", "'", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
162
163   // rules.add(new SingleLineRule("//", "//", php_comment));
164   // rules.add(new MultiLineRule("/*", "*/", multi_comment));
165
166   // Add generic whitespace rule.
167   rules.add(new WhitespaceRule(new PHPWhitespaceDetector()));
168
169   // Add word rule for keywords, types, and constants.
170   HTMLWordRule wordRule = new HTMLWordRule(new HTMLWordDetector(), getToken(IPreferenceConstants.PHP_DEFAULT));
171 //  for (int i = 0; i < fgKeywords.length; i++)
172 //    wordRule.addWord(fgKeywords[i], keyword);
173 //  for (int i = 0; i < fgTypes.length; i++)
174 //    wordRule.addWord(fgTypes[i], type);
175   rules.add(wordRule);
176   
177   setDefaultReturnToken(getToken(IPreferenceConstants.PHP_DEFAULT));
178 return rules;
179   }
180 }