backport 6306 (#6308)
This commit is contained in:
parent
59a64c0e1d
commit
c7bbfd8f5e
2 changed files with 53 additions and 3 deletions
|
@ -719,10 +719,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.
|
||||||
|
|
|
@ -234,6 +234,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>")
|
||||||
|
|
||||||
|
@ -668,3 +685,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
|
||||||
|
}
|
||||||
|
|
Reference in a new issue