mirror of https://github.com/Mabbs/mabbs.github.io
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					78 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					78 lines
				
				2.5 KiB
			| 
											6 months ago
										 | $(function () { | ||
|  |     $("div#landlord").mouseenter(function () { | ||
|  |         $("div.live_ico_box").fadeIn(); | ||
|  |     }); | ||
|  |     $("div#landlord").mouseleave(function () { | ||
|  |         $("div.live_ico_box").fadeOut(); | ||
|  |     }); | ||
|  |      | ||
|  |     const urlParams = new URLSearchParams(window.location.search); | ||
|  |     const keyword = urlParams.get('kw')?.trim(); | ||
|  | 
 | ||
|  |     if (!keyword) return; | ||
|  | 
 | ||
|  |     // 转义正则表达式特殊字符,避免安全问题
 | ||
|  |     const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); | ||
|  |     // 创建不区分大小写的正则表达式(全局匹配)
 | ||
|  |     const regex = new RegExp(`(${escapedKeyword})`, 'gi'); | ||
|  | 
 | ||
|  |     // 递归遍历并高亮文本节点
 | ||
|  |     const escapeHTML = str => str.replace(/[&<>"']/g,  | ||
|  |         tag => ({ | ||
|  |             '&': '&', | ||
|  |             '<': '<', | ||
|  |             '>': '>', | ||
|  |             '"': '"', | ||
|  |             "'": ''' | ||
|  |         }[tag] || tag)); | ||
|  |     function highlightTextNodes(element) { | ||
|  |         $(element).contents().each(function () { | ||
|  |             if (this.nodeType === Node.TEXT_NODE) { | ||
|  |                 const $this = $(this); | ||
|  |                 const text = escapeHTML($this.text()); | ||
|  | 
 | ||
|  |                 // 使用正则替换并保留原始大小写
 | ||
|  |                 if (regex.test(text)) { | ||
|  |                     const replaced = text.replace(regex, '<mark>$1</mark>'); | ||
|  |                     $this.replaceWith(replaced); | ||
|  |                 } | ||
|  |             } else if ( | ||
|  |                 this.nodeType === Node.ELEMENT_NODE && | ||
|  |                 !$(this).is('script, style, noscript, textarea') | ||
|  |             ) { | ||
|  |                 highlightTextNodes(this); | ||
|  |             } | ||
|  |         }); | ||
|  |     } | ||
|  | 
 | ||
|  |     $('section').each(function () { | ||
|  |         highlightTextNodes(this); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var codeBlocks = document.querySelectorAll('div.highlight'); | ||
|  | 
 | ||
|  |     codeBlocks.forEach(function (codeBlock) { | ||
|  |         var copyButton = document.createElement('button'); | ||
|  |         copyButton.className = 'copy'; | ||
|  |         copyButton.type = 'button'; | ||
|  |         copyButton.innerText = '📋'; | ||
|  | 
 | ||
|  |         codeBlock.append(copyButton); | ||
|  | 
 | ||
|  |         copyButton.addEventListener('click', function () { | ||
|  |             var code = codeBlock.querySelector('pre code').innerText.trim(); | ||
|  |             window.navigator.clipboard.writeText(code) | ||
|  |                 .then(() => { | ||
|  |                     copyButton.innerText = '✅'; | ||
|  |                 }) | ||
|  |                 .catch(err => { | ||
|  |                     copyButton.innerText = '❌'; | ||
|  |                     console.error('Failed to copy:', err); | ||
|  |                 }); | ||
|  | 
 | ||
|  |             setTimeout(function () { | ||
|  |                 copyButton.innerText = '📋'; | ||
|  |             }, 1500); | ||
|  |         }); | ||
|  |     }); | ||
|  | }); |