/** * @param {string} value * @returns {RegExp} * */ /** * @param {RegExp | string } re * @returns {string} */ function source(re) { if (!re) return null; if (typeof re === "string") return re; return re.source; } /** * @param {...(RegExp | string) } args * @returns {string} */ function concat(...args) { const joined = args.map((x) => source(x)).join(""); return joined; } /** * Any of the passed expresssions may match * * Creates a huge this | this | that | that match * @param {(RegExp | string)[] } args * @returns {string} */ function either(...args) { const joined = '(' + args.map((x) => source(x)).join("|") + ")"; return joined; } /* Language: AppleScript Authors: Nathan Grigg , Dr. Drang Category: scripting Website: https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html Audit: 2020 */ /** @type LanguageFn */ function applescript(hljs) { const STRING = hljs.inherit( hljs.QUOTE_STRING_MODE, { illegal: null }); const PARAMS = { className: 'params', begin: /\(/, end: /\)/, contains: [ 'self', hljs.C_NUMBER_MODE, STRING ] }; const COMMENT_MODE_1 = hljs.COMMENT(/--/, /$/); const COMMENT_MODE_2 = hljs.COMMENT( /\(\*/, /\*\)/, { contains: [ 'self', // allow nesting COMMENT_MODE_1 ] } ); const COMMENTS = [ COMMENT_MODE_1, COMMENT_MODE_2, hljs.HASH_COMMENT_MODE ]; const KEYWORD_PATTERNS = [ /apart from/, /aside from/, /instead of/, /out of/, /greater than/, /isn't|(doesn't|does not) (equal|come before|come after|contain)/, /(greater|less) than( or equal)?/, /(starts?|ends|begins?) with/, /contained by/, /comes (before|after)/, /a (ref|reference)/, /POSIX (file|path)/, /(date|time) string/, /quoted form/ ]; const BUILT_IN_PATTERNS = [ /clipboard info/, /the clipboard/, /info for/, /list (disks|folder)/, /mount volume/, /path to/, /(close|open for) access/, /(get|set) eof/, /current date/, /do shell script/, /get volume settings/, /random number/, /set volume/, /system attribute/, /system info/, /time to GMT/, /(load|run|store) script/, /scripting components/, /ASCII (character|number)/, /localized string/, /choose (application|color|file|file name|folder|from list|remote application|URL)/, /display (alert|dialog)/ ]; return { name: 'AppleScript', aliases: [ 'osascript' ], keywords: { keyword: 'about above after against and around as at back before beginning ' + 'behind below beneath beside between but by considering ' + 'contain contains continue copy div does eighth else end equal ' + 'equals error every exit fifth first for fourth from front ' + 'get given global if ignoring in into is it its last local me ' + 'middle mod my ninth not of on onto or over prop property put ref ' + 'reference repeat returning script second set seventh since ' + 'sixth some tell tenth that the|0 then third through thru ' + 'timeout times to transaction try until where while whose with ' + 'without', literal: 'AppleScript false linefeed return pi quote result space tab true', built_in: 'alias application boolean class constant date file integer list ' + 'number real record string text ' + 'activate beep count delay launch log offset read round ' + 'run say summarize write ' + 'character characters contents day frontmost id item length ' + 'month name paragraph paragraphs rest reverse running time version ' + 'weekday word words year' }, contains: [ STRING, hljs.C_NUMBER_MODE, { className: 'built_in', begin: concat( /\b/, either(...BUILT_IN_PATTERNS), /\b/ ) }, { className: 'built_in', begin: /^\s*return\b/ }, { className: 'literal', begin: /\b(text item delimiters|current application|missing value)\b/ }, { className: 'keyword', begin: concat( /\b/, either(...KEYWORD_PATTERNS), /\b/ ) }, { beginKeywords: 'on', illegal: /[${=;\n]/, contains: [ hljs.UNDERSCORE_TITLE_MODE, PARAMS ] }, ...COMMENTS ], illegal: /\/\/|->|=>|\[\[/ }; } module.exports = applescript;