diff --git a/public/js/clinicalAssistant.js b/public/js/clinicalAssistant.js
index 3a53e6d..03a712d 100644
--- a/public/js/clinicalAssistant.js
+++ b/public/js/clinicalAssistant.js
@@ -244,11 +244,14 @@
} else {
html = fallbackMarkdown(text);
}
- html = html.replace(/\[(\d+)\]/g, function (_, n) {
- var source = sources[Number(n) - 1];
- if (!source) return '[' + n + ']';
- var title = source ? source.title || source.resource || 'Source' : 'Source';
- return '[' + n + ']';
+ html = html.replace(/\[((?:\d+\s*,\s*)*\d+)\]/g, function (match, cluster) {
+ var nums = cluster.split(',').map(function (n) { return Number(n.trim()); }).filter(function (n) { return Number.isInteger(n) && n > 0; });
+ if (!nums.length || nums.some(function (n) { return !sources[n - 1]; })) return match;
+ return '[' + nums.map(function (n) {
+ var source = sources[n - 1];
+ var title = source ? source.title || source.resource || 'Source' : 'Source';
+ return '' + n + '';
+ }).join(', ') + ']';
});
html = html.replace(/@@CODEBLOCK_(\d+)@@/g, function (_, idx) {
var block = codeBlocks[Number(idx)] || { lang: '', code: '' };
diff --git a/src/routes/clinicalAssistant.js b/src/routes/clinicalAssistant.js
index 028177e..be4929e 100644
--- a/src/routes/clinicalAssistant.js
+++ b/src/routes/clinicalAssistant.js
@@ -446,17 +446,18 @@ function normalizeCitationOrder(answer, sources) {
});
var rewritten = answer.replace(/\[((?:\d+\s*,\s*)*\d+)\]/g, function(match, cluster) {
- var nums = parseCitationCluster(cluster).map(function(oldNum) { return oldToNew[oldNum]; }).filter(Boolean);
- if (!nums.length) return match;
+ var oldNums = parseCitationCluster(cluster);
+ var nums = oldNums.map(function(oldNum) { return oldToNew[oldNum]; });
+ if (!nums.length || nums.some(function(n) { return !n; })) return match;
nums = Array.from(new Set(nums)).sort(function(a, b) { return a - b; });
- return '[' + nums.join(',') + ']';
+ return '[' + nums.join(', ') + ']';
});
return { answer: rewritten, sources: reordered };
}
function parseCitationCluster(cluster) {
- return String(cluster || '').split(',').map(function(n) { return Number(n.trim()); }).filter(function(n) { return Number.isFinite(n); });
+ return String(cluster || '').split(',').map(function(n) { return Number(n.trim()); }).filter(function(n) { return Number.isInteger(n) && n > 0; });
}
async function getAvailableExamples() {