tex-fmt 0.2.1

LaTeX formatter written in Rust
use crate::comments::*;
use crate::ignore::*;
use crate::leave::*;
use crate::logging::*;
use crate::regexes::*;
use crate::Cli;
use crate::TAB;
use log::Level::Info;

pub fn remove_extra_newlines(file: &str) -> String {
    RE_NEWLINES.replace_all(file, "\n\n").to_string()
}

pub fn remove_tabs(file: &str) -> String {
    let replace = (0..TAB).map(|_| " ").collect::<String>();
    RE_TABS.replace_all(file, replace).to_string()
}

pub fn remove_trailing_spaces(file: &str) -> String {
    RE_TRAIL.replace_all(file, "\n").to_string()
}

pub fn environments_new_line(
    file: &str,
    filename: &str,
    args: &Cli,
    logs: &mut Vec<Log>,
) -> String {
    if args.verbose {
        record_log(
            logs,
            Info,
            None,
            filename.to_string(),
            None,
            None,
            "Ensuring environments on new lines.".to_string(),
        );
    }

    let mut ignore = Ignore::new();
    let mut leave = Leave::new();
    let mut new_file = String::with_capacity(file.len());

    for (linum, line) in file.lines().enumerate() {
        ignore = get_ignore(line, linum, ignore, filename, logs, None, false);
        leave = get_leave(line, linum, leave, filename, logs, None, false);

        if !leave.visual
            && !ignore.visual
            && (RE_ENV_BEGIN.is_match(line)
                || RE_ENV_END.is_match(line)
                || RE_ITEM.is_match(line))
        {
            let comment_index = find_comment_index(line);
            let comment = &get_comment(line, comment_index);
            let text = &remove_comment(line, comment_index);
            let text = &RE_ENV_BEGIN_SHARED_LINE
                .replace_all(text, "$prev\n$env")
                .to_string();
            let text = &RE_ENV_END_SHARED_LINE
                .replace_all(text, "$prev\n$env")
                .to_string();
            let text = &RE_ITEM_SHARED_LINE
                .replace_all(text, "$prev\n$env")
                .to_string();
            new_file.push_str(text);
            new_file.push_str(comment);
        } else {
            new_file.push_str(line);
        }
        new_file.push('\n');
    }
    new_file
}