@@ -11,7 +11,7 @@ export default function(hljs) {
11
11
var LITERALS = 'true false yes no null' ;
12
12
13
13
// YAML spec allows non-reserved URI characters in tags.
14
- var URI_CHARACTERS = '[\\w#;/?:@&=+$,.~*\\\'()[\\]]+'
14
+ var URI_CHARACTERS = '[\\w#;/?:@&=+$,.~*\\\'()[\\]]+' ;
15
15
16
16
// Define keys as starting with a word character
17
17
// ...containing word chars, spaces, colons, forward-slashes, hyphens and periods
@@ -21,111 +21,154 @@ export default function(hljs) {
21
21
className : 'attr' ,
22
22
variants : [
23
23
{ begin : '\\w[\\w :\\/.-]*:(?=[ \t]|$)' } ,
24
- { begin : '"\\w[\\w :\\/.-]*":(?=[ \t]|$)' } , //double quoted keys
25
- { begin : '\'\\w[\\w :\\/.-]*\':(?=[ \t]|$)' } //single quoted keys
24
+ { begin : '"\\w[\\w :\\/.-]*":(?=[ \t]|$)' } , // double quoted keys
25
+ { begin : '\'\\w[\\w :\\/.-]*\':(?=[ \t]|$)' } // single quoted keys
26
26
]
27
27
} ;
28
28
29
29
var TEMPLATE_VARIABLES = {
30
30
className : 'template-variable' ,
31
31
variants : [
32
- { begin : '\{\ {' , end : '\}\ }' } , // jinja templates Ansible
33
- { begin : '%\ {' , end : '\ }' } // Ruby i18n
32
+ { begin : '{ {' , end : '} }' } , // jinja templates Ansible
33
+ { begin : '%{' , end : '}' } // Ruby i18n
34
34
]
35
35
} ;
36
36
var STRING = {
37
37
className : 'string' ,
38
38
relevance : 0 ,
39
39
variants : [
40
- { begin : / ' / , end : / ' / } ,
41
- { begin : / " / , end : / " / } ,
42
- { begin : / \S + / }
40
+ { begin : / ' / , end : / ' / } ,
41
+ { begin : / " / , end : / " / } ,
42
+ { begin : / \S + / }
43
43
] ,
44
44
contains : [
45
45
hljs . BACKSLASH_ESCAPE ,
46
46
TEMPLATE_VARIABLES
47
47
]
48
48
} ;
49
49
50
+ // Strings inside of value containers (objects) can't contain braces,
51
+ // brackets, or commas
52
+ var CONTAINER_STRING = hljs . inherit ( STRING , {
53
+ variants : [
54
+ { begin : / ' / , end : / ' / } ,
55
+ { begin : / " / , end : / " / } ,
56
+ { begin : / [ ^ \s , { } [ \] ] + / }
57
+ ]
58
+ } ) ;
59
+
50
60
var DATE_RE = '[0-9]{4}(-[0-9][0-9]){0,2}' ;
51
61
var TIME_RE = '([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?' ;
52
62
var FRACTION_RE = '(\\.[0-9]*)?' ;
53
63
var ZONE_RE = '([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?' ;
54
64
var TIMESTAMP = {
55
65
className : 'number' ,
56
- begin : '\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\b' ,
57
- }
66
+ begin : '\\b' + DATE_RE + TIME_RE + FRACTION_RE + ZONE_RE + '\\b'
67
+ } ;
68
+
69
+ var VALUE_CONTAINER = {
70
+ end : ',' ,
71
+ endsWithParent : true ,
72
+ excludeEnd : true ,
73
+ contains : [ ] ,
74
+ keywords : LITERALS ,
75
+ relevance : 0
76
+ } ;
77
+ var OBJECT = {
78
+ begin : '{' ,
79
+ end : '}' ,
80
+ contains : [ VALUE_CONTAINER ] ,
81
+ illegal : '\\n' ,
82
+ relevance : 0
83
+ } ;
84
+ var ARRAY = {
85
+ begin : '\\[' ,
86
+ end : '\\]' ,
87
+ contains : [ VALUE_CONTAINER ] ,
88
+ illegal : '\\n' ,
89
+ relevance : 0
90
+ } ;
91
+
92
+ var MODES = [
93
+ KEY ,
94
+ {
95
+ className : 'meta' ,
96
+ begin : '^---\s*$' ,
97
+ relevance : 10
98
+ } ,
99
+ { // multi line string
100
+ // Blocks start with a | or > followed by a newline
101
+ //
102
+ // Indentation of subsequent lines must be the same to
103
+ // be considered part of the block
104
+ className : 'string' ,
105
+ begin : '[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*'
106
+ } ,
107
+ { // Ruby/Rails erb
108
+ begin : '<%[%=-]?' ,
109
+ end : '[%-]?%>' ,
110
+ subLanguage : 'ruby' ,
111
+ excludeBegin : true ,
112
+ excludeEnd : true ,
113
+ relevance : 0
114
+ } ,
115
+ { // named tags
116
+ className : 'type' ,
117
+ begin : '!\\w+!' + URI_CHARACTERS
118
+ } ,
119
+ // https://yaml.org/spec/1.2/spec.html#id2784064
120
+ { // verbatim tags
121
+ className : 'type' ,
122
+ begin : '!<' + URI_CHARACTERS + ">"
123
+ } ,
124
+ { // primary tags
125
+ className : 'type' ,
126
+ begin : '!' + URI_CHARACTERS
127
+ } ,
128
+ { // secondary tags
129
+ className : 'type' ,
130
+ begin : '!!' + URI_CHARACTERS
131
+ } ,
132
+ { // fragment id &ref
133
+ className : 'meta' ,
134
+ begin : '&' + hljs . UNDERSCORE_IDENT_RE + '$'
135
+ } ,
136
+ { // fragment reference *ref
137
+ className : 'meta' ,
138
+ begin : '\\*' + hljs . UNDERSCORE_IDENT_RE + '$'
139
+ } ,
140
+ { // array listing
141
+ className : 'bullet' ,
142
+ // TODO: remove |$ hack when we have proper look-ahead support
143
+ begin : '\\-(?=[ ]|$)' ,
144
+ relevance : 0
145
+ } ,
146
+ hljs . HASH_COMMENT_MODE ,
147
+ {
148
+ beginKeywords : LITERALS ,
149
+ keywords : { literal : LITERALS }
150
+ } ,
151
+ TIMESTAMP ,
152
+ // numbers are any valid C-style number that
153
+ // sit isolated from other words
154
+ {
155
+ className : 'number' ,
156
+ begin : hljs . C_NUMBER_RE + '\\b'
157
+ } ,
158
+ OBJECT ,
159
+ ARRAY ,
160
+ STRING
161
+ ] ;
162
+
163
+ var VALUE_MODES = [ ...MODES ] ;
164
+ VALUE_MODES . pop ( ) ;
165
+ VALUE_MODES . push ( CONTAINER_STRING ) ;
166
+ VALUE_CONTAINER . contains = VALUE_MODES ;
58
167
59
168
return {
60
169
name : 'YAML' ,
61
170
case_insensitive : true ,
62
171
aliases : [ 'yml' , 'YAML' ] ,
63
- contains : [
64
- KEY ,
65
- {
66
- className : 'meta' ,
67
- begin : '^---\s*$' ,
68
- relevance : 10
69
- } ,
70
- { // multi line string
71
- // Blocks start with a | or > followed by a newline
72
- //
73
- // Indentation of subsequent lines must be the same to
74
- // be considered part of the block
75
- className : 'string' ,
76
- begin : '[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*' ,
77
- } ,
78
- { // Ruby/Rails erb
79
- begin : '<%[%=-]?' , end : '[%-]?%>' ,
80
- subLanguage : 'ruby' ,
81
- excludeBegin : true ,
82
- excludeEnd : true ,
83
- relevance : 0
84
- } ,
85
- { // named tags
86
- className : 'type' ,
87
- begin : '!\\w+!' + URI_CHARACTERS ,
88
- } ,
89
- // https://yaml.org/spec/1.2/spec.html#id2784064
90
- { // verbatim tags
91
- className : 'type' ,
92
- begin : '!<' + URI_CHARACTERS + ">" ,
93
- } ,
94
- { // primary tags
95
- className : 'type' ,
96
- begin : '!' + URI_CHARACTERS ,
97
- } ,
98
- { // secondary tags
99
- className : 'type' ,
100
- begin : '!!' + URI_CHARACTERS ,
101
- } ,
102
- { // fragment id &ref
103
- className : 'meta' ,
104
- begin : '&' + hljs . UNDERSCORE_IDENT_RE + '$' ,
105
- } ,
106
- { // fragment reference *ref
107
- className : 'meta' ,
108
- begin : '\\*' + hljs . UNDERSCORE_IDENT_RE + '$'
109
- } ,
110
- { // array listing
111
- className : 'bullet' ,
112
- // TODO: remove |$ hack when we have proper look-ahead support
113
- begin : '\\-(?=[ ]|$)' ,
114
- relevance : 0
115
- } ,
116
- hljs . HASH_COMMENT_MODE ,
117
- {
118
- beginKeywords : LITERALS ,
119
- keywords : { literal : LITERALS }
120
- } ,
121
- TIMESTAMP ,
122
- // numbers are any valid C-style number that
123
- // sit isolated from other words
124
- {
125
- className : 'number' ,
126
- begin : hljs . C_NUMBER_RE + '\\b'
127
- } ,
128
- STRING
129
- ]
172
+ contains : MODES
130
173
} ;
131
174
}
0 commit comments