paper/paper
用 React PHP 编写的开发者友好型站点生成器
Requires
- paphper/core: 0.0.8
README
Paphper 是基于 ReactPHP 构建的静态站点生成器。
安装
composer create-project paphper/paper
Docker 支持
您也可以在 Docker 上使用 paper,以下是一些额外的步骤 -
docker-compose up -ddocker exec -i paper php run dev- 开始构建出色的模板
开发
php paper dev
这将在一个 https://:8888 的开发服务器上运行。此操作还会查找 pages 文件夹中的文件更改并在浏览器中反映。
注意:此操作不会监视
layouts中的更改。因此,如果您更改了布局,您将需要在您的页面上进行一些修改才能在浏览器中看到更改。您可以在 /config.php 中更改此端口。
文件夹结构
/pages
所有网站页面都位于此处。支持作为页面使用的 .html、.md 和 Blade 文件。页面的文件夹结构决定了路由。
例如
pages/index.html将显示在/pages/readme.md将显示在/readmepages/posts/post.html将显示在/posts/postpages/blade.blade.php将显示在/blade
/layouts
所有网站布局都位于此处。只支持作为布局使用的 html 文件。
/assets
所有图像、css 和其他资源都位于此处
注意:所有这些都可以在 /config.php 中进行更改。
<paper>
我们在 <paper> 标签中包含“meta”以供文章使用。这里的“meta”意味着您希望在页面内容中替换的内容。
在布局中的
{content}和在<paper>标签中的layout是保留的,不能用于替换页面内容
模板中的语法是 {meta}。例如,如果您要为页面添加标题 {title},在您的 paper 标签中添加一个,然后在您的布局中添加
title: This is the test title
这将生成
... <title>{title}</title> ...
在 HTML 中。
<title>This is the test title</title>
示例 paper 标签
支持的文件类型
<paper>
description: this is the best description
title: This is the test title
layout: blog.html
</paper>
Paphper 目前支持三种文件类型。
Html
- Md
- Blade 模板
- 图像缩放支持
Paphper 还支持从单个源文件进行图像缩放。您可以引用图像的大小,它将生成该大小。
Paphper 从 assets 文件夹中的 envelope.jpg 文件中引用。它在 index.html 中引用,并在 index 布局 中作为 /envelope_50x50.jpeg 引用。这将复制原始文件,并在给定的维度中创建 /envelope_50x50.jpeg。
例如
要使此操作正常工作,图像必须以 filename_widthxheight.jpeg 的方式引用。例如
为了生成一个 50x50 维度的图像 /envelope.jpeg,它必须以 /envelope_50x50.jpeg 的方式引用。
构建
php paper build 将 html 文件构建到构建文件夹中。这可以在 此处 指定。
高级使用
我已尽力使这个事物尽可能灵活和可扩展。让我简单解释一下架构,以帮助我说明这一点。
架构
PageResolvers
PageResolver 是一个简单的类,实现了 PageResolverInterface.php
这是路由结构的来源。以下解释了函数。
getPages应该返回要构建的页面。它应该是一个解析为数组字符串的 Promise(pages)。getBuildFilename(string $page)应该返回应该添加解析后页面内容的文件。必须是完整路径getBuildFolder应该返回应该创建以放置文件的文件夹。必须是完整路径。
Paphper 中使用的默认 PageResolver 是 FilesystemPageResolver。它扫描 pages 文件夹中的文件夹,检索这些页面并决定要创建的文件和文件夹。
这可以扩展以使用,例如,MySQL 表中的帖子,并根据该帖子的 URI 创建页面。
FileTypeResolver
Content 是一个将任何文件解释为 HTML 的类。它实现了 Contentinterface。它需要一个函数。
resolveFileType(string $filename)当传入一个文件名时,应简单返回一个ContentInterface。ContentInterface返回解析为字符串的 Promise。这是将写入生成的 HTML 文件中的最终内容。
目前我们有三个 FileTypeResolver。
- HtmlResolver
- MdResolver
- BladeResolver
Paphper 使用此接口来内部支持多种文件类型。
MetaInterface
Meta 解析器解析页面中的元数据。默认的 meta 解析器是 Paper Tag Parser,它实现了 MetaInterfaec。正如其名称所暗示的,Paper Tag Parser 是文件顶部的 <paper> 标签。
您也可以实现自己的 meta 解析器。以下解释了函数。
getBody应该能够在写入 HTML 时获取页面的主体,而不包括元数据。getLayout应该能够获取将要使用的布局。在 blade 模板的情况下,这不是必需的,因为它由 blade 本身处理。getLayoutContent应该获取布局的内容,以便可以将元数据和内容传递到其中。get在传入元数据键时,应该返回元数据值getExtraMetas这是一切元数据process返回一个 Promise。由于我们在文件系统中使用 Promise,必须读取文件一次以处理页面内容。如果我们在每次调用中单独处理 Promise,就会变得难以返回类型,并且会变成回调地狱。因此,我们调用 process 函数来设置所有属性。
整合这一切
我们基本上将这一切整合在一起来创建一个静态站点。
https://github.com/paphper/core/blob/master/paper#L26-L43。这些是 paper 中使用的默认值。您可以自定义并编写自己的。我计划添加更多。请告诉我应该添加什么。创建 PR 或 issues 以提出建议、贡献和反馈。