0
|
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
|
|
3
|
|
4 (function(mod) {
|
|
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
6 mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
|
|
7 else if (typeof define == "function" && define.amd) // AMD
|
|
8 define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
|
|
9 else // Plain browser env
|
|
10 mod(CodeMirror);
|
|
11 })(function(CodeMirror) {
|
|
12 "use strict";
|
|
13
|
|
14 var from = "from";
|
|
15 var fromRegex = new RegExp("^(\\s*)\\b(" + from + ")\\b", "i");
|
|
16
|
|
17 var shells = ["run", "cmd", "entrypoint", "shell"];
|
|
18 var shellsAsArrayRegex = new RegExp("^(\\s*)(" + shells.join('|') + ")(\\s+\\[)", "i");
|
|
19
|
|
20 var expose = "expose";
|
|
21 var exposeRegex = new RegExp("^(\\s*)(" + expose + ")(\\s+)", "i");
|
|
22
|
|
23 var others = [
|
|
24 "arg", "from", "maintainer", "label", "env",
|
|
25 "add", "copy", "volume", "user",
|
|
26 "workdir", "onbuild", "stopsignal", "healthcheck", "shell"
|
|
27 ];
|
|
28
|
|
29 // Collect all Dockerfile directives
|
|
30 var instructions = [from, expose].concat(shells).concat(others),
|
|
31 instructionRegex = "(" + instructions.join('|') + ")",
|
|
32 instructionOnlyLine = new RegExp("^(\\s*)" + instructionRegex + "(\\s*)(#.*)?$", "i"),
|
|
33 instructionWithArguments = new RegExp("^(\\s*)" + instructionRegex + "(\\s+)", "i");
|
|
34
|
|
35 CodeMirror.defineSimpleMode("dockerfile", {
|
|
36 start: [
|
|
37 // Block comment: This is a line starting with a comment
|
|
38 {
|
|
39 regex: /^\s*#.*$/,
|
|
40 sol: true,
|
|
41 token: "comment"
|
|
42 },
|
|
43 {
|
|
44 regex: fromRegex,
|
|
45 token: [null, "keyword"],
|
|
46 sol: true,
|
|
47 next: "from"
|
|
48 },
|
|
49 // Highlight an instruction without any arguments (for convenience)
|
|
50 {
|
|
51 regex: instructionOnlyLine,
|
|
52 token: [null, "keyword", null, "error"],
|
|
53 sol: true
|
|
54 },
|
|
55 {
|
|
56 regex: shellsAsArrayRegex,
|
|
57 token: [null, "keyword", null],
|
|
58 sol: true,
|
|
59 next: "array"
|
|
60 },
|
|
61 {
|
|
62 regex: exposeRegex,
|
|
63 token: [null, "keyword", null],
|
|
64 sol: true,
|
|
65 next: "expose"
|
|
66 },
|
|
67 // Highlight an instruction followed by arguments
|
|
68 {
|
|
69 regex: instructionWithArguments,
|
|
70 token: [null, "keyword", null],
|
|
71 sol: true,
|
|
72 next: "arguments"
|
|
73 },
|
|
74 {
|
|
75 regex: /./,
|
|
76 token: null
|
|
77 }
|
|
78 ],
|
|
79 from: [
|
|
80 {
|
|
81 regex: /\s*$/,
|
|
82 token: null,
|
|
83 next: "start"
|
|
84 },
|
|
85 {
|
|
86 // Line comment without instruction arguments is an error
|
|
87 regex: /(\s*)(#.*)$/,
|
|
88 token: [null, "error"],
|
|
89 next: "start"
|
|
90 },
|
|
91 {
|
|
92 regex: /(\s*\S+\s+)(as)/i,
|
|
93 token: [null, "keyword"],
|
|
94 next: "start"
|
|
95 },
|
|
96 // Fail safe return to start
|
|
97 {
|
|
98 token: null,
|
|
99 next: "start"
|
|
100 }
|
|
101 ],
|
|
102 single: [
|
|
103 {
|
|
104 regex: /(?:[^\\']|\\.)/,
|
|
105 token: "string"
|
|
106 },
|
|
107 {
|
|
108 regex: /'/,
|
|
109 token: "string",
|
|
110 pop: true
|
|
111 }
|
|
112 ],
|
|
113 double: [
|
|
114 {
|
|
115 regex: /(?:[^\\"]|\\.)/,
|
|
116 token: "string"
|
|
117 },
|
|
118 {
|
|
119 regex: /"/,
|
|
120 token: "string",
|
|
121 pop: true
|
|
122 }
|
|
123 ],
|
|
124 array: [
|
|
125 {
|
|
126 regex: /\]/,
|
|
127 token: null,
|
|
128 next: "start"
|
|
129 },
|
|
130 {
|
|
131 regex: /"(?:[^\\"]|\\.)*"?/,
|
|
132 token: "string"
|
|
133 }
|
|
134 ],
|
|
135 expose: [
|
|
136 {
|
|
137 regex: /\d+$/,
|
|
138 token: "number",
|
|
139 next: "start"
|
|
140 },
|
|
141 {
|
|
142 regex: /[^\d]+$/,
|
|
143 token: null,
|
|
144 next: "start"
|
|
145 },
|
|
146 {
|
|
147 regex: /\d+/,
|
|
148 token: "number"
|
|
149 },
|
|
150 {
|
|
151 regex: /[^\d]+/,
|
|
152 token: null
|
|
153 },
|
|
154 // Fail safe return to start
|
|
155 {
|
|
156 token: null,
|
|
157 next: "start"
|
|
158 }
|
|
159 ],
|
|
160 arguments: [
|
|
161 {
|
|
162 regex: /^\s*#.*$/,
|
|
163 sol: true,
|
|
164 token: "comment"
|
|
165 },
|
|
166 {
|
|
167 regex: /"(?:[^\\"]|\\.)*"?$/,
|
|
168 token: "string",
|
|
169 next: "start"
|
|
170 },
|
|
171 {
|
|
172 regex: /"/,
|
|
173 token: "string",
|
|
174 push: "double"
|
|
175 },
|
|
176 {
|
|
177 regex: /'(?:[^\\']|\\.)*'?$/,
|
|
178 token: "string",
|
|
179 next: "start"
|
|
180 },
|
|
181 {
|
|
182 regex: /'/,
|
|
183 token: "string",
|
|
184 push: "single"
|
|
185 },
|
|
186 {
|
|
187 regex: /[^#"']+[\\`]$/,
|
|
188 token: null
|
|
189 },
|
|
190 {
|
|
191 regex: /[^#"']+$/,
|
|
192 token: null,
|
|
193 next: "start"
|
|
194 },
|
|
195 {
|
|
196 regex: /[^#"']+/,
|
|
197 token: null
|
|
198 },
|
|
199 // Fail safe return to start
|
|
200 {
|
|
201 token: null,
|
|
202 next: "start"
|
|
203 }
|
|
204 ],
|
|
205 meta: {
|
|
206 lineComment: "#"
|
|
207 }
|
|
208 });
|
|
209
|
|
210 CodeMirror.defineMIME("text/x-dockerfile", "dockerfile");
|
|
211 });
|