# 克隆项目(如果是从Git获取)
git clone <项目地址>
cd srt你好,世界
欢迎使用SRT生成器
这是一个示例字幕文件moon run cmd/main1
00:00:00,000 --> 00:00:01,000
你好,世界
2
00:00:02,000 --> 00:00:03,000
欢迎使用SRT生成器
3
00:00:04,000 --> 00:00:05,000
这是一个示例字幕文件///|
/// SRT字幕文件的容器结构体。
pub(all) struct Srt {
pieces : Array[Piece]
}///|
/// SRT文件中的字幕片段,包含时间和内容信息。
pub(all) struct Piece {
index : Int // 字幕序号
start : Int // 开始时间(秒)
end : Int // 结束时间(秒)
text : String // 字幕文本
}/// 从文本文件读取所有行,并进行预处理。
pub fn read_lines(file_path : String) -> Array[String] raise @fs.IOError/// 将字符串数组写入文件,每行用换行符分隔。
pub fn write_lines(file_path : String, lines : Array[String]) -> Unit raise @fs.IOError台词时长 = ceil(字符数 × 0.2) 秒其中 0.2 是 CHAR_PER_SECOND 常量,表示每个字符0.2秒。你好(2字符)
空行
世界(2字符)srt/
├── src/ # 库代码
│ ├── srt.mbt # SRT核心逻辑
│ └── fs.mbt # 文件系统操作
├── cmd/main/ # 命令行程序
│ └── main.mbt # 主程序入口
├── srt_mbt_test.mbt # 黑盒测试
├── srt_mbt_wbtest.mbt # 白盒测试
└── moon.mod.json # 项目配置# 运行所有测试
moon test
# 运行测试并更新快照
moon test --update
# 只运行当前包的测试
moon test -p srt_mbt
# 详细模式
moon test -vmoon fmtmoon check// 默认:剪映甜美女声语速(0.2秒/字符)
///|
const CHAR_PER_SECOND = 0.2
// 快速语速(0.15秒/字符)
// const CHAR_PER_SECOND = 0.15
// 慢速语速(0.25秒/字符)
// const CHAR_PER_SECOND = 0.25// 修改输入文件
let lines = @srt.read_lines("my_input.txt") catch { ... }
// 修改输出文件
@srt.write_lines("my_output.srt", ...) catch { ... }///|
test "基本SRT创建" {
let srt = @srt.Srt::new()
let piece = @srt.Piece::new(1, 0, 5, "Hello, World!")
srt.add_piece(piece)
inspect(srt.pieces.length(), content="1")
inspect(piece.text, content="Hello, World!")
}///|
test "时间格式转换" {
inspect(@srt.Piece::sec_to_hms(0), content="00:00:00,000")
inspect(@srt.Piece::sec_to_hms(65), content="00:01:05,000")
inspect(@srt.Piece::sec_to_hms(3665), content="01:01:05,000")
}///|
test "文件读写示例" {
// 注意:这些测试需要实际文件,通常使用模拟数据
let test_lines = ["Line 1", "Line 2", "Line 3"]
// 模拟写入
let content = test_lines.join("\n")
inspect(
content,
content=(
#|Line 1
#|Line 2
#|Line 3
#|
),
)
}// 假设文件内容为:
// 第一行
// (这是注释)
// 第二行
let lines = read_lines("example.txt")
inspect(lines.length(), content="2")
inspect(lines[0], content="第一行")
inspect(lines[1], content="第二行")let lines = ["第一行", "第二行", "第三行"]
write_lines("output.txt", lines)
// 文件内容将是:
// 第一行
// 第二行
// 第三行