1 package lexers
2
3 import (
4 . "github.com/alecthomas/chroma/v2"
5 )
6
7
8 var Markdown = Register(DelegatingLexer(HTML, MustNewLexer(
9 &Config{
10 Name: "markdown",
11 Aliases: []string{"md", "mkd"},
12 Filenames: []string{"*.md", "*.mkd", "*.markdown"},
13 MimeTypes: []string{"text/x-markdown"},
14 },
15 markdownRules,
16 )))
17
18 func markdownRules() Rules {
19 return Rules{
20 "root": {
21 {`^(#[^#].+\n)`, ByGroups(GenericHeading), nil},
22 {`^(#{2,6}.+\n)`, ByGroups(GenericSubheading), nil},
23 {`^(\s*)([*-] )(\[[ xX]\])( .+\n)`, ByGroups(Text, Keyword, Keyword, UsingSelf("inline")), nil},
24 {`^(\s*)([*-])(\s)(.+\n)`, ByGroups(Text, Keyword, Text, UsingSelf("inline")), nil},
25 {`^(\s*)([0-9]+\.)( .+\n)`, ByGroups(Text, Keyword, UsingSelf("inline")), nil},
26 {`^(\s*>\s)(.+\n)`, ByGroups(Keyword, GenericEmph), nil},
27 {"^(```\\n)([\\w\\W]*?)(^```$)", ByGroups(String, Text, String), nil},
28 {
29 "^(```)(\\w+)(\\n)([\\w\\W]*?)(^```$)",
30 UsingByGroup(2, 4, String, String, String, Text, String),
31 nil,
32 },
33 Include("inline"),
34 },
35 "inline": {
36 {`\\.`, Text, nil},
37 {`(\s)(\*|_)((?:(?!\2).)*)(\2)((?=\W|\n))`, ByGroups(Text, GenericEmph, GenericEmph, GenericEmph, Text), nil},
38 {`(\s)((\*\*|__).*?)\3((?=\W|\n))`, ByGroups(Text, GenericStrong, GenericStrong, Text), nil},
39 {`(\s)(~~[^~]+~~)((?=\W|\n))`, ByGroups(Text, GenericDeleted, Text), nil},
40 {"`[^`]+`", LiteralStringBacktick, nil},
41 {`[@#][\w/:]+`, NameEntity, nil},
42 {`(!?\[)([^]]+)(\])(\()([^)]+)(\))`, ByGroups(Text, NameTag, Text, Text, NameAttribute, Text), nil},
43 {`[^\\\s]+`, Other, nil},
44 {`.|\n`, Other, nil},
45 },
46 }
47 }
48
View as plain text