improvement: use lang-* classes declared in snippet markup (#97)

* improvement: use lang-* classes declared in snippet markup

* fix: don't require snippet lang classes in code blocks

* fix: constrain greedy code block match
This commit is contained in:
Solomon 2024-03-28 23:59:28 +00:00 committed by GitHub
parent bf5300706e
commit 23b8ed8899
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -14,13 +14,15 @@ import (
// highlightSyntaxViaContent uses Chroma to lex code content and apply the appropriate tokenizer engine. // highlightSyntaxViaContent uses Chroma to lex code content and apply the appropriate tokenizer engine.
// If it can't find one, it defaults to JavaScript syntax highlighting. // If it can't find one, it defaults to JavaScript syntax highlighting.
func highlightSyntaxViaContent(content string) (htmlOut string) { func highlightSyntaxViaContent(content string, lang string) (htmlOut string) {
content = html.UnescapeString(content) content = html.UnescapeString(content)
fallbackOut := html.EscapeString(content) fallbackOut := html.EscapeString(content)
// identify the language lexer := lexers.Get(lang)
lexer := lexers.Analyse(content) if lexer == nil {
lexer = lexers.Analyse(content)
}
if lexer == nil { if lexer == nil {
lexer = lexers.Get(".js") lexer = lexers.Get(".js")
} }
@ -71,19 +73,20 @@ func stripBlockTags(content string) (result string) {
return return
} }
var codeBlockRegex = regexp.MustCompile(`(?s)<pre><code>(.*?)<\/code><\/pre>`) var codeBlockRegex = regexp.MustCompile(`(?s)<pre(?:[^>]+?lang-(.+?)[\s"'])?.*?><code>(.*?)<\/code><\/pre>`)
// HighlightCodeBlocks uses both highlightSyntaxViaContent stripCodeBlocks and returns the newly highlighted code HTML. // HighlightCodeBlocks uses both highlightSyntaxViaContent stripCodeBlocks and returns the newly highlighted code HTML.
func HighlightCodeBlocks(html string) string { func HighlightCodeBlocks(html string) string {
// Replace each code block with the highlighted version // Replace each code block with the highlighted version
highlightedHTML := codeBlockRegex.ReplaceAllStringFunc(html, func(codeBlock string) string { highlightedHTML := codeBlockRegex.ReplaceAllStringFunc(html, func(codeBlock string) string {
// Extract the code content from the code block // Extract the code content from the code block
codeContent := codeBlockRegex.FindStringSubmatch(codeBlock)[1] matches := codeBlockRegex.FindStringSubmatch(codeBlock)
lang, codeContent := matches[1], matches[2]
codeContent = stripBlockTags(codeContent) codeContent = stripBlockTags(codeContent)
// Highlight the code content // Highlight the code content
highlightedCode := highlightSyntaxViaContent(codeContent) highlightedCode := highlightSyntaxViaContent(codeContent, lang)
// Replace the original code block with the highlighted version // Replace the original code block with the highlighted version
highlightedCodeBlock := "<pre>" + highlightedCode + "</pre>" highlightedCodeBlock := "<pre>" + highlightedCode + "</pre>"