blob: 637b261801b878b6731b29120cb3982174bb9bbe [file] [log] [blame]
Ivan Berezovskiyc46e7c02018-10-29 18:22:09 +04001" Vim syntax file
2" Language: Jinja template
3" Maintainer: Armin Ronacher <armin.ronacher@active-4.com>
4" Last Change: 2008 May 9
5" Version: 1.1
6"
7" Known Bugs:
8" because of odd limitations dicts and the modulo operator
9" appear wrong in the template.
10"
11" Changes:
12"
13" 2008 May 9: Added support for Jinja2 changes (new keyword rules)
14
15" .vimrc variable to disable html highlighting
16if !exists('g:jinja_syntax_html')
17 let g:jinja_syntax_html=1
18endif
19
20" For version 5.x: Clear all syntax items
21" For version 6.x: Quit when a syntax file was already loaded
22if !exists("main_syntax")
23 if version < 600
24 syntax clear
25 elseif exists("b:current_syntax")
26 finish
27 endif
28 let main_syntax = 'jinja'
29endif
30
31" Pull in the HTML syntax.
32if g:jinja_syntax_html
33 if version < 600
34 so <sfile>:p:h/html.vim
35 else
36 let ext = expand('%:e')
37 if ext !~ 'htm\|nunj|jinja\|j2' &&
38 \ findfile(ext . '.vim', $VIMRUNTIME . '/syntax') != ''
39 execute 'runtime! syntax/' . ext . '.vim'
40 else
41 runtime! syntax/html.vim
42 endif
43 unlet b:current_syntax
44 endif
45endif
46
47syntax case match
48
49" Jinja template built-in tags and parameters (without filter, macro, is and raw, they
50" have special threatment)
51syn keyword jinjaStatement containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained and if else in not or recursive as import
52
53syn keyword jinjaStatement containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained is filter skipwhite nextgroup=jinjaFilter
54syn keyword jinjaStatement containedin=jinjaTagBlock contained macro skipwhite nextgroup=jinjaFunction
55syn keyword jinjaStatement containedin=jinjaTagBlock contained block skipwhite nextgroup=jinjaBlockName
56
57" Variable Names
58syn match jinjaVariable containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[a-zA-Z_][a-zA-Z0-9_]*/
59syn keyword jinjaSpecial containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained false true none False True None loop super caller varargs kwargs
60
61" Filters
62syn match jinjaOperator "|" containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained skipwhite nextgroup=jinjaFilter
63syn match jinjaFilter contained /[a-zA-Z_][a-zA-Z0-9_]*/
64syn match jinjaFunction contained /[a-zA-Z_][a-zA-Z0-9_]*/
65syn match jinjaBlockName contained /[a-zA-Z_][a-zA-Z0-9_]*/
66
67" Jinja template constants
68syn region jinjaString containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained start=/"/ skip=/\(\\\)\@<!\(\(\\\\\)\@>\)*\\"/ end=/"/
69syn region jinjaString containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained start=/'/ skip=/\(\\\)\@<!\(\(\\\\\)\@>\)*\\'/ end=/'/
70syn match jinjaNumber containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[0-9]\+\(\.[0-9]\+\)\?/
71
72" Operators
73syn match jinjaOperator containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[+\-*\/<>=!,:]/
74syn match jinjaPunctuation containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /[()\[\]]/
75syn match jinjaOperator containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained /\./ nextgroup=jinjaAttribute
76syn match jinjaAttribute contained /[a-zA-Z_][a-zA-Z0-9_]*/
77
78" Jinja template tag and variable blocks
79syn region jinjaNested matchgroup=jinjaOperator start="(" end=")" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
80syn region jinjaNested matchgroup=jinjaOperator start="\[" end="\]" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
81syn region jinjaNested matchgroup=jinjaOperator start="{" end="}" transparent display containedin=jinjaVarBlock,jinjaTagBlock,jinjaNested contained
82syn region jinjaTagBlock matchgroup=jinjaTagDelim start=/{%-\?/ end=/-\?%}/ containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaRaw,jinjaString,jinjaNested,jinjaComment
83
84syn region jinjaVarBlock matchgroup=jinjaVarDelim start=/{{-\?/ end=/-\?}}/ containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaRaw,jinjaString,jinjaNested,jinjaComment
85
86" Jinja template 'raw' tag
87syn region jinjaRaw matchgroup=jinjaRawDelim start="{%\s*raw\s*%}" end="{%\s*endraw\s*%}" containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaString,jinjaComment
88
89" Jinja comments
90syn region jinjaComment matchgroup=jinjaCommentDelim start="{#" end="#}" containedin=ALLBUT,jinjaTagBlock,jinjaVarBlock,jinjaString
91
92" Block start keywords. A bit tricker. We only highlight at the start of a
93" tag block and only if the name is not followed by a comma or equals sign
94" which usually means that we have to deal with an assignment.
95syn match jinjaStatement containedin=jinjaTagBlock contained /\({%-\?\s*\)\@<=\<[a-zA-Z_][a-zA-Z0-9_]*\>\(\s*[,=]\)\@!/
96
97" and context modifiers
98syn match jinjaStatement containedin=jinjaTagBlock contained /\<with\(out\)\?\s\+context\>/
99
100
101" Define the default highlighting.
102" For version 5.7 and earlier: only when not done already
103" For version 5.8 and later: only when an item doesn't have highlighting yet
104if version >= 508 || !exists("did_jinja_syn_inits")
105 if version < 508
106 let did_jinja_syn_inits = 1
107 command -nargs=+ HiLink hi link <args>
108 else
109 command -nargs=+ HiLink hi def link <args>
110 endif
111
112 HiLink jinjaPunctuation jinjaOperator
113 HiLink jinjaAttribute jinjaVariable
114 HiLink jinjaFunction jinjaFilter
115
116 HiLink jinjaTagDelim jinjaTagBlock
117 HiLink jinjaVarDelim jinjaVarBlock
118 HiLink jinjaCommentDelim jinjaComment
119 HiLink jinjaRawDelim jinja
120
121 HiLink jinjaSpecial Special
122 HiLink jinjaOperator Normal
123 HiLink jinjaRaw Normal
124 HiLink jinjaTagBlock PreProc
125 HiLink jinjaVarBlock PreProc
126 HiLink jinjaStatement Statement
127 HiLink jinjaFilter Function
128 HiLink jinjaBlockName Function
129 HiLink jinjaVariable Identifier
130 HiLink jinjaString Constant
131 HiLink jinjaNumber Constant
132 HiLink jinjaComment Comment
133
134 delcommand HiLink
135endif
136
137let b:current_syntax = "jinja"
138
139if main_syntax == 'jinja'
140 unlet main_syntax
141endif