部落格園文章目錄生成指令碼v1.0:支援多級、過濾空行、可指定文章、自定義插入點

Yfeil發表於2024-06-04

使用說明:

1.設定-申請JS許可權,等待稽核透過

2.設定-頁尾HTML程式碼,程式碼貼進去儲存

樣式說明:

1.預設目錄插到文章頂部,可以加入 <div id="toc"></div> 標籤自定義插入位置。

2.H1 和 H2 是加粗體,其他的是正常體。


自定義功能:

all = true:給所有文章生成目錄

all = false:只給帶 <div id="toc"></div> 的文章生成目錄

程式碼:

<script>
    /**
     * 部落格:https://www.cnblogs.com/yfeil/p/18217712
     * 作者:羽飛落
     * 指令碼名稱:部落格園文章目錄生成指令碼
     * 功能介紹:支援多級、過濾空行、可指定文章、自定義插入點
     * 當前版本:v1.0
     * 更新日期:2024年5月28日
     * 
     * 使用說明:
     * 1.設定-申請JS許可權,等待稽核透過。
     * 2.設定-頁尾HTML程式碼,程式碼貼進去儲存。
     * 
     * 樣式說明:
     * 1.預設目錄插到文章頂部,可以加入 <div id="toc"></div> 標籤自定義插入位置。
     * 2.H1 和 H2 是加粗體,其他的是正常體。
     * 
     * 自定義功能:
     * all = true:給所有文章生成目錄
     * all = false:只給帶 <div id="toc"></div> 的文章生成目錄
    */
    all = true;

    function catalogue() {

        // 是否為文章頁
        let head = $('#cnblogs_post_body');
        if (head.length == 0) {
            return;
        }
        // 只給帶 <div id="toc"></div> 的文章生成目錄
        let toc = $('div#toc');
        if (!all && toc.length == 0) {
            return;
        }

        // 查詢所有標題,過濾空行
        let elements = head.find('h1, h2, h3, h4, h5, h6').filter(function () {
            return this.textContent.trim().length > 0 && !$(this).parent().is('div#toc');
        });
        if (elements.length == 0) {
            return;
        }

        let div = $('<div>')
            .attr('id', 'toc')
            .append($('<h2>').text('目錄'));

        let level_stack = [];
        let w = $(window).width() > 767;
        let indent = w ? 25 : 15;
        for (let i = 0; i < elements.length; i++) {

            // 計算級別
            let level = parseInt(elements[i].tagName.slice(1));

            // 把棧中所有大於當前級別的都彈出去
            while (level_stack.length > 0 && level < level_stack[level_stack.length - 1]) {
                level_stack.pop();
            }
            // 如果棧中最大值等於當前級別,則不做動作
            // 如果棧中最大值小於當前級別,則當前級別入棧
            // 如果棧是空的,則當前級別直接入棧
            if (level_stack.length == 0 || level > level_stack[level_stack.length - 1]) {
                level_stack.push(level);
            }

            elements[i].setAttribute('id', 'tag_' + i);
            div.append(
                // 構建外層DIV
                $('<div>')
                    .css('padding', '5px ' + (level_stack.length * indent - (w ? 0 : indent)) + 'px')
                    .css('font-weight', level <= 2 ? 'bold' : 'normal')
                    .append(
                        // 構建A標籤
                        $('<a>')
                            .attr('href', '#tag_' + i)
                            .attr('title', elements[i].textContent)
                            .css('text-decoration', 'none')
                            .text(elements[i].textContent)
                    )
            );
        }

        div.append($('<hr>'));
        if (toc.length == 0) {
            head.prepend(div);
        } else {
            toc.replaceWith(div);
        }

    }
    $(window).on('resize', function() {
        catalogue();
    });
    catalogue();
</script>

層級演示:

H4

H5
H6

H1:會加粗

H2:也會加粗

H3:之後都是正常字型

H4

H4

H5
H6

H2

H3

H4

相關文章