aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/markup/orgmode/orgmode.go44
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,