{
	"name": "Antlers (Statamic Syntax)",
    "fileTypes": ["antlers.html", "html", "htm", "xhtml"],
	"scopeName": "text.html.statamic",
	"injections": {
		"text.html.statamic - (meta.embedded | meta.tag), L:((text.html.statamic meta.tag) - (meta.embedded.block.php | meta.embedded.line.php)), L:(source.js - (meta.embedded.block.php | meta.embedded.line.php)), L:(source.css - (meta.embedded.block.php | meta.embedded.line.php))": {
			"patterns": [
				{
					"include": "#php-tag"
				}
			]
		},
		"text.html.statamic": {
			"patterns": [
				{
					"include": "#statamic-comments"
				},
				{
					"include": "#antlers-tags"
				}
			]
		},
		"text.html.statamic - (meta.embedded | meta.tag | comment.block.statamic), L:(text.html.statamic meta.tag - (comment.block.statamic | meta.embedded.statamic))": {
			"patterns": [
				{
					"comment": "This is set to use XHTML standards, but you can change that by changing .strict to .basic for HTML standards",
					"include": "text.html.basic"
				}
			]
		}
	},
	"patterns": [
        {
            "include": "#php-tag"
        },
		{
			"include": "#statamic-comments"
		},
		{
			"include": "#frontMatter"
		},
		{
			"include": "#antlers-tags"
		}
	],
	"repository": {
		"php-tag": {
			"patterns": [
				{
					"begin": "<\\?(?i:php|=)?(?![^?]*\\?>)",
					"beginCaptures": {
						"0": {
							"name": "punctuation.section.embedded.begin.statamic"
						}
					},
					"end": "(\\?)>",
					"endCaptures": {
						"0": {
							"name": "punctuation.section.embedded.end.statamic"
						},
						"1": {
							"name": "source.php"
						}
					},
					"name": "meta.embedded.block.statamic",
					"contentName": "source.php",
					"patterns": [
						{
							"include": "source.php"
						}
					]
				},
                {
                    "begin": "(?<!@){{([\\$\\?]\\s?)",
					"beginCaptures": {
						"0": {
							"name": "punctuation.section.embedded.begin.statamic"
						}
					},
                    "end": "(\\s?)[\\$\\?]}}",
					"endCaptures": {
						"0": {
							"name": "punctuation.section.embedded.end.statamic"
						},
						"1": {
							"name": "source.php"
						}
					},
					"name": "meta.embedded.line.statamic",
					"contentName": "source.php",
					"patterns": [
						{
							"include": "source.php"
						}
					]
                },
				{
					"begin": "<\\?(?i:php|=)?",
					"beginCaptures": {
						"0": {
							"name": "punctuation.section.embedded.begin.statamic"
						}
					},
					"end": "(\\?)>",
					"endCaptures": {
						"0": {
							"name": "punctuation.section.embedded.end.statamic"
						},
						"1": {
							"name": "source.php"
						}
					},
					"name": "meta.embedded.line.statamic",
					"contentName": "source.php",
					"patterns": [
						{
							"include": "source.php"
						}
					]
				}
			]
		},
		"frontMatter": {
			"begin": "\\A-{3}\\s*$",
			"contentName": "meta.embedded.block.frontmatter",
			"patterns": [
				{
					"include": "source.yaml"
				}
			],
			"end": "(^|\\G)-{3}|\\.{3}\\s*$"
		},
		"statamic-comments": {
			"begin": "{{#",
			"end": "#}}",
			"name": "comment.block.statamic"
		},
		"antlers-tags": {
			"begin": "(?<!@){{(?!\\$)(\\s?)",
			"end": "(\\s?)}}",
			"name": "meta.embedded.block.statamic",
			"patterns": [
				{
					"include": "#statamic-comments"
				},
				{
					"include": "#php-tag"
				},
				{
					"include": "#antlers-conditionals"
				},
				{
					"include": "#antlers-expression"
				}
			]
		},
		"antlers-conditionals": {
			"match": "(?<!:)(/?else|/?elseif|/?if|/?unless|endif|endunless|unlesselse)",
			"name": "keyword.control.statamic"
		},
		"string-double-quoted": {
			"begin": "\"",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.statamic"
				}
			},
			"end": "\"",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.statamic"
				}
			},
			"name": "string.quoted.double.statamic",
			"patterns": [
				{
					"begin": "(?<!@){(\\s?)",
					"end": "(\\s?)}",
					"patterns": [
						{
							"include": "#antlers-expression"
						}
					]
				}
			]
		},
		"string-single-quoted": {
			"begin": "'",
			"beginCaptures": {
				"0": {
					"name": "punctuation.definition.string.begin.statamic"
				}
			},
			"end": "'",
			"endCaptures": {
				"0": {
					"name": "punctuation.definition.string.end.statamic"
				}
			},
			"name": "string.quoted.single.statamic",
			"patterns": [
				{
					"match": "\\\\[\\\\']",
					"name": "constant.character.escape.statamic"
				},
				{
					"begin": "(?<!@){(\\s?)",
					"end": "(\\s?)}",
					"patterns": [
						{
							"include": "#antlers-expression"
						}
					]
				}
			]
		},
		"antlers-strings": {
			"patterns": [
				{
					"include": "#string-double-quoted"
				},
				{
					"include": "#string-single-quoted"
				}
			]
		},
		"antlers-expression": {
			"patterns": [
				{
					"match": ";",
					"name": "punctuation.terminator.expression.statamic"
				},
				{
					"include": "#antlers-strings"
				},
				{
					"include": "#antlers-numbers"
				},
				{
					"match": "=>",
					"name": "keyword.operator.key.statamic"
				},
				{
					"match": "->",
					"name": "keyword.operator.class.statamic"
				},
                {
                    "include": "#statamic-explicit-tags"
                },
				{
					"include": "#statamic-core-tags"
				},
				{
					"match": "===|==|!==|!=|<>",
					"name": "keyword.operator.comparison.statamic"
				},
				{
					"match": "\\&=?",
					"name": "keyword.operator.string.statamic"
				},
				{
					"match": "=|\\+=|\\-=|\\*\\*?=|/=|%=|\\|=|\\^=|<<=|>>=",
					"name": "keyword.operator.assignment.statamic"
				},
				{
					"match": "(?i)(!|\\?\\?|\\?=|\\?|&&|&|\\|\\|)|\\b(and|or|xor)\\b",
					"name": "keyword.operator.logical.statamic"
				},
				{
					"match": "(?i)\\b(bwa|bwo|bxor|bnot|bsl|bsr)\\b",
					"name": "keyword.operator.bitwise.statamic"
				},
				{
					"match": "<=>|<=|>=|<|>",
					"name": "keyword.operator.comparison.statamic"
				},
				{
					"match": "\\-|\\+|\\*\\*?|/|%",
					"name": "keyword.operator.arithmetic.statamic"
				},
				{
					"begin": "(arr|list|switch)\\s*(\\()",
					"beginCaptures": {
						"1": {
							"name": "support.function.construct.statamic"
						},
						"2": {
							"name": "punctuation.definition.array.begin.bracket.round.statamic"
						}
					},
					"end": "\\)|(?=\\?>)",
					"endCaptures": {
						"0": {
							"name": "punctuation.definition.array.end.bracket.round.statamic"
						}
					},
					"name": "meta.array.statamic",
					"patterns": [
						{
							"include": "#antlers-expression"
						}
					]
				},
				{
					"begin": "(?<!@){(\\s?)",
					"end": "(\\s?)}",
					"patterns": [
						{
							"include": "#antlers-expression"
						}
					]
				},
				{
					"include": "#antlers-tag-parameter-variable"
				},
				{
					"include": "#antlers-language-operators"
				},
				{
					"include": "#antlers-variable"
				},
				{
					"include": "#antlers-modifier-pipe"
				},
				{
					"include": "#antlers-variable-modifier-name"
				},
				{
					"include": "#antlers-variable-modifiers"
				},
				{
					"include": "#antlers-constants"
				}
			]
		},
		"antlers-tag-parameter-variable": {
			"match": "(:?([\\S:]+?)(=)('|\")([^\\4]*?)(\\4))",
			"captures": {
				"1": {
					"patterns": [
						{
							"match": ":([\\S:]+?)(=)('|\")(.*?)(\\3)",
							"captures": {
								"1": {
									"name": "entity.other.attribute-name"
								},
								"2": {
									"name": "keyword.operator.assignment.statamic"
								},
								"3": {
									"name": "punctuation.definition.string.begin.statamic"
								},
								"4": {
									"patterns": [
										{
											"include": "#antlers-expression"
										}
									]
								},
								"5": {
									"name": "punctuation.definition.string.end.statamic"
								}
							}
						},
						{
							"match": "([\\S]+?)(=)(('|\")(.*?)(\\4))",
							"captures": {
								"1": {
									"name": "entity.other.attribute-name"
								},
								"2": {
									"name": "keyword.operator.assignment.statamic"
								},
								"3": {
									"patterns": [
										{
											"include": "#string-single-quoted"
										},
										{
											"include": "#string-double-quoted"
										}
									]
								}
							}
						}
					]
				}
			}
		},
		"antlers-constants": {
			"match": "(\\G|\\s|\\b)(true|TRUE|false|FALSE|yes|YES|no|NO|null|as)\\s",
			"captures": {
				"2": {
					"name": "constant.language.statamic"
				}
			}
		},
		"antlers-variable-modifier-name": {
			"match": "(\\s)?(\\|)(\\s)?(\\w+((^:([a-zA-Z0-9-_/-@]+)){1,2})?|((-|\\+|\\*|/|\\^|\\%):(\\d*)?\\.?(\\d+)))+",
			"captures": {
				"2": {
					"name": "keyword.operator.statamic"
				},
				"4": {
					"name": "support.function.statamic"
				}
			}
		},
		"antlers-variable-modifiers": {
			"match": "(\\s)?(\\|)(\\s)?(\\w+((:([a-zA-Z0-9-_/-@]+)){1,2})?|((-|\\+|\\*|/|\\^|\\%):(\\d*)?\\.?(\\d+)))+",
			"captures": {
				"2": {
					"name": "keyword.operator.statamic"
				},
				"4": {
					"name": "support.function.statamic",
					"patterns": [
						{
							"include": "#antlers-expression"
						}
					]
				}
			}
		},
		"statamic-core-tags": {
			"match": "\\G(/?\\w+)+",
			"captures": {
				"1": {
					"name": "variable.statamic",
					"patterns": [
						{
							"include": "#core-tag-names"
						}
					]
				}
			}
		},
        "statamic-explicit-tags": {
			"match": "\\G(/?%\\w+)+",
			"captures": {
				"1": {
                    "name": "entity.name.tag.statamic"
				}
			}
        },
		"statamic-core-closing-tags": {
			"match": "\\/(\\w+)+",
			"captures": {
				"1": {
					"name": "variable.statamic",
					"patterns": [
						{
							"include": "#core-tag-names"
						}
					]
				}
			}
		},
		"antlers-language-operators": {
			"match": "(\\w+)[\\s]",
			"captures": {
				"1": {
					"name": "variable.statamic",
					"patterns": [
						{
							"include": "#antlers-numbers"
						},
						{
							"include": "#language-operators"
						}
					]
				}
			}
		},
		"antlers-variable": {
			"match": "(/?\\w+)(:)?(\\w+)?",
			"captures": {
				"1": {
					"name": "variable.statamic",
					"patterns": []
				},
				"2": {
					"name": "keyword.operator.statamic"
				},
				"3": {
					"name": "variable.statamic",
					"patterns": [
						{
							"include": "$self"
						}
					]
				}
			}
		},
		"antlers-numbers": {
			"match": "0|[1-9](?:_?[0-9]+)*",
			"name": "constant.numeric.statamic"
		},
		"antlers-modifier-pipe": {
			"match": "(\\|)",
			"name": "keyword.operator.other.statamic"
		},
		"core-tag-names": {
			"patterns": [
				{
					"match": "(?i)\\b(taxonomy|collection|asset|form|assets|cache|can|dd|ddd|dump|get_content|get_error|get_errors|get_files|glide|in|increment|installed|is|iterate|foreach|link|locales|markdown|member|mix|nav|not_found|404|obfuscate|parent|partial|path|query|range|loop|redirect|relate|rotate|route|scope|section|session|set|structure|svg|theme|trans|trans_choice|user|users|widont|yields|yield|slot|once|noparse|view)\\b",
					"name": "entity.name.tag.statamic"
				}
			]
		},
		"language-operators": {
			"patterns": [
				{
					"match": "(?i)\\b(pluck|take|skip|arr|orderby|groupby|merge|where|switch|bwa|bwo|bxor|bnot|bsl|bsr|if|elseif|else|void)(\\b)",
					"name": "support.function.array.statamic"
				}
			]
		}
	}
}