package com.intellij.lang.javascript.colors.page; import com.intellij.lang.javascript.JSBundle; import com.intellij.lang.javascript.JavaScriptSupportLoader; import com.intellij.lang.javascript.highlighting.ECMAL4Highlighter; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory; import com.intellij.openapi.options.colors.AttributesDescriptor; import com.intellij.openapi.options.colors.ColorDescriptor; import com.intellij.openapi.options.colors.ColorSettingsPage; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.HashMap; import java.util.Map; /** * @author Rustam Vishnyakov */ public class ActionScriptColorsAndFontsPage implements ColorSettingsPage { private static final AttributesDescriptor[] ATTRS = { new AttributesDescriptor(JSBundle.message("javascript.keyword"), ECMAL4Highlighter.ECMAL4_KEYWORD), new AttributesDescriptor(JSBundle.message("javascript.metadata"), ECMAL4Highlighter.ECMAL4_METADATA), new AttributesDescriptor(JSBundle.message("javascript.string"), ECMAL4Highlighter.ECMAL4_STRING), new AttributesDescriptor(JSBundle.message("javascript.valid.string.escape"), ECMAL4Highlighter.ECMAL4_VALID_STRING_ESCAPE), new AttributesDescriptor(JSBundle.message("javascript.invalid.string.escape"), ECMAL4Highlighter.ECMAL4_INVALID_STRING_ESCAPE), new AttributesDescriptor(JSBundle.message("javascript.number"), ECMAL4Highlighter.ECMAL4_NUMBER), new AttributesDescriptor(JSBundle.message("javascript.regexp"), ECMAL4Highlighter.ECMAL4_REGEXP), new AttributesDescriptor(JSBundle.message("javascript.linecomment"), ECMAL4Highlighter.ECMAL4_LINE_COMMENT), new AttributesDescriptor(JSBundle.message("javascript.blockcomment"), ECMAL4Highlighter.ECMAL4_BLOCK_COMMENT), new AttributesDescriptor(JSBundle.message("javascript.doccomment"), ECMAL4Highlighter.ECMAL4_DOC_COMMENT), new AttributesDescriptor(JSBundle.message("javascript.operation"), ECMAL4Highlighter.ECMAL4_OPERATION_SIGN), new AttributesDescriptor(JSBundle.message("javascript.parens"), ECMAL4Highlighter.ECMAL4_PARENTHS), new AttributesDescriptor(JSBundle.message("javascript.brackets"), ECMAL4Highlighter.ECMAL4_BRACKETS), new AttributesDescriptor(JSBundle.message("javascript.braces"), ECMAL4Highlighter.ECMAL4_BRACES), new AttributesDescriptor(JSBundle.message("javascript.comma"), ECMAL4Highlighter.ECMAL4_COMMA), new AttributesDescriptor(JSBundle.message("javascript.dot"), ECMAL4Highlighter.ECMAL4_DOT), new AttributesDescriptor(JSBundle.message("javascript.semicolon"), ECMAL4Highlighter.ECMAL4_SEMICOLON), new AttributesDescriptor(JSBundle.message("javascript.badcharacter"), ECMAL4Highlighter.ECMAL4_BAD_CHARACTER), new AttributesDescriptor(JSBundle.message("javascript.docmarkup"), ECMAL4Highlighter.ECMAL4_DOC_MARKUP), new AttributesDescriptor(JSBundle.message("javascript.doctag"), ECMAL4Highlighter.ECMAL4_DOC_TAG), new AttributesDescriptor(JSBundle.message("javascript.parameter"), ECMAL4Highlighter.ECMAL4_PARAMETER), new AttributesDescriptor(JSBundle.message("javascript.local.variable"), ECMAL4Highlighter.ECMAL4_LOCAL_VARIABLE), new AttributesDescriptor(JSBundle.message("javascript.global.variable"), ECMAL4Highlighter.ECMAL4_GLOBAL_VARIABLE), new AttributesDescriptor(JSBundle.message("javascript.global.function"), ECMAL4Highlighter.ECMAL4_GLOBAL_FUNCTION), new AttributesDescriptor(JSBundle.message("javascript.class"), ECMAL4Highlighter.ECMAL4_CLASS), new AttributesDescriptor(JSBundle.message("javascript.interface"), ECMAL4Highlighter.ECMAL4_INTERFACE), new AttributesDescriptor(JSBundle.message("javascript.instance.member.function"), ECMAL4Highlighter.ECMAL4_INSTANCE_MEMBER_FUNCTION), new AttributesDescriptor(JSBundle.message("javascript.instance.member.variable"), ECMAL4Highlighter.ECMAL4_INSTANCE_MEMBER_VARIABLE), new AttributesDescriptor(JSBundle.message("javascript.static.member.function"), ECMAL4Highlighter.ECMAL4_STATIC_MEMBER_FUNCTION), new AttributesDescriptor(JSBundle.message("javascript.static.member.variable"), ECMAL4Highlighter.ECMAL4_STATIC_MEMBER_VARIABLE) }; @NonNls private static final Map<String, TextAttributesKey> ADDITIONAL_HIGHLIGHT_DESCRIPTORS = new HashMap<>(); static { ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("meta", ECMAL4Highlighter.ECMAL4_METADATA); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("keyword", ECMAL4Highlighter.ECMAL4_KEYWORD); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("string", ECMAL4Highlighter.ECMAL4_STRING); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("valid_escape", ECMAL4Highlighter.ECMAL4_VALID_STRING_ESCAPE); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("invalid_escape", ECMAL4Highlighter.ECMAL4_INVALID_STRING_ESCAPE); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("number", ECMAL4Highlighter.ECMAL4_NUMBER); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("regexp", ECMAL4Highlighter.ECMAL4_REGEXP); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("line_comment", ECMAL4Highlighter.ECMAL4_LINE_COMMENT); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("block_comment", ECMAL4Highlighter.ECMAL4_BLOCK_COMMENT); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("doc_comment", ECMAL4Highlighter.ECMAL4_DOC_COMMENT); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("operation", ECMAL4Highlighter.ECMAL4_OPERATION_SIGN); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("parentheses", ECMAL4Highlighter.ECMAL4_PARENTHS); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("brackets", ECMAL4Highlighter.ECMAL4_BRACKETS); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("braces", ECMAL4Highlighter.ECMAL4_BRACES); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("comma", ECMAL4Highlighter.ECMAL4_COMMA); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("dot", ECMAL4Highlighter.ECMAL4_DOT); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("semicolon", ECMAL4Highlighter.ECMAL4_SEMICOLON); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("bad_char", ECMAL4Highlighter.ECMAL4_BAD_CHARACTER); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("doc_markup", ECMAL4Highlighter.ECMAL4_DOC_MARKUP); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("doc_tag", ECMAL4Highlighter.ECMAL4_DOC_TAG); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("parameter", ECMAL4Highlighter.ECMAL4_PARAMETER); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("local_var", ECMAL4Highlighter.ECMAL4_LOCAL_VARIABLE); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("global_var", ECMAL4Highlighter.ECMAL4_GLOBAL_VARIABLE); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("global_func", ECMAL4Highlighter.ECMAL4_GLOBAL_FUNCTION); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("instance_var", ECMAL4Highlighter.ECMAL4_INSTANCE_MEMBER_VARIABLE); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("instance_func", ECMAL4Highlighter.ECMAL4_INSTANCE_MEMBER_FUNCTION); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("static_func", ECMAL4Highlighter.ECMAL4_STATIC_MEMBER_FUNCTION); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("static_var", ECMAL4Highlighter.ECMAL4_STATIC_MEMBER_VARIABLE); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("class", ECMAL4Highlighter.ECMAL4_CLASS); ADDITIONAL_HIGHLIGHT_DESCRIPTORS.put("interface", ECMAL4Highlighter.ECMAL4_INTERFACE); } private static final String DEMO_TEXT = "var globalVar : int = 123;\n" + "\n" + "function foo() : int {return 0;}\n" + "\n" + "package {\n" + "import mx.messaging.messages.IMessage;\n" + "\n" + "public class HighlightingSample implements IMessage {\n" + " public var field : int;\n" + " public static var shared : String;\n" + "\n" + " [Meta(name=\"abc\", type=\"def\")]\n" + " public function HighlightingSample() {\n" + " var strings : Array = [\"One\", \"Two\"];\n" + " // Line comment\n" + " strings = \"\\u1111\\z\\n\\u22\";\n" + " /* Block comment */\n" + " var n : int = getField();\n" + " #\n" + " }\n" + "\n" + " /**\n" + " * @param url parameter <i>comment</i>\n" + " */\n" + " public static function adjustUrl(url : String) : String {\n" + " return url.replace(/^\\s*(.*)/, \"$1\");\n" + " }\n" + "\n" + " public function getField() : int {\n" + " adjustUrl(\"\");\n" + " return field;\n" + " }\n" + "}\n" + "}"; @NotNull @Override public String getDisplayName() { return "ActionScript"; } @Override public Icon getIcon() { return JavaScriptSupportLoader.JAVASCRIPT.getIcon(); } @NotNull @Override public AttributesDescriptor[] getAttributeDescriptors() { return ATTRS; } @NotNull @Override public ColorDescriptor[] getColorDescriptors() { return ColorDescriptor.EMPTY_ARRAY; } @NotNull @Override public SyntaxHighlighter getHighlighter() { final SyntaxHighlighter highlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(JavaScriptSupportLoader.JAVASCRIPT, null, null); assert highlighter != null; return highlighter; } @NotNull @Override public String getDemoText() { return DEMO_TEXT. replace("[Meta(name=\"abc\", type=\"def\")]", "_META_"). replaceAll("(public|class|function|package|return|var|static|import)", "<keyword>$1</keyword>"). replaceAll("([\\w\\.]*IMessage)", "<interface>$1</interface>"). replace("(url :", "(<parameter>url</parameter> :"). replace("url.", "<parameter>url</parameter>."). replaceAll("(\".*\")", "<string>$1</string>"). replaceAll("(\\\\u1111|\\\\n)", "<valid_escape>$1</valid_escape>"). replaceAll("(\\\\z|\\\\u22)", "<invalid_escape>$1</invalid_escape>"). replaceAll("(\\s)([0-9]+)", "$1<number>$2</number>"). replaceAll("\\((/.*/),", "(<regexp>$1</regexp>,"). replaceAll("(//.*)\\n", "<line_comment>$1</line_comment>\n"). replaceAll("(/\\* .*\\*/)", "<block_comment>$1</block_comment>"). replaceAll("(/\\*\\*(\\s*\\*.*\\n)*)", "<doc_comment>$1</doc_comment>"). replace(" = ", " <operation>=</operation> "). replace(" : ", " <operation>:</operation> "). replaceAll("\\)([\\s;])", "<parentheses>)</parentheses>$1"). replaceAll("([.\\s]\\w+)\\(", "$1<parentheses>(</parentheses>"). replace("[", "<brackets>[</brackets>"). replace("]", "<brackets>]</brackets>"). replace("{", "<braces>{</braces>"). replace("}", "<braces>}</braces>"). replace(",", "<comma>,</comma>"). replaceAll("(\\w)\\.(\\w)", "$1<dot>.</dot>$2"). replace(";", "<semicolon>;</semicolon>"). replace("#", "<bad_char>#</bad_char>"). replace("@param", "<doc_tag>@param</doc_tag>"). replace("<i>", "<doc_markup><i></doc_markup>"). replace("</i>", "<doc_markup></i></doc_markup>"). replace("field", "<instance_var>field</instance_var>"). replace("strings", "<local_var>strings</local_var>"). replace("globalVar", "<global_var>globalVar</global_var>"). replace("foo", "<global_func>foo</global_func>"). replace("getField", "<instance_func>getField</instance_func>"). replace("replace", "<instance_func>replace</instance_func>"). replace("adjustUrl", "<static_func>adjustUrl</static_func>"). replace("shared", "<static_var>shared</static_var>"). replace(" HighlightingSample ", " <class>HighlightingSample</class> "). replace("String", "<class>String</class>"). replace("Array", "<class>Array</class>"). replace("_META_", "<meta>[Meta(name=\"abc\", type=\"def\")]</meta>"); } @Override public Map<String, TextAttributesKey> getAdditionalHighlightingTagToDescriptorMap() { return ADDITIONAL_HIGHLIGHT_DESCRIPTORS; } }