首页 > 其他分享 >Typecho Joe 导航菜单目录以及搜索关键字回显主题优化版

Typecho Joe 导航菜单目录以及搜索关键字回显主题优化版

时间:2024-08-26 14:25:35浏览次数:6  
标签:__ 回显 aside item catalogue Typecho Joe contain joe

Joe 是 Typecho 博客中一款开源免费且非常精美的主题,但是这款主题很早就停止维护了,有些功能作者并没有开发,并且在 Typecho 更新到 1.2.1 版本后还出现了一个小 BUG

Joe 主题的知名度很高,所以在原作者停止维护后很多大佬发布过自己魔改的版本,不可否认魔改后的主题 BUG 基本解决,而且也新增了很多实用的功能,但是大佬都是基于自己的想法魔改的,我个人角色虽然魔改版修复了BUG加了新功能,但有些过于花里胡哨,所以我决定自己动手只做微调,保证 Joe 的原汁原味,本次主要调整了两点

1. 修复(或者说适配)了 Joe 主题在 Typecho 1.2.1 版本中搜索关键字不回显的问题
2. 在文章详情页侧边栏添加了导航目录模块,如果文章中包含 H1 H2 H3 等标题元素时会生成导航目录

该主题主要就这两点修改,其他地方基本没有改动,尽量保证 Joe 的原汁原味,我将该主题命名为 Joe 优化版,并在文章末尾给出下载地址,下载主题后可直接上传至服务器使用,不需要做任何其他操作

哪怕只有这两点您也觉得改动大,或介意使用第三方修改过的主题或其他原因也没关系,后面我会详细介绍修改步骤可自行修改

适配/修复搜索关键字回显

问题截图:

image

据猜测只有在使用 Typecho 1.2.1 以上版本才会出现这个问题,这并不是 BUG 只是主题并没有适配新版,看了一下源码后发现只是简单的取值问题而已,改几个字母就可以了,可以直接在服务器上改也可以在本地修改后上传至服务器

找到主题文件夹所在位置,编辑joe/archive.php文件,大概在25行左右可以看到他取值为_keywords,把这个值改成archiveTitle即可解决问题

image

侧边导航菜单目录

该功能并非我原创,大多数为借鉴他人的代码,自己做少量调整并整合进主题中,点此访问原作者

这个功能对我诱惑很大,去年因为这个功能我从 Typecho 转到 Halo(国产 Java 编写的网站构建工具),并且有大佬把 Joe 主题移植过去实现了导航目录,但当我真正使用 Halo 后发现生态不是很完善,性能不强且有很多细小的 BUG,兜兜转转又回到了 Typecho,并最终实现了导航目录的效果

添加侧边组件

首先编辑joe/public/aside.php文件,这个文件包含了所有侧边栏组件,在博主栏和人生倒计时中间插入下面这段代码

