{ "name": "FontForge Script", "scopeName": "source.fontforge", "fileTypes": [ "pe" ], "firstLineMatch": "/#!\\bfontforge\\b", "patterns": [ { "include": "#main" } ], "repository": { "main": { "patterns": [ { "include": "#comments" }, { "include": "#codepoint" }, { "include": "#strings" }, { "include": "#control" }, { "include": "#real" }, { "include": "#integer" }, { "include": "#operators" }, { "include": "#procedureCall" }, { "include": "#punctuation" }, { "include": "#variables" } ] }, "comments": { "patterns": [ { "name": "comment.line.number-sign.fontforge", "begin": "#", "end": "$", "beginCaptures": { "0": { "name": "punctuation.definition.comment.fontforge" } } }, { "name": "comment.block.fontforge", "begin": "/\\*", "end": "\\*/", "beginCaptures": { "0": { "name": "punctuation.definition.comment.begin.fontforge" } }, "endCaptures": { "0": { "name": "punctuation.definition.comment.end.fontforge" } } }, { "name": "comment.line.double-slash", "begin": "//", "end": "$", "beginCaptures": { "0": { "name": "punctuation.definition.comment.fontforge" } } } ] }, "shared": { "patterns": [ { "include": "#codepoint" }, { "include": "#strings" }, { "include": "#real" }, { "include": "#integer" }, { "include": "#punctuation" }, { "include": "#operators" } ] }, "strings": { "patterns": [ { "name": "string.double.quoted.fontforge", "begin": "\"", "end": "\"|$", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.fontforge" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.fontforge" } }, "patterns": [ { "include": "#stringEscapes" } ] }, { "name": "string.single.quoted.fontforge", "begin": "'", "end": "'|$", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.fontforge" } }, "endCaptures": { "0": { "name": "punctuation.definition.string.end.fontforge" } }, "patterns": [ { "include": "#stringEscapes" } ] } ] }, "stringEscapes": { "patterns": [ { "name": "constant.character.escape.newline.fontforge", "match": "\\\\n" } ] }, "control": { "name": "keyword.control.$1.fontforge", "match": "\\b(if|elseif|else|endif|while|endloop|foreach|break|return|shift)\\b" }, "operators": { "patterns": [ { "match": "==|!=|>=|<=|>|<", "name": "keyword.operator.comparison.fontforge" }, { "match": "=|[-+*/%]=", "name": "keyword.operator.assignment.compound.fontforge" }, { "match": "--", "name": "keyword.operator.decrement.fontforge" }, { "match": "\\+{2}", "name": "keyword.operator.increment.fontforge" }, { "match": "[-+/*~!]", "name": "keyword.operator.arithmetic.fontforge" }, { "match": "&&|\\|\\|", "name": "keyword.operator.logical.fontforge" }, { "match": "&|\\||\\\\\\^", "name": "keyword.operator.bitwise.fontforge" }, { "match": ":[htre]", "name": "keyword.operator.pathspec.fontforge", "captures": { "0": { "patterns": [ { "include": "#punctuation" } ] } } } ] }, "procedureCall": { "name": "meta.function-call.fontforge", "begin": "(\\w+)\\s*(\\()", "end": "\\)", "contentName": "meta.function-call.arguments.fontforge", "beginCaptures": { "1": { "name": "entity.name.function.fontforge" }, "2": { "name": "punctuation.definition.arguments.begin.bracket.round.fontforge" } }, "endCaptures": { "0": { "name": "punctuation.definition.arguments.end.bracket.round.fontforge" } }, "patterns": [ { "include": "$base" } ] }, "punctuation": { "patterns": [ { "match": ",", "name": "punctuation.separator.comma.fontforge" }, { "match": ";", "name": "punctuation.terminator.statement.fontforge" }, { "match": ":", "name": "punctuation.delimiter.colon.fontforge" }, { "name": "meta.expression.chained.fontforge", "begin": "\\[", "end": "\\]", "beginCaptures": { "0": { "name": "punctuation.bracket.begin.square.fontforge" } }, "endCaptures": { "0": { "name": "punctuation.bracket.end.square.fontforge" } }, "patterns": [ { "include": "$base" } ] }, { "name": "meta.expression.fontforge", "begin": "\\(", "end": "\\)", "beginCaptures": { "0": { "name": "punctuation.bracket.begin.round.fontforge" } }, "endCaptures": { "0": { "name": "punctuation.bracket.end.round.fontforge" } }, "patterns": [ { "include": "$base" } ] } ] }, "codepoint": { "name": "constant.numeric.other.codepoint.fontforge", "match": "o[uU][A-Fa-f0-9]+" }, "real": { "name": "constant.numeric.float.fontforge", "match": "(?<!\\w)[-+]?\\d*\\.\\d+" }, "integer": { "patterns": [ { "match": "(?<!\\w)[-+]?0[Xx][A-Fa-f0-9]+", "name": "constant.numeric.integer.hexadecimal.fontforge" }, { "match": "(?<!\\w)[-+]?(?=0)\\d+", "name": "constant.numeric.integer.octal.fontforge" }, { "match": "(?<!\\w)[-+]?\\d+", "name": "constant.numeric.integer.decimal.fontforge" } ] }, "variables": { "patterns": [ { "name": "variable.language.readonly.positional.fontforge", "match": "(\\$)\\d+(?=\\W)", "captures": { "1": { "name": "punctuation.definition.variable.fontforge" } } }, { "name": "variable.language.readonly.fontforge", "match": "(\\$)\\w+", "captures": { "1": { "name": "punctuation.definition.variable.fontforge" } } }, { "name": "variable.other.global.fontforge", "match": "(_)\\w+", "captures": { "1": { "name": "punctuation.definition.variable.fontforge" } } }, { "name": "variable.other.font.fontforge", "match": "(@)\\w+", "captures": { "1": { "name": "punctuation.definition.variable.fontforge" } } }, { "name": "variable.other.local.fontforge", "match": "(?=[A-Za-z])\\w+" } ] } } }