');
diff --git a/public/js/assistant/images.js b/public/js/assistant/images.js
index 171675e3..36e25987 100644
--- a/public/js/assistant/images.js
+++ b/public/js/assistant/images.js
@@ -10,7 +10,10 @@ export function createAssistantImageStore() {
function renderGeneratedImage(src, alt, downloadUrl) {
var id = 'img-' + (++generatedImageSeq);
generatedImages[id] = { src: src, downloadUrl: downloadUrl || (assetPath(src) ? src + '?download=1' : '') };
- return '
' +
+ // The in-chat image is a thumbnail; full resolution is one click away, so a
+ // long answer is not pushed off the screen by the picture that illustrates it.
+ return '
' +
'
' +
'' +
'' +
diff --git a/public/js/clinicalAssistant.js b/public/js/clinicalAssistant.js
index 846c131d..3bf0cca1 100644
--- a/public/js/clinicalAssistant.js
+++ b/public/js/clinicalAssistant.js
@@ -4,7 +4,7 @@
// server can call native MCP directly without routing through mcpo.
// ============================================================
import { EMPTY_PROMPT_SETS } from './assistant/data.js';
-import { escapeAttr, escapeHtml, renderAssistantMarkdown, renderCitationLinks, safeImageUrl } from './assistant/citations.js';
+import { escapeAttr, escapeHtml, renderAssistantMarkdown, renderCitationLinks, safeImageUrl, wrapTables } from './assistant/citations.js';
import { renderSourcesList } from './assistant/sources.js';
import { createAssistantExporter } from './assistant/export.js';
import { createAssistantImageStore } from './assistant/images.js';
@@ -1506,13 +1506,24 @@ import {
// ── Patient take home: plain-language summary + copy/export/email ────
var takehomeBusy = false;
- var takehomeText = ''; // canonical original, never overwritten
- var takehomeTranslated = ''; // current translation, '' when showing the original
+ var takehomeText = ''; // canonical original markdown, never overwritten
+ var takehomeTranslatedHtml = ''; // translated HTML, '' when showing the original
var takehomeLang = '';
- // Copy / Export / Email must hand over what the parent is actually reading.
+ // The take home is translated as HTML for the same reason chat messages are:
+ // LibreTranslate's text mode destroys tables and emphasis markers.
+ function takehomeVisibleHtml() {
+ return takehomeTranslatedHtml
+ ? wrapTables(sanitize(takehomeTranslatedHtml))
+ : renderMarkdown(takehomeText, [], {});
+ }
+
+ // Copy / Export / Email must hand over what the caregiver is actually reading.
function takehomeVisibleText() {
- return takehomeTranslated || takehomeText;
+ if (!takehomeTranslatedHtml) return takehomeText;
+ var holder = document.createElement('div');
+ holder.innerHTML = sanitize(takehomeTranslatedHtml);
+ return String(holder.textContent || '').replace(/\n{3,}/g, '\n\n').trim();
}
function openPatientTakehome() {
@@ -1524,7 +1535,7 @@ import {
closePatientTakehomeModal();
takehomeBusy = true;
takehomeText = '';
- takehomeTranslated = '';
+ takehomeTranslatedHtml = '';
takehomeLang = '';
var modal = document.createElement('div');
modal.className = 'assistant-takehome-modal';
@@ -1560,7 +1571,7 @@ import {
if (result) {
// Same universal markdown renderer as chat bubbles; raw text stays
// canonical for Copy/Export/email.
- result.innerHTML = renderMarkdown(takehomeText, [], {});
+ result.innerHTML = takehomeVisibleHtml();
result.classList.remove('hidden');
}
if (actions) actions.classList.remove('hidden');
@@ -1584,7 +1595,7 @@ import {
function renderTakehomeBody() {
var result = document.querySelector('#assistant-takehome-modal .assistant-takehome-result');
- if (result) result.innerHTML = renderMarkdown(takehomeVisibleText(), [], {});
+ if (result) result.innerHTML = takehomeVisibleHtml();
}
function translateTakehome(target) {
@@ -1592,16 +1603,16 @@ import {
if (!takehomeText) return;
if (!target) { // back to the original
takehomeLang = '';
- takehomeTranslated = '';
+ takehomeTranslatedHtml = '';
renderTakehomeBody();
return;
}
if (select) select.disabled = true;
- translateAssistantMessage(takehomeText, target, translateProvider, 'text')
+ translateAssistantMessage(simplifyHtmlForTranslation(renderMarkdown(takehomeText, [], {})), target, translateProvider, 'html')
.then(function(data) {
if (!data.success) throw new Error(data.error || 'Translation failed');
takehomeLang = target;
- takehomeTranslated = String(data.translated || '');
+ takehomeTranslatedHtml = String(data.translated || '');
renderTakehomeBody();
})
.catch(function(err) {
@@ -1621,7 +1632,7 @@ import {
return;
}
assertSharingOwner(owner);
- var html = renderMarkdown(takehomeVisibleText(), [], {});
+ var html = takehomeVisibleHtml();
doc.document.write('Patient Take Home' +
'