function renderTalks() { const talkContainer = document.querySelector('#talk'); if (!talkContainer) return; talkContainer.innerHTML = ''; const generateIconSVG = () => { return ``; } const waterfall = (a) => { function b(a, b) { var c = window.getComputedStyle(b); return parseFloat(c["margin" + a]) || 0 } function c(a) { return a + "px" } function d(a) { return parseFloat(a.style.top) } function e(a) { return parseFloat(a.style.left) } function f(a) { return a.clientWidth } function g(a) { return a.clientHeight } function h(a) { return d(a) + g(a) + b("Bottom", a) } function i(a) { return e(a) + f(a) + b("Right", a) } function j(a) { a = a.sort(function (a, b) { return h(a) === h(b) ? e(b) - e(a) : h(b) - h(a) }) } function k(b) { f(a) != t && (b.target.removeEventListener(b.type, arguments.callee), waterfall(a)) } "string" == typeof a && (a = document.querySelector(a)); var l = [].map.call(a.children, function (a) { return a.style.position = "absolute", a }); a.style.position = "relative"; var m = []; l.length && (l[0].style.top = "0px", l[0].style.left = c(b("Left", l[0])), m.push(l[0])); for (var n = 1; n < l.length; n++) { var o = l[n - 1], p = l[n], q = i(o) + f(p) <= f(a); if (!q) break; p.style.top = o.style.top, p.style.left = c(i(o) + b("Left", p)), m.push(p) } for (; n < l.length; n++) { j(m); var p = l[n], r = m.pop(); p.style.top = c(h(r) + b("Top", p)), p.style.left = c(e(r)), m.push(p) } j(m); var s = m[0]; a.style.height = c(h(s) + b("Bottom", s)); var t = f(a); window.addEventListener ? window.addEventListener("resize", k) : document.body.onresize = k }; const fetchAndRenderTalks = () => { const url = 'https://mm.biss.click/api/echo/page'; const cacheKey = 'talksCache'; const cacheTimeKey = 'talksCacheTime'; const cacheDuration = 30 * 60 * 1000; const cachedData = localStorage.getItem(cacheKey); const cachedTime = localStorage.getItem(cacheTimeKey); const now = Date.now(); if (cachedData && cachedTime && (now - cachedTime < cacheDuration)) { renderTalksList(JSON.parse(cachedData)); } else { fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ page: 1, pageSize: 30 }) }) .then(res => res.json()) .then(data => { if (data.code === 1 && data.data && Array.isArray(data.data.items)) { localStorage.setItem(cacheKey, JSON.stringify(data.data.items)); localStorage.setItem(cacheTimeKey, now.toString()); renderTalksList(data.data.items); } }) .catch(err => console.error('Error fetching:', err)); } }; const renderTalksList = (list) => { list.map(formatTalk).forEach(item => talkContainer.appendChild(generateTalkElement(item))); waterfall('#talk'); }; const formatTalk = (item) => { const date = formatTime(item.created_at); let content = item.content || ''; content = content.replace(/\[(.*?)\]\((.*?)\)/g, `@$1`) .replace(/- \[ \]/g, '⚪') .replace(/- \[x\]/g, '⚫') .replace(/\n/g, '
'); content = `
${content}
`; // 图片 if (Array.isArray(item.images) && item.images.length > 0) { const imgDiv = document.createElement('div'); imgDiv.className = 'zone_imgbox'; item.images.forEach(img => { const link = document.createElement('a'); link.href = img.image_url + "?fmt=webp&q=75"; link.setAttribute('data-fancybox', 'gallery'); link.className = 'fancybox'; const imgTag = document.createElement('img'); imgTag.src = img.image_url + "?fmt=webp&q=75"; link.appendChild(imgTag); imgDiv.appendChild(link); }); content += imgDiv.outerHTML; } // 外链 / GitHub 项目 // 外链 / GitHub 项目 if (['WEBSITE', 'GITHUBPROJ'].includes(item.extension_type)) { let siteUrl = '', title = ''; let extensionBack = "https://p.liiiu.cn/i/2024/07/27/66a4632bbf06e.webp"; // 解析 extension 字段 try { const extObj = typeof item.extension === 'string' ? JSON.parse(item.extension) : item.extension; siteUrl = extObj.site || extObj.url || item.extension; title = extObj.title || siteUrl; } catch { siteUrl = item.extension; title = siteUrl; } // 特殊处理 GitHub 项目 if (item.extension_type === 'GITHUBPROJ') { extensionBack = "https://p.liiiu.cn/i/2024/07/27/66a461a3098aa.webp"; // 提取 GitHub 项目名 const match = siteUrl.match(/^https?:\/\/github\.com\/[^/]+\/([^/?#]+)/i); if (match) { title = match[1]; // 获取仓库名 } else { // fallback:从最后一个路径段提取 try { const parts = new URL(siteUrl).pathname.split('/').filter(Boolean); title = parts.pop() || siteUrl; } catch { // 如果 URL 无效则保留原始 } } } // 输出 HTML 结构 content += ` `; } // 音乐 if (item.extension_type === 'MUSIC' && item.extension) { const link = item.extension; let server = ''; if (link.includes('music.163.com')) server = 'netease'; else if (link.includes('y.qq.com')) server = 'tencent'; const idMatch = link.match(/id=(\d+)/); const id = idMatch ? idMatch[1] : ''; if (server && id) { content += ``; } } // 视频 if (item.extension_type === 'VIDEO' && item.extension) { const video = item.extension; if (video.startsWith('BV')) { const bilibiliUrl = `https://www.bilibili.com/blackboard/html5mobileplayer.html?bvid=${video}&as_wide=1&high_quality=1&danmaku=0`; content += `
`; } else { const youtubeUrl = `https://www.youtube.com/embed/${video}`; content += `
`; } } return { content, user: item.username || '匿名', avatar: 'https://p.liiiu.cn/i/2025/03/13/67d2fc82d329c.webp', date, location: '', tags: Array.isArray(item.tags) && item.tags.length ? item.tags.map(t => t.name) : ['无标签'], text: content.replace(/\[(.*?)\]\((.*?)\)/g, '[链接]') }; }; const generateTalkElement = (item) => { const talkItem = document.createElement('div'); talkItem.className = 'talk_item'; const talkMeta = document.createElement('div'); talkMeta.className = 'talk_meta'; const avatar = document.createElement('img'); avatar.className = 'no-lightbox avatar'; avatar.src = item.avatar; const info = document.createElement('div'); info.className = 'info'; const nick = document.createElement('span'); nick.className = 'talk_nick'; nick.innerHTML = `${item.user} ${generateIconSVG()}`; const date = document.createElement('span'); date.className = 'talk_date'; date.textContent = item.date; info.appendChild(nick); info.appendChild(date); talkMeta.appendChild(avatar); talkMeta.appendChild(info); const talkContent = document.createElement('div'); talkContent.className = 'talk_content'; talkContent.innerHTML = item.content; const talkBottom = document.createElement('div'); talkBottom.className = 'talk_bottom'; const tags = document.createElement('div'); const tag = document.createElement('span'); tag.className = 'talk_tag'; tag.textContent = `🏷️${item.tags}`; //const loc = document.createElement('span'); //loc.className = 'location_tag'; //loc.textContent = `🌍${item.location}`; tags.appendChild(tag); //tags.appendChild(loc); const commentLink = document.createElement('a'); commentLink.href = 'javascript:;'; commentLink.onclick = () => goComment(item.text); const icon = document.createElement('span'); icon.className = 'icon'; icon.innerHTML = ''; commentLink.appendChild(icon); talkBottom.appendChild(tags); talkBottom.appendChild(commentLink); talkItem.appendChild(talkMeta); talkItem.appendChild(talkContent); talkItem.appendChild(talkBottom); return talkItem; }; const goComment = (e) => { const match = e.match(/
([\s\S]*?)<\/div>/); const textContent = match ? match[1] : ""; const textarea = document.querySelector("#twikoo .el-textarea__inner"); textarea.value = `> ${textContent}\n\n`; textarea.focus(); btf.snackbarShow("已为您引用该说说,不删除空格效果更佳"); }; const formatTime = (time) => { const d = new Date(time); const pad = (n) => n.toString().padStart(2, '0'); return `${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`; }; fetchAndRenderTalks(); } renderTalks(); // function whenDOMReady() { // const talkContainer = document.querySelector('#talk'); // talkContainer.innerHTML = ''; // fetchAndRenderTalks(); // } // whenDOMReady(); // document.addEventListener("pjax:complete", whenDOMReady);