]> source.dussan.org Git - gitea.git/commitdiff
Add code block highlight to orgmode back (#14222)
authorLunny Xiao <xiaolunwen@gmail.com>
Wed, 23 Jun 2021 20:45:47 +0000 (04:45 +0800)
committerGitHub <noreply@github.com>
Wed, 23 Jun 2021 20:45:47 +0000 (22:45 +0200)
Fix missed orgmode code block hightlight

Co-authored-by: zeripath <art27@cantab.net>
modules/markup/orgmode/orgmode.go

index 96e67f90cfa2abf70ed760465a1d957236bf735e..851fc97f9a81b961dad1fda23dc1a915cad5c423 100644 (file)
@@ -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,