// The reviewed golden text and its rewrite, side by side: one card per clip, read from data.js (window.ROWS). View only. const rows = window.ROWS || []; const esc = (s) => String(s ?? "").replace(/[&<>"]/g, (c) => ({"&": "&", "<": "<", ">": ">", '"': """}[c])); const store = { get(k) { try { return localStorage.getItem(k); } catch { return null; } }, set(k, v) { try { localStorage.setItem(k, v); } catch {} }, }; const has = (r, start) => r.why.some((w) => w.startsWith(start)); const GROUPS = [ ["all", "All", () => true], ["review", "Reviewer notes", (r) => has(r, "review")], ["rewrite", "Rewrite drift", (r) => has(r, "rewrite")], ["original", "Original issues", (r) => has(r, "original")], ["signs", "With signs", (r) => r.signs.length > 0], ]; const GENERATOR = {facefusion: "FaceFusion", animate: "Animate", s2v: "S2V", real: "Real recording"}; const words = (t) => (t || "").split(/\s+/).filter(Boolean).length; function column(cls, title, note, r, sections, extra = "") { const fake = (p) => r.fake_parts.includes(p); const n = r.fake_parts.reduce((a, p) => a + words(sections[p]), 0); const body = ["video", "audio"].map((p) => `
${p}

${esc(sections[p])}

`).join(""); return `

${title}${note} ${n} words

${extra}${body}
`; } function card(r) { const parts = ["video", "audio"].map((p) => { const fake = r.fake_parts.includes(p); return `${p[0].toUpperCase() + p.slice(1)} ${fake ? "fake" : "real"}`; }).join(" · "); const dl = [["Picked", ``]]; if (r.signs.length) dl.push(["Signs", r.signs.map(esc).join("
")]); const ref = r.reference ? ` ` : ""; const kept = r.rewritten ? "" : '

No rewrite passed, so this clip keeps the original text.

'; return `

Clip ${r.n}

${GENERATOR[r.generator] || r.generator} · ${parts}
${dl.map(([k, v]) => `
${k}
${v}
`).join("")}
${ref}
${column("O", "Original", "reviewed", r, r.original)}${column("R", "Rewrite", "one paragraph", r, r.rewrite, kept)}
`; } function show(key) { const test = GROUPS.find((g) => g[0] === key)[2]; document.getElementById("clips").innerHTML = rows.filter(test).map(card).join(""); for (const b of document.querySelectorAll("#filters button")) b.classList.toggle("on", b.dataset.key === key); store.set("rvo:filter", key); } document.getElementById("filters").innerHTML = GROUPS.map(([k, label, test]) => ``).join(""); document.getElementById("filters").onclick = (e) => { const b = e.target.closest("button"); if (b) show(b.dataset.key); }; document.addEventListener("click", (e) => { const b = e.target.closest("[data-ref]"); if (!b) return; const ref = b.nextElementSibling; ref.hidden = !ref.hidden; b.textContent = ref.hidden ? "Show the real clip" : "Hide the real clip"; }); const start = store.get("rvo:filter"); show(GROUPS.some((g) => g[0] === start) ? start : "all");