Support level override writer (#77)

* fix: Support level override

* 0.0.75
main
bokuweb 2020-06-04 17:53:37 +09:00 committed by GitHub
parent 880f9802bc
commit a6245193d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 166 additions and 30 deletions

View File

@ -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<u8> {
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#"<w:lvlOverride w:ilvl="1">
<w:startOverride w:val="2" />
</w:lvlOverride>"#
);
}
}
// Example
/*
<w:num w:numId="5">
<w:abstractNumId w:val="0"/>
<w:lvlOverride w:ilvl="0">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="1">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="2">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="3">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="4">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="5">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="6">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="7">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="8">
<w:startOverride w:val="1"/>
</w:lvlOverride>
</w:num>
*/

View File

@ -9,7 +9,7 @@ use serde::Serialize;
pub struct Numbering {
id: usize,
abstract_num_id: usize,
level_overrides: Vec<LevelOverride>,
pub level_overrides: Vec<LevelOverride>,
}
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 {
</w:num>"#
);
}
/* 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#"<w:num w:numId="0">
<w:abstractNumId w:val="2" />
<w:lvlOverride w:ilvl="0">
<w:startOverride w:val="1"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="1">
<w:startOverride w:val="1"/>
</w:lvlOverride>
</w:num>"#
);
}
*/
#[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#"<w:num w:numId="0">
<w:abstractNumId w:val="2" /><w:lvlOverride w:ilvl="0">
<w:startOverride w:val="1" />
</w:lvlOverride><w:lvlOverride w:ilvl="1">
<w:startOverride w:val="1" />
</w:lvlOverride></w:num>"#
);
}
#[test]
fn test_numbering_override_json() {

View File

@ -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");
/*
<w:lvlOverride w:ilvl="0">
<w:startOverride w:val="1"/>
</w:lvlOverride>
*/
open!(open_level_override, "w:lvlOverride", "w:ilvl");
closed_with_str!(start_override, "w:startOverride");
}
#[cfg(test)]

View File

@ -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);
});

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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 <bokuweb12@gmail.com>",

View File

@ -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
}
}

View File

@ -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::*;

View File

@ -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
}
}