fast_excel 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -7
  3. data/CHANGELOG.md +9 -0
  4. data/Gemfile +1 -1
  5. data/examples/example.rb +2 -0
  6. data/examples/example_date_time.rb +38 -0
  7. data/fast_excel.gemspec +2 -2
  8. data/lib/fast_excel/binding/format.rb +17 -0
  9. data/lib/fast_excel/binding/workbook.rb +39 -17
  10. data/lib/fast_excel/binding/worksheet.rb +57 -13
  11. data/lib/fast_excel/binding.rb +7 -7
  12. data/lib/fast_excel.rb +27 -20
  13. data/libxlsxwriter/.github/FUNDING.yml +1 -0
  14. data/libxlsxwriter/.github/ISSUE_TEMPLATE.md +85 -0
  15. data/libxlsxwriter/.github/PULL_REQUEST_TEMPLATE.md +130 -0
  16. data/libxlsxwriter/.github/workflows/cmake_actions.yml +48 -0
  17. data/libxlsxwriter/.github/workflows/code_style.yml +23 -0
  18. data/libxlsxwriter/.github/workflows/coverity.yml +22 -0
  19. data/libxlsxwriter/.github/workflows/make_actions.yml +52 -0
  20. data/libxlsxwriter/.github/workflows/valgrind.yml +23 -0
  21. data/libxlsxwriter/.github/workflows/windows_build.yml +54 -0
  22. data/libxlsxwriter/.github/workflows/zig_build.yml +22 -0
  23. data/libxlsxwriter/.gitignore +16 -1
  24. data/libxlsxwriter/.indent.pro +24 -0
  25. data/libxlsxwriter/CMakeLists.txt +156 -56
  26. data/libxlsxwriter/CONTRIBUTING.md +2 -2
  27. data/libxlsxwriter/Changes.txt +344 -2
  28. data/libxlsxwriter/LICENSE.txt +66 -8
  29. data/libxlsxwriter/Makefile +151 -54
  30. data/libxlsxwriter/Package.swift +42 -0
  31. data/libxlsxwriter/Readme.md +4 -2
  32. data/libxlsxwriter/build.zig +324 -0
  33. data/libxlsxwriter/build.zig.zon +11 -0
  34. data/libxlsxwriter/cmake/FindMINIZIP.cmake +3 -3
  35. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +6 -0
  36. data/libxlsxwriter/include/xlsxwriter/app.h +2 -1
  37. data/libxlsxwriter/include/xlsxwriter/chart.h +236 -32
  38. data/libxlsxwriter/include/xlsxwriter/chartsheet.h +7 -7
  39. data/libxlsxwriter/include/xlsxwriter/comment.h +76 -0
  40. data/libxlsxwriter/include/xlsxwriter/common.h +111 -50
  41. data/libxlsxwriter/include/xlsxwriter/content_types.h +8 -1
  42. data/libxlsxwriter/include/xlsxwriter/core.h +1 -1
  43. data/libxlsxwriter/include/xlsxwriter/custom.h +1 -1
  44. data/libxlsxwriter/include/xlsxwriter/drawing.h +11 -20
  45. data/libxlsxwriter/include/xlsxwriter/format.h +121 -8
  46. data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
  47. data/libxlsxwriter/include/xlsxwriter/metadata.h +49 -0
  48. data/libxlsxwriter/include/xlsxwriter/packager.h +27 -16
  49. data/libxlsxwriter/include/xlsxwriter/relationships.h +1 -1
  50. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +1 -1
  51. data/libxlsxwriter/include/xlsxwriter/styles.h +13 -7
  52. data/libxlsxwriter/include/xlsxwriter/table.h +51 -0
  53. data/libxlsxwriter/include/xlsxwriter/theme.h +1 -1
  54. data/libxlsxwriter/include/xlsxwriter/third_party/emyg_dtoa.h +26 -0
  55. data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +27 -25
  56. data/libxlsxwriter/include/xlsxwriter/third_party/md5.h +45 -0
  57. data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +155 -153
  58. data/libxlsxwriter/include/xlsxwriter/utility.h +70 -8
  59. data/libxlsxwriter/include/xlsxwriter/vml.h +55 -0
  60. data/libxlsxwriter/include/xlsxwriter/workbook.h +218 -47
  61. data/libxlsxwriter/include/xlsxwriter/worksheet.h +2770 -241
  62. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +12 -8
  63. data/libxlsxwriter/include/xlsxwriter.h +4 -2
  64. data/libxlsxwriter/libxlsxwriter.podspec +8 -5
  65. data/libxlsxwriter/src/Makefile +58 -21
  66. data/libxlsxwriter/src/app.c +5 -2
  67. data/libxlsxwriter/src/chart.c +396 -81
  68. data/libxlsxwriter/src/chartsheet.c +22 -22
  69. data/libxlsxwriter/src/comment.c +443 -0
  70. data/libxlsxwriter/src/content_types.c +40 -1
  71. data/libxlsxwriter/src/core.c +2 -2
  72. data/libxlsxwriter/src/custom.c +1 -1
  73. data/libxlsxwriter/src/drawing.c +160 -40
  74. data/libxlsxwriter/src/format.c +109 -25
  75. data/libxlsxwriter/src/hash_table.c +1 -1
  76. data/libxlsxwriter/src/metadata.c +283 -0
  77. data/libxlsxwriter/src/packager.c +794 -94
  78. data/libxlsxwriter/src/relationships.c +1 -1
  79. data/libxlsxwriter/src/shared_strings.c +2 -4
  80. data/libxlsxwriter/src/styles.c +353 -58
  81. data/libxlsxwriter/src/table.c +304 -0
  82. data/libxlsxwriter/src/theme.c +1 -1
  83. data/libxlsxwriter/src/utility.c +143 -43
  84. data/libxlsxwriter/src/vml.c +1062 -0
  85. data/libxlsxwriter/src/workbook.c +567 -77
  86. data/libxlsxwriter/src/worksheet.c +6668 -1462
  87. data/libxlsxwriter/src/xmlwriter.c +95 -5
  88. data/libxlsxwriter/third_party/dtoa/Makefile +42 -0
  89. data/libxlsxwriter/third_party/dtoa/emyg_dtoa.c +461 -0
  90. data/libxlsxwriter/third_party/dtoa/emyg_dtoa.h +26 -0
  91. data/libxlsxwriter/third_party/md5/Makefile +42 -0
  92. data/libxlsxwriter/third_party/md5/md5.c +291 -0
  93. data/libxlsxwriter/third_party/md5/md5.h +45 -0
  94. data/libxlsxwriter/third_party/minizip/Makefile +3 -8
  95. data/libxlsxwriter/third_party/minizip/Makefile.orig +8 -4
  96. data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +1 -1
  97. data/libxlsxwriter/third_party/minizip/configure.ac +1 -1
  98. data/libxlsxwriter/third_party/minizip/crypt.h +13 -16
  99. data/libxlsxwriter/third_party/minizip/ioapi.c +31 -57
  100. data/libxlsxwriter/third_party/minizip/ioapi.h +31 -23
  101. data/libxlsxwriter/third_party/minizip/iowin32.c +29 -45
  102. data/libxlsxwriter/third_party/minizip/iowin32.h +4 -4
  103. data/libxlsxwriter/third_party/minizip/miniunz.c +29 -56
  104. data/libxlsxwriter/third_party/minizip/minizip.c +38 -49
  105. data/libxlsxwriter/third_party/minizip/mztools.c +1 -7
  106. data/libxlsxwriter/third_party/minizip/unzip.c +202 -342
  107. data/libxlsxwriter/third_party/minizip/unzip.h +74 -74
  108. data/libxlsxwriter/third_party/minizip/zip.c +165 -218
  109. data/libxlsxwriter/third_party/minizip/zip.h +164 -154
  110. data/libxlsxwriter/third_party/tmpfileplus/Makefile +3 -3
  111. data/libxlsxwriter/version.txt +1 -1
  112. data/test/auto_width_test.rb +20 -0
  113. data/test/default_format_test.rb +1 -1
  114. data/test/validations_test.rb +3 -3
  115. data/test/worksheet_test.rb +6 -1
  116. metadata +33 -7
  117. data/libxlsxwriter/.travis.yml +0 -37
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2019, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
7
7
  *
