From 27d51448643cb104cdb42a6c04b1660d02b0e262 Mon Sep 17 00:00:00 2001 From: Brummel Date: Mon, 18 May 2026 16:38:21 +0200 Subject: [PATCH] feat: dictation segmentation on blank lines --- src/segment.rs | 21 ++++++++++++++++++++- tests/segment_tests.rs | 22 ++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 tests/segment_tests.rs diff --git a/src/segment.rs b/src/segment.rs index 4b0fd9d..8cd36fd 100644 --- a/src/segment.rs +++ b/src/segment.rs @@ -1 +1,20 @@ -// implemented in a later task +/// Split a dictation into Befund segments on Markdown paragraph +/// breaks (one or more blank lines). Trims each segment; drops empties. +pub fn split_segments(dictation: &str) -> Vec { + let mut segments = Vec::new(); + let mut current: Vec<&str> = Vec::new(); + for line in dictation.lines() { + if line.trim().is_empty() { + if !current.is_empty() { + segments.push(current.join("\n").trim().to_string()); + current.clear(); + } + } else { + current.push(line); + } + } + if !current.is_empty() { + segments.push(current.join("\n").trim().to_string()); + } + segments.into_iter().filter(|s| !s.is_empty()).collect() +} diff --git a/tests/segment_tests.rs b/tests/segment_tests.rs new file mode 100644 index 0000000..564f8c6 --- /dev/null +++ b/tests/segment_tests.rs @@ -0,0 +1,22 @@ +use alpha_id::segment::split_segments; + +#[test] +fn splits_on_blank_lines() { + let d = "Befund eins\nmit Zeile zwei\n\nBefund zwei\n\n\nBefund drei\n"; + let segs = split_segments(d); + assert_eq!(segs, vec![ + "Befund eins\nmit Zeile zwei".to_string(), + "Befund zwei".to_string(), + "Befund drei".to_string(), + ]); +} + +#[test] +fn single_segment_when_no_blank_line() { + assert_eq!(split_segments("nur ein Befund"), vec!["nur ein Befund".to_string()]); +} + +#[test] +fn empty_input_yields_no_segments() { + assert!(split_segments(" \n\n").is_empty()); +}