1use std::collections::BTreeMap;
12
13#[derive(Clone, Debug, PartialEq, Eq)]
15pub struct Style {
16 pub class: StyleClass,
18 pub version: String,
20 pub default_locale: Option<String>,
22 pub options: StyleOptions,
24 pub info: Info,
26 pub citation: Option<Citation>,
28 pub bibliography: Option<Bibliography>,
30 pub macros: BTreeMap<String, Vec<Element>>,
32 pub locales: Vec<LocaleBlock>,
34}
35
36#[derive(Clone, Debug, PartialEq, Eq)]
38pub struct LocaleBlock {
39 pub xml: String,
40}
41
42#[derive(Clone, Debug, Default, PartialEq, Eq)]
44pub struct StyleOptions {
45 pub page_range_format: Option<String>,
46 pub demote_non_dropping_particle: Option<String>,
47 pub initialize_with_hyphen: Option<String>,
48 pub names: InheritableNameOptions,
50}
51
52#[derive(Clone, Debug, Default, PartialEq, Eq)]
56pub struct InheritableNameOptions {
57 pub et_al_min: Option<String>,
58 pub et_al_use_first: Option<String>,
59 pub et_al_subsequent_min: Option<String>,
60 pub et_al_subsequent_use_first: Option<String>,
61 pub et_al_use_last: Option<String>,
62 pub and: Option<String>,
64 pub delimiter_precedes_et_al: Option<String>,
65 pub delimiter_precedes_last: Option<String>,
66 pub initialize: Option<String>,
67 pub initialize_with: Option<String>,
68 pub name_as_sort_order: Option<String>,
69 pub sort_separator: Option<String>,
70}
71
72#[derive(Clone, Copy, Debug, PartialEq, Eq)]
74pub enum StyleClass {
75 InText,
77 Note,
79}
80
81#[derive(Clone, Debug, Default, PartialEq, Eq)]
83pub struct Info {
84 pub id: Option<String>,
86 pub title: Option<String>,
88 pub links: Vec<InfoLink>,
90 pub categories: Vec<InfoCategory>,
92 pub authors: Vec<InfoContributor>,
94 pub contributors: Vec<InfoContributor>,
96 pub updated: Option<String>,
98 pub issn: Vec<String>,
100}
101
102#[derive(Clone, Debug, Default, PartialEq, Eq)]
104pub struct InfoLink {
105 pub rel: Option<String>,
106 pub href: Option<String>,
107 pub media_type: Option<String>,
108}
109
110#[derive(Clone, Debug, Default, PartialEq, Eq)]
112pub struct InfoCategory {
113 pub citation_format: Option<String>,
114 pub field: Option<String>,
115}
116
117#[derive(Clone, Debug, Default, PartialEq, Eq)]
119pub struct InfoContributor {
120 pub name: Option<String>,
121 pub uri: Option<String>,
122 pub email: Option<String>,
123}
124
125#[derive(Clone, Debug, PartialEq, Eq)]
127pub struct Citation {
128 pub layout: Layout,
130 pub sort: Vec<SortKey>,
132 pub options: CitationOptions,
134}
135
136#[derive(Clone, Debug, Default, PartialEq, Eq)]
138pub struct CitationOptions {
139 pub collapse: Option<String>,
140 pub cite_group_delimiter: Option<String>,
141 pub year_suffix_delimiter: Option<String>,
142 pub after_collapse_delimiter: Option<String>,
143 pub disambiguate_add_names: Option<String>,
144 pub disambiguate_add_givenname: Option<String>,
145 pub disambiguate_add_year_suffix: Option<String>,
146 pub givenname_disambiguation_rule: Option<String>,
147 pub near_note_distance: Option<String>,
148 pub names: InheritableNameOptions,
150}
151
152#[derive(Clone, Debug, PartialEq, Eq)]
157pub struct Bibliography {
158 pub layout: Layout,
160 pub sort: Vec<SortKey>,
162 pub options: BibliographyOptions,
164}
165
166#[derive(Clone, Debug, Default, PartialEq, Eq)]
168pub struct BibliographyOptions {
169 pub hanging_indent: Option<String>,
170 pub second_field_align: Option<String>,
171 pub line_spacing: Option<String>,
172 pub entry_spacing: Option<String>,
173 pub subsequent_author_substitute: Option<String>,
174 pub subsequent_author_substitute_rule: Option<String>,
175 pub names: InheritableNameOptions,
177}
178
179#[derive(Clone, Debug, Default, PartialEq, Eq)]
181pub struct Layout {
182 pub elements: Vec<Element>,
183 pub common: Common,
184}
185
186#[derive(Clone, Debug, PartialEq, Eq)]
188pub struct SortKey {
189 pub target: SortTarget,
190 pub descending: bool,
192 pub options: SortKeyOptions,
194}
195
196#[derive(Clone, Debug, Default, PartialEq, Eq)]
198pub struct SortKeyOptions {
199 pub names_min: Option<String>,
200 pub names_use_first: Option<String>,
201 pub names_use_last: Option<String>,
202}
203
204#[derive(Clone, Debug, PartialEq, Eq)]
206pub enum SortTarget {
207 Variable(String),
208 Macro(String),
209}
210
211#[derive(Clone, Debug, Default, PartialEq, Eq)]
215pub struct Common {
216 pub prefix: Option<String>,
217 pub suffix: Option<String>,
218 pub delimiter: Option<String>,
219 pub font_style: Option<String>,
220 pub font_variant: Option<String>,
221 pub font_weight: Option<String>,
222 pub text_decoration: Option<String>,
223 pub vertical_align: Option<String>,
224 pub text_case: Option<String>,
225 pub display: Option<String>,
226}
227
228#[derive(Clone, Debug, PartialEq, Eq)]
230pub enum Element {
231 Text(Text),
232 Number(Number),
233 Date(DateElement),
234 Names(Box<Names>),
238 Label(Label),
239 Group(Group),
240 Choose(Choose),
241}
242
243#[derive(Clone, Debug, PartialEq, Eq)]
245pub struct Text {
246 pub source: TextSource,
247 pub quotes: bool,
248 pub strip_periods: bool,
249 pub common: Common,
250}
251
252#[derive(Clone, Debug, PartialEq, Eq)]
254pub enum TextSource {
255 Variable { name: String, form: Option<String> },
257 Macro(String),
259 Term {
261 name: String,
262 form: Option<String>,
263 plural: bool,
264 },
265 Value(String),
267}
268
269#[derive(Clone, Debug, PartialEq, Eq)]
271pub struct Number {
272 pub variable: String,
273 pub form: Option<String>,
274 pub common: Common,
275}
276
277#[derive(Clone, Debug, PartialEq, Eq)]
279pub struct DateElement {
280 pub variable: String,
281 pub form: Option<String>,
283 pub date_parts: Option<String>,
285 pub parts: Vec<DatePart>,
286 pub common: Common,
287}
288
289#[derive(Clone, Debug, PartialEq, Eq)]
291pub struct DatePart {
292 pub name: String,
294 pub form: Option<String>,
295 pub range_delimiter: Option<String>,
296 pub strip_periods: Option<String>,
298 pub common: Common,
299}
300
301#[derive(Clone, Debug, PartialEq, Eq)]
303pub struct Names {
304 pub variables: Vec<String>,
306 pub name: Option<NameElement>,
307 pub et_al: Option<EtAl>,
308 pub label: Option<Label>,
309 pub substitute: Vec<Element>,
311 pub common: Common,
312}
313
314#[derive(Clone, Debug, Default, PartialEq, Eq)]
319pub struct NameElement {
320 pub form: Option<String>,
321 pub options: InheritableNameOptions,
323 pub parts: Vec<NamePart>,
325 pub common: Common,
326}
327
328#[derive(Clone, Debug, PartialEq, Eq)]
330pub struct NamePart {
331 pub name: Option<String>,
332 pub common: Common,
333}
334
335#[derive(Clone, Debug, Default, PartialEq, Eq)]
337pub struct EtAl {
338 pub term: Option<String>,
340 pub common: Common,
341}
342
343#[derive(Clone, Debug, PartialEq, Eq)]
345pub struct Label {
346 pub variable: Option<String>,
349 pub form: Option<String>,
350 pub plural: Option<String>,
351 pub strip_periods: Option<String>,
352 pub common: Common,
353}
354
355#[derive(Clone, Debug, Default, PartialEq, Eq)]
357pub struct Group {
358 pub children: Vec<Element>,
359 pub common: Common,
360}
361
362#[derive(Clone, Debug, Default, PartialEq, Eq)]
364pub struct Choose {
365 pub branches: Vec<Branch>,
367 pub otherwise: Vec<Element>,
369}
370
371#[derive(Clone, Debug, PartialEq, Eq)]
373pub struct Branch {
374 pub conditions: Conditions,
375 pub children: Vec<Element>,
376}
377
378#[derive(Clone, Debug, Default, PartialEq, Eq)]
380pub struct Conditions {
381 pub match_mode: Match,
382 pub kind: Vec<String>,
383 pub variable: Vec<String>,
384 pub is_numeric: Vec<String>,
385 pub is_uncertain_date: Vec<String>,
386 pub locator: Vec<String>,
387 pub position: Vec<String>,
388 pub disambiguate: bool,
389}
390
391#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
393pub enum Match {
394 #[default]
396 All,
397 Any,
399 None,
401}