Tholp's bespoke website generator

Require for_each_arg replacement marker have a prefix defined by the first arg

Tholp1 4a70532e 05434635

Changed files
+33 -15
src
+33 -15
src/macros/simple_blocks.rs
···
// This file for implementations of short blocks, im qualifying that as less than 30ish lines
-
use std::{env::args, fmt::format, process::exit};
-
use crate::{
-
console::error_skid,
-
projectparse::{FileIndexing, ProjectContext},
-
stringtools::{find_pattern, split_to_tokens, TokenTools, WhitespaceChecks},
+
console::{error_skid, warn_skid},
+
projectparse::ProjectContext,
+
stringtools::{find_pattern, split_to_tokens, TokenTools},
types::{InputFile, Token},
};
···
) -> Vec<Token> {
let mut output = Vec::new();
let block: Vec<Token> = scope.into();
+
let varname = &args[0];
+
let real_args = &args[1..];
let mut replacement_count: usize = 0;
-
let mut replacement_pattern = find_pattern(scope, "[[..1]]".into());
+
let mut replacement_pattern = find_pattern(scope, format!("[[{}..1]]", varname));
+
+
if replacement_pattern.is_none() {
+
warn_skid(
+
context,
+
origin_index,
+
origin_line,
+
format!(
+
"Macro `for_each_arg` given block with no \"[[{}..1]]\", intentional?",
+
varname
+
),
+
);
+
}
+
while replacement_pattern.is_some() {
replacement_count += 1;
replacement_pattern =
-
find_pattern(scope, format!("[[..{}]]", replacement_count + 1).into());
+
find_pattern(scope, format!("[[{}..{}]]", varname, replacement_count + 1));
}
if replacement_count == 0 {
-
for _i in 0..args.iter().count() {
+
for _i in 0..real_args.iter().count() {
output.append(&mut block.clone());
}
return output;
}
-
if args.len() % replacement_count != 0 {
+
if real_args.len() % replacement_count != 0 {
error_skid(context, origin_index, origin_line,
format!("`for_each_var` was not given a number of arguments({}) that was a multiple of its replacement posistions({}) (got {:?})",
-
args.len(),
+
real_args.len(),
replacement_count,
-
args));
+
real_args));
}
let mut replacement_index: usize = 0;
let mut arg_output: Vec<Token> = block.clone();
-
for arg in args {
-
let mut found_pattern =
-
find_pattern(&arg_output, format!("[[..{}]]", replacement_index + 1));
+
for arg in real_args {
+
let mut found_pattern = find_pattern(
+
&arg_output,
+
format!("[[{}..{}]]", varname, replacement_index + 1),
+
);
while found_pattern.is_some() {
let (start, len) = found_pattern.unwrap();
let replacement = split_to_tokens(arg.clone(), origin_index);
arg_output.splice(start..start + len, replacement);
-
found_pattern = find_pattern(&arg_output, format!("[[..{}]]", replacement_index + 1));
+
found_pattern = find_pattern(
+
&arg_output,
+
format!("[[{}..{}]]", varname, replacement_index + 1),
+
);
//println!("{}", replacement_index + 1);
}