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