2024-01-16 21:26:16 +08:00
|
|
|
/**
|
|
|
|
* @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 <nathan@nathanamy.org>, Dr. Drang <drdrang@gmail.com>
|
|
|
|
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 = {
|
2023-12-18 13:12:25 +08:00
|
|
|
className: 'params',
|
2024-01-16 21:26:16 +08:00
|
|
|
begin: /\(/,
|
|
|
|
end: /\)/,
|
|
|
|
contains: [
|
|
|
|
'self',
|
|
|
|
hljs.C_NUMBER_MODE,
|
|
|
|
STRING
|
|
|
|
]
|
2023-12-18 13:12:25 +08:00
|
|
|
};
|
2024-01-16 21:26:16 +08:00
|
|
|
const COMMENT_MODE_1 = hljs.COMMENT(/--/, /$/);
|
|
|
|
const COMMENT_MODE_2 = hljs.COMMENT(
|
|
|
|
/\(\*/,
|
|
|
|
/\*\)/,
|
2023-12-18 13:12:25 +08:00
|
|
|
{
|
2024-01-16 21:26:16 +08:00
|
|
|
contains: [
|
|
|
|
'self', // allow nesting
|
|
|
|
COMMENT_MODE_1
|
|
|
|
]
|
2023-12-18 13:12:25 +08:00
|
|
|
}
|
|
|
|
);
|
2024-01-16 21:26:16 +08:00
|
|
|
const COMMENTS = [
|
2023-12-18 13:12:25 +08:00
|
|
|
COMMENT_MODE_1,
|
|
|
|
COMMENT_MODE_2,
|
|
|
|
hljs.HASH_COMMENT_MODE
|
|
|
|
];
|
|
|
|
|
2024-01-16 21:26:16 +08:00
|
|
|
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)/
|
|
|
|
];
|
|
|
|
|
2023-12-18 13:12:25 +08:00
|
|
|
return {
|
2024-01-16 21:26:16 +08:00
|
|
|
name: 'AppleScript',
|
|
|
|
aliases: [ 'osascript' ],
|
2023-12-18 13:12:25 +08:00
|
|
|
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',
|
2024-01-16 21:26:16 +08:00
|
|
|
begin: concat(
|
|
|
|
/\b/,
|
|
|
|
either(...BUILT_IN_PATTERNS),
|
|
|
|
/\b/
|
|
|
|
)
|
|
|
|
},
|
|
|
|
{
|
|
|
|
className: 'built_in',
|
|
|
|
begin: /^\s*return\b/
|
2023-12-18 13:12:25 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
className: 'literal',
|
|
|
|
begin:
|
2024-01-16 21:26:16 +08:00
|
|
|
/\b(text item delimiters|current application|missing value)\b/
|
2023-12-18 13:12:25 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
className: 'keyword',
|
2024-01-16 21:26:16 +08:00
|
|
|
begin: concat(
|
|
|
|
/\b/,
|
|
|
|
either(...KEYWORD_PATTERNS),
|
|
|
|
/\b/
|
|
|
|
)
|
2023-12-18 13:12:25 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
beginKeywords: 'on',
|
2024-01-16 21:26:16 +08:00
|
|
|
illegal: /[${=;\n]/,
|
|
|
|
contains: [
|
|
|
|
hljs.UNDERSCORE_TITLE_MODE,
|
|
|
|
PARAMS
|
|
|
|
]
|
|
|
|
},
|
|
|
|
...COMMENTS
|
|
|
|
],
|
|
|
|
illegal: /\/\/|->|=>|\[\[/
|
2023-12-18 13:12:25 +08:00
|
|
|
};
|
2024-01-16 21:26:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = applescript;
|