diff options
| author | A Farzat <a@farzat.xyz> | 2026-06-10 20:04:12 +0300 |
|---|---|---|
| committer | A Farzat <a@farzat.xyz> | 2026-06-10 20:04:12 +0300 |
| commit | f11361ee359c1eaccc36559a2fa5b1b98da10ba8 (patch) | |
| tree | efda27736f85f233cd348933ce67eab8b8c2a777 /src/util | |
| parent | 4a35607263f87d10fd196f9ee4260040bbdc54d9 (diff) | |
| download | repo2markdown-f11361ee359c1eaccc36559a2fa5b1b98da10ba8.tar.gz repo2markdown-f11361ee359c1eaccc36559a2fa5b1b98da10ba8.zip | |
Move outer_backticks to a util module
This is because it shall be used by other functions later on.
It was made more generic by accepting raw bytes instead of strictly
UTF-8 strings. This allows future functions to call it without having to
convert the contents to UTF-8 strings first.
Diffstat (limited to 'src/util')
| -rw-r--r-- | src/util/fence.rs | 78 | ||||
| -rw-r--r-- | src/util/mod.rs | 1 |
2 files changed, 79 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`````"), "``````"); + } +} diff --git a/src/util/mod.rs b/src/util/mod.rs index 5595a45..24ba6fc 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -1,2 +1,3 @@ +pub mod fence; pub mod language; pub mod path_display; |
