{
	"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
	"name": "Factorio Locale",
	"repository": {
		"parameter" : {
			"patterns": [
				{
					"match": "(__)(\\d+)(__)",
					"captures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "variable.parameter.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.end.factorio-locale"}
					}
				},
				{
					"name": "meta.plural.factorio-locale",
					"match": "(__)(plural_for_parameter)(__)([0-9]+)(__\\{)(.*?)(\\}__)",
					"captures": {
						"1": {"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2": {"name": "support.function.plural.factorio-locale"},
						"3": {"name": "punctuation.definition.tag.middle.factorio-locale"},
						"4": {"name": "variable.parameter.factorio-locale"},
						"5": {"name": "punctuation.definition.tag.middle.factorio-locale"},
						"6": {
							"name": "meta.plural-options.factorio-locale",
							"patterns": [
								{
									"name":"keyword.operator.factorio-locale",
									"match": "\\|"
								},
								{
									"match": "([^=|]+)(=)([^|]*)",
									"captures": {
										"1":{
											"patterns": [
												{
													"name": "keyword.control.plural.rest.factorio-locale",
													"match": "rest"
												},
												{
													"match": "(ends in )?(\\d+(-\\d+)?)",
													"captures": {
														"1": { "name": "keyword.control.plural.endsin.factorio-locale" },
														"2": { "name": "constant.numeric.plural.factorio-locale" }
													}
												},
												{
													"name":"keyword.operator.factorio-locale",
													"match": ","
												},
												{
													"name":"invalid.illegal.plural.factorio-locale",
													"match": ".+"
												}
											]
										},
										"2": {"name": "punctuation.separator.key-value.factorio-locale"},
										"3": {
											"name": "meta.text.plural.factorio-locale",
											"patterns": [{"include": "#localisedSegment"}]
										}
									}
								},
								{
									"name":"invalid.illegal.plural.factorio-locale",
									"match": ".+"
								}
							]
						},
						"7": {"name": "punctuation.definition.tag.end.factorio-locale"}
					}
				}
			]
		},
		"localisedSegment" : {
			"patterns": [
				{
					"name": "constant.character.escape.factorio-locale",
					"match": "\\\\n"
				},
				{ "include": "#parameter" },
				{
					"match": "(__)(CONTROL_(?:MOVE|(?:LEFT|RIGHT)_CLICK|KEY_(?:SHIFT|CTRL)|STYLE_(?:BEGIN|END)))(__)",
					"captures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.namespace.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.end.factorio-locale"}
					}
				},
				{
					"match": "(__)(CONTROL(?:_MODIFIER)?|ENTITY|ITEM|TILE|FLUID|PLANET)(__)(.+?)(__)",
					"captures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.namespace.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.middle.factorio-locale"},
						"4":{"name": "string.unquoted.factorio-locale"},
						"5":{"name": "punctuation.definition.tag.end.factorio-locale"}
					}
				},
				{
					"match": "(__)(ALT_CONTROL)(__)(\\d+)(__)(.+?)(__)",
					"captures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.namespace.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.middle.factorio-locale"},
						"4":{"name": "constant.numeric.alt-control.factorio-locale"},
						"5":{"name": "punctuation.definition.tag.middle.factorio-locale"},
						"6":{"name": "string.unquoted.factorio-locale"},
						"7":{"name": "punctuation.definition.tag.end.factorio-locale"}
					}
				},
				{
					"match": "(__)(ALT_CONTROL_(?:LEFT|RIGHT)_CLICK)(__)(\\d+)(__)",
					"captures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.namespace.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.middle.factorio-locale"},
						"4":{"name": "constant.numeric.alt-control.factorio-locale"},
						"5":{"name": "punctuation.definition.tag.middle.factorio-locale"}
					}
				},
				{
					"match": "(__)(REMARK_COLOR_(?:BEGIN|END))(__)",
					"captures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.namespace.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.end.factorio-locale"}
					}
				},
				{
					"begin": "(\\[)(font)(=)([^\\]]*)(\\])",
					"beginCaptures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.tag.font.factorio-locale"},
						"3":{"name": "punctuation.separator.key-value.factorio-locale"},
						"4":{
							"name": "string.unquoted.factorio-locale",
							"patterns": [{ "include": "#parameter" }]
						},
						"5":{"name": "punctuation.definition.tag.end.factorio-locale"}
					},
					"end": "(\\[[./])(font)(\\])",
					"endCaptures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.tag.font.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.end.factorio-locale"}
					},
					"patterns": [{"include": "#localisedSegment"}]
				},
				{
					"begin": "(\\[)(color)(=)([^\\]]*)(\\])",
					"beginCaptures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.tag.color.factorio-locale"},
						"3":{"name": "punctuation.separator.key-value.factorio-locale"},
						"4":{
							"name": "string.unquoted.factorio-locale",
							"patterns": [{ "include": "#parameter" }]
						},
						"5":{"name": "punctuation.definition.tag.end.factorio-locale"}
					},
					"end": "(\\[[./])(color)(\\])",
					"endCaptures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.tag.color.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.end.factorio-locale"}
					},
					"patterns": [{"include": "#localisedSegment"}]
				},
				{
					"match": "(\\[)(img|(?:special-)?item(?:-group)?|entity|technology|recipe|fluid|tile|virtual-signal|achievement|gps|armor|train(?:-stop)?|space-(?:location|platform)|planet|quality|asteroid-chunk|shortcut|(?:tool)tip)(=)([^\\]]*)(\\])",
					"captures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.tag.factorio-locale"},
						"3":{"name": "punctuation.separator.key-value.factorio-locale"},
						"4":{
							"name": "string.unquoted.factorio-locale",
							"patterns": [{ "include": "#parameter" }]
						},
						"5":{"name": "punctuation.definition.tag.end.factorio-locale"}
					}
				},
				{
					"match": "(\\[)(space-age)(\\])",
					"captures": {
						"1":{"name": "punctuation.definition.tag.begin.factorio-locale"},
						"2":{"name": "entity.name.tag.factorio-locale"},
						"3":{"name": "punctuation.definition.tag.end.factorio-locale"}
					}
				}
			]
		}

	},
	"patterns": [
		{
			"contentName": "entity.name.namespace.factorio-locale",
			"begin": "^[ \t\r]*(\\[)",
			"beginCaptures": {
				"1":{"name":"punctuation.definition.tag.begin.factorio-locale"}
			},
			"end": "(\\])[ \t\r]*$",
			"endCaptures": {
				"1":{"name":"punctuation.definition.tag.end.factorio-locale"}
			}
		},
		{
			"match": "^[ \t\r]*[#;].*$",
			"name": "comment.line.factorio-locale"
		},
		{
			"match": "^[ \t\r]*(.*?)(=)(.*)$",
			"name": "meta.record.factorio-locale",
			"captures": {
				"1": {"name": "variable.factorio-locale"},
				"2": {"name": "punctuation.separator.key-value.factorio-locale"},
				"3": {
					"name": "meta.text.factorio-locale",
					"patterns": [{"include": "#localisedSegment"}]
				}
			}
		},
		{
			"match": "^.*$",
			"name":"invalid.unknown-line.factorio-locale"
		}
	],
	"scopeName": "source.factorio-locale"
}