1"""
2 pygments.lexers.graphics
3 ~~~~~~~~~~~~~~~~~~~~~~~~
4
5 Lexers for computer graphics and plotting related languages.
6
7 :copyright: Copyright 2006-2025 by the Pygments team, see AUTHORS.
8 :license: BSD, see LICENSE for details.
9"""
10
11from pygments.lexer import RegexLexer, words, include, bygroups, using, \
12 this, default
13from pygments.token import Text, Comment, Operator, Keyword, Name, \
14 Number, Punctuation, String, Whitespace
15
16__all__ = ['GLShaderLexer', 'PostScriptLexer', 'AsymptoteLexer', 'GnuplotLexer',
17 'PovrayLexer', 'HLSLShaderLexer']
18
19
20class GLShaderLexer(RegexLexer):
21 """
22 GLSL (OpenGL Shader) lexer.
23 """
24 name = 'GLSL'
25 aliases = ['glsl']
26 filenames = ['*.vert', '*.frag', '*.geo']
27 mimetypes = ['text/x-glslsrc']
28 url = 'https://www.khronos.org/api/opengl'
29 version_added = '1.1'
30
31 tokens = {
32 'root': [
33 (r'#(?:.*\\\n)*.*$', Comment.Preproc),
34 (r'//.*$', Comment.Single),
35 (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
36 (r'\+|-|~|!=?|\*|/|%|<<|>>|<=?|>=?|==?|&&?|\^|\|\|?',
37 Operator),
38 (r'[?:]', Operator), # quick hack for ternary
39 (r'\bdefined\b', Operator),
40 (r'[;{}(),\[\]]', Punctuation),
41 # FIXME when e is present, no decimal point needed
42 (r'[+-]?\d*\.\d+([eE][-+]?\d+)?', Number.Float),
43 (r'[+-]?\d+\.\d*([eE][-+]?\d+)?', Number.Float),
44 (r'0[xX][0-9a-fA-F]*', Number.Hex),
45 (r'0[0-7]*', Number.Oct),
46 (r'[1-9][0-9]*', Number.Integer),
47 (words((
48 # Storage qualifiers
49 'attribute', 'const', 'uniform', 'varying',
50 'buffer', 'shared', 'in', 'out',
51 # Layout qualifiers
52 'layout',
53 # Interpolation qualifiers
54 'flat', 'smooth', 'noperspective',
55 # Auxiliary qualifiers
56 'centroid', 'sample', 'patch',
57 # Parameter qualifiers. Some double as Storage qualifiers
58 'inout',
59 # Precision qualifiers
60 'lowp', 'mediump', 'highp', 'precision',
61 # Invariance qualifiers
62 'invariant',
63 # Precise qualifiers
64 'precise',
65 # Memory qualifiers
66 'coherent', 'volatile', 'restrict', 'readonly', 'writeonly',
67 # Statements
68 'break', 'continue', 'do', 'for', 'while', 'switch',
69 'case', 'default', 'if', 'else', 'subroutine',
70 'discard', 'return', 'struct'),
71 prefix=r'\b', suffix=r'\b'),
72 Keyword),
73 (words((
74 # Boolean values
75 'true', 'false'),
76 prefix=r'\b', suffix=r'\b'),
77 Keyword.Constant),
78 (words((
79 # Miscellaneous types
80 'void', 'atomic_uint',
81 # Floating-point scalars and vectors
82 'float', 'vec2', 'vec3', 'vec4',
83 'double', 'dvec2', 'dvec3', 'dvec4',
84 # Integer scalars and vectors
85 'int', 'ivec2', 'ivec3', 'ivec4',
86 'uint', 'uvec2', 'uvec3', 'uvec4',
87 # Boolean scalars and vectors
88 'bool', 'bvec2', 'bvec3', 'bvec4',
89 # Matrices
90 'mat2', 'mat3', 'mat4', 'dmat2', 'dmat3', 'dmat4',
91 'mat2x2', 'mat2x3', 'mat2x4', 'dmat2x2', 'dmat2x3', 'dmat2x4',
92 'mat3x2', 'mat3x3', 'mat3x4', 'dmat3x2', 'dmat3x3',
93 'dmat3x4', 'mat4x2', 'mat4x3', 'mat4x4', 'dmat4x2', 'dmat4x3', 'dmat4x4',
94 # Floating-point samplers
95 'sampler1D', 'sampler2D', 'sampler3D', 'samplerCube',
96 'sampler1DArray', 'sampler2DArray', 'samplerCubeArray',
97 'sampler2DRect', 'samplerBuffer',
98 'sampler2DMS', 'sampler2DMSArray',
99 # Shadow samplers
100 'sampler1DShadow', 'sampler2DShadow', 'samplerCubeShadow',
101 'sampler1DArrayShadow', 'sampler2DArrayShadow',
102 'samplerCubeArrayShadow', 'sampler2DRectShadow',
103 # Signed integer samplers
104 'isampler1D', 'isampler2D', 'isampler3D', 'isamplerCube',
105 'isampler1DArray', 'isampler2DArray', 'isamplerCubeArray',
106 'isampler2DRect', 'isamplerBuffer',
107 'isampler2DMS', 'isampler2DMSArray',
108 # Unsigned integer samplers
109 'usampler1D', 'usampler2D', 'usampler3D', 'usamplerCube',
110 'usampler1DArray', 'usampler2DArray', 'usamplerCubeArray',
111 'usampler2DRect', 'usamplerBuffer',
112 'usampler2DMS', 'usampler2DMSArray',
113 # Floating-point image types
114 'image1D', 'image2D', 'image3D', 'imageCube',
115 'image1DArray', 'image2DArray', 'imageCubeArray',
116 'image2DRect', 'imageBuffer',
117 'image2DMS', 'image2DMSArray',
118 # Signed integer image types
119 'iimage1D', 'iimage2D', 'iimage3D', 'iimageCube',
120 'iimage1DArray', 'iimage2DArray', 'iimageCubeArray',
121 'iimage2DRect', 'iimageBuffer',
122 'iimage2DMS', 'iimage2DMSArray',
123 # Unsigned integer image types
124 'uimage1D', 'uimage2D', 'uimage3D', 'uimageCube',
125 'uimage1DArray', 'uimage2DArray', 'uimageCubeArray',
126 'uimage2DRect', 'uimageBuffer',
127 'uimage2DMS', 'uimage2DMSArray'),
128 prefix=r'\b', suffix=r'\b'),
129 Keyword.Type),
130 (words((
131 # Reserved for future use.
132 'common', 'partition', 'active', 'asm', 'class',
133 'union', 'enum', 'typedef', 'template', 'this',
134 'resource', 'goto', 'inline', 'noinline', 'public',
135 'static', 'extern', 'external', 'interface', 'long',
136 'short', 'half', 'fixed', 'unsigned', 'superp', 'input',
137 'output', 'hvec2', 'hvec3', 'hvec4', 'fvec2', 'fvec3',
138 'fvec4', 'sampler3DRect', 'filter', 'sizeof', 'cast',
139 'namespace', 'using'),
140 prefix=r'\b', suffix=r'\b'),
141 Keyword.Reserved),
142 # All names beginning with "gl_" are reserved.
143 (r'gl_\w*', Name.Builtin),
144 (r'[a-zA-Z_]\w*', Name),
145 (r'\.', Punctuation),
146 (r'\s+', Whitespace),
147 ],
148 }
149
150
151class HLSLShaderLexer(RegexLexer):
152 """
153 HLSL (Microsoft Direct3D Shader) lexer.
154 """
155 name = 'HLSL'
156 aliases = ['hlsl']
157 filenames = ['*.hlsl', '*.hlsli']
158 mimetypes = ['text/x-hlsl']
159 url = 'https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl'
160 version_added = '2.3'
161
162 tokens = {
163 'root': [
164 (r'#(?:.*\\\n)*.*$', Comment.Preproc),
165 (r'//.*$', Comment.Single),
166 (r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline),
167 (r'\+|-|~|!=?|\*|/|%|<<|>>|<=?|>=?|==?|&&?|\^|\|\|?',
168 Operator),
169 (r'[?:]', Operator), # quick hack for ternary
170 (r'\bdefined\b', Operator),
171 (r'[;{}(),.\[\]]', Punctuation),
172 # FIXME when e is present, no decimal point needed
173 (r'[+-]?\d*\.\d+([eE][-+]?\d+)?f?', Number.Float),
174 (r'[+-]?\d+\.\d*([eE][-+]?\d+)?f?', Number.Float),
175 (r'0[xX][0-9a-fA-F]*', Number.Hex),
176 (r'0[0-7]*', Number.Oct),
177 (r'[1-9][0-9]*', Number.Integer),
178 (r'"', String, 'string'),
179 (words((
180 'asm','asm_fragment','break','case','cbuffer','centroid','class',
181 'column_major','compile','compile_fragment','const','continue',
182 'default','discard','do','else','export','extern','for','fxgroup',
183 'globallycoherent','groupshared','if','in','inline','inout',
184 'interface','line','lineadj','linear','namespace','nointerpolation',
185 'noperspective','NULL','out','packoffset','pass','pixelfragment',
186 'point','precise','return','register','row_major','sample',
187 'sampler','shared','stateblock','stateblock_state','static',
188 'struct','switch','tbuffer','technique','technique10',
189 'technique11','texture','typedef','triangle','triangleadj',
190 'uniform','vertexfragment','volatile','while'),
191 prefix=r'\b', suffix=r'\b'),
192 Keyword),
193 (words(('true','false'), prefix=r'\b', suffix=r'\b'),
194 Keyword.Constant),
195 (words((
196 'auto','catch','char','const_cast','delete','dynamic_cast','enum',
197 'explicit','friend','goto','long','mutable','new','operator',
198 'private','protected','public','reinterpret_cast','short','signed',
199 'sizeof','static_cast','template','this','throw','try','typename',
200 'union','unsigned','using','virtual'),
201 prefix=r'\b', suffix=r'\b'),
202 Keyword.Reserved),
203 (words((
204 'dword','matrix','snorm','string','unorm','unsigned','void','vector',
205 'BlendState','Buffer','ByteAddressBuffer','ComputeShader',
206 'DepthStencilState','DepthStencilView','DomainShader',
207 'GeometryShader','HullShader','InputPatch','LineStream',
208 'OutputPatch','PixelShader','PointStream','RasterizerState',
209 'RenderTargetView','RasterizerOrderedBuffer',
210 'RasterizerOrderedByteAddressBuffer',
211 'RasterizerOrderedStructuredBuffer','RasterizerOrderedTexture1D',
212 'RasterizerOrderedTexture1DArray','RasterizerOrderedTexture2D',
213 'RasterizerOrderedTexture2DArray','RasterizerOrderedTexture3D',
214 'RWBuffer','RWByteAddressBuffer','RWStructuredBuffer',
215 'RWTexture1D','RWTexture1DArray','RWTexture2D','RWTexture2DArray',
216 'RWTexture3D','SamplerState','SamplerComparisonState',
217 'StructuredBuffer','Texture1D','Texture1DArray','Texture2D',
218 'Texture2DArray','Texture2DMS','Texture2DMSArray','Texture3D',
219 'TextureCube','TextureCubeArray','TriangleStream','VertexShader'),
220 prefix=r'\b', suffix=r'\b'),
221 Keyword.Type),
222 (words((
223 'bool','double','float','int','half','min16float','min10float',
224 'min16int','min12int','min16uint','uint'),
225 prefix=r'\b', suffix=r'([1-4](x[1-4])?)?\b'),
226 Keyword.Type), # vector and matrix types
227 (words((
228 'abort','abs','acos','all','AllMemoryBarrier',
229 'AllMemoryBarrierWithGroupSync','any','AppendStructuredBuffer',
230 'asdouble','asfloat','asin','asint','asuint','asuint','atan',
231 'atan2','ceil','CheckAccessFullyMapped','clamp','clip',
232 'CompileShader','ConsumeStructuredBuffer','cos','cosh','countbits',
233 'cross','D3DCOLORtoUBYTE4','ddx','ddx_coarse','ddx_fine','ddy',
234 'ddy_coarse','ddy_fine','degrees','determinant',
235 'DeviceMemoryBarrier','DeviceMemoryBarrierWithGroupSync','distance',
236 'dot','dst','errorf','EvaluateAttributeAtCentroid',
237 'EvaluateAttributeAtSample','EvaluateAttributeSnapped','exp',
238 'exp2','f16tof32','f32tof16','faceforward','firstbithigh',
239 'firstbitlow','floor','fma','fmod','frac','frexp','fwidth',
240 'GetRenderTargetSampleCount','GetRenderTargetSamplePosition',
241 'GlobalOrderedCountIncrement','GroupMemoryBarrier',
242 'GroupMemoryBarrierWithGroupSync','InterlockedAdd','InterlockedAnd',
243 'InterlockedCompareExchange','InterlockedCompareStore',
244 'InterlockedExchange','InterlockedMax','InterlockedMin',
245 'InterlockedOr','InterlockedXor','isfinite','isinf','isnan',
246 'ldexp','length','lerp','lit','log','log10','log2','mad','max',
247 'min','modf','msad4','mul','noise','normalize','pow','printf',
248 'Process2DQuadTessFactorsAvg','Process2DQuadTessFactorsMax',
249 'Process2DQuadTessFactorsMin','ProcessIsolineTessFactors',
250 'ProcessQuadTessFactorsAvg','ProcessQuadTessFactorsMax',
251 'ProcessQuadTessFactorsMin','ProcessTriTessFactorsAvg',
252 'ProcessTriTessFactorsMax','ProcessTriTessFactorsMin',
253 'QuadReadLaneAt','QuadSwapX','QuadSwapY','radians','rcp',
254 'reflect','refract','reversebits','round','rsqrt','saturate',
255 'sign','sin','sincos','sinh','smoothstep','sqrt','step','tan',
256 'tanh','tex1D','tex1D','tex1Dbias','tex1Dgrad','tex1Dlod',
257 'tex1Dproj','tex2D','tex2D','tex2Dbias','tex2Dgrad','tex2Dlod',
258 'tex2Dproj','tex3D','tex3D','tex3Dbias','tex3Dgrad','tex3Dlod',
259 'tex3Dproj','texCUBE','texCUBE','texCUBEbias','texCUBEgrad',
260 'texCUBElod','texCUBEproj','transpose','trunc','WaveAllBitAnd',
261 'WaveAllMax','WaveAllMin','WaveAllBitOr','WaveAllBitXor',
262 'WaveAllEqual','WaveAllProduct','WaveAllSum','WaveAllTrue',
263 'WaveAnyTrue','WaveBallot','WaveGetLaneCount','WaveGetLaneIndex',
264 'WaveGetOrderedIndex','WaveIsHelperLane','WaveOnce',
265 'WavePrefixProduct','WavePrefixSum','WaveReadFirstLane',
266 'WaveReadLaneAt'),
267 prefix=r'\b', suffix=r'\b'),
268 Name.Builtin), # built-in functions
269 (words((
270 'SV_ClipDistance','SV_ClipDistance0','SV_ClipDistance1',
271 'SV_Culldistance','SV_CullDistance0','SV_CullDistance1',
272 'SV_Coverage','SV_Depth','SV_DepthGreaterEqual',
273 'SV_DepthLessEqual','SV_DispatchThreadID','SV_DomainLocation',
274 'SV_GroupID','SV_GroupIndex','SV_GroupThreadID','SV_GSInstanceID',
275 'SV_InnerCoverage','SV_InsideTessFactor','SV_InstanceID',
276 'SV_IsFrontFace','SV_OutputControlPointID','SV_Position',
277 'SV_PrimitiveID','SV_RenderTargetArrayIndex','SV_SampleIndex',
278 'SV_StencilRef','SV_TessFactor','SV_VertexID',
279 'SV_ViewportArrayIndex'),
280 prefix=r'\b', suffix=r'\b'),
281 Name.Decorator), # system-value semantics
282 (r'\bSV_Target[0-7]?\b', Name.Decorator),
283 (words((
284 'allow_uav_condition','branch','call','domain','earlydepthstencil',
285 'fastopt','flatten','forcecase','instance','loop','maxtessfactor',
286 'numthreads','outputcontrolpoints','outputtopology','partitioning',
287 'patchconstantfunc','unroll'),
288 prefix=r'\b', suffix=r'\b'),
289 Name.Decorator), # attributes
290 (r'[a-zA-Z_]\w*', Name),
291 (r'\\$', Comment.Preproc), # backslash at end of line -- usually macro continuation
292 (r'\s+', Whitespace),
293 ],
294 'string': [
295 (r'"', String, '#pop'),
296 (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|'
297 r'u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})', String.Escape),
298 (r'[^\\"\n]+', String), # all other characters
299 (r'\\\n', String), # line continuation
300 (r'\\', String), # stray backslash
301 ],
302 }
303
304
305class PostScriptLexer(RegexLexer):
306 """
307 Lexer for PostScript files.
308 """
309 name = 'PostScript'
310 url = 'https://en.wikipedia.org/wiki/PostScript'
311 aliases = ['postscript', 'postscr']
312 filenames = ['*.ps', '*.eps']
313 mimetypes = ['application/postscript']
314 version_added = '1.4'
315
316 delimiter = r'()<>\[\]{}/%\s'
317 delimiter_end = rf'(?=[{delimiter}])'
318
319 valid_name_chars = rf'[^{delimiter}]'
320 valid_name = rf"{valid_name_chars}+{delimiter_end}"
321
322 tokens = {
323 'root': [
324 # All comment types
325 (r'^%!.+$', Comment.Preproc),
326 (r'%%.*$', Comment.Special),
327 (r'(^%.*\n){2,}', Comment.Multiline),
328 (r'%.*$', Comment.Single),
329
330 # String literals are awkward; enter separate state.
331 (r'\(', String, 'stringliteral'),
332
333 (r'[{}<>\[\]]', Punctuation),
334
335 # Numbers
336 (r'<[0-9A-Fa-f]+>' + delimiter_end, Number.Hex),
337 # Slight abuse: use Oct to signify any explicit base system
338 (r'[0-9]+\#(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)'
339 r'((e|E)[0-9]+)?' + delimiter_end, Number.Oct),
340 (r'(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)((e|E)[0-9]+)?'
341 + delimiter_end, Number.Float),
342 (r'(\-|\+)?[0-9]+' + delimiter_end, Number.Integer),
343
344 # References
345 (rf'\/{valid_name}', Name.Variable),
346
347 # Names
348 (valid_name, Name.Function), # Anything else is executed
349
350 # These keywords taken from
351 # <http://www.math.ubc.ca/~cass/graphics/manual/pdf/a1.pdf>
352 # Is there an authoritative list anywhere that doesn't involve
353 # trawling documentation?
354
355 (r'(false|true)' + delimiter_end, Keyword.Constant),
356
357 # Conditionals / flow control
358 (r'(eq|ne|g[et]|l[et]|and|or|not|if(?:else)?|for(?:all)?)'
359 + delimiter_end, Keyword.Reserved),
360
361 (words((
362 'abs', 'add', 'aload', 'arc', 'arcn', 'array', 'atan', 'begin',
363 'bind', 'ceiling', 'charpath', 'clip', 'closepath', 'concat',
364 'concatmatrix', 'copy', 'cos', 'currentlinewidth', 'currentmatrix',
365 'currentpoint', 'curveto', 'cvi', 'cvs', 'def', 'defaultmatrix',
366 'dict', 'dictstackoverflow', 'div', 'dtransform', 'dup', 'end',
367 'exch', 'exec', 'exit', 'exp', 'fill', 'findfont', 'floor', 'get',
368 'getinterval', 'grestore', 'gsave', 'gt', 'identmatrix', 'idiv',
369 'idtransform', 'index', 'invertmatrix', 'itransform', 'length',
370 'lineto', 'ln', 'load', 'log', 'loop', 'matrix', 'mod', 'moveto',
371 'mul', 'neg', 'newpath', 'pathforall', 'pathbbox', 'pop', 'print',
372 'pstack', 'put', 'quit', 'rand', 'rangecheck', 'rcurveto', 'repeat',
373 'restore', 'rlineto', 'rmoveto', 'roll', 'rotate', 'round', 'run',
374 'save', 'scale', 'scalefont', 'setdash', 'setfont', 'setgray',
375 'setlinecap', 'setlinejoin', 'setlinewidth', 'setmatrix',
376 'setrgbcolor', 'shfill', 'show', 'showpage', 'sin', 'sqrt',
377 'stack', 'stringwidth', 'stroke', 'strokepath', 'sub', 'syntaxerror',
378 'transform', 'translate', 'truncate', 'typecheck', 'undefined',
379 'undefinedfilename', 'undefinedresult'), suffix=delimiter_end),
380 Name.Builtin),
381
382 (r'\s+', Whitespace),
383 ],
384
385 'stringliteral': [
386 (r'[^()\\]+', String),
387 (r'\\', String.Escape, 'escape'),
388 (r'\(', String, '#push'),
389 (r'\)', String, '#pop'),
390 ],
391
392 'escape': [
393 (r'[0-8]{3}|n|r|t|b|f|\\|\(|\)', String.Escape, '#pop'),
394 default('#pop'),
395 ],
396 }
397
398
399class AsymptoteLexer(RegexLexer):
400 """
401 For Asymptote source code.
402 """
403 name = 'Asymptote'
404 url = 'http://asymptote.sf.net/'
405 aliases = ['asymptote', 'asy']
406 filenames = ['*.asy']
407 mimetypes = ['text/x-asymptote']
408 version_added = '1.2'
409
410 #: optional Comment or Whitespace
411 _ws = r'(?:\s|//.*?\n|/\*.*?\*/)+'
412
413 tokens = {
414 'whitespace': [
415 (r'\n', Whitespace),
416 (r'\s+', Whitespace),
417 (r'(\\)(\n)', bygroups(Text, Whitespace)), # line continuation
418 (r'//(\n|(.|\n)*?[^\\]\n)', Comment),
419 (r'/(\\\n)?\*(.|\n)*?\*(\\\n)?/', Comment),
420 ],
421 'statements': [
422 # simple string (TeX friendly)
423 (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
424 # C style string (with character escapes)
425 (r"'", String, 'string'),
426 (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float),
427 (r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float),
428 (r'0x[0-9a-fA-F]+[Ll]?', Number.Hex),
429 (r'0[0-7]+[Ll]?', Number.Oct),
430 (r'\d+[Ll]?', Number.Integer),
431 (r'[~!%^&*+=|?:<>/-]', Operator),
432 (r'[()\[\],.]', Punctuation),
433 (r'\b(case)(.+?)(:)', bygroups(Keyword, using(this), Text)),
434 (r'(and|controls|tension|atleast|curl|if|else|while|for|do|'
435 r'return|break|continue|struct|typedef|new|access|import|'
436 r'unravel|from|include|quote|static|public|private|restricted|'
437 r'this|explicit|true|false|null|cycle|newframe|operator)\b', Keyword),
438 # Since an asy-type-name can be also an asy-function-name,
439 # in the following we test if the string " [a-zA-Z]" follows
440 # the Keyword.Type.
441 # Of course it is not perfect !
442 (r'(Braid|FitResult|Label|Legend|TreeNode|abscissa|arc|arrowhead|'
443 r'binarytree|binarytreeNode|block|bool|bool3|bounds|bqe|circle|'
444 r'conic|coord|coordsys|cputime|ellipse|file|filltype|frame|grid3|'
445 r'guide|horner|hsv|hyperbola|indexedTransform|int|inversion|key|'
446 r'light|line|linefit|marginT|marker|mass|object|pair|parabola|path|'
447 r'path3|pen|picture|point|position|projection|real|revolution|'
448 r'scaleT|scientific|segment|side|slice|splitface|string|surface|'
449 r'tensionSpecifier|ticklocate|ticksgridT|tickvalues|transform|'
450 r'transformation|tree|triangle|trilinear|triple|vector|'
451 r'vertex|void)(?=\s+[a-zA-Z])', Keyword.Type),
452 # Now the asy-type-name which are not asy-function-name
453 # except yours !
454 # Perhaps useless
455 (r'(Braid|FitResult|TreeNode|abscissa|arrowhead|block|bool|bool3|'
456 r'bounds|coord|frame|guide|horner|int|linefit|marginT|pair|pen|'
457 r'picture|position|real|revolution|slice|splitface|ticksgridT|'
458 r'tickvalues|tree|triple|vertex|void)\b', Keyword.Type),
459 (r'[a-zA-Z_]\w*:(?!:)', Name.Label),
460 (r'[a-zA-Z_]\w*', Name),
461 ],
462 'root': [
463 include('whitespace'),
464 # functions
465 (r'((?:[\w*\s])+?(?:\s|\*))' # return arguments
466 r'([a-zA-Z_]\w*)' # method name
467 r'(\s*\([^;]*?\))' # signature
468 r'(' + _ws + r')(\{)',
469 bygroups(using(this), Name.Function, using(this), using(this),
470 Punctuation),
471 'function'),
472 # function declarations
473 (r'((?:[\w*\s])+?(?:\s|\*))' # return arguments
474 r'([a-zA-Z_]\w*)' # method name
475 r'(\s*\([^;]*?\))' # signature
476 r'(' + _ws + r')(;)',
477 bygroups(using(this), Name.Function, using(this), using(this),
478 Punctuation)),
479 default('statement'),
480 ],
481 'statement': [
482 include('whitespace'),
483 include('statements'),
484 ('[{}]', Punctuation),
485 (';', Punctuation, '#pop'),
486 ],
487 'function': [
488 include('whitespace'),
489 include('statements'),
490 (';', Punctuation),
491 (r'\{', Punctuation, '#push'),
492 (r'\}', Punctuation, '#pop'),
493 ],
494 'string': [
495 (r"'", String, '#pop'),
496 (r'\\([\\abfnrtv"\'?]|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
497 (r'\n', String),
498 (r"[^\\'\n]+", String), # all other characters
499 (r'\\\n', String),
500 (r'\\n', String), # line continuation
501 (r'\\', String), # stray backslash
502 ],
503 }
504
505 def get_tokens_unprocessed(self, text):
506 from pygments.lexers._asy_builtins import ASYFUNCNAME, ASYVARNAME
507 for index, token, value in \
508 RegexLexer.get_tokens_unprocessed(self, text):
509 if token is Name and value in ASYFUNCNAME:
510 token = Name.Function
511 elif token is Name and value in ASYVARNAME:
512 token = Name.Variable
513 yield index, token, value
514
515
516def _shortened(word):
517 dpos = word.find('$')
518 return '|'.join(word[:dpos] + word[dpos+1:i] + r'\b'
519 for i in range(len(word), dpos, -1))
520
521
522def _shortened_many(*words):
523 return '|'.join(map(_shortened, words))
524
525
526class GnuplotLexer(RegexLexer):
527 """
528 For Gnuplot plotting scripts.
529 """
530
531 name = 'Gnuplot'
532 url = 'http://gnuplot.info/'
533 aliases = ['gnuplot']
534 filenames = ['*.plot', '*.plt']
535 mimetypes = ['text/x-gnuplot']
536 version_added = '0.11'
537
538 tokens = {
539 'root': [
540 include('whitespace'),
541 (_shortened('bi$nd'), Keyword, 'bind'),
542 (_shortened_many('ex$it', 'q$uit'), Keyword, 'quit'),
543 (_shortened('f$it'), Keyword, 'fit'),
544 (r'(if)(\s*)(\()', bygroups(Keyword, Text, Punctuation), 'if'),
545 (r'else\b', Keyword),
546 (_shortened('pa$use'), Keyword, 'pause'),
547 (_shortened_many('p$lot', 'rep$lot', 'sp$lot'), Keyword, 'plot'),
548 (_shortened('sa$ve'), Keyword, 'save'),
549 (_shortened('se$t'), Keyword, ('genericargs', 'optionarg')),
550 (_shortened_many('sh$ow', 'uns$et'),
551 Keyword, ('noargs', 'optionarg')),
552 (_shortened_many('low$er', 'ra$ise', 'ca$ll', 'cd$', 'cl$ear',
553 'h$elp', '\\?$', 'hi$story', 'l$oad', 'pr$int',
554 'pwd$', 're$read', 'res$et', 'scr$eendump',
555 'she$ll', 'sy$stem', 'up$date'),
556 Keyword, 'genericargs'),
557 (_shortened_many('pwd$', 're$read', 'res$et', 'scr$eendump',
558 'she$ll', 'test$'),
559 Keyword, 'noargs'),
560 (r'([a-zA-Z_]\w*)(\s*)(=)',
561 bygroups(Name.Variable, Whitespace, Operator), 'genericargs'),
562 (r'([a-zA-Z_]\w*)(\s*)(\()(.*?)(\))(\s*)(=)',
563 bygroups(Name.Function, Whitespace, Punctuation,
564 Text, Punctuation, Whitespace, Operator), 'genericargs'),
565 (r'@[a-zA-Z_]\w*', Name.Constant), # macros
566 (r';', Keyword),
567 ],
568 'comment': [
569 (r'[^\\\n]+', Comment),
570 (r'\\\n', Comment),
571 (r'\\', Comment),
572 # don't add the newline to the Comment token
573 default('#pop'),
574 ],
575 'whitespace': [
576 ('#', Comment, 'comment'),
577 (r'[ \t\v\f]+', Whitespace),
578 ],
579 'noargs': [
580 include('whitespace'),
581 # semicolon and newline end the argument list
582 (r';', Punctuation, '#pop'),
583 (r'\n', Whitespace, '#pop'),
584 ],
585 'dqstring': [
586 (r'"', String, '#pop'),
587 (r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape),
588 (r'[^\\"\n]+', String), # all other characters
589 (r'\\\n', String), # line continuation
590 (r'\\', String), # stray backslash
591 (r'\n', Whitespace, '#pop'), # newline ends the string too
592 ],
593 'sqstring': [
594 (r"''", String), # escaped single quote
595 (r"'", String, '#pop'),
596 (r"[^\\'\n]+", String), # all other characters
597 (r'\\\n', String), # line continuation
598 (r'\\', String), # normal backslash
599 (r'\n', Whitespace, '#pop'), # newline ends the string too
600 ],
601 'genericargs': [
602 include('noargs'),
603 (r'"', String, 'dqstring'),
604 (r"'", String, 'sqstring'),
605 (r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+', Number.Float),
606 (r'(\d+\.\d*|\.\d+)', Number.Float),
607 (r'-?\d+', Number.Integer),
608 ('[,.~!%^&*+=|?:<>/-]', Operator),
609 (r'[{}()\[\]]', Punctuation),
610 (r'(eq|ne)\b', Operator.Word),
611 (r'([a-zA-Z_]\w*)(\s*)(\()',
612 bygroups(Name.Function, Text, Punctuation)),
613 (r'[a-zA-Z_]\w*', Name),
614 (r'@[a-zA-Z_]\w*', Name.Constant), # macros
615 (r'(\\)(\n)', bygroups(Text, Whitespace)),
616 ],
617 'optionarg': [
618 include('whitespace'),
619 (_shortened_many(
620 "a$ll", "an$gles", "ar$row", "au$toscale", "b$ars", "bor$der",
621 "box$width", "cl$abel", "c$lip", "cn$trparam", "co$ntour", "da$ta",
622 "data$file", "dg$rid3d", "du$mmy", "enc$oding", "dec$imalsign",
623 "fit$", "font$path", "fo$rmat", "fu$nction", "fu$nctions", "g$rid",
624 "hid$den3d", "his$torysize", "is$osamples", "k$ey", "keyt$itle",
625 "la$bel", "li$nestyle", "ls$", "loa$dpath", "loc$ale", "log$scale",
626 "mac$ros", "map$ping", "map$ping3d", "mar$gin", "lmar$gin",
627 "rmar$gin", "tmar$gin", "bmar$gin", "mo$use", "multi$plot",
628 "mxt$ics", "nomxt$ics", "mx2t$ics", "nomx2t$ics", "myt$ics",
629 "nomyt$ics", "my2t$ics", "nomy2t$ics", "mzt$ics", "nomzt$ics",
630 "mcbt$ics", "nomcbt$ics", "of$fsets", "or$igin", "o$utput",
631 "pa$rametric", "pm$3d", "pal$ette", "colorb$ox", "p$lot",
632 "poi$ntsize", "pol$ar", "pr$int", "obj$ect", "sa$mples", "si$ze",
633 "st$yle", "su$rface", "table$", "t$erminal", "termo$ptions", "ti$cs",
634 "ticsc$ale", "ticsl$evel", "timef$mt", "tim$estamp", "tit$le",
635 "v$ariables", "ve$rsion", "vi$ew", "xyp$lane", "xda$ta", "x2da$ta",
636 "yda$ta", "y2da$ta", "zda$ta", "cbda$ta", "xl$abel", "x2l$abel",
637 "yl$abel", "y2l$abel", "zl$abel", "cbl$abel", "xti$cs", "noxti$cs",
638 "x2ti$cs", "nox2ti$cs", "yti$cs", "noyti$cs", "y2ti$cs", "noy2ti$cs",
639 "zti$cs", "nozti$cs", "cbti$cs", "nocbti$cs", "xdti$cs", "noxdti$cs",
640 "x2dti$cs", "nox2dti$cs", "ydti$cs", "noydti$cs", "y2dti$cs",
641 "noy2dti$cs", "zdti$cs", "nozdti$cs", "cbdti$cs", "nocbdti$cs",
642 "xmti$cs", "noxmti$cs", "x2mti$cs", "nox2mti$cs", "ymti$cs",
643 "noymti$cs", "y2mti$cs", "noy2mti$cs", "zmti$cs", "nozmti$cs",
644 "cbmti$cs", "nocbmti$cs", "xr$ange", "x2r$ange", "yr$ange",
645 "y2r$ange", "zr$ange", "cbr$ange", "rr$ange", "tr$ange", "ur$ange",
646 "vr$ange", "xzeroa$xis", "x2zeroa$xis", "yzeroa$xis", "y2zeroa$xis",
647 "zzeroa$xis", "zeroa$xis", "z$ero"), Name.Builtin, '#pop'),
648 ],
649 'bind': [
650 ('!', Keyword, '#pop'),
651 (_shortened('all$windows'), Name.Builtin),
652 include('genericargs'),
653 ],
654 'quit': [
655 (r'gnuplot\b', Keyword),
656 include('noargs'),
657 ],
658 'fit': [
659 (r'via\b', Name.Builtin),
660 include('plot'),
661 ],
662 'if': [
663 (r'\)', Punctuation, '#pop'),
664 include('genericargs'),
665 ],
666 'pause': [
667 (r'(mouse|any|button1|button2|button3)\b', Name.Builtin),
668 (_shortened('key$press'), Name.Builtin),
669 include('genericargs'),
670 ],
671 'plot': [
672 (_shortened_many('ax$es', 'axi$s', 'bin$ary', 'ev$ery', 'i$ndex',
673 'mat$rix', 's$mooth', 'thru$', 't$itle',
674 'not$itle', 'u$sing', 'w$ith'),
675 Name.Builtin),
676 include('genericargs'),
677 ],
678 'save': [
679 (_shortened_many('f$unctions', 's$et', 't$erminal', 'v$ariables'),
680 Name.Builtin),
681 include('genericargs'),
682 ],
683 }
684
685
686class PovrayLexer(RegexLexer):
687 """
688 For Persistence of Vision Raytracer files.
689 """
690 name = 'POVRay'
691 url = 'http://www.povray.org/'
692 aliases = ['pov']
693 filenames = ['*.pov', '*.inc']
694 mimetypes = ['text/x-povray']
695 version_added = '0.11'
696
697 tokens = {
698 'root': [
699 (r'/\*[\w\W]*?\*/', Comment.Multiline),
700 (r'//.*$', Comment.Single),
701 (r'(?s)"(?:\\.|[^"\\])+"', String.Double),
702 (words((
703 'break', 'case', 'debug', 'declare', 'default', 'define', 'else',
704 'elseif', 'end', 'error', 'fclose', 'fopen', 'for', 'if', 'ifdef',
705 'ifndef', 'include', 'local', 'macro', 'range', 'read', 'render',
706 'statistics', 'switch', 'undef', 'version', 'warning', 'while',
707 'write'), prefix=r'#', suffix=r'\b'),
708 Comment.Preproc),
709 (words((
710 'aa_level', 'aa_threshold', 'abs', 'acos', 'acosh', 'adaptive', 'adc_bailout',
711 'agate', 'agate_turb', 'all', 'alpha', 'ambient', 'ambient_light', 'angle',
712 'aperture', 'arc_angle', 'area_light', 'asc', 'asin', 'asinh', 'assumed_gamma',
713 'atan', 'atan2', 'atanh', 'atmosphere', 'atmospheric_attenuation',
714 'attenuating', 'average', 'background', 'black_hole', 'blue', 'blur_samples',
715 'bounded_by', 'box_mapping', 'bozo', 'break', 'brick', 'brick_size',
716 'brightness', 'brilliance', 'bumps', 'bumpy1', 'bumpy2', 'bumpy3', 'bump_map',
717 'bump_size', 'case', 'caustics', 'ceil', 'checker', 'chr', 'clipped_by', 'clock',
718 'color', 'color_map', 'colour', 'colour_map', 'component', 'composite', 'concat',
719 'confidence', 'conic_sweep', 'constant', 'control0', 'control1', 'cos', 'cosh',
720 'count', 'crackle', 'crand', 'cube', 'cubic_spline', 'cylindrical_mapping',
721 'debug', 'declare', 'default', 'degrees', 'dents', 'diffuse', 'direction',
722 'distance', 'distance_maximum', 'div', 'dust', 'dust_type', 'eccentricity',
723 'else', 'emitting', 'end', 'error', 'error_bound', 'exp', 'exponent',
724 'fade_distance', 'fade_power', 'falloff', 'falloff_angle', 'false',
725 'file_exists', 'filter', 'finish', 'fisheye', 'flatness', 'flip', 'floor',
726 'focal_point', 'fog', 'fog_alt', 'fog_offset', 'fog_type', 'frequency', 'gif',
727 'global_settings', 'glowing', 'gradient', 'granite', 'gray_threshold',
728 'green', 'halo', 'hexagon', 'hf_gray_16', 'hierarchy', 'hollow', 'hypercomplex',
729 'if', 'ifdef', 'iff', 'image_map', 'incidence', 'include', 'int', 'interpolate',
730 'inverse', 'ior', 'irid', 'irid_wavelength', 'jitter', 'lambda', 'leopard',
731 'linear', 'linear_spline', 'linear_sweep', 'location', 'log', 'looks_like',
732 'look_at', 'low_error_factor', 'mandel', 'map_type', 'marble', 'material_map',
733 'matrix', 'max', 'max_intersections', 'max_iteration', 'max_trace_level',
734 'max_value', 'metallic', 'min', 'minimum_reuse', 'mod', 'mortar',
735 'nearest_count', 'no', 'normal', 'normal_map', 'no_shadow', 'number_of_waves',
736 'octaves', 'off', 'offset', 'omega', 'omnimax', 'on', 'once', 'onion', 'open',
737 'orthographic', 'panoramic', 'pattern1', 'pattern2', 'pattern3',
738 'perspective', 'pgm', 'phase', 'phong', 'phong_size', 'pi', 'pigment',
739 'pigment_map', 'planar_mapping', 'png', 'point_at', 'pot', 'pow', 'ppm',
740 'precision', 'pwr', 'quadratic_spline', 'quaternion', 'quick_color',
741 'quick_colour', 'quilted', 'radial', 'radians', 'radiosity', 'radius', 'rainbow',
742 'ramp_wave', 'rand', 'range', 'reciprocal', 'recursion_limit', 'red',
743 'reflection', 'refraction', 'render', 'repeat', 'rgb', 'rgbf', 'rgbft', 'rgbt',
744 'right', 'ripples', 'rotate', 'roughness', 'samples', 'scale', 'scallop_wave',
745 'scattering', 'seed', 'shadowless', 'sin', 'sine_wave', 'sinh', 'sky', 'sky_sphere',
746 'slice', 'slope_map', 'smooth', 'specular', 'spherical_mapping', 'spiral',
747 'spiral1', 'spiral2', 'spotlight', 'spotted', 'sqr', 'sqrt', 'statistics', 'str',
748 'strcmp', 'strength', 'strlen', 'strlwr', 'strupr', 'sturm', 'substr', 'switch', 'sys',
749 't', 'tan', 'tanh', 'test_camera_1', 'test_camera_2', 'test_camera_3',
750 'test_camera_4', 'texture', 'texture_map', 'tga', 'thickness', 'threshold',
751 'tightness', 'tile2', 'tiles', 'track', 'transform', 'translate', 'transmit',
752 'triangle_wave', 'true', 'ttf', 'turbulence', 'turb_depth', 'type',
753 'ultra_wide_angle', 'up', 'use_color', 'use_colour', 'use_index', 'u_steps',
754 'val', 'variance', 'vaxis_rotate', 'vcross', 'vdot', 'version', 'vlength',
755 'vnormalize', 'volume_object', 'volume_rendered', 'vol_with_light',
756 'vrotate', 'v_steps', 'warning', 'warp', 'water_level', 'waves', 'while', 'width',
757 'wood', 'wrinkles', 'yes'), prefix=r'\b', suffix=r'\b'),
758 Keyword),
759 (words((
760 'bicubic_patch', 'blob', 'box', 'camera', 'cone', 'cubic', 'cylinder', 'difference',
761 'disc', 'height_field', 'intersection', 'julia_fractal', 'lathe',
762 'light_source', 'merge', 'mesh', 'object', 'plane', 'poly', 'polygon', 'prism',
763 'quadric', 'quartic', 'smooth_triangle', 'sor', 'sphere', 'superellipsoid',
764 'text', 'torus', 'triangle', 'union'), suffix=r'\b'),
765 Name.Builtin),
766 (r'\b(x|y|z|u|v)\b', Name.Builtin.Pseudo),
767 (r'[a-zA-Z_]\w*', Name),
768 (r'[0-9]*\.[0-9]+', Number.Float),
769 (r'[0-9]+', Number.Integer),
770 (r'[\[\](){}<>;,]', Punctuation),
771 (r'[-+*/=.|&]|<=|>=|!=', Operator),
772 (r'"(\\\\|\\[^\\]|[^"\\])*"', String),
773 (r'\s+', Whitespace),
774 ]
775 }
776
777 def analyse_text(text):
778 """POVRAY is similar to JSON/C, but the combination of camera and
779 light_source is probably not very likely elsewhere. HLSL or GLSL
780 are similar (GLSL even has #version), but they miss #declare, and
781 light_source/camera are not keywords anywhere else -- it's fair
782 to assume though that any POVRAY scene must have a camera and
783 lightsource."""
784 result = 0
785 if '#version' in text:
786 result += 0.05
787 if '#declare' in text:
788 result += 0.05
789 if 'camera' in text:
790 result += 0.05
791 if 'light_source' in text:
792 result += 0.1
793
794 return result