package org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.highlighter; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RascalHighlighter implements IHighlighter { private static String keywordPattern; private String openKeyword = "<strong>"; private String closeKeyword = "</strong>"; private String openComment = "<emphasis>"; private String closeComment = "</emphasis>"; static { String[] keywords = { "o", "syntax", "keyword", "lexical", "int", "break", "continue", "rat", "true", "bag", "num", "node", "finally", "private", "real", "list", "fail", "filter", "if", "tag", "extend", "append", "rel", "lrel", "void", "non-assoc", "assoc", "test", "anno", "layout", "data", "join", "it", "bracket", "in", "import", "false", "all", "dynamic", "solve", "type", "try", "catch", "notin", "else", "insert", "switch", "return", "case", "while", "str", "throws", "visit", "tuple", "for", "assert", "loc", "default", "map", "alias", "any", "module", "mod", "bool", "public", "one", "throw", "set", "start", "datetime", "value", "loc", "node", "num", "type", "bag", "int", "rat", "rel", "lrel", "real", "tuple", "str", "bool", "void", "datetime", "set", "map", "list" }; StringBuilder sb = new StringBuilder(); sb.append("([/][/][^\n\r]*)"); // single line comment sb.append("|(?s)(/\\*.*?\\*/)"); // multi-line comment sb.append("|(?s)(\"(?:\\\\[^\"]|\\\\\"|.)*?\")"); // string literal for (String kw : keywords) { sb.append("|"); sb.append("(").append(kw).append(")"); } keywordPattern = sb.toString(); } public RascalHighlighter setKeywordMarkup(String open, String close){ openKeyword = open; closeKeyword = close; return this; } public RascalHighlighter setCommentMarkup(String open, String close){ openComment = open; closeComment = close; return this; } public String highlight(String code) { Pattern pat = Pattern.compile(keywordPattern); Matcher matcher = pat.matcher(code); StringBuffer sb = new StringBuffer(); while (matcher.find()) { String matched = matcher.group(); if (matched.startsWith("//")) { matched = matched.replaceAll("[\n\r]", ""); matcher.appendReplacement(sb, openComment + matched + closeComment); } else if (matched.startsWith("/*")) { matcher.appendReplacement(sb, openComment + matched + closeComment); } else { matcher.appendReplacement(sb, openKeyword + matched + closeKeyword); } } matcher.appendTail(sb); String highlightedCode = sb.toString(); return highlightedCode; } }