1 个稳定版本
1.0.0 | 2023年11月29日 |
---|
#30 in #web-page
105KB
2K SLoC
masterpg
概述
masterpg
工具将文件(通常是静态 HTML 文件)组合在一起,作为 HTML 中缺失的 <include>
标签的替代方案。
此包提供了以下两种功能:
- 库函数,
- 和命令行工具。
库函数和命令行工具都旨在在网页服务器端或网页发布阶段使用,尽管它们可以组合任何类型的文本文件。
库函数
pub fn compose
在 src/lib.rs
中提供此工具的组合功能,作为一个公共函数,您可以从自己的 Rust 应用程序中调用它。
它至少有两种输入和输出模式,因为它接受一个实现 string_io_and_mock::TextIOHandler
特性的实例作为其 io_handler
参数
- 文件
- 内存中存储的字符串。
为了使 masterpg
能够处理文件,您可以传递一个 string_io_and_mock::FileTextHandler
的实例。
的实例。
(MockTextHandler
这样命名是因为它可以用来模拟 FileTextHandler
的行为,即使在单元测试中也可以作为一个可以独立使用和测试的组件,用于在内存中存储和检索字符串。)
为了使用库函数,请在项目的根目录中执行以下命令:
cargoadd masterpg
命令行工具
命令行工具在src/main.rs中的fn main
定义,并调用库函数。
为了使用它,您需要安装Rust,打开终端窗口,并执行
cargoinstall masterpg
这将为您架构下载和编译masterpg
。
有关结果可执行文件所在文件系统路径的更多详细信息,请参阅Cargo的参考。
输入文件标签
masterpg
通过处理输入文件中的七种标签来工作
<+输出文件_path/>
:指示合成操作的结果需要写入哪个文件。
<+主文件_path/>
:表示将具有给定路径的文件用作主页面。如果文件路径不包含完整路径,则认为它是相对于当前活动目录的相对路径。
一个输入文件可以包含多个<+master ...>
标签。
<+占位符标签名/>
:表示此占位符需要用具有相同标签名的
<+actual>
标签的内容替换。
<+actual tag_name>
...</+actual>
具有相同标签名的实际内容,用于替换占位符。
<+comment>
...</comment>
将从输出中删除。
<+时间戳/>
:在输出文本中产生时间戳,格式为
ts=16548548678647
。数字是自Unix纪元开始以来的毫秒数。
<+计算标签名[运算符] [操作数1] [操作数2] [操作数3] ... />
:执行计算:它将+、-、*、/或其他运算符应用于一个或多个操作数。
请注意,这些标签不区分大小写。
计算
<+calc ... />
标签的操作数可以是
- 文字数值,或者
- 标签名,它引用其他
<+calc tag_name .../>
标签或具有该标签名的<+actual tag_name>
标签。
这意味着<+actual>
标签和<+calc>
标签不能具有相同的标签名。
操作数中不允许包含单位:10是允许的,但不允许10px。
然而,单位可以紧跟在<+calc - .../>
或<+placeholder .../>
标签之后。例如。
<+实际 divHeight>30</+实际>
<+实际 goldenCut>1.618034</+实际>
<+计算大div高度*div高度2/>
<+计算大div宽度/大div高度黄金分割/>
...
<+占位符大div宽度/>像素
...
<+占位符大div宽度/>像素
A <+calc tag_name .../>
标签,在评估时将被替换为一个 <+/实际tag_name>结果</+实际>
标签,除非标签名(在 <+calc
之后的第一词)是 -
,在这种情况下,结果将直接包含在输出文件中。
<+实际价格>200</+实际>
<+实际佣金>20</+实际>
<+实际税率>0.20</+实际>
<+计算金额+价格佣金/> ---> <+实际金额>220</+实际>
<+计算税费*金额税率/> ---> <+实际>44</+实际>
<+计算- +金额税费/> $ ---> 264 $
<+calc>
标签处理以下运算符
+
: 加法-
: 减法*
: 乘法x
: 乘法(同上)/
: 除法:
: 除法(同上)÷
: 除法(同上)%
: 余数min
: 获取给定操作数的最小值max
: 获取给定操作数的最大值abs
: 绝对值^
: 幂**
: 幂(同上)pow
: 幂(同上)exp
: 幂(同上)sign
: 第一个操作数的符号。round
: 四舍五入到0trunc
: 去除小数部分,朝0方向floor
: 去除小数部分,朝-∞方向ceiling
: 去除小数部分,朝+∞方向
这些运算符不区分大小写。
<+calc>
、<+actual>
和<+placeholder>
标签可以位于同一文件中,在主文件中或引用主文件的客户端文件中。由于masterpg
通过将所有这些文件的 内容合并为一个文本来解析这些标签,因此您可以随意将这些标签放在任何需要它们的位置。
如何处理输入文件
masterpg 通过
-
处理其命令行上提供的所有输入文件;
-
对命令行上提供的每个输入文件执行以下步骤
-
找到第一个
<+output>
标签并将输出文件路径存储在一个变量中; -
然后读取一个输入文件为字符串,并将此字符串中所有
<+master />
-标签替换为指示的整个文件的内容,甚至递归地这样做,因此主页面文件也可以包含自己的<+master />
-标签; -
然后,在生成的字符串中,替换
- 所有带有
<+calc>
标签,并且包含计算值的<+actual>
标签; - 所有带有
<+placeholder>
标签,且内容与相应<+actual>
标签内容的<+placeholder>
标签; - 所有带有时间戳的
<timestamp/>
标签;
- 所有带有
-
然后,移除所有
<+...>
标签(应为 +comment、+output 和 +actual); -
最后,将结果写入第一个
<+output>
标签中找到的文件路径,覆盖现有文件。
-
作为一个约定,masterpg
并不强制执行,你可以使用以下文件扩展名
- *.mpm 用于主页面;
- *.mpc 用于主页面消费者(或客户端),包含一个
<+master .../>
标签; - *.mpx 用于既作为主页面又自身消费的文件。
请注意,只需将最终消费者文件的名称作为命令的第一个参数传递即可
masterpg[消费者文件]
或者,如果需要生成多个输出文件
masterpg[消费者文件] [消费者文件] [消费者文件] ...
示例
给定 consts.mpm
<+实际的 siteName>测试页面</+实际>
<+实际的 author>LennyBaxter</+实际>
给定 general.mpx
<+主 consts.mpm/>
<!doctype html>
<html>
<head>
<title><+placeholder pageTitle/></title>
</head>
<body>
<h1><+placeholder pageTitle/></h1>
<i>by<+placeholder author/></i>
<div id="main"><+placeholder pageContent/></div>
</body>
</html>
给定 testpg.mpc
<+主 general.mpx/>
<+输出 index.htm/>
<+实际的 pageContent>
<p>Welcome to my<+placeholder siteName/>site!</p>
<p>I'm <+placeholder author/>and I'mjust testing the masterpg module.</p>
<p>Byefornow!</p>
</+实际>
<+实际的 pageTitle>Welcome</+实际>
然后命令
masterpg testpg.mpc
创建文件 index.html
<!doctype html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Welcome</h1>
<i>by LennyBaxter</i>
<div id="main">
<p>Welcome to my Test Pages site!</p>
<p>I'mLenny Baxter and I'mjust testing the masterpg module.</p>
<p>Byefornow!</p>
</div>
</body>
</html>
依赖关系
~2.4–8.5MB
~64K SLoC