typecho 给文章创建目录树

2024-02-26 20:52
文章标签 创建 文章 目录 typecho

本文主要是介绍typecho 给文章创建目录树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

受益于 shortcode 短代码插件和泽泽短代码中目录树的显示样式,形成了自己实现添加文章目录的思路:

一、文章目录树的结构

<div id="toc"><div class="toc-left"><div class="toc-btn" type="button" onclick="changetoc()">></div></div><div class="TOC">目录树区域</div>
</div>

上面用到点击显示目录树的js代码为:

// 推拉toc
function changetoc() {var e = document.getElementById("toc");if (e.classList.contains("tocwidth")) {e.classList.remove("tocwidth");} else {e.classList.add("tocwidth");}
}

二、给文章目录树创建CSS样式

/* -----------------------------------
## 目录树 
------------------------------------*/
#toc {--toc-width: 260px;position: fixed;top: 0;/* right: 0px; */right: calc(-1 * var(--toc-width));height: 100vh;width: var(--toc-width);display: flex;flex-wrap: nowrap;justify-content: center;align-items: stretch;z-index: 5;transition: 0.5s;-webkit-transition: 0.5s; /* Safari */
}
.tocwidth {right: 0px !important;
}.toc-left {flex: 1 0 auto;display: flex;align-items: center;margin-left: -25px;margin-right: -25px;z-index: 6;
}
.toc-left .toc-btn {display: flex;justify-content: center;align-items: center;width: 50px;height: 50px;border-radius: 50%;background-color: var(--bd-main);cursor: pointer;box-shadow: 0 0 5px 5px rgba(0, 0, 0, 0.15);
}.toc {display: flex;flex-wrap: nowrap;height: auto;width: 100%;flex-direction: column;justify-content: center;background-color: var(--bd-main);box-shadow: 0 0 5px 5px rgba(0, 0, 0, 0.15);
}.toc > span {background-color: var(--bd-main);/*自定义背景色*/display: flex;justify-content: left;flex-wrap: wrap;font-size: larger;font-weight: bolder;text-align: left;padding: 10px;margin-bottom: 2px;margin-left: 20px;
}.toc ol {list-style-type: none;margin-left: 20px;padding: 0;display: -webkit-flex;display: flex;flex-direction: column;flex-wrap: nowrap;
}.toc ol li {flex: 0 0 auto;width: 100%;padding-left: 0px;
}.toc ol ol {padding-left: 5px;
}.toc li li {padding-left: 5px;
}.toc ol li a {display: block;padding: 5px;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;
}.toc ol li a:hover {background-color: var(--bd-main);color: white;
}

三、在 function.php 中建立目录树实现函数


//生成目录树
function toc($content)
{$html = '';$dom =  new DOMDocument();libxml_use_internal_errors(true);$dom->loadHTML('<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><body>' . $content . '</body>');libxml_use_internal_errors(false);$xpath = new DOMXPath($dom);$objs = $xpath->query('//h1|//h2|//h3|//h4|//h5|//h6');if ($objs->length) {$arr = [];$html = '<div class="toc"><span>目录</span>';foreach ($objs as $n => $obj) {$obj->setAttribute('id', 'TOC' . $n);handleToc($obj, $n, $arr, $html);}foreach ($arr as $n)$html .= '</li></ol>';$html .= '</div>';$html = '<div id="toc"><div class="toc-left"><div class="toc-btn" type="button" οnclick="changetoc()">></div></div>' . $html .'</div>';}return $html;
}//处理目录树
function handleToc($obj, $n, &$arr, &$html)
{$i = str_replace('h', '', $obj->tagName);$j = end($arr);if ($i > $j) {$arr[] = $i;$html .= '<ol>';} else if ($i == $j)$html .= '</li>';else if (in_array($i, $arr)) {$html .= '</li></ol>';array_pop($arr);handleToc($obj, $n, $arr, $html);return;} else {$arr = [$i];$html .= '</li>';}$html .= '<li><a href="#TOC' . $n . '">' . $obj->textContent . '</a>';
}

四、在 post.php 中调用目录树函数

<!-- 输出文章目录 -->
<?php echo toc($this->content); ?>

五、大功告成,体验效果如下

在这里插入图片描述

这篇关于typecho 给文章创建目录树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750131

相关文章

Java 如何创建和使用ExecutorService

《Java如何创建和使用ExecutorService》ExecutorService是Java中用来管理和执行多线程任务的一种高级工具,可以有效地管理线程的生命周期和任务的执行过程,特别是在需要处... 目录一、什么是ExecutorService?二、ExecutorService的核心功能三、如何创建

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提