timeline 时间线

支持静态和动态时间线数据源:

  • 静态数据
  • 默认 timeline:GitHub/Gitea Issues 或 Releases 兼容数据
  • weibo:WeiboSpider 输出
  • memos:主题已适配的 Memos 响应
  • rss:RSS 2.0、Atom、RSS 1.0 或 JSON Feed
  • twikoowalineartalkgiscus:对应评论服务的最新评论
动态语法
{% timeline [type:timeline/weibo/memos/rss/twikoo/waline/artalk/giscus] api:url [limit:number] [hide:user,title,footer] %}{% endtimeline %}

api 是动态数据的必填项。其它参数会作为属性传给选中的适配器,只有该适配器读取的参数才生效。未填 api 时仅渲染静态节点;请求失败时保留已有静态内容或空状态。

常见的使用场景请看这篇文章:

静态时间线

静态数据写在 Markdown 源文件中,生成站点时一并输出。

2021 年 2 月 16 日

主要部分功能已经开发的差不多了。

2021 年 2 月 11 日

今天除夕,也是生日,一个人在外地过年+过生日,熬夜开发新主题,尽量在假期结束前放出公测版。

写法如下
{% timeline %}
<!-- node 2021 年 2 月 16 日 -->
主要部分功能已经开发的差不多了。
{% image https://res.xaox.cc/gh/cdn-x/wiki@main/stellar/photos/hello@1x.png width:300px ratio:1179/390 %}
<!-- node 2021 年 2 月 11 日 -->
今天除夕,也是生日,一个人在外地过年+过生日,熬夜开发新主题,尽量在假期结束前放出公测版。
{% endtimeline %}

动态时间线

动态数据是从 GitHub Issues 中拉取的,使用方法为:

  1. 建一个仓库
  2. 创建一个 issue 并添加一个 label 进行测试
  3. timeline 标签时加上 api:https://api.github.com/repos/your-name/your-repo/issues

例如:

_posts/xxx.md
{% timeline api:https://api.github.com/repos/xaoxuu/blog-timeline/issues?direction=asc&per_page=3 %}{% endtimeline %}

效果如下:

  1. fork shaoyaoqian/WeiboSpider 的爬虫,修改自己的仓库名
  2. 修改 .github/workflows/main.yml 中的微博ID为你想爬取的ID,修改完后每天会自动爬取你的微博,存储为 json 文件,输出文件在 output 分支
_posts/xxx.md
{% timeline limit:20 type:weibo api:你的json文件地址 %}{% endtimeline %}

这个功能在 1.34.0 版本后开始支持:

动态数据也可以直接拉取 RSS / Atom / JSON Feed 订阅源,适合配合 RSSHub 聚合各类平台动态(如 B 站、微博等):

_posts/xxx.md
{% timeline type:rss api:https://rsshub.app/bilibili/user/dynamic/你的uid %}{% endtimeline %}

可选参数:

  • limit:显示条数,默认 10
  • content_type:显示内容或摘要,content(默认)或 summary
  • show_title:是否显示标题,默认 true
  • show_content:是否显示内容,默认 true

例如只显示标题、限制 5 条:

_posts/xxx.md
{% timeline type:rss api:https://rsshub.app/bilibili/user/dynamic/你的uid limit:5 show_content:false %}{% endtimeline %}

静态 + 动态

用法同静态和动态单独使用时一样,例如:

{% timeline reversed:true api:https://raw.github.xaox.cc/xaoxuu/ghapi-json-generator/refs/heads/output/v2/repos/xaoxuu/blog-timeline/issues%3Fper_page%3D5/data.json %}
<!-- node 这条内容为静态数据 -->
这条内容为静态数据,静态数据在 `deploy` 时就已经确定了。
{% endtimeline %}

数据筛选

只显示某个人的数据

筛选最近3条todo

筛选评论最多的3条建议

上述示例代码如下:

{% folders %}
<!-- 只显示某个人的数据 -->
{% timeline user:xaoxuu api:https://api.github.xaox.cc/repos/volantis-x/hexo-theme-volantis/issues %}{% endtimeline %}
<!-- 筛选最近3条todo -->
{% timeline api:https://api.github.xaox.cc/repos/xaoxuu/hexo-theme-stellar/issues?labels=todo&per_page=3 %}{% endtimeline %}
<!-- 筛选评论最多的3条建议 -->
{% timeline api:https://api.github.xaox.cc/repos/volantis-x/hexo-theme-volantis/issues?labels=feature-request&per_page=3&sort=comments %}{% endtimeline %}
{% endfolders %}

更多用法详见:

friends 友链

语法格式
{% friends [group] [repo:owner/repo] [api:url] [posts:true/false] %}

group 读取 source/_data/links/<group>.ymlapi 优先于 repo;仅填 repo 时,主题通过 services.github.raw_url 请求 <owner/repo>/output/v2/data.jsonposts:true 选用友链与文章聚合适配器,只适用于动态数据。未提供 group、repo 或 api 时输出空容器。

您可以在任何位置插入友链组,支持静态数据和动态数据,静态数据需要写在数据文件中:

blog/source/_data/links/ios_developer.yml
- title: 某某某
url: https://
cover:
icon:
description:

在需要的位置这样写:

{% friends ios_developer %}

实现动态友链

xaoxuu/friends 为模板创建仓库,或 fork 该仓库,并启用 GitHub Actions。

按仓库中的 Issue 模板填写友链信息并提交,在 Actions 页面查看运行结果。工作流成功后,output 分支会生成数据文件;确认包含刚提交的友链信息后,即可在页面中引用:

{% friends api:https://raw.github.com/xaoxuu/friends/output/v2/data.json %}

相关工作流项目包括:

  • issues2json:自动获取issue中第一段json保存为文件,支持多种排序和过滤
  • links-checker:自动检查issue中填写的链接是否有效,可用于动态友链、示例博客
  • feed-posts-parser:友链文章订阅

各工作流的配置方法见对应项目的 README

友链+友链文章聚合显示

写法比普通友链多了个 posts:true,要求必须是动态友链:

{% friends posts:true api:https://raw.github.com/volantis-x/friends-example/output/v2/data.json %}

旧的动态友链仓库怎么升级?

详见这篇文章:《感谢 AI,动态友链获重磅升级!》

数据托管与加速

支持把数据托管到任何其他地方来使用,例如:

{% friends api:https://raw.github.xaox.cc/xaoxuu/friends/output/v2/data.json %}

数据也可以通过 CDN 或反向代理访问,或用 GitHub Actions 同步到对象存储。更换托管地址后,将标签中的数据链接改为新地址。

sites 网站卡片

语法格式
{% sites [group] [repo:owner/repo] [api:url] %}

group、repo、api 的选择顺序与 friends 相同,api 优先于 repo。未提供数据源时输出空容器。

您可以在任何位置插入网站卡片组,支持静态数据和动态数据,静态数据需要写在数据文件中:

blog/source/_data/links/分组名.yml
- title: 标题
url: https://
cover:
icon:
description:

在需要的位置这样写:

{% sites 分组名 %}

条目未配置 iconavatar 时,网站卡片会复用 services.site_info 选中的 provider 自动补充信息区的圆形图标。主题默认选择 site_info_api 并使用 xaox.cc 公共实例;站点可覆盖 services.site_info.site_info_api.endpoint 为自部署地址,或设置 provider: null 关闭。请求失败时保留主题兜底图标且不显示错误;该接口不会自动获取网站截图。

Stellar v1.13.0

原 friends 和 sites 标签数据合并至 links/xxx.yml 文件,动态数据使用方法同友链,数据源格式相同,与友链共享数据,仅样式不同,也可以用 sites 标签做友链。

albums 专辑

语法格式
{% albums [group] [repo:owner/repo] [api:url] [size:s/m/l/xl/mix] %}

size 默认 s。api 优先于 repo;动态数据使用正方形封面,静态数据读取 links 分组。未提供数据源时输出空容器。

配置数据源:

blog/source/_data/links/分组名.yml
- title: 标题
url: https://
cover:
icon:
description:

文章中插入方式:

blog/source/_posts/xxx.md
{% albums 分组名 %}

posters 海报

语法格式
{% posters [group] [repo:owner/repo] [api:url] [size:xs/s/m/l/xl/mix] %}

size 默认 xs。api 优先于 repo;静态数据使用竖向封面。未提供数据源时输出空容器。

配置数据源:

blog/source/_data/links/分组名.yml
- title: 标题
url: https://
cover:
icon:
description:

文章中插入方式:

blog/source/_posts/xxx.md
{% posters 分组名 %}

md 渲染外部 markdown 文件

{% folding %}
{% md https://gcore.jsdelivr.net/gh/xaoxuu/hexo-theme-stellar/README.md %}
{% endfolding %}

wrap 参数默认为 true:渲染结果保留在 .data-service.ds-mdrender 容器内;传 wrap:false 时渲染后不留外部容器,内容直接融入正文:

{% md https://raw.githubusercontent.com/xaoxuu/hexo-theme-stellar/main/README.md wrap:false %}

效果如下

说明:当 src 是 GitHub raw 地址(raw.githubusercontent.com)时,会使用 services.github.raw_url 的镜像站,README 内的相对图片/链接也会解析到同一镜像基址。

ghcard 卡片

写法如下
{% ghcard xaoxuu %}
{% ghcard xaoxuu/hexo-theme-stellar theme:dark %}

默认选择 github_readme_stats provider;需要使用自部署实例时,设置 services.github_card.github_readme_stats.endpoint

blog/_config.stellar.yml
services:
github_card:
provider: github_readme_stats
github_readme_stats:
endpoint: https://github-readme-stats.vercel.app

gist 代码片段

gist 标签通过 services.github.gist_url 构造脚本地址:

{% gist owner/id %}
{% gist owner/id file:example.js %}

toc 文档目录树

{% toc wiki:xxx [open:true] [display:mobile] title %}

站内搜索

没有找到内容!