播客情报中心

硅谷大佬深度访谈汇总

周报

"), "i"); return (entry.podcast.keyPoints || []).find((point) => pattern.test(point)) || entry.podcast.summary; } function setView(view) { state.view = view; const homeView = document.querySelector("#home-view"); const topicView = document.querySelector("#topic-analysis-view"); homeView.hidden = view !== "home"; topicView.hidden = view !== "topics"; document.querySelector("#home-button").classList.toggle("is-primary", view === "home"); document.querySelector("#topics-button").classList.toggle("is-primary", view === "topics"); document.title = view === "topics" ? "话题分析 · 播客情报中心" : "播客情报中心"; if (view === "topics") renderTopicAnalysis(); } function selectTopic(topic) { state.selectedTopic = topic; renderTopicAnalysis(); } function renderTopicPills(summaries) { const container = document.querySelector("#topic-pill-list"); container.innerHTML = ""; summaries.forEach(({ topic, count }) => { const button = document.createElement("button"); button.type = "button"; button.className = "topic-pill"; button.classList.toggle("is-active", topic === state.selectedTopic); button.innerHTML = `${topic}${count}`; button.addEventListener("click", () => selectTopic(topic)); container.append(button); }); } function renderTopicStats(entries) { const guests = new Set(entries.flatMap((entry) => splitGuests(entry.podcast.guest || entry.podcast.person || ""))); const weeks = new Set(entries.map((entry) => entry.report.weekNumber)); document.querySelector("#topic-stat-episodes").textContent = entries.length; document.querySelector("#topic-stat-discussions").textContent = entries.length; document.querySelector("#topic-stat-guests").textContent = guests.size; document.querySelector("#topic-stat-span").textContent = `${weeks.size}周`; } function renderTopicTimeline(entries) { const timeline = document.querySelector("#topic-timeline"); timeline.innerHTML = ""; const grouped = new Map(); entries.forEach((entry) => { const key = entry.report.weekNumber; if (!grouped.has(key)) grouped.set(key, []); grouped.get(key).push(entry); }); [...grouped.entries()] .sort((a, b) => b[0] - a[0]) .forEach(([week, weekEntries]) => { const report = weekEntries[0].report; const group = document.createElement("section"); group.className = "timeline-week"; const header = document.createElement("div"); header.className = "timeline-week-header"; header.innerHTML = `第${week}周${formatRange(report)}`; group.append(header); weekEntries.forEach((entry) => { const [sentiment, sentimentClass] = sentimentForEntry(entry); const card = document.createElement("article"); card.className = "topic-episode-card"; const link = document.createElement("a"); link.href = entry.podcast.link; link.target = "_blank"; link.rel = "noreferrer"; link.textContent = "访问来源"; card.innerHTML = `
${entry.podcast.platform || entry.podcast.source || "未知来源"} · ${entry.podcast.publishDate || report.endDate}

${entry.podcast.title}

${relevantPoint(entry)}

`; card.querySelector(".topic-card-footer").append(link); group.append(card); }); timeline.append(group); }); } function renderTopicInsights(topic, entries) { const list = document.querySelector("#topic-insight-list"); list.innerHTML = ""; const latest = entries[0]; const cautious = entries.filter((entry) => sentimentForEntry(entry)[1] === "sentiment-cautious").length; const bullish = entries.filter((entry) => sentimentForEntry(entry)[1] === "sentiment-bullish").length; const platforms = uniqueValues(entries, (entry) => [entry.podcast.platform || entry.podcast.source || "未知来源"]); const insights = [ ["01", "讨论密度", `${topic} 在当前数据集中出现 ${entries.length} 次,覆盖 ${platforms.join("、")}。`], ["02", "观点温度", bullish || cautious ? `偏积极 ${bullish} 条,偏谨慎 ${cautious} 条;适合结合时间线看观点是否转向。` : "当前样本以中性事实讨论为主,尚未形成明显方向性。"], ["03", "最新变化", latest ? `最新一条来自第${latest.report.weekNumber}周:${latest.podcast.title}` : "暂无可分析条目。"] ]; insights.forEach(([number, title, body]) => { const card = document.createElement("article"); card.className = "insight-card"; card.innerHTML = `
${number}

${title}

${body}

`; list.append(card); }); } function renderTopicAnalysis() { const summaries = topicSummaries(); if (!summaries.length) return; if (!state.selectedTopic || !summaries.some((item) => item.topic === state.selectedTopic)) { state.selectedTopic = summaries[0].topic; } const entries = entriesForTopic(state.selectedTopic).sort((a, b) => b.report.weekNumber - a.report.weekNumber); renderTopicPills(summaries); renderTopicStats(entries); renderTopicTimeline(entries); renderTopicInsights(state.selectedTopic, entries); document.querySelector("#topic-active-line").textContent = `${state.selectedTopic} · ${entries.length} 条相关内容`; } function render() { const report = selectedReport(); renderTopNav(); renderWeeks(); renderSummary(report); renderSidebar(report); renderPodcasts(report); if (state.view === "topics") renderTopicAnalysis(); } async function loadReportsData() { const embedded = document.querySelector("#embedded-reports"); if (embedded?.textContent) return JSON.parse(embedded.textContent); const response = await fetch(`./data/reports.json?ts=${Date.now()}`); return response.json(); } async function boot() { const data = await loadReportsData(); state.reports = data.reports.sort((a, b) => b.weekNumber - a.weekNumber); state.selectedWeek = state.reports[0].weekNumber; document.querySelector("#reset-filters").addEventListener("click", () => { resetFilters("all"); render(); }); document.querySelector("#home-button").addEventListener("click", () => { history.replaceState(null, "", window.location.pathname); setView("home"); selectWeek(state.reports[0].weekNumber); }); document.querySelector("#topics-button").addEventListener("click", () => { history.replaceState(null, "", "#topics"); setView("topics"); window.scrollTo({ top: 0, behavior: "smooth" }); }); window.addEventListener("hashchange", () => { setView(window.location.hash === "#topics" ? "topics" : "home"); }); document.querySelector("#prev-week").addEventListener("click", () => { const index = selectedReportIndex(); if (index < state.reports.length - 1) selectWeek(state.reports[index + 1].weekNumber); }); document.querySelector("#next-week").addEventListener("click", () => { const index = selectedReportIndex(); if (index > 0) selectWeek(state.reports[index - 1].weekNumber); }); document.querySelector("#week-select").addEventListener("change", (event) => { selectWeek(Number(event.target.value)); }); document.title = data.site.name; document.querySelector("h1").textContent = data.site.name; document.querySelector("#site-tagline").textContent = data.site.tagline; document.querySelector("#last-updated").textContent = `更新: ${new Date(data.site.updatedAt).toLocaleDateString("zh-CN")}`; setView(window.location.hash === "#topics" ? "topics" : "home"); render(); } boot().catch((error) => { document.querySelector("#podcast-list").innerHTML = `
数据加载失败:${error.message}
`; });