最新发布页的实现

zola 除了规范了站点项目的本地目录,同时还规范了页面模板的目录。所以,整个项目的结构非常整洁,写作者只需要关注 content 内容目录即可。

├── config.toml
├── content
├── sass
├── static
├── templates
└── themes

路径页

整个静态站除了 [/, /tags/{name}, /catagories/{name}] 几个基础访问路径外,其它路径均通过 content 目录中的内容页所在路径进行生成。

所以,增加一个自定义页,对于自定义路径,如 /latest 路径, 首先要做的就是在内容页增加一个对应的 markdown 文件。同时,设置自定义的页面模板即可。

content 目录下,增加文件 content/latest/index.md :

+++
title = "最新发布"
template = "latest.html"
+++

themes/[name]/templates 目录下,增加模板文件 themes/[name]/templates/latest.html. 这样就可以开始自定义路径页的实现。

数据源

在实现 /latest 自定义路径页,关键是获取最新文章发布列表。如果 content 目录只有一级目录,不存在子目录的化,获取最新文章列表的数据非常简单。但是,常规情况下,文章肯定是需要分文件夹进出归类,这样就出现一个问题:

官方只提供按 section 取接一级目录下的文章的列表

为了得到所有文章的列表数据,唯一可以获取的办法就是 atom.xml 文件。 而该文件是在发布阶段生成的。所以,就需要写一个简单前端脚本来读取 atom.xml 文件中的文章列表,再渲染成列表页。

渲染脚本

进入 themes/[name] 主题目录,开始编写渲染脚本。

首先,初始化项目,因为需要用到 @hendt/xml2json 依赖库,创建一个简单的前端项目,并通过 webpack 打包发布。

$: yarn init -y

创建 themes/[name]/src/latest.js 脚本,并通过 webpack 打包到 themes/[name]/static/js 目录,在页面模板中调用该发布脚本即可。

如果不会使用 webpack 打包, 请参考:快速简明教程: webpack

最简单的 webpack 配置:

const path = require('path');

module.exports = {
    entry: {
        latest: path.resolve(__dirname, "./src/latest.js"),
    },
    output: {
        path: path.resolve(__dirname, "./static/js"),
        filename: "[name].js",
    }
}

本站渲染脚本 themes/[name]/src/latest.js 如下:

import xml2json from '@hendt/xml2json';

const root = document.getElementById("root");
if (root) {
    fetch('/atom.xml')
        .then(response => response.text())
        .then(str => xml2json(str))
        .then(data => {
            for (let item of data.feed.entry) {
                const dt = new Date(item.published);
                const ds = dt.toISOString().substring(0, 10);
                const el = document.createElement('div');
                const itemHTML = `<h4>
                <a href="${item.link.href}">${item.title}</a>
                <time style="float: right;" datetime="${ds}" class="date" itemprop="datePublished">
                ${ds}
                </time>
                </h4>
                <p>${item.summary}</p>
                <p>... <a style="float: right;" href="${item.link.href}">阅读全文</a></p>`;                
                el.innerHTML = itemHTML;
                root.appendChild(el);
            }
        });    
}

具体效果,请访问: 最新发布.

通用脚本

渲染脚本很简单,也满足本站的页面需求。虽然是个性化需求,但如果想分享成果仅仅将以上开发思路记录成文,还差一点。对于其他用户而言,如果想使用这块代码。如果不想重头开始的化,可以

None None

评论