/********************************************************************** 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 Klaus Hartlage - www.eclipseproject.de **********************************************************************/ package net.sourceforge.phpeclipse.phpeditor.php; import java.util.ArrayList; import java.util.List; import net.sourceforge.phpdt.internal.ui.text.AbstractJavaScanner; import net.sourceforge.phpdt.ui.text.IColorManager; import net.sourceforge.phpeclipse.IPreferenceConstants; import net.sourceforge.phpeclipse.phpeditor.PHPSyntaxRdr; import net.sourceforge.phpeclipse.phpeditor.util.PHPWhitespaceDetector; import net.sourceforge.phpeclipse.phpeditor.util.PHPWordDetector; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.rules.EndOfLineRule; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.IWordDetector; import org.eclipse.jface.text.rules.MultiLineRule; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.jface.text.rules.WordRule; /** * PHP Code Scanner */ public class PHPCodeScanner extends AbstractJavaScanner { /** * Rule to detect java operators. * * @since 3.0 */ protected class OperatorRule implements IRule { /** Java operators */ private final char[] JAVA_OPERATORS= { ';', '(', ')', '.', '=', '/', '\\', '+', '-', '*', '[', ']', '<', '>', ':', '?', '!', ',', '|', '&', '^', '%', '~', '@'}; /** Token to return for this rule */ private final IToken fToken; /** Token to return for braces */ private final IToken fTokenBraces; /** * Creates a new operator rule. * * @param token * Token to use for this rule */ public OperatorRule(IToken token, IToken tokenBraces) { fToken= token; fTokenBraces= tokenBraces; } /** * Is this character an operator character? * * @param character * Character to determine whether it is an operator character * @return true iff the character is an operator, * false otherwise. */ public boolean isOperator(char character) { for (int index= 0; index < JAVA_OPERATORS.length; index++) { if (JAVA_OPERATORS[index] == character) return true; } return false; } /* * @see org.eclipse.jface.text.rules.IRule#evaluate(org.eclipse.jface.text.rules.ICharacterScanner) */ public IToken evaluate(ICharacterScanner scanner) { int character= scanner.read(); if (character=='{' || character=='}') { return fTokenBraces; } if (isOperator((char) character)) { int lastCharacter = character; character= scanner.read(); if (!isOperator((char) character)) { scanner.unread(); return fToken; } if (lastCharacter=='<' && character=='?') { scanner.unread(); scanner.unread(); return Token.UNDEFINED; } else if (lastCharacter=='?' && character=='>') { scanner.unread(); scanner.unread(); return Token.UNDEFINED; } do { character= scanner.read(); } while (isOperator((char) character)); scanner.unread(); return fToken; } else { scanner.unread(); return Token.UNDEFINED; } } } private class PHPWordRule extends WordRule { private StringBuffer fBuffer = new StringBuffer(); public PHPWordRule(IWordDetector detector) { super(detector, Token.UNDEFINED); } public PHPWordRule(IWordDetector detector, IToken defaultToken) { super(detector, defaultToken); } public IToken evaluate(ICharacterScanner scanner) { int c = scanner.read(); boolean isVariable = false; if (c == '<') { c = scanner.read(); if (c != '?') { scanner.unread(); scanner.unread(); return Token.UNDEFINED; } else { c = scanner.read(); if (c != 'p' && c != 'P') { scanner.unread(); return getToken(IPreferenceConstants.PHP_TAG); } else { c = scanner.read(); if (c != 'h' && c != 'H') { scanner.unread(); scanner.unread(); return getToken(IPreferenceConstants.PHP_TAG); } else { c = scanner.read(); if (c != 'p' && c != 'P') { scanner.unread(); scanner.unread(); scanner.unread(); return getToken(IPreferenceConstants.PHP_TAG); } else { return getToken(IPreferenceConstants.PHP_TAG); } } } } } if (c == '?') { c = scanner.read(); if (c == '>') { return getToken(IPreferenceConstants.PHP_TAG); } scanner.unread(); scanner.unread(); return Token.UNDEFINED; } if (fDetector.isWordStart((char) c)) { if (c == '$') { isVariable = true; } if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) { fBuffer.setLength(0); do { fBuffer.append((char) c); c = scanner.read(); } while (c != ICharacterScanner.EOF && fDetector.isWordPart((char) c)); scanner.unread(); if (isVariable) { return getToken(IPreferenceConstants.PHP_VARIABLE); } IToken token = (IToken) fWords.get(fBuffer.toString()); if (token != null) return token; if (fDefaultToken.isUndefined()) unreadBuffer(scanner); return fDefaultToken; } } scanner.unread(); return Token.UNDEFINED; } } //private PHPColorProvider fColorProvider; private static String[] fgTokenProperties = { IPreferenceConstants.PHP_MULTILINE_COMMENT, IPreferenceConstants.PHP_SINGLELINE_COMMENT, IPreferenceConstants.PHP_TAG, IPreferenceConstants.PHP_KEYWORD, IPreferenceConstants.PHP_FUNCTIONNAME, IPreferenceConstants.PHP_VARIABLE, IPreferenceConstants.PHP_STRING, IPreferenceConstants.PHP_TYPE, IPreferenceConstants.PHP_CONSTANT, IPreferenceConstants.PHP_DEFAULT, IPreferenceConstants.PHP_OPERATOR, IPreferenceConstants.PHP_BRACE_OPERATOR, IPreferenceConstants.PHP_KEYWORD_RETURN}; /** * Creates a PHP code scanner */ // public PHPCodeScanner(JavaColorManager provider, IPreferenceStore store) { public PHPCodeScanner(IColorManager manager, IPreferenceStore store) { super(manager, store); initialize(); // // final IPreferenceStore store = // PHPeclipsePlugin.getDefault().getPreferenceStore(); // Color BackgroundColor = // provider.getColor(PreferenceConverter.getColor(store, // PHP_EDITOR_BACKGROUND)); // variable = // new Token( // new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_VARIABLE)), // BackgroundColor, // (store.getBoolean(PHP_VARIABLE_BOLD) ? SWT.BOLD : SWT.NONE) // + (store.getBoolean(PHP_VARIABLE_ITALIC) ? SWT.ITALIC : SWT.NONE))); // keyword = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_KEYWORD)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_KEYWORD_BOLD) ? SWT.BOLD : SWT.NONE) + // (store.getBoolean(PHP_KEYWORD_ITALIC) ? SWT.ITALIC : SWT.NONE))); // type = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_TYPE)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_TYPE_BOLD) ? SWT.BOLD : SWT.NONE) + // (store.getBoolean(PHP_TYPE_ITALIC) ? SWT.ITALIC : SWT.NONE))); // functionName = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_FUNCTIONNAME)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_FUNCTIONNAME_BOLD) ? SWT.BOLD : SWT.NONE) // + (store.getBoolean(PHP_FUNCTIONNAME_ITALIC) ? SWT.ITALIC : SWT.NONE))); // constant = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_CONSTANT)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_CONSTANT_BOLD) ? SWT.BOLD : SWT.NONE) + // (store.getBoolean(PHP_CONSTANT_ITALIC) ? SWT.ITALIC : SWT.NONE))); // string = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_STRING)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_STRING_BOLD) ? SWT.BOLD : SWT.NONE ) + // (store.getBoolean(PHP_STRING_ITALIC) ? SWT.ITALIC : SWT.NONE))); // comment = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, // PHP_SINGLELINE_COMMENT)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_SINGLELINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE ) // + (store.getBoolean(PHP_SINGLELINE_COMMENT_ITALIC) ? SWT.ITALIC : // SWT.NONE))); // multi_comment = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, // PHP_MULTILINE_COMMENT)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_MULTILINE_COMMENT_BOLD) ? SWT.BOLD : SWT.NONE) // + (store.getBoolean(PHP_MULTILINE_COMMENT_ITALIC) ? SWT.ITALIC : // SWT.NONE))); // other = // new Token(new TextAttribute( // provider.getColor(PreferenceConverter.getColor(store, PHP_DEFAULT)), // BackgroundColor, // //SWT.NONE)); // (store.getBoolean(PHP_DEFAULT_BOLD) ? SWT.BOLD : SWT.NONE) + // (store.getBoolean(PHP_DEFAULT_ITALIC) ? SWT.ITALIC : SWT.NONE))); // updateWordRules(); } /* * @see AbstractJavaScanner#getTokenProperties() */ protected String[] getTokenProperties() { return fgTokenProperties; } /* * @see AbstractJavaScanner#createRules() */ protected List createRules() { List rules = new ArrayList(); Token token = getToken(IPreferenceConstants.PHP_SINGLELINE_COMMENT); // Add rule for single line comments. rules.add(new EndOfLineRule("//", token)); //$NON-NLS-1$ rules.add(new EndOfLineRule("#", token)); //$NON-NLS-1$ // Add rule for strings and character constants. token = getToken(IPreferenceConstants.PHP_STRING); rules.add(new MultiLineRule("\"", "\"", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ rules.add(new MultiLineRule("`", "`", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ rules.add(new MultiLineRule("'", "'", token, '\\')); //$NON-NLS-2$ //$NON-NLS-1$ token = getToken(IPreferenceConstants.PHP_MULTILINE_COMMENT); rules.add(new MultiLineRule("/*", "*/", token)); //$NON-NLS-2$ //$NON-NLS-1$ // Add generic whitespace rule. rules.add(new WhitespaceRule(new PHPWhitespaceDetector())); // Add word rule for keywords, types, and constants. token = getToken(IPreferenceConstants.PHP_DEFAULT); PHPWordRule wordRule = new PHPWordRule(new PHPWordDetector(), token); Token keyword = getToken(IPreferenceConstants.PHP_KEYWORD); Token functionName = getToken(IPreferenceConstants.PHP_FUNCTIONNAME); Token type = getToken(IPreferenceConstants.PHP_TYPE); Token constant = getToken(IPreferenceConstants.PHP_CONSTANT); ArrayList buffer = PHPSyntaxRdr.getSyntaxData(); // String strbuffer = null; unused PHPElement elbuffer = null; String name; for (int i = 0; i < buffer.size(); i++) { // while ((buffer != null) // && (!buffer.isEmpty() // && ((elbuffer = (PHPElement) buffer.remove(0)) != null))) { elbuffer = (PHPElement) buffer.get(i); if (elbuffer instanceof PHPKeyword) { name = ((PHPKeyword) elbuffer).getName(); if (!name.equals("return")) { wordRule.addWord(name, keyword); } } else if (elbuffer instanceof PHPFunction) { wordRule.addWord(((PHPFunction) elbuffer).getName(), functionName); } else if (elbuffer instanceof PHPType) { wordRule.addWord(elbuffer.getName(), type); } else if (elbuffer instanceof PHPConstant) { wordRule.addWord(elbuffer.getName(), constant); } } // Add word rule for keyword 'return'. token= getToken(IPreferenceConstants.PHP_KEYWORD_RETURN); wordRule.addWord("return", token); // Add rule for operators and brackets (at the end !) rules.add(new OperatorRule(getToken(IPreferenceConstants.PHP_OPERATOR), getToken(IPreferenceConstants.PHP_BRACE_OPERATOR))); rules.add(wordRule); setDefaultReturnToken(getToken(IPreferenceConstants.PHP_DEFAULT)); return rules; } }