emphasis: Fix reading of prev/next rune for multibyte characters

This commit is contained in:
Niklas Fasching 2022-06-18 15:56:20 +02:00
parent 0f145082ad
commit a520664dc7
4 changed files with 18 additions and 4 deletions

View file

@ -371,19 +371,30 @@ func (d *Document) parseEmphasis(input string, start int, isRaw bool) (int, Node
// see org-emphasis-regexp-components (emacs elisp variable)
func hasValidPreAndBorderChars(input string, i int) bool {
return (i+1 >= len(input) || isValidBorderChar(rune(input[i+1]))) && (i == 0 || isValidPreChar(rune(input[i-1])))
return isValidBorderChar(nextRune(input, i)) && isValidPreChar(prevRune(input, i))
}
func hasValidPostAndBorderChars(input string, i int) bool {
return (i == 0 || isValidBorderChar(rune(input[i-1]))) && (i+1 >= len(input) || isValidPostChar(rune(input[i+1])))
return (isValidPostChar(nextRune(input, i))) && isValidBorderChar(prevRune(input, i))
}
func prevRune(input string, i int) rune {
r, _ := utf8.DecodeLastRuneInString(input[:i])
return r
}
func nextRune(input string, i int) rune {
_, c := utf8.DecodeRuneInString(input[i:])
r, _ := utf8.DecodeRuneInString(input[i+c:])
return r
}
func isValidPreChar(r rune) bool {
return unicode.IsSpace(r) || strings.ContainsRune(`-({'"`, r)
return r == utf8.RuneError || unicode.IsSpace(r) || strings.ContainsRune(`-({'"`, r)
}
func isValidPostChar(r rune) bool {
return unicode.IsSpace(r) || strings.ContainsRune(`-.,:!?;'")}[`, r)
return r == utf8.RuneError || unicode.IsSpace(r) || strings.ContainsRune(`-.,:!?;'")}[`, r)
}
func isValidBorderChar(r rune) bool { return !unicode.IsSpace(r) }