// SRT / WebVTT 序列化。
///|
fn pad2(n : Int) -> String {
if n < 10 {
"0" + n.to_string()
} else {
n.to_string()
}
}
///|
fn pad3(n : Int) -> String {
if n < 10 {
"00" + n.to_string()
} else if n < 100 {
"0" + n.to_string()
} else {
n.to_string()
}
}
///|
fn format_timestamp(ms : Int, separator : Char) -> String {
let value = if ms < 0 { 0 } else { ms }
let hours = value / 3600000
let minutes = value / 60000 % 60
let seconds = value / 1000 % 60
let millis = value % 1000
let sep = match separator {
',' => ","
_ => "."
}
"\{pad2(hours)}:\{pad2(minutes)}:\{pad2(seconds)}\{sep}\{pad3(millis)}"
}
///|
/// 序列化为 SRT。
pub fn serialize_srt(subtitle : Subtitle) -> String {
let builder = StringBuilder()
let mut i = 0
while i < subtitle.cues.length() {
let cue = subtitle.cues[i]
builder.write_string(cue.index.to_string())
builder.write_string("\n")
builder.write_string(format_timestamp(cue.start_ms, ','))
builder.write_string(" --> ")
builder.write_string(format_timestamp(cue.end_ms, ','))
builder.write_string("\n")
builder.write_string(cue.text)
builder.write_string("\n\n")
i = i + 1
}
builder.to_string()
}
///|
/// 序列化为 WebVTT。
pub fn serialize_vtt(subtitle : Subtitle) -> String {
let builder = StringBuilder()
builder.write_string("WEBVTT\n\n")
let mut i = 0
while i < subtitle.cues.length() {
let cue = subtitle.cues[i]
builder.write_string(cue.index.to_string())
builder.write_string("\n")
builder.write_string(format_timestamp(cue.start_ms, '.'))
builder.write_string(" --> ")
builder.write_string(format_timestamp(cue.end_ms, '.'))
builder.write_string("\n")
builder.write_string(cue.text)
builder.write_string("\n\n")
i = i + 1
}
builder.to_string()
}
///|
/// 按格式序列化。
pub fn serialize_subtitle(
subtitle : Subtitle,
format : SubtitleFormat,
) -> String {
match format {
Srt => serialize_srt(subtitle)
Vtt => serialize_vtt(subtitle)
}
}