improved auto trigger for html
[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     Klaus Hartlage - www.eclipseproject.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.JavaColorManager;
18 import net.sourceforge.phpeclipse.phpeditor.util.HTMLWordDetector;
19 import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider;
20 import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector;
21
22 import org.eclipse.jface.preference.IPreferenceStore;
23 import org.eclipse.jface.text.TextAttribute;
24 import org.eclipse.jface.text.rules.ICharacterScanner;
25 import org.eclipse.jface.text.rules.IRule;
26 import org.eclipse.jface.text.rules.IToken;
27 import org.eclipse.jface.text.rules.IWordDetector;
28 import org.eclipse.jface.text.rules.RuleBasedScanner;
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 RuleBasedScanner {
38
39   private static String[] fgKeywords = {
40   };
41
42   private static String[] fgTypes = {
43   };
44
45   private IToken keyword;
46
47   private class HTMLWordRule extends WordRule {
48     private StringBuffer fBuffer = new StringBuffer();
49
50     public HTMLWordRule(IWordDetector detector) {
51       super(detector, Token.UNDEFINED);
52     }
53
54     public HTMLWordRule(IWordDetector detector, IToken defaultToken) {
55       super(detector, defaultToken);
56     }
57
58     public IToken evaluate(ICharacterScanner scanner) {
59       int c = scanner.read();
60       boolean tagBegin = false;
61       if (fDetector.isWordStart((char) c)) {
62         if (c == '<') {
63           tagBegin = true;
64         }
65         if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
66
67           fBuffer.setLength(0);
68           do {
69             fBuffer.append((char) c);
70             c = scanner.read();
71             if (c == '>') {
72               fBuffer.append((char) c);
73               c = scanner.read();
74               break;
75             }
76             if (c == '/' && (fBuffer.length() > 2) ) {
77               break;
78             }
79           } while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c));
80           scanner.unread();
81
82           if (tagBegin) {
83             return keyword;
84           }
85           IToken token = (IToken) fWords.get(fBuffer.toString());
86           if (token != null)
87             return token;
88
89           if (fDefaultToken.isUndefined())
90             unreadBuffer(scanner);
91
92           return fDefaultToken;
93         }
94       }
95
96       scanner.unread();
97       return Token.UNDEFINED;
98     }
99
100   }
101
102   //private static String[] fgConstants = { "__LINE__", "__FILE__", "true", "false" };
103   private TextAttribute fComment;
104   private TextAttribute fKeyword;
105   private TextAttribute fType;
106   private TextAttribute fString;
107   private PHPColorProvider fColorProvider;
108
109   /**
110    * Creates a Java code scanner
111    */
112   public HTMLCodeScanner(JavaColorManager provider, IPreferenceStore store) {
113
114     keyword = new Token(new TextAttribute(provider.getColor(PHPColorProvider.KEYWORD)));
115     IToken type = new Token(new TextAttribute(provider.getColor(PHPColorProvider.FUNCTION_NAME)));
116     IToken string = new Token(new TextAttribute(provider.getColor(PHPColorProvider.STRING)));
117     IToken comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.SINGLE_LINE_COMMENT)));
118     IToken multi_comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.MULTI_LINE_COMMENT)));
119     IToken other = new Token(new TextAttribute(provider.getColor(PHPColorProvider.DEFAULT)));
120
121     //variable = new Token(new TextAttribute(provider.getColor(PHPColorProvider.VARIABLE)));
122
123     List rules = new ArrayList();
124
125     // Add rule for single line comments.
126     //rules.add(new EndOfLineRule("//", comment)); //$NON-NLS-1$
127     //rules.add(new EndOfLineRule("#", comment));
128
129     // Add rule for strings and character constants.
130     rules.add(new SingleLineRule("\"", "\"", string)); //$NON-NLS-2$ //$NON-NLS-1$
131     // rules.add(new SingleLineRule("'", "'", string, '\\')); //$NON-NLS-2$ //$NON-NLS-1$
132
133     // rules.add(new SingleLineRule("//", "//", php_comment));
134     // rules.add(new MultiLineRule("/*", "*/", multi_comment));
135
136     // Add generic whitespace rule.
137     rules.add(new WhitespaceRule(new PHPWhitespaceDetector()));
138
139     // Add word rule for keywords, types, and constants.
140     HTMLWordRule wordRule = new HTMLWordRule(new HTMLWordDetector(), other);
141     for (int i = 0; i < fgKeywords.length; i++)
142       wordRule.addWord(fgKeywords[i], keyword);
143     for (int i = 0; i < fgTypes.length; i++)
144       wordRule.addWord(fgTypes[i], type);
145     //   for (int i = 0; i < fgConstants.length; i++)
146     //     wordRule.addWord(fgConstants[i], type);
147     rules.add(wordRule);
148
149     IRule[] result = new IRule[rules.size()];
150     rules.toArray(result);
151     setRules(result);
152   }
153
154 }