123、【Ubuntu】【Hugo】首页板块配置:list 模板(二)
本文分析了Hugo博客中RSS订阅和首页列表配置的技术细节。主要内容包括:1) RSS文件格式解析,重点说明<item>元素中的标题、链接、发布时间等关键字段;2) 博客页面的条件渲染逻辑,特别是标题锚点功能的实现方式;3) 首页文章列表的筛选机制,通过mainSections参数和hiddenInHomeList属性控制文章显示。文章基于公开技术文档,不涉及任何商业机密,为个人博客搭
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Ubuntu】【Hugo】首页板块配置:list 模板(RSS 订阅)
分析了 RSS 订阅的定义,以及 RSS 文件的格式内容,下面继续分析
搭建私人博客
上篇 blog 分析了 Hugo 生成的 RSS 文件格式内容

其中分析了 <channel> 元素的内容,下面继续看 <item> 里面的元素
<item>作为单篇文章和条目
| 元素 | 必须 | 说明 |
|---|---|---|
<title> |
是 | 文章标题 |
<link> |
是 | 文章完整 URL |
<pubDate> |
是 | 发布时间(格式严格) |
<guid> |
否 | 全局唯一 ID,用于判断是否为新文章,即使标题或链接变了也能识别到 |
<description> |
是 | 摘要 |
RSS 可以通过自动化工具很轻松地转发到邮件上,即使现在很多人用社交媒体,但 RSS 仍是创作者和重度读者的重要工具
OK,继续看下一部分

这里表示的是有条件地渲染页面内容,并决定是否为标题添加锚点链接
- 当检测到页面有内容
.Content时,就渲染一个<div class="post-content">的容器,避免在没有内容的页面输出空的<div>,这里.Content是 Hugo 变量,表示经过 Markdown 渲染后的 HTML 内容 - 这里会尝试从页面的 front matter 或站点配置
hugo.toml中读取disableAnchoredHeadings参数,如果没设置,或设为false,就默认使用锚点功能
锚点功能是现代博客常见的功能,比如把鼠标悬停在标题上时,会出现一个 # 符号,点击就能获取该标题的直达链接,比如渲染后的 HTML 像这样
<h2 id="what-is-rss">
什么是 RSS?
<a href="#what-is-rss" class="anchor">🔗</a>
</h2>
用户点击 🔗 后,浏览器地址栏会变成 yoursite.com/post/#what-is-rss,此时可以拷贝下来复制给别人,别人访问这个链接,页面就会自动滚动到该标题位置,这就大大地方便了长文分享和文档导航

这个功能在 single.html 里面也有(之前介绍过),这里 list.html 也照搬了

OK,接着分析

这里表示根据当前页面类型(是否首页),来准备要显示的文章列表,并进行分页处理,同时在首页顶部可选地显示个人信息卡片
首先是第一行,集合默认页面
{{- $pages := union .RegularPages .Sections }}
union A B:表示把两个列表 A 和 B 合并成一个,并去重.RegularPages:当前上下文中的普通页面内容.Sections:当前上下文中的子分区页面,比如/docs/目录下可能还有/docs/guide/,/docs/api/等
这行只在非首页的情况下生效,因为后面首页下会给 $page 另一种定义,比如在 /categories/tech/ 分类页,页面会列出该分类下的所有文章 + 子分类
接下来是首页内容,重新定义 $pages
{{- if .IsHome }}
{{- $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
{{- $pages = where $pages "Params.hiddenInHomeList" "!=" "true" }}
{{- end }}
如果发现当前是网站首页 /
site.RegularPages:表示全站所有普通文章(不包括分类页,标签页等)where ... "Type" "in" site.Params.mainSections:只保留那些内容类型在mainSections列表中的文章,这里的Type是文章的上一级文件目录名,而mainSections可以在hugo.toml中进行配置,比如
params:
mainSections: ["posts", "articles", "blog"]
这样 Hugo 就知道那些目录下的文章应该出现在首页
OK,接下来第二行继续对首页内容进行过滤
$pages = where $pages "Params.hiddenInHomeList" "!=" "true"
排除掉那些在 front matter 中设置了 hiddenInHomeList = true 的文章,比如某些文章开头写了
+++
title: "草稿:内部笔记"
hiddenInHomeList: true
+++
这篇文章就不会出现在首页列表中(但仍可以通过直接链接访问),最终 $pages 就是首页应该展示的文章列表(来自指定分区 + 未隐藏属性)
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Hugo】首页板块配置:list 模板(三)
更多推荐



所有评论(0)