summaryrefslogtreecommitdiff
path: root/htroot/js/languages/yaml.js
diff options
context:
space:
mode:
Diffstat (limited to 'htroot/js/languages/yaml.js')
-rw-r--r--htroot/js/languages/yaml.js223
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