diff options
author | zeripath <art27@cantab.net> | 2020-02-28 04:16:05 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-28 01:16:05 -0300 |
commit | 9ad2aa8f4d4e66f77798751ce09c75e7d4235079 (patch) | |
tree | f4d3ee54f5b7c04126c900eddd4f2aaeb89ce862 | |
parent | efec0d393bebf2d66e8120834cda9bc314602efd (diff) | |
download | gitea-9ad2aa8f4d4e66f77798751ce09c75e7d4235079.tar.gz gitea-9ad2aa8f4d4e66f77798751ce09c75e7d4235079.zip |
Use media links for img in post-process (#10515)
* use media links for img in post-process
* do not visit text of anchors
-rw-r--r-- | modules/markup/html.go | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/modules/markup/html.go b/modules/markup/html.go index 1c73f03df1..51d161ecca 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -290,7 +290,7 @@ func (ctx *postProcessCtx) postProcess(rawHTML []byte) ([]byte, error) { } for _, node := range nodes { - ctx.visitNode(node) + ctx.visitNode(node, true) } // Create buffer in which the data will be placed again. We know that the @@ -313,7 +313,7 @@ func (ctx *postProcessCtx) postProcess(rawHTML []byte) ([]byte, error) { return res, nil } -func (ctx *postProcessCtx) visitNode(node *html.Node) { +func (ctx *postProcessCtx) visitNode(node *html.Node, visitText bool) { // Add user-content- to IDs if they don't already have them for idx, attr := range node.Attr { if attr.Key == "id" && !(strings.HasPrefix(attr.Val, "user-content-") || blackfridayExtRegex.MatchString(attr.Val)) { @@ -323,13 +323,37 @@ func (ctx *postProcessCtx) visitNode(node *html.Node) { // We ignore code, pre and already generated links. switch node.Type { case html.TextNode: - ctx.textNode(node) + if visitText { + ctx.textNode(node) + } case html.ElementNode: - if node.Data == "a" || node.Data == "code" || node.Data == "pre" { + if node.Data == "img" { + attrs := node.Attr + for idx, attr := range attrs { + if attr.Key != "src" { + continue + } + link := []byte(attr.Val) + if len(link) > 0 && !IsLink(link) { + prefix := ctx.urlPrefix + if ctx.isWikiMarkdown { + prefix = util.URLJoin(prefix, "wiki", "raw") + } + prefix = strings.Replace(prefix, "/src/", "/media/", 1) + + lnk := string(link) + lnk = util.URLJoin(prefix, lnk) + link = []byte(lnk) + } + node.Attr[idx].Val = string(link) + } + } else if node.Data == "a" { + visitText = false + } else if node.Data == "code" || node.Data == "pre" { return } for n := node.FirstChild; n != nil; n = n.NextSibling { - ctx.visitNode(n) + ctx.visitNode(n, visitText) } } // ignore everything else |