diff --git a/docx-core/examples/reader.rs b/docx-core/examples/reader.rs index 200e955..00da286 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("./1/1.docx").unwrap(); + let mut file = File::open("./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/numbering_property.rs b/docx-core/src/documents/elements/numbering_property.rs index fa6704e..f536516 100644 --- a/docx-core/src/documents/elements/numbering_property.rs +++ b/docx-core/src/documents/elements/numbering_property.rs @@ -7,13 +7,28 @@ use crate::xml_builder::*; #[derive(Debug, Clone, PartialEq)] pub struct NumberingProperty { - pub id: NumberingId, - pub level: IndentLevel, + pub id: Option, + pub level: Option, +} + +impl Default for NumberingProperty { + fn default() -> Self { + NumberingProperty { + id: None, + level: None, + } + } } impl NumberingProperty { - pub fn new(id: NumberingId, level: IndentLevel) -> NumberingProperty { - Self { id, level } + pub fn new() -> NumberingProperty { + Default::default() + } + + pub fn add_num(mut self, id: NumberingId, level: IndentLevel) -> NumberingProperty { + self.id = Some(id); + self.level = Some(level); + self } } @@ -21,8 +36,8 @@ impl BuildXML for NumberingProperty { fn build(&self) -> Vec { let b = XMLBuilder::new(); b.open_numbering_property() - .add_child(&self.id) - .add_child(&self.level) + .add_optional_child(&self.id) + .add_optional_child(&self.level) .close() .build() } @@ -34,8 +49,17 @@ impl Serialize for NumberingProperty { S: Serializer, { let mut t = serializer.serialize_struct("NumberProperty", 2)?; - t.serialize_field("id", &self.id.id)?; - t.serialize_field("level", &self.level.val)?; + let mut id: Option = None; + if let Some(n) = &self.id { + id = Some(n.id); + } + t.serialize_field("id", &id)?; + + let mut level: Option = None; + if let Some(n) = &self.level { + level = Some(n.val); + } + t.serialize_field("level", &level)?; t.end() } } @@ -50,11 +74,33 @@ mod tests { #[test] fn test_num_property() { - let c = NumberingProperty::new(NumberingId::new(0), IndentLevel::new(3)); + let c = NumberingProperty::new().add_num(NumberingId::new(0), IndentLevel::new(3)); let b = c.build(); assert_eq!( str::from_utf8(&b).unwrap(), r#""# ); } + + #[test] + fn test_empty_num_property() { + let c = NumberingProperty::new(); + let b = c.build(); + assert_eq!(str::from_utf8(&b).unwrap(), r#""#); + } + + #[test] + fn test_num_property_json() { + let c = NumberingProperty::new().add_num(NumberingId::new(0), IndentLevel::new(3)); + assert_eq!(serde_json::to_string(&c).unwrap(), r#"{"id":0,"level":3}"#); + } + + #[test] + fn test_empty_num_property_json() { + let c = NumberingProperty::new(); + assert_eq!( + serde_json::to_string(&c).unwrap(), + r#"{"id":null,"level":null}"# + ); + } } diff --git a/docx-core/src/documents/elements/paragraph_property.rs b/docx-core/src/documents/elements/paragraph_property.rs index 8e7ae75..504e8a3 100644 --- a/docx-core/src/documents/elements/paragraph_property.rs +++ b/docx-core/src/documents/elements/paragraph_property.rs @@ -60,7 +60,7 @@ impl ParagraphProperty { } pub fn numbering(mut self, id: NumberingId, level: IndentLevel) -> Self { - self.numbering_property = Some(NumberingProperty::new(id, level)); + self.numbering_property = Some(NumberingProperty::new().add_num(id, level)); self } } diff --git a/docx-core/src/reader/numbering_property.rs b/docx-core/src/reader/numbering_property.rs index fce8f19..18cc584 100644 --- a/docx-core/src/reader/numbering_property.rs +++ b/docx-core/src/reader/numbering_property.rs @@ -36,9 +36,9 @@ impl ElementReader for NumberingProperty { let e = XMLElement::from_str(&name.local_name).unwrap(); if e == XMLElement::NumberingProperty { if id.is_none() || level.is_none() { - return Err(ReaderError::XMLReadError); + return Ok(NumberingProperty::new()); } - let np = NumberingProperty::new( + let np = NumberingProperty::new().add_num( NumberingId::new(id.unwrap()), IndentLevel::new(level.unwrap()), ); diff --git a/docx-core/src/reader/paragraph.rs b/docx-core/src/reader/paragraph.rs index 81a74d8..cc03c2c 100644 --- a/docx-core/src/reader/paragraph.rs +++ b/docx-core/src/reader/paragraph.rs @@ -94,7 +94,9 @@ impl ElementReader for Paragraph { } XMLElement::NumberingProperty => { let num_pr = NumberingProperty::read(r, attrs)?; - p = p.numbering(num_pr.id, num_pr.level); + if num_pr.id.is_some() && num_pr.level.is_some() { + p = p.numbering(num_pr.id.unwrap(), num_pr.level.unwrap()); + } continue; } _ => {} @@ -244,10 +246,9 @@ mod tests { property: ParagraphProperty { run_property: RunProperty::new(), style: ParagraphStyle::new(s), - numbering_property: Some(NumberingProperty::new( - NumberingId::new(1), - IndentLevel::new(0), - )), + numbering_property: Some( + NumberingProperty::new().add_num(NumberingId::new(1), IndentLevel::new(0),) + ), alignment: None, indent: None, }, diff --git a/docx-wasm/js/json/paragraph.ts b/docx-wasm/js/json/paragraph.ts index 904c9fa..4e3e0fc 100644 --- a/docx-wasm/js/json/paragraph.ts +++ b/docx-wasm/js/json/paragraph.ts @@ -9,8 +9,8 @@ export type ParagraphChildJSON = | BookmarkEndJSON; export type NumberingPropertyJSON = { - id: number; - level: number; + id: number | null; + level: number | null; }; export type ParagraphPropertyJSON = { diff --git a/docx-wasm/package.json b/docx-wasm/package.json index 7de402f..67ac230 100644 --- a/docx-wasm/package.json +++ b/docx-wasm/package.json @@ -1,6 +1,6 @@ { "name": "docx-wasm", - "version": "0.0.53", + "version": "0.0.54", "main": "dist/node/index.js", "browser": "dist/web/index.js", "author": "bokuweb ",