summary refs log tree commit diff
path: root/assets/js/main_new.js
blob: deb0927fd6958aa2fd35c1b34263dae8dc192461 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
$(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() {
    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);
                });
        });
    });
});