${esc(text(x,['label','name','type']))}
${fields.map(k=>text(x,[k])).filter(Boolean).map(v=>`${esc(v)}
`).join('')}/* 独立报告视图:页面只负责渲染 JSON,不在 Python 中拼接 HTML。 */
const esc = v => String(v ?? '').replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
const arr = v => Array.isArray(v) ? v : [];
const text = (v, keys=['value','label','headline','note','insight','action','name']) => {
if (Array.isArray(v)) return v.map(x => text(x, keys)).filter(Boolean).join(' · ');
if (typeof v === 'string' || typeof v === 'number') return String(v);
if (v && typeof v === 'object') for (const k of keys) if (v[k] != null && v[k] !== '') return text(v[k], keys);
return '';
};
function cards(items, fields=['headline','note']) {
return arr(items).map(x => ` ${esc(v)}${esc(text(x,['label','name','type']))}
${fields.map(k=>text(x,[k])).filter(Boolean).map(v=>`
未采集
'; } function section(id, title, body) { return `${esc(summary.verdict || '')}
价格 ${esc(s.currentPrice || '未采集')} · 评论 ${esc(data.baseline?.reviewCount || 0)}${esc(title.professionalOpinion || '')}
`)}${section('main','主图在卖什么',`${esc(exp.skuAnalysis?.professionalOpinion || '')}
${cards(exp.skuAnalysis?.selectionDimensions,['name','values','evidenceIds'])}`)}${section('review','消费者实际感受到什么',`报告加载失败:${esc(e.message)}
`; });