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))