name: "Spline Font Database"
scopeName: "text.sfd"
fileTypes: ["sfd"]
firstLineMatch: "^SplineFontDB: [\\d.]+"
patterns: [include: "#main"]

repository:
	main:
		patterns: [
			{include: "#punctuation"}
			{include: "#private"}
			{include: "#image"}
			{include: "#pickleData"}
			{include: "#sections"}
			{include: "#copyright"}
			{include: "#property"}
			{include: "#control"}
			{include: "#address"}
			{include: "#encoding"}
			{include: "source.fontforge#shared"}
			{include: "#colour"}
		]
	
	punctuation:
		patterns: [
			{match: "<|>",  name: "punctuation.definition.brackets.angle.sfd"}
			{match: "[{}]", name: "punctuation.definition.brackets.curly.sfd"}
		]

	private:
		name: "meta.section.private.sfd"
		begin: "^BeginPrivate(?=:)"
		end:   "^EndPrivate\\b"
		beginCaptures: 0: name: "keyword.control.begin.private.sfd"
		endCaptures:   0: name: "keyword.control.end.private.sfd"
		patterns: [
			{match: "^\\S+", name: "entity.name.private.property.sfd"}
			{include: "$self"}
		]
	
	image:
		name: "meta.image.sfd"
		begin: "^(Image)(?=:)(.+)$"
		end:   "^(EndImage)\\b"
		contentName: "string.unquoted.raw.data.sfd"
		beginCaptures:
			1: name: "keyword.control.begin.image.sfd"
			2: patterns: [include: "$self"]
		endCaptures:
			1: name: "keyword.control.end.image.sfd"

	pickleData:
		name: "meta.pickle-data.sfd"
		begin: "^(PickledData)(:)\\s*(\")"
		end:   '"'
		beginCaptures:
			1: name: "entity.name.property.sfd"
			2: name: "punctuation.separator.dictionary.key-value.sfd"
			3: name: "punctuation.definition.string.begin.sfd"
		endCaptures:
			0: name: "punctuation.definition.string.end.sfd"
		patterns: [match: "\\\\.", name: "constant.character.escape.sfd"]

	sections:
		name: "meta.section.${2:/downcase}.sfd"
		begin: "^(Start|Begin)([A-Z]\\w+)(?=:)"
		end:   "^(End\\2)\\b"
		beginCaptures: 0: name: "keyword.control.begin.${2:/downcase}.sfd"
		endCaptures:   0: name: "keyword.control.end.${2:/downcase}.sfd"
		patterns: [include: "$self"]

	control:
		name: "keyword.control.${1:/downcase}.sfd"
		match: "\\b(Fore|Back|SplineSet|^End\\w+)\\b"

	colour:
		name: "constant.other.hex.colour.sfd"
		match: "(#)[A-Fa-f0-9]{3,}|(?<=\\s)[A-Fa-f0-9]{6,8}"
		captures:
			1: name: "punctuation.definition.colour.sfd"

	encoding:
		name: "constant.language.encoding.sfd"
		match: "(?i)\\b(ISO[-\\w]+)(?<=\\d)(?=\\s|$)"

	# Don't highlight numbers in freeform strings (years/version strings)
	copyright:
		name: "meta.${1:/downcase}-string.sfd"
		begin: "^(Copyright|U?Comments?|\\w+Name)(:)"
		end:   "$"
		beginCaptures:
			1: name: "entity.name.property.sfd"
			2: name: "punctuation.separator.dictionary.key-value.sfd"
		patterns: [include: "source.fontforge#stringEscapes"]
	
	# No idea what this is, but it looks distracting without a fix
	# Assuming it's referring to a memory register or something.
	address:
		match: "\\d+[xX][A-Fa-f0-9]+"
		name: "constant.numeric.hexadecimal.sfd"
	
	property:
		match: "^([^:]+)(:)"
		name: "meta.dictionary.key-value.sfd"
		captures:
			1: name: "entity.name.property.sfd"
			2: name: "punctuation.separator.dictionary.key-value.sfd"
	
