Fix reported issue in repo description (#6306)
This commit is contained in:
		
							parent
							
								
									663874e8be
								
							
						
					
					
						commit
						b2e9894988
					
				| @ -722,10 +722,12 @@ var ( | |||||||
| 
 | 
 | ||||||
| // DescriptionHTML does special handles to description and return HTML string.
 | // DescriptionHTML does special handles to description and return HTML string.
 | ||||||
| func (repo *Repository) DescriptionHTML() template.HTML { | func (repo *Repository) DescriptionHTML() template.HTML { | ||||||
| 	sanitize := func(s string) string { | 	desc, err := markup.RenderDescriptionHTML([]byte(repo.Description), repo.HTMLURL(), repo.ComposeMetas()) | ||||||
| 		return fmt.Sprintf(`<a href="%[1]s" target="_blank" rel="noopener noreferrer">%[1]s</a>`, s) | 	if err != nil { | ||||||
|  | 		log.Error(4, "Failed to render description for %s (ID: %d): %v", repo.Name, repo.ID, err) | ||||||
|  | 		return template.HTML(markup.Sanitize(repo.Description)) | ||||||
| 	} | 	} | ||||||
| 	return template.HTML(descPattern.ReplaceAllStringFunc(markup.Sanitize(repo.Description), sanitize)) | 	return template.HTML(markup.Sanitize(string(desc))) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // LocalCopyPath returns the local repository copy path.
 | // LocalCopyPath returns the local repository copy path.
 | ||||||
|  | |||||||
| @ -227,6 +227,23 @@ func RenderCommitMessage( | |||||||
| 	return ctx.postProcess(rawHTML) | 	return ctx.postProcess(rawHTML) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // RenderDescriptionHTML will use similar logic as PostProcess, but will
 | ||||||
|  | // use a single special linkProcessor.
 | ||||||
|  | func RenderDescriptionHTML( | ||||||
|  | 	rawHTML []byte, | ||||||
|  | 	urlPrefix string, | ||||||
|  | 	metas map[string]string, | ||||||
|  | ) ([]byte, error) { | ||||||
|  | 	ctx := &postProcessCtx{ | ||||||
|  | 		metas:     metas, | ||||||
|  | 		urlPrefix: urlPrefix, | ||||||
|  | 		procs: []processor{ | ||||||
|  | 			descriptionLinkProcessor, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	return ctx.postProcess(rawHTML) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var byteBodyTag = []byte("<body>") | var byteBodyTag = []byte("<body>") | ||||||
| var byteBodyTagClosing = []byte("</body>") | var byteBodyTagClosing = []byte("</body>") | ||||||
| 
 | 
 | ||||||
| @ -658,3 +675,34 @@ func genDefaultLinkProcessor(defaultLink string) processor { | |||||||
| 		node.FirstChild, node.LastChild = ch, ch | 		node.FirstChild, node.LastChild = ch, ch | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // descriptionLinkProcessor creates links for DescriptionHTML
 | ||||||
|  | func descriptionLinkProcessor(ctx *postProcessCtx, node *html.Node) { | ||||||
|  | 	m := linkRegex.FindStringIndex(node.Data) | ||||||
|  | 	if m == nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	uri := node.Data[m[0]:m[1]] | ||||||
|  | 	replaceContent(node, m[0], m[1], createDescriptionLink(uri, uri)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func createDescriptionLink(href, content string) *html.Node { | ||||||
|  | 	textNode := &html.Node{ | ||||||
|  | 		Type: html.TextNode, | ||||||
|  | 		Data: content, | ||||||
|  | 	} | ||||||
|  | 	linkNode := &html.Node{ | ||||||
|  | 		FirstChild: textNode, | ||||||
|  | 		LastChild:  textNode, | ||||||
|  | 		Type:       html.ElementNode, | ||||||
|  | 		Data:       "a", | ||||||
|  | 		DataAtom:   atom.A, | ||||||
|  | 		Attr: []html.Attribute{ | ||||||
|  | 			{Key: "href", Val: href}, | ||||||
|  | 			{Key: "target", Val: "_blank"}, | ||||||
|  | 			{Key: "rel", Val: "noopener noreferrer"}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	textNode.Parent = linkNode | ||||||
|  | 	return linkNode | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user