From 3a4fcf185314aa788088edfa6a0a5c6b4db0f9dd Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 3 Jan 2021 18:25:16 +0800 Subject: [PATCH 1/4] Fix missed orgmode code block hightlight --- modules/markup/orgmode/orgmode.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index ddd445aba2ad..b0f38c371d4f 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -10,10 +10,12 @@ import ( "html" "strings" + "code.gitea.io/gitea/modules/highlight" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/util" + "github.com/alecthomas/chroma/lexers" "github.com/niklasfasching/go-org/org" ) @@ -38,6 +40,28 @@ func (Parser) Extensions() []string { // Render renders orgmode rawbytes to HTML func Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { htmlWriter := org.NewHTMLWriter() + htmlWriter.HighlightCodeBlock = func(source, lang string, inline bool) string { + var w strings.Builder + if _, err := w.WriteString(`
`); err != nil {
+			return ""
+		}
+
+		// include language-x class as part of commonmark spec
+		if _, err := w.WriteString(``); err != nil {
+			return ""
+		}
+
+		lexer := lexers.Get(lang)
+		if _, err := w.WriteString(highlight.Code(lexer.Config().Filenames[0], source)); err != nil {
+			return ""
+		}
+
+		if _, err := w.WriteString("
"); err != nil { + return "" + } + + return w.String() + } renderer := &Renderer{ HTMLWriter: htmlWriter, From 4ba60994038893dcf511a699a011c3345d81d435 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Wed, 23 Jun 2021 19:56:38 +0100 Subject: [PATCH 2/4] Fix NPE The long standing problem was caused by the lexer not finding the requested language we therefore fallback to analyzing the language and guessing it ourselves. Signed-off-by: Andrew Thornton --- modules/markup/orgmode/orgmode.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index 60bd0e6312ca..aac0a1a14ae4 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -15,6 +15,7 @@ import ( "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" ) @@ -49,12 +50,21 @@ func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error return "" } + lexer := lexers.Get(lang) + if lexer == nil { + lexer = lexers.Analyse(source) + if lexer == nil { + lexer = lexers.Fallback + } + lang = strings.ToLower(lexer.Config().Name) + } + // include language-x class as part of commonmark spec if _, err := w.WriteString(``); err != nil { return "" } + lexer = chroma.Coalesce(lexer) - lexer := lexers.Get(lang) if _, err := w.WriteString(highlight.Code(lexer.Config().Filenames[0], source)); err != nil { return "" } From c34bb6d3c8e1ecfdb6f25f753ce94a885a317d32 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Wed, 23 Jun 2021 20:10:37 +0100 Subject: [PATCH 3/4] only autodetect if no language is provided Signed-off-by: Andrew Thornton --- modules/markup/orgmode/orgmode.go | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index aac0a1a14ae4..6a19ec42fa14 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -51,7 +51,7 @@ func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error } lexer := lexers.Get(lang) - if lexer == nil { + if lexer == nil && lang == "" { lexer = lexers.Analyse(source) if lexer == nil { lexer = lexers.Fallback @@ -59,14 +59,24 @@ func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error lang = strings.ToLower(lexer.Config().Name) } - // include language-x class as part of commonmark spec - if _, err := w.WriteString(``); err != nil { - return "" - } - lexer = chroma.Coalesce(lexer) + if lexer == nil { + // include language-x class as part of commonmark spec + if _, err := w.WriteString(``); 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(``); 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(highlight.Code(lexer.Config().Filenames[0], source)); err != nil { + return "" + } } if _, err := w.WriteString(""); err != nil { From 4101f54e91c65ef241395a7d3388234e52b42022 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Wed, 23 Jun 2021 20:22:33 +0100 Subject: [PATCH 4/4] add the chroma back in Signed-off-by: Andrew Thornton --- modules/markup/orgmode/orgmode.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index 6a19ec42fa14..851fc97f9a81 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -61,7 +61,7 @@ func Render(ctx *markup.RenderContext, input io.Reader, output io.Writer) error if lexer == nil { // include language-x class as part of commonmark spec - if _, err := w.WriteString(``); err != nil { + if _, err := w.WriteString(``); err != nil { return "" } if _, err := w.WriteString(html.EscapeString(source)); err != nil {