174 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @param {string} value
 | 
						|
 * @returns {RegExp}
 | 
						|
 * */
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {RegExp | string } re
 | 
						|
 * @returns {string}
 | 
						|
 */
 | 
						|
function source(re) {
 | 
						|
  if (!re) return null;
 | 
						|
  if (typeof re === "string") return re;
 | 
						|
 | 
						|
  return re.source;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {RegExp | string } re
 | 
						|
 * @returns {string}
 | 
						|
 */
 | 
						|
function lookahead(re) {
 | 
						|
  return concat('(?=', re, ')');
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {...(RegExp | string) } args
 | 
						|
 * @returns {string}
 | 
						|
 */
 | 
						|
function concat(...args) {
 | 
						|
  const joined = args.map((x) => source(x)).join("");
 | 
						|
  return joined;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Any of the passed expresssions may match
 | 
						|
 *
 | 
						|
 * Creates a huge this | this | that | that match
 | 
						|
 * @param {(RegExp | string)[] } args
 | 
						|
 * @returns {string}
 | 
						|
 */
 | 
						|
function either(...args) {
 | 
						|
  const joined = '(' + args.map((x) => source(x)).join("|") + ")";
 | 
						|
  return joined;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
Language: TOML, also INI
 | 
						|
Description: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics.
 | 
						|
Contributors: Guillaume Gomez <guillaume1.gomez@gmail.com>
 | 
						|
Category: common, config
 | 
						|
Website: https://github.com/toml-lang/toml
 | 
						|
*/
 | 
						|
 | 
						|
function ini(hljs) {
 | 
						|
  const NUMBERS = {
 | 
						|
    className: 'number',
 | 
						|
    relevance: 0,
 | 
						|
    variants: [
 | 
						|
      {
 | 
						|
        begin: /([+-]+)?[\d]+_[\d_]+/
 | 
						|
      },
 | 
						|
      {
 | 
						|
        begin: hljs.NUMBER_RE
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  };
 | 
						|
  const COMMENTS = hljs.COMMENT();
 | 
						|
  COMMENTS.variants = [
 | 
						|
    {
 | 
						|
      begin: /;/,
 | 
						|
      end: /$/
 | 
						|
    },
 | 
						|
    {
 | 
						|
      begin: /#/,
 | 
						|
      end: /$/
 | 
						|
    }
 | 
						|
  ];
 | 
						|
  const VARIABLES = {
 | 
						|
    className: 'variable',
 | 
						|
    variants: [
 | 
						|
      {
 | 
						|
        begin: /\$[\w\d"][\w\d_]*/
 | 
						|
      },
 | 
						|
      {
 | 
						|
        begin: /\$\{(.*?)\}/
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  };
 | 
						|
  const LITERALS = {
 | 
						|
    className: 'literal',
 | 
						|
    begin: /\bon|off|true|false|yes|no\b/
 | 
						|
  };
 | 
						|
  const STRINGS = {
 | 
						|
    className: "string",
 | 
						|
    contains: [hljs.BACKSLASH_ESCAPE],
 | 
						|
    variants: [
 | 
						|
      {
 | 
						|
        begin: "'''",
 | 
						|
        end: "'''",
 | 
						|
        relevance: 10
 | 
						|
      },
 | 
						|
      {
 | 
						|
        begin: '"""',
 | 
						|
        end: '"""',
 | 
						|
        relevance: 10
 | 
						|
      },
 | 
						|
      {
 | 
						|
        begin: '"',
 | 
						|
        end: '"'
 | 
						|
      },
 | 
						|
      {
 | 
						|
        begin: "'",
 | 
						|
        end: "'"
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  };
 | 
						|
  const ARRAY = {
 | 
						|
    begin: /\[/,
 | 
						|
    end: /\]/,
 | 
						|
    contains: [
 | 
						|
      COMMENTS,
 | 
						|
      LITERALS,
 | 
						|
      VARIABLES,
 | 
						|
      STRINGS,
 | 
						|
      NUMBERS,
 | 
						|
      'self'
 | 
						|
    ],
 | 
						|
    relevance: 0
 | 
						|
  };
 | 
						|
 | 
						|
  const BARE_KEY = /[A-Za-z0-9_-]+/;
 | 
						|
  const QUOTED_KEY_DOUBLE_QUOTE = /"(\\"|[^"])*"/;
 | 
						|
  const QUOTED_KEY_SINGLE_QUOTE = /'[^']*'/;
 | 
						|
  const ANY_KEY = either(
 | 
						|
    BARE_KEY, QUOTED_KEY_DOUBLE_QUOTE, QUOTED_KEY_SINGLE_QUOTE
 | 
						|
  );
 | 
						|
  const DOTTED_KEY = concat(
 | 
						|
    ANY_KEY, '(\\s*\\.\\s*', ANY_KEY, ')*',
 | 
						|
    lookahead(/\s*=\s*[^#\s]/)
 | 
						|
  );
 | 
						|
 | 
						|
  return {
 | 
						|
    name: 'TOML, also INI',
 | 
						|
    aliases: ['toml'],
 | 
						|
    case_insensitive: true,
 | 
						|
    illegal: /\S/,
 | 
						|
    contains: [
 | 
						|
      COMMENTS,
 | 
						|
      {
 | 
						|
        className: 'section',
 | 
						|
        begin: /\[+/,
 | 
						|
        end: /\]+/
 | 
						|
      },
 | 
						|
      {
 | 
						|
        begin: DOTTED_KEY,
 | 
						|
        className: 'attr',
 | 
						|
        starts: {
 | 
						|
          end: /$/,
 | 
						|
          contains: [
 | 
						|
            COMMENTS,
 | 
						|
            ARRAY,
 | 
						|
            LITERALS,
 | 
						|
            VARIABLES,
 | 
						|
            STRINGS,
 | 
						|
            NUMBERS
 | 
						|
          ]
 | 
						|
        }
 | 
						|
      }
 | 
						|
    ]
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
module.exports = ini;
 |