| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | /*Language: YAMLDescription: Yet Another Markdown LanguageAuthor: Stefan Wienert <stwienert@gmail.com>Contributors: Carl Baxter <carl@cbax.tech>Requires: ruby.jsWebsite: https://yaml.orgCategory: 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;
 |