Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/pygments/lexers/varnish.py: 77%
22 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-01 06:54 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-07-01 06:54 +0000
1"""
2 pygments.lexers.varnish
3 ~~~~~~~~~~~~~~~~~~~~~~~
5 Lexers for Varnish configuration
7 :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
8 :license: BSD, see LICENSE for details.
9"""
11from pygments.lexer import RegexLexer, include, bygroups, using, this, \
12 inherit, words
13from pygments.token import Text, Comment, Operator, Keyword, Name, String, \
14 Number, Punctuation, Literal, Whitespace
16__all__ = ['VCLLexer', 'VCLSnippetLexer']
19class VCLLexer(RegexLexer):
20 """
21 For Varnish Configuration Language (VCL).
23 .. versionadded:: 2.2
24 """
25 name = 'VCL'
26 aliases = ['vcl']
27 filenames = ['*.vcl']
28 mimetypes = ['text/x-vclsrc']
30 def analyse_text(text):
31 # If the very first line is 'vcl 4.0;' it's pretty much guaranteed
32 # that this is VCL
33 if text.startswith('vcl 4.0;'):
34 return 1.0
35 # Skip over comments and blank lines
36 # This is accurate enough that returning 0.9 is reasonable.
37 # Almost no VCL files start without some comments.
38 elif '\nvcl 4.0;' in text[:1000]:
39 return 0.9
41 tokens = {
42 'probe': [
43 include('whitespace'),
44 include('comments'),
45 (r'(\.\w+)(\s*=\s*)([^;]*)(;)',
46 bygroups(Name.Attribute, Operator, using(this), Punctuation)),
47 (r'\}', Punctuation, '#pop'),
48 ],
49 'acl': [
50 include('whitespace'),
51 include('comments'),
52 (r'[!/]+', Operator),
53 (r';', Punctuation),
54 (r'\d+', Number),
55 (r'\}', Punctuation, '#pop'),
56 ],
57 'backend': [
58 include('whitespace'),
59 (r'(\.probe)(\s*=\s*)(\w+)(;)',
60 bygroups(Name.Attribute, Operator, Name.Variable.Global, Punctuation)),
61 (r'(\.probe)(\s*=\s*)(\{)',
62 bygroups(Name.Attribute, Operator, Punctuation), 'probe'),
63 (r'(\.\w+\b)(\s*=\s*)([^;\s]*)(\s*;)',
64 bygroups(Name.Attribute, Operator, using(this), Punctuation)),
65 (r'\{', Punctuation, '#push'),
66 (r'\}', Punctuation, '#pop'),
67 ],
68 'statements': [
69 (r'(\d\.)?\d+[sdwhmy]', Literal.Date),
70 (r'(\d\.)?\d+ms', Literal.Date),
71 (r'(vcl_pass|vcl_hash|vcl_hit|vcl_init|vcl_backend_fetch|vcl_pipe|'
72 r'vcl_backend_response|vcl_synth|vcl_deliver|vcl_backend_error|'
73 r'vcl_fini|vcl_recv|vcl_purge|vcl_miss)\b', Name.Function),
74 (r'(pipe|retry|hash|synth|deliver|purge|abandon|lookup|pass|fail|ok|'
75 r'miss|fetch|restart)\b', Name.Constant),
76 (r'(beresp|obj|resp|req|req_top|bereq)\.http\.[a-zA-Z_-]+\b', Name.Variable),
77 (words((
78 'obj.status', 'req.hash_always_miss', 'beresp.backend', 'req.esi_level',
79 'req.can_gzip', 'beresp.ttl', 'obj.uncacheable', 'req.ttl', 'obj.hits',
80 'client.identity', 'req.hash_ignore_busy', 'obj.reason', 'req.xid',
81 'req_top.proto', 'beresp.age', 'obj.proto', 'obj.age', 'local.ip',
82 'beresp.uncacheable', 'req.method', 'beresp.backend.ip', 'now',
83 'obj.grace', 'req.restarts', 'beresp.keep', 'req.proto', 'resp.proto',
84 'bereq.xid', 'bereq.between_bytes_timeout', 'req.esi',
85 'bereq.first_byte_timeout', 'bereq.method', 'bereq.connect_timeout',
86 'beresp.do_gzip', 'resp.status', 'beresp.do_gunzip',
87 'beresp.storage_hint', 'resp.is_streaming', 'beresp.do_stream',
88 'req_top.method', 'bereq.backend', 'beresp.backend.name', 'beresp.status',
89 'req.url', 'obj.keep', 'obj.ttl', 'beresp.reason', 'bereq.retries',
90 'resp.reason', 'bereq.url', 'beresp.do_esi', 'beresp.proto', 'client.ip',
91 'bereq.proto', 'server.hostname', 'remote.ip', 'req.backend_hint',
92 'server.identity', 'req_top.url', 'beresp.grace', 'beresp.was_304',
93 'server.ip', 'bereq.uncacheable'), suffix=r'\b'),
94 Name.Variable),
95 (r'[!%&+*\-,/<.}{>=|~]+', Operator),
96 (r'[();]', Punctuation),
98 (r'[,]+', Punctuation),
99 (words(('hash_data', 'regsub', 'regsuball', 'if', 'else',
100 'elsif', 'elif', 'synth', 'synthetic', 'ban',
101 'return', 'set', 'unset', 'import', 'include', 'new',
102 'rollback', 'call'), suffix=r'\b'),
103 Keyword),
104 (r'storage\.\w+\.\w+\b', Name.Variable),
105 (words(('true', 'false')), Name.Builtin),
106 (r'\d+\b', Number),
107 (r'(backend)(\s+\w+)(\s*\{)',
108 bygroups(Keyword, Name.Variable.Global, Punctuation), 'backend'),
109 (r'(probe\s)(\s*\w+\s)(\{)',
110 bygroups(Keyword, Name.Variable.Global, Punctuation), 'probe'),
111 (r'(acl\s)(\s*\w+\s)(\{)',
112 bygroups(Keyword, Name.Variable.Global, Punctuation), 'acl'),
113 (r'(vcl )(4.0)(;)$',
114 bygroups(Keyword.Reserved, Name.Constant, Punctuation)),
115 (r'(sub\s+)([a-zA-Z]\w*)(\s*\{)',
116 bygroups(Keyword, Name.Function, Punctuation)),
117 (r'([a-zA-Z_]\w*)'
118 r'(\.)'
119 r'([a-zA-Z_]\w*)'
120 r'(\s*\(.*\))',
121 bygroups(Name.Function, Punctuation, Name.Function, using(this))),
122 (r'[a-zA-Z_]\w*', Name),
123 ],
124 'comment': [
125 (r'[^*/]+', Comment.Multiline),
126 (r'/\*', Comment.Multiline, '#push'),
127 (r'\*/', Comment.Multiline, '#pop'),
128 (r'[*/]', Comment.Multiline),
129 ],
130 'comments': [
131 (r'#.*$', Comment),
132 (r'/\*', Comment.Multiline, 'comment'),
133 (r'//.*$', Comment),
134 ],
135 'string': [
136 (r'"', String, '#pop'),
137 (r'[^"\n]+', String), # all other characters
138 ],
139 'multistring': [
140 (r'[^"}]', String),
141 (r'"\}', String, '#pop'),
142 (r'["}]', String),
143 ],
144 'whitespace': [
145 (r'L?"', String, 'string'),
146 (r'\{"', String, 'multistring'),
147 (r'\n', Whitespace),
148 (r'\s+', Whitespace),
149 (r'\\\n', Text), # line continuation
150 ],
151 'root': [
152 include('whitespace'),
153 include('comments'),
154 include('statements'),
155 (r'\s+', Whitespace),
156 ],
157 }
160class VCLSnippetLexer(VCLLexer):
161 """
162 For Varnish Configuration Language snippets.
164 .. versionadded:: 2.2
165 """
166 name = 'VCLSnippets'
167 aliases = ['vclsnippets', 'vclsnippet']
168 mimetypes = ['text/x-vclsnippet']
169 filenames = []
171 def analyse_text(text):
172 # override method inherited from VCLLexer
173 return 0
175 tokens = {
176 'snippetspre': [
177 (r'\.\.\.+', Comment),
178 (r'(bereq|req|req_top|resp|beresp|obj|client|server|local|remote|'
179 r'storage)($|\.\*)', Name.Variable),
180 ],
181 'snippetspost': [
182 (r'(backend)\b', Keyword.Reserved),
183 ],
184 'root': [
185 include('snippetspre'),
186 inherit,
187 include('snippetspost'),
188 ],
189 }