-
-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathyaml.js
126 lines (124 loc) · 3.91 KB
/
yaml.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// @ts-nocheck
yaml.displayName = 'yaml'
yaml.aliases = ['yml']
/** @type {import('../core.js').Syntax} */
export default function yaml(Prism) {
;(function (Prism) {
// https://yaml.org/spec/1.2/spec.html#c-ns-anchor-property
// https://yaml.org/spec/1.2/spec.html#c-ns-alias-node
var anchorOrAlias = /[*&][^\s[\]{},]+/
// https://yaml.org/spec/1.2/spec.html#c-ns-tag-property
var tag =
/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/
// https://yaml.org/spec/1.2/spec.html#c-ns-properties(n,c)
var properties =
'(?:' +
tag.source +
'(?:[ \t]+' +
anchorOrAlias.source +
')?|' +
anchorOrAlias.source +
'(?:[ \t]+' +
tag.source +
')?)'
// https://yaml.org/spec/1.2/spec.html#ns-plain(n,c)
// This is a simplified version that doesn't support "#" and multiline keys
// All these long scarry character classes are simplified versions of YAML's characters
var plainKey =
/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(
/<PLAIN>/g,
function () {
return /[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/
.source
}
)
var string = /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source
/**
*
* @param {string} value
* @param {string} [flags]
* @returns {RegExp}
*/
function createValuePattern(value, flags) {
flags = (flags || '').replace(/m/g, '') + 'm' // add m flag
var pattern =
/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source
.replace(/<<prop>>/g, function () {
return properties
})
.replace(/<<value>>/g, function () {
return value
})
return RegExp(pattern, flags)
}
Prism.languages.yaml = {
scalar: {
pattern: RegExp(
/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(
/<<prop>>/g,
function () {
return properties
}
)
),
lookbehind: true,
alias: 'string'
},
comment: /#.*/,
key: {
pattern: RegExp(
/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source
.replace(/<<prop>>/g, function () {
return properties
})
.replace(/<<key>>/g, function () {
return '(?:' + plainKey + '|' + string + ')'
})
),
lookbehind: true,
greedy: true,
alias: 'atrule'
},
directive: {
pattern: /(^[ \t]*)%.+/m,
lookbehind: true,
alias: 'important'
},
datetime: {
pattern: createValuePattern(
/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/
.source
),
lookbehind: true,
alias: 'number'
},
boolean: {
pattern: createValuePattern(/false|true/.source, 'i'),
lookbehind: true,
alias: 'important'
},
null: {
pattern: createValuePattern(/null|~/.source, 'i'),
lookbehind: true,
alias: 'important'
},
string: {
pattern: createValuePattern(string),
lookbehind: true,
greedy: true
},
number: {
pattern: createValuePattern(
/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/
.source,
'i'
),
lookbehind: true
},
tag: tag,
important: anchorOrAlias,
punctuation: /---|[:[\]{}\-,|>?]|\.\.\./
}
Prism.languages.yml = Prism.languages.yaml
})(Prism)
}