From 5108174145ab2874326833669d2ab45e73cbb219 Mon Sep 17 00:00:00 2001 From: Joshua Raphael Date: Wed, 3 Sep 2025 22:28:10 -0700 Subject: [PATCH] improve hljs auto language detection --- rascript.js | 130 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 114 insertions(+), 16 deletions(-) diff --git a/rascript.js b/rascript.js index 5a378f7..4e8b1f9 100644 --- a/rascript.js +++ b/rascript.js @@ -5,10 +5,97 @@ Description: Syntax grammar for RAScript, a RetroAchievements.org DSL Category: syntax Version: */ + +function ImportantWordRegex() { + let words = [ + "byte", + "word", + "tbyte", + "dword", + "bit0", + "bit1", + "bit2", + "bit3", + "bit4", + "bit5", + "bit6", + "bit7", + "bit", + "low4", + "high4", + "bitcount", + "word_be", + "tbyte_be", + "dword_be", + "float", + "float_be", + "mbf32", + "mbf32_le", + "double32", + "double32_be", + "prev", + "prior", + "bcd", + "identity_transform", + "ascii_string_equals", + "unicode_string_equals", + "repeated", + "once", + "tally", + "deduct", + "never", + "unless", + "measured", + "trigger_when", + "disable_when", + "always_true", + "always_false", + "format", + "substring", + "length", + "range", + "array_push", + "array_pop", + "array_map", + "array_contains", + "array_reduce", + "array_filter", + "dictionary_contains_key", + "any_of", + "all_of", + "none_of", + "sum_of", + "tally_of", + "max_of", + "assert", + "achievement", + "rich_presence_display", + "rich_presence_value", + "rich_presence_lookup", + "rich_presence_ascii_string_lookup", + "rich_presence_macro", + "rich_presence_conditional_display", + "leaderboard", + "__ornext", + ] + return "\\b(" + words.join("|") + ")\\b"; +} + export default function(hljs) { return { case_insensitive: false, contains: [ + // This block helps highlight.js auto detect RAScript syntax + { + begin: [ + new RegExp(ImportantWordRegex()), + /\(/ + ], + beginScope: { + 1: "title.function.invoke" + }, + relevance: 10 + }, hljs.C_LINE_COMMENT_MODE, hljs.QUOTE_STRING_MODE, hljs.C_NUMBER_MODE, @@ -17,20 +104,24 @@ export default function(hljs) { '\\*/', ), { - className: 'variable.language', - begin: /\b(this)\b/ + scope: 'variable.language', + begin: /\b(this)\b/, + relevance: 0 }, { - className: 'keyword', - begin: /\b(function|class|else|for|if|in|return)\b/ + scope: 'keyword', + begin: /\b(else|for|if|in|return)\b/, + relevance: 0 }, { - className: 'literal', - begin: /\b(true|false)\b/ + scope: 'literal', + begin: /\b(true|false)\b/, + relevance: 0 }, { - className: 'operator', - begin: /(\|\||\&\&|\=\=|\!\=|\>\=|\<\=|\=\>)/ + scope: 'operator', + begin: /(\|\||\&\&|\=\=|\!\=|\>\=|\<\=|\=\>)/, + relevance: 0 }, { scope: 'operator', @@ -39,22 +130,28 @@ export default function(hljs) { }, { begin: [ - /function[\t ]+/, + /\b(function)\b/, + /[\t ]+/, /[a-zA-Z_][\w]*/, /\(/ ], beginScope: { - 2: "title.function" - } + 1: "keyword", + 3: "title.function" + }, + relevance: 0 }, { begin: [ - /class[\t ]+/, + /\b(class)\b/, + /[\t ]+/, /[a-zA-Z_][\w]*/ ], beginScope: { - 2: "title.class" - } + 1: "keyword", + 3: "title.class" + }, + relevance: 0 }, { begin: [ @@ -63,10 +160,11 @@ export default function(hljs) { ], beginScope: { 1: "title.function.invoke" - } + }, + relevance: 0 }, { - className: 'variable', + scope: 'variable', begin: /[a-zA-Z_][\w]*/, relevance: 0 }