#web-page #command-line-tool #tags #text-file #utility #input-file #web-server

bin+lib masterpg

命令行工具和库函数,通过使用引用或同一文件中的实际内容替换占位符来组合网页或任何文本

1 个稳定版本

1.0.0 2023年11月29日

#30 in #web-page

MIT/Apache

105KB
2K SLoC

masterpg

概述

masterpg 工具将文件(通常是静态 HTML 文件)组合在一起,作为 HTML 中缺失的 <include> 标签的替代方案。

此包提供了以下两种功能:

  • 库函数,
  • 和命令行工具。

库函数和命令行工具都旨在在网页服务器端或网页发布阶段使用,尽管它们可以组合任何类型的文本文件。

库函数

pub fn composesrc/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 : 四舍五入到0
  • trunc : 去除小数部分,朝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