From c145ffd621f6cc8e2a9772d8a0ccf1131b697ef3 Mon Sep 17 00:00:00 2001 From: Nick Parente Date: Wed, 23 Oct 2024 20:00:09 -0400 Subject: [PATCH 1/2] bidirertional embedding class --- .gitignore | 3 +- src/document/bidir.rs | 58 ++++++++++++++++++ src/document/hyperlink.rs | 47 ++++++++++++-- src/document/mod.rs | 1 + src/document/paragraph.rs | 6 +- src/document/run.rs | 6 +- ...nk_with_bidirectional_embedding_level.docx | Bin 0 -> 15822 bytes 7 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 src/document/bidir.rs create mode 100644 tests/pandoc/hyperlink_with_bidirectional_embedding_level.docx diff --git a/.gitignore b/.gitignore index 7aa4189..0701c4b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ **/*.rs.bk *.docx Cargo.lock +.DS_Store # IDE .vscode/ @@ -10,4 +11,4 @@ Cargo.lock # Test tests/bbb -tests/aaa/aa/ \ No newline at end of file +tests/aaa/aa/ diff --git a/src/document/bidir.rs b/src/document/bidir.rs new file mode 100644 index 0000000..7b48c17 --- /dev/null +++ b/src/document/bidir.rs @@ -0,0 +1,58 @@ +use hard_xml::{XmlRead, XmlWrite}; +use std::borrow::Cow; + +use crate::{__setter, __xml_test_suites, document::Run}; + +/// A bidirectional embedding, which can nest to more bidirectional embeddings +#[derive(Debug, Default, XmlRead, XmlWrite, Clone)] +#[cfg_attr(test, derive(PartialEq))] +#[xml(tag = "w:dir")] +pub struct BidirectionalEmbedding<'a> { + // A BidirectionalEmbedding can have a number of rich text runs + #[xml(child = "w:r")] + pub runs: Vec>, + // A BidirectionalEmbedding can include nested embedding layers + #[xml(child = "w:dir")] + pub nested_levels: Vec>, +} + +impl<'a> BidirectionalEmbedding<'a> { + __setter!(runs: Vec>); + __setter!(nested_levels: Vec>); + + pub fn iter_text(&self) -> Box> + '_> { + Box::new( + self.runs.iter().flat_map(|run| run.iter_text()).chain( + self.nested_levels + .iter() + .flat_map(|nested| nested.iter_text()), + ), + ) + } + + pub fn iter_text_mut(&mut self) -> Box> + '_> { + Box::new( + self.runs + .iter_mut() + .flat_map(|run| run.iter_text_mut()) + .chain( + self.nested_levels + .iter_mut() + .flat_map(|nested| nested.iter_text_mut()), + ), + ) + } +} + + +__xml_test_suites!( + BidirectionalEmbedding, + BidirectionalEmbedding::default(), + r#""#, + BidirectionalEmbedding::default().runs(vec![Run::default(), Run::default().push_text("text")]), + r#"text"#, + BidirectionalEmbedding::default().nested_levels(vec![ + BidirectionalEmbedding::default().runs(vec![Run::default()]) + ]), + r#""#, +); diff --git a/src/document/hyperlink.rs b/src/document/hyperlink.rs index d0f8578..82e56e3 100644 --- a/src/document/hyperlink.rs +++ b/src/document/hyperlink.rs @@ -3,7 +3,7 @@ use hard_xml::{XmlRead, XmlWrite}; use std::borrow::Cow; -use crate::{__setter, __xml_test_suites, document::Run}; +use crate::{__setter, __xml_test_suites, document::bidir::BidirectionalEmbedding, document::Run}; /// The root element of a hyperlink within the paragraph #[derive(Debug, Default, XmlRead, XmlWrite, Clone)] @@ -18,21 +18,56 @@ pub struct Hyperlink<'a> { pub anchor: Option>, #[xml(child = "w:r")] /// Link content - pub content: Run<'a>, + pub content: Option>, + #[xml(child = "w:dir")] + // Link can contain a bi-directional embedding layer + pub bidirectional_embedding: Option>, } impl<'a> Hyperlink<'a> { __setter!(id: Option>); __setter!(anchor: Option>); - __setter!(content: Run<'a>); + __setter!(content: Option>); + + pub fn text(&self) -> String { + self.iter_text() + .map(|c| c.to_string()) + .collect::>() + .join("") + } + + pub fn iter_text(&self) -> Box> + '_> { + Box::new( + self.content.iter().flat_map(|run| run.iter_text()).chain( + self.bidirectional_embedding + .iter() + .flat_map(|bidi| bidi.iter_text()), + ), + ) + } + + pub fn iter_text_mut(&mut self) -> Box> + '_> { + Box::new( + self.content + .iter_mut() + .flat_map(|run| run.iter_text_mut()) + .chain( + self.bidirectional_embedding + .iter_mut() + .flat_map(|bidi| bidi.iter_text_mut()), + ), + ) + } } __xml_test_suites!( Hyperlink, Hyperlink::default(), - r#""#, + r#""#, Hyperlink::default().id("id"), - r#""#, + r#""#, Hyperlink::default().anchor("anchor"), - r#""#, + r#""#, + Hyperlink::default().content(Run::default()), + r#""#, ); diff --git a/src/document/mod.rs b/src/document/mod.rs index 2c46170..a018232 100644 --- a/src/document/mod.rs +++ b/src/document/mod.rs @@ -1,3 +1,4 @@ +mod bidir; mod body; mod bookmark_end; mod bookmark_start; diff --git a/src/document/paragraph.rs b/src/document/paragraph.rs index 6bc6b10..8514cb9 100644 --- a/src/document/paragraph.rs +++ b/src/document/paragraph.rs @@ -91,7 +91,7 @@ impl<'a> Paragraph<'a> { .iter() .filter_map(|content| match content { ParagraphContent::Run(run) => Some(run.iter_text()), - ParagraphContent::Link(link) => Some(link.content.iter_text()), + ParagraphContent::Link(link) => Some(link.iter_text()), ParagraphContent::SDT(sdt) => Some(sdt.iter_text()), _ => None, }) @@ -104,7 +104,7 @@ impl<'a> Paragraph<'a> { .iter_mut() .filter_map(|content| match content { ParagraphContent::Run(run) => Some(run.iter_text_mut()), - ParagraphContent::Link(link) => Some(link.content.iter_text_mut()), + ParagraphContent::Link(link) => Some(link.iter_text_mut()), _ => None, }) .flatten() @@ -156,7 +156,7 @@ __xml_test_suites!( Paragraph::default().push(Run::default()), r#""#, Paragraph::default().push(Hyperlink::default()), - r#""#, + r#""#, Paragraph::default().push(BookmarkStart::default()), r#""#, Paragraph::default().push(BookmarkEnd::default()), diff --git a/src/document/run.rs b/src/document/run.rs index 39d95e1..bef09dc 100644 --- a/src/document/run.rs +++ b/src/document/run.rs @@ -131,8 +131,8 @@ impl<'a> Run<'a> { })) } - pub fn iter_text_mut(&mut self) -> impl Iterator> { - self.content.iter_mut().filter_map(|content| match content { + pub fn iter_text_mut(&mut self) -> Box> + '_> { + Box::new(self.content.iter_mut().filter_map(|content| match content { RunContent::Text(Text { text, .. }) => Some(text), RunContent::InstrText(InstrText { text, .. }) => Some(text), RunContent::Break(_) => None, @@ -144,7 +144,7 @@ impl<'a> Run<'a> { RunContent::CarriageReturn(_) => None, RunContent::Drawing(_) => None, _ => None, - }) + })) } pub fn replace_text_simple(&mut self, old: S, new: S) diff --git a/tests/pandoc/hyperlink_with_bidirectional_embedding_level.docx b/tests/pandoc/hyperlink_with_bidirectional_embedding_level.docx new file mode 100644 index 0000000000000000000000000000000000000000..40747d6b201ac11c84921fdba6b2893d855956ff GIT binary patch literal 15822 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 Date: Wed, 23 Oct 2024 20:02:29 -0400 Subject: [PATCH 2/2] cargo fmt --- src/document/bidir.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/document/bidir.rs b/src/document/bidir.rs index 7b48c17..768415b 100644 --- a/src/document/bidir.rs +++ b/src/document/bidir.rs @@ -44,7 +44,6 @@ impl<'a> BidirectionalEmbedding<'a> { } } - __xml_test_suites!( BidirectionalEmbedding, BidirectionalEmbedding::default(),