#[derive(Debug, Clone, PartialEq)]
pub struct PlainTextConfig {
pub space_threshold: f64,
pub newline_threshold: f64,
pub preserve_layout: bool,
pub line_break_mode: LineBreakMode,
}
impl Default for PlainTextConfig {
fn default() -> Self {
Self {
space_threshold: 0.3,
newline_threshold: 10.0,
preserve_layout: false,
line_break_mode: LineBreakMode::Auto,
}
}
}
impl PlainTextConfig {
pub fn new() -> Self {
Self::default()
}
pub fn dense() -> Self {
Self {
space_threshold: 0.1,
newline_threshold: 8.0,
preserve_layout: false,
line_break_mode: LineBreakMode::Auto,
}
}
pub fn loose() -> Self {
Self {
space_threshold: 0.4,
newline_threshold: 15.0,
preserve_layout: false,
line_break_mode: LineBreakMode::Auto,
}
}
pub fn preserve_layout() -> Self {
Self {
space_threshold: 0.3,
newline_threshold: 10.0,
preserve_layout: true,
line_break_mode: LineBreakMode::PreserveAll,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum LineBreakMode {
Auto,
PreserveAll,
Normalize,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PlainTextResult {
pub text: String,
pub line_count: usize,
pub char_count: usize,
}
impl PlainTextResult {
pub fn new(text: String) -> Self {
let line_count = text.lines().count();
let char_count = text.chars().count();
Self {
text,
line_count,
char_count,
}
}
pub fn empty() -> Self {
Self {
text: String::new(),
line_count: 0,
char_count: 0,
}
}
pub fn is_empty(&self) -> bool {
self.text.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_default() {
let config = PlainTextConfig::default();
assert_eq!(config.space_threshold, 0.3);
assert_eq!(config.newline_threshold, 10.0);
assert!(!config.preserve_layout);
assert_eq!(config.line_break_mode, LineBreakMode::Auto);
}
#[test]
fn test_config_new() {
let config = PlainTextConfig::new();
assert_eq!(config, PlainTextConfig::default());
}
#[test]
fn test_config_dense() {
let config = PlainTextConfig::dense();
assert_eq!(config.space_threshold, 0.1);
assert_eq!(config.newline_threshold, 8.0);
assert!(!config.preserve_layout);
}
#[test]
fn test_config_loose() {
let config = PlainTextConfig::loose();
assert_eq!(config.space_threshold, 0.4);
assert_eq!(config.newline_threshold, 15.0);
assert!(!config.preserve_layout);
}
#[test]
fn test_config_preserve_layout() {
let config = PlainTextConfig::preserve_layout();
assert!(config.preserve_layout);
assert_eq!(config.line_break_mode, LineBreakMode::PreserveAll);
}
#[test]
fn test_line_break_mode_equality() {
assert_eq!(LineBreakMode::Auto, LineBreakMode::Auto);
assert_ne!(LineBreakMode::Auto, LineBreakMode::PreserveAll);
}
#[test]
fn test_plain_text_result_new() {
let result = PlainTextResult::new("Hello\nWorld".to_string());
assert_eq!(result.text, "Hello\nWorld");
assert_eq!(result.line_count, 2);
assert_eq!(result.char_count, 11);
}
#[test]
fn test_plain_text_result_empty() {
let result = PlainTextResult::empty();
assert_eq!(result.text, "");
assert_eq!(result.line_count, 0);
assert_eq!(result.char_count, 0);
assert!(result.is_empty());
}
#[test]
fn test_plain_text_result_is_empty() {
let empty = PlainTextResult::empty();
assert!(empty.is_empty());
let not_empty = PlainTextResult::new("text".to_string());
assert!(!not_empty.is_empty());
}
#[test]
fn test_plain_text_result_line_count() {
let single = PlainTextResult::new("single line".to_string());
assert_eq!(single.line_count, 1);
let multiple = PlainTextResult::new("line1\nline2\nline3".to_string());
assert_eq!(multiple.line_count, 3);
}
}