66
|
1 package lexers
|
|
2
|
|
3 import (
|
|
4 . "github.com/alecthomas/chroma/v2" // nolint
|
|
5 )
|
|
6
|
|
7 // Markdown lexer.
|
|
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 }
|