mason.go

 1package m
 2
 3import (
 4	. "github.com/alecthomas/chroma"          // nolint
 5	. "github.com/alecthomas/chroma/lexers/h" // nolint
 6	"github.com/alecthomas/chroma/lexers/internal"
 7	. "github.com/alecthomas/chroma/lexers/p" // nolint
 8)
 9
10// Mason lexer.
11var Mason = internal.Register(MustNewLexer(
12	&Config{
13		Name:      "Mason",
14		Aliases:   []string{"mason"},
15		Filenames: []string{"*.m", "*.mhtml", "*.mc", "*.mi", "autohandler", "dhandler"},
16		MimeTypes: []string{"application/x-mason"},
17		Priority:  0.1,
18	},
19	Rules{
20		"root": {
21			{`\s+`, Text, nil},
22			{`(<%doc>)(.*?)(</%doc>)(?s)`, ByGroups(NameTag, CommentMultiline, NameTag), nil},
23			{`(<%(?:def|method))(\s*)(.*?)(>)(.*?)(</%\2\s*>)(?s)`, ByGroups(NameTag, Text, NameFunction, NameTag, UsingSelf("root"), NameTag), nil},
24			{`(<%\w+)(.*?)(>)(.*?)(</%\2\s*>)(?s)`, ByGroups(NameTag, NameFunction, NameTag, Using(Perl), NameTag), nil},
25			{`(<&[^|])(.*?)(,.*?)?(&>)(?s)`, ByGroups(NameTag, NameFunction, Using(Perl), NameTag), nil},
26			{`(<&\|)(.*?)(,.*?)?(&>)(?s)`, ByGroups(NameTag, NameFunction, Using(Perl), NameTag), nil},
27			{`</&>`, NameTag, nil},
28			{`(<%!?)(.*?)(%>)(?s)`, ByGroups(NameTag, Using(Perl), NameTag), nil},
29			{`(?<=^)#[^\n]*(\n|\Z)`, Comment, nil},
30			{`(?<=^)(%)([^\n]*)(\n|\Z)`, ByGroups(NameTag, Using(Perl), Other), nil},
31			{`(?sx)
32                 (.+?)               # anything, followed by:
33                 (?:
34                  (?<=\n)(?=[%#]) |  # an eval or comment line
35                  (?=</?[%&]) |      # a substitution or block or
36                                     # call start or end
37                                     # - don't consume
38                  (\\\n) |           # an escaped newline
39                  \Z                 # end of string
40                 )`, ByGroups(Using(HTML), Operator), nil},
41		},
42	},
43))