mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 19:06:18 +01:00 
			
		
		
		
	Rewrite markdown rendering to blackfriday v2 and rewrite orgmode rendering to go-org (#8560)
* Rewrite markdown rendering to blackfriday v2.0 * Fix style * Fix go mod with golang 1.13 * Fix blackfriday v2 import * Inital orgmode renderer migration to go-org * Vendor go-org dependency * Ignore errors :/ * Update go-org to latest version * Update test * Fix go-org test * Remove unneeded code * Fix comments * Fix markdown test * Fix blackfriday regression rendering HTML block
This commit is contained in:
		| @@ -5,12 +5,16 @@ | ||||
| package markup | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"html" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/markup" | ||||
| 	"code.gitea.io/gitea/modules/markup/markdown" | ||||
| 	"code.gitea.io/gitea/modules/util" | ||||
|  | ||||
| 	"github.com/chaseadamsio/goorgeous" | ||||
| 	"github.com/russross/blackfriday" | ||||
| 	"github.com/niklasfasching/go-org/org" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| @@ -32,23 +36,23 @@ func (Parser) Extensions() []string { | ||||
| } | ||||
|  | ||||
| // Render renders orgmode rawbytes to HTML | ||||
| func Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) (result []byte) { | ||||
| 	defer func() { | ||||
| 		if err := recover(); err != nil { | ||||
| 			log.Error("Panic in orgmode.Render: %v Just returning the rawBytes", err) | ||||
| 			result = rawBytes | ||||
| 		} | ||||
| 	}() | ||||
| 	htmlFlags := blackfriday.HTML_USE_XHTML | ||||
| 	htmlFlags |= blackfriday.HTML_SKIP_STYLE | ||||
| 	htmlFlags |= blackfriday.HTML_OMIT_CONTENTS | ||||
| 	renderer := &markdown.Renderer{ | ||||
| 		Renderer:  blackfriday.HtmlRenderer(htmlFlags, "", ""), | ||||
| 		URLPrefix: urlPrefix, | ||||
| 		IsWiki:    isWiki, | ||||
| func Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { | ||||
| 	htmlWriter := org.NewHTMLWriter() | ||||
|  | ||||
| 	renderer := &Renderer{ | ||||
| 		HTMLWriter: htmlWriter, | ||||
| 		URLPrefix:  urlPrefix, | ||||
| 		IsWiki:     isWiki, | ||||
| 	} | ||||
| 	result = goorgeous.Org(rawBytes, renderer) | ||||
| 	return | ||||
|  | ||||
| 	htmlWriter.ExtendingWriter = renderer | ||||
|  | ||||
| 	res, err := org.New().Silent().Parse(bytes.NewReader(rawBytes), "").Write(renderer) | ||||
| 	if err != nil { | ||||
| 		log.Error("Panic in orgmode.Render: %v Just returning the rawBytes", err) | ||||
| 		return rawBytes | ||||
| 	} | ||||
| 	return []byte(res) | ||||
| } | ||||
|  | ||||
| // RenderString reners orgmode string to HTML string | ||||
| @@ -56,7 +60,63 @@ func RenderString(rawContent string, urlPrefix string, metas map[string]string, | ||||
| 	return string(Render([]byte(rawContent), urlPrefix, metas, isWiki)) | ||||
| } | ||||
|  | ||||
| // Render implements markup.Parser | ||||
| // Render reners orgmode string to HTML string | ||||
| func (Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { | ||||
| 	return Render(rawBytes, urlPrefix, metas, isWiki) | ||||
| } | ||||
|  | ||||
| // Renderer implements org.Writer | ||||
| type Renderer struct { | ||||
| 	*org.HTMLWriter | ||||
| 	URLPrefix string | ||||
| 	IsWiki    bool | ||||
| } | ||||
|  | ||||
| var byteMailto = []byte("mailto:") | ||||
|  | ||||
| // WriteRegularLink renders images, links or videos | ||||
| func (r *Renderer) WriteRegularLink(l org.RegularLink) { | ||||
| 	link := []byte(html.EscapeString(l.URL)) | ||||
| 	if l.Protocol == "file" { | ||||
| 		link = link[len("file:"):] | ||||
| 	} | ||||
| 	if len(link) > 0 && !markup.IsLink(link) && | ||||
| 		link[0] != '#' && !bytes.HasPrefix(link, byteMailto) { | ||||
| 		lnk := string(link) | ||||
| 		if r.IsWiki { | ||||
| 			lnk = util.URLJoin("wiki", lnk) | ||||
| 		} | ||||
| 		link = []byte(util.URLJoin(r.URLPrefix, lnk)) | ||||
| 	} | ||||
|  | ||||
| 	description := string(link) | ||||
| 	if l.Description != nil { | ||||
| 		description = r.nodesAsString(l.Description...) | ||||
| 	} | ||||
| 	switch l.Kind() { | ||||
| 	case "image": | ||||
| 		r.WriteString(fmt.Sprintf(`<img src="%s" alt="%s" title="%s" />`, link, description, description)) | ||||
| 	case "video": | ||||
| 		r.WriteString(fmt.Sprintf(`<video src="%s" title="%s">%s</video>`, link, description, description)) | ||||
| 	default: | ||||
| 		r.WriteString(fmt.Sprintf(`<a href="%s" title="%s">%s</a>`, link, description, description)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (r *Renderer) emptyClone() *Renderer { | ||||
| 	wcopy := *(r.HTMLWriter) | ||||
| 	wcopy.Builder = strings.Builder{} | ||||
|  | ||||
| 	rcopy := *r | ||||
| 	rcopy.HTMLWriter = &wcopy | ||||
|  | ||||
| 	wcopy.ExtendingWriter = &rcopy | ||||
|  | ||||
| 	return &rcopy | ||||
| } | ||||
|  | ||||
| func (r *Renderer) nodesAsString(nodes ...org.Node) string { | ||||
| 	tmp := r.emptyClone() | ||||
| 	org.WriteNodes(tmp, nodes...) | ||||
| 	return tmp.String() | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user