substudy 0.2.0

Tools for working with parallel, bilingual subtitles
Documentation
// 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+