/* Language: D Author: Aleksandar Ruzicic 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_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;