diff --git a/CHANGELOG.md b/CHANGELOG.md index ccc4f95..d05f41c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ - New document server (Thanks Dani!) - New function FORMULATEXT +### Fixed + +- Fixed several issues with pasting content + ## [0.2.0] - 2024-11-06 (The HN release) ### Added diff --git a/base/src/test/user_model/test_paste_csv.rs b/base/src/test/user_model/test_paste_csv.rs index 3665845..a20262a 100644 --- a/base/src/test/user_model/test_paste_csv.rs +++ b/base/src/test/user_model/test_paste_csv.rs @@ -9,7 +9,7 @@ fn csv_paste() { assert_eq!(model.get_formatted_cell_value(0, 7, 7), Ok("0".to_string())); // paste some numbers in B4:C7 - let csv = "1,2,3\n4,5,6"; + let csv = "1\t2\t3\n4\t5\t6"; let area = Area { sheet: 0, row: 4, @@ -88,7 +88,7 @@ fn cut_paste() { model.update_range_style(&range, "font.b", "true").unwrap(); model - .set_user_input(0, 2, 1, "A season of faith, \"perfection\"") + .set_user_input(0, 2, 1, "A season of faith\t \"perfection\"") .unwrap(); // Select A1:B2 and copy @@ -136,7 +136,7 @@ fn copy_paste_internal() { model.update_range_style(&range, "font.b", "true").unwrap(); model - .set_user_input(0, 2, 1, "A season of faith, \"perfection\"") + .set_user_input(0, 2, 1, "A season of faith\t \"perfection\"") .unwrap(); // Select A1:B2 and copy @@ -144,7 +144,7 @@ fn copy_paste_internal() { let copy = model.copy_to_clipboard().unwrap(); assert_eq!( copy.csv, - "42,127\n\"A season of faith, \"\"perfection\"\"\",\n" + "42\t127\n\"A season of faith\t \"\"perfection\"\"\"\t\n" ); assert_eq!(copy.range, (1, 1, 2, 2)); diff --git a/base/src/user_model/common.rs b/base/src/user_model/common.rs index 7a3a69b..2ee1599 100644 --- a/base/src/user_model/common.rs +++ b/base/src/user_model/common.rs @@ -63,30 +63,6 @@ pub struct BorderArea { r#type: BorderType, } -fn guess_delimiter(data: &str) -> char { - let delimiters = [',', ';', '\t', '|', ':']; - let mut best_delim = ','; - let mut max_fields = 0; - - for &delim in &delimiters { - let mut fields_per_line = Vec::new(); - - for line in data.lines() { - let fields = line.split(delim).count(); - fields_per_line.push(fields); - } - - let first_count = fields_per_line.first().copied().unwrap_or(0); - - if fields_per_line.iter().all(|&count| count == first_count) && first_count > max_fields { - max_fields = first_count; - best_delim = delim; - } - } - - best_delim -} - fn boolean(value: &str) -> Result { match value { "true" => Ok(true), @@ -1510,7 +1486,7 @@ impl UserModel { pub fn copy_to_clipboard(&self) -> Result { let selected_area = self.get_selected_view(); let sheet = selected_area.sheet; - let mut wtr = WriterBuilder::new().from_writer(vec![]); + let mut wtr = WriterBuilder::new().delimiter(b'\t').from_writer(vec![]); let mut data = HashMap::new(); let [row_start, column_start, row_end, column_end] = selected_area.range; @@ -1669,12 +1645,9 @@ impl UserModel { let mut row = area.row; let mut column = area.column; let mut csv_reader = Cursor::new(csv); - - let delimiter = guess_delimiter(csv) as u8; - // Reset the cursor to the beginning after sniffing csv_reader.set_position(0); let mut reader = ReaderBuilder::new() - .delimiter(delimiter) + .delimiter(b'\t') .has_headers(false) .from_reader(csv_reader); for record in reader.records() { @@ -2030,8 +2003,6 @@ mod tests { user_model::common::{horizontal, vertical}, }; - use super::guess_delimiter; - #[test] fn test_vertical() { let all = vec![ @@ -2062,11 +2033,4 @@ mod tests { assert_eq!(horizontal(&format!("{}", a)), Ok(a)); } } - - #[test] - fn test_guess_delimiter() { - assert_eq!(guess_delimiter("1,2,3\n4,5,6"), ','); - assert_eq!(guess_delimiter("1\t2\t3\n4\t5\t6"), '\t'); - assert_eq!(guess_delimiter("1"), ','); - } }