1个不稳定版本

0.0.1 2024年1月25日

#78 in #博客

MPL-2.0 许可证

51KB
1K SLoC

polysite

高度可定制、多态的静态网站生成器库,polysite。

polysite受Haskell编写的Hakyll的启发。

与其他静态网站生成器的区别

我知道一些著名的静态网站生成器,比如 Zola。但Zola对我来说定制性不够。

polysite旨在支持创建您自己的静态网站生成器。

许可证

采用Mozilla公共许可证2.0。


lib.rs:

高度可定制、多态的静态网站生成器库,polysite。

此crate受Haskell编写的Hakyll的启发。

与其他静态网站生成器的区别

我知道Zola,这是用Rust编写的静态网站生成器。但Zola对我来说定制性不够。所以我创建了此crate。

如何使用

如果您只想简单地构建Markdown编写的网站,请使用compiler::markdown::MarkdownCompiler。示例在examples/simple_markdown.rs中。

如何创建编译器

如果您想创建新的编译器,为您的编译器类型实现Compiler特质。用于编译源文件的Compiler::compile方法。

提供compile!宏,以简化创建boxed Future的过程。

如果您想管道一些编译器,请使用pipe!宏。

如果您想使用闭包创建小型编译器,请使用compiler::utils::GenericCompiler

元数据

polysite使用元数据来保存编译结果,并且元数据可以用于其他编译。

存在一些默认元数据

  • _rule:编译规则名称
  • _version:编译文件版本
  • _source:源文件路径
  • _target:目标文件路径
  • _path:绝对URL路径
  • _body:内容主体。一些编译器将结果保存到此元数据中。

您可以使用这些默认元数据来创建新的编译器。

示例

实际示例在此。其他示例在仓库中。

use polysite::{
    compiler::{
        file::CopyCompiler, markdown::MarkdownCompiler, metadata::SetMetadata,
        template::TemplateEngine,
    },
    *,
};

#[tokio::main]
async fn main() {
    simple_logger::SimpleLogger::new().env().init().unwrap();
    let template_engine = TemplateEngine::new("templates/**").unwrap().get();
    Builder::new(Config::default())
        .add_step(
            [Rule::new("metadata").set_create(["metadata"]).set_compiler(
                SetMetadata::new()
                    .global("site_title", "Hello, polysite!")
                    .unwrap()
                    .global("site_url", "https://example.com")
                    .unwrap()
                    .get(),
            )],
        )
        .add_step([Rule::new("posts")
            .set_globs(["posts/**/*.md"])
            .set_compiler(
                MarkdownCompiler::new(template_engine.clone(), "practical.html", None)
                    .wait_snapshot("posts", 1)
                    .get(),
            )])
        .add_step([
            Rule::new("markdown").set_globs(["**/*.md"]).set_compiler(
                MarkdownCompiler::new(template_engine.clone(), "practical.html", None).get(),
            ),
            Rule::new("others")
                .set_globs(["**/*"])
                .set_compiler(CopyCompiler::new().get()),
        ])
        .build()
        .await
        .unwrap();
}

依赖项

~12–22MB
~313K SLoC