mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-05-04 13:50:39 +00:00
Fix a panic in NotifyCreateIssueComment (caused by string truncation) (#17928)
* Fix a panic in NotifyCreateIssueComment (caused by string truncation) * more unit tests * refactor * fix some edge cases * use SplitStringAtByteN for comment content
This commit is contained in:
parent
183175263d
commit
c7e23401a3
4 changed files with 104 additions and 17 deletions
|
@ -6,20 +6,23 @@ package util
|
|||
|
||||
import "unicode/utf8"
|
||||
|
||||
// in UTF8 "…" is 3 bytes so doesn't really gain us anything...
|
||||
const utf8Ellipsis = "…"
|
||||
const asciiEllipsis = "..."
|
||||
|
||||
// SplitStringAtByteN splits a string at byte n accounting for rune boundaries. (Combining characters are not accounted for.)
|
||||
func SplitStringAtByteN(input string, n int) (left, right string) {
|
||||
if len(input) <= n {
|
||||
left = input
|
||||
return
|
||||
return input, ""
|
||||
}
|
||||
|
||||
if !utf8.ValidString(input) {
|
||||
left = input[:n-3] + "..."
|
||||
right = "..." + input[n-3:]
|
||||
return
|
||||
if n-3 < 0 {
|
||||
return input, ""
|
||||
}
|
||||
return input[:n-3] + asciiEllipsis, asciiEllipsis + input[n-3:]
|
||||
}
|
||||
|
||||
// in UTF8 "…" is 3 bytes so doesn't really gain us anything...
|
||||
end := 0
|
||||
for end <= n-3 {
|
||||
_, size := utf8.DecodeRuneInString(input[end:])
|
||||
|
@ -29,7 +32,29 @@ func SplitStringAtByteN(input string, n int) (left, right string) {
|
|||
end += size
|
||||
}
|
||||
|
||||
left = input[:end] + "…"
|
||||
right = "…" + input[end:]
|
||||
return
|
||||
return input[:end] + utf8Ellipsis, utf8Ellipsis + input[end:]
|
||||
}
|
||||
|
||||
// SplitStringAtRuneN splits a string at rune n accounting for rune boundaries. (Combining characters are not accounted for.)
|
||||
func SplitStringAtRuneN(input string, n int) (left, right string) {
|
||||
if !utf8.ValidString(input) {
|
||||
if len(input) <= n || n-3 < 0 {
|
||||
return input, ""
|
||||
}
|
||||
return input[:n-3] + asciiEllipsis, asciiEllipsis + input[n-3:]
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(input) <= n {
|
||||
return input, ""
|
||||
}
|
||||
|
||||
count := 0
|
||||
end := 0
|
||||
for count < n-1 {
|
||||
_, size := utf8.DecodeRuneInString(input[end:])
|
||||
end += size
|
||||
count++
|
||||
}
|
||||
|
||||
return input[:end] + utf8Ellipsis, utf8Ellipsis + input[end:]
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue