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