UNPKG

2.86 kBJavaScriptView Raw
1(function (Prism) {
2
3 // Many of the following regexes will contain negated lookaheads like `[ \t]+(?![ \t])`. This is a trick to ensure
4 // that quantifiers behave *atomically*. Atomic quantifiers are necessary to prevent exponential backtracking.
5
6 var spaceAfterBackSlash = /\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source;
7 // At least one space, comment, or line break
8 var space = /(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)/.source
9 .replace(/<SP_BS>/g, function () { return spaceAfterBackSlash; });
10
11 var string = /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source;
12 var option = /--[\w-]+=(?:<STR>|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(/<STR>/g, function () { return string; });
13
14 var stringRule = {
15 pattern: RegExp(string),
16 greedy: true
17 };
18 var commentRule = {
19 pattern: /(^[ \t]*)#.*/m,
20 lookbehind: true,
21 greedy: true
22 };
23
24 /**
25 * @param {string} source
26 * @param {string} flags
27 * @returns {RegExp}
28 */
29 function re(source, flags) {
30 source = source
31 .replace(/<OPT>/g, function () { return option; })
32 .replace(/<SP>/g, function () { return space; });
33
34 return RegExp(source, flags);
35 }
36
37 Prism.languages.docker = {
38 'instruction': {
39 pattern: /(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,
40 lookbehind: true,
41 greedy: true,
42 inside: {
43 'options': {
44 pattern: re(/(^(?:ONBUILD<SP>)?\w+<SP>)<OPT>(?:<SP><OPT>)*/.source, 'i'),
45 lookbehind: true,
46 greedy: true,
47 inside: {
48 'property': {
49 pattern: /(^|\s)--[\w-]+/,
50 lookbehind: true
51 },
52 'string': [
53 stringRule,
54 {
55 pattern: /(=)(?!["'])(?:[^\s\\]|\\.)+/,
56 lookbehind: true
57 }
58 ],
59 'operator': /\\$/m,
60 'punctuation': /=/
61 }
62 },
63 'keyword': [
64 {
65 // https://docs.docker.com/engine/reference/builder/#healthcheck
66 pattern: re(/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\b/.source, 'i'),
67 lookbehind: true,
68 greedy: true
69 },
70 {
71 // https://docs.docker.com/engine/reference/builder/#from
72 pattern: re(/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\]+<SP>)AS/.source, 'i'),
73 lookbehind: true,
74 greedy: true
75 },
76 {
77 // https://docs.docker.com/engine/reference/builder/#onbuild
78 pattern: re(/(^ONBUILD<SP>)\w+/.source, 'i'),
79 lookbehind: true,
80 greedy: true
81 },
82 {
83 pattern: /^\w+/,
84 greedy: true
85 }
86 ],
87 'comment': commentRule,
88 'string': stringRule,
89 'variable': /\$(?:\w+|\{[^{}"'\\]*\})/,
90 'operator': /\\$/m
91 }
92 },
93 'comment': commentRule
94 };
95
96 Prism.languages.dockerfile = Prism.languages.docker;
97
98}(Prism));