// Compiled automatically using `build.rs` script and `peg`. use std::str::FromStr; use srt::{Subtitle, SubtitleFile}; use time::Period; #[pub] subtitle_file -> SubtitleFile = blank_lines? result:subtitles blank_lines? { SubtitleFile { subtitles: result } } subtitles -> Vec = subs:subtitle ** blank_lines { subs } subtitle -> Subtitle = index:digits newline p:time_period newline l:lines { Subtitle { index: index, period: p, lines: l } } time_period -> Period = begin:time " --> " end:time {? let mut end = end; if begin == end { // If subtitle has zero length, fix it. These are generated by // the Aeneas audio/text alignment tool, which is otherwise // excellent for use with audiobooks. end += 0.001; } match Period::new(begin, end) { Ok(p) => Ok(p), Err(_) => Err("invalid time period"), } } time -> f32 = hh:digits ":" mm:digits ":" ss:comma_float { (hh as f32)*3600.0 + (mm as f32)*60.0 + ss } lines -> Vec = lines:line ** newline { lines } line -> String = text:$([^\r\n]+) { text.to_string() } digits -> usize = digits:$([0-9]+) { FromStr::from_str(digits).unwrap() } comma_float -> f32 = float_str:$([0-9]+ "," [0-9]+) { let fixed: String = float_str.replace(",", "."); FromStr::from_str(&fixed).unwrap() } newline = "\r"? "\n" blank_lines = newline+