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:
committed by
Nicolás Hatcher Andrés
parent
283a44e109
commit
c1df2cec0b
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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<bool, String> {
|
||||
match value {
|
||||
"true" => Ok(true),
|
||||
@@ -1510,7 +1486,7 @@ impl UserModel {
|
||||
pub fn copy_to_clipboard(&self) -> Result<Clipboard, String> {
|
||||
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"), ',');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user