react-native-nitro-xlsx 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +20 -8
  2. package/cpp/HybridNitroXlsx.cpp +25 -1
  3. package/cpp/HybridXlsxCellFormat.cpp +46 -146
  4. package/cpp/HybridXlsxCellFormat.hpp +9 -41
  5. package/cpp/HybridXlsxConditionalFormat.cpp +4 -1
  6. package/cpp/HybridXlsxConditionalFormats.cpp +5 -1
  7. package/cpp/HybridXlsxWorkbook.cpp +38 -8
  8. package/cpp/HybridXlsxWorkbook.hpp +10 -1
  9. package/cpp/HybridXlsxWorksheet.cpp +422 -141
  10. package/cpp/HybridXlsxWorksheet.hpp +4 -1
  11. package/cpp/XlsxCacheDir.cpp +25 -2
  12. package/cpp/XlsxCacheDir.hpp +3 -1
  13. package/cpp/XlsxCellStyle.hpp +360 -0
  14. package/cpp/XlsxJson.cpp +29 -8
  15. package/package.json +1 -1
  16. package/scripts/sync-openxlsx-headers.sh +34 -0
  17. package/src/__mocks__/react-native-nitro-modules.ts +523 -20
  18. package/src/__tests__/index.test.ts +124 -16
  19. package/src/index.ts +13 -13
  20. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/IZipArchive.hpp +361 -0
  21. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/OpenXLSX-Exports.hpp +12 -0
  22. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCell.hpp +367 -0
  23. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellIterator.hpp +252 -0
  24. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellRange.hpp +223 -0
  25. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellReference.hpp +317 -0
  26. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellValue.hpp +793 -0
  27. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLColor.hpp +232 -0
  28. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLColumn.hpp +159 -0
  29. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCommandQuery.hpp +228 -0
  30. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLComments.hpp +270 -0
  31. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLConstants.hpp +18 -0
  32. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLContentTypes.hpp +264 -0
  33. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDateTime.hpp +175 -0
  34. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDocument.hpp +505 -0
  35. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDrawing.hpp +452 -0
  36. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLException.hpp +161 -0
  37. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLFormula.hpp +375 -0
  38. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLIterator.hpp +40 -0
  39. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLMergeCells.hpp +216 -0
  40. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLProperties.hpp +348 -0
  41. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRelationships.hpp +348 -0
  42. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRow.hpp +721 -0
  43. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRowData.hpp +488 -0
  44. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLSharedStrings.hpp +204 -0
  45. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLSheet.hpp +1640 -0
  46. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLStyles.hpp +2390 -0
  47. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLTables.hpp +132 -0
  48. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLWorkbook.hpp +404 -0
  49. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlData.hpp +283 -0
  50. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlFile.hpp +194 -0
  51. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlParser.hpp +282 -0
  52. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlParserForwardDeclarations.hpp +85 -0
  53. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLZipArchive.hpp +232 -0
  54. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/LibZip.hpp +447 -0
  55. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/OpenXLSXFileSystemTools.hpp +207 -0
  56. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/Zippy.hpp +1375 -0
  57. package/thirdparty/README.md +7 -3
