122 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.4 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: HTTP
 | |
| Description: HTTP request and response headers with automatic body highlighting
 | |
| Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
 | |
| Category: common, protocols
 | |
| Website: https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview
 | |
| */
 | |
| 
 | |
| function http(hljs) {
 | |
|   const VERSION = 'HTTP/(2|1\\.[01])';
 | |
|   const HEADER_NAME = /[A-Za-z][A-Za-z0-9-]*/;
 | |
|   const HEADER = {
 | |
|     className: 'attribute',
 | |
|     begin: concat('^', HEADER_NAME, '(?=\\:\\s)'),
 | |
|     starts: {
 | |
|       contains: [
 | |
|         {
 | |
|           className: "punctuation",
 | |
|           begin: /: /,
 | |
|           relevance: 0,
 | |
|           starts: {
 | |
|             end: '$',
 | |
|             relevance: 0
 | |
|           }
 | |
|         }
 | |
|       ]
 | |
|     }
 | |
|   };
 | |
|   const HEADERS_AND_BODY = [
 | |
|     HEADER,
 | |
|     {
 | |
|       begin: '\\n\\n',
 | |
|       starts: { subLanguage: [], endsWithParent: true }
 | |
|     }
 | |
|   ];
 | |
| 
 | |
|   return {
 | |
|     name: 'HTTP',
 | |
|     aliases: ['https'],
 | |
|     illegal: /\S/,
 | |
|     contains: [
 | |
|       // response
 | |
|       {
 | |
|         begin: '^(?=' + VERSION + " \\d{3})",
 | |
|         end: /$/,
 | |
|         contains: [
 | |
|           {
 | |
|             className: "meta",
 | |
|             begin: VERSION
 | |
|           },
 | |
|           {
 | |
|             className: 'number', begin: '\\b\\d{3}\\b'
 | |
|           }
 | |
|         ],
 | |
|         starts: {
 | |
|           end: /\b\B/,
 | |
|           illegal: /\S/,
 | |
|           contains: HEADERS_AND_BODY
 | |
|         }
 | |
|       },
 | |
|       // request
 | |
|       {
 | |
|         begin: '(?=^[A-Z]+ (.*?) ' + VERSION + '$)',
 | |
|         end: /$/,
 | |
|         contains: [
 | |
|           {
 | |
|             className: 'string',
 | |
|             begin: ' ',
 | |
|             end: ' ',
 | |
|             excludeBegin: true,
 | |
|             excludeEnd: true
 | |
|           },
 | |
|           {
 | |
|             className: "meta",
 | |
|             begin: VERSION
 | |
|           },
 | |
|           {
 | |
|             className: 'keyword',
 | |
|             begin: '[A-Z]+'
 | |
|           }
 | |
|         ],
 | |
|         starts: {
 | |
|           end: /\b\B/,
 | |
|           illegal: /\S/,
 | |
|           contains: HEADERS_AND_BODY
 | |
|         }
 | |
|       },
 | |
|       // to allow headers to work even without a preamble
 | |
|       hljs.inherit(HEADER, {
 | |
|         relevance: 0
 | |
|       })
 | |
|     ]
 | |
|   };
 | |
| }
 | |
| 
 | |
| module.exports = http;
 |