use std::fs::File;
use std::io::{BufRead, BufReader, Write};
pub fn parse_file(
tex_file_handle: BufReader<File>,
mut csv_file: File,
environment: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let open_env: String = String::from(r"\begin{") + environment;
let close_env: String = String::from(r"\end{") + environment;
let exclude_lines = match File::open("exclude_lines.txt") {
Ok(f) => f,
Err(e) => {
println!(
r"You need to supply a file 'exclude_lines.txt' containing keyword identifying lines to be skipped.
For example:
\midrule
\toprule
\endheader
\begin
\end
{}
", e
);
panic!("No 'exclude_lines.txt' given.")
}
};
let exclude_handle = BufReader::new(exclude_lines);
let exclude_iterator = parse_exclude_list(exclude_handle).unwrap();
for line in tex_file_handle.lines() {
let line = line?;
if exclude_iterator.contains(&line.trim().to_owned())
|| line.trim().is_empty()
|| line.trim().contains(&open_env)
|| line.trim().contains(&close_env)
{
continue;
} else {
let columns: Vec<&str> = line.split('&').map(|s| s.trim()).collect();
let columns: Vec<String> = columns.iter().map(|&s| s.replace(r"\\", "")).collect();
writeln!(csv_file, "{}", columns.join(","))?;
}
}
Ok(())
}
pub fn parse_exclude_list(
exclude_file: BufReader<File>,
) -> Result<Vec<String>, Box<dyn std::error::Error>> {
let exclude_list: Vec<String> = exclude_file.lines().map(|l| l.unwrap()).collect();
println!("Parsed exclusion list:");
for i in exclude_list.iter() {
println!("{}",i)
}
Ok(exclude_list)
}