215 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			5.9 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: Visual Basic .NET
 | |
| Description: Visual Basic .NET (VB.NET) is a multi-paradigm, object-oriented programming language, implemented on the .NET Framework.
 | |
| Authors: Poren Chiang <ren.chiang@gmail.com>, Jan Pilzer
 | |
| Website: https://docs.microsoft.com/dotnet/visual-basic/getting-started
 | |
| Category: common
 | |
| */
 | |
| 
 | |
| /** @type LanguageFn */
 | |
| function vbnet(hljs) {
 | |
|   /**
 | |
|    * Character Literal
 | |
|    * Either a single character ("a"C) or an escaped double quote (""""C).
 | |
|    */
 | |
|   const CHARACTER = {
 | |
|     className: 'string',
 | |
|     begin: /"(""|[^/n])"C\b/
 | |
|   };
 | |
| 
 | |
|   const STRING = {
 | |
|     className: 'string',
 | |
|     begin: /"/,
 | |
|     end: /"/,
 | |
|     illegal: /\n/,
 | |
|     contains: [
 | |
|       {
 | |
|         // double quote escape
 | |
|         begin: /""/
 | |
|       }
 | |
|     ]
 | |
|   };
 | |
| 
 | |
|   /** Date Literals consist of a date, a time, or both separated by whitespace, surrounded by # */
 | |
|   const MM_DD_YYYY = /\d{1,2}\/\d{1,2}\/\d{4}/;
 | |
|   const YYYY_MM_DD = /\d{4}-\d{1,2}-\d{1,2}/;
 | |
|   const TIME_12H = /(\d|1[012])(:\d+){0,2} *(AM|PM)/;
 | |
|   const TIME_24H = /\d{1,2}(:\d{1,2}){1,2}/;
 | |
|   const DATE = {
 | |
|     className: 'literal',
 | |
|     variants: [
 | |
|       {
 | |
|         // #YYYY-MM-DD# (ISO-Date) or #M/D/YYYY# (US-Date)
 | |
|         begin: concat(/# */, either(YYYY_MM_DD, MM_DD_YYYY), / *#/)
 | |
|       },
 | |
|       {
 | |
|         // #H:mm[:ss]# (24h Time)
 | |
|         begin: concat(/# */, TIME_24H, / *#/)
 | |
|       },
 | |
|       {
 | |
|         // #h[:mm[:ss]] A# (12h Time)
 | |
|         begin: concat(/# */, TIME_12H, / *#/)
 | |
|       },
 | |
|       {
 | |
|         // date plus time
 | |
|         begin: concat(
 | |
|           /# */,
 | |
|           either(YYYY_MM_DD, MM_DD_YYYY),
 | |
|           / +/,
 | |
|           either(TIME_12H, TIME_24H),
 | |
|           / *#/
 | |
|         )
 | |
|       }
 | |
|     ]
 | |
|   };
 | |
| 
 | |
|   const NUMBER = {
 | |
|     className: 'number',
 | |
|     relevance: 0,
 | |
|     variants: [
 | |
|       {
 | |
|         // Float
 | |
|         begin: /\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/
 | |
|       },
 | |
|       {
 | |
|         // Integer (base 10)
 | |
|         begin: /\b\d[\d_]*((U?[SIL])|[%&])?/
 | |
|       },
 | |
|       {
 | |
|         // Integer (base 16)
 | |
|         begin: /&H[\dA-F_]+((U?[SIL])|[%&])?/
 | |
|       },
 | |
|       {
 | |
|         // Integer (base 8)
 | |
|         begin: /&O[0-7_]+((U?[SIL])|[%&])?/
 | |
|       },
 | |
|       {
 | |
|         // Integer (base 2)
 | |
|         begin: /&B[01_]+((U?[SIL])|[%&])?/
 | |
|       }
 | |
|     ]
 | |
|   };
 | |
| 
 | |
|   const LABEL = {
 | |
|     className: 'label',
 | |
|     begin: /^\w+:/
 | |
|   };
 | |
| 
 | |
|   const DOC_COMMENT = hljs.COMMENT(/'''/, /$/, {
 | |
|     contains: [
 | |
|       {
 | |
|         className: 'doctag',
 | |
|         begin: /<\/?/,
 | |
|         end: />/
 | |
|       }
 | |
|     ]
 | |
|   });
 | |
| 
 | |
|   const COMMENT = hljs.COMMENT(null, /$/, {
 | |
|     variants: [
 | |
|       {
 | |
|         begin: /'/
 | |
|       },
 | |
|       {
 | |
|         // TODO: Use `beforeMatch:` for leading spaces
 | |
|         begin: /([\t ]|^)REM(?=\s)/
 | |
|       }
 | |
|     ]
 | |
|   });
 | |
| 
 | |
|   const DIRECTIVES = {
 | |
|     className: 'meta',
 | |
|     // TODO: Use `beforeMatch:` for indentation once available
 | |
|     begin: /[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,
 | |
|     end: /$/,
 | |
|     keywords: {
 | |
|       'meta-keyword':
 | |
|         'const disable else elseif enable end externalsource if region then'
 | |
|     },
 | |
|     contains: [ COMMENT ]
 | |
|   };
 | |
| 
 | |
|   return {
 | |
|     name: 'Visual Basic .NET',
 | |
|     aliases: [ 'vb' ],
 | |
|     case_insensitive: true,
 | |
|     classNameAliases: {
 | |
|       label: 'symbol'
 | |
|     },
 | |
|     keywords: {
 | |
|       keyword:
 | |
|         'addhandler alias aggregate ansi as async assembly auto binary by byref byval ' + /* a-b */
 | |
|         'call case catch class compare const continue custom declare default delegate dim distinct do ' + /* c-d */
 | |
|         'each equals else elseif end enum erase error event exit explicit finally for friend from function ' + /* e-f */
 | |
|         'get global goto group handles if implements imports in inherits interface into iterator ' + /* g-i */
 | |
|         'join key let lib loop me mid module mustinherit mustoverride mybase myclass ' + /* j-m */
 | |
|         'namespace narrowing new next notinheritable notoverridable ' + /* n */
 | |
|         'of off on operator option optional order overloads overridable overrides ' + /* o */
 | |
|         'paramarray partial preserve private property protected public ' + /* p */
 | |
|         'raiseevent readonly redim removehandler resume return ' + /* r */
 | |
|         'select set shadows shared skip static step stop structure strict sub synclock ' + /* s */
 | |
|         'take text then throw to try unicode until using when where while widening with withevents writeonly yield' /* t-y */,
 | |
|       built_in:
 | |
|         // Operators https://docs.microsoft.com/dotnet/visual-basic/language-reference/operators
 | |
|         'addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor ' +
 | |
|         // Type Conversion Functions https://docs.microsoft.com/dotnet/visual-basic/language-reference/functions/type-conversion-functions
 | |
|         'cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort',
 | |
|       type:
 | |
|         // Data types https://docs.microsoft.com/dotnet/visual-basic/language-reference/data-types
 | |
|         'boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort',
 | |
|       literal: 'true false nothing'
 | |
|     },
 | |
|     illegal:
 | |
|       '//|\\{|\\}|endif|gosub|variant|wend|^\\$ ' /* reserved deprecated keywords */,
 | |
|     contains: [
 | |
|       CHARACTER,
 | |
|       STRING,
 | |
|       DATE,
 | |
|       NUMBER,
 | |
|       LABEL,
 | |
|       DOC_COMMENT,
 | |
|       COMMENT,
 | |
|       DIRECTIVES
 | |
|     ]
 | |
|   };
 | |
| }
 | |
| 
 | |
| module.exports = vbnet;
 |