diff --git a/modules/base/template.go b/modules/base/template.go index 2571e7d244a0..f5f567adede5 100644 --- a/modules/base/template.go +++ b/modules/base/template.go @@ -96,9 +96,42 @@ func ToUtf8(content string) string { return res } +// Replaces all prefixes 'old' in 's' with 'new'. +func ReplaceLeft(s, old, new string) string { + old_len, new_len, i, n := len(old), len(new), 0, 0 + for ; i < len(s) && strings.HasPrefix(s[i:], old); n += 1 { + i += old_len + } + + // simple optimization + if n == 0 { + return s + } + + // allocating space for the new string + newLen := n*new_len + len(s[i:]) + replacement := make([]byte, newLen, newLen) + + j := 0 + for ; j < n*new_len; j += new_len { + copy(replacement[j:j+new_len], new) + } + + copy(replacement[j:], s[i:]) + return string(replacement) +} + // RenderCommitMessage renders commit message with XSS-safe and special links. func RenderCommitMessage(msg, urlPrefix string) template.HTML { - return template.HTML(string(RenderIssueIndexPattern([]byte(template.HTMLEscapeString(msg)), urlPrefix))) + cleanMsg := template.HTMLEscapeString(msg) + fullMessage := string(RenderIssueIndexPattern([]byte(cleanMsg), urlPrefix)) + msgLines := strings.Split(strings.TrimSpace(fullMessage), "\n") + for i := range msgLines { + msgLines[i] = ReplaceLeft(msgLines[i], " ", " ") + } + + fullMessage = strings.Join(msgLines, "
") + return template.HTML(fullMessage) } var TemplateFuncs template.FuncMap = map[string]interface{}{ diff --git a/templates/repo/diff.tmpl b/templates/repo/diff.tmpl index a280c81e173f..2e9bdd0342b5 100644 --- a/templates/repo/diff.tmpl +++ b/templates/repo/diff.tmpl @@ -6,12 +6,12 @@ {{template "repo/commits_table" .}} {{else}}

- {{RenderCommitMessage .Commit.Message $.RepoLink}}
{{.i18n.Tr "repo.diff.browse_source"}}
+ {{RenderCommitMessage .Commit.Message $.RepoLink}}

{{if .Author}}