5个不稳定版本
0.3.0 | 2019年9月13日 |
---|---|
0.2.1 | 2018年3月25日 |
0.2.0 | 2016年12月29日 |
0.1.1 | 2016年4月16日 |
0.1.0 | 2015年11月14日 |
#23 in #static-website
在2个crate中使用(通过gazetta)
75KB
1.5K SLoC
Gazetta是用Rust编写的静态站点生成器。它有四个部分
- Horrorshow,基于Rust宏的HTML生成器。
- 框架。这个库集包含大部分逻辑,负责从您的网站数据文件生成模型和视图。
- 渲染器。这是实际渲染HTML的逻辑所在。如果您需要精细控制网站HTML,应在此仓库上进行分支。然而,在99%的情况下,您应该能够足够地自定义网站,而无需修改此项目。
- 您的网站数据。这包括您的网站内容和资产(样式表/JavaScript)。您可以在这里找到我的,以及一个用于启动的简单示例网站这里。
平台
我仅在64位Linux上测试了Gazetta,但它应该适用于所有*nix平台。然而,它可能不会在Windows上工作(我假设路径中的正斜杠)。欢迎提交补丁!
快速入门
- 下载并编译gazetta-bin (
cargo build --release
)。除非您想承受15倍-30倍的性能损失,否则请以发布模式进行构建。 - 分支并克隆gazetta-bootstrap。
- 编辑配置、主页和主题以符合您的喜好。
- 创建一些新页面,手动创建或使用gazetta二进制文件。例如:使用
gazetta new blog "Hello World"
将创建一个“Hello World”博客文章。 - 运行
gazetta render /path/to/output
(在仓库中的任何位置)以渲染您的网站。
数据目录布局和文件格式
那是您的网站数据。
配置
gazetta.yaml
这是网站的核心理念配置。它可以在渲染网站上的任何页面时指定共享变量。它必须指定
- 标题:网站的标题。
- 基础:网站的根URL。
如果您使用的是默认渲染器(gazetta-bin),则还必须指定一个 author
(参见“人员”部分)格式
还可以指定一组导航链接
nav:
# If relative, href is relative to the site base.
- title: href
资产
/
└── assets/
├── javascript/
│ ├── 0-example1.js
│ └── 1-example2.js
├── stylesheets/
│ ├── 0-example1.css
│ └── 1-example2.css
└── icon.png
所有文件都是可选的。
icon.png
:网站的图标。javascript
:网站的javascript文件。在构建过程中将按字典顺序合并。stylesheets
:网站的样式表。在构建过程中将按字典顺序合并。
assets
中的所有其他文件都将被忽略。
条目
一个条目由以下内容组成
- 一个必填的索引文件(
index.txt
、index.html
或index.md
)。 - 一个包含静态文件的
static
目录(可选)。 - 任意数量的子条目。
所有索引文件 必须 有一个yaml头部。此头部必须包括一个title
以及您指定的渲染器所需的所有其他内容。默认情况下,此头部还可以包括
- 日期:格式为
YYYY-MM-DD
的日期。 - 索引:这表示当前页面是一个索引。如果指定,所有子项都将作为子页面附加到页面。有关更多信息,请参阅索引。
- cc:将此页面链接到指定的索引页面,就像它是一个子页面一样。这对于使页面出现在多个标签/类别中很有用。
如果您使用的是默认渲染器,则头部还可以包括
- 作者:页面的作者。
- 关于:此字段表示此页面是关于某人的。提供的人员信息将在页面的顶部呈现。
静态目录内的目录和文件将原样复制到输出目录。这是一个放置每个页面静态媒体的好地方。
索引
索引字段可以是布尔值,也可以是具有以下可选字段的表
# The sort direction and field: [+-](date|title)
sort: date
# How many entries to list per page or false to not paginate.
paginate: false
# The directories to include in the index (in addition to explicitly CCed
# entries).
directories: .
# The maximum number of entries to include in the index or false to include all
# entries.
max: false
人员
在指定人员时,您可以只写下他们的名字,或者使用以下表格
name: My Name # Mandatory
email: email
photo: photo
key: pgp_key_url
nicknames:
- first nick
- second nick
also: # A list of profiles around the web.
- "GitHub": github_url # example
- "reddit": reddit_profile_url # example
代码质量
我对整体架构感到满意,但一些代码可能需要一点关爱(主要的渲染函数尤其糟糕)。再次欢迎补丁。
性能
Gazetta非常快;这就是为什么我不费心显示进度。然而,仍有改进的空间
- Gazetta进行了大量的系统调用(文件I/O)。我们可能可以显著减少这一点。在我的机器上,运行时间的一半以上是系统时间。
- yaml-rust很慢(据callgrind)。我已经考虑过toml,但转换会很痛苦。
- 索引构建算法是
Θ(num_indices*num_entries)
。然而,这可以降低到Θ(num_entries)
,但num_indices
通常相当低,因此只有在我们可以保持新算法运行时间中的常量乘数低的情况下,这才有意义。 - 我们是否真的关心?我的网站(约75页)在我的笔记本电脑上构建只需50毫秒。
依赖关系
~3MB
~73K SLoC