forked from NYANDEV/forgejo
Add code block highlight to orgmode back (#14222)
Fix missed orgmode code block hightlight Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
parent
58501a2682
commit
f2babf3346
1 changed files with 44 additions and 0 deletions
|
@ -11,9 +11,12 @@ import (
|
|||
"io"
|
||||
"strings"
|
||||
|
||||
"code.gitea.io/gitea/modules/highlight"
|
||||
"code.gitea.io/gitea/modules/markup"
|
||||
"code.gitea.io/gitea/modules/util"
|
||||
|
||||
"github.com/alecthomas/chroma"
|
||||
"github.com/alecthomas/chroma/lexers"
|
||||
"github.com/niklasfasching/go-org/org"
|
||||
)
|
||||
|
||||
|
@ -41,6 +44,47 @@ func (Renderer) Extensions() []string {
|
|||
// Render renders orgmode rawbytes to HTML
|
||||
func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error {
|
||||
htmlWriter := org.NewHTMLWriter()
|
||||
htmlWriter.HighlightCodeBlock = func(source, lang string, inline bool) string {
|
||||
var w strings.Builder
|
||||
if _, err := w.WriteString(`<pre>`); err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
lexer := lexers.Get(lang)
|
||||
if lexer == nil && lang == "" {
|
||||
lexer = lexers.Analyse(source)
|
||||
if lexer == nil {
|
||||
lexer = lexers.Fallback
|
||||
}
|
||||
lang = strings.ToLower(lexer.Config().Name)
|
||||
}
|
||||
|
||||
if lexer == nil {
|
||||
// include language-x class as part of commonmark spec
|
||||
if _, err := w.WriteString(`<code class="chroma language-` + string(lang) + `">`); err != nil {
|
||||
return ""
|
||||
}
|
||||
if _, err := w.WriteString(html.EscapeString(source)); err != nil {
|
||||
return ""
|
||||
}
|
||||
} else {
|
||||
// include language-x class as part of commonmark spec
|
||||
if _, err := w.WriteString(`<code class="chroma language-` + string(lang) + `">`); err != nil {
|
||||
return ""
|
||||
}
|
||||
lexer = chroma.Coalesce(lexer)
|
||||
|
||||
if _, err := w.WriteString(highlight.Code(lexer.Config().Filenames[0], source)); err != nil {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := w.WriteString("</code></pre>"); err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
return w.String()
|
||||
}
|
||||
|
||||
w := &Writer{
|
||||
HTMLWriter: htmlWriter,
|
||||
|
|
Loading…
Reference in a new issue