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://says.liushen.fun/api'; const cacheKey = 'talksCache'; const cacheTimeKey = 'talksCacheTime'; const cacheDuration = 30 * 60 * 1000; // 半个小时 (30 分钟) const cachedData = localStorage.getItem(cacheKey); const cachedTime = localStorage.getItem(cacheTimeKey); const currentTime = new Date().getTime(); // 判断缓存是否有效 if (cachedData && cachedTime && (currentTime - cachedTime < cacheDuration)) { const data = JSON.parse(cachedData); renderTalks(data); // 使用缓存渲染数据 } else { if (talkContainer) { talkContainer.innerHTML = ''; fetch(url + "/messages/page", { 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, currentTime.toString()); renderTalks(data.data.items); // 渲染数据 } }) .catch(error => { console.error('Error fetching data:', error); }); } } // 渲染函数 function renderTalks(list) { // 确保 data 是一个数组 if (Array.isArray(list)) { let items = list.map(item => formatTalk(item, url)); items.forEach(item => talkContainer.appendChild(generateTalkElement(item))); waterfall('#talk'); } else { console.error('Data is not an array:', list); } } }; const formatTalk = (item, url) => { let date = formatTime(new Date(item.created_at).toString()); let content = item.content; const baseUrl = url; let imgs = Array.isArray(item.images) ? item.images.map(img => { const imageUrl = img.image_url; // 如果是相对地址(不以 http 或 https 开头),则拼接 baseUrl return /^https?:\/\//.test(imageUrl) ? imageUrl : `${baseUrl}${imageUrl}`; }) : []; let text = content; content = text.replace(/\[(.*?)\]\((.*?)\)/g, `@$1`) .replace(/- \[ \]/g, '⚪') .replace(/- \[x\]/g, '⚫'); // 保留换行符,转换 \n 为
content = content.replace(/\n/g, '
'); // 将content用一个类包裹,便于后续处理 content = `
${content}
`; if (imgs.length > 0) { const imgDiv = document.createElement('div'); imgDiv.className = 'zone_imgbox'; imgs.forEach(e => { const imgLink = document.createElement('a'); imgLink.href = e; imgLink.setAttribute('data-fancybox', 'gallery'); imgLink.className = 'fancybox'; imgLink.setAttribute('data-thumb', e); const imgTag = document.createElement('img'); imgTag.src = e; imgLink.appendChild(imgTag); imgDiv.appendChild(imgLink); }); content += imgDiv.outerHTML; } // 外链分享功能 if (item.extension_type ==="WEBSITE") { let extension = item.extension ? JSON.parse(item.extension) : {}; const externalUrl = extension.site; const externalTitle = extension.title; const externalFavicon = "https://p.liiiu.cn/i/2025/03/13/67d2fc82d329c.webp" // item.externalFavicon; const externalContainer = ` `; content += externalContainer; } // const ext = JSON.parse(item.ext || '{}'); else if (item.extension_type === "MUSIC") { const musicUrl = item.extension; if (musicUrl && musicUrl.includes('music.163.com')) { const match = musicUrl.match(/id=(\d+)/); const musicServer = "netease"; const musicType = "song"; const musicId = match ? match[1] : ''; content += ` `; } else { // 懒得适配,自己搞 } } // if (ext.doubanMovie && ext.doubanMovie.id) { // const doubanMovie = ext.doubanMovie; // const doubanMovieUrl = doubanMovie.url; // const doubanTitle = doubanMovie.title; // // const doubanDesc = doubanMovie.desc || '暂无描述'; // const doubanImage = doubanMovie.image; // const doubanDirector = doubanMovie.director || '未知导演'; // const doubanRating = doubanMovie.rating || '暂无评分'; // // const doubanReleaseDate = doubanMovie.releaseDate || '未知上映时间'; // // const doubanActors = doubanMovie.actors || '未知演员'; // const doubanRuntime = doubanMovie.runtime || '未知时长'; // content += ` // //
//
//
//
//
//
电影名: ${doubanTitle}
//
导演: ${doubanDirector}
//
评分: ${doubanRating}
//
时长: ${doubanRuntime}
//
//
// `; // } // if (ext.doubanBook && ext.doubanBook.id) { // const doubanBook = ext.doubanBook; // const bookUrl = doubanBook.url; // const bookTitle = doubanBook.title; // // const bookDesc = doubanBook.desc; // const bookImage = doubanBook.image; // const bookAuthor = doubanBook.author; // const bookRating = doubanBook.rating; // const bookPubDate = doubanBook.pubDate; // const bookTemplate = ` // //
//
//
//
//
//
// 书名: ${bookTitle} //
//
// 作者: ${bookAuthor} //
//
// 出版年份: ${bookPubDate} //
//
// 评分: ${bookRating} //
//
//
// `; // content += bookTemplate; // } else if (item.extension_type === "VIDEO") { // const videoType = ext.video.type; const BVId = item.extension; // Bilibili 视频模板 // const NewVideoUrl = videoUrl.replace("player.bilibili.com/player.html", "www.bilibili.com/blackboard/html5mobileplayer.html") const biliTemplate = `
`; // 将模板插入到 DOM 中 content += biliTemplate; // else if (videoType === 'youtube') { // // YouTube 视频模板 // // 从形如https://youtu.be/2V6lvCUPT8I?si=DVhUas6l6qlAr6Ru的链接中提取视频 ID2V6lvCUPT8I // const youtubeTemplate = ` //
// //
// `; // // 将模板插入到 DOM 中 // content += youtubeTemplate; // } } return { content: content, user: item.username || '匿名', avatar: 'https://p.liiiu.cn/i/2024/03/29/66061417537af.png', date: date, location: item.location || '陕西西安', tags: item.tags ? item.tags.split(',').filter(tag => tag.trim() !== '') : ['日常点滴'], text: content.replace(/\[(.*?)\]\((.*?)\)/g, '[链接]' + `${imgs.length ? '[图片]' : ''}`) }; }; 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 talkNick = document.createElement('span'); talkNick.className = 'talk_nick'; talkNick.innerHTML = `${item.user} ${generateIconSVG()}`; const talkDate = document.createElement('span'); talkDate.className = 'talk_date'; talkDate.textContent = item.date; const talkContent = document.createElement('div'); talkContent.className = 'talk_content'; talkContent.innerHTML = item.content; const talkBottom = document.createElement('div'); talkBottom.className = 'talk_bottom'; const TagContainer = document.createElement('div'); const talkTag = document.createElement('span'); talkTag.className = 'talk_tag'; talkTag.textContent = `🏷️${item.tags}`; const locationTag = document.createElement('span'); locationTag.className = 'location_tag'; locationTag.textContent = `🌍${item.location}`; TagContainer.appendChild(talkTag); TagContainer.appendChild(locationTag); const commentLink = document.createElement('a'); commentLink.href = 'javascript:;'; commentLink.onclick = () => goComment(item.text); const commentIcon = document.createElement('span'); commentIcon.className = 'icon'; const commentIconInner = document.createElement('i'); commentIconInner.className = 'fa-solid fa-message fa-fw'; commentIcon.appendChild(commentIconInner); commentLink.appendChild(commentIcon); talkMeta.appendChild(avatar); info.appendChild(talkNick); info.appendChild(talkDate); talkMeta.appendChild(info); talkItem.appendChild(talkMeta); talkItem.appendChild(talkContent); talkBottom.appendChild(TagContainer); talkBottom.appendChild(commentLink); talkItem.appendChild(talkBottom); return talkItem; }; const goComment = (e) => { const match = e.match(/
([\s\S]*?)<\/div>/); const textContent = match ? match[1] : ""; const n = document.querySelector(".atk-textarea"); n.value = `> ${textContent}\n\n`; n.focus(); btf.snackbarShow("已为您引用该说说,不删除空格效果更佳"); // const n = document.querySelector(".atk-textarea"); // n.value = `> ${e}\n\n`; // n.focus(); // btf.snackbarShow("已为您引用该说说,不删除空格效果更佳"); }; const formatTime = (time) => { const d = new Date(time); const ls = [ d.getFullYear(), d.getMonth() + 1, d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), ]; const r = ls.map((a) => (a.toString().length === 1 ? '0' + a : a)); return `${r[0]}-${r[1]}-${r[2]} ${r[3]}:${r[4]}`; }; fetchAndRenderTalks(); } renderTalks(); // function whenDOMReady() { // const talkContainer = document.querySelector('#talk'); // talkContainer.innerHTML = ''; // fetchAndRenderTalks(); // } // whenDOMReady(); // document.addEventListener("pjax:complete", whenDOMReady);