1(function() { 2 'use strict'; 3 4 // ð è¯è®ºè¡¨å AJAX æäº¤ï¼ä½¿ç¨äºä»¶å§æï¼å ¼å®¹ Swup 卿å è½½ç表åï¼ 5 function bindCommentFormSubmit() { 6 // é¿å éå¤ç»å® 7 if (document.body && document.body.dataset.shirokiCommentSubmitBound === 'true') { 8 return; 9 } 10 if (document.body) { 11 document.body.dataset.shirokiCommentSubmitBound = 'true'; 12 } 13 14 document.body.addEventListener('submit', function(e) { 15 const commentForm = e.target.closest('#commentform'); 16 if (!commentForm) return; 17 18 e.preventDefault(); 19 20 const commentField = commentForm.querySelector('#comment'); 21 if (commentField && !commentField.value.trim()) { 22 commentField.classList.add('shiroki-field-error'); 23 if (window.ShirokiBubbleTooltip) { 24 var emptyMsg = window.ShirokiBubbleTooltip.getEmptyValidationMessage 25 ? window.ShirokiBubbleTooltip.getEmptyValidationMessage() 26 : ((window.shirokiBubbleConfig && window.shirokiBubbleConfig.emptyValidationMsg) || '请è¾å ¥å 容'); 27 window.ShirokiBubbleTooltip.showValidationError(commentField, emptyMsg); 28 } 29 return; 30 } 31 32 const formData = new FormData(commentForm); 33 const messageArea = document.querySelector('.message-content'); 34 const submitBtn = commentForm.querySelector('.submit-btn'); 35 const submitBtnIcon = submitBtn.querySelector('i'); 36 37 // æ´æ¹æé®ç¶æä¸ºæäº¤ä¸ 38 submitBtn.disabled = true; 39 submitBtnIcon.className = 'fa fa-spinner fa-spin'; 40 submitBtn.innerHTML = `${submitBtnIcon.outerHTML} æ£å¨å表...`; 41 42 // æ·»å AJAX请æ±åæ° 43 formData.append('action', 'ajax_comment'); 44 formData.append('security', document.querySelector('#comment_nonce_field').value); 45 46 fetch(window.ajax_object.ajaxurl, { 47 method: 'POST', 48 body: formData, 49 credentials: 'same-origin' 50 }) 51 .then(response => response.json()) 52 .then(data => { 53 if (data.success) { 54 // æ¸ ç©ºè¾å ¥æ¡ 55 commentForm.querySelector('textarea').value = ''; 56 57 // æ´æ°ç¨æ·ä¿¡æ¯æ¾ç¤º 58 const userNameElement = document.querySelector('.user-info .user-name'); 59 const userEmailElement = document.querySelector('.user-info .user-email'); 60 if (userNameElement && !window.ajax_object .is_user_logged_in) { 61 userNameElement.textContent = formData.get('author'); 62 } 63 if (userEmailElement && !window.ajax_object .is_user_logged_in) { 64 userEmailElement.textContent = formData.get('email'); 65 } 66 67 // è·åæ°è¯è®ºå®¹å¨ 68 const commentNew = document.querySelector('.comment-new'); 69 const newContent = commentNew.querySelector('.new-content'); 70 71 // æå ¥æ°è¯è®º 72 const newComment = createCommentElement(data.data.comment); 73 newContent.insertAdjacentElement('afterbegin', newComment); 74 75 // æ¾ç¤ºæ°è¯è®ºå®¹å¨å¹¶æ·»å å¨ç»ææ 76 commentNew.style.display = 'block'; 77 void commentNew.offsetWidth; 78 commentNew.classList.add('show'); 79 80 // åå§åæ°è¯è®ºä¸çæå è½½å¾ç 81 const lazyImages = newComment.querySelectorAll('img.lazy'); 82 lazyImages.forEach(img => { 83 const imageObserver = new IntersectionObserver((entries, observer) => { 84 entries.forEach(entry => { 85 if (entry.isIntersecting) { 86 img.src = img.dataset.src; 87 img.classList.remove('lazy'); 88 observer.unobserve(img); 89 } 90 }); 91 }); 92 imageObserver.observe(img); 93 }); 94 95 // æ´æ°è¯è®ºè®¡æ° 96 updateCommentCount(); 97 98 showMessage(data.data.message || 'è¯è®ºæäº¤æåï¼', 'success'); 99 } else { 100 showMessage(data.data || 'æäº¤å¤±è´¥ï¼è¯·æ£æ¥è¾å ¥ï¼', 'error'); 101 } 102 }) 103 .catch(error => { 104 console.error('è¯è®ºæäº¤é误:', error); 105 showMessage('ç½ç»é误ï¼è¯·éè¯ï¼', 'error'); 106 }) 107 .finally(() => { 108 // æ¢å¤æé®ç¶æ 109 submitBtn.disabled = false;
110 submitBtnIcon.className = 'fa fa-paper-plane'; 111 submitBtn.innerHTML = `${submitBtnIcon.outerHTML} å表è¯è®º`; 112 }); 113 }); 114 } 115 116 // å建è¯è®ºå ç´ 117 function createCommentElement(comment) { 118 // 使ç¨ä¸´æ¶divå 裹å¤çç©ºæ ¼é®é¢ 119 const tempDiv = document.createElement('div'); 120 tempDiv.innerHTML = comment.trim(); 121 return tempDiv.firstElementChild; 122 } 123 124 // æ´æ°è¯è®ºæ°é 125 function updateCommentCount() { 126 const countElement = document.querySelector('.post-comments h2'); 127 const currentCount = parseInt(countElement.textContent.match(/\d+/)[0]); 128 countElement.textContent = countElement.textContent.replace(/\d+/, currentCount + 1); 129 } 130 131 // å夿é®å¤ç 132 document.body.addEventListener('click', function(e) { 133 if (e.target.closest('.comment-reply-link')) { 134 e.preventDefault(); 135 const replyLink = e.target.closest('.comment-reply-link'); 136 const commentId = replyLink.dataset.commentid; 137 document.querySelector('#comment_parent').value = commentId; 138 document.getElementById('cancel-comment-reply-link').style.display = 'inline'; 139 } 140 }); 141}); 142 143// è¯è®ºå·¥å ·æ åè½åå§å 144function initCommentToolbar() { 145 const commentTextarea = document.querySelector('#comment'); 146 const emojiBtn = document.querySelector('.emoji-btn'); 147 const uploadBtn = document.querySelector('.upload-btn'); 148 const codeBtn = document.querySelector('.code-btn'); 149 const emojiPanel = document.querySelector('.emoji-panel'); 150 const codePanel = document.querySelector('.code-panel'); 151 const uploadInput = document.querySelector('.upload-input'); 152 153 if(emojiBtn && emojiPanel) { 154 emojiBtn.addEventListener('click', (e) => { 155 e.stopPropagation(); 156 // æ·»å å ç´ å卿§æ£æ¥ 157 const isVisible = emojiPanel && emojiPanel.style.display === 'block'; 158 if(emojiPanel) { 159 emojiPanel.style.display = isVisible ? 'none' : 'block'; 160 codePanel && (codePanel.style.display = 'none'); 161 } 162 163 if(emojiPanel && !isVisible) { 164 const firstTab = emojiPanel.querySelector('.emoji-tabs span'); 165 if(firstTab) { 166 firstTab.click(); 167 } 168 } 169 }); 170 171 const emojis = { 172 emoji: [ 173 'ð','ð','ð','ð¤£','ð','ð', 174 'ð ','ð','ð','ð','ð','ð', 175 'ð','ð¥°','ð','ð','ð','ð', 176 'ð','ð','ð¤','ð¤','ð¤¨','ð', 177 'ð','ð¶','ð','ð','ð£','ð¥', 178 'ð®','ð¤¤','ð´','ðª','ðµ','ðµ', 179 'ðµ','ð¤¯','ð¤ ','ð¤¡','ð¤¥','ð¤«', 180 'ð¤','ð¤¨','ð','ð','ð¶','ð', 181 ], 182 custom: ['(ââ½â)', '(ï¿£â½ï¿£)', '(=ã»Ïã»=)', '(ï½ã»Ïã»Â´)', 183 '(ãï¿£â³ï¿£)ã', '(ï½¥âï½¥)', '(°â°)ï¾', '(ï¿£3ï¿£)', 'â®(ï¿£â½ï¿£)â', 184 '(*>.<*)', '( Ë̶Íâ¡ËÌ¶Í ) hi!','â_âï¼', 'â_â', '(。â¢Ëâ¸Ëâ¢ï½¡)', 185 'Cialloï½(â ã»Ï< )ââ', 'Ô (¯ï¹Â¯Ô )', 'ï¼Â¯ï¹Â¯ï¼', '(ãã¸ï¿£ã)', 186 'd=====(ï¿£â½ï¿£*)b','[]~(ï¿£â½ï¿£)~*','â|ï¿£|_','Σ( ° Ⳡ°|||)︴', 187 'o((âï¹â))o.','â§(â â¡ ââ¿)','(ï¿£_,ï¿£ )','ï¿£ã¸ï¿£' 188 ] 189 }; 190 191 const emojiContent = emojiPanel.querySelector('.emoji-content'); 192 const emojiTabs = emojiPanel.querySelectorAll('.emoji-tabs span'); 193 emojiTabs.forEach(tab => { 194 tab.addEventListener('click', () => { 195 const type = tab.dataset.tab; 196 emojiTabs.forEach(t => t.classList.remove('active')); 197 tab.classList.add('active'); 198 emojiContent.innerHTML = ''; 199 emojis[type].forEach(emoji => { 200 const span = document.createElement('span'); 201 span.textContent = emoji; 202 span.addEventListener('click', () => { 203 insertAtBoxmoe(commentTextarea, emoji); 204 emojiPanel.style.display = 'none'; 205 }); 206 emojiContent.appendChild(span); 207 }); 208 }); 209 210 // é»è®¤æ¿æ´»emojiæ ç¾ 211 if(tab.classList.contains('active')) { 212 tab.click(); 213 } 214 }); 215 } 216 217 // å¾çä¸ä¼ åè½ 218 if(uploadBtn && uploadInput) { 219 uploadBtn.addEventListener('click', () => { 220 uploadInput.click(); 221 }); 222 223 uploadInput.addEventListener('change', async (e) => { 224 const file = e.target.files[0]; 225 if(file) { 226 if(file.size > 2 * 1024 * 1024) { // 2MBéå¶ 227 showMessage('å¾ç大å°ä¸è½è¶ è¿2MB', 'error'); 228 return; 229 } 230 231 try { 232 const imgUrl = await uploadImage(file); 233 insertAtBoxmoe(commentTextarea, ``); 234 } catch(err) { 235 showMessage('å¾çä¸ä¼ 失败', 'error'); 236 } 237 } 238 }); 239 } 240
241 // pl代ç é«äº®æå ¥åè½ 242 if(codeBtn && codePanel) { 243 const closeBtn = codePanel.querySelector('.close-btn'); 244 const insertBtn = codePanel.querySelector('.insert-code-btn'); 245 const codeInput = codePanel.querySelector('.code-input'); 246 const langSelect = codePanel.querySelector('.code-language'); 247 248 // åå§å代ç 颿¿ä½ç½® 249 codePanel.style.display = 'none'; 250 251 codeBtn.addEventListener('click', (e) => { 252 e.stopPropagation(); 253 codePanel.style.display = codePanel.style.display === 'none' ? 'block' : 'none'; 254 emojiPanel && (emojiPanel.style.display = 'none'); 255 if(codePanel.style.display === 'block') { 256 codeInput.focus(); 257 } 258 }); 259 260 closeBtn.addEventListener('click', () => { 261 codePanel.style.display = 'none'; 262 }); 263 264 insertBtn.addEventListener('click', () => { 265 const code = codeInput.value.trim(); 266 if(code) { 267 // ä¿®æ¹ä¸ºWordPresså ¼å®¹çpre+codeæ ç¾æ ¼å¼ 268 const codeBlock = `\n<pre><code class="language-">\n${code}\n</code></pre>\n`; 269 insertAtBoxmoe(commentTextarea, codeBlock); 270 codeInput.value = ''; 271 codePanel.style.display = 'none'; 272 } 273 }); 274 275 // åè½¦é®æäº¤æ¯æ 276 codeInput.addEventListener('keydown', (e) => { 277 if(e.key === 'Enter' && (e.ctrlKey || e.metaKey)) { 278 insertBtn.click(); 279 } 280 }); 281 } 282 283 document.addEventListener('click', (e) => { 284 // æ·»å å ç´ å卿§æ£æ¥ 285 if(emojiPanel && emojiBtn) { 286 if(!emojiPanel.contains(e.target) && !emojiBtn.contains(e.target)) { 287 emojiPanel.style.display = 'none'; 288 } 289 } 290 if(codePanel && codeBtn) { 291 if(!codePanel.contains(e.target) && !codeBtn.contains(e.target)) { 292 codePanel.style.display = 'none'; 293 } 294 } 295 }); 296} 297// è¯è®ºåå¤åå§å 298function initCommentReply() { 299 const commentForm = document.getElementById('respond'); 300 const cancelReply = document.getElementById('cancel-comment-reply-link'); 301 const commentList = document.querySelector('.comments-list'); 302 if (!commentForm || !cancelReply || !commentList) return; 303 let originalPosition = null; 304 document.querySelectorAll('.comment-reply-link').forEach(link => { 305 link.addEventListener('click', (e) => { 306 e.preventDefault(); 307 if (!commentForm) return; 308 if (!originalPosition) { 309 originalPosition = commentForm.parentNode; 310 } 311 const commentItem = link.closest('.comment-item'); 312 const commentContent = commentItem?.querySelector('.comment-content'); 313 if (!commentContent) return; 314 cancelReply.style.display = 'inline-block'; 315 commentContent.appendChild(commentForm); 316 commentForm.scrollIntoView({ behavior: 'smooth', block: 'center' }); 317 commentForm.querySelector('#comment')?.focus(); 318 }); 319 }); 320 if(cancelReply) { 321 cancelReply.addEventListener('click', (e) => { 322 e.preventDefault(); 323 cancelReply.style.display = 'none'; 324 if (originalPosition) { 325 originalPosition.appendChild(commentForm); 326 } 327 commentForm?.scrollIntoView({ behavior: 'smooth', block: 'center' }); 328 }); 329 } 330} 331 332// è¯è®ºæ¶æ¯åå§å 333function showMessage(message, type = 'success') { 334 const messageEl = document.querySelector('.comment-message'); 335 const contentEl = messageEl.querySelector('.message-content'); 336 337 messageEl.className = 'comment-message ' + type; 338 contentEl.textContent = message; 339 messageEl.classList.add('show'); 340 341 setTimeout(() => { 342 messageEl.classList.remove('show'); 343 }, 5000); 344} 345 346//ç¼è¾å¨è¾ å©å½æ° 347function insertAtBoxmoe(textarea, text) { 348 const start = textarea.selectionStart; 349 const end = textarea.selectionEnd; 350 const value = textarea.value; 351 352 textarea.value = value.substring(0, start) + text + value.substring(end); 353 textarea.selectionStart = textarea.selectionEnd = start + text.length; 354 textarea.focus(); 355} 356 357// è¯è®ºå表æ¾ç¤º/éèåè½åå§å 358function initCommentsToggle() { 359 const toggle = document.querySelector('.comments-toggle'); 360 const commentsList = document.querySelector('.comments-list'); 361 362 if (!toggle || !commentsList) return; 363 364 // ä»localStorageè·åç¶æ 365 const isOpen = localStorage.getItem('commentsListOpen') === 'true'; 366 367 // åå§åç¶æ 368 if (isOpen) { 369 toggle.classList.add('active'); 370 toggle.querySelector('span').textContent = 'æ¶èµ·è¯è®ºå表'; 371 commentsList.classList.add('show'); 372 } 373 374 toggle.addEventListener('click', () => { 375 const isActive = toggle.classList.toggle('active'); 376 toggle.querySelector('span').textContent = isActive ? 'æ¶èµ·è¯è®ºå表' : 'æ¥çè¯è®ºå表'; 377 commentsList.classList.toggle('show'); 378 379 // ä¿åç¶æå°localStorage 380 localStorage.setItem('commentsListOpen', isActive); 381 }); 382} 383 384document.addEventListener("DOMContentLoaded", () => {
385 initCommentReply(); 386 initCommentToolbar(); 387 initCommentsToggle(); 388});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.