diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx
index 4473c3b..2b2144a 100644
--- a/src/components/MessageBox.tsx
+++ b/src/components/MessageBox.tsx
@@ -48,6 +48,7 @@ const MessageBox = ({
const [speechMessage, setSpeechMessage] = useState(message.content);
useEffect(() => {
+ const citationRegex = /\[([^\]]+)\]/g;
const regex = /\[(\d+)\]/g;
let processedMessage = message.content;
@@ -67,12 +68,45 @@ const MessageBox = ({
) {
setParsedMessage(
processedMessage.replace(
- regex,
- (_, number) =>
- `${number}`,
- ),
+ citationRegex, // Use the updated regex
+ (match, capturedContent) => { // match is the full "[1,2,3]", capturedContent is "1,2,3"
+ // Split the captured content by comma, trim whitespace, and filter out non-digits
+ const numbers = capturedContent
+ .split(',')
+ .map(numStr => numStr.trim())
+ .filter(numStr => /^\d+$/.test(numStr)); // Ensure it's only digits
+
+ // If no valid numbers found after split/filter (e.g., "[]" or "[abc]"), return original match
+ if (numbers.length === 0) {
+ return match;
+ }
+
+ // Generate an HTML link for each valid number found
+ const linksHtml = numbers.map(numStr => {
+ const number = parseInt(numStr, 10); // Convert string to integer for array indexing
+
+ // Basic validation: Ensure it's a positive number
+ if (isNaN(number) || number <= 0) {
+ // Return the original number part as text if invalid for lookup
+ return `[${numStr}]`;
+ }
+
+ // Get the corresponding source, adjusting for 0-based index
+ const source = message.sources?.[number - 1];
+ const url = source?.metadata?.url;
+
+ // If URL exists, create the link
+ if (url) {
+ return `${numStr}`;
+ } else {
+ // If no URL found for this number, return the number styled similarly but red
+ return `${numStr}`;
+ }
+ }).join(''); // Join the generated links (or fallback text) together without separators
+
+ return linksHtml;
+ }
+ )
);
return;
}