summaryrefslogtreecommitdiff
path: root/assets/js/main_new.js
diff options
context:
space:
mode:
Diffstat (limited to 'assets/js/main_new.js')
-rw-r--r--assets/js/main_new.js105
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 => ({
- '&': '&amp;',
- '<': '&lt;',
- '>': '&gt;',
- '"': '&quot;',
- "'": '&#39;'
- }[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 = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' };
+
+ $('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