惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
小众软件
小众软件
I
InfoQ
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Martin Fowler
Martin Fowler
月光博客
月光博客
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
V
Visual Studio Blog
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research

热爱生活与梦想

迁移LeanCloud的Waline评论数据到TiDB/Neon 25年江浙地区暑假自驾游之感慨 使用阿里云灵码继续完成构建 SSL 证书管理器 亲手给儿子做的棒棒糖摩天轮六一礼物 使用腾讯云 CodeBuddy 构建 SSL 证书管理器 修复代码块默认高度相关缺陷 HugoNexT4.7.2 新功能和升级提示 支持Github风格的警告样式 新增音乐短代码功能支持 给文章添加摘要和过期提示功能 回顾24年的过去总结 修复Mathjax行内显示公式的问题 给Hugo文章增加阅读更多跳转的锚点定位功能 Win10隐匿的VPN设置和L2TP连接常见错误 Go语言中“糟糕”的日期时间格式化设计 DaoCloud道客提供的免费Docker镜像代理服务 感谢万能淘宝让自己吃到喜欢的美食 WSL运行时遇到未知异常错误无法使用 隐藏的换行符导致Base64加密解密失败 MySQL自带客户端直接免密登录操作 Linux系统中删除目录软链接的注意项 Java程序调用外网API时CA问题 如何不关机重启WSL2恢复虚拟服务 在Windows上安装Podman容器平台做虚拟化 记一次无法弹出移动硬盘的记录 为友情链接添加自动检测脚本 重新激活Github的2FA认证 Linux中使用tar压缩命令排除文件 继续小米手环的健康生活之旅 一次意外的“坠机”引发了我对手机保护壳的深思
改善代码块折叠和选中功能
凡梦星尘 · 2025-01-19 · via 热爱生活与梦想

对于技术类的分享文章而言,或多或少会需要使用到代码块的功能,Hugo NexT主题中默认也是支持代码块的展示,只不过无法支持代码块进行折叠和展开的操作,且在代码选中时的样式与背景也不太容易区分,同时也还发现其他的一些小问题,那么此刻便是把它们全都整合到一起进行优化。最后几乎都可以说是完全的重构,想了解的具体其原由请看下文。

本以为只是需要给代码块增加个点击事件监听,然后进行相应的展开或折叠操作,但发现定位这个代码块的元素有些问题,原因是受限于之前实现代码块渲染功能时,使用的是内嵌入的样式来支持的,而Hugo生成的代码又是比较的混乱,导致在不同的使用场景下代码块的生成元素有差异,无法发现其中的规律来进行定位。

通过不断的测试验证,只好是放弃原来内嵌的模式,使用扩展方式(即 生成代码高亮的CSS样式 )进行对代码块的实现代码进行全部重写。从CSS样式的调整,到JavaScript动作的支持,虽然过程有些的痛苦,但是成效还是很比较明显的,代码也变得更加优雅起来,比如下面这段实现增加代码块头部的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
let chromaDiv = document.querySelectorAll('div.highlight div.chroma');
if (chromaDiv.length === 0) return;

chromaDiv.forEach(element => {
  
  ......

  // Add code header show
  var ch = document.createElement('div');
  ch.classList.add('code-header');
  ch.classList.add(lang);
  ch.insertAdjacentHTML('afterbegin', 
    '<span class="code-lang"></span><span class="collapse-btn"></span>');
  ch.addEventListener('click', function () {       
    element.classList.toggle('hidden-code');       
    ch.querySelector('.collapse-btn').classList.toggle('collapse');
  }, false);

  element.parentNode.insertBefore(ch, element);
});

信息

至于代码选中的区分,只需要是调整来原来css中::selection和文字的颜色即可。

另外为了更好的兼容在不同浏览器进行代码拷贝,新引入了 clipboard.js 库重写代码拷贝的功能。原以为引入这个库后也可以同步解决拷贝代码时末尾出现换行的🐛,只是最后发现还是得靠自己来解决才行。这里使用的是将Dom元素中的textContent变量来代替默认的innerText,同时增加去除空格的处理。

警告

发现了很多网站的代码复制都会在末尾出现换行,这个还是有一定的风险的,特别是对于在系统终端下执行命令,万一复制的代码是有缺陷的话,而这个换行又会让复制的代码直接运行,很有可能会带来不可预知的风险,大家还是要对代码复制引起重视的。

对于用户来说这部分代码块的优化是透明无感的,使用时只需把原来全局配置中的highlight参数设置调整为如下的配置即可:

1
2
3
4
5
6
7
8
highlight:
  anchorLineNos: true
  codeFences: true
  guessSyntax: true
  # 切记这三项是一定要配置的
  lineNos: true
  lineNumbersInTable: true
  noClasses: false

嗯嗯,现在就点击下上面的代码块头部和内容拷贝,切身体验下优化的效果吧。😄