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 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
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|
||||||
|
|||||||
@@ -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"), ',');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user