diff options
Diffstat (limited to 'assets/js/main_new.js')
| -rw-r--r-- | assets/js/main_new.js | 105 |
1 files changed, 33 insertions, 72 deletions
diff --git a/assets/js/main_new.js b/assets/js/main_new.js index deb0927..a6c10c6 100644 --- a/assets/js/main_new.js +++ b/assets/js/main_new.js @@ -1,77 +1,38 @@ -$(function () { - 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); +function highlightKeyword() { + var match = location.search.match(/[?&]kw=([^&]+)/); + var kw = match ? $.trim(decodeURIComponent(match[1].replace(/\+/g, ' '))) : ''; + if (!kw) return; + + var reg = new RegExp('(' + kw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')', 'gi'); + var escapeMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; + + $('section, section *').not('script, style, textarea').contents().filter(function() { + return this.nodeType === 3; + }).each(function() { + var escapedText = this.nodeValue.replace(/[&<>"']/g, function(m) { return escapeMap[m]; }); + var highlighted = escapedText.replace(reg, '<mark>$1</mark>'); + if (escapedText !== highlighted) { + $(this).replaceWith(highlighted); + } }); -}); - -$(function() { - var $codeBlocks = $('div.highlight'); - - $codeBlocks.each(function() { - var $copyButton = $('<button>', { - class: 'copy', - type: 'button', - text: '📋' - }); - - $(this).append($copyButton); - - $copyButton.on('click', function() { - var code = $(this).siblings('pre').find('code').text().trim(); - var $button = $(this); - +} + +function initCopyButtons() { + $('.copy').remove(); + $('div.highlight').each(function () { + var $btn = $('<button>', { class: 'copy', type: 'button', text: '📋' }); + $(this).append($btn); + $btn.on('click', function () { + var code = $btn.siblings('pre').find('code').text().trim(); navigator.clipboard.writeText(code) - .then(function() { - $button.text('✅'); - }) - .catch(function(err) { - $button.text('❌'); - console.error('复制失败:', err); - }) - .finally(function() { - setTimeout(function() { - $button.text('📋'); - }, 1500); - }); + .then(function () { $btn.text('✅'); }) + .catch(function () { $btn.text('❌'); }) + .finally(function () { setTimeout(function () { $btn.text('📋'); }, 1500); }); }); }); +} + +$(function () { + highlightKeyword(); + initCopyButtons(); });
\ No newline at end of file |
