make.go

 1package m
 2
 3import (
 4	. "github.com/alecthomas/chroma"          // nolint
 5	. "github.com/alecthomas/chroma/lexers/b" // nolint
 6	"github.com/alecthomas/chroma/lexers/internal"
 7)
 8
 9// Makefile lexer.
10var Makefile = internal.Register(MustNewLexer(
11	&Config{
12		Name:      "Base Makefile",
13		Aliases:   []string{"make", "makefile", "mf", "bsdmake"},
14		Filenames: []string{"*.mak", "*.mk", "Makefile", "makefile", "Makefile.*", "GNUmakefile"},
15		MimeTypes: []string{"text/x-makefile"},
16		EnsureNL:  true,
17	},
18	Rules{
19		"root": {
20			{`^(?:[\t ]+.*\n|\n)+`, Using(Bash), nil},
21			{`\$[<@$+%?|*]`, Keyword, nil},
22			{`\s+`, Text, nil},
23			{`#.*?\n`, Comment, nil},
24			{`(export)(\s+)(?=[\w${}\t -]+\n)`, ByGroups(Keyword, Text), Push("export")},
25			{`export\s+`, Keyword, nil},
26			{`([\w${}().-]+)(\s*)([!?:+]?=)([ \t]*)((?:.*\\\n)+|.*\n)`, ByGroups(NameVariable, Text, Operator, Text, Using(Bash)), nil},
27			{`(?s)"(\\\\|\\.|[^"\\])*"`, LiteralStringDouble, nil},
28			{`(?s)'(\\\\|\\.|[^'\\])*'`, LiteralStringSingle, nil},
29			{`([^\n:]+)(:+)([ \t]*)`, ByGroups(NameFunction, Operator, Text), Push("block-header")},
30			{`\$\(`, Keyword, Push("expansion")},
31		},
32		"expansion": {
33			{`[^$a-zA-Z_()]+`, Text, nil},
34			{`[a-zA-Z_]+`, NameVariable, nil},
35			{`\$`, Keyword, nil},
36			{`\(`, Keyword, Push()},
37			{`\)`, Keyword, Pop(1)},
38		},
39		"export": {
40			{`[\w${}-]+`, NameVariable, nil},
41			{`\n`, Text, Pop(1)},
42			{`\s+`, Text, nil},
43		},
44		"block-header": {
45			{`[,|]`, Punctuation, nil},
46			{`#.*?\n`, Comment, Pop(1)},
47			{`\\\n`, Text, nil},
48			{`\$\(`, Keyword, Push("expansion")},
49			{`[a-zA-Z_]+`, Name, nil},
50			{`\n`, Text, Pop(1)},
51			{`.`, Text, nil},
52		},
53	},
54))