From 9f52bdd6e7d075613d76d5c40894666fe0b461a4 Mon Sep 17 00:00:00 2001 From: bokuweb Date: Wed, 4 Dec 2019 16:55:03 +0900 Subject: [PATCH] feat: Support bookmark --- .../src/documents/elements/bookmark_end.rs | 39 ++++++++++++++ .../src/documents/elements/bookmark_start.rs | 40 ++++++++++++++ docx-core/src/documents/elements/mod.rs | 4 ++ docx-core/src/documents/elements/paragraph.rs | 31 ++++++++++- docx-core/src/xml_builder/elements.rs | 3 ++ fixtures/bookmark/[Content_Types].xml | 3 ++ fixtures/bookmark/_rels/.rels | 3 ++ fixtures/bookmark/bookmark.docx | Bin 0 -> 4203 bytes fixtures/bookmark/docProps/app.xml | 2 + fixtures/bookmark/docProps/core.xml | 2 + .../bookmark/word/_rels/document.xml.rels | 3 ++ fixtures/bookmark/word/document.xml | 49 ++++++++++++++++++ fixtures/bookmark/word/fontTable.xml | 2 + fixtures/bookmark/word/settings.xml | 2 + fixtures/bookmark/word/styles.xml | 2 + 15 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 docx-core/src/documents/elements/bookmark_end.rs create mode 100644 docx-core/src/documents/elements/bookmark_start.rs create mode 100644 fixtures/bookmark/[Content_Types].xml create mode 100644 fixtures/bookmark/_rels/.rels create mode 100644 fixtures/bookmark/bookmark.docx create mode 100644 fixtures/bookmark/docProps/app.xml create mode 100644 fixtures/bookmark/docProps/core.xml create mode 100644 fixtures/bookmark/word/_rels/document.xml.rels create mode 100644 fixtures/bookmark/word/document.xml create mode 100644 fixtures/bookmark/word/fontTable.xml create mode 100644 fixtures/bookmark/word/settings.xml create mode 100644 fixtures/bookmark/word/styles.xml diff --git a/docx-core/src/documents/elements/bookmark_end.rs b/docx-core/src/documents/elements/bookmark_end.rs new file mode 100644 index 0000000..d8ddeeb --- /dev/null +++ b/docx-core/src/documents/elements/bookmark_end.rs @@ -0,0 +1,39 @@ +use crate::documents::BuildXML; +use crate::xml_builder::*; + +#[derive(Debug, Clone)] +pub struct BookmarkEnd<'a> { + id: &'a str, +} + +impl<'a> BookmarkEnd<'a> { + pub fn new(id: &'a str) -> BookmarkEnd<'a> { + BookmarkEnd { id } + } +} + +impl<'a> BuildXML for BookmarkEnd<'a> { + fn build(&self) -> Vec { + let b = XMLBuilder::new(); + b.bookmark_end(&self.id).build() + } +} + +#[cfg(test)] +mod tests { + + use super::*; + #[cfg(test)] + use pretty_assertions::assert_eq; + use std::str; + + #[test] + fn test_bookmark_end() { + let c = BookmarkEnd::new("mockid"); + let b = c.build(); + assert_eq!( + str::from_utf8(&b).unwrap(), + r#""# + ); + } +} diff --git a/docx-core/src/documents/elements/bookmark_start.rs b/docx-core/src/documents/elements/bookmark_start.rs new file mode 100644 index 0000000..dd14b0d --- /dev/null +++ b/docx-core/src/documents/elements/bookmark_start.rs @@ -0,0 +1,40 @@ +use crate::documents::BuildXML; +use crate::xml_builder::*; + +#[derive(Debug, Clone)] +pub struct BookmarkStart<'a> { + id: &'a str, + name: &'a str, +} + +impl<'a> BookmarkStart<'a> { + pub fn new(id: &'a str, name: &'a str) -> BookmarkStart<'a> { + BookmarkStart { id, name } + } +} + +impl<'a> BuildXML for BookmarkStart<'a> { + fn build(&self) -> Vec { + let b = XMLBuilder::new(); + b.bookmark_start(&self.id, &self.name).build() + } +} + +#[cfg(test)] +mod tests { + + use super::*; + #[cfg(test)] + use pretty_assertions::assert_eq; + use std::str; + + #[test] + fn test_bookmark_start() { + let c = BookmarkStart::new("mockid", "mockname"); + let b = c.build(); + assert_eq!( + str::from_utf8(&b).unwrap(), + r#""# + ); + } +} diff --git a/docx-core/src/documents/elements/mod.rs b/docx-core/src/documents/elements/mod.rs index a62847f..b459a55 100644 --- a/docx-core/src/documents/elements/mod.rs +++ b/docx-core/src/documents/elements/mod.rs @@ -1,6 +1,8 @@ mod based_on; mod bold; mod bold_cs; +mod bookmark_end; +mod bookmark_start; mod br; mod color; mod default_tab_stop; @@ -49,6 +51,8 @@ mod zoom; pub use based_on::*; pub use bold::*; pub use bold_cs::*; +pub use bookmark_end::*; +pub use bookmark_start::*; pub use br::*; pub use color::*; pub use default_tab_stop::*; diff --git a/docx-core/src/documents/elements/paragraph.rs b/docx-core/src/documents/elements/paragraph.rs index 9fcf45c..243d056 100644 --- a/docx-core/src/documents/elements/paragraph.rs +++ b/docx-core/src/documents/elements/paragraph.rs @@ -1,4 +1,4 @@ -use super::{Delete, Insert, ParagraphProperty, Run}; +use super::{BookmarkEnd, BookmarkStart, Delete, Insert, ParagraphProperty, Run}; use crate::documents::BuildXML; use crate::types::*; use crate::xml_builder::*; @@ -25,6 +25,8 @@ pub enum ParagraphChild<'a> { Run(Run), Insert(Insert<'a>), Delete(Delete<'a>), + BookmarkStart(BookmarkStart<'a>), + BookmarkEnd(BookmarkEnd<'a>), } impl<'a> BuildXML for ParagraphChild<'a> { @@ -33,6 +35,8 @@ impl<'a> BuildXML for ParagraphChild<'a> { ParagraphChild::Run(v) => v.build(), ParagraphChild::Insert(v) => v.build(), ParagraphChild::Delete(v) => v.build(), + ParagraphChild::BookmarkStart(v) => v.build(), + ParagraphChild::BookmarkEnd(v) => v.build(), } } } @@ -62,6 +66,18 @@ impl<'a> Paragraph<'a> { self } + pub fn add_bookmark_start(mut self, id: &'a str, name: &'a str) -> Paragraph<'a> { + self.children + .push(ParagraphChild::BookmarkStart(BookmarkStart::new(id, name))); + self + } + + pub fn add_bookmark_end(mut self, id: &'a str) -> Paragraph<'a> { + self.children + .push(ParagraphChild::BookmarkEnd(BookmarkEnd::new(id))); + self + } + pub fn align(mut self, alignment_type: AlignmentType) -> Paragraph<'a> { self.property = self.property.align(alignment_type); self @@ -128,4 +144,17 @@ mod tests { r#"Hello"# ); } + + #[test] + fn test_bookmark() { + let b = Paragraph::new() + .add_bookmark_start("1234-5678", "article") + .add_run(Run::new().add_text("Hello")) + .add_bookmark_end("1234-5678") + .build(); + assert_eq!( + str::from_utf8(&b).unwrap(), + r#"Hello"# + ); + } } diff --git a/docx-core/src/xml_builder/elements.rs b/docx-core/src/xml_builder/elements.rs index a5b552f..b43bf27 100644 --- a/docx-core/src/xml_builder/elements.rs +++ b/docx-core/src/xml_builder/elements.rs @@ -167,6 +167,9 @@ impl XMLBuilder { opened_el!(open_insert, "w:ins", "w:id", "w:author", "w:data"); opened_el!(open_delete, "w:del", "w:id", "w:author", "w:data"); + + closed_el!(bookmark_start, "w:bookmarkStart", "w:id", "w:name"); + closed_el!(bookmark_end, "w:bookmarkEnd", "w:id"); } #[cfg(test)] diff --git a/fixtures/bookmark/[Content_Types].xml b/fixtures/bookmark/[Content_Types].xml new file mode 100644 index 0000000..dc111cb --- /dev/null +++ b/fixtures/bookmark/[Content_Types].xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/fixtures/bookmark/_rels/.rels b/fixtures/bookmark/_rels/.rels new file mode 100644 index 0000000..f0b72e7 --- /dev/null +++ b/fixtures/bookmark/_rels/.rels @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/fixtures/bookmark/bookmark.docx b/fixtures/bookmark/bookmark.docx new file mode 100644 index 0000000000000000000000000000000000000000..11e8ac67040e449455cf590a62cb25a65d6837fb GIT binary patch literal 4203 zcmaJ^2UHV_5+x8w5RlN3CQT_S5SmC2<%tFYhN9GfbO^mS0R^8Bigb~V^s4kCCA0tm zqzXt81r!h|N_hgxPkcq5|9@xC*|U4j&hE~gJ2Q85;AB8X5-=D{azj2$o8*L15w210 z)@Tn=5#qT#UJFhJqrSiSl}UAD4t?Q4@6aBviVN>9C@gh-V|WN8VPAec4?ESQ6Pb;B z?)Q0%W7KKrTQ(vcgMoFH*u&h!Mw-MNd}kCy&zg^kHr-TwIDS3VM7U%=EZ2hmTI_>v z&GlkQs9RAQkBv4GCx4r_x-iadu5SNPuy}SBbmFB$uW>VJ?V-leWodurD*mwZHf9AT zmDMsLOb9=#5%VX0#cp35B$KFpP3^u0&#}Fv zOCbI^4n1P_7BiUJInBP4r2_|nSB3$6(}Z{xNJ&U^{x2dB!V^|5mOAb(t{$QmuC5}! zPUwudLFZ0xNZ4l3DXL{Q)%bobKF#s7yNtzgYtk)-jMCCcG+^l)pZ3m0FCEOzoR&DC zU~X01HT4dIL|30nU5>IcPa5lyKId0yRsfGzPc*;}84C8D;Wfmtx6%x$Dw9FsKz8^j z?*UW(joM-SBY~Oowwo%V(7s`v`q%8_FA$vmPc`00F)<>*2KO=#02&ot6LiN^6A04{ z7NwGEZF%g4l^_8+U}3Q3vW|DsD(tDJJowu}kZodD4c#*+3Sbs|!7i@)NCc%R-NS|0 zeP30CnL#rajWM*sc&y886L9xdcRaDHthoBBP(hn?Gf=As>}nixGE}KnTqAr{sSDk= zsu5F`f!!N~d-2T0s`Bwkkxv6xX9VA+G{Me6%Z!c)h=Ra$OCPuS0R#Yli7?$sge_g% zt%(pPA@PV#G05}JOmUkLixk2S;`KCm}>j!B5pH=+?HY~85sF+n{7U~UA9D~+=2XxY>0ZoTVYFC>)O!9VkuUE zc8Yn8>BLoz^7JvGp5$_6B)ebur==?Ccv)Jl2q|k+4NyLE5t_UpSQzuRM{N8apRAF) z^sTk%Vk5F4F+FbB70flYt!p3JH3GI__;jIsR}c+LzQUEFeFN%_IcJuS@dj&$0)GVU z9gW7Yoth|%1PE7I@(D>Ob8fY>=b1KU`oX!lSakKGZo9L@-(W?F_R46*OSXRL-KyM= zwqThou$yAof`af-!$Ys1@&)tDR}=|fzVoL0@qO*j2I6^-bq&UwQk4#nByCE*u~dz% ze0~F8ZS$5k(0TLO^iDcQqFy}{GKHkniUl4?G%sc(k&ZA57?7l3`z zNKV@?xaC-e#dd!9$RIPKX4$XF`i6?!`|F_hN1*;7y)7009GitfdB(o@z^!<61Miu% zhNL|2x+kc{=-TZN-aVtLHrhAXlp4s6^p`=C*;o2#vUno|cp(`3Kv&jUA@4J zdl+u(C>A6lwVKuIQYM<>fIaj}-QnCF@8u7!J*sUv1`y-N*e)$&3DJ=dDDnRrBK_a- z+qgJ;>RH@If3Mea9oV1sdJ6BeRs#ylEnuR58|I(A3^2AGyHzzAH_5-V-+;Kl)0>k$ zzn(FjI&D~?l)o?iBEe#AZSo0j7D+Xbc-!Dp{d&81|w~MD34z<oL$I3#r)Vjy=7*OYtcInM(+(SIGF?B&- zh56$79F~l%pweQi&&DZR3TGhN@WibGkEvP!xM?sa0a$&qUxE7%xlUGD ze&S3_ni%B%<{@M6K4ng`QNCT@b$$P)6=7uEnzeO1M@=1$O}nE&8zslu%VnfKNJH^0 zbu;S>+IcfGF=~(0iAvV8FA&R{LnUZzYP*i>d_Ntpp4=eP2)rcj4N0CWpP%!#r|d>h zYQ^!{rK$9I7wH;Hs<_GNI)$3&Mdn`|Qw>HM|`P;%$>%{5IX035Uzr zW{}vxyemhqx}pPxg&SMTN>U^al`>x|m1wk0uswV~$_WHT26~~Fhg424V=LeJPA|Ak zkHR90;QJ;v>+?RB4A+@<0NXY9!#Ea3XszHJeap4hJ+p4>$iXBDjwKZTMe^YbMk%9f zmf#)H;uOSomgkj@W5o92_3}629@2tk?Jee|E2R(VGeZ}1KEREFo8z)VsshIbBJZk< zW21gEk{`K0nOiTuyH~F}>!%%0d*`Z`{o;m8@=ZL?g51@8gUHCh;fdNX!LEAGH>$eLcQcH8JF^7ZDv*yTuMJ?LD>(;~54{iOuYjx`nB4(5! zt@}b{Eg*phS%MwhY+*okA%_LP`8}EGs^B?8hEZc}1=kAy%^dAv-HG~QokP|+uXX8% zYRdPz&g~7Y58U}2lyzAy;3iTn#V*1z>FG*&)_uPo$WN=q0NYAnsb=_)U$ z89xJ7+?p$>g-&XG8h03NG=|qkd1ZcP#2d6epSbusuZX>Ohew%z3ezDOs6-Y++pyq_ zylWAsDR)&h{}Odr*2_hU<~uJn3qg-mc{sxJ6>2A{jFMti%Q@5+PwVvibs+vADR-&V zAHRzCc&Ga$NF9y@FYQIBcKE+qEuxLg-PkT&`9so5_mjSVm#Jq+O13#Txmt!JAk^Rs zO$s-Cog&T1VOwal>}Y;76yR_Rrz16VSbyVrc+buX;D!7WoeRgViiHUc$LoCTtZ6vz zk*)viZr80#1>FV0nR8q(peB#;XE)CG;LY1RhVPysm$zOMq>}ejS1*nwjo7`Y-;lmN zXHo1QsFeFY89Jdd;|~-}zvJx%&pcbAuJl~*EWV7jtz5c`}WrEqK7CyA#D>@20VN!xtU zo6QY8n8^pB6iT-zG8aEg){9PKRPtfMqc}>c0|I0gl%<>M7*S#~BF9P_=M++`Zs|KZ+J@cv+UTY!K)Np)i zWeVPS?2*VxO)BxBefXN?S8mdlgJe0LEOn|Q-WQ^cHRnSp?H`;e6W*YFUwhYzFR+1u zEHO&SeQ)bdph;(<+_=)1kXar-%6AHPHTT#HMU@fG9^K-9WAsI|l zf@__94Y1$$Om93kCjFG&njn4Puq%hL5p7{7ZS`;aaa}h*Ow`OaO7=w+ c4=bhqpM|FbCnp3&LPAM6 +0LibreOffice/6.0.7.3$Linux_X86_64 LibreOffice_project/00m0$Build-31318192 \ No newline at end of file diff --git a/fixtures/bookmark/docProps/core.xml b/fixtures/bookmark/docProps/core.xml new file mode 100644 index 0000000..eddecae --- /dev/null +++ b/fixtures/bookmark/docProps/core.xml @@ -0,0 +1,2 @@ + +2019-12-04T16:33:05Zja-JP2019-12-04T16:33:39Z1 \ No newline at end of file diff --git a/fixtures/bookmark/word/_rels/document.xml.rels b/fixtures/bookmark/word/_rels/document.xml.rels new file mode 100644 index 0000000..8a2db8a --- /dev/null +++ b/fixtures/bookmark/word/_rels/document.xml.rels @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/fixtures/bookmark/word/document.xml b/fixtures/bookmark/word/document.xml new file mode 100644 index 0000000..53012ae --- /dev/null +++ b/fixtures/bookmark/word/document.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + Bookmark + + + + + Hello + + + + + + + + + + World + + + + + + + + + + + + \ No newline at end of file diff --git a/fixtures/bookmark/word/fontTable.xml b/fixtures/bookmark/word/fontTable.xml new file mode 100644 index 0000000..94f56db --- /dev/null +++ b/fixtures/bookmark/word/fontTable.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/fixtures/bookmark/word/settings.xml b/fixtures/bookmark/word/settings.xml new file mode 100644 index 0000000..97dba84 --- /dev/null +++ b/fixtures/bookmark/word/settings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/fixtures/bookmark/word/styles.xml b/fixtures/bookmark/word/styles.xml new file mode 100644 index 0000000..72e6f53 --- /dev/null +++ b/fixtures/bookmark/word/styles.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file