diff options
Diffstat (limited to 'modules/markup/html.go')
-rw-r--r-- | modules/markup/html.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/modules/markup/html.go b/modules/markup/html.go index 036b664b00..20a158b1c5 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -227,6 +227,23 @@ func RenderCommitMessage( 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 byteBodyTagClosing = []byte("</body>") @@ -658,3 +675,34 @@ func genDefaultLinkProcessor(defaultLink string) processor { 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 +} |