package org.basex.gui.layout;
import static org.basex.data.DataText.*;
import java.awt.Color;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashSet;
import org.basex.gui.GUIConstants;
import org.basex.query.QueryText;
import org.basex.query.func.Function;
import org.basex.util.Util;
import org.basex.util.XMLToken;
/**
* This class defines syntax highlighting for XQuery files.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class XQuerySyntax extends BaseXSyntax {
/** Error color. */
private static final HashSet<String> KEYS = new HashSet<String>();
/** Error color. */
private static final HashSet<String> FUNC = new HashSet<String>();
/** Variable color. */
private static final Color VAR = new Color(0, 160, 0);
/** Keyword. */
private static final Color KEY = new Color(0, 144, 144);
/** Keyword. */
private static final Color FUNS = new Color(160, 0, 160);
/** Comment. */
private int comment;
/** Last quote. */
private int quote;
/** Variable flag. */
private boolean var;
// initialize xquery keys
static {
try {
for(final Field f : QueryText.class.getFields()) {
if(f.getName().equals("IGNORE")) break;
final String s = (String) f.get(null);
Collections.addAll(KEYS, s.split("-"));
}
for(final Function f : Function.values()) {
final String s = f.toString();
Collections.addAll(FUNC, s.substring(0, s.indexOf('(')).split("-"));
}
} catch(final Exception ex) {
Util.stack(ex);
}
}
@Override
public void init() {
quote = 0;
var = false;
comment = 0;
}
@Override
public Color getColor(final BaseXTextTokens text) {
final int ch = text.curr();
// opened quote
if(quote != 0) {
if(ch == quote) quote = 0;
return GUIConstants.RED;
}
// comment
if(comment == 0 && ch == '(') {
comment++;
} else if(comment == 1) {
comment = ch == ':' ? 2 : 0;
} else if(comment == 2 && ch == ':') {
comment++;
} else if(comment == 3 && ch != ':') {
comment = ch == ')' ? 0 : 2;
}
if(comment != 0) return KEY;
// quotes
if(quote == 0 && (ch == '"' || ch == '\'')) {
quote = ch;
return GUIConstants.RED;
}
// variables
if(ch == '$') {
var = true;
return VAR;
}
if(var) {
var = XMLToken.isChar(ch);
return VAR;
}
// special characters
final String word = text.nextWord();
if(KEYS.contains(word)) return GUIConstants.BLUE;
// special characters
if(FUNC.contains(word)) return FUNS;
// special characters
if(!XMLToken.isNCChar(ch)) return KEY;
// letters and numbers
return Color.black;
}
@Override
public byte[] commentOpen() {
return XQCOMM_O;
}
@Override
public byte[] commentEnd() {
return XQCOMM_C;
}
}