Improved xml scanner for this bug
[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_STRING_DQ,
55     IPreferenceConstants.PHP_STRING_SQ,
56     IPreferenceConstants.PHP_TYPE,
57     IPreferenceConstants.PHP_CONSTANT,
58     IPreferenceConstants.PHP_DEFAULT,
59     IPreferenceConstants.PHP_OPERATOR,
60     IPreferenceConstants.PHP_BRACE_OPERATOR,
61     IPreferenceConstants.PHP_KEYWORD_RETURN};
62   /*
63    * @see AbstractJavaScanner#getTokenProperties()
64    */
65   protected String[] getTokenProperties() {
66     return fgTokenProperties;
67   }
68   private class HTMLWordRule extends WordRule {
69     private StringBuffer fBuffer = new StringBuffer();
70
71     public HTMLWordRule(IWordDetector detector) {
72       super(detector, Token.UNDEFINED);
73     }
74
75     public HTMLWordRule(IWordDetector detector, IToken defaultToken) {
76       super(detector, defaultToken);
77     }
78
79     public IToken evaluate(ICharacterScanner scanner) {
80       int c = scanner.read();
81       boolean tagBegin = false;
82       if (fDetector.isWordStart((char) c)) {
83         if (c == '<') {
84           tagBegin = true;
85         }
86         if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
87
88           fBuffer.setLength(0);
89           do {
90             fBuffer.append((char) c);
91             c = scanner.read();
92             if (c == '>') {
93               fBuffer.append((char) c);
94               c = scanner.read();
95               break;
96             }
97             if (c == '/' && (fBuffer.length() > 2) ) {
98               break;
99             }
100           } while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c));
101           scanner.unread();
102
103           if (tagBegin) {
104             return getToken(IPreferenceConstants.PHP_KEYWORD);
105           }
106           IToken token = (IToken) fWords.get(fBuffer.toString());
107           if (token != null)
108             return token;
109
110           if (fDefaultToken.isUndefined())
111             unreadBuffer(scanner);
112
113           return fDefaultToken;
114         }
115       }
116
117       scanner.unread();
118       return Token.UNDEFINED;
119     }
120
121   }
122
123   //private static String[] fgConstants = { "__LINE__", "__FILE__", "true", "false" };
124   private TextAttribute fComment;
125   private TextAttribute fKeyword;
126   private TextAttribute fType;
127   private TextAttribute fString;
128   private PHPColorProvider fColorProvider;
129
130   /**
131    * Creates a Java code scanner
132    */
133   public HTMLCodeScanner(IColorManager manager, IPreferenceStore store) {
134     super(manager, store);
135     initialize();
136   }
137
138   /*
139    * @see AbstractJavaScanner#createRules()
140    */
141   protected List createRules() {
142     List rules = new ArrayList();
143
144 //  keyword = new Token(new TextAttribute(provider.getColor(PHPColorProvider.KEYWORD)));
145 //  IToken type = new Token(new TextAttribute(provider.getColor(PHPColorProvider.FUNCTION_NAME)));
146 //    IToken string = new Token(new TextAttribute(provider.getColor(PHPColorProvider.STRING_DQ)));
147 //  IToken comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.SINGLE_LINE_COMMENT)));
148 //  IToken multi_comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.MULTI_LINE_COMMENT)));
149 //    IToken other = new Token(new TextAttribute(provider.getColor(PHPColorProvider.DEFAULT)));
150
151   //variable = new Token(new TextAttribute(provider.getColor(PHPColorProvider.VARIABLE)));
152
153
154   // Add rule for single line comments.
155   //rules.add(new EndOfLineRule("//", comment)); //$NON-NLS-1$
156   //rules.add(new EndOfLineRule("#", comment));
157
158   // Add rule for strings and character constants.
159   rules.add(new SingleLineRule("\"", "\"", getToken(IPreferenceConstants.PHP_STRING_DQ))); //$NON-NLS-2$ //$NON-NLS-1$
160   // rules.add(new SingleLineRule("'", "'", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
161
162   // rules.add(new SingleLineRule("//", "//", php_comment));
163   // rules.add(new MultiLineRule("/*", "*/", multi_comment));
164
165   // Add generic whitespace rule.
166   rules.add(new WhitespaceRule(new PHPWhitespaceDetector()));
167
168   // Add word rule for keywords, types, and constants.
169   HTMLWordRule wordRule = new HTMLWordRule(new HTMLWordDetector(), getToken(IPreferenceConstants.PHP_DEFAULT));
170 //  for (int i = 0; i < fgKeywords.length; i++)
171 //    wordRule.addWord(fgKeywords[i], keyword);
172 //  for (int i = 0; i < fgTypes.length; i++)
173 //    wordRule.addWord(fgTypes[i], type);
174   rules.add(wordRule);
175   
176   setDefaultReturnToken(getToken(IPreferenceConstants.PHP_DEFAULT));
177 return rules;
178   }
179 }