diff --git a/org/inline.go b/org/inline.go index b1bb28c..b91d6b8 100644 --- a/org/inline.go +++ b/org/inline.go @@ -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) } diff --git a/org/testdata/inline.html b/org/testdata/inline.html index b0b886d..383fd81 100644 --- a/org/testdata/inline.html +++ b/org/testdata/inline.html @@ -5,6 +5,7 @@ also hard line breaks not followed by a newline get ignored, see \\
verbatim
code