1
0
mirror of https://github.com/alecthomas/chroma.git synced 2025-10-08 22:52:04 +02:00
Files
chroma/lexers/markdown.go
Alec Thomas 1f48e65abc fix(markdown): don't delegate to HTML lexer
This causes issues whereby Markdown code fragments such as:

```
`<script>`
```

Are treated as HTML, resulting in errors and backtracking.

Note that this does mean that HTML in Markdown is not highlighted, but
we can potentially add rules to the Markdown lexer to solve that.

Fixes #1119
2025-08-04 13:51:03 +10:00

47 lines
1.6 KiB
Go

package lexers
import (
. "github.com/alecthomas/chroma/v2" // nolint
)
// Markdown lexer.
var Markdown = Register(MustNewLexer(
&Config{
Name: "markdown",
Aliases: []string{"md", "mkd"},
Filenames: []string{"*.md", "*.mkd", "*.markdown"},
MimeTypes: []string{"text/x-markdown"},
},
markdownRules,
))
func markdownRules() Rules {
return Rules{
"root": {
{`^(#[^#].+\n)`, ByGroups(GenericHeading), nil},
{`^(#{2,6}.+\n)`, ByGroups(GenericSubheading), nil},
{`^(\s*)([*-] )(\[[ xX]\])( .+\n)`, ByGroups(Text, Keyword, Keyword, UsingSelf("inline")), nil},
{`^(\s*)([*-])(\s)(.+\n)`, ByGroups(Text, Keyword, Text, UsingSelf("inline")), nil},
{`^(\s*)([0-9]+\.)( .+\n)`, ByGroups(Text, Keyword, UsingSelf("inline")), nil},
{`^(\s*>\s)(.+\n)`, ByGroups(Keyword, GenericEmph), nil},
{"^(```\\n)([\\w\\W]*?)(^```$)", ByGroups(String, Text, String), nil},
{
"^(```)(\\w+)(\\n)([\\w\\W]*?)(^```$)",
UsingByGroup(2, 4, String, String, String, Text, String),
nil,
},
Include("inline"),
},
"inline": {
{`\\.`, Text, nil},
{`(\s)(\*|_)((?:(?!\2).)*)(\2)((?=\W|\n))`, ByGroups(Text, GenericEmph, GenericEmph, GenericEmph, Text), nil},
{`(\s)((\*\*|__).*?)\3((?=\W|\n))`, ByGroups(Text, GenericStrong, GenericStrong, Text), nil},
{`(\s)(~~[^~]+~~)((?=\W|\n))`, ByGroups(Text, GenericDeleted, Text), nil},
{"`[^`]+`", LiteralStringBacktick, nil},
{`[@#][\w/:]+`, NameEntity, nil},
{`(!?\[)([^]]+)(\])(\()([^)]+)(\))`, ByGroups(Text, NameTag, Text, Text, NameAttribute, Text), nil},
{`.|\n`, Text, nil},
},
}
}