extern crate clap;
extern crate pad;
extern crate regex;
extern crate walkdir;
use std::collections::HashMap;
use std::ffi::OsStr;
use clap::{App};
use regex::Regex;
use walkdir::{DirEntry, WalkDir};
mod buffer;
mod block;
fn is_match(entry: &DirEntry, ext: &str) -> bool {
entry.file_name()
.to_str()
.map(|s| s.ends_with(ext))
.unwrap_or(false)
}
fn main() {
let matches = App::new("blocktest")
.version("1.0")
.author("Joseph Kato. <joseph@jdkato.io>")
.about("A preprocessor for markup code blocks.")
.args_from_usage(
"<src> 'Source directory'
<ext> 'Target file extension (e.g., '.md')'
<out> 'Output directory'")
.get_matches();
let mut languages: HashMap<&OsStr, &str> = HashMap::new();
languages.insert(OsStr::new("py"), "#"); languages.insert(OsStr::new("rb"), "#"); languages.insert(OsStr::new("pl"), "#"); languages.insert(OsStr::new("r"), "#");
languages.insert(OsStr::new("hs"), "--"); languages.insert(OsStr::new("lua"), "--");
languages.insert(OsStr::new("c"), "//"); languages.insert(OsStr::new("d"), "//"); languages.insert(OsStr::new("cs"), "//"); languages.insert(OsStr::new("cpp"), "//"); languages.insert(OsStr::new("go"), "//"); languages.insert(OsStr::new("java"), "//"); languages.insert(OsStr::new("js"), "//"); languages.insert(OsStr::new("jl"), "//"); languages.insert(OsStr::new("m"), "//"); languages.insert(OsStr::new("php"), "//"); languages.insert(OsStr::new("rs"), "//"); languages.insert(OsStr::new("scala"), "//"); languages.insert(OsStr::new("swift"), "//");
let pat = Regex::new(r#"( *)\{\{< id="(.+)" src="(.+)" >\}\}"#).unwrap();
let src = matches.value_of("src").unwrap();
let ext = matches.value_of("ext").unwrap();
let walker = WalkDir::new(src).into_iter();
let dest = matches.value_of("out").unwrap();
for entry in walker {
let entry = entry.unwrap();
if is_match(&entry, ext) {
let dest = entry.path().to_str().unwrap().replace(src, dest);
buffer::compile(&entry.path(), &dest, &pat, &languages);
}
}
}