diff --git a/docx-core/examples/reader.rs b/docx-core/examples/reader.rs index af3ec9c..200e955 100644 --- a/docx-core/examples/reader.rs +++ b/docx-core/examples/reader.rs @@ -3,7 +3,7 @@ use std::fs::*; use std::io::Read; pub fn main() { - let mut file = File::open("./insert.docx").unwrap(); + let mut file = File::open("./1/1.docx").unwrap(); let mut buf = vec![]; file.read_to_end(&mut buf).unwrap(); dbg!(read_docx(&buf).unwrap().json()); diff --git a/docx-core/src/documents/elements/table.rs b/docx-core/src/documents/elements/table.rs index 9b378c1..d63eb72 100644 --- a/docx-core/src/documents/elements/table.rs +++ b/docx-core/src/documents/elements/table.rs @@ -37,7 +37,7 @@ impl Table { self } - pub fn indent(mut self, v: usize) -> Table { + pub fn indent(mut self, v: i32) -> Table { self.property = self.property.indent(v); self } diff --git a/docx-core/src/documents/elements/table_indent.rs b/docx-core/src/documents/elements/table_indent.rs index 0487f6c..f316d23 100644 --- a/docx-core/src/documents/elements/table_indent.rs +++ b/docx-core/src/documents/elements/table_indent.rs @@ -7,12 +7,12 @@ use crate::xml_builder::*; #[derive(Debug, Clone, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct TableIndent { - width: usize, + width: i32, width_type: WidthType, } impl TableIndent { - pub fn new(width: usize, width_type: WidthType) -> TableIndent { + pub fn new(width: i32, width_type: WidthType) -> TableIndent { TableIndent { width, width_type } } } diff --git a/docx-core/src/documents/elements/table_property.rs b/docx-core/src/documents/elements/table_property.rs index ec7c406..b46fc2d 100644 --- a/docx-core/src/documents/elements/table_property.rs +++ b/docx-core/src/documents/elements/table_property.rs @@ -32,7 +32,7 @@ impl TableProperty { Default::default() } - pub fn indent(mut self, v: usize) -> TableProperty { + pub fn indent(mut self, v: i32) -> TableProperty { self.indent = Some(TableIndent::new(v, WidthType::DXA)); self } diff --git a/docx-core/src/reader/attributes/width.rs b/docx-core/src/reader/attributes/width.rs index 8df5b50..f65932a 100644 --- a/docx-core/src/reader/attributes/width.rs +++ b/docx-core/src/reader/attributes/width.rs @@ -6,7 +6,7 @@ use crate::types::*; use super::super::errors::*; -pub fn read_width(attrs: &[OwnedAttribute]) -> Result<(usize, WidthType), ReaderError> { +pub fn read_width(attrs: &[OwnedAttribute]) -> Result<(isize, WidthType), ReaderError> { let mut w = 0; let mut width_type = WidthType::Auto; for a in attrs { @@ -14,7 +14,7 @@ pub fn read_width(attrs: &[OwnedAttribute]) -> Result<(usize, WidthType), Reader if local_name == "type" { width_type = WidthType::from_str(&a.value)?; } else if local_name == "w" { - w = usize::from_str(&a.value)?; + w = isize::from_str(&a.value)?; } } Ok((w, width_type)) diff --git a/docx-core/src/reader/table.rs b/docx-core/src/reader/table.rs index d76f099..6d4a5e2 100644 --- a/docx-core/src/reader/table.rs +++ b/docx-core/src/reader/table.rs @@ -25,7 +25,7 @@ impl ElementReader for Table { } XMLElement::TableWidth => { let (w, width_type) = read_width(&attributes)?; - t = t.width(w, width_type); + t = t.width(w as usize, width_type); continue; } XMLElement::Justification => { @@ -33,7 +33,7 @@ impl ElementReader for Table { } XMLElement::TableIndent => { let (w, _) = read_width(&attributes)?; - t = t.indent(w); + t = t.indent(w as i32); continue; } XMLElement::TableBorders => { @@ -44,7 +44,7 @@ impl ElementReader for Table { } XMLElement::GridCol => { let (w, _) = read_width(&attributes)?; - grid_col.push(w); + grid_col.push(w as usize); } _ => {} } diff --git a/docx-core/src/reader/table_cell.rs b/docx-core/src/reader/table_cell.rs index b730a51..16443cb 100644 --- a/docx-core/src/reader/table_cell.rs +++ b/docx-core/src/reader/table_cell.rs @@ -45,13 +45,19 @@ impl ElementReader for TableCell { cell = cell.width(w, width_type); } XMLElement::TableGridSpan => { - cell = cell - .grid_span(usize::from_str(&attributes[0].value)?) + if let Some(a) = &attributes.get(0) { + cell = cell.grid_span(usize::from_str(&a.value)?) + } } XMLElement::TableVMerge => { - cell = cell.vertical_merge(VMergeType::from_str( - &attributes[0].value, - )?); + if let Some(a) = &attributes.get(0) { + cell = cell.vertical_merge(VMergeType::from_str( + &a.value, + )?); + } else { + // Treat as a continue without attribute + cell = cell.vertical_merge(VMergeType::Continue) + } } XMLElement::TableCellBorders => { // TODO: Support table cell borders later @@ -126,4 +132,31 @@ mod tests { .vertical_merge(VMergeType::Restart), ); } + + #[test] + fn test_read_no_attr_vmerge() { + let c = r#" + + + + + + + + + + + + +"#; + let mut parser = EventReader::new(c.as_bytes()); + let cell = TableCell::read(&mut parser, &[]).unwrap(); + assert_eq!( + cell, + TableCell::new() + .add_paragraph(Paragraph::new().add_run(Run::new())) + .width(6425, WidthType::DXA) + .vertical_merge(VMergeType::Continue), + ); + } } diff --git a/docx-wasm/package.json b/docx-wasm/package.json index 2e520a9..39fde53 100644 --- a/docx-wasm/package.json +++ b/docx-wasm/package.json @@ -1,6 +1,6 @@ { "name": "docx-wasm", - "version": "0.0.48", + "version": "0.0.52", "main": "dist/node/index.js", "browser": "dist/web/index.js", "author": "bokuweb ", diff --git a/docx-wasm/src/table.rs b/docx-wasm/src/table.rs index ca9032b..3561bad 100644 --- a/docx-wasm/src/table.rs +++ b/docx-wasm/src/table.rs @@ -29,7 +29,7 @@ impl Table { self } - pub fn indent(mut self, v: usize) -> Table { + pub fn indent(mut self, v: i32) -> Table { self.0 = self.0.indent(v); self }