Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions src/utils/syntax.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@ import (

// 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.
func highlightSyntaxViaContent(content string) (htmlOut string) {
func highlightSyntaxViaContent(content string, lang string) (htmlOut string) {
content = html.UnescapeString(content)

fallbackOut := html.EscapeString(content)

// identify the language
lexer := lexers.Analyse(content)
lexer := lexers.Get(lang)
if lexer == nil {
lexer = lexers.Analyse(content)
}
if lexer == nil {
lexer = lexers.Get(".js")
}
Expand Down Expand Up @@ -71,19 +73,20 @@ func stripBlockTags(content string) (result string) {
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.
func HighlightCodeBlocks(html string) string {
// Replace each code block with the highlighted version
highlightedHTML := codeBlockRegex.ReplaceAllStringFunc(html, func(codeBlock string) string {
// 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)

// Highlight the code content
highlightedCode := highlightSyntaxViaContent(codeContent)
highlightedCode := highlightSyntaxViaContent(codeContent, lang)

// Replace the original code block with the highlighted version
highlightedCodeBlock := "<pre>" + highlightedCode + "</pre>"
Expand Down