diff options
Diffstat (limited to 'modules/markup/html.go')
-rw-r--r-- | modules/markup/html.go | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/modules/markup/html.go b/modules/markup/html.go index e016b67d0c..7bd8e8d8f4 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -54,7 +54,7 @@ var ( shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`) // anySHA1Pattern allows to split url containing SHA into parts - anySHA1Pattern = regexp.MustCompile(`https?://(?:\S+/){4}([0-9a-f]{40})/?([^#\s]+)?(?:#(\S+))?`) + anySHA1Pattern = regexp.MustCompile(`https?://(?:\S+/){4}([0-9a-f]{40})(/[^#\s]+)?(#\S+)?`) validLinksPattern = regexp.MustCompile(`^[a-z][\w-]+://`) @@ -594,31 +594,46 @@ func fullSha1PatternProcessor(ctx *postProcessCtx, node *html.Node) { if m == nil { return } - // take out what's relevant + urlFull := node.Data[m[0]:m[1]] - hash := node.Data[m[2]:m[3]] + text := base.ShortSha(node.Data[m[2]:m[3]]) - var subtree, line string + // 3rd capture group matches a optional path + subpath := "" + if m[5] > 0 { + subpath = node.Data[m[4]:m[5]] + } - // optional, we do them depending on the length. + // 4th capture group matches a optional url hash + hash := "" if m[7] > 0 { - line = node.Data[m[6]:m[7]] + hash = node.Data[m[6]:m[7]][1:] } - if m[5] > 0 { - subtree = node.Data[m[4]:m[5]] + + start := m[0] + end := m[1] + + // If url ends in '.', it's very likely that it is not part of the + // actual url but used to finish a sentence. + if strings.HasSuffix(urlFull, ".") { + end-- + urlFull = urlFull[:len(urlFull)-1] + if hash != "" { + hash = hash[:len(hash)-1] + } else if subpath != "" { + subpath = subpath[:len(subpath)-1] + } } - text := base.ShortSha(hash) - if subtree != "" { - text += "/" + subtree + if subpath != "" { + text += subpath } - if line != "" { - text += " (" - text += line - text += ")" + + if hash != "" { + text += " (" + hash + ")" } - replaceContent(node, m[0], m[1], createLink(urlFull, text)) + replaceContent(node, start, end, createLink(urlFull, text)) } // sha1CurrentPatternProcessor renders SHA1 strings to corresponding links that |