123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /*
- 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) {
- var LITERALS = 'true false yes no null';
- // YAML spec allows non-reserved URI characters in tags.
- var 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.
- var KEY = {
- className: 'attr',
- variants: [
- { begin: '\\w[\\w :\\/.-]*:(?=[ \t]|$)' },
- { begin: '"\\w[\\w :\\/.-]*":(?=[ \t]|$)' }, // double quoted keys
- { begin: '\'\\w[\\w :\\/.-]*\':(?=[ \t]|$)' } // single quoted keys
- ]
- };
- var TEMPLATE_VARIABLES = {
- className: 'template-variable',
- variants: [
- { begin: /\{\{/, end: /\}\}/ }, // jinja templates Ansible
- { begin: /%\{/, end: /\}/ } // Ruby i18n
- ]
- };
- var STRING = {
- className: 'string',
- relevance: 0,
- variants: [
- { begin: /'/, end: /'/ },
- { begin: /"/, end: /"/ },
- { begin: /\S+/ }
- ],
- contains: [
- hljs.BACKSLASH_ESCAPE,
- TEMPLATE_VARIABLES
- ]
- };
- // Strings inside of value containers (objects) can't contain braces,
- // brackets, or commas
- var CONTAINER_STRING = hljs.inherit(STRING, {
- variants: [
- { begin: /'/, end: /'/ },
- { begin: /"/, end: /"/ },
- { begin: /[^\s,{}[\]]+/ }
- ]
- });
- var DATE_RE = '[0-9]{4}(-[0-9][0-9]){0,2}';
- var TIME_RE = '([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?';
- var FRACTION_RE = '(\\.[0-9]*)?';
- var ZONE_RE = '([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?';
- var TIMESTAMP = {
- className: 'number',
- begin: '\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\b'
- };
- var VALUE_CONTAINER = {
- end: ',',
- endsWithParent: true,
- excludeEnd: true,
- keywords: LITERALS,
- relevance: 0
- };
- var OBJECT = {
- begin: /\{/,
- end: /\}/,
- contains: [VALUE_CONTAINER],
- illegal: '\\n',
- relevance: 0
- };
- var ARRAY = {
- begin: '\\[',
- end: '\\]',
- contains: [VALUE_CONTAINER],
- illegal: '\\n',
- relevance: 0
- };
- var 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,
- STRING
- ];
- var 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
- };
- }
- module.exports = yaml;
|