diff --git a/src/languages/yaml.js b/src/languages/yaml.js
index 4fc4ba0a28..02a1d9cee2 100644
--- a/src/languages/yaml.js
+++ b/src/languages/yaml.js
@@ -11,7 +11,7 @@ export default function(hljs) {
var LITERALS = 'true false yes no null';
// YAML spec allows non-reserved URI characters in tags.
- var URI_CHARACTERS = '[\\w#;/?:@&=+$,.~*\\\'()[\\]]+'
+ var URI_CHARACTERS = '[\\w#;/?:@&=+$,.~*\\\'()[\\]]+';
// Define keys as starting with a word character
// ...containing word chars, spaces, colons, forward-slashes, hyphens and periods
@@ -21,25 +21,25 @@ export default function(hljs) {
className: 'attr',
variants: [
{ begin: '\\w[\\w :\\/.-]*:(?=[ \t]|$)' },
- { begin: '"\\w[\\w :\\/.-]*":(?=[ \t]|$)' }, //double quoted keys
- { begin: '\'\\w[\\w :\\/.-]*\':(?=[ \t]|$)' } //single quoted keys
+ { 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
+ { begin: '{{', end: '}}' }, // jinja templates Ansible
+ { begin: '%{', end: '}' } // Ruby i18n
]
};
var STRING = {
className: 'string',
relevance: 0,
variants: [
- {begin: /'/, end: /'/},
- {begin: /"/, end: /"/},
- {begin: /\S+/}
+ { begin: /'/, end: /'/ },
+ { begin: /"/, end: /"/ },
+ { begin: /\S+/ }
],
contains: [
hljs.BACKSLASH_ESCAPE,
@@ -47,85 +47,128 @@ export default function(hljs) {
]
};
+ // 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',
- }
+ begin: '\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\b'
+ };
+
+ var VALUE_CONTAINER = {
+ end: ',',
+ endsWithParent: true,
+ excludeEnd: true,
+ contains: [],
+ 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: '[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\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'
+ },
+ 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', 'YAML'],
- contains: [
- 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: '[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\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'
- },
- STRING
- ]
+ contains: MODES
};
}
diff --git a/test/markup/yaml/inline.expect.txt b/test/markup/yaml/inline.expect.txt
new file mode 100644
index 0000000000..d12626f0ae
--- /dev/null
+++ b/test/markup/yaml/inline.expect.txt
@@ -0,0 +1,3 @@
+foo: [bar, bar2, [1, 2], 3]
+foo: {bar: [1, 2], baz: {inside: 3}}
+foo: ba{}r,ba[]z
diff --git a/test/markup/yaml/inline.txt b/test/markup/yaml/inline.txt
new file mode 100644
index 0000000000..8dfa15b2ea
--- /dev/null
+++ b/test/markup/yaml/inline.txt
@@ -0,0 +1,3 @@
+foo: [bar, bar2, [1, 2], 3]
+foo: {bar: [1, 2], baz: {inside: 3}}
+foo: ba{}r,ba[]z