@@ -0,0 +1,282 @@
1
+ /*
2
+
3
+ ____ ____ ___ ____ ____ ____ ___
4
+ 6MMMMb `MM( )M' `MM' 6MMMMb\`MM( )M'
5
+ 8P Y8 `MM. d' MM 6M' ` `MM. d'
6
+ 6M Mb __ ____ ____ ___ __ `MM. d' MM MM `MM. d'
7
+ MM MM `M6MMMMb 6MMMMb `MM 6MMb `MM. d' MM YM. `MM. d'
8
+ MM MM MM' `Mb 6M' `Mb MMM9 `Mb `MMd MM YMMMMb `MMd
9
+ MM MM MM MM MM MM MM' MM dMM. MM `Mb dMM.
10
+ MM MM MM MM MMMMMMMM MM MM d'`MM. MM MM d'`MM.
11
+ YM M9 MM MM MM MM MM d' `MM. MM MM d' `MM.
12
+ 8b d8 MM. ,M9 YM d9 MM MM d' `MM. MM / L ,M9 d' `MM.
13
+ YMMMM9 MMYMMM9 YMMMM9 _MM_ _MM_M(_ _)MM_ _MMMMMMM MYMMMM9 _M(_ _)MM_
14
+ MM
15
+ MM
16
+ _MM_
17
+
18
+ Copyright (c) 2018, Kenneth Troldal Balslev
19
+
20
+ All rights reserved.
21
+
22
+ Redistribution and use in source and binary forms, with or without
23
+ modification, are permitted provided that the following conditions are met:
24
+ - Redistributions of source code must retain the above copyright
25
+ notice, this list of conditions and the following disclaimer.
26
+ - Redistributions in binary form must reproduce the above copyright
27
+ notice, this list of conditions and the following disclaimer in the
28
+ documentation and/or other materials provided with the distribution.
29
+ - Neither the name of the author nor the
30
+ names of any contributors may be used to endorse or promote products
31
+ derived from this software without specific prior written permission.
32
+
33
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
34
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
35
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
37
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
38
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
39
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
40
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43
+
44
+ */
45
+
46
+ #ifndef OPENXLSX_XLXMLPARSER_HPP
47
+ #define OPENXLSX_XLXMLPARSER_HPP
48
+
49
+ #include <memory> // shared_ptr
50
+
51
+ // ===== pugixml header needed for pugi::impl::xml_memory_page_type_mask, pugi::xml_node_type, pugi::char_t, pugi::node_element, pugi::xml_node, pugi::xml_attribute, pugi::xml_document
52
+ #include <pugixml.hpp> // include public pugixml header, wherever it may be in the include paths
53
+ #include "XLException.hpp"
54
+ #include "XLXmlParserForwardDeclarations.hpp"
55
+
56
+ namespace { // anonymous namespace to define constants / functions that shall not be exported from this module
57
+ constexpr const int XLMaxNamespacedNameLen = 100;
58
+ } // anonymous namespace
59
+
60
+ namespace OpenXLSX
61
+ {
62
+ # define ENABLE_XML_NAMESPACES 1 // disable this line to control behavior via compiler flag
63
+ # define NO_MULTITHREADING_SAFETY 1 // if this is defined, the function namespaced_name_char will be used for XML namespace support,
64
+ // // using a static character array for improved performance when multithreading conflicts are not a risk
65
+
66
+ # ifdef ENABLE_XML_NAMESPACES
67
+ // ===== Macro for NAMESPACED_NAME when node names might need to be prefixed with the current node's namespace
68
+ # ifdef NO_MULTITHREADING_SAFETY
69
+ # define NAMESPACED_NAME(name_, force_ns_) namespaced_name_char(name_, force_ns_)
70
+ # else
71
+ # define NAMESPACED_NAME(name_, force_ns_) namespaced_name_shared_ptr(name_, force_ns_).get()
72
+ # endif
73
+ # else
74
+ // ===== Optimized version when no namespace support is desired - ignores force_ns_ setting
75
+ # define NAMESPACED_NAME(name_, force_ns_) name_
76
+ # endif
77
+
78
+ constexpr const bool XLForceNamespace = true;
79
+ /**
80
+ * With namespace support: where OpenXLSX already addresses nodes by their namespace, doubling the namespace in a node name
81
+ * upon node create can be avoided by passing the optional parameter XLForceNamespace - this will use the node name passed to the
82
+ * insertion function "as-is".
83
+ * Affected XMLNode methods: ::set_name, ::append_child, ::prepend_child, ::insert_child_after, ::insert_child_before
84
+ */
85
+
86
+ extern bool NO_XML_NS; // defined in XLXmlParser.cpp - default: no XML namespaces
87
+ /**
88
+ * @brief Set NO_XML_NS to false
89
+ * @return true if PUGI_AUGMENTED is defined (success), false if PUGI_AUGMENTED is not in use (function would be pointless)
90
+ * @note CAUTION: this setting should be established before any other OpenXLSX function is used
91
+ */
92
+ bool enable_xml_namespaces();
93
+ /**
94
+ * @brief Set NO_XML_NS to true
95
+ * @return true if PUGI_AUGMENTED is defined (success), false if PUGI_AUGMENTED is not in use (function would be pointless)
96
+ * @note CAUTION: this setting should be established before any other OpenXLSX function is used
97
+ */
98
+ bool disable_xml_namespaces();
99
+
100
+
101
+ // ===== 2025-07-14: moved forward declarations to XLXmlParserForwardDeclarations.hpp =====
102
+
103
+
104
+ // ===== Custom OpenXLSX_xml_node to add functionality to pugi::xml_node
105
+ class OpenXLSX_xml_node : public pugi::xml_node {
106
+ public:
107
+ /**
108
+ * @brief Default constructor. Constructs a null object.
109
+ */
110
+ OpenXLSX_xml_node() : pugi::xml_node(), name_begin(0) {}
111
+
112
+ /**
113
+ * @brief Inherit all constructors with parameters from pugi::xml_node
114
+ */
115
+ template<class base>
116
+ // explicit OpenXLSX_xml_node(base b) : pugi::xml_node(b), name_begin(0) // TBD on explicit keyword
117
+ OpenXLSX_xml_node(base b) : pugi::xml_node(b), name_begin(0)
118
+ {
119
+ if (NO_XML_NS) return;
120
+ const char *name = xml_node::name();
121
+ int pos = 0;
122
+ while (name[pos] && name[pos] != ':') ++pos; // find name delimiter
123
+ if (name[pos] == ':') name_begin = pos + 1; // if delimiter was found: update name_begin to point behind that position
124
+ }
125
+
126
+ /**
127
+ * @brief Strip any namespace from name_
128
+ * @param name_ A node name which may be prefixed with any namespace like so "namespace:nodename"
129
+ * @return The name_ stripped of a namespace prefix
130
+ */
131
+ const pugi::char_t* name_without_namespace(const pugi::char_t* name_) const;
132
+
133
+ /**
134
+ * @brief add this node's namespace to name_
135
+ * @param name_ a node name which shall be prefixed with this node's current namespace
136
+ * @param force_ns if true, will return name_ unmodified
137
+ * @return this node's current namespace + ":" + name_ as a const pugi::char_t *
138
+ */
139
+ const pugi::char_t* namespaced_name_char(const pugi::char_t* name_, bool force_ns) const;
140
+
141
+ /**
142
+ * @brief add this node's namespace to name_
143
+ * @param name_ a node name which shall be prefixed with this node's current namespace
144
+ * @param force_ns if true, will return name_ unmodified
145
+ * @return this node's current namespace + ":" + name_ as a shared_ptr to pugi::char_t
146
+ */
147
+ std::shared_ptr<pugi::char_t> namespaced_name_shared_ptr(const pugi::char_t* name_, bool force_ns) const;
148
+
149
+
150
+ // ===== BEGIN: Wrappers for xml_node member functions to ensure OpenXLSX_xml_node return values
151
+ // and overrides for xml_node member functions to support ignoring the node namespace
152
+ // ===== CAUTION: this section might be incomplete, only functions actually used by OpenXLSX to date have been checked
153
+
154
+ /**
155
+ * @brief get node name while stripping namespace, if so configured (name_begin > 0)
156
+ * @return the node name without a namespace
157
+ */
158
+ const pugi::char_t* name() const { return &xml_node::name()[name_begin]; }
159
+
160
+ /**
161
+ * @brief get actual node name from pugi::xml_node::name, including namespace, if any
162
+ * @return the raw node name
163
+ */
164
+ const pugi::char_t* raw_name() const { return xml_node::name(); }
165
+
166
+ /**
167
+ * @brief for all functions returning xml_node: invoke base class function, but with a return type of XMLNode (OpenXLSX_xml_node)
168
+ */
169
+ XMLNode parent() { return pugi::xml_node::parent(); }
170
+ template <typename Predicate> XMLNode find_child(Predicate pred) const { return pugi::xml_node::find_child(pred); }
171
+ XMLNode child(const pugi::char_t* name_) const { return xml_node::child(NAMESPACED_NAME(name_, false)); }
172
+ XMLNode next_sibling(const pugi::char_t* name_) const { return xml_node::next_sibling(NAMESPACED_NAME(name_, false)); }
173
+ XMLNode next_sibling() const { return xml_node::next_sibling(); }
174
+ XMLNode previous_sibling(const pugi::char_t* name_) const { return xml_node::previous_sibling(NAMESPACED_NAME(name_, false)); }
175
+ XMLNode previous_sibling() const { return xml_node::previous_sibling(); }
176
+ const pugi::char_t* child_value() const { return xml_node::child_value(); }
177
+ const pugi::char_t* child_value(const pugi::char_t* name_) const { return xml_node::child_value(NAMESPACED_NAME(name_, false)); }
178
+ bool set_name(const pugi::char_t* rhs, bool force_ns = false) { return xml_node::set_name(NAMESPACED_NAME(rhs, force_ns)); }
179
+ bool set_name(const pugi::char_t* rhs, size_t size, bool force_ns = false) { return xml_node::set_name(NAMESPACED_NAME(rhs, force_ns), size + name_begin); }
180
+ XMLNode append_child(pugi::xml_node_type type_) { return xml_node::append_child(type_); }
181
+ XMLNode prepend_child(pugi::xml_node_type type_) { return xml_node::prepend_child(type_); }
182
+ XMLNode append_child(const pugi::char_t* name_, bool force_ns = false) { return xml_node::append_child(NAMESPACED_NAME(name_, force_ns)); }
183
+ XMLNode prepend_child(const pugi::char_t* name_, bool force_ns = false) { return xml_node::prepend_child(NAMESPACED_NAME(name_, force_ns)); }
184
+ XMLNode insert_child_after(pugi::xml_node_type type_, const xml_node& node) { return xml_node::insert_child_after(type_, node); }
185
+ XMLNode insert_child_before(pugi::xml_node_type type_, const xml_node& node) { return xml_node::insert_child_before(type_, node); }
186
+ XMLNode insert_child_after(const pugi::char_t* name_, const xml_node& node, bool force_ns = false)
187
+ { return xml_node::insert_child_after(NAMESPACED_NAME(name_, force_ns), node); }
188
+ XMLNode insert_child_before(const pugi::char_t* name_, const xml_node& node, bool force_ns = false)
189
+ { return xml_node::insert_child_before(NAMESPACED_NAME(name_, force_ns), node); }
190
+ bool remove_child(const pugi::char_t* name_) { return xml_node::remove_child(NAMESPACED_NAME(name_, false)); }
191
+ bool remove_child(const xml_node& n) { return xml_node::remove_child(n); }
192
+ XMLNode find_child_by_attribute(const pugi::char_t* name_, const pugi::char_t* attr_name, const pugi::char_t* attr_value) const
193
+ { return xml_node::find_child_by_attribute(NAMESPACED_NAME(name_, false), attr_name, attr_value); }
194
+ XMLNode find_child_by_attribute(const pugi::char_t* attr_name, const pugi::char_t* attr_value) const
195
+ { return xml_node::find_child_by_attribute(attr_name, attr_value); }
196
+ // DISCLAIMER: unused by OpenXLSX, but theoretically impacted by xml namespaces:
197
+ // PUGI_IMPL_FN xml_node xml_node::first_element_by_path(const pugi::char_t* path_, pugi::char_t delimiter) const
198
+ // ===== END: Wrappers for xml_node member functions
199
+
200
+ /**
201
+ * @brief get first node child that matches type
202
+ * @param type_ the pugi::xml_node_type to match
203
+ * @return a valid child matching the node type or an empty XMLNode
204
+ */
205
+ XMLNode first_child_of_type(pugi::xml_node_type type_ = pugi::node_element) const;
206
+
207
+ /**
208
+ * @brief get last node child that matches type
209
+ * @param type_ the pugi::xml_node_type to match
210
+ * @return a valid child matching the node type or an empty XMLNode
211
+ */
212
+ XMLNode last_child_of_type(pugi::xml_node_type type_ = pugi::node_element) const;
213
+
214
+ /**
215
+ * @brief count node children that match type
216
+ * @param type_ the pugi::xml_node_type to match
217
+ * @return the amount of node children matching type
218
+ */
219
+ size_t child_count_of_type(pugi::xml_node_type type_ = pugi::node_element) const;
220
+
221
+ /**
222
+ * @brief get next node sibling that matches type
223
+ * @param type_ the pugi::xml_node_type to match
224
+ * @return a valid sibling matching the node type or an empty XMLNode
225
+ */
226
+ XMLNode next_sibling_of_type(pugi::xml_node_type type_ = pugi::node_element) const;
227
+
228
+ /**
229
+ * @brief get previous node sibling that matches type
230
+ * @param type_ the pugi::xml_node_type to match
231
+ * @return a valid sibling matching the node type or an empty XMLNode
232
+ */
233
+ XMLNode previous_sibling_of_type(pugi::xml_node_type type_ = pugi::node_element) const;
234
+
235
+ /**
236
+ * @brief get next node sibling that matches name_ and type
237
+ * @param name_ the xml_node::name() to match
238
+ * @param type_ the pugi::xml_node_type to match
239
+ * @return a valid sibling matching the node type or an empty XMLNode
240
+ */
241
+ XMLNode next_sibling_of_type(const pugi::char_t* name_, pugi::xml_node_type type_ = pugi::node_element) const;
242
+
243
+ /**
244
+ * @brief get previous node sibling that matches name_ and type
245
+ * @param name_ the xml_node::name() to match
246
+ * @param type_ the pugi::xml_node_type to match
247
+ * @return a valid sibling matching the node type or an empty XMLNode
248
+ */
249
+ XMLNode previous_sibling_of_type(const pugi::char_t* name_, pugi::xml_node_type type_ = pugi::node_element) const;
250
+
251
+ private:
252
+ int name_begin; // nameBegin holds the position in xml_node::name() where the actual node name begins - 0 for non-namespaced nodes
253
+ // for nodes with a namespace: the position following namespace + delimiter colon, e.g. "x:c" -> nameBegin = 2
254
+ };
255
+
256
+ // ===== Custom OpenXLSX_xml_document to override relevant pugi::xml_document member functions with OpenXLSX_xml_node return value
257
+ class OpenXLSX_xml_document : public pugi::xml_document {
258
+ public:
259
+ /**
260
+ * @brief Default constructor. Constructs a null object.
261
+ */
262
+ OpenXLSX_xml_document() : pugi::xml_document() {}
263
+
264
+ /**
265
+ * @brief Inherit all constructors with parameters from pugi::xml_document
266
+ */
267
+ template<class base>
268
+ // explicit OpenXLSX_xml_document(base b) : xml_document(b) // TBD
269
+ OpenXLSX_xml_document(base b) : pugi::xml_document(b)
270
+ {}
271
+
272
+ // ===== BEGIN: Wrappers for xml_document member functions to ensure OpenXLSX_xml_node return values
273
+ // ===== CAUTION: this section is incomplete, only implementing those functions actually used by OpenXLSX to date
274
+ /**
275
+ * @brief for all functions: invoke the base class function, but with a return type of OpenXLSX_xml_node
276
+ */
277
+ XMLNode document_element() const { return pugi::xml_document::document_element(); }
278
+ // ===== END: Wrappers for xml_document member functions
279
+ };
280
+
281
+ } // namespace OpenXLSX
282
+ #endif // OPENXLSX_XLXMLPARSER_HPP
@@ -0,0 +1,85 @@
1
+ /*
2
+
3
+ ____ ____ ___ ____ ____ ____ ___
4
+ 6MMMMb `MM( )M' `MM' 6MMMMb\`MM( )M'
5
+ 8P Y8 `MM. d' MM 6M' ` `MM. d'
6
+ 6M Mb __ ____ ____ ___ __ `MM. d' MM MM `MM. d'
7
+ MM MM `M6MMMMb 6MMMMb `MM 6MMb `MM. d' MM YM. `MM. d'
8
+ MM MM MM' `Mb 6M' `Mb MMM9 `Mb `MMd MM YMMMMb `MMd
9
+ MM MM MM MM MM MM MM' MM dMM. MM `Mb dMM.
10
+ MM MM MM MM MMMMMMMM MM MM d'`MM. MM MM d'`MM.
11
+ YM M9 MM MM MM MM MM d' `MM. MM MM d' `MM.
12
+ 8b d8 MM. ,M9 YM d9 MM MM d' `MM. MM / L ,M9 d' `MM.
13
+ YMMMM9 MMYMMM9 YMMMM9 _MM_ _MM_M(_ _)MM_ _MMMMMMM MYMMMM9 _M(_ _)MM_
14
+ MM
15
+ MM
16
+ _MM_
17
+
18
+ Copyright (c) 2018, Kenneth Troldal Balslev
19
+
20
+ All rights reserved.
21
+
22
+ Redistribution and use in source and binary forms, with or without
23
+ modification, are permitted provided that the following conditions are met:
24
+ - Redistributions of source code must retain the above copyright
25
+ notice, this list of conditions and the following disclaimer.
26
+ - Redistributions in binary form must reproduce the above copyright
27
+ notice, this list of conditions and the following disclaimer in the
28
+ documentation and/or other materials provided with the distribution.
29
+ - Neither the name of the author nor the
30
+ names of any contributors may be used to endorse or promote products
31
+ derived from this software without specific prior written permission.
32
+
33
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
34
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
35
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
37
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
38
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
39
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
40
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43
+
44
+ */
45
+
46
+ #ifndef OPENXLSX_XLXMLPARSER_FORWARD_DECLARATIONS_HPP
47
+ #define OPENXLSX_XLXMLPARSER_FORWARD_DECLARATIONS_HPP
48
+
49
+ // disable this line to use original (non-augmented) pugixml - as of 2024-07-29 this is no longer a realistic option
50
+ #define PUGI_AUGMENTED
51
+
52
+ namespace pugi {
53
+ # ifdef PUGI_AUGMENTED
54
+ class xml_attribute;
55
+ # else
56
+ class xml_node;
57
+ class xml_attribute;
58
+ class xml_document;
59
+ # endif
60
+ }
61
+
62
+ namespace OpenXLSX {
63
+ // ===== Functions to enable/disable support for documents that use XML namespaces for OOXML tags
64
+ // Both functions return true on success, false if functionality is not supported (it is supported, so this should not happen)
65
+ bool enable_xml_namespaces(); // enable support for namespaces (costs performance on documents without such namespaces)
66
+ bool disable_xml_namespaces(); // disable support for namespaces
67
+
68
+ // ===== Using statements to switch between pugixml and augmented pugixml implementation
69
+ # ifdef PUGI_AUGMENTED
70
+ // ===== Forward declarations for using statements below
71
+ class OpenXLSX_xml_node;
72
+ class OpenXLSX_xml_document;
73
+
74
+ using XMLNode = OpenXLSX_xml_node;
75
+ using XMLAttribute = pugi::xml_attribute;
76
+ using XMLDocument = OpenXLSX_xml_document;
77
+ # else
78
+ using XMLNode = pugi::xml_node;
79
+ using XMLAttribute = pugi::xml_attribute;
80
+ using XMLDocument = pugi::xml_document;
81
+ # endif
82
+ } // namespace OpenXLSX
83
+
84
+ #endif // OPENXLSX_XLXMLPARSER_FORWARD_DECLARATIONS_HPP
85
+
@@ -0,0 +1,232 @@
1
+ /*
2
+
3
+ ____ ____ ___ ____ ____ ____ ___
4
+ 6MMMMb `MM( )M' `MM' 6MMMMb\`MM( )M'
5
+ 8P Y8 `MM. d' MM 6M' ` `MM. d'
6
+ 6M Mb __ ____ ____ ___ __ `MM. d' MM MM `MM. d'
7
+ MM MM `M6MMMMb 6MMMMb `MM 6MMb `MM. d' MM YM. `MM. d'
8
+ MM MM MM' `Mb 6M' `Mb MMM9 `Mb `MMd MM YMMMMb `MMd
9
+ MM MM MM MM MM MM MM' MM dMM. MM `Mb dMM.
10
+ MM MM MM MM MMMMMMMM MM MM d'`MM. MM MM d'`MM.
11
+ YM M9 MM MM MM MM MM d' `MM. MM MM d' `MM.
12
+ 8b d8 MM. ,M9 YM d9 MM MM d' `MM. MM / L ,M9 d' `MM.
13
+ YMMMM9 MMYMMM9 YMMMM9 _MM_ _MM_M(_ _)MM_ _MMMMMMM MYMMMM9 _M(_ _)MM_
14
+ MM
15
+ MM
16
+ _MM_
17
+
18
+ Copyright (c) 2018, Kenneth Troldal Balslev
19
+
20
+ All rights reserved.
21
+
22
+ Redistribution and use in source and binary forms, with or without
23
+ modification, are permitted provided that the following conditions are met:
24
+ - Redistributions of source code must retain the above copyright
25
+ notice, this list of conditions and the following disclaimer.
26
+ - Redistributions in binary form must reproduce the above copyright
27
+ notice, this list of conditions and the following disclaimer in the
28
+ documentation and/or other materials provided with the distribution.
29
+ - Neither the name of the author nor the
30
+ names of any contributors may be used to endorse or promote products
31
+ derived from this software without specific prior written permission.
32
+
33
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
34
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
35
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
37
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
38
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
39
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
40
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
42
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43
+
44
+ */
45
+
46
+ #ifndef OPENXLSX_XLZIPARCHIVE_HPP
47
+ #define OPENXLSX_XLZIPARCHIVE_HPP
48
+
49
+ #ifdef _MSC_VER // conditionally enable MSVC specific pragmas to avoid other compilers warning about unknown pragmas
50
+ # pragma warning(push)
51
+ # pragma warning(disable : 4251)
52
+ # pragma warning(disable : 4275)
53
+ #endif // _MSC_VER
54
+
55
+ // ===== External Includes ===== //
56
+ #include <memory> // std::shared_ptr
57
+ #include <cstddef> // size_t
58
+ #include <type_traits> // std::make_signed_t
59
+
60
+ // ===== OpenXLSX Includes ===== //
61
+ #include "OpenXLSX-Exports.hpp"
62
+
63
+ #ifdef USE_LIBZIP
64
+ namespace LibZip {
65
+ class ZipArchive;
66
+ } // namespace LibZip
67
+ #define XLZipImplementation LibZip::ZipArchive
68
+ #else
69
+ namespace Zippy
70
+ {
71
+ class ZipArchive;
72
+ } // namespace Zippy
73
+ #define XLZipImplementation Zippy::ZipArchive
74
+ #endif
75
+
76
+ // ===== portable ssize_t definition ===== //
77
+ using ssize_t = std::make_signed_t< std::size_t >;
78
+
79
+ namespace OpenXLSX
80
+ {
81
+ /**
82
+ * @brief provide the user with the name of the zip library in use
83
+ */
84
+ OPENXLSX_EXPORT const char *ZipLibraryName();
85
+
86
+ /**
87
+ * @brief provide the user with the version string of the zip library in use
88
+ */
89
+ OPENXLSX_EXPORT const char *ZipLibraryVersion();
90
+
91
+ /**
92
+ * @brief
93
+ */
94
+ class OPENXLSX_EXPORT XLZipArchive
95
+ {
96
+ public:
97
+ /**
98
+ * @brief
99
+ */
100
+ XLZipArchive();
101
+
102
+ /**
103
+ * @brief
104
+ * @param other
105
+ */
106
+ XLZipArchive(const XLZipArchive& other);
107
+
108
+ /**
109
+ * @brief
110
+ * @param other
111
+ */
112
+ XLZipArchive(XLZipArchive&& other) noexcept;
113
+
114
+ /**
115
+ * @brief
116
+ */
117
+ ~XLZipArchive();
118
+
119
+ /**
120
+ * @brief copy assignment shall be disabled until a use case is found
121
+ * @param other
122
+ * @return
123
+ */
124
+ XLZipArchive& operator=(const XLZipArchive& other) = delete;
125
+
126
+ /**
127
+ * @brief
128
+ * @param other
129
+ * @return
130
+ */
131
+ XLZipArchive& operator=(XLZipArchive&& other) noexcept;
132
+
133
+ /**
134
+ * @brief check if zippy is in use (or ziplib)
135
+ * @param
136
+ * @return true if zippy is used for the zip implementation, otherwise false
137
+ */
138
+ bool usesZippy();
139
+
140
+ /**
141
+ * @brief
142
+ * @return
143
+ */
144
+ explicit operator bool() const;
145
+
146
+ bool isValid() const;
147
+
148
+ /**
149
+ * @brief
150
+ * @return
151
+ */
152
+ bool isOpen() const;
153
+
154
+ /**
155
+ * @brief
156
+ * @param fileName
157
+ */
158
+ void open(const std::string& fileName);
159
+
160
+ /**
161
+ * @brief
162
+ */
163
+ void close();
164
+
165
+ /**
166
+ * @brief make archive updates (from addEntry) available to calls via getEntry
167
+ */
168
+ void commitChanges();
169
+
170
+ /**
171
+ * @brief
172
+ * @param path
173
+ */
174
+ void save(const std::string& path = "");
175
+
176
+ /**
177
+ * @brief
178
+ * @param name
179
+ * @param data
180
+ */
181
+ void addEntry(const std::string& name, const std::string& data);
182
+
183
+ /**
184
+ * @brief like addEntry, but call commitChanges() afterwards
185
+ * @param name
186
+ * @param data
187
+ */
188
+ void addEntryAndCommit(const std::string& name, const std::string& data);
189
+
190
+ /**
191
+ * @brief
192
+ * @param entryName
193
+ */
194
+ void deleteEntry(const std::string& entryName);
195
+
196
+ /**
197
+ * @brief
198
+ * @param name
199
+ * @return
200
+ */
201
+ std::string getEntry(const std::string& name) const;
202
+
203
+ /**
204
+ * @brief
205
+ * @param entryName
206
+ * @return
207
+ */
208
+ bool hasEntry(const std::string& entryName) const;
209
+
210
+ /**
211
+ * @brief get the amount of entries in the archive
212
+ * @return for libzip: amount of entries in archive, 0 for zippy
213
+ */
214
+ ssize_t entryCount() const;
215
+
216
+ /**
217
+ * @brief get the name of an archive entry by its index
218
+ * @param index the archive entry whose name to fetch
219
+ * @return for libzip: name of the archive entry (full path), "" for zippy
220
+ */
221
+ std::string entryName( int index ) const;
222
+
223
+ private:
224
+ std::shared_ptr<XLZipImplementation> m_archive; /**< */
225
+ };
226
+ } // namespace OpenXLSX
227
+
228
+ #ifdef _MSC_VER // conditionally enable MSVC specific pragmas to avoid other compilers warning about unknown pragmas
229
+ # pragma warning(pop)
230
+ #endif // _MSC_VER
231
+
232
+ #endif // OPENXLSX_XLZIPARCHIVE_HPP