104 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			1.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;
 | |
| }
 | |
| 
 | |
| /*
 | |
| Language: Augmented Backus-Naur Form
 | |
| Author: Alex McKibben <alex@nullscope.net>
 | |
| Website: https://tools.ietf.org/html/rfc5234
 | |
| Audit: 2020
 | |
| */
 | |
| 
 | |
| /** @type LanguageFn */
 | |
| function abnf(hljs) {
 | |
|   const regexes = {
 | |
|     ruleDeclaration: /^[a-zA-Z][a-zA-Z0-9-]*/,
 | |
|     unexpectedChars: /[!@#$^&',?+~`|:]/
 | |
|   };
 | |
| 
 | |
|   const keywords = [
 | |
|     "ALPHA",
 | |
|     "BIT",
 | |
|     "CHAR",
 | |
|     "CR",
 | |
|     "CRLF",
 | |
|     "CTL",
 | |
|     "DIGIT",
 | |
|     "DQUOTE",
 | |
|     "HEXDIG",
 | |
|     "HTAB",
 | |
|     "LF",
 | |
|     "LWSP",
 | |
|     "OCTET",
 | |
|     "SP",
 | |
|     "VCHAR",
 | |
|     "WSP"
 | |
|   ];
 | |
| 
 | |
|   const commentMode = hljs.COMMENT(/;/, /$/);
 | |
| 
 | |
|   const terminalBinaryMode = {
 | |
|     className: "symbol",
 | |
|     begin: /%b[0-1]+(-[0-1]+|(\.[0-1]+)+){0,1}/
 | |
|   };
 | |
| 
 | |
|   const terminalDecimalMode = {
 | |
|     className: "symbol",
 | |
|     begin: /%d[0-9]+(-[0-9]+|(\.[0-9]+)+){0,1}/
 | |
|   };
 | |
| 
 | |
|   const terminalHexadecimalMode = {
 | |
|     className: "symbol",
 | |
|     begin: /%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+){0,1}/
 | |
|   };
 | |
| 
 | |
|   const caseSensitivityIndicatorMode = {
 | |
|     className: "symbol",
 | |
|     begin: /%[si]/
 | |
|   };
 | |
| 
 | |
|   const ruleDeclarationMode = {
 | |
|     className: "attribute",
 | |
|     begin: concat(regexes.ruleDeclaration, /(?=\s*=)/)
 | |
|   };
 | |
| 
 | |
|   return {
 | |
|     name: 'Augmented Backus-Naur Form',
 | |
|     illegal: regexes.unexpectedChars,
 | |
|     keywords: keywords,
 | |
|     contains: [
 | |
|       ruleDeclarationMode,
 | |
|       commentMode,
 | |
|       terminalBinaryMode,
 | |
|       terminalDecimalMode,
 | |
|       terminalHexadecimalMode,
 | |
|       caseSensitivityIndicatorMode,
 | |
|       hljs.QUOTE_STRING_MODE,
 | |
|       hljs.NUMBER_MODE
 | |
|     ]
 | |
|   };
 | |
| }
 | |
| 
 | |
| module.exports = abnf;
 |