首页 > 其他分享 >博客园文章目录生成脚本v1.0:支持多级、过滤空行、可指定文章、自定义插入点

博客园文章目录生成脚本v1.0:支持多级、过滤空行、可指定文章、自定义插入点

时间:2024-06-04 12:55:35浏览次数:11  
标签:自定义 level 博客园 length let 文章 div stack

使用说明:

1.设置-申请JS权限,等待审核通过

2.设置-页脚HTML代码,代码贴进去保存

 

样式说明:

1.默认目录插到文章顶部,可以加入 <div id="toc"></div> 标签自定义插入位置。

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


自定义功能:

catalogue(true):给所有文章生成目录

catalogue(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

标签:自定义,level,博客园,length,let,文章,div,stack
From: https://www.cnblogs.com/yfeil/p/18217712

相关文章

  • idea设置自定义快捷键定义代码块
    自定义代码块常用的psvm,main,sout等就是系统预设的。我们可以自己添加自定义的代码块,并制定调用该代码块的缩写,这样在使用该代码块时,就无需手动填写,只需通过代码块缩写触发idea的自动补全即可,位置:Setting–>Editor–>LiveTemplates如下图 为了区分方便管理,你可以添加自己的模板......
  • 自定义FlutterFragment的初始化路由没有生效
    问题:在自定义FlutterFragment的configureFlutterEngine方法中初始化页面路由发现一直是'/'原因:当configureFlutterEngine方法被调用时,Flutter已经完成了初始化并设置了默认的初始路由(通常是'/')。在Android项目中,FlutterFragment在onAttach方法中创建FlutterEngine。在......
  • 【C语言】自定义类型:结构体(建议收藏!!!)
    结构体前言1、什么是结构体2、结构体类型的声明3、结构体变量的创建和初始化4、结构成员访问操作符5、结构体内存对齐6、存在内存对齐的原因7、结构体传参8、结构体实现位段前言我们已经学了很多数据类型,列如int,char,float,double等。但还不能满足需求,在我们......
  • vue3中ref绑定自定义组件没有获取到dom?
    问题<template><my-compref="test"/></template><scriptlang="ts"setup>consttest=ref()onMounted(()=>{console.log(test.value)})</script>打印出来的是一个proxy对象解决办法1.如果ref绑定的是一个普通的d......
  • VS Code自定义代码模板
    VSCode自定义代码模板VSCode作为一款轻量级的编辑器,使用体验极佳,具有很多有用的小功能,也有着非常丰富的插件,日常写代码的时候自动补全和各种模板能够有效的提高编码的效率,这里介绍两种我常使用的自定义代码块或者模板的设置方法。集成自定义代码段VSCode自带了用户定......
  • HarmonyOS NEXT星河版之自定义List下拉刷新与加载更多
    文章目录一、加载更多二、下拉刷新三、小结一、加载更多借助List的onReachEnd方法,实现加载更多功能,效果如下:@ComponentexportstructHPList{//数据源@PropdataSource:object[]=[]//加载更多是否ing@StateisLoadingMore:boolean=false......
  • 博客园美化:添加顶部浏览进度条
    先看效果图: 顶部进度条会根据浏览页面而变化,话不多说,代码附上:1<script>2(function(w,d){3vardomDiv=d.createElement('div');45domDiv.style.cssText='position:fixed;top:0;left:0;width:0;height:3px......
  • 今天分享一篇Python启动浏览器的文章
    1.首先是浏览器选择,因为我之前自己电脑测试,安装了Firefox浏览器,版本号:45.0.2。但是这个版本号的浏览器找不到对应的驱动,但是本人又不想卸载这个浏览器,所以转而使用谷歌浏览器进行自动化测试了。Firefox驱动下载地址:https://github.com/mozilla/geckodriver/releases,如果有需要的......
  • 「AntV」X6 自定义vue节点(vue3)
    官方文档本篇文档只讲解vue3中如何使用,vue2的可以参考下官方文档安装插件@antv/x6-vue-shape添加vue组件既然使用vue节点,那么我们就需要准备一个vue的组件,这个组件就是节点的一些样式,根据你们的ui自行写代码即可<template><div>节点名称</div><div>节点描述</div>......
  • IDEA自定义配置注释模板,让你看起来更加专业!!!
    一:类注释我们先来康康成果:在以上的代码中我们可以看到只要创建一个类,idea自动会给你补充注释消息,有作者信息和创建时间关于模板参数代码我已经放到下面了:/***@author:dlwlrma*@data${YEAR}年${MONTH}月${DAY}日${TIME}*/ 使用方法:打开IDEA的Settings,点击Edi......