var hasLogin = 0 //没登录隐藏编辑归档按钮 var memosData = { dom:'#memos', } var bbMemo = { memos: 'https://memos.usj.cc/', limit: '8', creatorId: '1', domId: '#bber', }; if(typeof(bbMemos) !=="undefined"){ for(var key in bbMemos) { if(bbMemos[key]){ bbMemo[key] = bbMemos[key]; } } } function loadCssCode(code){ var style = document.createElement('style'); style.type = 'text/css'; style.rel = 'stylesheet'; style.appendChild(document.createTextNode(code)); var head = document.getElementsByTagName('head')[0]; head.appendChild(style); } var limit = bbMemo.limit var memos = bbMemo.memos var mePage = 1,offset = 0,nextLength = 0,nextDom=''; var bbDom = document.querySelector(bbMemo.domId); var load = '
' // 增加memos编辑及归档 var memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); var memosPath = window.localStorage && window.localStorage.getItem("memos-access-path"); var getEditor = window.localStorage && window.localStorage.getItem("memos-editor-display"); var memoChangeDate = 0; var getSelectedValue = window.localStorage && window.localStorage.getItem("memos-visibility-select") || "PUBLIC"; if(bbDom){ getFirstList() //首次加载数据 meNums() //加载总数 var btn = document.querySelector("button.button-load"); btn.addEventListener("click", function () { btn.textContent= '加载中……'; updateHTMl(nextDom) if(nextLength < limit){ //返回数据条数小于限制条数,隐藏 document.querySelector("button.button-load").remove() return } getNextList() }); } function getFirstList(){ bbDom.insertAdjacentHTML('afterend', load); let tagHtml = `
` // TAG筛选 memos搜索 bbDom.insertAdjacentHTML('beforebegin', tagHtml); // TAG筛选 var bbUrl = memos+"api/v1/memo?creatorId="+bbMemo.creatorId+"&rowStatus=NORMAL&limit="+limit; let memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); let oneDay = window.localStorage && window.localStorage.getItem("memos-oneday"); if(memosOpenId && memosOpenId != null){ fetch(bbUrl,{ headers:{ 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json', 'Cache-Control': 'no-cache', }, cache: 'no-store', }).then(res => res.json()).then( resdata =>{ updateHTMl(resdata); var nowLength = resdata.length; if(nowLength < limit){ //返回数据条数小于 limit 则直接移除“加载更多”按钮,中断预加载 document.querySelector("button.button-load").remove() return } mePage++ offset = limit*(mePage-1) getNextList() }); if(oneDay == "open"){ reloadList("ONEDAY"); } }else{ fetch(bbUrl).then(res => res.json()).then( resdata =>{ updateHTMl(resdata); var nowLength = resdata.length; if(nowLength < limit){ //返回数据条数小于 limit 则直接移除“加载更多”按钮,中断预加载 document.querySelector("button.button-load").remove() return } mePage++ offset = limit*(mePage-1) getNextList() }); } } //预加载下一页数据 function getNextList(){ var bbUrl = memos+"api/v1/memo?creatorId="+bbMemo.creatorId+"&rowStatus=NORMAL&limit="+limit+"&offset="+offset; fetch(bbUrl).then(res => res.json()).then( resdata =>{ nextDom = resdata; nextLength = nextDom.length mePage++ offset = limit*(mePage-1) if(nextLength < 1){ //返回数据条数为 0 ,隐藏 document.querySelector("button.button-load").remove() return } }) } //加载总 Memos 数 function meNums() { var bbLoad = document.querySelector('.bb-load'); var bbUrl = memos + "api/v1/memo/stats?creatorId=" + bbMemo.creatorId; fetch(bbUrl).then(res => res.json()).then(resdata => { if (Array.isArray(resdata)) { // var allnums = ' ( 目前共唠叨了 ' + resdata.length + ' 条 )'; //bbLoad.insertAdjacentHTML('afterend', allnums); } }); } // 插入 html function updateHTMl(data,mode){ var result="",resultAll=""; //登录显示编辑归档按钮 if(memosOpenId && getEditor == "show"){ hasLogin = 1 } const TAG_REG = /#([^#\s!.,;:?"'()]+)(?= )/g , IMG_REG = /\!\[(.*?)\]\((.*?)\)/g //content 内 md 格式图片 , LINK_REG = /\[(.*?)\]\((.*?)\)/g //链接新窗口打开 marked.setOptions({ breaks: false, smartypants: false, langPrefix: 'language-', headerIds: false, mangle: false }); for(var i=0;i < data.length;i++){ var memoString = JSON.stringify(data[i]).replace(/"/g, '"'); var memo_id = data[i].id; //评论调用 var memoVis = data[i].visibility var bbContREG = data[i].content .replace(TAG_REG, "") .replace(IMG_REG, '') .replace(LINK_REG, '$1') bbContREG = marked.parse(bbContREG) //解析 content 内 md 格式图片 var IMG_ARR = data[i].content.match(IMG_REG) || '',IMG_ARR_Grid=''; if(IMG_ARR){ var IMG_ARR_Length = IMG_ARR.length,IMG_ARR_Url = ''; if(IMG_ARR_Length !== 1){var IMG_ARR_Grid = " grid grid-"+IMG_ARR_Length} IMG_ARR.forEach(item => { let imgSrc = item.replace(/!\[.*?\]\((.*?)\)/g,'$1') IMG_ARR_Url += '' }); bbContREG += '
'+IMG_ARR_Url+'
'; } //TAG 解析 var tagArr = data[i].content.match(TAG_REG); var memosTag = ''; if (tagArr) { memosTag = tagArr.map(function(tag) { var tagText = String(tag).replace(/[#]/g, ''); return '
#' + tagText + '
'; }).join(''); } else { memosTag = '
#日常
'; } //解析内置资源文件 if(data[i].resourceList && data[i].resourceList.length > 0){ var resourceList = data[i].resourceList; var imgUrl='',resUrl='',resImgLength = 0; for(var j=0;j < resourceList.length;j++){ var restype = resourceList[j].type.slice(0,5) var resexlink = resourceList[j].externalLink var resLink = '',fileId='' if(resexlink){ resLink = resexlink }else{ fileId = resourceList[j].publicId || resourceList[j].filename resLink = memos+'o/r/'+resourceList[j].id //+'/'+fileId } if(restype == 'image'){ imgUrl += '' resImgLength = resImgLength + 1 } if(restype !== 'image'){ resUrl += ''+resourceList[j].filename+'' } } if(imgUrl){ var resImgGrid = "" if(resImgLength !== 1){var resImgGrid = "grid grid-"+resImgLength} bbContREG += '
'+imgUrl+'
' } if(resUrl){ bbContREG += '

'+resUrl+'

' } } result += `
  • ${moment(data[i].createdTs * 1000).twitterLong()}
    ` if(hasLogin !== 0){ result += `
    ...
    修改
    归档
    删除
    ` } result += `
    ${bbContREG}
    ${memosTag}
    ` if(memoVis == "PUBLIC"){ result += `
  • `; }else if(memoVis !== "PUBLIC"){ result += `
    `; }else{ result += ``; } } // end for if(mode == "ONEDAY"){ var bbBefore = "
  • "; resultAll = bbBefore + result + bbAfter; bbDom.insertAdjacentHTML('afterbegin', resultAll); }else{ var bbBefore = "
    "; resultAll = bbBefore + result + bbAfter; bbDom.insertAdjacentHTML('beforeend', resultAll); // 在动画执行之前调整 z-index document.querySelector('.memos-more-ico').style.zIndex = '1'; // 在DOM加载完毕后执行滑动加载动画 animateSummaries(); if(document.querySelector('button.button-load')) document.querySelector('button.button-load').textContent = '再来几篇'; } } // TAG 筛选 function getTagNow(e){ //console.log(e.innerHTML) let tagName = e.innerHTML.replace('#','') let domClass = document.getElementById("bber") window.scrollTo({ top: domClass.offsetTop - 30, behavior: "smooth" }); let tagHtmlNow = `
    标签筛选:
    ${e.innerHTML}
    ` document.querySelector('#tag-list').innerHTML = tagHtmlNow let bbUrl = memos+"api/v1/memo?creatorId="+bbMemo.creatorId+"&tag="+tagName+"&limit=20"; fetch(bbUrl).then(res => res.json()).then( resdata =>{ document.querySelector(bbMemo.domId).innerHTML = "" if(document.querySelector("button.button-load")) document.querySelector("button.button-load").remove() updateHTMl(resdata) }) } //增加memos评论 function loadArtalk(memo_id) { const commentDiv = document.getElementById('memo_' + memo_id); const commentBtn = document.getElementById('btn_memo_' + memo_id); const allCommentDivs = document.querySelectorAll("[id^='memo_']"); const allCommentBtns = document.querySelectorAll("[id^='btn_memo_']"); if (commentDiv.classList.contains('hidden')) { // 收起其他评论 for (let i = 0; i < allCommentDivs.length; i++) { if (allCommentDivs[i] !== commentDiv) { allCommentDivs[i].classList.add('hidden'); } } commentDiv.classList.remove('hidden'); //增加评论平滑定位 const commentLi = document.getElementById(memo_id); const commentLiPosition = commentLi.getBoundingClientRect().top + window.pageYOffset; const offset = commentLiPosition - 3.5 * parseFloat(getComputedStyle(document.documentElement).fontSize); if ('scrollBehavior' in document.documentElement.style) { // 支持平滑滚动的情况下,使用 window.scrollTo window.scrollTo({ top: offset, behavior: 'smooth' }); } else { // 不支持平滑滚动的情况下,使用滚动容器的平滑滚动方法 // 例如:document.documentElement.scrollTop = offset; // 或者使用第三方的平滑滚动库 } const artalk = Artalk.init({ el: '#memo_' + memo_id, pageKey: '/m/' + memo_id, pageTitle: '', server: 'https://artalk.5b2.cn/', site: '优世界', darkMode: 'auto' }); } else { commentDiv.classList.add('hidden'); } } //调用coco-message插件暗黑模式 const darkModeMatcher = window.matchMedia('(prefers-color-scheme: dark)'); darkModeMatcher.addEventListener('change', handleDarkModeChange); function handleDarkModeChange(e) { if (e.matches) { document.documentElement.classList.add('dark'); } else { document.documentElement.classList.remove('dark'); } } handleDarkModeChange(darkModeMatcher); // memos-editor唠叨编辑开始 var memosDom = document.querySelector(memosData.dom); var editIcon = "
    唠叨一下
    "; var memosEditorCont = `
    保存
    `; const element = document.querySelector('.index-laodao-titile'); // 选择器是你想要操作的元素的选择器 element.insertAdjacentHTML('afterend', editIcon); memosDom.insertAdjacentHTML('afterbegin',memosEditorCont); var memosEditorInner = document.querySelector(".memos-editor-inner"); var memosEditorOption = document.querySelector(".memos-editor-option"); var memosRadomCont = document.querySelector(".memos-random"); var codeBtn = document.querySelector(".code-btn"); var codesingle = document.querySelector(".code-single"); var linkBtn = document.querySelector(".link-btn"); var linkimg = document.querySelector(".link-img"); var privateBtn = document.querySelector(".private-btn"); var oneDayBtn = document.querySelector(".oneday-btn"); var switchUserBtn = document.querySelector(".switchUser-btn"); var loadEditorBtn = document.querySelector(".load-memos-editor"); var submitApiBtn = document.querySelector(".submit-openapi-btn"); var submitMemoBtn = document.querySelector(".submit-memos-btn"); var memosVisibilitySelect = document.querySelector(".select-memos-value"); var pathInput = document.querySelector(".memos-path-input"); var tokenInput = document.querySelector(".memos-token-input"); var uploadImageInput = document.querySelector(".memos-upload-image-input"); var memosTextarea = document.querySelector(".memos-editor-textarea"); var editMemoDom = document.querySelector(".edit-memos"); var editMemoBtn = document.querySelector(".edit-memos-btn"); var cancelEditBtn = document.querySelector(".cancel-edit-btn"); var biaoqing = document.querySelector(".biao-qing"); document.addEventListener("DOMContentLoaded", () => { getEditIcon(); }); function getEditIcon() { let memosContent = '',memosVisibility = '',memosResource = [],memosRelation=[]; let memosCount = window.localStorage && window.localStorage.getItem("memos-response-count"); let memosPath = window.localStorage && window.localStorage.getItem("memos-access-path"); let memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); let getEditor = window.localStorage && window.localStorage.getItem("memos-editor-display"); let isHide = getEditor === "hide"; let getSelectedValue = window.localStorage && window.localStorage.getItem("memos-visibility-select") || "PUBLIC"; memosVisibilitySelect.value = getSelectedValue; window.localStorage && window.localStorage.setItem("memos-resource-list", JSON.stringify(memosResource)); window.localStorage && window.localStorage.setItem("memos-relation-list", JSON.stringify(memosRelation)); memosTextarea.addEventListener('input', (e) => { memosTextarea.style.height = 'inherit'; memosTextarea.style.height = e.target.scrollHeight + 'px'; }); if (getEditor !== null) { document.querySelector(".memos-editor").classList.toggle("d-none",isHide); getEditor == "show" ? hasMemosOpenId() : ''; }; loadEditorBtn.addEventListener("click", function () { getEditor != "show" ? hasMemosOpenId() : ''; document.querySelector(".memos-editor").classList.toggle("d-none"); window.localStorage && window.localStorage.setItem("memos-editor-display", document.querySelector(".memos-editor").classList.contains("d-none") ? "hide" : "show"); getEditor = window.localStorage && window.localStorage.getItem("memos-editor-display"); // 点击唠叨一下,平滑滚动到.index-laodao let editorBody = document.querySelector('.index-laodao'); if (editorBody && !document.querySelector(".memos-editor").classList.contains("d-none")) { editorBody.scrollIntoView({ behavior: 'smooth' }); } }); //标签数据 document.addEventListener("DOMContentLoaded", function () { memosPath = window.localStorage && window.localStorage.getItem("memos-access-path"); memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); if (memosPath && memosOpenId) { document.querySelector(".memos-tag-list").classList.remove("d-none"); } }); //代码 codeBtn.addEventListener("click", function () { let memoCode = "```\n\n```"; insertValue(memoCode,"",4); }); //代码单反引号 codesingle.addEventListener("click", function () { insertValue("``","`",1) }); //超级链接 linkBtn.addEventListener("click", function () { insertValue("[]()","[",1) }); //图片外链引用 linkimg.addEventListener("click", function () { insertValue("![]()","!",1) }); //以上四项的光标定位 function insertValue(text,wrap,back) { memosTextarea.focus(); const start = memosTextarea.selectionStart; const end = memosTextarea.selectionEnd; const selectedText = memosTextarea.value.substring(start, end); if(selectedText == ""){ memosTextarea.value = memosTextarea.value.substring(0, start) + text + memosTextarea.value.substring(end); memosTextarea.selectionStart = start + text.length - back; memosTextarea.selectionEnd = start + text.length - back; }else{ let wrapSelText; if( wrap == "`" ){ wrapSelText = "`" + selectedText + "`"; back = 0; } if( wrap == "[" ){ wrapSelText = "[" + selectedText + "]()"; } if( wrap == "!" ){ wrapSelText = "![" + selectedText + "]()"; } const newText = memosTextarea.value.substring(0, start) + wrapSelText + memosTextarea.value.substring(end); memosTextarea.value = newText; memosTextarea.selectionStart = start + wrapSelText.length - back; memosTextarea.selectionEnd = end + wrapSelText.length - back - selectedText.length; } } memosVisibilitySelect.addEventListener('change', function() { memoNowSelct = window.localStorage && window.localStorage.getItem("memos-visibility-select"); var selectedValue = memosVisibilitySelect.value; window.localStorage && window.localStorage.setItem("memos-visibility-select",selectedValue); if(memoNowSelct == "PRIVATE" && selectedValue == "PUBLIC"){ memoChangeDate = 1; } }); //私有模式筛选浏览 privateBtn.addEventListener("click", async function () { if (!privateBtn.classList.contains("private")) { privateBtn.classList.add("private") memosVisibilitySelect.value = "PRIVATE" window.localStorage && window.localStorage.setItem("memos-mode", "NOPUBLIC"); reloadList("NOPUBLIC") cocoMessage.success("已进入私有浏览") }else{ memosVisibilitySelect.value = "PUBLIC" window.localStorage && window.localStorage.setItem("memos-mode", ""); privateBtn.classList.remove("private") reloadList() cocoMessage.success("已退出私有浏览") } }); //开启回忆一条 oneDayBtn.addEventListener("click", async function () { let oneDay = window.localStorage && window.localStorage.getItem("memos-oneday"); if (oneDay == null ) { window.localStorage && window.localStorage.setItem("memos-oneday","open"); cocoMessage.success("已开启回忆,请刷新页面") }else{ window.localStorage && window.localStorage.removeItem("memos-oneday"); reloadList() cocoMessage.success("已退出回忆") } }); //图片上传 uploadImageInput.addEventListener('change', () => { memosPath = window.localStorage && window.localStorage.getItem("memos-access-path"); memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); if (memosPath && memosOpenId) { let filesData = uploadImageInput.files[0]; if (uploadImageInput.files.length !== 0){ uploadImage(filesData); cocoMessage.info('图片上传中……'); } } }); async function uploadImage(data) { let memosResourceListNow = JSON.parse(window.localStorage && window.localStorage.getItem("memos-resource-list")) || []; let imageData = new FormData(); let blobUrl = `${memosPath}/api/v1/resource/blob`; imageData.append('file', data, data.name) let resp = await fetch(blobUrl, { method: "POST", body: imageData, headers: { 'Authorization': `Bearer ${memosOpenId}` } }) let res = await resp.json(); if(res.id){ let resexlink = res.externalLink; let imgLink = '', fileId = ''; if (resexlink) { imgLink = resexlink } else { fileId = res.publicId || res.filename imgLink = `${memosPath}/o/r/${res.id}`;///${fileId} } let imageList = ""; imageList += `
    ${fileId}
    `; document.querySelector(".memos-image-list").insertAdjacentHTML('afterbegin', imageList); cocoMessage.success( '上传成功', ()=>{ memosResourceListNow.push(res.id); window.localStorage && window.localStorage.setItem("memos-resource-list", JSON.stringify(memosResourceListNow)); imageListDrag() }) } }; switchUserBtn.addEventListener("click", function () { memosPath = window.localStorage && window.localStorage.getItem("memos-access-path"); memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); if (memosPath && memosOpenId) { memosEditorOption.classList.remove("d-none"); memosEditorInner.classList.add("d-none"); memosRadomCont.innerHTML = ''; tokenInput.value = ''; pathInput.value = ''; } }); submitApiBtn.addEventListener("click", function () { if(tokenInput.value == null || tokenInput.value == ''){ cocoMessage.info('请输入 Token'); }else if(pathInput.value == null || pathInput.value == ''){ cocoMessage.info('请输入 Memos 地址'); }else{ getMemosData(pathInput.value,tokenInput.value); } }); submitMemoBtn.addEventListener("click", function () { memosContent = memosTextarea.value; memosVisibility = memosVisibilitySelect.value; memosResource = window.localStorage && JSON.parse(window.localStorage.getItem("memos-resource-list")); memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); let TAG_REG = /(?<=#)([^#\s!.,;:?"'()]+)(?= )/g; let memosTag = memosContent.match(TAG_REG); let hasContent = memosContent.length !== 0; if (memosOpenId && hasContent) { let memoUrl = `${memosPath}/api/v1/memo`; let memoBody = {content:memosContent,relationList:memosRelation,resourceIdList:memosResource,visibility:memosVisibility} fetch(memoUrl, { method: 'POST', body: JSON.stringify(memoBody), headers: { 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json' } }).then(function (res) { if (res.status == 200) { if (memosTag !== null) { let memoTagUrl = `${memosPath}/api/v1/tag`; (async () => { for await (const i of memosTag) { const response = await fetch(memoTagUrl, { method: 'POST', headers: { 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ name: i }) }); } })(); } cocoMessage.success( '唠叨成功', () => { document.querySelector(".memos-image-list").innerHTML = ''; window.localStorage && window.localStorage.removeItem("memos-resource-list"); window.localStorage && window.localStorage.removeItem("memos-relation-list"); memosTextarea.value = ''; memosTextarea.style.height = 'inherit'; let memosMode = window.localStorage && window.localStorage.getItem("memos-mode"); reloadList(memosMode) }) } }); }else if(!hasContent){ cocoMessage.info('内容不能为空'); }else{ cocoMessage.info( '请设置 Access Tokens', () => { memosEditorInner.classList.add("d-none"); memosEditorOption.classList.remove("d-none"); } ); } }); function hasMemosOpenId() { if (!memosOpenId) { memosEditorOption.classList.remove("d-none"); cocoMessage.info('请设置 Access Tokens'); }else{ const tagUrl = `${memosPath}/api/v1/tag`; const response = fetch(tagUrl,{ method: 'GET', headers: { 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json' } }).then(response => response.json()).then(resdata => { return resdata }).then(response => { let taglist = ""; response.map((t)=>{ taglist += `
    #${t}
    `; }) document.querySelector(".memos-tag-list").innerHTML = taglist; // cocoMessage.success('准备就绪'); memosEditorInner.classList.remove("d-none"); memosEditorOption.classList.add("d-none"); memosRadomCont.classList.remove("d-none"); }).catch(err => { memosEditorOption.classList.remove("d-none"); cocoMessage.error('Access Tokens 有误,请重新输入!'); }); } } function random(a,b) { let choices = b - a + 1; return Math.floor(Math.random() * choices + a); } async function getMemosData(p,t) { try { let response = await fetch(`${p}/api/v1/memo`,{ method: 'GET', headers: { 'Authorization': `Bearer ${t}`, 'Content-Type': 'application/json' } }); if (response.ok) { let resdata = await response.json(); if (resdata) { memosCount = resdata.length; window.localStorage && window.localStorage.setItem("memos-access-path", p); window.localStorage && window.localStorage.setItem("memos-access-token", t); window.localStorage && window.localStorage.setItem("memos-response-count", memosCount); cocoMessage.success('保存成功', () => { memosPath = window.localStorage && window.localStorage.getItem("memos-access-path"); memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); location.reload(); hasMemosOpenId(); }); } } else { cocoMessage.error('出错了,再检查一下吧!'); } } catch (error) { cocoMessage.error('出错了,再检查一下吧!'); } } async function updateAvatarUrl(e) { try { let response = await fetch(`${memosPath}/api/v1/user/me`,{ method: 'GET', headers: { 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json' } }); if (response.ok) { let resdata = await response.json(); e.forEach(item => { item.avatarUrl = resdata.avatarUrl; }); updateRadom(e); } else { cocoMessage.error('出错了,再检查一下吧!'); } } catch (error) { cocoMessage.error('出错了,再检查一下吧!'); } } } //发布框 TAG function setMemoTag(e){ let memoTag = e.textContent + " "; memosTextarea.value += memoTag; } function deleteImage(e){ if(e){ let memoId = e.getAttribute("data-id") let memosResource = window.localStorage && JSON.parse(window.localStorage.getItem("memos-resource-list")); let memosResourceList = memosResource.filter(function(item){ return item != memoId}); window.localStorage && window.localStorage.setItem("memos-resource-list", JSON.stringify(memosResourceList)); e.remove() } } //图片上传缩略图拖动顺序 function imageListDrag(){// 获取包含所有图像元素的父元素 const imageList = document.querySelector('.memos-image-list'); // 存储被拖动的元素 let draggedItem = null; let memosResourceList; // 为每个图像元素添加拖动事件监听器 imageList.querySelectorAll('.imagelist-item').forEach(item => { item.draggable = true; // 当拖动开始时 item.addEventListener('dragstart', function(e) { // 存储被拖动的元素 draggedItem = this; memosResourceList = []; }); // 当拖动元素进入目标区域时 item.addEventListener('dragover', function(e) { e.preventDefault(); // 阻止默认行为 this.classList.add('dragover'); // 添加拖动进入样式 }); // 当拖动元素离开目标区域时 item.addEventListener('dragleave', function() { this.classList.remove('dragover'); // 移除拖动进入样式 }); // 当拖动元素放置到目标区域时 item.addEventListener('drop', function(e) { e.preventDefault(); // 阻止默认行为 this.classList.remove('dragover'); // 移除拖动进入样式 // 计算拖动元素中心点 const rect = this.getBoundingClientRect(); const centerX = rect.left + rect.width / 2; // 判断鼠标相对中心点的位置 const isLeft = e.clientX < centerX; if (isLeft) { // 插入到前一个元素前 this.parentNode.insertBefore(draggedItem, this.previousElementSibling); } else { // 插入到后一个元素后 this.parentNode.insertBefore(draggedItem, this.nextElementSibling); } document.querySelectorAll('.memos-image-list .imagelist-item').forEach((item) => { let itemId = Number(item.dataset.id) memosResourceList.push(itemId); }) window.localStorage && window.localStorage.setItem("memos-resource-list", JSON.stringify(memosResourceList)); }); }); } // Emoji表情选择 let emojiSelectorVisible = false; let emojiSelector; let emojis = []; // 缓存表情数据 // 页面加载时获取表情数据 window.addEventListener("DOMContentLoaded", async () => { try { emojis = await getEmojisData(); // 获取表情数据 } catch (error) { console.error('Failed to fetch emojis data:', error); } }); // 表情选择器点击事件处理 biaoqing.addEventListener("click", function (event) { event.stopPropagation(); emojiSelectorVisible = !emojiSelectorVisible; const memosPath = window.localStorage && window.localStorage.getItem("memos-access-path"); const memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); if (emojiSelectorVisible && memosPath && memosOpenId) { displayEmojiSelector(); } else { emojiSelector?.remove(); } }); // 显示表情选择器 function displayEmojiSelector() { if (!emojiSelector) { emojiSelector = document.createElement('div'); emojiSelector.classList.add('emoji-selector'); // 使用事件代理,将事件监听器添加到父元素上 emojiSelector.addEventListener('click', (event) => { const target = event.target; if (target.classList.contains('emoji-item')) { insertEmoji(target.innerHTML); // 直接插入emoji图标 } }); } emojiSelector.innerHTML = ''; // 清空表情选择器内容 emojis.forEach(emoji => { const emojiItem = document.createElement('div'); emojiItem.classList.add('emoji-item'); emojiItem.innerHTML = emoji.icon; emojiItem.title = emoji.text; emojiSelector.appendChild(emojiItem); }); // 将表情下拉框插入到对应位置 const memosEditorTools = document.querySelector(".memos-editor-footer"); if (memosEditorTools) { memosEditorTools.insertAdjacentElement('afterend', emojiSelector); } } // 获取json文件中的数据 async function getEmojisData() { const response = await fetch('/json/owo.json'); const data = await response.json(); return data.Emoji.container; } // 表情光标位置 function insertEmoji(emojiText) { const selectionStart = memosTextarea.selectionStart; const newValue = `${memosTextarea.value.substring(0, selectionStart)}${emojiText}${memosTextarea.value.substring(memosTextarea.selectionEnd)}`; memosTextarea.value = newValue; memosTextarea.dispatchEvent(new Event('input')); const newCursorPosition = selectionStart + emojiText.length; memosTextarea.setSelectionRange(newCursorPosition, newCursorPosition); memosTextarea.focus(); } // 标签自动补全 const tagListElement = document.querySelector('.memos-tag-list'); const tagMenu = document.getElementById('memos-tag-menu'); let selectedTagIndex = -1; const getMatchingTags = (tagPrefix) => { const allTags = Array.from(tagListElement.querySelectorAll('.memos-tag a')).map(tagLink => tagLink.textContent); return allTags.filter(tag => tag.toLowerCase().includes(tagPrefix.toLowerCase())); }; const hideTagMenu = () => tagMenu.style.display = 'none'; const showTagMenu = (matchingTags) => { tagMenu.innerHTML = matchingTags.map(tag => `
    ${tag}
    `).join(''); const { left, bottom } = memosTextarea.getBoundingClientRect(); tagMenu.style.cssText = `display: block;`; selectedTagIndex = -1; }; const insertSelectedTag = (tag) => { const inputValue = memosTextarea.value; const cursorPosition = memosTextarea.selectionStart; const textBeforeCursor = inputValue.substring(0, cursorPosition); const lines = textBeforeCursor.split('\n'); const lastLine = lines[lines.length - 1]; const wordsBeforeCursor = lastLine.split(/\s+/); wordsBeforeCursor.pop(); const newLastLine = `${wordsBeforeCursor.join(' ')} ${tag} `; const newValue = inputValue.replace(lastLine, newLastLine); memosTextarea.value = newValue; const newCursorPosition = newValue.lastIndexOf(tag) + tag.length + 1; hideTagMenu(); selectedTagIndex = -1; memosTextarea.focus(); memosTextarea.setSelectionRange(newCursorPosition, newCursorPosition); }; memosTextarea.addEventListener('input', () => { const inputValue = memosTextarea.value; const cursorPosition = memosTextarea.selectionStart; const lastWord = inputValue.substring(0, cursorPosition).split(/\s+/).pop(); if (lastWord && lastWord.includes('#')) { const matchingTags = getMatchingTags(lastWord); matchingTags.length > 0 ? showTagMenu(matchingTags) : hideTagMenu(); } else { hideTagMenu(); } }); memosTextarea.addEventListener('keydown', event => { const keyCode = event.keyCode; if (tagMenu.style.display === 'block') { const matchingTags = Array.from(tagMenu.querySelectorAll('.tag-option')).map(tag => tag.textContent); if (keyCode === 38 || keyCode === 40 || keyCode === 37 || keyCode === 39) { // 添加左右方向键的处理 event.preventDefault(); if (keyCode === 37 || keyCode === 39) { // 处理左右方向键 const direction = keyCode === 37 ? -1 : 1; selectedTagIndex = (selectedTagIndex + direction + matchingTags.length) % matchingTags.length; } else { // 处理上下方向键 selectedTagIndex = (selectedTagIndex + (keyCode === 38 ? -1 : 1) + matchingTags.length) % matchingTags.length; } Array.from(tagMenu.querySelectorAll('.tag-option')).forEach((option, index) => option.classList.toggle('selected', index === selectedTagIndex)); } else if (keyCode === 13 && selectedTagIndex !== -1) { event.preventDefault(); insertSelectedTag(matchingTags[selectedTagIndex]); } } }); tagMenu.addEventListener('click', event => { insertSelectedTag(event.target.textContent); }); //修改 let memosOldSelect; function editMemo(memo) { memosOldSelect = memosVisibilitySelect.value; getEditor = window.localStorage && window.localStorage.getItem("memos-editor-display"); memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); if(memosOpenId && getEditor == "show"){ document.querySelector(".memos-image-list").innerHTML = ''; let e = JSON.parse(memo.getAttribute("data-form")); memoResList = e.resourceList,memosResource = [],imageList = ""; memosVisibilitySelect.value = e.visibility; window.localStorage && window.localStorage.setItem("memos-editor-dataform",JSON.stringify(e)); window.localStorage && window.localStorage.setItem("memos-visibility-select",memosVisibilitySelect.value); memosTextarea.value = e.content; memosTextarea.style.height = memosTextarea.scrollHeight + 'px'; submitMemoBtn.classList.add("d-none"); editMemoDom.classList.remove("d-none"); if(memoResList.length > 0){ for (let i = 0; i < memoResList.length; i++) { let imgLink = '', fileId = '',resexlink = memoResList[i].externalLink; if (resexlink) { imgLink = resexlink } else { fileId = memoResList[i].publicId || memoResList[i].filename imgLink = `${memosPath}/o/r/${memoResList[i].id}`;///${fileId} } memosResource.push(memoResList[i].id); imageList += `
    ${fileId}
    `; } window.localStorage && window.localStorage.setItem("memos-resource-list", JSON.stringify(memosResource)); document.querySelector(".memos-image-list").insertAdjacentHTML('afterbegin', imageList); } //平滑滚动到对应的class let editorBody = document.querySelector('.index-laodao'); if (editorBody) { editorBody.scrollIntoView({ behavior: 'smooth' }); } } } editMemoBtn.addEventListener("click", function () { let dataformNow = JSON.parse(window.localStorage && window.localStorage.getItem("memos-editor-dataform")); let memoId = dataformNow.id,memoRelationList = dataformNow.relationList, memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"), memoContent = memosTextarea.value, memocreatedTs = dataformNow.createdTs, memoVisibility = memosVisibilitySelect.value, memoResourceList = window.localStorage && JSON.parse(window.localStorage.getItem("memos-resource-list")); if(memoChangeDate == 1){ memocreatedTs = Math.floor(Date.now() / 1000);; } let hasContent = memoContent.length !== 0; if (hasContent) { let memoUrl = `${memosPath}/api/v1/memo/${memoId}`; let memoBody = {content:memoContent,id:memoId,createdTs:memocreatedTs,relationList:memoRelationList,resourceIdList:memoResourceList,visibility:memoVisibility} fetch(memoUrl, { method: 'PATCH', body: JSON.stringify(memoBody), headers: { 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json' } }).then(function(res) { if (res.ok) { cocoMessage.success( '修改成功', ()=>{ memoChangeDate = 0; memosVisibilitySelect.value = memosOldSelect; submitMemoBtn.classList.remove("d-none"); editMemoDom.classList.add("d-none"); document.querySelector(".memos-image-list").innerHTML = ''; window.localStorage && window.localStorage.removeItem("memos-resource-list"); window.localStorage && window.localStorage.removeItem("memos-relation-list"); memosTextarea.value = ''; memosTextarea.style.height = 'inherit'; window.localStorage && window.localStorage.removeItem("memos-editor-dataform"); let memosMode = window.localStorage && window.localStorage.getItem("memos-mode"); reloadList(memosMode) }) } }) } }) //增加memo编辑的时候取消功能 cancelEditBtn.addEventListener("click", function () { if (!editMemoDom.classList.contains("d-none")) { memosVisibilitySelect.value = memosOldSelect; document.querySelector(".memos-image-list").innerHTML = ''; window.localStorage && window.localStorage.removeItem("memos-resource-list"); window.localStorage && window.localStorage.removeItem("memos-relation-list"); memosTextarea.value = ''; memosTextarea.style.height = 'inherit'; window.localStorage && window.localStorage.removeItem("memos-editor-dataform"); editMemoDom.classList.add("d-none"); submitMemoBtn.classList.remove("d-none"); } }) //增加memos归档功能 function archiveMemo(memoId) { memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); if(memosOpenId && memoId){ let memoUrl = `${memosPath}/api/v1/memo/${memoId}`; let memoBody = {id:memoId,rowStatus:"ARCHIVED"}; fetch(memoUrl, { method: 'PATCH', body: JSON.stringify(memoBody), headers: { 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json' } }).then(function(res) { if (res.ok) { cocoMessage.success( '归档成功', ()=>{ let memosMode = window.localStorage && window.localStorage.getItem("memos-mode"); reloadList(memosMode) }) } }) } } //增加memo删除功能 function deleteMemo(memoId) { let isOk = confirm("确定要删除此条唠叨吗?"); if(isOk){ memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); if(memosOpenId && memoId){ let memoUrl = `${memosPath}/api/v1/memo/${memoId}`; fetch(memoUrl, { method: 'DELETE', headers: { 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json' } }).then(function(res) { if (res.ok) { cocoMessage.success( '删除成功', ()=>{ let memosMode = window.localStorage && window.localStorage.getItem("memos-mode"); reloadList(memosMode) }) } }).catch(err => { cocoMessage.error('出错了,再检查一下吧') }) } } } //无刷新 function reloadList(mode){ var bberDom = document.querySelector("#bber"); bberDom.innerHTML = ''; memosOpenId = window.localStorage && window.localStorage.getItem("memos-access-token"); var bbUrl; if(mode == "NOPUBLIC"){ bbUrl = memos+"api/v1/memo"; }if(mode == "ONEDAY"){ let memosCount = window.localStorage && window.localStorage.getItem("memos-response-count"); let random = Math.floor(Math.random() * memosCount) bbUrl = memos+"api/v1/memo?creatorId="+bbMemo.creatorId+"&limit=1&offset="+random; }else{ bbUrl = memos+"api/v1/memo?creatorId="+bbMemo.creatorId+"&rowStatus=NORMAL&limit="+limit; } fetch(bbUrl,{ headers: { 'Authorization': `Bearer ${memosOpenId}`, 'Content-Type': 'application/json', 'Cache-Control': 'no-cache', }, cache: 'no-store', }).then(res => res.json()).then( resdata =>{ if (mode == "NOPUBLIC") { resdata = resdata.filter((item) => item.visibility !== "PUBLIC"); } if(mode == "ONEDAY"){ updateHTMl(resdata,"ONEDAY"); }else{ updateHTMl(resdata); var nowLength = resdata.length; if(nowLength < limit){ //返回数据条数小于 limit 则直接移除“加载更多”按钮,中断预加载 document.querySelector("button.button-load").remove() return } mePage++ offset = limit*(mePage-1) getNextList(mode) } }); } //发布框中无内容时,唠叨一下按钮为透明度0.4 function handleTextareaInput() { var textarea = document.querySelector('.memos-editor-textarea'); var submitButton = document.querySelector('.submit-memos-btn'); submitButton.style.opacity = textarea.value.trim() !== '' ? 1 : 0.4; } handleTextareaInput(); document.querySelector('.memos-editor-textarea').addEventListener('input', handleTextareaInput); //memos、评论链接跳转中间页 document.body.addEventListener('click', function(e) { let target = e.target.closest('.atk-comment-wrap a, .datacont a'); if (target && !target.href.includes('usj.cc')) { e.preventDefault(); let encodedUrl = btoa(target.href); let url = '/tiaozhuan?target=' + encodedUrl; window.open(url, '_blank'); } });