%YAML 1.2 --- # http://www.sublimetext.com/docs/3/syntax.html name: HTML (Twig) file_extensions: - twig - html.twig scope: text.html.twig contexts: main: - match: '(<)([a-zA-Z0-9:]++)(?=[^>]*></\2>)' captures: 1: punctuation.definition.tag.html 2: entity.name.tag.html push: - meta_scope: meta.tag.any.html - match: (>(<)/)(\2)(>) captures: 1: punctuation.definition.tag.html 2: meta.scope.between-tag-pair.html 3: entity.name.tag.html 4: punctuation.definition.tag.html pop: true - include: tag-stuff - match: (<\?)(xml) captures: 1: punctuation.definition.tag.html 2: entity.name.tag.xml.html push: - meta_scope: meta.tag.preprocessor.xml.html - match: (\?>) captures: 1: punctuation.definition.tag.html 2: entity.name.tag.xml.html pop: true - include: tag-generic-attribute - include: string-double-quoted - include: string-single-quoted - match: <!-- captures: 0: punctuation.definition.comment.html push: - meta_scope: comment.block.html - match: '--\s*>' captures: 0: punctuation.definition.comment.html pop: true - match: "--" scope: invalid.illegal.bad-comments-or-CDATA.html - include: embedded-code - match: <! captures: 0: punctuation.definition.tag.html push: - meta_scope: meta.tag.sgml.html - match: ">" captures: 0: punctuation.definition.tag.html pop: true - match: (?i:DOCTYPE) captures: 1: entity.name.tag.doctype.html push: - meta_scope: meta.tag.sgml.doctype.html - match: (?=>) captures: 1: entity.name.tag.doctype.html pop: true - match: '"[^">]*"' scope: string.quoted.double.doctype.identifiers-and-DTDs.html - match: '\[CDATA\[' push: - meta_scope: constant.other.inline-data.html - match: "]](?=>)" pop: true - match: (\s*)(?!--|>)\S(\s*) scope: invalid.illegal.bad-comments-or-CDATA.html - include: embedded-code - match: '(?:^\s+)?(<)((?i:style))\b(?![^>]*/>)' captures: 1: punctuation.definition.tag.html 2: entity.name.tag.style.html 3: punctuation.definition.tag.html push: - meta_scope: source.css.embedded.html - match: (</)((?i:style))(>)(?:\s*\n)? captures: 1: punctuation.definition.tag.html 2: entity.name.tag.style.html 3: punctuation.definition.tag.html pop: true - include: tag-stuff - match: (>) captures: 1: punctuation.definition.tag.html push: - match: (?=</(?i:style)) pop: true - include: embedded-code - include: scope:source.css - match: '(?:^\s+)?(<)((?i:script))\b(?![^>]*/>)' captures: 1: punctuation.definition.tag.html 2: entity.name.tag.script.html push: - meta_scope: source.js.embedded.html - match: (?<=</(script|SCRIPT))(>)(?:\s*\n)? captures: 2: punctuation.definition.tag.html pop: true - include: tag-stuff - match: (?<!</(?:script|SCRIPT))(>) captures: 1: punctuation.definition.tag.html 2: entity.name.tag.script.html push: - match: (</)((?i:script)) captures: 1: punctuation.definition.tag.html 2: entity.name.tag.script.html pop: true - match: (//).*?((?=</script)|$\n?) scope: comment.line.double-slash.js captures: 1: punctuation.definition.comment.js - match: /\* captures: 0: punctuation.definition.comment.js push: - meta_scope: comment.block.js - match: \*/|(?=</script) captures: 0: punctuation.definition.comment.js pop: true - include: php - include: twig-print-tag - include: twig-statement-tag - include: twig-comment-tag - include: scope:source.js - match: (</?)((?i:body|head|html)\b) captures: 1: punctuation.definition.tag.html 2: entity.name.tag.structure.any.html push: - meta_scope: meta.tag.structure.any.html - match: (>) captures: 1: punctuation.definition.tag.html 2: entity.name.tag.structure.any.html pop: true - include: tag-stuff - match: (</?)((?i:address|blockquote|dd|div|dl|dt|fieldset|form|frame|frameset|h1|h2|h3|h4|h5|h6|iframe|noframes|object|ol|p|ul|applet|center|dir|hr|menu|pre)\b) captures: 1: punctuation.definition.tag.begin.html 2: entity.name.tag.block.any.html push: - meta_scope: meta.tag.block.any.html - match: (>) captures: 1: punctuation.definition.tag.end.html pop: true - include: tag-stuff - match: (</?)((?i:a|abbr|acronym|area|b|base|basefont|bdo|big|br|button|caption|cite|code|col|colgroup|del|dfn|em|font|head|html|i|img|input|ins|isindex|kbd|label|legend|li|link|map|meta|noscript|optgroup|option|param|q|s|samp|script|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|var)\b) captures: 1: punctuation.definition.tag.begin.html 2: entity.name.tag.inline.any.html push: - meta_scope: meta.tag.inline.any.html - match: "((?: ?/)?>)" captures: 1: punctuation.definition.tag.end.html pop: true - include: tag-stuff - match: "(</?)([a-zA-Z0-9:]+)" captures: 1: punctuation.definition.tag.begin.html 2: entity.name.tag.other.html push: - meta_scope: meta.tag.other.html - match: (>) captures: 1: punctuation.definition.tag.end.html pop: true - include: tag-stuff - include: entities - match: <> scope: invalid.illegal.incomplete.html - match: < scope: invalid.illegal.bad-angle-bracket.html - include: twig-print-tag - include: twig-statement-tag - include: twig-comment-tag embedded-code: - include: ruby - include: php - include: twig-print-tag - include: twig-statement-tag - include: twig-comment-tag - include: python entities: - match: "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)" scope: constant.character.entity.html captures: 1: punctuation.definition.entity.html 3: punctuation.definition.entity.html - match: "&" scope: invalid.illegal.bad-ampersand.html php: - match: (?=(^\s*)?<\?) push: - match: (?!(^\s*)?<\?) pop: true - include: scope:text.html.php python: - match: (?:^\s*)<\?python(?!.*\?>) push: - meta_scope: source.python.embedded.html - match: \?>(?:\s*$\n)? pop: true - include: scope:source.python ruby: - match: "<%+#" captures: 0: punctuation.definition.comment.erb push: - meta_scope: comment.block.erb - match: "%>" captures: 0: punctuation.definition.comment.erb pop: true - match: <%+(?!>)=? captures: 0: punctuation.section.embedded.ruby push: - meta_scope: source.ruby.embedded.html - match: "-?%>" captures: 0: punctuation.section.embedded.ruby pop: true - match: (#).*?(?=-?%>) scope: comment.line.number-sign.ruby captures: 1: punctuation.definition.comment.ruby - include: scope:source.ruby - match: <\?r(?!>)=? captures: 0: punctuation.section.embedded.ruby.nitro push: - meta_scope: source.ruby.nitro.embedded.html - match: '-?\?>' captures: 0: punctuation.section.embedded.ruby.nitro pop: true - match: (#).*?(?=-?\?>) scope: comment.line.number-sign.ruby.nitro captures: 1: punctuation.definition.comment.ruby.nitro - include: scope:source.ruby string-double-quoted: - match: '"' captures: 0: punctuation.definition.string.begin.html push: - meta_scope: string.quoted.double.html - match: '"' captures: 0: punctuation.definition.string.end.html pop: true - include: embedded-code - include: entities string-single-quoted: - match: "'" captures: 0: punctuation.definition.string.begin.html push: - meta_scope: string.quoted.single.html - match: "'" captures: 0: punctuation.definition.string.end.html pop: true - include: embedded-code - include: entities tag-generic-attribute: - match: '\b([a-zA-Z\-:]+)' scope: entity.other.attribute-name.html tag-id-attribute: - match: \b(id)\b\s*(=) captures: 1: entity.other.attribute-name.id.html 2: punctuation.separator.key-value.html push: - meta_scope: meta.attribute-with-value.id.html - match: (?<='|") captures: 1: entity.other.attribute-name.id.html 2: punctuation.separator.key-value.html pop: true - match: '"' captures: 0: punctuation.definition.string.begin.html push: - meta_scope: string.quoted.double.html - meta_content_scope: meta.toc-list.id.html - match: '"' captures: 0: punctuation.definition.string.end.html pop: true - include: embedded-code - include: entities - match: "'" captures: 0: punctuation.definition.string.begin.html push: - meta_scope: string.quoted.single.html - meta_content_scope: meta.toc-list.id.html - match: "'" captures: 0: punctuation.definition.string.end.html pop: true - include: embedded-code - include: entities tag-stuff: - include: tag-id-attribute - include: tag-generic-attribute - include: string-double-quoted - include: string-single-quoted - include: embedded-code twig-arrays: - match: '(?<=[\s\(\{\[:,])\[' captures: 0: punctuation.section.array.begin.twig push: - meta_scope: meta.array.twig - match: '\]' captures: 0: punctuation.section.array.end.twig pop: true - include: twig-arrays - include: twig-hashes - include: twig-constants - include: twig-strings - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-objects - include: twig-properties - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - match: "," scope: punctuation.separator.object.twig twig-comment-tag: - match: '\{#-?' captures: 0: punctuation.definition.comment.begin.twig push: - meta_scope: comment.block.twig - match: '-?#\}' captures: 0: punctuation.definition.comment.end.twig pop: true twig-constants: - match: '(?i)(?<=[\s\[\(\{:,])(?:true|false|null|none)(?=[\s\)\]\}\,])' scope: constant.language.twig - match: '(?<=[\s\[\(\{:,]|\.\.|\*\*)[0-9]+(?:\.[0-9]+)?(?=[\s\)\]\}\,]|\.\.|\*\*)' scope: constant.numeric.twig twig-filters: - match: '(?<=(?:[a-zA-Z0-9_\x{7f}-\x{ff}\]\)\''\"]\|)|\{%\sfilter\s)(abs|capitalize|e(?:scape)?|first|join|(?:json|url)_encode|keys|last|length|lower|nl2br|number_format|raw|reverse|round|sort|striptags|title|trim|upper)(?=[\s\|\]\}\):,]|\.\.|\*\*)' captures: 1: support.function.twig twig-filters-ud: - match: '(?<=(?:[a-zA-Z0-9_\x{7f}-\x{ff}\]\)\''\"]\|)|\{%\sfilter\s)([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)' captures: 1: meta.function-call.other.twig twig-filters-warg: - match: '(?<=(?:[a-zA-Z0-9_\x{7f}-\x{ff}\]\)\''\"]\|)|\{%\sfilter\s)(batch|convert_encoding|date|date_modify|default|e(?:scape)?|format|join|merge|number_format|replace|round|slice|split|trim)(\()' captures: 1: support.function.twig 2: punctuation.definition.parameters.begin.twig push: - meta_content_scope: meta.function.arguments.twig - match: \) captures: 0: punctuation.definition.parameters.end.twig pop: true - include: twig-constants - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-objects - include: twig-properties - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - include: twig-strings - include: twig-arrays - include: twig-hashes twig-filters-warg-ud: - match: '(?<=(?:[a-zA-Z0-9_\x{7f}-\x{ff}\]\)\''\"]\|)|\{%\sfilter\s)([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(\()' captures: 1: meta.function-call.other.twig 2: punctuation.definition.parameters.begin.twig push: - meta_content_scope: meta.function.arguments.twig - match: \) captures: 0: punctuation.definition.parameters.end.twig pop: true - include: twig-constants - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-objects - include: twig-properties - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - include: twig-strings - include: twig-arrays - include: twig-hashes twig-functions: - match: (?<=is\s)(defined|empty|even|iterable|odd) captures: 1: support.function.twig twig-functions-warg: - match: '(?<=[\s\(\[\{:,])(attribute|block|constant|cycle|date|divisible by|dump|include|max|min|parent|random|range|same as|source|template_from_string)(\()' captures: 1: support.function.twig 2: punctuation.definition.parameters.begin.twig push: - meta_content_scope: meta.function.arguments.twig - match: \) captures: 0: punctuation.definition.parameters.end.twig pop: true - include: twig-constants - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-objects - include: twig-properties - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - include: twig-strings - include: twig-arrays twig-hashes: - match: '(?<=[\s\(\{\[:,])\{' captures: 0: punctuation.section.hash.begin.twig push: - meta_scope: meta.hash.twig - match: '\}' captures: 0: punctuation.section.hash.end.twig pop: true - include: twig-hashes - include: twig-arrays - include: twig-constants - include: twig-strings - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-objects - include: twig-properties - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - match: ":" scope: punctuation.separator.key-value.twig - match: "," scope: punctuation.separator.object.twig twig-keywords: - match: (?<=\s)((?:end)?(?:autoescape|block|embed|filter|for|if|macro|raw|sandbox|set|spaceless|trans|verbatim)|as|do|else|elseif|extends|flush|from|ignore missing|import|include|only|use|with)(?=\s) scope: keyword.control.twig twig-macros: - match: |- (?x) (?<=[\s\(\[\{:,]) ([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*) (?: (\.)([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*) )? (\() captures: 1: meta.function-call.twig 2: punctuation.separator.property.twig 3: variable.other.property.twig 4: punctuation.definition.parameters.begin.twig push: - meta_content_scope: meta.function.arguments.twig - match: \) captures: 0: punctuation.definition.parameters.end.twig pop: true - include: twig-constants - include: twig-operators - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-objects - include: twig-properties - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - include: twig-strings - include: twig-arrays - include: twig-hashes twig-objects: - match: '(?<=[\s\{\[\(:,])([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(?=[\s\}\[\]\(\)\.\|,:])' captures: 1: variable.other.twig twig-operators: - match: (?<=\s)(\+|-|//?|%|\*\*?)(?=\s) captures: 1: keyword.operator.arithmetic.twig - match: (?<=\s)(=|~)(?=\s) captures: 1: keyword.operator.assignment.twig - match: (?<=\s)(b-(?:and|or|xor))(?=\s) captures: 1: keyword.operator.bitwise.twig - match: '(?<=\s)((?:!|=)=|<=?|>=?|(?:not )?in|is(?: not)?|(?:ends|starts) with|matches)(?=\s)' captures: 1: keyword.operator.comparison.twig - match: (?<=\s)(\?|:|and|not|or)(?=\s) captures: 1: keyword.operator.logical.twig - match: '(?<=[a-zA-Z0-9_\x{7f}-\x{ff}\]\)''"])\.\.(?=[a-zA-Z0-9_\x{7f}-\x{ff}''"])' captures: 0: keyword.operator.other.twig - match: '(?<=[a-zA-Z0-9_\x{7f}-\x{ff}\]\}\)''"])\|(?=[a-zA-Z_\x{7f}-\x{ff}])' captures: 0: keyword.operator.other.twig twig-print-tag: - match: '\{\{-?' captures: 0: punctuation.section.tag.twig push: - meta_scope: meta.tag.template.value.twig - match: '-?\}\}' captures: 0: punctuation.section.tag.twig pop: true - include: twig-constants - include: twig-operators - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-objects - include: twig-properties - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - include: twig-strings - include: twig-arrays - include: twig-hashes twig-properties: - match: |- (?x) (?<=[a-zA-Z0-9_\x{7f}-\x{ff}]) (\.)([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*) (?=[\.\s\|\[\)\]\}:,]) captures: 1: punctuation.separator.property.twig 2: variable.other.property.twig - match: |- (?x) (?<=[a-zA-Z0-9_\x{7f}-\x{ff}]) (\.)([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*) (\() captures: 1: punctuation.separator.property.twig 2: variable.other.property.twig 3: punctuation.definition.parameters.begin.twig push: - meta_content_scope: meta.function.arguments.twig - match: \) captures: 0: punctuation.definition.parameters.end.twig pop: true - include: twig-constants - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-objects - include: twig-properties - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - include: twig-strings - include: twig-arrays - match: |- (?x) (?<=[a-zA-Z0-9_\x{7f}-\x{ff}\]]) (?: (\[)('[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*')(\]) |(\[)("[a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*")(\]) |(\[)([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*)(\]) ) captures: 1: punctuation.section.array.begin.twig 2: variable.other.property.twig 3: punctuation.section.array.end.twig 4: punctuation.section.array.begin.twig 5: variable.other.property.twig 6: punctuation.section.array.end.twig 7: punctuation.section.array.begin.twig 8: variable.other.property.twig 9: punctuation.section.array.end.twig twig-statement-tag: - match: '\{%-?' captures: 0: punctuation.section.tag.twig push: - meta_scope: meta.tag.template.block.twig - match: '-?%\}' captures: 0: punctuation.section.tag.twig pop: true - include: twig-constants - include: twig-keywords - include: twig-operators - include: twig-functions-warg - include: twig-functions - include: twig-macros - include: twig-filters-warg - include: twig-filters - include: twig-filters-warg-ud - include: twig-filters-ud - include: twig-objects - include: twig-properties - include: twig-strings - include: twig-arrays - include: twig-hashes twig-strings: - match: (?:(?<!\\)|(?<=\\\\))' captures: 0: punctuation.definition.string.begin.twig push: - meta_scope: string.quoted.single.twig - match: (?:(?<!\\)|(?<=\\\\))' captures: 0: punctuation.definition.string.end.twig pop: true - match: (?:(?<!\\)|(?<=\\\\))" captures: 0: punctuation.definition.string.begin.twig push: - meta_scope: string.quoted.double.twig - match: (?:(?<!\\)|(?<=\\\\))" captures: 0: punctuation.definition.string.end.twig pop: true