// Generate using:
//
// ```sh
// multirust update nightly-2015-11-11
// multirust run nightly-2015-11-11 cargo install peg
// multirust run nightly-2015-11-11 peg grammar.rustpeg > grammar.rs
// ```
use std::str::FromStr;
use srt::{Subtitle,SubtitleFile};
use time::Period;
#[pub]
subtitle_file -> SubtitleFile
= bom? blank_lines? result:subtitles blank_lines? {
SubtitleFile{subtitles: result}
}
subtitles -> Vec<Subtitle>
= 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 {?
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<String>
= lines:line ** newline { lines }
line -> String
= [^\r\n]+ { match_str.to_string() }
digits -> usize
= [0-9]+ { FromStr::from_str(match_str).unwrap() }
comma_float -> f32
= [0-9]+ "," [0-9]+ {
let fixed: String = match_str.replace(",", ".");
FromStr::from_str(&fixed).unwrap()
}
bom
= "\uFEFF"
newline
= "\r"? "\n"
blank_lines
= newline+