fix(viewer): pretty print utilisait un cache raw partagé entre fichiers (contenu/colouration du fichier precedent)
CI / lint (push) Successful in 1m18s
CI / security (push) Successful in 55s
CI / test (push) Successful in 1m58s
CI / build (push) Successful in 48s
CI / e2e (push) Successful in 10m29s

This commit is contained in:
2026-09-14 20:10:11 -04:00
parent bb0c8e7731
commit 686a6da019
+26 -22
View File
@@ -652,21 +652,33 @@ export function renderFile(data) {
});
// Action buttons
// Cache local au rendu courant: state.cachedRawSource global est fiable
// uniquement quand openFile() initialise le fichier (il le réinitialise).
// Or le contenu d'un onglet peut être rendu via renderFile() direct sans
// passer par openFile() — un cache partagé transporterait le contenu du
// fichier précédent (bug pretty print sur fichiers successifs).
let localRaw = null;
const getRaw = async () => {
if (localRaw != null) return localRaw;
if (state.currentVault === data.vault && state.currentPath === data.path && state.cachedRawSource) {
localRaw = state.cachedRawSource;
return localRaw;
}
const rawUrl = `/api/file/${encodeURIComponent(data.vault)}/raw?path=${encodeURIComponent(data.path)}`;
const rawData = await api(rawUrl);
localRaw = rawData.raw;
return localRaw;
};
const copyBtn = el("button", { class: "btn-action", title: "Copier la source" }, [icon("copy", 14), document.createTextNode("Copier")]);
copyBtn.addEventListener("click", async () => {
try {
// Fetch raw content if not already cached
if (!state.cachedRawSource) {
const rawUrl = `/api/file/${encodeURIComponent(data.vault)}/raw?path=${encodeURIComponent(data.path)}`;
const rawData = await api(rawUrl);
state.cachedRawSource = rawData.raw;
}
const rawSrc = await getRaw();
if (navigator.clipboard) {
await navigator.clipboard.writeText(state.cachedRawSource);
await navigator.clipboard.writeText(rawSrc);
} else {
// Fallback for non-secure contexts
const ta = document.createElement("textarea");
ta.value = state.cachedRawSource;
ta.value = rawSrc;
ta.style.position = "fixed"; ta.style.opacity = "0";
document.body.appendChild(ta); ta.select();
document.execCommand("copy");
@@ -832,12 +844,7 @@ export function renderFile(data) {
state.showingSource = !state.showingSource;
if (state.showingSource) {
sourceBtn.classList.add("active");
if (!state.cachedRawSource) {
const rawUrl = `/api/file/${encodeURIComponent(data.vault)}/raw?path=${encodeURIComponent(data.path)}`;
const rawData = await api(rawUrl);
state.cachedRawSource = rawData.raw;
}
raw.textContent = state.cachedRawSource;
raw.textContent = await getRaw();
rendered.style.display = "none";
raw.style.display = "block";
} else {
@@ -856,18 +863,15 @@ export function renderFile(data) {
prettyBtn.addEventListener("click", async () => {
const on = !prettyBtn.classList.contains("active");
if (on) {
let rawText = "";
try {
if (!state.cachedRawSource) {
const rawUrl = `/api/file/${encodeURIComponent(data.vault)}/raw?path=${encodeURIComponent(data.path)}`;
const rawData = await api(rawUrl);
state.cachedRawSource = rawData.raw;
}
rawText = await getRaw();
} catch (_) {
state.cachedRawSource = mdDiv.textContent || "";
rawText = mdDiv.textContent || "";
}
mdDiv.innerHTML = buildPrettyHtml(data, state.cachedRawSource);
mdDiv.innerHTML = buildPrettyHtml(data, rawText);
const codeEl = mdDiv.querySelector("code");
applyPrettyHighlight(codeEl, detectPrettyLang(data), state.cachedRawSource);
applyPrettyHighlight(codeEl, detectPrettyLang(data), rawText);
prettyBtn.classList.add("active");
} else {
mdDiv.innerHTML = data.html;