Skip to content

Commit d4b6083

Browse files
Add highlighting for IPs and CIDR strings (#89)
1 parent 80b5cb0 commit d4b6083

3 files changed

Lines changed: 178 additions & 0 deletions

File tree

JSON (Terraform).sublime-syntax

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ contexts:
1616
- include: Packages/Terraform/Terraform.sublime-syntax#string-interpolation
1717
- include: Packages/Terraform/Terraform.sublime-syntax#aws-acl
1818

19+
strings:
20+
- meta_prepend: true
21+
- include: Packages/Terraform/Terraform.sublime-syntax#ip-address-strings
22+
1923
line-comments:
2024
- meta_append: true
2125
- include: Packages/Terraform/Terraform.sublime-syntax#inline-comments

Terraform.sublime-syntax

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,30 @@ variables:
141141
| filemd1
142142
)
143143
144+
# IPs and CIDR
145+
## IPv6 pattern stolen lovingly from https://github.com/tijn/hosts.tmLanguage,
146+
## where Michael Lyons adapted them from David M. Szydek https://stackoverflow.com/a/17871737.
147+
zero_to_32: (?:3[0-2]|[12][0-9]|[0-9])
148+
zero_to_128: (?:12[0-8]|1[01][0-9]|[1-9][0-9]|[0-9])
149+
zero_to_255: (?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:[1-9][0-9])|[0-9])
150+
zero_to_65535: (?:6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])
151+
ipv4: (?:(?:{{zero_to_255}}\.){3}{{zero_to_255}})
152+
ipv6: |-
153+
(?xi:
154+
(?:::(?:ffff(?::0{1,4}){0,1}:){0,1}{{ipv4}}) # ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
155+
|(?:(?:[0-9a-f]{1,4}:){1,4}:{{ipv4}}) # 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
156+
|(?:fe80:(?::[0-9a-f]{1,4}){0,4}%[0-9a-z]{1,}) # fe80::7:8%eth0 fe80::7:8%1 (link-local IPv6 addresses with zone index)
157+
|(?:(?:[0-9a-f]{1,4}:){7,7} [0-9a-f]{1,4}) # 1:2:3:4:5:6:7:8
158+
| (?:[0-9a-f]{1,4}: (?::[0-9a-f]{1,4}){1,6}) # 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8
159+
|(?:(?:[0-9a-f]{1,4}:){1,2}(?::[0-9a-f]{1,4}){1,5}) # 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8
160+
|(?:(?:[0-9a-f]{1,4}:){1,3}(?::[0-9a-f]{1,4}){1,4}) # 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8
161+
|(?:(?:[0-9a-f]{1,4}:){1,4}(?::[0-9a-f]{1,4}){1,3}) # 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8
162+
|(?:(?:[0-9a-f]{1,4}:){1,5}(?::[0-9a-f]{1,4}){1,2}) # 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8
163+
|(?:(?:[0-9a-f]{1,4}:){1,6} :[0-9a-f]{1,4}) # 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8
164+
|(?:(?:[0-9a-f]{1,4}:){1,7} :) # 1:: 1:2:3:4:5:6:7::
165+
|(?::(?:(?::[0-9a-f]{1,4}){1,7}|:)) # ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::
166+
)
167+
144168
contexts:
145169
main:
146170
- include: comments
@@ -275,6 +299,7 @@ contexts:
275299
# https://www.terraform.io/docs/language/expressions/types.html
276300
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#template-expressions
277301
string-literals:
302+
- include: ip-address-strings
278303
- match: \"
279304
comment: Strings
280305
scope: punctuation.definition.string.begin.terraform
@@ -326,6 +351,38 @@ contexts:
326351
- meta_content_scope: source.terraform
327352
- include: string-interpolation-body
328353

354+
ip-address-strings:
355+
- match: (")({{ipv6}})(?:(/)({{zero_to_128}}))?(")
356+
scope: meta.string.terraform string.quoted.double.terraform
357+
captures:
358+
1: punctuation.definition.string.begin.terraform
359+
2: meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
360+
3: punctuation.separator.terraform
361+
4: constant.other.range.terraform
362+
5: punctuation.definition.string.end.terraform
363+
- match: (")((\[){{ipv6}}(\]))(?:(/)({{zero_to_128}})|(:)({{zero_to_65535}}))?(")
364+
scope: meta.string.terraform string.quoted.double.terraform
365+
captures:
366+
1: punctuation.definition.string.begin.terraform
367+
2: meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
368+
3: punctuation.definition.constant.begin.terraform
369+
4: punctuation.definition.constant.end.terraform
370+
5: punctuation.separator.terraform
371+
6: constant.other.range.terraform
372+
7: punctuation.separator.terraform
373+
8: constant.other.port.terraform
374+
9: punctuation.definition.string.end.terraform
375+
- match: (")({{ipv4}})(?:(/)({{zero_to_32}})|(:)({{zero_to_65535}}))?(")
376+
scope: meta.string.terraform string.quoted.double.terraform
377+
captures:
378+
1: punctuation.definition.string.begin.terraform
379+
2: meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
380+
3: punctuation.separator.terraform
381+
4: constant.other.range.terraform
382+
5: punctuation.separator.terraform
383+
6: constant.other.port.terraform
384+
7: punctuation.definition.string.end.terraform
385+
329386
# String Interpolation: ("${" | "${~") Expression ("}" | "~}"
330387
#
331388
# https://github.com/hashicorp/hcl2/blob/master/hcl/hclsyntax/spec.md#templates

tests/syntax_test_scope.tf

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,109 @@
256256
# ^^^^^^^^^^ constant.character.escape.terraform
257257
# ^ punctuation.definition.string.end.terraform
258258

