/********************************************************************** Copyright (c) 2000, 2002 IBM Corp. and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html Contributors: IBM Corporation - Initial implementation **********************************************************************/ package net.sourceforge.phpdt.internal.ui.text.phpdoc; import java.util.ArrayList; import java.util.List; import net.sourceforge.phpeclipse.phpeditor.util.PHPColorProvider; import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.IWordDetector; import org.eclipse.jface.text.rules.RuleBasedScanner; import org.eclipse.jface.text.rules.SingleLineRule; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.jface.text.rules.WordRule; /** * A rule based PHPDoc scanner. */ public final class PHPDocCodeScanner extends RuleBasedScanner { /** * A key word detector. */ static class PHPDocKeywordDetector implements IWordDetector { /** * @see IWordDetector#isWordStart */ public boolean isWordStart(char c) { return (c == '@'); } /** * @see IWordDetector#isWordPart */ public boolean isWordPart(char c) { return Character.isLetter(c); } }; /** * Detector for HTML comment delimiters. */ static class HTMLCommentDetector implements IWordDetector { /** * @see IWordDetector#isWordStart */ public boolean isWordStart(char c) { return (c == '<' || c == '-'); } /** * @see IWordDetector#isWordPart */ public boolean isWordPart(char c) { return (c == '-' || c == '!' || c == '>'); } }; class TagRule extends SingleLineRule { /* * @see SingleLineRule */ public TagRule(IToken token) { super("<", ">", token, (char) 0); //$NON-NLS-2$ //$NON-NLS-1$ } /* * @see SingleLineRule */ public TagRule(IToken token, char escapeCharacter) { super("<", ">", token, escapeCharacter); //$NON-NLS-2$ //$NON-NLS-1$ } private IToken checkForWhitespace(ICharacterScanner scanner) { try { char c= getDocument().getChar(getTokenOffset() + 1); if (!Character.isWhitespace(c)) return fToken; } catch (BadLocationException x) { } return Token.UNDEFINED; } /* * @see PatternRule#evaluate(ICharacterScanner) */ public IToken evaluate(ICharacterScanner scanner) { IToken result= super.evaluate(scanner); if (result == fToken) return checkForWhitespace(scanner); return result; } }; 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$ // private static String[] fgTokenProperties= { // IJavaColorConstants.JAVADOC_KEYWORD, // IJavaColorConstants.JAVADOC_TAG, // IJavaColorConstants.JAVADOC_LINK, // IJavaColorConstants.JAVADOC_DEFAULT // }; public PHPDocCodeScanner(PHPColorProvider provider) { // , IPreferenceStore store) { // super(manager, store); // initialize(); createRules(provider); } public IDocument getDocument() { return fDocument; } /* * @see AbstractJavaScanner#getTokenProperties() */ // protected String[] getTokenProperties() { // return fgTokenProperties; // } /* create the rules for PHPDoc */ protected List createRules(PHPColorProvider provider) { List list= new ArrayList(); // IToken type = new Token(new TextAttribute(provider.getColor(PHPColorProvider.FUNCTION_NAME))); // IToken string = new Token(new TextAttribute(provider.getColor(PHPColorProvider.STRING))); // IToken comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.SINGLE_LINE_COMMENT))); // IToken multi_comment = new Token(new TextAttribute(provider.getColor(PHPColorProvider.MULTI_LINE_COMMENT))); // IToken other = new Token(new TextAttribute(provider.getColor(PHPColorProvider.DEFAULT))); // Add rule for tags. // Token token= getToken(IJavaColorConstants.JAVADOC_TAG); Token token = new Token(new TextAttribute(provider.getColor(PHPColorProvider.PHPDOC_TAG))); list.add(new TagRule(token)); // Add rule for HTML comments WordRule wordRule= new WordRule(new HTMLCommentDetector(), token); wordRule.addWord("", token); //$NON-NLS-1$ list.add(wordRule); // Add rule for links. token= new Token(new TextAttribute(provider.getColor(PHPColorProvider.PHPDOC_LINK))); list.add(new SingleLineRule("{@link", "}", token)); //$NON-NLS-2$ //$NON-NLS-1$ // Add generic whitespace rule. list.add(new WhitespaceRule(new PHPWhitespaceDetector())); // Add word rule for keywords. token= new Token(new TextAttribute(provider.getColor(PHPColorProvider.PHPDOC_DEFAULT))); wordRule= new WordRule(new PHPDocKeywordDetector(), token); token= new Token(new TextAttribute(provider.getColor(PHPColorProvider.PHPDOC_KEYWORD))); for (int i= 0; i < fgKeywords.length; i++) wordRule.addWord(fgKeywords[i], token); list.add(wordRule); setDefaultReturnToken( new Token(new TextAttribute(provider.getColor(PHPColorProvider.PHPDOC_DEFAULT))) ); return list; } }