forked from emk/subtitles-rs
-
Notifications
You must be signed in to change notification settings - Fork 2
/
grammar.rustpeg
63 lines (49 loc) · 1.32 KB
/
grammar.rustpeg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// 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+