From 8735cae625aa487bc1f2fd99e0b3933a4d66c8c8 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 6 May 2026 23:07:43 +0200 Subject: [PATCH] fix: enforce Vancouver citation clusters --- public/js/clinicalAssistant.js | 13 ++++++++----- src/routes/clinicalAssistant.js | 9 +++++---- 2 files changed, 13 insertions(+), 9 deletions(-) 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() {