aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs
index 02fbcd4..7d2f786 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -27,7 +27,22 @@ struct Config {
27 input: Vec<PathBuf>, 27 input: Vec<PathBuf>,
28} 28}
29 29
30type Blocks<'a> = HashMap<String,Cow<'a,str>>; 30#[derive(Eq, Hash, PartialEq)]
31enum Key {
32 Macro(String),
33 Entry(PathBuf)
34}
35
36impl Key {
37 fn get_path(&self) -> Option<&PathBuf> {
38 match self {
39 Self::Entry(s) => Some(&s),
40 Self::Macro(_) => None
41 }
42 }
43}
44
45type Blocks<'a> = HashMap<Key,Cow<'a,str>>;
31 46
32fn build( 47fn build(
33 base: &Option<PathBuf>, 48 base: &Option<PathBuf>,
@@ -35,10 +50,6 @@ fn build(
35 max_depth: u32 50 max_depth: u32
36) { 51) {
37 lazy_static! { 52 lazy_static! {
38 static ref PATH: Regex =
39 Regex::new(
40 r"^(?:[[:word:]\.-]+/)*[[:word:]\.-]+\.[[:alpha:]]+$"
41 ).unwrap();
42 static ref MACRO: Regex = 53 static ref MACRO: Regex =
43 Regex::new( 54 Regex::new(
44 r"(?m)^([[:blank:]]*)<<([^>\s]+)>>" 55 r"(?m)^([[:blank:]]*)<<([^>\s]+)>>"
@@ -46,7 +57,8 @@ fn build(
46 } 57 }
47 blocks 58 blocks
48 .iter() 59 .iter()
49 .for_each(|(path,code)| if PATH.is_match(path) { 60 .filter_map(|(key,code)| { key.get_path().map(|k| (k,code)) })
61 .for_each(|(path,code)| {
50 let mut current_depth = 0; 62 let mut current_depth = 0;
51 let mut code = code.clone(); 63 let mut code = code.clone();
52 while let Cow::Owned(new_code) = MACRO.replace_all( 64 while let Cow::Owned(new_code) = MACRO.replace_all(
@@ -54,7 +66,7 @@ fn build(
54 |caps: &Captures| { 66 |caps: &Captures| {
55 if current_depth < max_depth { 67 if current_depth < max_depth {
56 let block = blocks 68 let block = blocks
57 .get(&caps[2]) 69 .get(&Key::Macro(caps[2].to_string()))
58 .expect("Block not present") 70 .expect("Block not present")
59 .clone(); 71 .clone();
60 indent(block, caps[1].len()) 72 indent(block, caps[1].len())
@@ -132,11 +144,20 @@ fn main() -> Result<()> {
132 if let Block::CodeBlock((id,clss,attrs), code) = block { 144 if let Block::CodeBlock((id,clss,attrs), code) = block {
133 if !id.is_empty() { 145 if !id.is_empty() {
134 let key = { 146 let key = {
135 let path = attrs.iter().find(|(k,_)| k == "path"); 147 lazy_static! {
136 if let Some(path) = path { 148 static ref PATH: Regex =
137 format!("{}{}", path.1, id) 149 Regex::new(
150 r"^(?:[[:word:]\.-]+/)*[[:word:]\.-]+\.[[:alpha:]]+$"
151 ).unwrap();
152 }
153 let entry = clss.contains(&String::from("entry"));
154 let path = attrs
155 .into_iter()
156 .find_map(|(k,p)| if k == "path" { Some(p.clone()) } else { None });
157 if entry || path.is_some() || PATH.is_match(id) {
158 Key::Entry(PathBuf::from(path.unwrap_or_default()).join(id))
138 } else { 159 } else {
139 id.to_string() 160 Key::Macro(id.to_string())
140 } 161 }
141 }; 162 };
142 if clss.iter().any(|c| c == "override") { 163 if clss.iter().any(|c| c == "override") {
@@ -162,4 +183,4 @@ fn main() -> Result<()> {
162 ); 183 );
163 pandoc.execute().unwrap(); 184 pandoc.execute().unwrap();
164 Ok(()) 185 Ok(())
165} \ No newline at end of file 186}