diff options
author | Ben Bridle <ben@derelict.engineering> | 2025-10-17 21:20:05 +1300 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2025-10-17 21:20:05 +1300 |
commit | a81bdc960dd2d9007089e8ca0ff878a3d7c34d9e (patch) | |
tree | 882a3d1062b97b92835e382de9135a9b13d2e86c /src/highlighter.rs | |
parent | a7282a8de548fd14bc60519453e9a6e43b23acde (diff) | |
download | highlight-a81bdc960dd2d9007089e8ca0ff878a3d7c34d9e.zip |
Restrict variable names to lower-case characters and hyphens
This is so that the characters < and > can be used in patterns without
over-zealously interpreting rules as variable names.
Diffstat (limited to 'src/highlighter.rs')
-rw-r--r-- | src/highlighter.rs | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/src/highlighter.rs b/src/highlighter.rs index 40e618e..fe40160 100644 --- a/src/highlighter.rs +++ b/src/highlighter.rs @@ -105,22 +105,28 @@ impl Highlighter { fn replace_variables(pattern: &str, variables: &HashMap<String, String>) -> String { let mut output = String::new(); - let mut chars = pattern.chars(); - while let Some(c) = chars.next() { - if c == '<' { - let mut name = String::from('<'); - loop { - match chars.next() { - Some('>') => { name.push('>'); break; } - Some(c) => name.push(c), - None => panic!("Missing '>' character"), + let chars: Vec<char> = pattern.chars().collect(); + let mut i = 0; + 'outer: while let Some(c) = chars.get(i) { + if *c == '<' { + let mut name = String::from(*c); + let mut j = i+1; + while let Some(d) = chars.get(j) { + name.push(*d); + if *d == '>' { + let pattern = variables.get(&name).expect(&format!("Missing definition for {name:?}")); + output.push_str(&format!("(?:{pattern})")); + i = j+1; + continue 'outer; } + if !d.is_lowercase() && *d != '-' { + break; + } + j += 1; } - let pattern = variables.get(&name).expect(&format!("Missing definition for {name:?}")); - output.push_str(&format!("(?:{pattern})")); - } else { - output.push(c); } + output.push(*c); + i += 1; } return output; } |