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;
|