import React, { useMemo } from 'react'; import { TextWithHighlights, Highlight } from '@aws-sdk/client-kendra'; interface HighlightTextProps { textWithHighlights: TextWithHighlights; } function HighlightText(props: HighlightTextProps) { const highlightText = useMemo(() => { const baseText: string = props.textWithHighlights.Text || ''; const highlights: Highlight[] = props.textWithHighlights.Highlights || []; if (highlights.length === 0) { return <>{baseText}; } const nodes: React.ReactNode[] = []; for (let i = 0; i < highlights.length; i++) { // start 〜 mid がハイライトしない文字列(1つ前の End と Begin の間) // mid 〜 end がハイライトする文字列(Begin と End の間) const start = highlights[i - 1]?.EndOffset ?? 0; const mid = highlights[i]?.BeginOffset ?? baseText.length; const end = highlights[i]?.EndOffset ?? baseText.length; nodes.push( {baseText.substring(start, mid)}{' '} , {baseText.substring(mid, end)} ); // すべてのハイライトを処理したら、残りの文字列をまとめて設定 if (i === highlights.length - 1) { nodes.push( {baseText.substring(end)} ); } } return <>{nodes}; }, [props]); return highlightText; } export default HighlightText;