{ "name": "Closure Templates", "scopeName": "text.html.soy", "patterns": [ { "include": "#alias" }, { "include": "#delpackage" }, { "include": "#namespace" }, { "include": "#template" }, { "include": "#comment" } ], "repository": { "alias": { "match": "{(alias)\\s+([\\w\\.]+)(?:\\s+(as)\\s+(\\w+))?}", "captures": { "1": { "name": "storage.type.soy" }, "2": { "name": "entity.name.type.soy" }, "3": { "name": "storage.type.soy" }, "4": { "name": "entity.name.type.soy" } } }, "attribute": { "match": "(\\w+)=(\"(?:\\\\?.)*?\")", "captures": { "1": { "name": "storage.other.attribute.soy" }, "2": { "name": "string.double.quoted.soy" } } }, "body": { "patterns": [ { "include": "#comment" }, { "include": "#let" }, { "include": "#call" }, { "include": "#css" }, { "include": "#xid" }, { "include": "#condition" }, { "include": "#condition-control" }, { "include": "#for" }, { "include": "#literal" }, { "include": "#msg" }, { "include": "#special-character" }, { "include": "#print" }, { "include": "text.html.basic" } ] }, "boolean": { "name": "language.constant.boolean.soy", "match": "true|false" }, "call": { "patterns": [ { "begin": "{((?:del)?call)\\s+([\\w\\.]+)(?=[^/]*?})", "end": "{/(\\1)}", "patterns": [ { "include": "#comment" }, { "include": "#variant" }, { "include": "#attribute" }, { "include": "#param" } ], "beginCaptures": { "1": { "name": "storage.type.function.soy" }, "2": { "name": "entity.name.function.soy" } }, "endCaptures": { "1": { "name": "storage.type.function.soy" } } }, { "begin": "{((?:del)?call)(\\s+[\\w\\.]+)", "end": "/}", "patterns": [ { "include": "#variant" }, { "include": "#attribute" } ], "beginCaptures": { "1": { "name": "storage.type.function.soy" }, "2": { "name": "entity.name.function.soy" } } } ] }, "comment": { "patterns": [ { "name": "comment.block.documentation.soy", "begin": "/\\*", "end": "\\*/", "patterns": [ { "match": "(@param\\??)\\s+(\\S+)", "captures": { "1": { "name": "keyword.parameter.soy" }, "2": { "name": "variable.parameter.soy" } } } ] }, { "name": "comment.line.double-slash.soy", "match": "^\\s*(\\/\\/.*)$" } ] }, "condition": { "begin": "{/?(if|elseif|switch|case)\\s*", "end": "}", "patterns": [ { "include": "#attribute" }, { "include": "#expression" } ], "beginCaptures": { "1": { "name": "keyword.control.soy" } } }, "condition-control": { "match": "{(else|ifempty|default)}", "captures": { "1": { "name": "keyword.control.soy" } } }, "css": { "begin": "{(css)\\s+", "end": "}", "patterns": [ { "include": "#expression" } ], "beginCaptures": { "1": { "name": "keyword.other.soy" } } }, "delpackage": { "match": "{(delpackage)\\s+([\\w\\.]+)}", "captures": { "1": { "name": "storage.type.soy" }, "2": { "name": "entity.name.type.soy" } } }, "expression": { "patterns": [ { "include": "#boolean" }, { "include": "#number" }, { "include": "#function" }, { "include": "#null" }, { "include": "#string" }, { "include": "#variable-ref" }, { "include": "#operator" } ] }, "for": { "begin": "{/?(foreach|for)(?=\\s|})", "end": "}", "patterns": [ { "name": "keyword.control.soy", "match": "in" }, { "include": "#expression" }, { "include": "#body" } ], "beginCaptures": { "1": { "name": "keyword.control.soy" } } }, "function": { "begin": "(\\w+)\\(", "end": "\\)", "patterns": [ { "include": "#expression" } ], "beginCaptures": { "1": { "name": "support.function.soy" } } }, "let": { "patterns": [ { "begin": "{(let)\\s+(\\$\\w+\\s*:)", "end": "/}", "patterns": [ { "include": "#comment" }, { "include": "#expression" } ], "beginCaptures": { "1": { "name": "storage.type.soy" }, "2": { "name": "variable.soy" } } }, { "begin": "{(let)\\s+(\\$\\w+)", "end": "{/(\\1)}", "patterns": [ { "include": "#attribute" }, { "include": "#body" } ], "beginCaptures": { "1": { "name": "storage.type.soy" }, "2": { "name": "variable.soy" } }, "endCaptures": { "1": { "name": "storage.type.soy" } } } ] }, "literal": { "name": "meta.literal", "begin": "{(literal)}", "end": "{/(\\1)}", "beginCaptures": { "1": { "name": "keyword.other.soy" } }, "endCaptures": { "1": { "name": "keyword.other.soy" } } }, "msg": { "match": "{/?(msg|fallbackmsg)", "end": "}", "patterns": [ { "include": "#attribute" } ], "captures": { "1": { "name": "keyword.other.soy" } } }, "namespace": { "match": "{(namespace)\\s+([\\w\\.]+)}", "captures": { "1": { "name": "storage.type.soy" }, "2": { "name": "entity.name.type.soy" } } }, "null": { "name": "language.constant.null.soy", "match": "null" }, "number": { "name": "language.constant.numeric", "match": "-?\\.?\\d+|\\d[\\.\\d]*" }, "operator": { "name": "keyword.operator.soy", "match": "-|not|\\*|\\/|%|\\+|\u003c=|\u003e=|\u003c|\u003e|==|!=|and|or|\\?:|\\?|:" }, "param": { "patterns": [ { "begin": "{(param)\\s+(\\w+\\s*\\:)", "end": "/}", "patterns": [ { "include": "#expression" } ], "beginCaptures": { "1": { "name": "storage.type.soy" }, "2": { "name": "variable.parameter.soy" } } }, { "begin": "{(param)\\s+(\\w+)", "end": "{/(\\1)}", "patterns": [ { "include": "#attribute" }, { "include": "#body" } ], "beginCaptures": { "1": { "name": "storage.type.soy" }, "2": { "name": "variable.parameter.soy" } }, "endCaptures": { "1": { "name": "storage.type.soy" } } } ] }, "print": { "begin": "{(print)?\\s*", "end": "}", "patterns": [ { "match": "\\|\\s*(changeNewlineToBr|truncate|bidiSpanWrap|bidiUnicodeWrap)", "captures": { "1": { "name": "support.function.soy" } } }, { "include": "#expression" } ], "beginCaptures": { "1": { "name": "keyword.other.soy" } } }, "special-character": { "match": "{(sp|nil|\\\\r|\\\\n|\\\\t|lb|rb)}", "captures": { "1": { "name": "language.support.constant" } } }, "string": { "name": "string.quoted.single.soy", "begin": "'", "end": "'", "patterns": [ { "name": "constant.character.escape.soy", "match": "\\\\(?:[\\\\'\"nrtbf]|u[0-9a-fA-F]{4})" } ] }, "template": { "begin": "{(template|deltemplate)\\s([\\w\\.]+)", "end": "{(/\\1)}", "patterns": [ { "name": "meta.parameter.soy", "begin": "{(@param)(\\??)\\s+(\\S+\\s*:)", "end": "}", "patterns": [ { "include": "#type" } ], "beginCaptures": { "1": { "name": "keyword.parameter.soy" }, "2": { "name": "storage.modifier.keyword.operator.soy" }, "3": { "name": "variable.parameter.soy" } } }, { "include": "#variant" }, { "include": "#body" }, { "include": "#attribute" } ], "beginCaptures": { "1": { "name": "storage.type.soy" }, "2": { "name": "entity.name.function.soy" } }, "endCaptures": { "1": { "name": "storage.type.soy" } } }, "type": { "patterns": [ { "name": "support.type.soy", "match": "any|null|\\?|string|bool|int|float|number|html|uri|js|css|attributes" }, { "begin": "(list|map)(\u003c)", "end": "(\u003e)", "patterns": [ { "include": "#type" } ], "beginCaptures": { "1": { "name": "support.type.soy" }, "2": { "name": "support.type.punctuation.soy" } }, "endCaptures": { "1": { "name": "support.type.modifier.soy" } } } ] }, "variable-ref": { "name": "variable.other.soy", "match": "\\$[\\a-zA-Z_][\\w\\.]*" }, "variant": { "contentName": "string.double.quoted.soy", "begin": "(variant)=(\")", "end": "(\")", "patterns": [ { "include": "#expression" } ], "beginCaptures": { "1": { "name": "storage.other.attribute.soy" }, "2": { "name": "string.double.quoted.soy" } }, "endCaptures": { "1": { "name": "string.double.quoted.soy" } } }, "xid": { "begin": "{(xid)\\s+", "end": "}", "patterns": [ { "include": "#expression" } ], "beginCaptures": { "1": { "name": "keyword.other.soy" } } } }, "injections": { "meta.tag": { "patterns": [ { "include": "#body" } ] } } }