blob: fa32c05f17860b7349140c086ba9633351c31bbe [file] [log] [blame]
Gregory Anders202c4672024-09-17 20:12:47 +02001" Vim syntax file
2" Language: Jinja
3" Maintainer: Gregory Anders
4" Upstream: https://gitlab.com/HiPhish/jinja.vim
Gregory Anders5e53fca2024-10-16 21:30:01 +02005" Last Change: 2024 Oct 16
Gregory Anders202c4672024-09-17 20:12:47 +02006
Gregory Anders5e53fca2024-10-16 21:30:01 +02007if exists('b:current_syntax') && b:current_syntax =~? 'jinja'
Gregory Anders202c4672024-09-17 20:12:47 +02008 finish
9endif
10
11syntax case match
12syntax sync fromstart
13
14" Jinja template built-in tags and parameters (without filter, macro, is and raw, they
15" have special threatment)
16syn keyword jinjaStatement containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained and if else in not or recursive as import
17
18syn keyword jinjaStatement containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained is filter skipwhite nextgroup=jinjaFilter
19syn keyword jinjaStatement containedin=jinjaTagBlock contained macro skipwhite nextgroup=jinjaFunction
20syn keyword jinjaStatement containedin=jinjaTagBlock contained block skipwhite nextgroup=jinjaBlockName
21
22" Variable Names
23syn match jinjaVariable containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[a-zA-Z_][a-zA-Z0-9_]*/
24syn keyword jinjaSpecial containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained false true none False True None loop super caller varargs kwargs
25
26" Filters
27syn match jinjaOperator "|" containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained skipwhite nextgroup=jinjaFilter
28syn match jinjaFilter contained /[a-zA-Z_][a-zA-Z0-9_]*/
29syn match jinjaFunction contained /[a-zA-Z_][a-zA-Z0-9_]*/
30syn match jinjaBlockName contained /[a-zA-Z_][a-zA-Z0-9_]*/
31
32" Jinja template constants
33syn region jinjaString containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained start=/"/ skip=/\(\\\)\@<!\(\(\\\\\)\@>\)*\\"/ end=/"/
34syn region jinjaString containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained start=/'/ skip=/\(\\\)\@<!\(\(\\\\\)\@>\)*\\'/ end=/'/
35syn match jinjaNumber containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[0-9]\+\(\.[0-9]\+\)\?/
36
37" Operators
38syn match jinjaOperator containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[+\-*\/<>=!,:]/
39syn match jinjaPunctuation containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[()\[\]]/
40syn match jinjaOperator containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /\./ nextgroup=jinjaAttribute
41syn match jinjaAttribute contained /[a-zA-Z_][a-zA-Z0-9_]*/
42
43" Jinja template tag and variable blocks
44syn region jinjaNested matchgroup=jinjaOperator start="(" end=")" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
45syn region jinjaNested matchgroup=jinjaOperator start="\[" end="\]" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
46syn region jinjaNested matchgroup=jinjaOperator start="{" end="}" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
47syn region jinjaTagBlock matchgroup=jinjaTagDelim start=/{%-\?/ end=/-\?%}/ containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaRaw,jinjaString,jinjaNested,jinjaComment
48
49syn region jinjaVarBlock matchgroup=jinjaVarDelim start=/{{-\?/ end=/-\?}}/ containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaRaw,jinjaString,jinjaNested,jinjaComment
50
51" Jinja template 'raw' tag
52syn region jinjaRaw matchgroup=jinjaRawDelim start="{%\s*raw\s*%}" end="{%\s*endraw\s*%}" containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaString,jinjaComment
53
54" Jinja comments
55syn region jinjaComment matchgroup=jinjaCommentDelim start="{#" end="#}" containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaString
56
57" Block start keywords. A bit tricker. We only highlight at the start of a
58" tag block and only if the name is not followed by a comma or equals sign
59" which usually means that we have to deal with an assignment.
60syn match jinjaStatement containedin=jinjaTagBlock contained /\({%-\?\s*\)\@<=\<[a-zA-Z_][a-zA-Z0-9_]*\>\(\s*[,=]\)\@!/
61
62" and context modifiers
63syn match jinjaStatement containedin=jinjaTagBlock contained /\<with\(out\)\?\s\+context\>/
64
65hi def link jinjaPunctuation jinjaOperator
66hi def link jinjaAttribute jinjaVariable
67hi def link jinjaFunction jinjaFilter
68
69hi def link jinjaTagDelim jinjaTagBlock
70hi def link jinjaVarDelim jinjaVarBlock
71hi def link jinjaCommentDelim jinjaComment
72hi def link jinjaRawDelim jinja
73
74hi def link jinjaSpecial Special
75hi def link jinjaOperator Normal
76hi def link jinjaRaw Normal
77hi def link jinjaTagBlock PreProc
78hi def link jinjaVarBlock PreProc
79hi def link jinjaStatement Statement
80hi def link jinjaFilter Function
81hi def link jinjaBlockName Function
82hi def link jinjaVariable Identifier
83hi def link jinjaString Constant
84hi def link jinjaNumber Constant
85hi def link jinjaComment Comment
86
87let b:current_syntax = 'jinja'