@@ -11,9 +11,12 @@ import (
11
11
"io"
12
12
"strings"
13
13
14
+ "code.gitea.io/gitea/modules/highlight"
14
15
"code.gitea.io/gitea/modules/markup"
15
16
"code.gitea.io/gitea/modules/util"
16
17
18
+ "github.com/alecthomas/chroma"
19
+ "github.com/alecthomas/chroma/lexers"
17
20
"github.com/niklasfasching/go-org/org"
18
21
)
19
22
@@ -41,6 +44,47 @@ func (Renderer) Extensions() []string {
41
44
// Render renders orgmode rawbytes to HTML
42
45
func Render (ctx * markup.RenderContext , input io.Reader , output io.Writer ) error {
43
46
htmlWriter := org .NewHTMLWriter ()
47
+ htmlWriter .HighlightCodeBlock = func (source , lang string , inline bool ) string {
48
+ var w strings.Builder
49
+ if _ , err := w .WriteString (`<pre>` ); err != nil {
50
+ return ""
51
+ }
52
+
53
+ lexer := lexers .Get (lang )
54
+ if lexer == nil && lang == "" {
55
+ lexer = lexers .Analyse (source )
56
+ if lexer == nil {
57
+ lexer = lexers .Fallback
58
+ }
59
+ lang = strings .ToLower (lexer .Config ().Name )
60
+ }
61
+
62
+ if lexer == nil {
63
+ // include language-x class as part of commonmark spec
64
+ if _ , err := w .WriteString (`<code class="chroma language-` + string (lang ) + `">` ); err != nil {
65
+ return ""
66
+ }
67
+ if _ , err := w .WriteString (html .EscapeString (source )); err != nil {
68
+ return ""
69
+ }
70
+ } else {
71
+ // include language-x class as part of commonmark spec
72
+ if _ , err := w .WriteString (`<code class="chroma language-` + string (lang ) + `">` ); err != nil {
73
+ return ""
74
+ }
75
+ lexer = chroma .Coalesce (lexer )
76
+
77
+ if _ , err := w .WriteString (highlight .Code (lexer .Config ().Filenames [0 ], source )); err != nil {
78
+ return ""
79
+ }
80
+ }
81
+
82
+ if _ , err := w .WriteString ("</code></pre>" ); err != nil {
83
+ return ""
84
+ }
85
+
86
+ return w .String ()
87
+ }
44
88
45
89
w := & Writer {
46
90
HTMLWriter : htmlWriter ,
0 commit comments