<?php if (($this->is('post') || $this->is('page')) : ?>
    <section class="joe_aside__item catalogue">
        <div class="joe_aside__item-title">
            <svg class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2084" width="18" height="18"><path d="M640 192H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h416c17.7 0 32 14.3 32 32s-14.3 32-32 32zM960 544H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h736c17.7 0 32 14.3 32 32s-14.3 32-32 32zM640 896H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h416c17.7 0 32 14.3 32 32s-14.3 32-32 32zM96 192H64c-17.7 0-32-14.3-32-32s14.3-32 32-32h32c17.7 0 32 14.3 32 32s-14.3 32-32 32zM96 544H64c-17.7 0-32-14.3-32-32s14.3-32 32-32h32c17.7 0 32 14.3 32 32s-14.3 32-32 32zM96 896H64c-17.7 0-32-14.3-32-32s14.3-32 32-32h32c17.7 0 32 14.3 32 32s-14.3 32-32 32z" p-id="2085"></path></svg>
            <span class="text">导航目录</span>
            <span class="line"></span>
        </div>
        <div class="joe_aside__item-contain">
            <ul class="catalogue-items">
            </ul>
        </div>
    </section>
<?php endif; ?>

刷新页面后可以看到,导航目录的雏形已经出现了

image

编写JS生成目录

接下来修改joe\assets\js\joe.post_page.min.js文件,在文件开头的第一个大括号后面添加下面这段代码

image

function get_catalogs(article_content) {
	let titles = [];
	let diffLevel = 0;
	let nodeNameSet = new Set();
	const titleTag = ["H1", "H2", "H3", "H4"];
	article_content.childNodes.forEach((e, index) => nodeNameSet.add(e.nodeName));
	for (let ttIndex in titleTag) {
		let item = titleTag[ttIndex];
		if (!nodeNameSet.has(item)) {
			diffLevel++
		} else {
			break
		}
	}
	article_content.childNodes.forEach((e, index) => {
		const id = "header-" + index;
		if (titleTag.includes(e.nodeName)) {
			titles.push({
				id: id,
				text: e.textContent,
				level: Number(e.nodeName.substring(1, 2) - diffLevel)
			});
			e.setAttribute("id", id)
		}
	});
	return titles
}
article_content = document.querySelector('.joe_detail__article');
if (article_content) {
	var catalog = get_catalogs(article_content);
	if (catalog.length == 0) {
		$('.catalogue').hide()
	} else {
		let asideArr = ['timelife', 'today', 'hot', 'newreply', 'weather', 'tags', 'flatterer'];
		asideArr.forEach(item => $('.joe_aside__item.' + item).remove());
		let catalogue = '';
		for (let i = 0; i < catalog.length; i++) {
			let node = '<li class="catalogue-item"><a href="javascript:;" id="to-' + catalog[i].id + '" to="' + catalog[i].id + '" title="' + catalog[i].text + '"><span class="dir_name">' + catalog[i].text + '</span></a>';
			if (i == catalog.length - 1) {
				catalogue += node + '</li>'
			} else {
				if (catalog[i + 1].level == catalog[i].level) {
					catalogue += node + '</li>'
				} else if (catalog[i + 1].level > catalog[i].level) {
					catalogue += (catalog[i + 1].level > 1) ? node + '<ul class="level-' + catalog[i + 1].level + '">' : node + '</li>'
				} else {
					if (catalog[i + 1].level - catalog[i].level == -2) {
						catalogue += i > 1 ? node + '</li></ul></li></ul></li>' : node + '</li></ul></li>'
					} else {
						catalogue += i > 1 ? node + '</li></ul></li>' : node + '</li>'
					}
				}
			}
		}
		document.querySelector('.catalogue-items').innerHTML = catalogue;
		$('.catalogue-item > a').on('mouseenter', function() {
			$(this).parent().addClass('_active')
		});
		$('.catalogue-item > a').on('mouseleave', function() {
			$(this).parent().removeClass('_active')
		});
		$('.catalogue-item > a').on('click', function() {
			document.removeEventListener("scroll", autoActive);
			$('.catalogue-item').removeClass('active');
			$(this).parent().addClass('active');
			let aim = document.querySelector('#' + $(this).attr('to'));
			let aim_top = aim.offsetTop;
			let aim_h = aim.clientHeight;
			let above_h = document.querySelector('.joe_header__above').clientHeight;
			let below_h = document.querySelector('.joe_header__below').clientHeight;
			let offset = 0;
			let case1 = !document.querySelector('.joe_header__above').className.includes('active');
			let case2 = document.getElementsByTagName("html")[0].scrollTop + above_h > aim_top;
			if (case1 && case2) {
				offset = above_h
			}
			window.scrollTo({
				top: aim_top - offset - below_h - 10,
				behavior: 'smooth'
			});
			setTimeout(() => {
				document.addEventListener("scroll", autoActive)
			}, 500)
		});
		if (catalog.length) $('.catalogue-item').eq(0).addClass('active');
		let autoActive = function() {
			let html_top = document.getElementsByTagName("html")[0].scrollTop;
			let contain = $(".joe_aside__item.catalogue .joe_aside__item-contain");
			for (let i = 0; i < catalog.length; i++) {
				let offset = 0;
				let h_id = '#' + catalog[i].id;
				let h_offset = document.querySelector(h_id).offsetTop;
				let above_h = document.querySelector('.joe_header__above').clientHeight;
				let below_h = document.querySelector('.joe_header__below').clientHeight;
				if (!document.querySelector('.joe_header').className.includes('active')) offset = above_h;
				if (h_offset + below_h + offset + 10 >= html_top) {
					$('.catalogue-item').removeClass('active');
					if (i > 0 && i < catalog.length - 1 && document.querySelector('#' + catalog[i].id).offsetTop > html_top + window.innerHeight * 0.2) {
						i--
					}
					$('#to-' + catalog[i].id).parent().addClass('active');
					break
				}
			}
		};
		document.addEventListener("scroll", autoActive)
	}
} else {
	$('.catalogue').hide()
}

刷新页面后可以看到,目录的基本结构已经出来了,为了其他组件不遮挡目录的显示,在有目录的页面其他侧边组件会被移除

image

编写CSS美化目录

后面就是样式问题了,接下来修改joe\assets\css\joe.post.min.css在文件末尾添加下面这段CSS

.joe_aside__item.catalogue{margin-bottom:15px;transition:top 0.35s;background:var(--background)}
.joe_aside__item.catalogue .joe_aside__item-contain{padding:0;margin:0;margin-left:10px;max-height:500px;overflow-y:auto}
.joe_aside__item.catalogue .joe_aside__item-contain::-webkit-scrollbar{width:3px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items{border-left:2px solid var(--classC);padding:10px 15px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item{margin:0;padding:0;line-height:26px;font-size:15px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item a{position:relative;display:block;line-height:26px;color:var(--main);transition:color 0.5s}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item a:hover{color:var(--theme)}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item._active>a,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item.active>a{color:var(--theme)}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item.active>a::before{content:"";position:absolute;left:-17px;top:0;width:2px;height:26px;background-color:var(--theme);transition:height 0.35s}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2>.catalogue-item,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item{font-size:14px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item.active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item.active>a::before{left:-34px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item .level-3 .catalogue-item,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item .level-3 .catalogue-item{font-size:14px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item .level-3 .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-2 .catalogue-item .level-3 .catalogue-item.active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item .level-3 .catalogue-item._active>a::before,.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3 .catalogue-item .level-3 .catalogue-item.active>a::before{left:-51px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item .level-3>.catalogue-item{font-size:14px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item ul{padding-left:17px}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items ul{display:block;list-style-type:disc}
.joe_aside__item.catalogue .joe_aside__item-contain .catalogue-items .catalogue-item a span.dir_name{display:block;width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}

回过头来刷新页面,发现样式已经修改完成,原作者很给力CSS样式十分契合主题的风格

image

资源下载

请允许我夹带私货,自己的博客SEO太差根本没有收录,如果想下载主题请前往我的个人博客滑倒最下面下载

标签:__,回显,aside,item,catalogue,Typecho,Joe,contain,joe
From: https://www.cnblogs.com/hanzhe/p/18380975

相关文章

  • 【网络】UDP回显服务器和客户端的构造,以及连接流程
    回显服务器(EchoServer)最简单的客户端服务器程序,不涉及到业务流程,只是对与API的用法做演示客户端发送什么样的请求,服务器就返回什么样的响应,没有任何业务逻辑,没有进行任何计算或者处理0.构造方法网络编程必须要使用网卡,就需要用到Socket对象创建一个DatagramS......
  • 【第59课】XML&XXE安全&无回显方案&OOB盲注&DTD外部实体&黑白盒挖掘
    知识点:1、XXE&XML-原理-用途&外实体&安全2、XXE&XML-黑盒-格式类型&数据类型3、XXE&XML-白盒-函数审计&回显方案详细点:XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传......
  • vue3 el-table回显选中的数据
    html部分:<el-tableref="multipleTableRef":data="matchLists"stripestyle="width:100%;"@selection-change="handleSelectionChange"row-key="source_id"empty-text="暂无数据"><el-table-col......
  • vue 多时间段范围选择及回显 组件封装
     <template><divclass="flex-col"><ul><liv-for="(item,index)inclassActiveList":key="index"><!--@click="toggleSelection(item.id)"-->......
  • 【1.0版】【MYSQL安全】SQL注入:DNSlog外带盲注回显
    主题SQL注入:DNSlog外带盲注回显利用条件DBMS中需要有可用的,能直接或间接引发DNS解析过程的子程序,即使用到UNCLinux没有UNC路径,所以当处于Linux系统时,不能使用该方式获取数据有个重要条件:load_file()函数可以使用。也就是说需要配置文件my.ini中secure_file_priv=UNCU......
  • typecho全站静态化方案
    实现利用wget全站保存为html,然后再修改文件中的链接步骤把以下代码保存为html.php<?php$url='https://blog.asbid.cn';//网址,不能以"/"结尾$rurl='';//要替换成路径或网址,可为空,不能以"/"结尾$dir=__DIR__."/".str_replace('https://','&......
  • Typecho在Ubuntu 22.04上的安装部署
    安装Nginx并配置访问安装PHP并输出脚本结果配置typechoNginx安装并验证aptinstallnginxsystemctlstartnginx正常情况应该可以看到Nginx的欢迎页面了,如果看不到就是防火墙的问题,设置下防火墙放通即可。安装PHP并使用Nginx代理aptinstallphp-fpmphp-curlphp-gd......
  • Typecho页面浏览次数统计插件已修正适配Typecho 1.2
    沧海桑田,时隔多年Typecho终于迎来了重大更新(竟然在有生之年更新了(狗头保命))。Typecho刚发布的时候还是PHP5流行的时代,本身升级了更高语言版本,带来了更好的程序执行效率,提高了编程效率,但升级后存在发现“页面浏览次数统计插件”插件不能使用了。问题回顾我一直用的是作者(H......
  • typecho仿某度响应式主题Xaink
    新闻类型博客主题,简洁好看,适合资讯类、快讯类、新闻类博客建站,响应式设计,支持明亮和黑暗模式直接下载zip源码->解压后移动到Typecho主题目录->改名为xaink->启用。演示图: 下载链接: typecho仿某度响应式主题Xaink红客社区:客户端下载-红客网络编程与渗透技术......
  • el-select选项自定义日期选择器选项,选中自定义日期,回显具体的日期时间
    需求:指标时点选择具体的时间,即自定义日期选项时,可操作选择具体日期。若选择自定义日期,应回显具体日期,如“2024-07-25”效果图如下:  代码如下:因为此处v-for生成的面板,每个面板都有一个指标时点选项,所以每个指标时点的select对应的ref需要唯一,此处通过遍历的下标i加以区分。......