diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/markup/orgmode/orgmode.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index 96e67f90cf..851fc97f9a 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -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, |