本文档详细说明项目中三个 Bash 脚本 (get-version.bash, is-newer-version.bash, release.bash) 和主程序 (src/main.rs) 的设计与功能。这些组件协同工作,实现版本管理、发布流程和 HTML 处理功能。
graph TD
A[get-version.bash] --> B[is-newer-version.bash]
B --> C[release.bash]
D[main.rs] --> E[minify_html]
D --> F[all_in_one]
从 HTML 文件中提取版本号的核心脚本。
-
路径解析:
- 自动检测脚本所在目录 (
$SCRIPT_DIR) - 计算仓库根目录 (
$REPO_DIR) - 支持自定义文件路径参数 (
$1)
- 自动检测脚本所在目录 (
-
多语言支持:
- 通过
LANG环境变量自动检测中英文 recho()函数实现双语错误消息
- 通过
-
版本提取逻辑:
# 从index.html的<markdown-html>标签提取version属性
VERSION=$(grep -oP '<markdown-html\s+version="\K[^"]+' "$FILE_PATH" | head -1)- 错误处理:
- 文件不存在检测 (
[ ! -f "$FILE_PATH" ]) - 版本号缺失检测 (
[ -z "$VERSION" ])
- 文件不存在检测 (
使用示例:
./scripts/get-version.bash # 默认检测index.html
./scripts/get-version.bash path/to/custom.html # 自定义文件比较当前版本与 Git 标签,判断是否需要发布新版本。
-
版本获取:
- 调用
get-version.bash获取当前版本 - 获取最新 Git 标签 (
git tag -l 'v*')
- 调用
-
版本比较算法:
[ "$(printf "%s\n%s" "$CURRENT_VERSION" "$LATEST_VERSION" | sort -V | head -n1)" != "$CURRENT_VERSION" ]- 使用
sort -V进行版本号排序比较 - 当前版本较新时输出版本号,否则输出"0"
- 边界处理:
- 无标签时默认需要发布
- 自动去除标签的"v"前缀
输出说明:
- 输出版本号:需要发布新版本
- 输出"0":已是最新版本
交互式版本发布工具。
sequenceDiagram
用户->>release.bash: 执行脚本
alt 带版本参数
release.bash->>release.bash: 验证版本格式
else 无参数
release.bash->>用户: 提示输入版本
loop 格式验证
用户->>release.bash: 输入版本
release.bash->>release.bash: 校验X.X.X格式
end
end
release.bash->>Git: 创建标签(v$version)
release.bash->>Git: 推送标签
- 参数解析:支持
-v/--version参数 - 版本验证:正则校验
^[0-9]+\.[0-9]+\.[0-9]+$格式 - 错误处理:
- 仓库目录切换失败
- 标签创建/推送失败
- 多语言界面:所有交互提示支持中英文
HTML 处理核心程序,提供压缩和内联功能。
pub fn minify_html(input_path: &str) -> Result<PathBuf> { ... }
pub fn all_in_one(input_path: &str) -> Result<PathBuf> { ... }
fn fetch_external_resource(url: &str) -> Result<String> { ... }HTML 压缩实现:
-
输出路径生成:
{filename}.min.html -
压缩配置:
let mut cfg = Cfg::new(); cfg.minify_css = true; cfg.minify_js = true; cfg.keep_closing_tags = true; // 其他配置项...
-
压缩执行:
minify(&code, &cfg)
资源内联实现:
-
资源获取:
- 通过
fetch_external_resource下载 CSS/JS - 自定义 User-Agent 规避拦截
- 通过
-
DOM 处理:
- 使用
scraper库解析 HTML - 选择器定位
script[src]和link[rel=stylesheet]
- 使用
-
内联替换:
// 示例:脚本内联 let replacement = format!("<script>{}</script>", content); processed_html.replace(&original, &replacement);
-
自定义错误类型:
HtmlProcessorError -
错误传播:
Result<T, Box<dyn Error>>统一处理 -
错误日志:
eprintln!("Error minifying HTML: {}", e);
fn main() {
let input_path = ...; // 获取输入文件
minify_html(&input_path)?; // 生成压缩版
let all_in_one_path = all_in_one(&input_path)?; // 生成内联版
minify_html(all_in_one_path.to_str().unwrap())?; // 压缩内联版
}组件间的协同关系:
flowchart TB
subgraph 版本发布
A[get-version] --> B[is-newer-version]
B --> C[release]
end
subgraph HTML处理
D[main.rs] --> E[压缩]
D --> F[内联]
end
C -->|新版本| G[Git标签]
F -->|生成| H[allinone.html]
E -->|生成| I[min.html]
# 检查版本更新
NEW_VER=$(./scripts/is-newer-version.bash)
# 发布新版本
if [ "$NEW_VER" != "0" ]; then
./scripts/release.bash -v $NEW_VER
fi# 处理index.html
cargo run -- index.html
# 生成文件:
# - index.min.html
# - index.allinone.html
# - index.allinone.min.html本文档最后更新于:2025 年 6 月 26 日