package application.scripting.codearea; import org.fxmisc.richtext.CodeArea; import java.util.concurrent.Executor; import java.util.regex.Matcher; import java.util.regex.Pattern; public class GroovyCodeAreaConfigurator { private static final String[] GROOVY_KEYWORDS = new String[]{ "as", "assert", "break", "case", "catch", "class", "const", "continue", "def", "default", "do", "else", "enum", "extends", "false", "finally", "for", "goto", "if", "implements", "import", "in", "instanceof", "interface", "new", "null", "package", "return", "super", "switch", "this", "throw", "throws", "trait", "true", "try", "while" }; private static final String KEYWORD_PATTERN = "\\b(" + String.join("|", GROOVY_KEYWORDS) + ")\\b"; private static final String PAREN_PATTERN = "\\(|\\)"; private static final String BRACE_PATTERN = "\\{|\\}"; private static final String BRACKET_PATTERN = "\\[|\\]"; private static final String SEMICOLON_PATTERN = "\\;"; private static final String STRING_PATTERN = "\"([^\"\\\\]|\\\\.)*\""; private static final String COMMENT_PATTERN = "//[^\n]*" + "|" + "/\\*(.|\\R)*?\\*/"; private static final Pattern PATTERN = Pattern.compile( "(?<KEYWORD>" + KEYWORD_PATTERN + ")" + "|(?<PAREN>" + PAREN_PATTERN + ")" + "|(?<BRACE>" + BRACE_PATTERN + ")" + "|(?<BRACKET>" + BRACKET_PATTERN + ")" + "|(?<SEMICOLON>" + SEMICOLON_PATTERN + ")" + "|(?<STRING>" + STRING_PATTERN + ")" + "|(?<COMMENT>" + COMMENT_PATTERN + ")" ); public static void configure(CodeArea codeArea, Executor executor) { CodeAreaConfigurator.configureCodeArea(codeArea, PATTERN, GroovyCodeAreaConfigurator::getStyleClass, executor); } private static String getStyleClass(Matcher matcher) { return matcher.group("KEYWORD") != null ? "groovy_keyword" : matcher.group("PAREN") != null ? "groovy_paren" : matcher.group("BRACE") != null ? "groovy_brace" : matcher.group("BRACKET") != null ? "groovy_bracket" : matcher.group("SEMICOLON") != null ? "groovy_semicolon" : matcher.group("STRING") != null ? "groovy_string" : matcher.group("COMMENT") != null ? "groovy_comment" : null; } }