177 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
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;
 |