use std::borrow::Cow;
pub fn outer_block_content_or_raw(content: &str) -> Cow<str> {
if !content.starts_with("```") {
return content.into();
}
let lines: Vec<&str> = content.lines().collect();
let first_backtick = lines.iter().position(|line| line.starts_with("```"));
let last_backtick = lines.iter().rposition(|line| line.starts_with("```"));
if let (Some(start), Some(end)) = (first_backtick, last_backtick) {
if start < end {
let extracted_lines = &lines[start + 1..end];
let mut content = extracted_lines.join("\n");
content.push('\n');
return content.into();
}
}
content.into()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_md_outer_block_content_simple() {
let input = "\
```
fn main() {
println!(\"Hello, world!\");
}
```
Here is some text after the code block.";
let expected = "fn main() {\n println!(\"Hello, world!\");\n}\n";
let result = outer_block_content_or_raw(input);
assert_eq!(result, expected);
}
#[test]
fn test_md_outer_block_content_with_language() {
let input = "\
```python
def hello():
print(\"Hello, Python!\")
```
End of the text.";
let result = outer_block_content_or_raw(input);
let expected = "def hello():\n print(\"Hello, Python!\")\n";
assert_eq!(result, expected);
}
#[test]
fn test_md_outer_block_content_multiple_code_blocks() {
let fx_content = "
console.log(\"First code block\");
```
Some intermediate text.
Second code block:
```rust
fn main() {
println!(\"Second code block\");
}";
let input = format!(
"\
```javascript
{fx_content}
```
End of the text."
);
let result = outer_block_content_or_raw(&input);
assert_eq!(result, format!("{fx_content}\n"));
}
#[test]
fn test_md_outer_block_content_no_backticks() {
let input = "This is regular text without any code blocks.";
let expected = "This is regular text without any code blocks.";
let result = outer_block_content_or_raw(input);
assert_eq!(result, expected);
}
#[test]
fn test_md_outer_block_content_only_opening_backticks() {
let input = "\
Text before the code block.
```
fn incomplete() {
// Missing closing backticks
}";
let expected = "\
Text before the code block.
```
fn incomplete() {
// Missing closing backticks
}";
let result = outer_block_content_or_raw(input);
assert_eq!(result, expected);
}
#[test]
fn test_md_outer_block_content_only_closing_backticks() {
let input = "\
Missing opening backticks for this code block.
fn incomplete() {
// Missing opening backticks
}
```
";
let expected = "\
Missing opening backticks for this code block.
fn incomplete() {
// Missing opening backticks
}
```
";
let result = outer_block_content_or_raw(input);
assert_eq!(result, expected);
}
#[test]
fn test_md_outer_block_content_adjacent_backticks() {
let input = "\
```
```
Text before.
Text after.";
let expected = "\n";
let result = outer_block_content_or_raw(input);
assert_eq!(result, expected);
}
#[test]
fn test_md_outer_block_content_with_whitespace() {
let fx_input = "
Text before.
```
Line within code block with leading whitespace.
```
Text after.";
let expected = fx_input.to_string();
let result = outer_block_content_or_raw(fx_input);
assert_eq!(result, expected);
}
#[test]
fn test_md_outer_block_content_with_inner_backticks() {
let fx_content = "Here is some code with backticks:
let s = \"Hello, `world`!\";";
let input = format!(
"\
```
{}
```
End text.",
fx_content
);
let result = outer_block_content_or_raw(&input);
assert_eq!(result, format!("{fx_content}\n"));
}
}