/*
* $Id$
*
* Copyright (c) 2004-2005 by the TeXlapse Team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package net.sourceforge.texlipse.bibeditor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.Assert;
import org.eclipse.jface.text.TextAttribute;
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.IWhitespaceDetector;
import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.NumberRule;
import org.eclipse.jface.text.rules.RuleBasedScanner;
import org.eclipse.jface.text.rules.Token;
import org.eclipse.jface.text.rules.WhitespaceRule;
import org.eclipse.jface.text.rules.WordRule;
/**
* Syntax highlighting scanner for BibTeX-entries. This scanner
* is used to scan the syntax inside entries.
*
* @author Oskar Ojala
*/
public class BibEntryScanner extends RuleBasedScanner {
/**
* Detects white space.
*
* @author Oskar Ojala
*/
private class WhitespaceDetector implements IWhitespaceDetector {
/* (non-Javadoc)
* @see org.eclipse.jface.text.rules.IWhitespaceDetector#isWhitespace(char)
*/
public boolean isWhitespace(char character) {
return Character.isWhitespace(character);
}
}
/**
* Detects BibTeX keywords (ie. [a-ZA-Z]\w*).
*
* @author Oskar Ojala
*/
public class BibWordDetector implements IWordDetector {
/* (non-Javadoc)
* @see org.eclipse.jface.text.rules.IWordDetector#isWordPart(char)
*/
public boolean isWordPart(char character) {
return Character.isLetterOrDigit(character);
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.rules.IWordDetector#isWordStart(char)
*/
public boolean isWordStart(char character) {
return Character.isLetter(character);
}
}
/**
* Detects BibTeX separator chars (such as = and ,).
*
* @author Oskar Ojala
*/
public class BibSeparatorRule implements IRule {
/** The token to be returned when this rule is successful */
protected IToken fToken;
/**
* Creates a rule which will return the specified
* token when a BibTeX-entry special character is encountered
*
* @param token the token to be returned
*/
public BibSeparatorRule(IToken token) {
Assert.isNotNull(token);
fToken = token;
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.rules.IRule#evaluate(org.eclipse.jface.text.rules.ICharacterScanner)
*/
public IToken evaluate(ICharacterScanner scanner) {
int c = scanner.read();
if (((char) c) == '=' || ((char) c) == '#' || ((char) c) == ','
|| ((char) c) == '{' || ((char) c) == '}') {
return fToken;
} else if (((char) c) == '\\') {
c = scanner.read();
if (((char) c) == '"')
return fToken;
scanner.unread();
}
scanner.unread();
return Token.UNDEFINED;
}
}
/**
* Creates a BibTeX entry scanner
*/
public BibEntryScanner(BibColorProvider provider) {
IToken keyword = new Token(new TextAttribute(provider
.getColor(BibColorProvider.KEYWORD)));
IToken type = new Token(new TextAttribute(provider
.getColor(BibColorProvider.TYPE)));
IToken string = new Token(new TextAttribute(provider
.getColor(BibColorProvider.STRING)));
IToken comment = new Token(new TextAttribute(provider
.getColor(BibColorProvider.SINGLE_LINE_COMMENT)));
IToken other = new Token(new TextAttribute(provider
.getColor(BibColorProvider.DEFAULT)));
List rules = new ArrayList();
// Add rule for single line comments.
// Not supported inside entries.
// rules.add(new EndOfLineRule("%", comment));
rules.add(new BibSeparatorRule(keyword));
// Add rule for strings and character constants.
// Note that escaping is not possible in BibTeX.
// rules.add(new MultiLineRule("\"", "\"", string));
// rules.add(new MultiLineRule("\"", "\"", string, (char) 0, true));
rules.add(new BibStringRule(string));
// this must be preceded by # or =
// rules.add(new BibBraceRule(false, string));
// Add generic whitespace rule.
rules.add(new WhitespaceRule(new WhitespaceDetector()));
// Add word rule for keywords, types, and constants.
WordRule wordRule = new WordRule(new BibWordDetector(), type);
// wordRule.addWord("author", keyword);
rules.add(wordRule);
rules.add(new NumberRule(string));
IRule[] result= new IRule[rules.size()];
rules.toArray(result);
setRules(result);
}
}