Skip to content

Commit 82ca917

Browse files
committed
add: 高亮
1 parent 3f4558b commit 82ca917

5 files changed

Lines changed: 188 additions & 8 deletions

File tree

init.gradle

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
allprojects {
2+
repositories {
3+
// 使用腾讯云镜像加速,速度更快
4+
maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
5+
maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-central/' }
6+
maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/gradle-plugins/' }
7+
// 备用阿里云镜像
8+
maven { url 'https://maven.aliyun.com/repository/public' }
9+
maven { url 'https://maven.aliyun.com/repository/central' }
10+
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
11+
maven { url 'https://maven.aliyun.com/repository/google' }
12+
mavenCentral()
13+
}
14+
}

src/main/kotlin/com/company/plugin/highlighting/ZyLexer.kt

Lines changed: 139 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,22 @@ class ZyLexer : LexerBase() {
105105
}
106106
tokenType = ZyTokenTypes.NUMBER
107107
}
108+
currentChar == '$' -> {
109+
// PHP 变量 - 包含 $ 符号本身
110+
tokenEnd++
111+
while (tokenEnd < bufferEnd && (buffer!![tokenEnd].isLetterOrDigit() || buffer!![tokenEnd] == '_')) {
112+
tokenEnd++
113+
}
114+
tokenType = ZyTokenTypes.PHP_VARIABLE
115+
}
108116
currentChar.isLetter() || currentChar == '_' -> {
109117
// 标识符或关键字
110118
tokenEnd++
111119
while (tokenEnd < bufferEnd && (buffer!![tokenEnd].isLetterOrDigit() || buffer!![tokenEnd] == '_')) {
112120
tokenEnd++
113121
}
114122
val text = buffer!!.subSequence(tokenStart, tokenEnd).toString()
115-
tokenType = if (isKeyword(text)) ZyTokenTypes.KEYWORD else ZyTokenTypes.IDENTIFIER
123+
tokenType = getTokenTypeForText(text)
116124
}
117125
else -> {
118126
// 其他字符
@@ -123,17 +131,141 @@ class ZyLexer : LexerBase() {
123131
}
124132

125133
/**
126-
* 检查文本是否为关键字
134+
* 根据文本内容确定标记类型
127135
* @param text 要检查的文本
128-
* @return 如果是关键字返回 true,否则返回 false
136+
* @return 对应的标记类型
129137
*/
130-
private fun isKeyword(text: String): Boolean {
131-
// ZY 语言支持的关键字列表
132-
val keywords = setOf(
138+
private fun getTokenTypeForText(text: String): IElementType {
139+
return when {
140+
isZyKeyword(text) -> ZyTokenTypes.KEYWORD
141+
isPhpKeyword(text) -> ZyTokenTypes.PHP_KEYWORD
142+
isPhpFunction(text) -> ZyTokenTypes.PHP_FUNCTION
143+
isPhpConstant(text) -> ZyTokenTypes.PHP_CONSTANT
144+
else -> ZyTokenTypes.IDENTIFIER
145+
}
146+
}
147+
148+
/**
149+
* 检查文本是否为 ZY 语言关键字
150+
* @param text 要检查的文本
151+
* @return 如果是 ZY 关键字返回 true,否则返回 false
152+
*/
153+
private fun isZyKeyword(text: String): Boolean {
154+
val zyKeywords = setOf(
133155
"function", "if", "else", "for", "while", "return", "var", "let", "const",
134156
"true", "false", "null", "undefined", "import", "export", "class", "interface"
135157
)
136-
return keywords.contains(text)
158+
return zyKeywords.contains(text)
159+
}
160+
161+
/**
162+
* 检查文本是否为 PHP 关键字
163+
* @param text 要检查的文本
164+
* @return 如果是 PHP 关键字返回 true,否则返回 false
165+
*/
166+
private fun isPhpKeyword(text: String): Boolean {
167+
val phpKeywords = setOf(
168+
// PHP 控制结构
169+
"if", "else", "elseif", "endif", "while", "endwhile", "for", "foreach", "endforeach",
170+
"do", "switch", "case", "default", "break", "continue", "goto",
171+
172+
// PHP 函数和类
173+
"function", "class", "interface", "trait", "namespace", "use", "as",
174+
"public", "private", "protected", "static", "abstract", "final",
175+
"extends", "implements", "new", "clone", "instanceof",
176+
177+
// PHP 变量和常量
178+
"global", "static", "const", "define", "defined",
179+
180+
// PHP 异常处理
181+
"try", "catch", "finally", "throw",
182+
183+
// PHP 包含和引用
184+
"include", "include_once", "require", "require_once",
185+
186+
// PHP 其他关键字
187+
"return", "yield", "echo", "print", "print_r", "var_dump",
188+
"isset", "empty", "unset", "die", "exit",
189+
190+
// PHP 类型声明
191+
"array", "string", "int", "float", "bool", "object", "mixed", "void",
192+
"callable", "iterable", "resource", "null", "false", "true",
193+
194+
// PHP 魔术方法
195+
"__construct", "__destruct", "__call", "__callStatic", "__get", "__set",
196+
"__isset", "__unset", "__sleep", "__wakeup", "__toString", "__invoke",
197+
"__set_state", "__clone", "__debugInfo"
198+
)
199+
return phpKeywords.contains(text)
200+
}
201+
202+
/**
203+
* 检查文本是否为 PHP 内置函数
204+
* @param text 要检查的文本
205+
* @return 如果是 PHP 函数返回 true,否则返回 false
206+
*/
207+
private fun isPhpFunction(text: String): Boolean {
208+
val phpFunctions = setOf(
209+
// 字符串函数
210+
"strlen", "strpos", "str_replace", "substr", "trim", "ltrim", "rtrim",
211+
"strtolower", "strtoupper", "ucfirst", "ucwords", "str_split", "explode", "implode",
212+
"sprintf", "printf", "htmlspecialchars", "htmlentities", "strip_tags",
213+
214+
// 数组函数
215+
"array", "count", "sizeof", "array_push", "array_pop", "array_shift", "array_unshift",
216+
"array_merge", "array_slice", "array_splice", "array_keys", "array_values",
217+
"array_search", "in_array", "array_unique", "array_reverse", "sort", "rsort",
218+
"asort", "arsort", "ksort", "krsort", "usort", "uasort", "uksort",
219+
220+
// 文件系统函数
221+
"file_exists", "is_file", "is_dir", "file_get_contents", "file_put_contents",
222+
"fopen", "fclose", "fread", "fwrite", "fgets", "fgetc", "feof", "fseek", "ftell",
223+
"copy", "move_uploaded_file", "unlink", "mkdir", "rmdir", "chmod", "chown",
224+
225+
// 数学函数
226+
"abs", "ceil", "floor", "round", "min", "max", "rand", "mt_rand", "pi",
227+
"pow", "sqrt", "sin", "cos", "tan", "asin", "acos", "atan", "log", "exp",
228+
229+
// 日期时间函数
230+
"date", "time", "strtotime", "mktime", "getdate", "gmdate", "microtime",
231+
232+
// 数据库函数
233+
"mysql_connect", "mysql_query", "mysql_fetch_array", "mysql_fetch_assoc",
234+
"mysqli_connect", "mysqli_query", "mysqli_fetch_array", "mysqli_fetch_assoc",
235+
"pdo", "PDO",
236+
237+
// 其他常用函数
238+
"json_encode", "json_decode", "serialize", "unserialize", "var_dump", "print_r",
239+
"gettype", "is_array", "is_string", "is_numeric", "is_null", "is_bool",
240+
"filter_var", "filter_input", "preg_match", "preg_replace", "preg_split"
241+
)
242+
return phpFunctions.contains(text)
243+
}
244+
245+
/**
246+
* 检查文本是否为 PHP 常量
247+
* @param text 要检查的文本
248+
* @return 如果是 PHP 常量返回 true,否则返回 false
249+
*/
250+
private fun isPhpConstant(text: String): Boolean {
251+
val phpConstants = setOf(
252+
// PHP 预定义常量
253+
"PHP_VERSION", "PHP_OS", "PHP_EOL", "PHP_INT_MAX", "PHP_INT_MIN",
254+
"PHP_FLOAT_MAX", "PHP_FLOAT_MIN", "PHP_SAPI", "PHP_BINARY",
255+
256+
// 错误级别常量
257+
"E_ERROR", "E_WARNING", "E_PARSE", "E_NOTICE", "E_CORE_ERROR", "E_CORE_WARNING",
258+
"E_COMPILE_ERROR", "E_COMPILE_WARNING", "E_USER_ERROR", "E_USER_WARNING",
259+
"E_USER_NOTICE", "E_STRICT", "E_RECOVERABLE_ERROR", "E_DEPRECATED", "E_USER_DEPRECATED",
260+
"E_ALL",
261+
262+
// 文件系统常量
263+
"DIRECTORY_SEPARATOR", "PATH_SEPARATOR", "FILE_SEPARATOR",
264+
265+
// 其他常量
266+
"TRUE", "FALSE", "NULL", "M_PI", "M_E", "M_LOG2E", "M_LOG10E", "M_LN2", "M_LN10"
267+
)
268+
return phpConstants.contains(text)
137269
}
138270

139271
override fun getBufferSequence(): CharSequence = buffer!!

src/main/kotlin/com/company/plugin/highlighting/ZySyntaxHighlighter.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,20 @@ class ZySyntaxHighlighter : SyntaxHighlighterBase() {
1717

1818
override fun getTokenHighlights(tokenType: IElementType): Array<TextAttributesKey> {
1919
return when (tokenType) {
20+
// 通用标记类型
2021
ZyTokenTypes.KEYWORD -> arrayOf(ZySyntaxHighlighterFactory.KEYWORD)
2122
ZyTokenTypes.STRING -> arrayOf(ZySyntaxHighlighterFactory.STRING)
2223
ZyTokenTypes.NUMBER -> arrayOf(ZySyntaxHighlighterFactory.NUMBER)
2324
ZyTokenTypes.COMMENT -> arrayOf(ZySyntaxHighlighterFactory.COMMENT)
2425
ZyTokenTypes.IDENTIFIER -> arrayOf(ZySyntaxHighlighterFactory.IDENTIFIER)
2526
ZyTokenTypes.OPERATOR -> arrayOf(ZySyntaxHighlighterFactory.OPERATOR)
27+
28+
// PHP 特定标记类型
29+
ZyTokenTypes.PHP_KEYWORD -> arrayOf(ZySyntaxHighlighterFactory.PHP_KEYWORD)
30+
ZyTokenTypes.PHP_FUNCTION -> arrayOf(ZySyntaxHighlighterFactory.PHP_FUNCTION)
31+
ZyTokenTypes.PHP_VARIABLE -> arrayOf(ZySyntaxHighlighterFactory.PHP_VARIABLE)
32+
ZyTokenTypes.PHP_CONSTANT -> arrayOf(ZySyntaxHighlighterFactory.PHP_CONSTANT)
33+
2634
else -> emptyArray()
2735
}
2836
}

src/main/kotlin/com/company/plugin/highlighting/ZySyntaxHighlighterFactory.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class ZySyntaxHighlighterFactory : SyntaxHighlighterFactory() {
1818
}
1919

2020
companion object {
21-
// 语法高亮属性键
21+
// 通用语法高亮属性键
2222
// 映射到默认颜色以确保即使未自定义配色也有可见高亮
2323
val KEYWORD = TextAttributesKey.createTextAttributesKey(
2424
"ZY_KEYWORD",
@@ -44,5 +44,23 @@ class ZySyntaxHighlighterFactory : SyntaxHighlighterFactory() {
4444
"ZY_OPERATOR",
4545
DefaultLanguageHighlighterColors.OPERATION_SIGN
4646
)
47+
48+
// PHP 特定语法高亮属性键
49+
val PHP_KEYWORD = TextAttributesKey.createTextAttributesKey(
50+
"ZY_PHP_KEYWORD",
51+
DefaultLanguageHighlighterColors.KEYWORD
52+
)
53+
val PHP_FUNCTION = TextAttributesKey.createTextAttributesKey(
54+
"ZY_PHP_FUNCTION",
55+
DefaultLanguageHighlighterColors.FUNCTION_DECLARATION
56+
)
57+
val PHP_VARIABLE = TextAttributesKey.createTextAttributesKey(
58+
"ZY_PHP_VARIABLE",
59+
DefaultLanguageHighlighterColors.CONSTANT
60+
)
61+
val PHP_CONSTANT = TextAttributesKey.createTextAttributesKey(
62+
"ZY_PHP_CONSTANT",
63+
DefaultLanguageHighlighterColors.CONSTANT
64+
)
4765
}
4866
}

src/main/kotlin/com/company/plugin/highlighting/ZyTokenTypes.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,23 @@ import com.intellij.psi.tree.IElementType
66
/**
77
* ZY 语言标记类型
88
* 基于 TextMate 语法文件 origami.tmLanguage.json
9+
* 支持 ZY 语言和 PHP 关键字
910
*/
1011
class ZyTokenTypes {
1112

1213
companion object {
14+
// 通用标记类型
1315
val KEYWORD = IElementType("ZY_KEYWORD", ZyLanguage)
1416
val STRING = IElementType("ZY_STRING", ZyLanguage)
1517
val NUMBER = IElementType("ZY_NUMBER", ZyLanguage)
1618
val COMMENT = IElementType("ZY_COMMENT", ZyLanguage)
1719
val IDENTIFIER = IElementType("ZY_IDENTIFIER", ZyLanguage)
1820
val OPERATOR = IElementType("ZY_OPERATOR", ZyLanguage)
21+
22+
// PHP 特定标记类型
23+
val PHP_KEYWORD = IElementType("ZY_PHP_KEYWORD", ZyLanguage)
24+
val PHP_FUNCTION = IElementType("ZY_PHP_FUNCTION", ZyLanguage)
25+
val PHP_VARIABLE = IElementType("ZY_PHP_VARIABLE", ZyLanguage)
26+
val PHP_CONSTANT = IElementType("ZY_PHP_CONSTANT", ZyLanguage)
1927
}
2028
}

0 commit comments

Comments
 (0)