diff options
| -rw-r--r-- | Cargo.lock | 2 | ||||
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/highlighter.rs | 32 |
3 files changed, 21 insertions, 15 deletions
@@ -39,7 +39,7 @@ dependencies = [ [[package]] name = "highlight" -version = "1.0.0" +version = "1.0.2" dependencies = [ "fancy-regex", ] @@ -1,6 +1,6 @@ [package] name = "highlight" -version = "1.0.0" +version = "1.0.2" edition = "2024" [dependencies] 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; } |
