1package lexers
 2
 3import (
 4	. "github.com/alecthomas/chroma/v2" // nolint
 5)
 6
 7// Smarty lexer.
 8var Smarty = Register(MustNewLexer(
 9	&Config{
10		Name:      "Smarty",
11		Aliases:   []string{"smarty"},
12		Filenames: []string{"*.tpl"},
13		MimeTypes: []string{"application/x-smarty"},
14		DotAll:    true,
15	},
16	smartyRules,
17))
18
19func smartyRules() Rules {
20	return Rules{
21		"root": {
22			{`[^{]+`, Other, nil},
23			{`(\{)(\*.*?\*)(\})`, ByGroups(CommentPreproc, Comment, CommentPreproc), nil},
24			{`(\{php\})(.*?)(\{/php\})`, ByGroups(CommentPreproc, Using("PHP"), CommentPreproc), nil},
25			{`(\{)(/?[a-zA-Z_]\w*)(\s*)`, ByGroups(CommentPreproc, NameFunction, Text), Push("smarty")},
26			{`\{`, CommentPreproc, Push("smarty")},
27		},
28		"smarty": {
29			{`\s+`, Text, nil},
30			{`\{`, CommentPreproc, Push()},
31			{`\}`, CommentPreproc, Pop(1)},
32			{`#[a-zA-Z_]\w*#`, NameVariable, nil},
33			{`\$[a-zA-Z_]\w*(\.\w+)*`, NameVariable, nil},
34			{`[~!%^&*()+=|\[\]:;,.<>/?@-]`, Operator, nil},
35			{`(true|false|null)\b`, KeywordConstant, nil},
36			{`[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?`, LiteralNumber, nil},
37			{`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil},
38			{`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil},
39			{`[a-zA-Z_]\w*`, NameAttribute, nil},
40		},
41	}
42}