|
|
|
@ -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
|
|
|
|
|
}
|
|
|
|
|