docvortex_core/
text_projection.rs1pub fn visible_tokens(content: &str) -> Vec<(usize, char, bool)> {
5 let chars: Vec<_> = content.chars().collect();
6 let mut cursor = 0;
7 let mut gap = false;
8 let mut tokens = Vec::new();
9 while cursor < chars.len() {
10 if chars[cursor] == '\\' && chars.get(cursor + 1) == Some(&'(') {
11 if let Some(end) = (cursor + 2..chars.len().saturating_sub(1))
12 .find(|&i| chars[i] == '\\' && chars[i + 1] == ')')
13 {
14 cursor = end + 2;
15 gap = true;
16 continue;
17 }
18 }
19 tokens.push((cursor, chars[cursor], gap));
20 gap = false;
21 cursor += 1;
22 }
23 tokens
24}
25
26pub fn project_tokens(
28 tokens: &[(usize, char, bool)],
29 forms: &std::collections::HashMap<char, String>,
30) -> Vec<(char, usize, usize, bool)> {
31 let mut pending = false;
32 let mut output = Vec::new();
33 for &(position, original, gap) in tokens {
34 pending |= gap;
35 let fragment = &forms[&original];
36 for (i, value) in fragment.chars().enumerate() {
37 output.push((value, position, position + 1, pending && i == 0));
38 }
39 if !fragment.is_empty() {
40 pending = false;
41 }
42 }
43 output
44}