pyssgA tiny-kernel, plugin-driven static site generator

Kernel

Kernel được thiết kế nhỏ một cách có chủ ý và không có bất kỳ phụ thuộc bên thứ ba nào - nó thuần thư viện chuẩn. Mọi thứ trong đó đều rơi vào một trong số ít module sau.

ModuleTrách nhiệm
hooks.pySyncHook, SyncBailHook, SyncWaterfallHook.
builder.pyBuilder (bộ điều phối vòng đời) và BuilderHooks.
build.pyBuild, trạng thái của một lần chạy.
models.pySourceOutput, các túi dữ liệu trung tính.
plugin.pyProtocol Plugin.
config.pyConfig và việc nạp pyssg.config.py.
cli.pyĐiểm vào pyssg build.

Không phụ thuộc theo thiết kế

Quy tắc rất đơn giản: kernel chỉ dùng thư viện chuẩn; plugin được dùng bất cứ thứ gì chúng cần. Điều này hóa giải mâu thuẫn giữa "giữ phụ thuộc tối thiểu" và "chúng ta cần một bộ phân tích Markdown thực thụ". Kernel luôn sạch sẽ, trong khi một plugin như Markdown thoải mái phụ thuộc vào python-markdown, được import lười (lazy) nên chi phí chỉ phải trả khi plugin thực sự được dùng.

Protocol plugin

Một plugin là bất kỳ đối tượng nào có phương thức apply:

class Plugin(Protocol):
    def apply(self, builder: Builder) -> None: ...

Bên trong apply, plugin tap vào những hook nó quan tâm. Đó là toàn bộ hợp đồng giữa kernel và các phần mở rộng của nó.

Builder

Builder được tạo từ một Config. Khi khởi tạo, nó áp dụng mọi plugin (gọi apply), rồi phát hook initialize. Gọi run() sẽ thực thi trọn một vòng đời và trả về Build thu được.

Vì builder là một đối tượng sống lâu, nó là nơi tự nhiên cho một chế độ watch trong tương lai - rebuild khi file thay đổi - mà không phải sửa bất kỳ plugin nào.