8
8
  */
9
9
 
@@ -66,8 +66,8 @@ lxw_chartsheet_free(lxw_chartsheet *chartsheet)
66
66
  return;
67
67
 
68
68
  lxw_worksheet_free(chartsheet->worksheet);
69
- free(chartsheet->name);
70
- free(chartsheet->quoted_name);
69
+ free((void *) chartsheet->name);
70
+ free((void *) chartsheet->quoted_name);
71
71
  free(chartsheet);
72
72
  }
73
73
 
@@ -225,9 +225,9 @@ lxw_chartsheet_assemble_xml_file(lxw_chartsheet *self)
225
225
  */
226
226
  lxw_error
227
227
  chartsheet_set_chart_opt(lxw_chartsheet *self,
228
- lxw_chart *chart, lxw_image_options *user_options)
228
+ lxw_chart *chart, lxw_chart_options *user_options)
229
229
  {
230
- lxw_image_options *options;
230
+ lxw_object_properties *object_props;
231
231
  lxw_chart_series *series;
232
232
 
233
233
  if (!chart) {
@@ -260,32 +260,32 @@ chartsheet_set_chart_opt(lxw_chartsheet *self,
260
260
  }
261
261
  }
262
262
 
263
- /* Create a new object to hold the chart image options. */
264
- options = calloc(1, sizeof(lxw_image_options));
265
- RETURN_ON_MEM_ERROR(options, LXW_ERROR_MEMORY_MALLOC_FAILED);
263
+ /* Create a new object to hold the chart image properties. */
264
+ object_props = calloc(1, sizeof(lxw_object_properties));
265
+ RETURN_ON_MEM_ERROR(object_props, LXW_ERROR_MEMORY_MALLOC_FAILED);
266
266
 
267
267
  if (user_options) {
268
- options->x_offset = user_options->x_offset;
269
- options->y_offset = user_options->y_offset;
270
- options->x_scale = user_options->x_scale;
271
- options->y_scale = user_options->y_scale;
268
+ object_props->x_offset = user_options->x_offset;
269
+ object_props->y_offset = user_options->y_offset;
270
+ object_props->x_scale = user_options->x_scale;
271
+ object_props->y_scale = user_options->y_scale;
272
272
  }
273
273
 
274
- /* TODO. Read defaults from chart. */
275
- options->width = 480;
276
- options->height = 288;
274
+ object_props->width = 480;
275
+ object_props->height = 288;
277
276
 
278
- if (!options->x_scale)
279
- options->x_scale = 1;
277
+ if (object_props->x_scale == 0.0)
278
+ object_props->x_scale = 1;
280
279
 
281
- if (!options->y_scale)
282
- options->y_scale = 1;
280
+ if (object_props->y_scale == 0.0)
281
+ object_props->y_scale = 1;
283
282
 
284
283
  /* Store chart references so they can be ordered in the workbook. */
285
- options->chart = chart;
284
+ object_props->chart = chart;
286
285
 
287
286
  /* Store the chart data in the embedded worksheet. */
288
- STAILQ_INSERT_TAIL(self->worksheet->chart_data, options, list_pointers);
287
+ STAILQ_INSERT_TAIL(self->worksheet->chart_data, object_props,
288
+ list_pointers);
289
289
 
290
290
  chart->in_use = LXW_TRUE;
291
291
  chart->is_chartsheet = LXW_TRUE;
@@ -385,7 +385,7 @@ void
385
385
  chartsheet_protect(lxw_chartsheet *self, const char *password,
386
386
  lxw_protection *options)
387
387
  {
388
- struct lxw_protection *protect = &self->protection;
388
+ struct lxw_protection_obj *protect = &self->protection;
389
389
 
390
390
  /* Copy any user parameters to the internal structure. */
391
391
  if (options) {
@@ -0,0 +1,443 @@
1
+ /*****************************************************************************
2
+ * comment - A library for creating Excel XLSX comment files.
3
+ *
4
+ * Used in conjunction with the libxlsxwriter library.
5
+ *
6
+ * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
7
+ *
8
+ */
9
+
10
+ #include "xlsxwriter/xmlwriter.h"
11
+ #include "xlsxwriter/comment.h"
12
+ #include "xlsxwriter/utility.h"
13
+
14
+ /*
15
+ * Forward declarations.
16
+ */
17
+
18
+ STATIC int _author_id_cmp(lxw_author_id *tuple1, lxw_author_id *tuple2);
19
+
20
+ #ifndef __clang_analyzer__
21
+ LXW_RB_GENERATE_AUTHOR_IDS(lxw_author_ids, lxw_author_id,
22
+ tree_pointers, _author_id_cmp);
23
+ #endif
24
+
25
+ /*****************************************************************************
26
+ *
27
+ * Private functions.
28
+ *
29
+ ****************************************************************************/
30
+
31
+ /*
32
+ * Comparator for the author ids.
33
+ */
34
+ STATIC int
35
+ _author_id_cmp(lxw_author_id *author_id1, lxw_author_id *author_id2)
36
+ {
37
+ return strcmp(author_id1->author, author_id2->author);
38
+ }
39
+
40
+ /*
41
+ * Check if an author already existing in the author/id table.
42
+ */
43
+ STATIC uint8_t
44
+ _check_author(lxw_comment *self, char *author)
45
+ {
46
+ lxw_author_id tmp_author_id;
47
+ lxw_author_id *existing_author = NULL;
48
+
49
+ if (!author)
50
+ return LXW_TRUE;
51
+
52
+ tmp_author_id.author = author;
53
+ existing_author = RB_FIND(lxw_author_ids,
54
+ self->author_ids, &tmp_author_id);
55
+
56
+ if (existing_author)
57
+ return LXW_TRUE;
58
+ else
59
+ return LXW_FALSE;
60
+ }
61
+
62
+ /*
63
+ * Get the index used for an author name.
64
+ */
65
+ STATIC uint32_t
66
+ _get_author_index(lxw_comment *self, char *author)
67
+ {
68
+ lxw_author_id tmp_author_id;
69
+ lxw_author_id *existing_author = NULL;
70
+ lxw_author_id *new_author_id = NULL;
71
+
72
+ if (!author)
73
+ return 0;
74
+
75
+ tmp_author_id.author = author;
76
+ existing_author = RB_FIND(lxw_author_ids,
77
+ self->author_ids, &tmp_author_id);
78
+
79
+ if (existing_author) {
80
+ return existing_author->id;
81
+ }
82
+ else {
83
+ new_author_id = calloc(1, sizeof(lxw_author_id));
84
+
85
+ if (new_author_id) {
86
+ new_author_id->id = self->author_id;
87
+ new_author_id->author = lxw_strdup(author);
88
+ self->author_id++;
89
+
90
+ RB_INSERT(lxw_author_ids, self->author_ids, new_author_id);
91
+
92
+ return new_author_id->id;
93
+ }
94
+ else {
95
+ return 0;
96
+ }
97
+ }
98
+ }
99
+
100
+ /*
101
+ * Create a new comment object.
102
+ */
103
+ lxw_comment *
104
+ lxw_comment_new(void)
105
+ {
106
+ lxw_comment *comment = calloc(1, sizeof(lxw_comment));
107
+ GOTO_LABEL_ON_MEM_ERROR(comment, mem_error);
108
+
109
+ comment->author_ids = calloc(1, sizeof(struct lxw_author_ids));
110
+ GOTO_LABEL_ON_MEM_ERROR(comment->author_ids, mem_error);
111
+ RB_INIT(comment->author_ids);
112
+
113
+ return comment;
114
+
115
+ mem_error:
116
+ lxw_comment_free(comment);
117
+ return NULL;
118
+ }
119
+
120
+ /*
121
+ * Free a comment object.
122
+ */
123
+ void
124
+ lxw_comment_free(lxw_comment *comment)
125
+ {
126
+ struct lxw_author_id *author_id;
127
+ struct lxw_author_id *next_author_id;
128
+
129
+ if (!comment)
130
+ return;
131
+
132
+ if (comment->author_ids) {
133
+ for (author_id =
134
+ RB_MIN(lxw_author_ids, comment->author_ids);
135
+ author_id; author_id = next_author_id) {
136
+
137
+ next_author_id =
138
+ RB_NEXT(lxw_author_ids, worksheet->author_id, author_id);
139
+ RB_REMOVE(lxw_author_ids, comment->author_ids, author_id);
140
+ free(author_id->author);
141
+ free(author_id);
142
+ }
143
+
144
+ free(comment->author_ids);
145
+ }
146
+
147
+ free(comment);
148
+ }
149
+
150
+ /*****************************************************************************
151
+ *
152
+ * XML functions.
153
+ *
154
+ ****************************************************************************/
155
+
156
+ /*
157
+ * Write the XML declaration.
158
+ */
159
+ STATIC void
160
+ _comment_xml_declaration(lxw_comment *self)
161
+ {
162
+ lxw_xml_declaration(self->file);
163
+ }
164
+
165
+ /*****************************************************************************
166
+ *
167
+ * XML file assembly functions.
168
+ *
169
+ ****************************************************************************/
170
+
171
+ /*
172
+ * Write the <t> element.
173
+ */
174
+ STATIC void
175
+ _comment_write_text_t(lxw_comment *self, lxw_vml_obj *comment_obj)
176
+ {
177
+ lxw_xml_data_element(self->file, "t", comment_obj->text, NULL);
178
+ }
179
+
180
+ /*
181
+ * Write the <family> element.
182
+ */
183
+ STATIC void
184
+ _comment_write_family(lxw_comment *self, lxw_vml_obj *comment_obj)
185
+ {
186
+ struct xml_attribute_list attributes;
187
+ struct xml_attribute *attribute;
188
+
189
+ LXW_INIT_ATTRIBUTES();
190
+ LXW_PUSH_ATTRIBUTES_INT("val", comment_obj->font_family);
191
+
192
+ lxw_xml_empty_tag(self->file, "family", &attributes);
193
+
194
+ LXW_FREE_ATTRIBUTES();
195
+ }
196
+
197
+ /*
198
+ * Write the <rFont> element.
199
+ */
200
+ STATIC void
201
+ _comment_write_r_font(lxw_comment *self, lxw_vml_obj *comment_obj)
202
+ {
203
+ struct xml_attribute_list attributes;
204
+ struct xml_attribute *attribute;
205
+ char font_name[LXW_ATTR_32];
206
+
207
+ if (comment_obj->font_name)
208
+ lxw_snprintf(font_name, LXW_ATTR_32, "%s", comment_obj->font_name);
209
+ else
210
+ lxw_snprintf(font_name, LXW_ATTR_32, "Tahoma");
211
+
212
+ LXW_INIT_ATTRIBUTES();
213
+ LXW_PUSH_ATTRIBUTES_STR("val", font_name);
214
+
215
+ lxw_xml_empty_tag(self->file, "rFont", &attributes);
216
+
217
+ LXW_FREE_ATTRIBUTES();
218
+ }
219
+
220
+ /*
221
+ * Write the <color> element.
222
+ */
223
+ STATIC void
224
+ _comment_write_color(lxw_comment *self)
225
+ {
226
+ struct xml_attribute_list attributes;
227
+ struct xml_attribute *attribute;
228
+ char indexed[] = "81";
229
+
230
+ LXW_INIT_ATTRIBUTES();
231
+ LXW_PUSH_ATTRIBUTES_STR("indexed", indexed);
232
+
233
+ lxw_xml_empty_tag(self->file, "color", &attributes);
234
+
235
+ LXW_FREE_ATTRIBUTES();
236
+ }
237
+
238
+ /*
239
+ * Write the <sz> element.
240
+ */
241
+ STATIC void
242
+ _comment_write_sz(lxw_comment *self, lxw_vml_obj *comment_obj)
243
+ {
244
+ struct xml_attribute_list attributes;
245
+ struct xml_attribute *attribute;
246
+
247
+ LXW_INIT_ATTRIBUTES();
248
+ LXW_PUSH_ATTRIBUTES_DBL("val", comment_obj->font_size);
249
+
250
+ lxw_xml_empty_tag(self->file, "sz", &attributes);
251
+
252
+ LXW_FREE_ATTRIBUTES();
253
+ }
254
+
255
+ /*
256
+ * Write the <rPr> element.
257
+ */
258
+ STATIC void
259
+ _comment_write_r_pr(lxw_comment *self, lxw_vml_obj *comment_obj)
260
+ {
261
+ lxw_xml_start_tag(self->file, "rPr", NULL);
262
+
263
+ /* Write the sz element. */
264
+ _comment_write_sz(self, comment_obj);
265
+
266
+ /* Write the color element. */
267
+ _comment_write_color(self);
268
+
269
+ /* Write the rFont element. */
270
+ _comment_write_r_font(self, comment_obj);
271
+
272
+ /* Write the family element. */
273
+ _comment_write_family(self, comment_obj);
274
+
275
+ lxw_xml_end_tag(self->file, "rPr");
276
+ }
277
+
278
+ /*
279
+ * Write the <r> element.
280
+ */
281
+ STATIC void
282
+ _comment_write_r(lxw_comment *self, lxw_vml_obj *comment_obj)
283
+ {
284
+ lxw_xml_start_tag(self->file, "r", NULL);
285
+
286
+ /* Write the rPr element. */
287
+ _comment_write_r_pr(self, comment_obj);
288
+
289
+ /* Write the t element. */
290
+ _comment_write_text_t(self, comment_obj);
291
+
292
+ lxw_xml_end_tag(self->file, "r");
293
+ }
294
+
295
+ /*
296
+ * Write the <text> element.
297
+ */
298
+ STATIC void
299
+ _comment_write_text(lxw_comment *self, lxw_vml_obj *comment_obj)
300
+ {
301
+ lxw_xml_start_tag(self->file, "text", NULL);
302
+
303
+ /* Write the r element. */
304
+ _comment_write_r(self, comment_obj);
305
+
306
+ lxw_xml_end_tag(self->file, "text");
307
+ }
308
+
309
+ /*
310
+ * Write the <comment> element.
311
+ */
312
+ STATIC void
313
+ _comment_write_comment(lxw_comment *self, lxw_vml_obj *comment_obj)
314
+ {
315
+ struct xml_attribute_list attributes;
316
+ struct xml_attribute *attribute;
317
+ char ref[LXW_MAX_CELL_NAME_LENGTH];
318
+
319
+ lxw_rowcol_to_cell(ref, comment_obj->row, comment_obj->col);
320
+
321
+ LXW_INIT_ATTRIBUTES();
322
+ LXW_PUSH_ATTRIBUTES_STR("ref", ref);
323
+ LXW_PUSH_ATTRIBUTES_INT("authorId", comment_obj->author_id);
324
+
325
+ lxw_xml_start_tag(self->file, "comment", &attributes);
326
+
327
+ /* Write the text element. */
328
+ _comment_write_text(self, comment_obj);
329
+
330
+ lxw_xml_end_tag(self->file, "comment");
331
+
332
+ LXW_FREE_ATTRIBUTES();
333
+ }
334
+
335
+ /*
336
+ * Write the <commentList> element.
337
+ */
338
+ STATIC void
339
+ _comment_write_comment_list(lxw_comment *self)
340
+ {
341
+ lxw_vml_obj *comment_obj;
342
+
343
+ lxw_xml_start_tag(self->file, "commentList", NULL);
344
+
345
+ STAILQ_FOREACH(comment_obj, self->comment_objs, list_pointers) {
346
+ /* Write the comment element. */
347
+ _comment_write_comment(self, comment_obj);
348
+ }
349
+
350
+ lxw_xml_end_tag(self->file, "commentList");
351
+
352
+ }
353
+
354
+ /*
355
+ * Write the <author> element.
356
+ */
357
+ STATIC void
358
+ _comment_write_author(lxw_comment *self, char *author)
359
+ {
360
+ lxw_xml_data_element(self->file, "author", author, NULL);
361
+ }
362
+
363
+ /*
364
+ * Write the <authors> element.
365
+ */
366
+ STATIC void
367
+ _comment_write_authors(lxw_comment *self)
368
+ {
369
+ lxw_vml_obj *comment_obj;
370
+ char *author;
371
+
372
+ lxw_xml_start_tag(self->file, "authors", NULL);
373
+
374
+ /* Set the default author (from worksheet_set_comments_author()). */
375
+ if (self->comment_author) {
376
+ _get_author_index(self, self->comment_author);
377
+ _comment_write_author(self, self->comment_author);
378
+ }
379
+ else {
380
+ _get_author_index(self, "");
381
+ _comment_write_author(self, "");
382
+ }
383
+
384
+ STAILQ_FOREACH(comment_obj, self->comment_objs, list_pointers) {
385
+ author = comment_obj->author;
386
+
387
+ if (author) {
388
+
389
+ if (!_check_author(self, author))
390
+ _comment_write_author(self, author);
391
+
392
+ comment_obj->author_id = _get_author_index(self, author);
393
+ }
394
+ }
395
+
396
+ lxw_xml_end_tag(self->file, "authors");
397
+ }
398
+
399
+ /*
400
+ * Write the <comments> element.
401
+ */
402
+ STATIC void
403
+ _comment_write_comments(lxw_comment *self)
404
+ {
405
+ struct xml_attribute_list attributes;
406
+ struct xml_attribute *attribute;
407
+ char xmlns[] =
408
+ "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
409
+
410
+ LXW_INIT_ATTRIBUTES();
411
+ LXW_PUSH_ATTRIBUTES_STR("xmlns", xmlns);
412
+
413
+ lxw_xml_start_tag(self->file, "comments", &attributes);
414
+
415
+ LXW_FREE_ATTRIBUTES();
416
+ }
417
+
418
+ /*
419
+ * Assemble and write the XML file.
420
+ */
421
+ void
422
+ lxw_comment_assemble_xml_file(lxw_comment *self)
423
+ {
424
+ /* Write the XML declaration. */
425
+ _comment_xml_declaration(self);
426
+
427
+ /* Write the comments element. */
428
+ _comment_write_comments(self);
429
+
430
+ /* Write the authors element. */
431
+ _comment_write_authors(self);
432
+
433
+ /* Write the commentList element. */
434
+ _comment_write_comment_list(self);
435
+
436
+ lxw_xml_end_tag(self->file, "comments");
437
+ }
438
+
439
+ /*****************************************************************************
440
+ *
441
+ * Public functions.
442
+ *
443
+ ****************************************************************************/
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2019, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
7
7
  *
8
8
  */
9
9
 
@@ -322,6 +322,35 @@ lxw_ct_add_drawing_name(lxw_content_types *self, const char *name)
322
322
  lxw_ct_add_override(self, name, LXW_APP_DOCUMENT "drawing+xml");
323
323
  }
324
324
 
325
+ /*
326
+ * Add the name of a table to the ContentTypes overrides.
327
+ */
328
+ void
329
+ lxw_ct_add_table_name(lxw_content_types *self, const char *name)
330
+ {
331
+ lxw_ct_add_override(self, name,
332
+ LXW_APP_DOCUMENT "spreadsheetml.table+xml");
333
+ }
334
+
335
+ /*
336
+ * Add the name of a VML drawing to the ContentTypes overrides.
337
+ */
338
+ void
339
+ lxw_ct_add_vml_name(lxw_content_types *self)
340
+ {
341
+ lxw_ct_add_default(self, "vml", LXW_APP_DOCUMENT "vmlDrawing");
342
+ }
343
+
344
+ /*
345
+ * Add the name of a comment to the ContentTypes overrides.
346
+ */
347
+ void
348
+ lxw_ct_add_comment_name(lxw_content_types *self, const char *name)
349
+ {
350
+ lxw_ct_add_override(self, name,
351
+ LXW_APP_DOCUMENT "spreadsheetml.comments+xml");
352
+ }
353
+
325
354
  /*
326
355
  * Add the sharedStrings link to the ContentTypes overrides.
327
356
  */
@@ -351,3 +380,13 @@ lxw_ct_add_custom_properties(lxw_content_types *self)
351
380
  lxw_ct_add_override(self, "/docProps/custom.xml",
352
381
  LXW_APP_DOCUMENT "custom-properties+xml");
353
382
  }
383
+
384
+ /*
385
+ * Add the metadata file to the ContentTypes overrides.
386
+ */
387
+ void
388
+ lxw_ct_add_metadata(lxw_content_types *self)
389
+ {
390
+ lxw_ct_add_override(self, "/xl/metadata.xml",
391
+ LXW_APP_DOCUMENT "spreadsheetml.sheetMetadata+xml");
392
+ }
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2019, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
7
7
  *
8
8
  */
9
9
 
@@ -50,7 +50,7 @@ lxw_core_free(lxw_core *core)
50
50
  }
51
51
 
52
52
  /*
53
- * Convert a time_t struct to a ISO 8601 style "2010-01-01T00:00:00Z" date.
53
+ * Convert a time_t to a ISO 8601 style "2010-01-01T00:00:00Z" date.
54
54
  */
55
55
  static void
56
56
  _datetime_to_iso8601_date(time_t *timer, char *str, size_t size)
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Used in conjunction with the libxlsxwriter library.
5
5
  *
6
- * Copyright 2014-2019, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
6
+ * Copyright 2014-2022, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
7
7
  *
8
8
  */
9
9