FIX: Issues with paste

Copy/Paste is always with tab separated values not "," or others.
Maybe we can add that?
This commit is contained in:
Nicolás Hatcher
2024-11-27 22:48:31 +01:00
committed by Nicolás Hatcher Andrés
parent 283a44e109
commit c1df2cec0b
3 changed files with 10 additions and 42 deletions

View File

@@ -8,6 +8,10 @@
- New document server (Thanks Dani!) - New document server (Thanks Dani!)
- New function FORMULATEXT - New function FORMULATEXT
### Fixed
- Fixed several issues with pasting content
## [0.2.0] - 2024-11-06 (The HN release) ## [0.2.0] - 2024-11-06 (The HN release)
### Added ### Added

View File

@@ -9,7 +9,7 @@ fn csv_paste() {
assert_eq!(model.get_formatted_cell_value(0, 7, 7), Ok("0".to_string())); assert_eq!(model.get_formatted_cell_value(0, 7, 7), Ok("0".to_string()));
// paste some numbers in B4:C7 // 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 { let area = Area {
sheet: 0, sheet: 0,
row: 4, row: 4,
@@ -88,7 +88,7 @@ fn cut_paste() {
model.update_range_style(&range, "font.b", "true").unwrap(); model.update_range_style(&range, "font.b", "true").unwrap();
model 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(); .unwrap();
// Select A1:B2 and copy // Select A1:B2 and copy
@@ -136,7 +136,7 @@ fn copy_paste_internal() {
model.update_range_style(&range, "font.b", "true").unwrap(); model.update_range_style(&range, "font.b", "true").unwrap();
model 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(); .unwrap();
// Select A1:B2 and copy // Select A1:B2 and copy
@@ -144,7 +144,7 @@ fn copy_paste_internal() {
let copy = model.copy_to_clipboard().unwrap(); let copy = model.copy_to_clipboard().unwrap();
assert_eq!( assert_eq!(
copy.csv, 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)); assert_eq!(copy.range, (1, 1, 2, 2));

View File

@@ -63,30 +63,6 @@ pub struct BorderArea {
r#type: BorderType, 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<bool, String> { fn boolean(value: &str) -> Result<bool, String> {
match value { match value {
"true" => Ok(true), "true" => Ok(true),
@@ -1510,7 +1486,7 @@ impl UserModel {
pub fn copy_to_clipboard(&self) -> Result<Clipboard, String> { pub fn copy_to_clipboard(&self) -> Result<Clipboard, String> {
let selected_area = self.get_selected_view(); let selected_area = self.get_selected_view();
let sheet = selected_area.sheet; 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 mut data = HashMap::new();
let [row_start, column_start, row_end, column_end] = selected_area.range; 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 row = area.row;
let mut column = area.column; let mut column = area.column;
let mut csv_reader = Cursor::new(csv); 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); csv_reader.set_position(0);
let mut reader = ReaderBuilder::new() let mut reader = ReaderBuilder::new()
.delimiter(delimiter) .delimiter(b'\t')
.has_headers(false) .has_headers(false)
.from_reader(csv_reader); .from_reader(csv_reader);
for record in reader.records() { for record in reader.records() {
@@ -2030,8 +2003,6 @@ mod tests {
user_model::common::{horizontal, vertical}, user_model::common::{horizontal, vertical},
}; };
use super::guess_delimiter;
#[test] #[test]
fn test_vertical() { fn test_vertical() {
let all = vec![ let all = vec![
@@ -2062,11 +2033,4 @@ mod tests {
assert_eq!(horizontal(&format!("{}", a)), Ok(a)); 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"), ',');
}
} }