pptx_rs/oxml/
notesmaster.rs1use crate::oxml::shape::Sp;
31use crate::oxml::slide::SlideBackground;
32use crate::oxml::writer::XmlWriter;
33
34const DEFAULT_NOTES_STYLE: &str = r##"<p:notesStyle><p:titleStyle><a:lvl1pPr algn="ctr" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="0"/></a:spcBef><a:buNone/><a:defRPr sz="4400" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mj-lt"/><a:ea typeface="+mj-ea"/><a:cs typeface="+mj-cs"/></a:defRPr></a:lvl1pPr></p:titleStyle><p:bodyStyle><a:lvl1pPr marL="342900" indent="-342900" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:spcBef><a:spcPct val="20000"/></a:spcBef><a:buFont typeface="Arial"/><a:buChar char="•"/><a:defRPr sz="3200" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mj-ea"/><a:cs typeface="+mj-cs"/></a:defRPr></a:lvl1pPr></p:bodyStyle><p:otherStyle><a:defPPr><a:defRPr lang="en-US"/></a:defPPr><a:lvl1pPr marL="0" algn="l" defTabSz="457200" rtl="0" eaLnBrk="1" latinLnBrk="0" hangingPunct="1"><a:defRPr sz="1800" kern="1200"><a:solidFill><a:schemeClr val="tx1"/></a:solidFill><a:latin typeface="+mn-lt"/><a:ea typeface="+mj-ea"/><a:cs typeface="+mj-cs"/></a:defRPr></a:lvl1pPr></p:otherStyle></p:notesStyle>"##;
39
40const DEFAULT_CLR_MAP: &str = "<p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/>";
42
43#[derive(Clone, Debug, Default)]
48pub struct NotesMaster {
49 pub shapes: Vec<Sp>,
51 pub background: Option<SlideBackground>,
53 pub clr_map_xml: Option<String>,
58 pub notes_style_xml: Option<String>,
63}
64
65impl NotesMaster {
66 pub fn new() -> Self {
68 Self::default()
69 }
70
71 pub fn len(&self) -> usize {
73 self.shapes.len()
74 }
75
76 pub fn is_empty(&self) -> bool {
78 self.shapes.is_empty()
79 }
80
81 pub fn to_xml(&self) -> String {
100 let mut xml = String::with_capacity(1024);
101 xml.push_str("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n");
102 xml.push_str(
103 "<p:notesMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"",
104 );
105 xml.push_str(" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"");
106 xml.push_str(
107 " xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">",
108 );
109 xml.push_str("<p:cSld>");
111 if let Some(bg) = &self.background {
113 let mut w = XmlWriter::default();
114 bg.write_xml(&mut w);
115 xml.push_str(&w.into_string());
116 }
117 xml.push_str("<p:spTree>");
118 xml.push_str(
120 "<p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>",
121 );
122 xml.push_str("<p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr>");
123 let mut w = XmlWriter::default();
125 for s in &self.shapes {
126 s.write_xml(&mut w);
127 }
128 xml.push_str(&w.into_string());
129 xml.push_str("</p:spTree></p:cSld>");
130 if let Some(clr_map) = &self.clr_map_xml {
132 xml.push_str(clr_map);
133 } else {
134 xml.push_str(DEFAULT_CLR_MAP);
135 }
136 if let Some(notes_style) = &self.notes_style_xml {
138 xml.push_str(notes_style);
139 } else {
140 xml.push_str(DEFAULT_NOTES_STYLE);
141 }
142 xml.push_str("</p:notesMaster>");
143 xml
144 }
145}