Skip to main content

excelize_rs/xml/
theme.rs

1//! Theme part (`xl/theme/themeN.xml`).
2//!
3//! Ported from Go `xmlTheme.go`.
4
5use serde::{Deserialize, Serialize};
6
7use super::common::{AttrValString, XlsxExtLst, XlsxInnerXml};
8
9// ------------------------------------------------------------------
10// Serialization types (with explicit `a:` namespace prefix)
11// ------------------------------------------------------------------
12
13/// Directly maps the theme element in the namespace
14/// http://schemas.openxmlformats.org/drawingml/2006/main.
15#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
16#[serde(rename = "a:theme")]
17pub struct XlsxTheme {
18    #[serde(rename = "@xmlns:a", default)]
19    pub xmlns_a: Option<String>,
20    #[serde(rename = "@xmlns:r", default)]
21    pub xmlns_r: Option<String>,
22    #[serde(rename = "@name", default)]
23    pub name: String,
24    #[serde(rename = "a:themeElements", default)]
25    pub theme_elements: XlsxBaseStyles,
26    #[serde(rename = "a:objectDefaults", default)]
27    pub object_defaults: XlsxInnerXml,
28    #[serde(rename = "a:extraClrSchemeLst", default)]
29    pub extra_clr_scheme_lst: XlsxInnerXml,
30    #[serde(rename = "a:custClrLst", default)]
31    pub cust_clr_lst: Option<XlsxInnerXml>,
32    #[serde(rename = "a:extLst", default)]
33    pub ext_lst: Option<XlsxExtLst>,
34}
35
36/// Defines the theme elements for a theme, and is the workhorse of the theme.
37#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
38#[serde(rename = "a:themeElements")]
39pub struct XlsxBaseStyles {
40    #[serde(rename = "a:clrScheme", default)]
41    pub clr_scheme: XlsxColorScheme,
42    #[serde(rename = "a:fontScheme", default)]
43    pub font_scheme: XlsxFontScheme,
44    #[serde(rename = "a:fmtScheme", default)]
45    pub fmt_scheme: XlsxStyleMatrix,
46    #[serde(rename = "a:extLst", default)]
47    pub ext_lst: Option<XlsxExtLst>,
48}
49
50/// Holds the actual color values that are to be applied to a given diagram and
51/// how those colors are to be applied.
52#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
53pub struct XlsxCtColor {
54    #[serde(rename = "a:scrgbClr", default)]
55    pub scrgb_clr: Option<XlsxInnerXml>,
56    #[serde(rename = "a:srgbClr", default)]
57    pub srgb_clr: Option<AttrValString>,
58    #[serde(rename = "a:hslClr", default)]
59    pub hsl_clr: Option<XlsxInnerXml>,
60    #[serde(rename = "a:sysClr", default)]
61    pub sys_clr: Option<XlsxSysClr>,
62    #[serde(rename = "a:schemeClr", default)]
63    pub scheme_clr: Option<XlsxInnerXml>,
64    #[serde(rename = "a:prstClr", default)]
65    pub prst_clr: Option<XlsxInnerXml>,
66}
67
68/// Defines a set of colors for the theme.
69#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
70#[serde(rename = "a:clrScheme")]
71pub struct XlsxColorScheme {
72    #[serde(rename = "@name", default)]
73    pub name: String,
74    #[serde(rename = "a:dk1", default)]
75    pub dk1: XlsxCtColor,
76    #[serde(rename = "a:lt1", default)]
77    pub lt1: XlsxCtColor,
78    #[serde(rename = "a:dk2", default)]
79    pub dk2: XlsxCtColor,
80    #[serde(rename = "a:lt2", default)]
81    pub lt2: XlsxCtColor,
82    #[serde(rename = "a:accent1", default)]
83    pub accent1: XlsxCtColor,
84    #[serde(rename = "a:accent2", default)]
85    pub accent2: XlsxCtColor,
86    #[serde(rename = "a:accent3", default)]
87    pub accent3: XlsxCtColor,
88    #[serde(rename = "a:accent4", default)]
89    pub accent4: XlsxCtColor,
90    #[serde(rename = "a:accent5", default)]
91    pub accent5: XlsxCtColor,
92    #[serde(rename = "a:accent6", default)]
93    pub accent6: XlsxCtColor,
94    #[serde(rename = "a:hlink", default)]
95    pub hlink: XlsxCtColor,
96    #[serde(rename = "a:folHlink", default)]
97    pub fol_hlink: XlsxCtColor,
98    #[serde(rename = "a:extLst", default)]
99    pub ext_lst: Option<XlsxExtLst>,
100}
101
102/// Defines an additional font that is used for language specific fonts in
103/// themes.
104#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
105pub struct XlsxCtSupplementalFont {
106    #[serde(rename = "@script", default)]
107    pub script: String,
108    #[serde(rename = "@typeface", default)]
109    pub typeface: String,
110}
111
112/// Defines a major and minor font which is used in the font scheme.
113#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
114pub struct XlsxFontCollection {
115    #[serde(rename = "a:latin", default)]
116    pub latin: Option<XlsxCtTextFont>,
117    #[serde(rename = "a:ea", default)]
118    pub ea: Option<XlsxCtTextFont>,
119    #[serde(rename = "a:cs", default)]
120    pub cs: Option<XlsxCtTextFont>,
121    #[serde(rename = "a:font", default)]
122    pub font: Vec<XlsxCtSupplementalFont>,
123    #[serde(rename = "a:extLst", default)]
124    pub ext_lst: Option<XlsxExtLst>,
125}
126
127/// Defines the font scheme within the theme.
128#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
129#[serde(rename = "a:fontScheme")]
130pub struct XlsxFontScheme {
131    #[serde(rename = "@name", default)]
132    pub name: String,
133    #[serde(rename = "a:majorFont", default)]
134    pub major_font: XlsxFontCollection,
135    #[serde(rename = "a:minorFont", default)]
136    pub minor_font: XlsxFontCollection,
137    #[serde(rename = "a:extLst", default)]
138    pub ext_lst: Option<XlsxExtLst>,
139}
140
141/// Defines a set of formatting options, which can be referenced by documents
142/// that apply a certain style to a given part of an object.
143#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
144#[serde(rename = "a:fmtScheme")]
145pub struct XlsxStyleMatrix {
146    #[serde(rename = "@name", default)]
147    pub name: Option<String>,
148    #[serde(rename = "a:fillStyleLst", default)]
149    pub fill_style_lst: XlsxInnerXml,
150    #[serde(rename = "a:lnStyleLst", default)]
151    pub ln_style_lst: XlsxInnerXml,
152    #[serde(rename = "a:effectStyleLst", default)]
153    pub effect_style_lst: XlsxInnerXml,
154    #[serde(rename = "a:bgFillStyleLst", default)]
155    pub bg_fill_style_lst: XlsxInnerXml,
156}
157
158/// Specifies a color bound to predefined operating system elements.
159#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
160#[serde(rename = "a:sysClr")]
161pub struct XlsxSysClr {
162    #[serde(rename = "@val", default)]
163    pub val: String,
164    #[serde(rename = "@lastClr", default)]
165    pub last_clr: String,
166}
167
168/// Defines a text font properties used by theme font collections.
169#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
170pub struct XlsxCtTextFont {
171    #[serde(rename = "@typeface", default)]
172    pub typeface: String,
173    #[serde(rename = "@panose", default)]
174    pub panose: Option<String>,
175    #[serde(rename = "@pitchFamily", default)]
176    pub pitch_family: Option<String>,
177    #[serde(rename = "@Charset", default)]
178    pub charset: Option<String>,
179}
180
181// ------------------------------------------------------------------
182// Deserialization types (no namespace prefix on child elements)
183// ------------------------------------------------------------------
184
185/// Deserialization-only representation of the `theme` element.
186#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
187#[serde(rename = "theme")]
188pub struct DecodeTheme {
189    #[serde(rename = "@name", default)]
190    pub name: String,
191    #[serde(rename = "themeElements", default)]
192    pub theme_elements: DecodeBaseStyles,
193    #[serde(rename = "objectDefaults", default)]
194    pub object_defaults: XlsxInnerXml,
195    #[serde(rename = "extraClrSchemeLst", default)]
196    pub extra_clr_scheme_lst: XlsxInnerXml,
197    #[serde(rename = "custClrLst", default)]
198    pub cust_clr_lst: Option<XlsxInnerXml>,
199    #[serde(rename = "extLst", default)]
200    pub ext_lst: Option<XlsxExtLst>,
201}
202
203/// Deserialization-only representation of the theme elements.
204#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
205#[serde(rename = "themeElements")]
206pub struct DecodeBaseStyles {
207    #[serde(rename = "clrScheme", default)]
208    pub clr_scheme: DecodeColorScheme,
209    #[serde(rename = "fontScheme", default)]
210    pub font_scheme: DecodeFontScheme,
211    #[serde(rename = "fmtScheme", default)]
212    pub fmt_scheme: DecodeStyleMatrix,
213    #[serde(rename = "extLst", default)]
214    pub ext_lst: Option<XlsxExtLst>,
215}
216
217/// Deserialization-only representation of a set of colors for the theme.
218#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
219#[serde(rename = "clrScheme")]
220pub struct DecodeColorScheme {
221    #[serde(rename = "@name", default)]
222    pub name: String,
223    #[serde(rename = "dk1", default)]
224    pub dk1: DecodeCtColor,
225    #[serde(rename = "lt1", default)]
226    pub lt1: DecodeCtColor,
227    #[serde(rename = "dk2", default)]
228    pub dk2: DecodeCtColor,
229    #[serde(rename = "lt2", default)]
230    pub lt2: DecodeCtColor,
231    #[serde(rename = "accent1", default)]
232    pub accent1: DecodeCtColor,
233    #[serde(rename = "accent2", default)]
234    pub accent2: DecodeCtColor,
235    #[serde(rename = "accent3", default)]
236    pub accent3: DecodeCtColor,
237    #[serde(rename = "accent4", default)]
238    pub accent4: DecodeCtColor,
239    #[serde(rename = "accent5", default)]
240    pub accent5: DecodeCtColor,
241    #[serde(rename = "accent6", default)]
242    pub accent6: DecodeCtColor,
243    #[serde(rename = "hlink", default)]
244    pub hlink: DecodeCtColor,
245    #[serde(rename = "folHlink", default)]
246    pub fol_hlink: DecodeCtColor,
247    #[serde(rename = "extLst", default)]
248    pub ext_lst: Option<XlsxExtLst>,
249}
250
251/// Deserialization-only representation of the actual color values.
252#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
253pub struct DecodeCtColor {
254    #[serde(rename = "scrgbClr", default)]
255    pub scrgb_clr: Option<XlsxInnerXml>,
256    #[serde(rename = "srgbClr", default)]
257    pub srgb_clr: Option<AttrValString>,
258    #[serde(rename = "hslClr", default)]
259    pub hsl_clr: Option<XlsxInnerXml>,
260    #[serde(rename = "sysClr", default)]
261    pub sys_clr: Option<XlsxSysClr>,
262    #[serde(rename = "schemeClr", default)]
263    pub scheme_clr: Option<XlsxInnerXml>,
264    #[serde(rename = "prstClr", default)]
265    pub prst_clr: Option<XlsxInnerXml>,
266}
267
268/// Deserialization-only representation of the font scheme within the theme.
269#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
270#[serde(rename = "fontScheme")]
271pub struct DecodeFontScheme {
272    #[serde(rename = "@name", default)]
273    pub name: String,
274    #[serde(rename = "majorFont", default)]
275    pub major_font: DecodeFontCollection,
276    #[serde(rename = "minorFont", default)]
277    pub minor_font: DecodeFontCollection,
278    #[serde(rename = "extLst", default)]
279    pub ext_lst: Option<XlsxExtLst>,
280}
281
282/// Deserialization-only representation of a major and minor font collection.
283#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
284pub struct DecodeFontCollection {
285    #[serde(rename = "latin", default)]
286    pub latin: Option<XlsxCtTextFont>,
287    #[serde(rename = "ea", default)]
288    pub ea: Option<XlsxCtTextFont>,
289    #[serde(rename = "cs", default)]
290    pub cs: Option<XlsxCtTextFont>,
291    #[serde(rename = "font", default)]
292    pub font: Vec<XlsxCtSupplementalFont>,
293    #[serde(rename = "extLst", default)]
294    pub ext_lst: Option<XlsxExtLst>,
295}
296
297/// Deserialization-only representation of a set of formatting options.
298#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
299#[serde(rename = "fmtScheme")]
300pub struct DecodeStyleMatrix {
301    #[serde(rename = "@name", default)]
302    pub name: Option<String>,
303    #[serde(rename = "fillStyleLst", default)]
304    pub fill_style_lst: XlsxInnerXml,
305    #[serde(rename = "lnStyleLst", default)]
306    pub ln_style_lst: XlsxInnerXml,
307    #[serde(rename = "effectStyleLst", default)]
308    pub effect_style_lst: XlsxInnerXml,
309    #[serde(rename = "bgFillStyleLst", default)]
310    pub bg_fill_style_lst: XlsxInnerXml,
311}