hexo/node_modules/highlight.js/lib/languages/d.js

272 lines
6.9 KiB
JavaScript

/*
Language: D
Author: Aleksandar Ruzicic <aleksandar@ruzicic.info>
Description: D is a language with C-like syntax and static typing. It pragmatically combines efficiency, control, and modeling power, with safety and programmer productivity.
Version: 1.0a
Website: https://dlang.org
Date: 2012-04-08
*/
/**
* Known issues:
*
* - invalid hex string literals will be recognized as a double quoted strings
* but 'x' at the beginning of string will not be matched
*
* - delimited string literals are not checked for matching end delimiter
* (not possible to do with js regexp)
*
* - content of token string is colored as a string (i.e. no keyword coloring inside a token string)
* also, content of token string is not validated to contain only valid D tokens
*
* - special token sequence rule is not strictly following D grammar (anything following #line
* up to the end of line is matched as special token sequence)
*/
/** @type LanguageFn */
function d(hljs) {
/**
* Language keywords
*
* @type {Object}
*/
const D_KEYWORDS = {
$pattern: hljs.UNDERSCORE_IDENT_RE,
keyword:
'abstract alias align asm assert auto body break byte case cast catch class '
+ 'const continue debug default delete deprecated do else enum export extern final '
+ 'finally for foreach foreach_reverse|10 goto if immutable import in inout int '
+ 'interface invariant is lazy macro mixin module new nothrow out override package '
+ 'pragma private protected public pure ref return scope shared static struct '
+ 'super switch synchronized template this throw try typedef typeid typeof union '
+ 'unittest version void volatile while with __FILE__ __LINE__ __gshared|10 '
+ '__thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__',
built_in:
'bool cdouble cent cfloat char creal dchar delegate double dstring float function '
+ 'idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar '
+ 'wstring',
literal:
'false null true'
};
/**
* Number literal regexps
*
* @type {String}
*/
const decimal_integer_re = '(0|[1-9][\\d_]*)';
const decimal_integer_nosus_re = '(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)';
const binary_integer_re = '0[bB][01_]+';
const hexadecimal_digits_re = '([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)';
const hexadecimal_integer_re = '0[xX]' + hexadecimal_digits_re;
const decimal_exponent_re = '([eE][+-]?' + decimal_integer_nosus_re + ')';
const decimal_float_re = '(' + decimal_integer_nosus_re + '(\\.\\d*|' + decimal_exponent_re + ')|'
+ '\\d+\\.' + decimal_integer_nosus_re + '|'
+ '\\.' + decimal_integer_re + decimal_exponent_re + '?'
+ ')';
const hexadecimal_float_re = '(0[xX]('
+ hexadecimal_digits_re + '\\.' + hexadecimal_digits_re + '|'
+ '\\.?' + hexadecimal_digits_re
+ ')[pP][+-]?' + decimal_integer_nosus_re + ')';
const integer_re = '('
+ decimal_integer_re + '|'
+ binary_integer_re + '|'
+ hexadecimal_integer_re
+ ')';
const float_re = '('
+ hexadecimal_float_re + '|'
+ decimal_float_re
+ ')';
/**
* Escape sequence supported in D string and character literals
*
* @type {String}
*/
const escape_sequence_re = '\\\\('
+ '[\'"\\?\\\\abfnrtv]|' // common escapes
+ 'u[\\dA-Fa-f]{4}|' // four hex digit unicode codepoint
+ '[0-7]{1,3}|' // one to three octal digit ascii char code
+ 'x[\\dA-Fa-f]{2}|' // two hex digit ascii char code
+ 'U[\\dA-Fa-f]{8}' // eight hex digit unicode codepoint
+ ')|'
+ '&[a-zA-Z\\d]{2,};'; // named character entity
/**
* D integer number literals
*
* @type {Object}
*/
const D_INTEGER_MODE = {
className: 'number',
begin: '\\b' + integer_re + '(L|u|U|Lu|LU|uL|UL)?',
relevance: 0
};
/**
* [D_FLOAT_MODE description]
* @type {Object}
*/
const D_FLOAT_MODE = {
className: 'number',
begin: '\\b('
+ float_re + '([fF]|L|i|[fF]i|Li)?|'
+ integer_re + '(i|[fF]i|Li)'
+ ')',
relevance: 0
};
/**
* D character literal
*
* @type {Object}
*/
const D_CHARACTER_MODE = {
className: 'string',
begin: '\'(' + escape_sequence_re + '|.)',
end: '\'',
illegal: '.'
};
/**
* D string escape sequence
*
* @type {Object}
*/
const D_ESCAPE_SEQUENCE = {
begin: escape_sequence_re,
relevance: 0
};
/**
* D double quoted string literal
*
* @type {Object}
*/
const D_STRING_MODE = {
className: 'string',
begin: '"',
contains: [ D_ESCAPE_SEQUENCE ],
end: '"[cwd]?'
};
/**
* D wysiwyg and delimited string literals
*
* @type {Object}
*/
const D_WYSIWYG_DELIMITED_STRING_MODE = {
className: 'string',
begin: '[rq]"',
end: '"[cwd]?',
relevance: 5
};
/**
* D alternate wysiwyg string literal
*
* @type {Object}
*/
const D_ALTERNATE_WYSIWYG_STRING_MODE = {
className: 'string',
begin: '`',
end: '`[cwd]?'
};
/**
* D hexadecimal string literal
*
* @type {Object}
*/
const D_HEX_STRING_MODE = {
className: 'string',
begin: 'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',
relevance: 10
};
/**
* D delimited string literal
*
* @type {Object}
*/
const D_TOKEN_STRING_MODE = {
className: 'string',
begin: 'q"\\{',
end: '\\}"'
};
/**
* Hashbang support
*
* @type {Object}
*/
const D_HASHBANG_MODE = {
className: 'meta',
begin: '^#!',
end: '$',
relevance: 5
};
/**
* D special token sequence
*
* @type {Object}
*/
const D_SPECIAL_TOKEN_SEQUENCE_MODE = {
className: 'meta',
begin: '#(line)',
end: '$',
relevance: 5
};
/**
* D attributes
*
* @type {Object}
*/
const D_ATTRIBUTE_MODE = {
className: 'keyword',
begin: '@[a-zA-Z_][a-zA-Z_\\d]*'
};
/**
* D nesting comment
*
* @type {Object}
*/
const D_NESTING_COMMENT_MODE = hljs.COMMENT(
'\\/\\+',
'\\+\\/',
{
contains: [ 'self' ],
relevance: 10
}
);
return {
name: 'D',
keywords: D_KEYWORDS,
contains: [
hljs.C_LINE_COMMENT_MODE,
hljs.C_BLOCK_COMMENT_MODE,
D_NESTING_COMMENT_MODE,
D_HEX_STRING_MODE,
D_STRING_MODE,
D_WYSIWYG_DELIMITED_STRING_MODE,
D_ALTERNATE_WYSIWYG_STRING_MODE,
D_TOKEN_STRING_MODE,
D_FLOAT_MODE,
D_INTEGER_MODE,
D_CHARACTER_MODE,
D_HASHBANG_MODE,
D_SPECIAL_TOKEN_SEQUENCE_MODE,
D_ATTRIBUTE_MODE
]
};
}
module.exports = d;