Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions docx-core/src/documents/elements/paragraph_property.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ pub struct ParagraphProperty {
pub adjust_right_ind: Option<AdjustRightInd>,
#[serde(skip_serializing_if = "Option::is_none")]
pub snap_to_grid: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shading: Option<Shading>,
// read only
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) div_id: Option<String>,
Expand Down Expand Up @@ -109,6 +111,11 @@ impl ParagraphProperty {
self
}

pub fn shading(mut self, shd: Shading) -> Self {
self.shading = Some(shd);
self
}

pub fn keep_next(mut self, v: bool) -> Self {
self.keep_next = Some(v);
self
Expand Down Expand Up @@ -229,6 +236,7 @@ impl BuildXML for ParagraphProperty {
.add_optional_child(&self.outline_lvl)?
.add_optional_child(&self.paragraph_property_change)?
.add_optional_child(&self.borders)?
.add_optional_child(&self.shading)?
.add_optional_child(&self.text_alignment)?
.add_optional_child(&self.adjust_right_ind)?
.apply_opt(self.snap_to_grid, |v, b| b.snap_to_grid(v))?
Expand Down
34 changes: 34 additions & 0 deletions docx-core/src/reader/paragraph_property.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,11 @@ impl ElementReader for ParagraphProperty {
p = p.set_borders(borders);
}
}
XMLElement::Shading => {
if let Ok(shd) = Shading::read(r, &attributes) {
p = p.shading(shd);
}
}
XMLElement::Tabs => {
if let Ok(tabs) = Tabs::read(r, &attributes) {
for t in tabs.tabs {
Expand All @@ -157,3 +162,32 @@ impl ElementReader for ParagraphProperty {
}
}
}

#[cfg(test)]
mod tests {
use super::*;
#[cfg(test)]
use pretty_assertions::assert_eq;
use std::io::Cursor;

#[test]
fn test_read_paragraph_shading() {
// Word paints paragraph-wide shading from <w:pPr><w:shd>; dropping
// it loses code-block backgrounds (office2pdf#351).
let xml = r#"<w:pPr xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:shd w:val="clear" w:fill="F4F4F4"/>
</w:pPr>"#;
let mut parser = EventReader::new(Cursor::new(xml));
// consume the StartElement for pPr first, mirroring Document::read
loop {
if let Ok(XmlEvent::StartElement { name, .. }) = parser.next() {
if name.local_name == "pPr" {
break;
}
}
}
let p = ParagraphProperty::read(&mut parser, &[]).unwrap();
let shd = p.shading.expect("paragraph shading must be parsed");
assert_eq!(shd.fill, "F4F4F4");
}
}
Loading