259+
260+
/////
261+
// Matches IPs and CIDR
262+
/////
263+
264+
"1.2.3.4"
265+
# ^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
266+
# ^ punctuation.definition.string.begin.terraform
267+
# ^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
268+
# ^ punctuation.definition.string.end.terraform
269+
270+
"1.2.3.4/32"
271+
# ^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
272+
# ^ punctuation.definition.string.begin.terraform
273+
# ^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
274+
# ^ punctuation.separator.terraform
275+
# ^^ constant.other.range.terraform
276+
# ^ punctuation.definition.string.end.terraform
277+
278+
"1.2.3.4:8080"
279+
# ^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
280+
# ^ punctuation.definition.string.begin.terraform
281+
# ^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
282+
# ^ punctuation.separator.terraform
283+
# ^^^^ constant.other.port.terraform
284+
# ^ punctuation.definition.string.end.terraform
285+
286+
"1.2.3.4/33"
287+
# ^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
288+
# ^ punctuation.definition.string.begin.terraform
289+
# ^^^^^^^^^^ - constant - punctuation
290+
# ^ punctuation.definition.string.end.terraform
291+
292+
"256.2.3.4"
293+
# ^^^^^^^^^^^ - constant
294+
295+
"::1"
296+
# ^^^^^ meta.string.terraform string.quoted.double.terraform
297+
# ^ punctuation.definition.string.begin.terraform
298+
# ^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
299+
# ^ punctuation.definition.string.end.terraform
300+
301+
"deed"
302+
# ^^^^^^ meta.string.terraform string.quoted.double.terraform - constant
303+
# ^ punctuation.definition.string.begin.terraform
304+
# ^ punctuation.definition.string.end.terraform
305+
306+
"deed:10:10"
307+
# ^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform - constant
308+
# ^ punctuation.definition.string.begin.terraform
309+
# ^ punctuation.definition.string.end.terraform
310+
311+
"1:2:3:4:5:6:7:8"
312+
# ^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
313+
# ^ punctuation.definition.string.begin.terraform
314+
# ^^^^^^^^^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
315+
# ^ punctuation.definition.string.end.terraform
316+
317+
"1:2:3:4:5:6:7:8:8080"
318+
# ^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
319+
# ^ punctuation.definition.string.begin.terraform
320+
# ^^^^^^^^^^^^^^^^^^^^ - constant - punctuation
321+
# ^ punctuation.definition.string.end.terraform
322+
323+
"1:2:3:4:5:6:7:8/128"
324+
# ^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
325+
# ^ punctuation.definition.string.begin.terraform
326+
# ^^^^^^^^^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
327+
# ^ punctuation.separator.terraform
328+
# ^^^ constant.other.range.terraform
329+
# ^ punctuation.definition.string.end.terraform
330+
331+
"1:2:3:4:5:6:7:8/129"
332+
# ^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
333+
# ^ punctuation.definition.string.begin.terraform
334+
# ^^^^^^^^^^^^^^^^^^^ - constant - punctuation
335+
# ^ punctuation.definition.string.end.terraform
336+
337+
"[1:2:3:4:5:6:7:8]/128"
338+
# ^^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
339+
# ^ punctuation.definition.string.begin.terraform
340+
# ^^^^^^^^^^^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
341+
# ^ punctuation.definition.constant.begin.terraform
342+
# ^ punctuation.definition.constant.end.terraform
343+
# ^ punctuation.separator.terraform
344+
# ^^^ constant.other.range.terraform
345+
# ^ punctuation.definition.string.end.terraform
346+
347+
"[1:2:3:4:5:6:7:8]:8080"
348+
# ^^^^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
349+
# ^ punctuation.definition.string.begin.terraform
350+
# ^^^^^^^^^^^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v6.terraform
351+
# ^ punctuation.definition.constant.begin.terraform
352+
# ^ punctuation.definition.constant.end.terraform
353+
# ^ punctuation.separator.terraform
354+
# ^^^^ constant.other.port.terraform
355+
# ^ punctuation.definition.string.end.terraform
356+
357+
"[1:2:3:4:5:6:7:8]/129"
358+
# ^^^^^^^^^^^^^^^^^^^^^ meta.string.terraform string.quoted.double.terraform
359+
# ^ punctuation.definition.string.begin.terraform
360+
# ^^^^^^^^^^^^^^^^^^^^^ - constant - punctuation
361+
259362
/////
260363
// Unclosed strings
261364
/////
@@ -3458,6 +3561,20 @@ resource "aws_iam_role_policy" "attach-inline-policy-1" {
34583561
# ^ punctuation.section.interpolation.end.terraform
34593562
# ^ string.quoted.double.json punctuation.definition.string.end.json - variable
34603563
# ^ punctuation.separator.sequence.json
3564+
3565+
"IP": "1.2.3.4",
3566+
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block.body.terraform meta.function-call.arguments.terraform meta.parens.terraform meta.mapping.value.json meta.sequence.json
3567+
#^^^^^^^^^^^^^^^ meta.mapping.json
3568+
# ^^^^ meta.mapping.key.json string.quoted.double.json
3569+
# ^ punctuation.definition.string.begin.json
3570+
# ^ punctuation.definition.string.end.json
3571+
# ^^ meta.mapping.json
3572+
# ^ punctuation.separator.key-value.json
3573+
# ^^^^^^^^^ meta.mapping.value.json meta.string.terraform string.quoted.double.terraform
3574+
# ^ punctuation.definition.string.begin.terraform
3575+
# ^^^^^^^ meta.number.integer.other.terraform constant.numeric.ip-address.v4.terraform
3576+
# ^ punctuation.definition.string.end.terraform
3577+
# ^ meta.mapping.json punctuation.separator.sequence.json
34613578
"Effect": "Allow"
34623579
}
34633580
]

0 commit comments

Comments
 (0)