diff --git a/docx-core/src/documents/elements/level_override.rs b/docx-core/src/documents/elements/level_override.rs index a6d6bcb..df2e227 100644 --- a/docx-core/src/documents/elements/level_override.rs +++ b/docx-core/src/documents/elements/level_override.rs @@ -1,5 +1,5 @@ use crate::documents::BuildXML; -// use crate::xml_builder::*; +use crate::xml_builder::*; use serde::Serialize; @@ -25,9 +25,70 @@ impl LevelOverride { } } -// TODO: Now read only impl BuildXML for LevelOverride { fn build(&self) -> Vec { - vec![] + let mut b = XMLBuilder::new(); + b = b.open_level_override(&format!("{}", self.level)); + + if let Some(start) = self.start { + b = b.start_override(&format!("{}", start)); + } + + b.close().build() } } + +#[cfg(test)] +mod tests { + + use super::*; + #[cfg(test)] + use pretty_assertions::assert_eq; + use std::str; + + #[test] + fn test_level_override() { + let c = LevelOverride::new(1).start(2); + let b = c.build(); + assert_eq!( + str::from_utf8(&b).unwrap(), + r#" + +"# + ); + } +} + +// Example +/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +*/ diff --git a/docx-core/src/documents/elements/numbering.rs b/docx-core/src/documents/elements/numbering.rs index 42b8de6..93555b3 100644 --- a/docx-core/src/documents/elements/numbering.rs +++ b/docx-core/src/documents/elements/numbering.rs @@ -9,7 +9,7 @@ use serde::Serialize; pub struct Numbering { id: usize, abstract_num_id: usize, - level_overrides: Vec, + pub level_overrides: Vec, } impl Numbering { @@ -25,6 +25,11 @@ impl Numbering { self.level_overrides = overrides; self } + + pub fn add_override(mut self, o: LevelOverride) -> Self { + self.level_overrides.push(o); + self + } } impl BuildXML for Numbering { @@ -32,7 +37,11 @@ impl BuildXML for Numbering { let b = XMLBuilder::new(); let id = format!("{}", self.id); let abs_id = format!("{}", self.abstract_num_id); - b.open_num(&id).abstract_num_id(&abs_id).close().build() + b.open_num(&id) + .abstract_num_id(&abs_id) + .add_children(&self.level_overrides) + .close() + .build() } } @@ -55,29 +64,24 @@ mod tests { "# ); } - /* TODO: enable when builder implemented - #[test] - fn test_numbering_override() { - let c = Numbering::new(0, 2); - let overrides = vec![ - LevelOverride::new(0).start(1), - LevelOverride::new(1).start(1), - ]; - let b = c.overrides(overrides).build(); - assert_eq!( - str::from_utf8(&b).unwrap(), - r#" - - - - - - - - "# - ); - } - */ + #[test] + fn test_numbering_override() { + let c = Numbering::new(0, 2); + let overrides = vec![ + LevelOverride::new(0).start(1), + LevelOverride::new(1).start(1), + ]; + let b = c.overrides(overrides).build(); + assert_eq!( + str::from_utf8(&b).unwrap(), + r#" + + + + +"# + ); + } #[test] fn test_numbering_override_json() { diff --git a/docx-core/src/xml_builder/elements.rs b/docx-core/src/xml_builder/elements.rs index e65d07b..992049a 100644 --- a/docx-core/src/xml_builder/elements.rs +++ b/docx-core/src/xml_builder/elements.rs @@ -228,6 +228,14 @@ impl XMLBuilder { open!(open_wp_shape, "wps:wsp"); open!(open_wp_text_box, "wps:txbx"); open!(open_text_box_content, "w:txbxContent"); + + /* + + + + */ + open!(open_level_override, "w:lvlOverride", "w:ilvl"); + closed_with_str!(start_override, "w:startOverride"); } #[cfg(test)] diff --git a/docx-wasm/js/index.ts b/docx-wasm/js/index.ts index f34a81f..ef94df7 100644 --- a/docx-wasm/js/index.ts +++ b/docx-wasm/js/index.ts @@ -410,6 +410,13 @@ export class Docx { this.numberings.forEach((n) => { let num = wasm.createNumbering(n.id, n.abstractNumId); + n.overrides.forEach((o) => { + let levelOverride = wasm.createLevelOverride(o.level); + if (o.startOverride !== null) { + levelOverride = levelOverride.start(o.startOverride); + } + num = num.add_override(levelOverride); + }); docx = docx.add_numbering(num); }); diff --git a/docx-wasm/js/level.ts b/docx-wasm/js/level.ts index 1a0f94c..3219796 100644 --- a/docx-wasm/js/level.ts +++ b/docx-wasm/js/level.ts @@ -30,8 +30,22 @@ export class Level { this.paragraphProperty.indent = { left, specialIndentKind, - specialIndentSize + specialIndentSize, }; return this; } } + +export class LevelOverride { + level: number; + startOverride: number | null = null; + + constructor(level: number) { + this.level = level; + } + + start(start: number) { + this.startOverride = start; + return this; + } +} diff --git a/docx-wasm/js/numbering.ts b/docx-wasm/js/numbering.ts index f6889af..a97078d 100644 --- a/docx-wasm/js/numbering.ts +++ b/docx-wasm/js/numbering.ts @@ -1,8 +1,16 @@ +import { LevelOverride } from "./level"; + export class Numbering { id: number; abstractNumId: number; + overrides: LevelOverride[]; + constructor(id: number, abstractNumId: number) { this.id = id; this.abstractNumId = abstractNumId; } + + addOverride(o: LevelOverride) { + this.overrides.push(o); + } } diff --git a/docx-wasm/package.json b/docx-wasm/package.json index db4a6ca..54b7ede 100644 --- a/docx-wasm/package.json +++ b/docx-wasm/package.json @@ -1,6 +1,6 @@ { "name": "docx-wasm", - "version": "0.0.72", + "version": "0.0.75", "main": "dist/node/index.js", "browser": "dist/web/index.js", "author": "bokuweb ", diff --git a/docx-wasm/src/level_override.rs b/docx-wasm/src/level_override.rs new file mode 100644 index 0000000..5722653 --- /dev/null +++ b/docx-wasm/src/level_override.rs @@ -0,0 +1,24 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +#[derive(Debug)] +pub struct LevelOverride(docx_rs::LevelOverride); + +#[wasm_bindgen(js_name = createLevelOverride)] +pub fn create_level_override(level: usize) -> LevelOverride { + LevelOverride(docx_rs::LevelOverride::new(level)) +} + +impl LevelOverride { + pub fn take(self) -> docx_rs::LevelOverride { + self.0 + } +} + +#[wasm_bindgen] +impl LevelOverride { + pub fn start(mut self, start: usize) -> Self { + self.0 = self.0.start(start); + self + } +} diff --git a/docx-wasm/src/lib.rs b/docx-wasm/src/lib.rs index e34387b..8d0df4f 100644 --- a/docx-wasm/src/lib.rs +++ b/docx-wasm/src/lib.rs @@ -5,6 +5,7 @@ mod delete; mod doc; mod insert; mod level; +mod level_override; mod numbering; mod paragraph; mod reader; @@ -21,6 +22,7 @@ pub use delete::*; pub use doc::*; pub use insert::*; pub use level::*; +pub use level_override::*; pub use numbering::*; pub use paragraph::*; pub use reader::*; diff --git a/docx-wasm/src/numbering.rs b/docx-wasm/src/numbering.rs index fc14159..4ee5479 100644 --- a/docx-wasm/src/numbering.rs +++ b/docx-wasm/src/numbering.rs @@ -14,3 +14,11 @@ impl Numbering { self.0 } } + +#[wasm_bindgen] +impl Numbering { + pub fn add_override(mut self, o: super::LevelOverride) -> Self { + self.0.level_overrides.push(o.take()); + self + } +}