summaryrefslogtreecommitdiff
path: root/src/util/fence.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/fence.rs')
-rw-r--r--src/util/fence.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/util/fence.rs b/src/util/fence.rs
new file mode 100644
index 0000000..16f398a
--- /dev/null
+++ b/src/util/fence.rs
@@ -0,0 +1,78 @@
+pub fn generate_outer_backticks(contents: impl AsRef<[u8]>) -> String {
+ let bytes = contents.as_ref();
+ let mut max_ticks = 0;
+ let mut current_count = 0;
+ for &byte in bytes {
+ if byte == b'`' {
+ current_count += 1;
+ if current_count > max_ticks {
+ max_ticks = current_count;
+ }
+ } else {
+ current_count = 0;
+ }
+ }
+ let fence_len = std::cmp::max(3, max_ticks + 1);
+ "`".repeat(fence_len)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::generate_outer_backticks;
+
+ #[test]
+ fn empty_content_returns_three_backticks() {
+ assert_eq!(generate_outer_backticks(b""), "```");
+ assert_eq!(generate_outer_backticks(""), "```");
+ }
+
+ #[test]
+ fn content_without_backticks_returns_three_backticks() {
+ assert_eq!(generate_outer_backticks(b"no backticks here"), "```");
+ assert_eq!(generate_outer_backticks("hello world"), "```");
+ }
+
+ #[test]
+ fn single_backtick_returns_three_backticks() {
+ assert_eq!(generate_outer_backticks(b"`"), "```");
+ assert_eq!(generate_outer_backticks("a ` b"), "```");
+ }
+
+ #[test]
+ fn two_consecutive_backticks_returns_three_backticks() {
+ assert_eq!(generate_outer_backticks(b"``"), "```");
+ assert_eq!(generate_outer_backticks("a `` b"), "```");
+ }
+
+ #[test]
+ fn three_consecutive_backticks_returns_four_backticks() {
+ assert_eq!(generate_outer_backticks(b"```"), "````");
+ assert_eq!(generate_outer_backticks("a ``` b"), "````");
+ }
+
+ #[test]
+ fn four_consecutive_backticks_returns_five_backticks() {
+ assert_eq!(generate_outer_backticks(b"````"), "`````");
+ assert_eq!(generate_outer_backticks("a ```` b"), "`````");
+ }
+
+ #[test]
+ fn long_run_of_backticks_returns_run_plus_one() {
+ let run = 10;
+ let input = "`".repeat(run);
+ let expected = "`".repeat(run + 1);
+ assert_eq!(generate_outer_backticks(&input), expected);
+ }
+
+ #[test]
+ fn maximum_run_across_multiple_groups() {
+ let input = "``` and then ````` and then ``"; // longest run is 5
+ assert_eq!(generate_outer_backticks(input), "``````"); // 5+1 = 6
+ }
+
+ #[test]
+ fn backticks_at_start_or_end_handled_correctly() {
+ assert_eq!(generate_outer_backticks("````start"), "`````");
+ assert_eq!(generate_outer_backticks("end`````"), "``````");
+ }
+}