From f4b6a50903ec6d82daf414a448e0175d79293efb Mon Sep 17 00:00:00 2001 From: SavagePeanut Date: Sun, 3 Sep 2023 20:40:20 -0500 Subject: fix newlines for matrix --- src/matrix.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/matrix.rs (limited to 'src/matrix.rs') diff --git a/src/matrix.rs b/src/matrix.rs new file mode 100644 index 0000000..92d2eb8 --- /dev/null +++ b/src/matrix.rs @@ -0,0 +1,68 @@ +use pyo3::prelude::*; + +use crate::parser::parse_with_limits; + +const MATRIX_FORMATS: &[(&'static str, (&'static str, &'static str))] = &[ + ("_", ("", "")), + ("*", ("", "")), + ("~", ("", "")), + ("`", ("", "")), + ("```", ("
", "
")), + ("```language", ("
", "
")), + (">", ("
", "
")), + ("||", ("", "")), +]; + +#[pyfunction] +pub fn format_for_matrix(body: String) -> PyResult { + let mut chars: Vec = body.chars().collect(); + if chars.len() < 1 { + return Ok(body); + } + let styles: Vec<(String, usize, usize, usize, usize)> = parse_with_limits(&chars, 0, chars.len() - 1, 0); + + let mut tags: Vec<(usize, String, usize)> = Vec::with_capacity(styles.len() * 2); + for (keyword, start, remove_start, end, remove_end) in styles { + if MATRIX_FORMATS.iter().any(|&(k, _)| k == keyword) { + let opening_tag = if keyword == "```language" { + MATRIX_FORMATS.iter().find(|&&(k, _)| k == keyword).unwrap().1.0.clone() + .replace("{}", &chars[start+3..remove_start-1] + .into_iter() + .collect::()) + } else { + MATRIX_FORMATS.iter().find(|&&(k, _)| k == keyword).unwrap().1.0.clone().to_string() + }; + tags.push((start, opening_tag, remove_start)); + tags.push((end, MATRIX_FORMATS.iter().find(|&&(k, _)| k == keyword).unwrap().1.1.clone().to_string(), remove_end)); + } else if keyword == ">>" || keyword == "```>" || keyword == "\\" { + tags.push((start, "".to_string(), start+1)); + } + } + + tags.sort_by(|a, b| b.0.cmp(&a.0)); + + let mut replace_newlines_to = chars.len(); + for (index, tag, end) in tags { + if tag == "" { + // index is at \n, add 1 to skip that one + let substring = chars[index + 1..replace_newlines_to].into_iter().collect::(); + chars = [&chars[..index + 1], &substring.replace('\n', "
").chars().collect::>()[..]].concat(); + } else if tag == "
" {
+            replace_newlines_to = index;
+        }
+
+        let tag: Vec = tag.chars().collect();
+        chars = [chars[..index].to_vec(), tag.clone(), chars[end..].to_vec()].concat();
+        
+        let offset: isize = index as isize - end as isize + tag.len() as isize;
+        replace_newlines_to = if offset > 0 {
+            replace_newlines_to + offset as usize
+        } else {
+            replace_newlines_to - offset.abs() as usize
+        };
+    }
+    let substring = chars[..replace_newlines_to].into_iter().collect::();
+    let text = [substring.replace('\n', "
"), chars[replace_newlines_to..].into_iter().collect::()].concat(); + + Ok(text) +} -- cgit v1.2.3