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.
77 lines
2.4 KiB
77 lines
2.4 KiB
$(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() { |
|
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); |
|
|
|
navigator.clipboard.writeText(code) |
|
.then(function() { |
|
$button.text('✅'); |
|
}) |
|
.catch(function(err) { |
|
$button.text('❌'); |
|
console.error('复制失败:', err); |
|
}) |
|
.finally(function() { |
|
setTimeout(function() { |
|
$button.text('📋'); |
|
}, 1500); |
|
}); |
|
}); |
|
}); |
|
}); |