diff --git a/internal/sync/kepub_cfi_converter.go b/internal/sync/kepub_cfi_converter.go index 29bc49b..4a2aad1 100644 --- a/internal/sync/kepub_cfi_converter.go +++ b/internal/sync/kepub_cfi_converter.go @@ -208,23 +208,54 @@ func extractSurroundingText(textNode *html.Node, offset int, window int) string return "" } - text := textNode.Data - runes := []rune(text) + block := findBlockParent(textNode) + if block == nil { + text := textNode.Data + runes := []rune(text) + start := offset - window + if start < 0 { + start = 0 + } + end := offset + window + if end > len(runes) { + end = len(runes) + } + if start >= end { + return normalizeWhitespace(text) + } + return normalizeWhitespace(string(runes[start:end])) + } - start := offset - window + segments := collectInlineText(block) + + globalOffset := 0 + for _, seg := range segments { + if seg.node == textNode { + globalOffset += offset + break + } + globalOffset += len(seg.runes) + } + + var allRunes []rune + for _, seg := range segments { + allRunes = append(allRunes, seg.runes...) + } + + start := globalOffset - window if start < 0 { start = 0 } - end := offset + window - if end > len(runes) { - end = len(runes) + end := globalOffset + window + if end > len(allRunes) { + end = len(allRunes) } if start >= end { - return normalizeWhitespace(text) + return normalizeWhitespace(string(allRunes)) } - return normalizeWhitespace(string(runes[start:end])) + return normalizeWhitespace(string(allRunes[start:end])) } func (k *KEPUBCFIConverter) ComputeKEPUBPercentage(kepubCFI string) (float64, error) {