190 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @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 = {
 | 
						|
    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;
 |