Fix bug #1385272: Improved version for "Parsing of short open tags not fully compatib...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / SmartyDocCodeScanner.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 **********************************************************************/
11 package net.sourceforge.phpeclipse.phpeditor.php;
12
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.PHPWhitespaceDetector;
21
22 import org.eclipse.jface.preference.IPreferenceStore;
23 import org.eclipse.jface.text.BadLocationException;
24 import org.eclipse.jface.text.IDocument;
25 import org.eclipse.jface.text.rules.ICharacterScanner;
26 import org.eclipse.jface.text.rules.IToken;
27 import org.eclipse.jface.text.rules.IWordDetector;
28 import org.eclipse.jface.text.rules.SingleLineRule;
29 import org.eclipse.jface.text.rules.Token;
30 import org.eclipse.jface.text.rules.WhitespaceRule;
31 import org.eclipse.jface.text.rules.WordRule;
32
33
34
35
36 /**
37  * A rule based SmartyDoc scanner.
38  */
39 public final class SmartyDocCodeScanner extends AbstractJavaScanner {
40                 
41                 
42   /**
43    * A key word detector.
44    */
45   static class JavaDocKeywordDetector implements IWordDetector {
46
47     /**
48      * @see IWordDetector#isWordStart
49      */
50     public boolean isWordStart(char c) {
51       return (c == '@');
52     }
53
54     /**
55      * @see IWordDetector#isWordPart
56      */
57     public boolean isWordPart(char c) {
58       return Character.isLetter(c);
59     }
60   };
61         
62         
63   /**
64    * Detector for HTML comment delimiters.
65    */
66   static class HTMLCommentDetector implements IWordDetector {
67
68     /**
69      * @see IWordDetector#isWordStart
70      */
71     public boolean isWordStart(char c) {
72       return (c == '<' || c == '-');
73     }
74
75     /**
76      * @see IWordDetector#isWordPart
77      */
78     public boolean isWordPart(char c) {
79       return (c == '-' || c == '!' || c == '>');
80     }
81   };
82         
83   class TagRule extends SingleLineRule {
84                 
85     /*
86      * @see SingleLineRule
87      */
88     public TagRule(IToken token) {
89       super("<", ">", token, (char) 0); //$NON-NLS-2$ //$NON-NLS-1$
90     }
91                 
92     /*
93      * @see SingleLineRule 
94      */
95     public TagRule(IToken token, char escapeCharacter) {
96       super("<", ">", token, escapeCharacter); //$NON-NLS-2$ //$NON-NLS-1$
97     }
98                 
99     private IToken checkForWhitespace(ICharacterScanner scanner) {
100                         
101       try {
102                                 
103         char c= getDocument().getChar(getTokenOffset() + 1);
104         if (!Character.isWhitespace(c)) 
105           return fToken;
106                                         
107       } catch (BadLocationException x) {
108       }
109                         
110       return Token.UNDEFINED;
111     }
112                                 
113     /*
114      * @see PatternRule#evaluate(ICharacterScanner)
115      */
116     public IToken evaluate(ICharacterScanner scanner) {
117       IToken result= super.evaluate(scanner);
118       if (result == fToken)
119         return checkForWhitespace(scanner);
120       return result;
121     }
122   };
123         
124         
125   private static String[] fgKeywords= {"@author", "@deprecated", "@exception", "@param", "@return", "@see", "@serial", "@serialData", "@serialField", "@since", "@throws", "@version"}; //$NON-NLS-12$ //$NON-NLS-11$ //$NON-NLS-10$ //$NON-NLS-7$ //$NON-NLS-9$ //$NON-NLS-8$ //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
126         
127   private static String[] fgTokenProperties= {
128                 IPreferenceConstants.PHPDOC_KEYWORD,
129                 IPreferenceConstants.PHPDOC_TAG,
130                 IPreferenceConstants.PHPDOC_LINK,
131                 IPreferenceConstants.PHPDOC_DEFAULT
132   };                    
133         
134         
135   public SmartyDocCodeScanner(IColorManager manager, IPreferenceStore store) {
136     super(manager, store);
137     initialize();
138   }
139         
140   public IDocument getDocument() {
141     return fDocument;
142   }
143         
144   /*
145    * @see AbstractJavaScanner#getTokenProperties()
146    */
147   protected String[] getTokenProperties() {
148     return fgTokenProperties;
149   }
150
151   /*
152    * @see AbstractJavaScanner#createRules()
153    */
154   protected List createRules() {
155                 
156     List list= new ArrayList();
157                 
158     // Add rule for tags.
159     Token token= getToken(IPreferenceConstants.PHPDOC_TAG);
160     list.add(new TagRule(token));
161                 
162                 
163     // Add rule for HTML comments
164     WordRule wordRule= new WordRule(new HTMLCommentDetector(), token);
165     wordRule.addWord("<!--", token); //$NON-NLS-1$
166     wordRule.addWord("--!>", token); //$NON-NLS-1$
167     list.add(wordRule);
168                 
169                 
170     // Add rule for links.
171     token= getToken(IPreferenceConstants.PHPDOC_LINK);
172     list.add(new SingleLineRule("{@link", "}", token)); //$NON-NLS-2$ //$NON-NLS-1$
173                 
174                 
175     // Add generic whitespace rule.
176     list.add(new WhitespaceRule(new PHPWhitespaceDetector()));
177                 
178                 
179     // Add word rule for keywords.
180     token= getToken(IPreferenceConstants.PHPDOC_DEFAULT);
181     wordRule= new WordRule(new JavaDocKeywordDetector(), token);
182                 
183     token= getToken(IPreferenceConstants.PHPDOC_KEYWORD);
184     for (int i= 0; i < fgKeywords.length; i++)
185       wordRule.addWord(fgKeywords[i], token);
186     list.add(wordRule);
187                 
188     setDefaultReturnToken(getToken(IPreferenceConstants.PHPDOC_DEFAULT));
189     return list;
190   }
191 }
192
193