diff options
Diffstat (limited to 'htroot/js/languages/yaml.js')
| -rw-r--r-- | htroot/js/languages/yaml.js | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/htroot/js/languages/yaml.js b/htroot/js/languages/yaml.js new file mode 100644 index 000000000..4f588eec2 --- /dev/null +++ b/htroot/js/languages/yaml.js @@ -0,0 +1,223 @@ +/*! `yaml` grammar compiled for Highlight.js 11.11.1 */ + (function(){ + var hljsGrammar = (function () { + 'use strict'; + + /* + Language: YAML + Description: Yet Another Markdown Language + Author: Stefan Wienert <stwienert@gmail.com> + Contributors: Carl Baxter <carl@cbax.tech> + Requires: ruby.js + Website: https://yaml.org + Category: common, config + */ + function yaml(hljs) { + const LITERALS = 'true false yes no null'; + + // YAML spec allows non-reserved URI characters in tags. + const URI_CHARACTERS = '[\\w#;/?:@&=+$,.~*\'()[\\]]+'; + + // Define keys as starting with a word character + // ...containing word chars, spaces, colons, forward-slashes, hyphens and periods + // ...and ending with a colon followed immediately by a space, tab or newline. + // The YAML spec allows for much more than this, but this covers most use-cases. + const KEY = { + className: 'attr', + variants: [ + // added brackets support and special char support + { begin: /[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/ }, + { // double quoted keys - with brackets and special char support + begin: /"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/ }, + { // single quoted keys - with brackets and special char support + begin: /'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/ }, + ] + }; + + const TEMPLATE_VARIABLES = { + className: 'template-variable', + variants: [ + { // jinja templates Ansible + begin: /\{\{/, + end: /\}\}/ + }, + { // Ruby i18n + begin: /%\{/, + end: /\}/ + } + ] + }; + + const SINGLE_QUOTE_STRING = { + className: 'string', + relevance: 0, + begin: /'/, + end: /'/, + contains: [ + { + match: /''/, + scope: 'char.escape', + relevance: 0 + } + ] + }; + + const STRING = { + className: 'string', + relevance: 0, + variants: [ + { + begin: /"/, + end: /"/ + }, + { begin: /\S+/ } + ], + contains: [ + hljs.BACKSLASH_ESCAPE, + TEMPLATE_VARIABLES + ] + }; + + // Strings inside of value containers (objects) can't contain braces, + // brackets, or commas + const CONTAINER_STRING = hljs.inherit(STRING, { variants: [ + { + begin: /'/, + end: /'/, + contains: [ + { + begin: /''/, + relevance: 0 + } + ] + }, + { + begin: /"/, + end: /"/ + }, + { begin: /[^\s,{}[\]]+/ } + ] }); + + const DATE_RE = '[0-9]{4}(-[0-9][0-9]){0,2}'; + const TIME_RE = '([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?'; + const FRACTION_RE = '(\\.[0-9]*)?'; + const ZONE_RE = '([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?'; + const TIMESTAMP = { + className: 'number', + begin: '\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\b' + }; + + const VALUE_CONTAINER = { + end: ',', + endsWithParent: true, + excludeEnd: true, + keywords: LITERALS, + relevance: 0 + }; + const OBJECT = { + begin: /\{/, + end: /\}/, + contains: [ VALUE_CONTAINER ], + illegal: '\\n', + relevance: 0 + }; + const ARRAY = { + begin: '\\[', + end: '\\]', + contains: [ VALUE_CONTAINER ], + illegal: '\\n', + relevance: 0 + }; + + const MODES = [ + KEY, + { + className: 'meta', + begin: '^---\\s*$', + relevance: 10 + }, + { // multi line string + // Blocks start with a | or > followed by a newline + // + // Indentation of subsequent lines must be the same to + // be considered part of the block + className: 'string', + begin: '[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*' + }, + { // Ruby/Rails erb + begin: '<%[%=-]?', + end: '[%-]?%>', + subLanguage: 'ruby', + excludeBegin: true, + excludeEnd: true, + relevance: 0 + }, + { // named tags + className: 'type', + begin: '!\\w+!' + URI_CHARACTERS + }, + // https://yaml.org/spec/1.2/spec.html#id2784064 + { // verbatim tags + className: 'type', + begin: '!<' + URI_CHARACTERS + ">" + }, + { // primary tags + className: 'type', + begin: '!' + URI_CHARACTERS + }, + { // secondary tags + className: 'type', + begin: '!!' + URI_CHARACTERS + }, + { // fragment id &ref + className: 'meta', + begin: '&' + hljs.UNDERSCORE_IDENT_RE + '$' + }, + { // fragment reference *ref + className: 'meta', + begin: '\\*' + hljs.UNDERSCORE_IDENT_RE + '$' + }, + { // array listing + className: 'bullet', + // TODO: remove |$ hack when we have proper look-ahead support + begin: '-(?=[ ]|$)', + relevance: 0 + }, + hljs.HASH_COMMENT_MODE, + { + beginKeywords: LITERALS, + keywords: { literal: LITERALS } + }, + TIMESTAMP, + // numbers are any valid C-style number that + // sit isolated from other words + { + className: 'number', + begin: hljs.C_NUMBER_RE + '\\b', + relevance: 0 + }, + OBJECT, + ARRAY, + SINGLE_QUOTE_STRING, + STRING + ]; + + const VALUE_MODES = [ ...MODES ]; + VALUE_MODES.pop(); + VALUE_MODES.push(CONTAINER_STRING); + VALUE_CONTAINER.contains = VALUE_MODES; + + return { + name: 'YAML', + case_insensitive: true, + aliases: [ 'yml' ], + contains: MODES + }; + } + + return yaml; + +})(); + + hljs.registerLanguage('yaml', hljsGrammar); + })();
\ No newline at end of file |
