react-native-nitro-xlsx 0.2.5 → 0.2.6

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 (395) hide show
  1. package/NitroXlsx.podspec +26 -27
  2. package/Package.swift +31 -10
  3. package/README.md +1 -1
  4. package/android/CMakeLists.txt +20 -27
  5. package/package.json +2 -2
  6. package/scripts/run-cpp-tests.sh +1 -1
  7. package/thirdparty/OpenXLSX/.clang-format +118 -0
  8. package/thirdparty/OpenXLSX/.clang-tidy +28 -0
  9. package/thirdparty/OpenXLSX/.gitignore +130 -0
  10. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_before_XMLNode_wrappers +46 -0
  11. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_and_stripping +49 -0
  12. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_char_support +49 -0
  13. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_support +49 -0
  14. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespaced_name_disabled +49 -0
  15. package/thirdparty/OpenXLSX/Benchmarks/2024-08-11-benchmarks_post-XLCellIterator-Rework +46 -0
  16. package/thirdparty/OpenXLSX/Benchmarks/2024-08-14-benchmarks_post-default-row-column-style-support +46 -0
  17. package/thirdparty/OpenXLSX/Benchmarks/2024-09-02-benchmarks +46 -0
  18. package/thirdparty/OpenXLSX/Benchmarks/2024-12-19-benchmarks +46 -0
  19. package/thirdparty/OpenXLSX/Benchmarks/2024-12-30-benchmarks-post-XLSharedStrings-by-ref +46 -0
  20. package/thirdparty/OpenXLSX/Benchmarks/2025-01-09-benchmarks-post-conditionalFormatsAndSheetProtection +46 -0
  21. package/thirdparty/OpenXLSX/Benchmarks/2025-01-10-benchmarks-post-XLCellValue-bugfix +46 -0
  22. package/thirdparty/OpenXLSX/Benchmarks/2025-01-31-benchmarks-post-XLComments-implementation +46 -0
  23. package/thirdparty/OpenXLSX/Benchmarks/2025-02-02-benchmarks-post-XLRowIterator-Rework +46 -0
  24. package/thirdparty/OpenXLSX/Benchmarks/2025-07-20-benchmarks-after-hiding-pugixml-internals +46 -0
  25. package/thirdparty/OpenXLSX/Benchmarks/2025-08-29-benchmarks-after-code-review-with-libzip +46 -0
  26. package/thirdparty/OpenXLSX/Benchmarks/Benchmark.cpp +249 -0
  27. package/thirdparty/OpenXLSX/Benchmarks/CMakeLists.txt +19 -0
  28. package/thirdparty/OpenXLSX/CMakeLists.txt +466 -0
  29. package/thirdparty/OpenXLSX/Documentation/CMakeLists.txt +31 -0
  30. package/thirdparty/OpenXLSX/Documentation/Doxyfile.in +2471 -0
  31. package/thirdparty/OpenXLSX/Documentation/DoxygenLayout.xml +194 -0
  32. package/thirdparty/OpenXLSX/Documentation/customdoxygen.css +1355 -0
  33. package/thirdparty/OpenXLSX/Examples/CMakeLists.txt +103 -0
  34. package/thirdparty/OpenXLSX/Examples/Demo1.cpp +279 -0
  35. package/thirdparty/OpenXLSX/Examples/Demo10.cpp +545 -0
  36. package/thirdparty/OpenXLSX/Examples/Demo1A.cpp +137 -0
  37. package/thirdparty/OpenXLSX/Examples/Demo2.cpp +65 -0
  38. package/thirdparty/OpenXLSX/Examples/Demo3.cpp +89 -0
  39. package/thirdparty/OpenXLSX/Examples/Demo4.cpp +86 -0
  40. package/thirdparty/OpenXLSX/Examples/Demo5.cpp +77 -0
  41. package/thirdparty/OpenXLSX/Examples/Demo6.cpp +103 -0
  42. package/thirdparty/OpenXLSX/Examples/Demo7.cpp +79 -0
  43. package/thirdparty/OpenXLSX/Examples/Demo8.cpp +117 -0
  44. package/thirdparty/OpenXLSX/Examples/Demo9.cpp +363 -0
  45. package/thirdparty/OpenXLSX/Examples/cmake/FindLIBZIP.cmake +61 -0
  46. package/thirdparty/OpenXLSX/Examples/external/CustomZip/CustomZip.hpp +256 -0
  47. package/thirdparty/OpenXLSX/LICENSE.md +29 -0
  48. package/thirdparty/OpenXLSX/Makefile.GNU +530 -0
  49. package/thirdparty/OpenXLSX/Notes/TBDs.txt +16 -0
  50. package/thirdparty/OpenXLSX/Notes/confirmed-TBCs.txt +8 -0
  51. package/thirdparty/OpenXLSX/Notes/styles-missing-support.xml +12 -0
  52. package/thirdparty/OpenXLSX/Notes/todo-list.txt +108 -0
  53. package/thirdparty/OpenXLSX/OpenXLSX/CMakeLists.txt +631 -0
  54. package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSX.hpp +63 -0
  55. package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSXConfig.cmake +11 -0
  56. package/thirdparty/OpenXLSX/OpenXLSX/cmake/bundle_static_library.cmake +198 -0
  57. package/thirdparty/OpenXLSX/OpenXLSX/cmake/patch_pkg_config.cmake +69 -0
  58. package/thirdparty/OpenXLSX/OpenXLSX/headers/IZipArchive.hpp +361 -0
  59. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX-Exports.hpp +12 -0
  60. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCell.hpp +367 -0
  61. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellIterator.hpp +252 -0
  62. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellRange.hpp +223 -0
  63. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellReference.hpp +317 -0
  64. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellValue.hpp +793 -0
  65. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColor.hpp +232 -0
  66. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColumn.hpp +159 -0
  67. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCommandQuery.hpp +228 -0
  68. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLComments.hpp +270 -0
  69. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLConstants.hpp +18 -0
  70. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLContentTypes.hpp +264 -0
  71. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDateTime.hpp +175 -0
  72. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDocument.hpp +505 -0
  73. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDrawing.hpp +452 -0
  74. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLException.hpp +161 -0
  75. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLFormula.hpp +375 -0
  76. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLIterator.hpp +40 -0
  77. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLMergeCells.hpp +216 -0
  78. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLProperties.hpp +348 -0
  79. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRelationships.hpp +348 -0
  80. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRow.hpp +721 -0
  81. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRowData.hpp +488 -0
  82. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSharedStrings.hpp +204 -0
  83. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSheet.hpp +1640 -0
  84. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLStyles.hpp +2390 -0
  85. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLTables.hpp +132 -0
  86. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLWorkbook.hpp +404 -0
  87. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlData.hpp +283 -0
  88. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlFile.hpp +194 -0
  89. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParser.hpp +282 -0
  90. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParserForwardDeclarations.hpp +85 -0
  91. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLZipArchive.hpp +232 -0
  92. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/LibZip.hpp +447 -0
  93. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/OpenXLSXFileSystemTools.hpp +207 -0
  94. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/Zippy.hpp +1375 -0
  95. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCell.cpp +340 -0
  96. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellIterator.cpp +427 -0
  97. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellRange.cpp +221 -0
  98. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellReference.cpp +408 -0
  99. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellValue.cpp +519 -0
  100. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColor.cpp +202 -0
  101. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColumn.cpp +141 -0
  102. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLComments.cpp +637 -0
  103. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLContentTypes.cpp +329 -0
  104. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDateTime.cpp +269 -0
  105. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDocument.cpp +1678 -0
  106. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDrawing.cpp +784 -0
  107. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLFormula.cpp +201 -0
  108. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLMergeCells.cpp +357 -0
  109. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLProperties.cpp +810 -0
  110. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRelationships.cpp +529 -0
  111. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRow.cpp +918 -0
  112. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRowData.cpp +508 -0
  113. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSharedStrings.cpp +220 -0
  114. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSheet.cpp +1970 -0
  115. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLStyles.cpp +3014 -0
  116. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLTables.cpp +125 -0
  117. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLWorkbook.cpp +784 -0
  118. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlData.cpp +247 -0
  119. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlFile.cpp +160 -0
  120. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlParser.cpp +261 -0
  121. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLZipArchive.cpp +266 -0
  122. package/thirdparty/OpenXLSX/OpenXLSX/sources/utilities/XLUtilities.hpp +478 -0
  123. package/thirdparty/OpenXLSX/README.md +1279 -0
  124. package/thirdparty/OpenXLSX/Scripts/cmake-cleanup.sh +102 -0
  125. package/thirdparty/OpenXLSX/Scripts/compile.sh +23 -0
  126. package/thirdparty/OpenXLSX/Scripts/demos-cleanup.sh +25 -0
  127. package/thirdparty/OpenXLSX/Scripts/demos-run-all.sh +60 -0
  128. package/thirdparty/OpenXLSX/Scripts/guarded-xml-format.sh +47 -0
  129. package/thirdparty/OpenXLSX/Scripts/make-gnu.sh +11 -0
  130. package/thirdparty/OpenXLSX/Scripts/uninstall-manifest.sh +48 -0
  131. package/thirdparty/OpenXLSX/Scripts/xml-format-all.sh +19 -0
  132. package/thirdparty/OpenXLSX/Scripts/xml-format.sh +38 -0
  133. package/thirdparty/OpenXLSX/Tests/CMakeLists.txt +37 -0
  134. package/thirdparty/OpenXLSX/Tests/catch/catch.hpp +17799 -0
  135. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_automake.hpp +68 -0
  136. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_sonarqube.hpp +182 -0
  137. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_tap.hpp +278 -0
  138. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_teamcity.hpp +212 -0
  139. package/thirdparty/OpenXLSX/Tests/main.cpp +55 -0
  140. package/thirdparty/OpenXLSX/Tests/testXLCell.cpp +176 -0
  141. package/thirdparty/OpenXLSX/Tests/testXLCellRange.cpp +180 -0
  142. package/thirdparty/OpenXLSX/Tests/testXLCellReference.cpp +160 -0
  143. package/thirdparty/OpenXLSX/Tests/testXLCellValue.cpp +366 -0
  144. package/thirdparty/OpenXLSX/Tests/testXLCellValueProxy.cpp +255 -0
  145. package/thirdparty/OpenXLSX/Tests/testXLColor.cpp +75 -0
  146. package/thirdparty/OpenXLSX/Tests/testXLDateTime.cpp +229 -0
  147. package/thirdparty/OpenXLSX/Tests/testXLDocument.cpp +197 -0
  148. package/thirdparty/OpenXLSX/Tests/testXLFormula.cpp +131 -0
  149. package/thirdparty/OpenXLSX/Tests/testXLRow.cpp +597 -0
  150. package/thirdparty/OpenXLSX/Tests/testXLSheet.cpp +77 -0
  151. package/thirdparty/OpenXLSX/Tests/ziptest-with-libs.cpp +88 -0
  152. package/thirdparty/OpenXLSX/Tests/ziptest.cpp +735 -0
  153. package/thirdparty/OpenXLSX/cmake/get-git-HEAD-ID.cmake +45 -0
  154. package/thirdparty/OpenXLSX/cmake/libopenxlsxCPackOptions.cmake.in +20 -0
  155. package/thirdparty/OpenXLSX/cmake/manage_dependency.cmake +813 -0
  156. package/thirdparty/OpenXLSX/cmake/recursive_library_type_test.cmake +52 -0
  157. package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-shared.hpp +42 -0
  158. package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-static.hpp +42 -0
  159. package/thirdparty/OpenXLSX/vcpkg.json +24 -0
  160. package/thirdparty/README.md +42 -0
  161. package/thirdparty/miniz/.clang-format +47 -0
  162. package/thirdparty/miniz/.travis.yml +2 -0
  163. package/thirdparty/miniz/CMakeLists.txt +333 -0
  164. package/thirdparty/miniz/CMakePresets.json +31 -0
  165. package/thirdparty/miniz/ChangeLog.md +272 -0
  166. package/thirdparty/miniz/Config.cmake.in +1 -0
  167. package/thirdparty/miniz/LICENSE +22 -0
  168. package/thirdparty/miniz/amalgamate.sh +57 -0
  169. package/thirdparty/miniz/examples/example1.c +105 -0
  170. package/thirdparty/miniz/examples/example2.c +164 -0
  171. package/thirdparty/miniz/examples/example3.c +269 -0
  172. package/thirdparty/miniz/examples/example4.c +102 -0
  173. package/thirdparty/miniz/examples/example5.c +327 -0
  174. package/thirdparty/miniz/examples/example6.c +189 -0
  175. package/thirdparty/miniz/meson.build +21 -0
  176. package/thirdparty/miniz/miniz.c +646 -0
  177. package/thirdparty/miniz/miniz.h +615 -0
  178. package/thirdparty/miniz/miniz.pc.in +13 -0
  179. package/thirdparty/miniz/miniz_common.h +89 -0
  180. package/thirdparty/miniz/miniz_export.h +20 -0
  181. package/thirdparty/miniz/miniz_tdef.c +1602 -0
  182. package/thirdparty/miniz/miniz_tdef.h +199 -0
  183. package/thirdparty/miniz/miniz_tinfl.c +778 -0
  184. package/thirdparty/miniz/miniz_tinfl.h +150 -0
  185. package/thirdparty/miniz/miniz_zip.c +4895 -0
  186. package/thirdparty/miniz/miniz_zip.h +454 -0
  187. package/thirdparty/miniz/readme.md +46 -0
  188. package/thirdparty/miniz/test.sh +36 -0
  189. package/thirdparty/miniz/tests/add_in_place_fuzzer.c +87 -0
  190. package/thirdparty/miniz/tests/catch_amalgamated.cpp +10795 -0
  191. package/thirdparty/miniz/tests/catch_amalgamated.hpp +13143 -0
  192. package/thirdparty/miniz/tests/checksum_fuzzer.c +26 -0
  193. package/thirdparty/miniz/tests/compress_fuzzer.c +91 -0
  194. package/thirdparty/miniz/tests/flush_fuzzer.c +88 -0
  195. package/thirdparty/miniz/tests/fuzz_main.c +55 -0
  196. package/thirdparty/miniz/tests/large_fuzzer.c +133 -0
  197. package/thirdparty/miniz/tests/main.cpp +185 -0
  198. package/thirdparty/miniz/tests/miniz_tdefl_fuzzer.cc +115 -0
  199. package/thirdparty/miniz/tests/miniz_tester.cpp +1881 -0
  200. package/thirdparty/miniz/tests/miniz_zip_validate_fuzzer.cc +71 -0
  201. package/thirdparty/miniz/tests/miniz_zip_writer_fuzzer.cc +96 -0
  202. package/thirdparty/miniz/tests/ossfuzz.sh +48 -0
  203. package/thirdparty/miniz/tests/small_fuzzer.c +126 -0
  204. package/thirdparty/miniz/tests/timer.cpp +152 -0
  205. package/thirdparty/miniz/tests/timer.h +40 -0
  206. package/thirdparty/miniz/tests/uncompress2_fuzzer.c +21 -0
  207. package/thirdparty/miniz/tests/uncompress_fuzzer.c +30 -0
  208. package/thirdparty/miniz/tests/zip.dict +9 -0
  209. package/thirdparty/miniz/tests/zip_fuzzer.c +63 -0
  210. package/thirdparty/pugixml/.codecov.yml +7 -0
  211. package/thirdparty/pugixml/.gitattributes +1 -0
  212. package/thirdparty/pugixml/CMakeLists.txt +330 -0
  213. package/thirdparty/pugixml/LICENSE.md +24 -0
  214. package/thirdparty/pugixml/Makefile +98 -0
  215. package/thirdparty/pugixml/README.md +81 -0
  216. package/thirdparty/pugixml/SECURITY.md +9 -0
  217. package/thirdparty/pugixml/appveyor.yml +50 -0
  218. package/thirdparty/pugixml/docs/config.adoc +7 -0
  219. package/thirdparty/pugixml/docs/images/dom_tree.png +0 -0
  220. package/thirdparty/pugixml/docs/images/vs2005_link1.png +0 -0
  221. package/thirdparty/pugixml/docs/images/vs2005_link2.png +0 -0
  222. package/thirdparty/pugixml/docs/images/vs2005_pch1.png +0 -0
  223. package/thirdparty/pugixml/docs/images/vs2005_pch2.png +0 -0
  224. package/thirdparty/pugixml/docs/images/vs2005_pch3.png +0 -0
  225. package/thirdparty/pugixml/docs/images/vs2005_pch4.png +0 -0
  226. package/thirdparty/pugixml/docs/images/vs2010_link1.png +0 -0
  227. package/thirdparty/pugixml/docs/images/vs2010_link2.png +0 -0
  228. package/thirdparty/pugixml/docs/manual.adoc +3326 -0
  229. package/thirdparty/pugixml/docs/manual.html +6395 -0
  230. package/thirdparty/pugixml/docs/quickstart.adoc +287 -0
  231. package/thirdparty/pugixml/docs/quickstart.html +1107 -0
  232. package/thirdparty/pugixml/docs/samples/character.xml +8 -0
  233. package/thirdparty/pugixml/docs/samples/custom_memory_management.cpp +27 -0
  234. package/thirdparty/pugixml/docs/samples/include.cpp +64 -0
  235. package/thirdparty/pugixml/docs/samples/load_error_handling.cpp +33 -0
  236. package/thirdparty/pugixml/docs/samples/load_file.cpp +16 -0
  237. package/thirdparty/pugixml/docs/samples/load_memory.cpp +66 -0
  238. package/thirdparty/pugixml/docs/samples/load_options.cpp +30 -0
  239. package/thirdparty/pugixml/docs/samples/load_stream.cpp +97 -0
  240. package/thirdparty/pugixml/docs/samples/modify_add.cpp +29 -0
  241. package/thirdparty/pugixml/docs/samples/modify_base.cpp +43 -0
  242. package/thirdparty/pugixml/docs/samples/modify_remove.cpp +27 -0
  243. package/thirdparty/pugixml/docs/samples/save_custom_writer.cpp +116 -0
  244. package/thirdparty/pugixml/docs/samples/save_declaration.cpp +27 -0
  245. package/thirdparty/pugixml/docs/samples/save_file.cpp +17 -0
  246. package/thirdparty/pugixml/docs/samples/save_options.cpp +48 -0
  247. package/thirdparty/pugixml/docs/samples/save_stream.cpp +18 -0
  248. package/thirdparty/pugixml/docs/samples/save_subtree.cpp +26 -0
  249. package/thirdparty/pugixml/docs/samples/text.cpp +35 -0
  250. package/thirdparty/pugixml/docs/samples/transitions.xml +7 -0
  251. package/thirdparty/pugixml/docs/samples/traverse_base.cpp +51 -0
  252. package/thirdparty/pugixml/docs/samples/traverse_iter.cpp +27 -0
  253. package/thirdparty/pugixml/docs/samples/traverse_predicate.cpp +48 -0
  254. package/thirdparty/pugixml/docs/samples/traverse_rangefor.cpp +32 -0
  255. package/thirdparty/pugixml/docs/samples/traverse_walker.cpp +35 -0
  256. package/thirdparty/pugixml/docs/samples/tree.xml +12 -0
  257. package/thirdparty/pugixml/docs/samples/weekly-shift_jis.xml +78 -0
  258. package/thirdparty/pugixml/docs/samples/weekly-utf-16.xml +0 -0
  259. package/thirdparty/pugixml/docs/samples/weekly-utf-8.xml +78 -0
  260. package/thirdparty/pugixml/docs/samples/xgconsole.xml +12 -0
  261. package/thirdparty/pugixml/docs/samples/xpath_error.cpp +43 -0
  262. package/thirdparty/pugixml/docs/samples/xpath_query.cpp +36 -0
  263. package/thirdparty/pugixml/docs/samples/xpath_select.cpp +28 -0
  264. package/thirdparty/pugixml/docs/samples/xpath_variables.cpp +38 -0
  265. package/thirdparty/pugixml/readme.txt +50 -0
  266. package/thirdparty/pugixml/scripts/archive.py +54 -0
  267. package/thirdparty/pugixml/scripts/cocoapods_push.sh +4 -0
  268. package/thirdparty/pugixml/scripts/natvis/pugixml.natvis +77 -0
  269. package/thirdparty/pugixml/scripts/natvis/pugixml_compact.natvis +506 -0
  270. package/thirdparty/pugixml/scripts/nuget/build/native/pugixml-propertiesui.xml +17 -0
  271. package/thirdparty/pugixml/scripts/nuget/build/native/pugixml.targets +28 -0
  272. package/thirdparty/pugixml/scripts/nuget/pugixml.nuspec +20 -0
  273. package/thirdparty/pugixml/scripts/nuget_build.ps1 +60 -0
  274. package/thirdparty/pugixml/scripts/premake4.lua +92 -0
  275. package/thirdparty/pugixml/scripts/pugixml-config.cmake.in +12 -0
  276. package/thirdparty/pugixml/scripts/pugixml.pc.in +11 -0
  277. package/thirdparty/pugixml/scripts/pugixml.podspec +14 -0
  278. package/thirdparty/pugixml/scripts/pugixml.xcodeproj/project.pbxproj +212 -0
  279. package/thirdparty/pugixml/scripts/pugixml_airplay.mkf +13 -0
  280. package/thirdparty/pugixml/scripts/pugixml_codeblocks.cbp +44 -0
  281. package/thirdparty/pugixml/scripts/pugixml_codelite.project +56 -0
  282. package/thirdparty/pugixml/scripts/pugixml_dll.rc +45 -0
  283. package/thirdparty/pugixml/scripts/pugixml_vs2005.vcproj +343 -0
  284. package/thirdparty/pugixml/scripts/pugixml_vs2005_static.vcproj +343 -0
  285. package/thirdparty/pugixml/scripts/pugixml_vs2008.vcproj +339 -0
  286. package/thirdparty/pugixml/scripts/pugixml_vs2008_static.vcproj +339 -0
  287. package/thirdparty/pugixml/scripts/pugixml_vs2010.vcxproj +191 -0
  288. package/thirdparty/pugixml/scripts/pugixml_vs2010_static.vcxproj +191 -0
  289. package/thirdparty/pugixml/scripts/pugixml_vs2013.vcxproj +199 -0
  290. package/thirdparty/pugixml/scripts/pugixml_vs2013_static.vcxproj +199 -0
  291. package/thirdparty/pugixml/scripts/pugixml_vs2015.vcxproj +172 -0
  292. package/thirdparty/pugixml/scripts/pugixml_vs2015_static.vcxproj +176 -0
  293. package/thirdparty/pugixml/scripts/pugixml_vs2017.vcxproj +172 -0
  294. package/thirdparty/pugixml/scripts/pugixml_vs2017_static.vcxproj +176 -0
  295. package/thirdparty/pugixml/scripts/pugixml_vs2019.vcxproj +176 -0
  296. package/thirdparty/pugixml/scripts/pugixml_vs2019_static.vcxproj +180 -0
  297. package/thirdparty/pugixml/scripts/pugixml_vs2022.vcxproj +176 -0
  298. package/thirdparty/pugixml/scripts/pugixml_vs2022_static.vcxproj +180 -0
  299. package/thirdparty/pugixml/scripts/pugixml_vs2026.vcxproj +176 -0
  300. package/thirdparty/pugixml/scripts/pugixml_vs2026_static.vcxproj +180 -0
  301. package/thirdparty/pugixml/scripts/sbom.cdx.json +47 -0
  302. package/thirdparty/pugixml/src/pugiconfig.hpp +81 -0
  303. package/thirdparty/pugixml/src/pugixml.cpp +13776 -0
  304. package/thirdparty/pugixml/src/pugixml.hpp +1604 -0
  305. package/thirdparty/pugixml/tests/allocator.cpp +175 -0
  306. package/thirdparty/pugixml/tests/allocator.hpp +10 -0
  307. package/thirdparty/pugixml/tests/autotest-appveyor.ps1 +93 -0
  308. package/thirdparty/pugixml/tests/cmake-appveyor.ps1 +57 -0
  309. package/thirdparty/pugixml/tests/data/empty.xml +0 -0
  310. package/thirdparty/pugixml/tests/data/large.xml +1 -0
  311. package/thirdparty/pugixml/tests/data/latintest_latin1.xml +1 -0
  312. package/thirdparty/pugixml/tests/data/latintest_utf8.xml +1 -0
  313. package/thirdparty/pugixml/tests/data/multiline.xml +3 -0
  314. package/thirdparty/pugixml/tests/data/small.xml +1 -0
  315. package/thirdparty/pugixml/tests/data/truncation.xml +19 -0
  316. package/thirdparty/pugixml/tests/data/utftest_utf16_be.xml +0 -0
  317. package/thirdparty/pugixml/tests/data/utftest_utf16_be_bom.xml +0 -0
  318. package/thirdparty/pugixml/tests/data/utftest_utf16_be_clean.xml +0 -0
  319. package/thirdparty/pugixml/tests/data/utftest_utf16_be_nodecl.xml +0 -0
  320. package/thirdparty/pugixml/tests/data/utftest_utf16_le.xml +0 -0
  321. package/thirdparty/pugixml/tests/data/utftest_utf16_le_bom.xml +0 -0
  322. package/thirdparty/pugixml/tests/data/utftest_utf16_le_clean.xml +0 -0
  323. package/thirdparty/pugixml/tests/data/utftest_utf16_le_nodecl.xml +0 -0
  324. package/thirdparty/pugixml/tests/data/utftest_utf32_be.xml +0 -0
  325. package/thirdparty/pugixml/tests/data/utftest_utf32_be_bom.xml +0 -0
  326. package/thirdparty/pugixml/tests/data/utftest_utf32_be_clean.xml +0 -0
  327. package/thirdparty/pugixml/tests/data/utftest_utf32_be_nodecl.xml +0 -0
  328. package/thirdparty/pugixml/tests/data/utftest_utf32_le.xml +0 -0
  329. package/thirdparty/pugixml/tests/data/utftest_utf32_le_bom.xml +0 -0
  330. package/thirdparty/pugixml/tests/data/utftest_utf32_le_clean.xml +0 -0
  331. package/thirdparty/pugixml/tests/data/utftest_utf32_le_nodecl.xml +0 -0
  332. package/thirdparty/pugixml/tests/data/utftest_utf8.xml +87 -0
  333. package/thirdparty/pugixml/tests/data/utftest_utf8_bom.xml +87 -0
  334. package/thirdparty/pugixml/tests/data/utftest_utf8_clean.xml +84 -0
  335. package/thirdparty/pugixml/tests/data/utftest_utf8_nodecl.xml +86 -0
  336. package/thirdparty/pugixml/tests/data//321/202/320/265/321/201/321/202.xml +1 -0
  337. package/thirdparty/pugixml/tests/data_fuzz_parse/basic.xml +1 -0
  338. package/thirdparty/pugixml/tests/data_fuzz_parse/doctype.xml +1 -0
  339. package/thirdparty/pugixml/tests/data_fuzz_parse/refs.xml +1 -0
  340. package/thirdparty/pugixml/tests/data_fuzz_parse/types.xml +1 -0
  341. package/thirdparty/pugixml/tests/data_fuzz_parse/utf16.xml +0 -0
  342. package/thirdparty/pugixml/tests/data_fuzz_parse/utf32.xml +0 -0
  343. package/thirdparty/pugixml/tests/data_fuzz_xpath/basic.xpath +1 -0
  344. package/thirdparty/pugixml/tests/data_fuzz_xpath/functions.xpath +1 -0
  345. package/thirdparty/pugixml/tests/data_fuzz_xpath/math.xpath +1 -0
  346. package/thirdparty/pugixml/tests/data_fuzz_xpath/path.xpath +1 -0
  347. package/thirdparty/pugixml/tests/data_fuzz_xpath/predicate.xpath +1 -0
  348. package/thirdparty/pugixml/tests/fuzz_parse.cpp +14 -0
  349. package/thirdparty/pugixml/tests/fuzz_parse.dict +72 -0
  350. package/thirdparty/pugixml/tests/fuzz_setup.sh +11 -0
  351. package/thirdparty/pugixml/tests/fuzz_xpath.cpp +46 -0
  352. package/thirdparty/pugixml/tests/fuzz_xpath.dict +72 -0
  353. package/thirdparty/pugixml/tests/helpers.hpp +114 -0
  354. package/thirdparty/pugixml/tests/main.cpp +218 -0
  355. package/thirdparty/pugixml/tests/test.cpp +220 -0
  356. package/thirdparty/pugixml/tests/test.hpp +175 -0
  357. package/thirdparty/pugixml/tests/test_compact.cpp +150 -0
  358. package/thirdparty/pugixml/tests/test_deprecated.cpp +25 -0
  359. package/thirdparty/pugixml/tests/test_document.cpp +1910 -0
  360. package/thirdparty/pugixml/tests/test_dom_modify.cpp +2122 -0
  361. package/thirdparty/pugixml/tests/test_dom_text.cpp +601 -0
  362. package/thirdparty/pugixml/tests/test_dom_traverse.cpp +1481 -0
  363. package/thirdparty/pugixml/tests/test_header_guard.cpp +3 -0
  364. package/thirdparty/pugixml/tests/test_header_iosfwd_1.cpp +3 -0
  365. package/thirdparty/pugixml/tests/test_header_iosfwd_2.cpp +3 -0
  366. package/thirdparty/pugixml/tests/test_header_iostream_1.cpp +3 -0
  367. package/thirdparty/pugixml/tests/test_header_iostream_2.cpp +3 -0
  368. package/thirdparty/pugixml/tests/test_header_only_1.cpp +21 -0
  369. package/thirdparty/pugixml/tests/test_header_only_2.cpp +21 -0
  370. package/thirdparty/pugixml/tests/test_header_string_1.cpp +3 -0
  371. package/thirdparty/pugixml/tests/test_header_string_2.cpp +3 -0
  372. package/thirdparty/pugixml/tests/test_header_string_iostream.cpp +5 -0
  373. package/thirdparty/pugixml/tests/test_memory.cpp +303 -0
  374. package/thirdparty/pugixml/tests/test_parse.cpp +1463 -0
  375. package/thirdparty/pugixml/tests/test_parse_doctype.cpp +366 -0
  376. package/thirdparty/pugixml/tests/test_unicode.cpp +152 -0
  377. package/thirdparty/pugixml/tests/test_version.cpp +5 -0
  378. package/thirdparty/pugixml/tests/test_write.cpp +757 -0
  379. package/thirdparty/pugixml/tests/test_xpath.cpp +833 -0
  380. package/thirdparty/pugixml/tests/test_xpath_api.cpp +646 -0
  381. package/thirdparty/pugixml/tests/test_xpath_functions.cpp +844 -0
  382. package/thirdparty/pugixml/tests/test_xpath_operators.cpp +566 -0
  383. package/thirdparty/pugixml/tests/test_xpath_parse.cpp +428 -0
  384. package/thirdparty/pugixml/tests/test_xpath_paths.cpp +787 -0
  385. package/thirdparty/pugixml/tests/test_xpath_paths_abbrev_w3c.cpp +219 -0
  386. package/thirdparty/pugixml/tests/test_xpath_paths_w3c.cpp +312 -0
  387. package/thirdparty/pugixml/tests/test_xpath_variables.cpp +683 -0
  388. package/thirdparty/pugixml/tests/test_xpath_xalan_1.cpp +411 -0
  389. package/thirdparty/pugixml/tests/test_xpath_xalan_2.cpp +417 -0
  390. package/thirdparty/pugixml/tests/test_xpath_xalan_3.cpp +321 -0
  391. package/thirdparty/pugixml/tests/test_xpath_xalan_4.cpp +300 -0
  392. package/thirdparty/pugixml/tests/test_xpath_xalan_5.cpp +295 -0
  393. package/thirdparty/pugixml/tests/writer_string.cpp +79 -0
  394. package/thirdparty/pugixml/tests/writer_string.hpp +27 -0
  395. package/scripts/prepare-openxlsx.js +0 -126
@@ -0,0 +1,637 @@
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
+ // ===== External Includes ===== //
47
+ // #include <algorithm>
48
+ #include <iostream> // std::cout
49
+
50
+ // ===== OpenXLSX Includes ===== //
51
+ #include "XLDocument.hpp" // pugi_parse_settings
52
+ #include "XLComments.hpp"
53
+ #include "XLXmlParser.hpp" // pugixml wrapper
54
+ #include "utilities/XLUtilities.hpp" // OpenXLSX::ignore, appendAndGetNode
55
+
56
+ using namespace OpenXLSX;
57
+
58
+ namespace {
59
+ // module-local utility functions
60
+ /**
61
+ * @details TODO: write doxygen headers for functions in this module
62
+ */
63
+ std::string getCommentString(XMLNode const & commentNode)
64
+ {
65
+ std::string result{};
66
+
67
+ using namespace std::literals::string_literals;
68
+ XMLNode textElement = commentNode.child("text").first_child_of_type(pugi::node_element);
69
+ while (not textElement.empty()) {
70
+ if (textElement.name() == "t"s) {
71
+ result += textElement.first_child().value();
72
+ }
73
+ else if (textElement.name() == "r"s) { // rich text
74
+ XMLNode richTextSubnode = textElement.first_child_of_type(pugi::node_element);
75
+ while (not richTextSubnode.empty()) {
76
+ if (richTextSubnode.name() == "t"s) {
77
+ result += richTextSubnode.first_child().value();
78
+ }
79
+ else if (richTextSubnode.name() == "rPr"s) {} // ignore rich text formatting info
80
+ else {} // ignore other nodes
81
+ richTextSubnode = richTextSubnode.next_sibling_of_type(pugi::node_element);
82
+ }
83
+ }
84
+ else {} // ignore other elements (for now)
85
+ textElement = textElement.next_sibling_of_type(pugi::node_element);
86
+ }
87
+ return result;
88
+ }
89
+ } // namespace
90
+
91
+
92
+ // ========== XLComment Member Functions
93
+
94
+ /**
95
+ * @details
96
+ */
97
+ // XLComment::XLComment()
98
+ // : m_commentNode(std::make_unique<XMLNode>())
99
+ // {}
100
+
101
+ /**
102
+ * @details
103
+ */
104
+ XLComment::XLComment(const XMLNode& node)
105
+ : m_commentNode(std::make_unique<XMLNode>(node))
106
+ {}
107
+
108
+ /**
109
+ * @details copy constructor
110
+ */
111
+ XLComment::XLComment(const XLComment& other)
112
+ : m_commentNode(std::make_unique<XMLNode>(*other.m_commentNode))
113
+ {}
114
+
115
+
116
+ /**
117
+ * @details
118
+ */
119
+ XLComment::XLComment(XLComment&& other) noexcept = default;
120
+
121
+ /**
122
+ * @details
123
+ */
124
+ XLComment::~XLComment() = default;
125
+
126
+ /**
127
+ * @details copy assignment operator
128
+ */
129
+ XLComment& XLComment::operator=(const XLComment& other)
130
+ {
131
+ if (&other != this) {
132
+ XLComment temp = other; // copy-construct
133
+ *this = std::move(temp); // move-assign & invalidate temp
134
+ }
135
+ return *this;
136
+ }
137
+
138
+ /**
139
+ * @details
140
+ */
141
+ XLComment& XLComment::operator=(XLComment&& other) noexcept = default;
142
+
143
+ /**
144
+ * @details
145
+ * @note Function body moved to cpp module as it uses "not" keyword for readability, which MSVC sabotages with non-CPP compatibility.
146
+ * @note For the library it is reasonable to expect users to compile it with MSCV /permissive- flag, but for the user's own projects the header files shall "just work"
147
+ */
148
+ bool XLComment::valid() const { return m_commentNode != nullptr &&(not m_commentNode->empty()); }
149
+
150
+ /**
151
+ * @brief Getter functions
152
+ */
153
+ std::string XLComment::ref() const { return m_commentNode->attribute("ref").value(); }
154
+ std::string XLComment::text() const { return getCommentString(*m_commentNode); }
155
+ uint16_t XLComment::authorId() const { return static_cast<uint16_t>(m_commentNode->attribute("authorId").as_uint()); }
156
+
157
+ /**
158
+ * @brief Setter functions
159
+ */
160
+ bool XLComment::setText(std::string newText)
161
+ {
162
+ m_commentNode->remove_children(); // clear previous text
163
+ XMLNode tNode = m_commentNode->prepend_child("text").prepend_child("t"); // insert <text><t/></text> nodes
164
+ tNode.append_attribute("xml:space").set_value("preserve"); // set <t> node attribute xml:space
165
+ return tNode.prepend_child(pugi::node_pcdata).set_value(newText.c_str()); // finally, insert <t> node_pcdata value
166
+ }
167
+ bool XLComment::setAuthorId(uint16_t newAuthorId) { return appendAndSetAttribute(*m_commentNode, "authorId", std::to_string(newAuthorId)).empty() == false; }
168
+
169
+
170
+ // ========== XLComments Member Functions
171
+
172
+ XLComments::XLComments()
173
+ : XLXmlFile(nullptr),
174
+ m_authors(std::make_unique<XMLNode>()),
175
+ m_commentList(std::make_unique<XMLNode>()),
176
+ m_vmlDrawing(std::make_unique<XLVmlDrawing>()),
177
+ m_hintNode(std::make_unique<XMLNode>())
178
+ {}
179
+
180
+ /**
181
+ * @details The constructor creates an instance of the superclass, XLXmlFile
182
+ */
183
+ XLComments::XLComments(XLXmlData* xmlData)
184
+ : XLXmlFile(xmlData),
185
+ // m_authors(std::make_unique<XMLNode>()), // manually initialized below
186
+ // m_commentList(std::make_unique<XMLNode>()), // "
187
+ m_vmlDrawing(std::make_unique<XLVmlDrawing>()),
188
+ m_hintNode(std::make_unique<XMLNode>()),
189
+ m_hintIndex(0)
190
+ {
191
+ if (xmlData->getXmlType() != XLContentType::Comments)
192
+ throw XLInternalError("XLComments constructor: Invalid XML data.");
193
+
194
+ XMLDocument & doc = xmlDocument();
195
+ if (doc.document_element().empty()) // handle a bad (no document element) comments XML file
196
+ doc.load_string(
197
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
198
+ "<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\""
199
+ " xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\">\n"
200
+ "</comments>",
201
+ pugi_parse_settings
202
+ );
203
+
204
+ XMLNode rootNode = doc.document_element();
205
+ bool docNew = rootNode.first_child_of_type(pugi::node_element).empty(); // check and store status: was document empty?
206
+ m_authors = std::make_unique<XMLNode>( // (insert and) get authors node
207
+ appendAndGetNode (rootNode, "authors", m_nodeOrder)); //
208
+ if (docNew) rootNode.prepend_child(pugi::node_pcdata).set_value("\n\t"); // if document was empty: prefix the newly inserted authors node with a single tab
209
+ m_commentList = std::make_unique<XMLNode>( // (insert and) get commentList node -> this should now copy the whitespace prefix of m_authors
210
+ appendAndGetNode (rootNode, "commentList", m_nodeOrder)); //
211
+
212
+ // whitespace formatting / indentation for closing tags:
213
+ if ( m_authors->first_child().empty()) m_authors->append_child(pugi::node_pcdata).set_value("\n\t");
214
+ if (m_commentList->first_child().empty()) m_commentList->append_child(pugi::node_pcdata).set_value("\n\t");
215
+ }
216
+
217
+ /**
218
+ * @details copy-construct an XLComments object
219
+ */
220
+ XLComments::XLComments(const XLComments& other)
221
+ : XLXmlFile(other),
222
+ m_authors(std::make_unique<XMLNode>(*other.m_authors)),
223
+ m_commentList(std::make_unique<XMLNode>(*other.m_commentList)),
224
+ m_vmlDrawing(std::make_unique<XLVmlDrawing>(*other.m_vmlDrawing)),
225
+ // m_vmlDrawing(std::make_unique<XLVmlDrawing>(other.m_vmlDrawing ? *other.m_vmlDrawing : XLVmlDrawing())) // this can be used if other.m_vmlDrawing can be uninitialized
226
+ m_hintNode(std::make_unique<XMLNode>(*other.m_hintNode)),
227
+ m_hintIndex(other.m_hintIndex)
228
+ {}
229
+
230
+ /**
231
+ * @details move-construct an XLComments object
232
+ */
233
+ XLComments::XLComments(XLComments&& other) noexcept
234
+ : XLXmlFile(other),
235
+ m_authors(std::move(other.m_authors)),
236
+ m_commentList(std::move(other.m_commentList)),
237
+ m_vmlDrawing(std::move(other.m_vmlDrawing)),
238
+ m_hintNode(std::move(other.m_hintNode)),
239
+ m_hintIndex(other.m_hintIndex)
240
+ {}
241
+
242
+ /**
243
+ * @brief The destructor
244
+ */
245
+ XLComments::~XLComments() = default;
246
+
247
+ /**
248
+ * @details move-assign an XLComments object
249
+ */
250
+ XLComments& XLComments::operator=(XLComments&& other) noexcept
251
+ {
252
+ if (&other != this) {
253
+ XLXmlFile::operator=(std::move(other)); // TBD: std::move of xvalue other is possibly redundant here
254
+ m_authors = std::move(other.m_authors);
255
+ m_commentList = std::move(other.m_commentList);
256
+ m_vmlDrawing = std::move(other.m_vmlDrawing);
257
+ m_hintNode = std::move(other.m_hintNode);
258
+ m_hintIndex = other.m_hintIndex;
259
+ }
260
+ return *this;
261
+ }
262
+
263
+ /**
264
+ * @details copy-assign an XLComments object
265
+ */
266
+ XLComments& XLComments::operator=(const XLComments& other)
267
+ {
268
+ if (&other != this) {
269
+ XLComments temp = other; // copy-construct
270
+ *this = std::move(temp); // move-assign & invalidate temp
271
+ }
272
+ return *this;
273
+ }
274
+
275
+
276
+ bool XLComments::setVmlDrawing(XLVmlDrawing &vmlDrawing)
277
+ {
278
+ m_vmlDrawing = std::make_unique<XLVmlDrawing>(vmlDrawing);
279
+ return true;
280
+ }
281
+
282
+ /**
283
+ * @details TODO: write doxygen headers for functions in this module
284
+ */
285
+ XMLNode XLComments::authorNode(uint16_t index) const
286
+ {
287
+ XMLNode auth = m_authors->first_child_of_type(pugi::node_element);
288
+ uint16_t i = 0;
289
+ while (not auth.empty() && i != index) {
290
+ ++i;
291
+ auth = auth.next_sibling_of_type(pugi::node_element);
292
+ }
293
+ return auth; // auth.empty() will be true if not found
294
+ }
295
+
296
+ /**
297
+ * @brief find a comment XML node by index (sequence within source XML)
298
+ * @param index the position (0-based) of the comment node to return
299
+ * @throws XLException if index is out of bounds vs. XLComments::count()
300
+ */
301
+ XMLNode XLComments::commentNode(size_t index) const
302
+ {
303
+ if( m_hintNode->empty() || m_hintIndex > index ) { // check if m_hintNode can be used - otherwise initialize it
304
+ m_hintNode = std::make_unique<XMLNode>(m_commentList->first_child_of_type(pugi::node_element));
305
+ m_hintIndex = 0;
306
+ }
307
+
308
+ while (not m_hintNode->empty() && m_hintIndex < index) {
309
+ ++m_hintIndex;
310
+ m_hintNode = std::make_unique<XMLNode>(m_hintNode->next_sibling_of_type(pugi::node_element));
311
+ }
312
+ if (m_hintNode->empty()) {
313
+ using namespace std::literals::string_literals;
314
+ throw XLException("XLComments::commentNode: index "s + std::to_string(index) + " is out of bounds"s);
315
+ }
316
+ return *m_hintNode; // can be empty XMLNode if index is >= count
317
+ }
318
+
319
+ /**
320
+ * @details TODO: write doxygen headers for functions in this module
321
+ */
322
+ XMLNode XLComments::commentNode(const std::string& cellRef) const
323
+ {
324
+ return m_commentList->find_child_by_attribute("comment", "ref", cellRef.c_str());
325
+ }
326
+
327
+ /**
328
+ * @details TODO: write doxygen headers for functions in this module
329
+ */
330
+ uint16_t XLComments::authorCount() const
331
+ {
332
+ XMLNode auth = m_authors->first_child_of_type(pugi::node_element);
333
+ uint16_t count = 0;
334
+ while (not auth.empty()) {
335
+ ++count;
336
+ auth = auth.next_sibling_of_type(pugi::node_element);
337
+ }
338
+ return count;
339
+ }
340
+
341
+ /**
342
+ * @details TODO: write doxygen headers for functions in this module
343
+ */
344
+ std::string XLComments::author(uint16_t index) const
345
+ {
346
+ XMLNode auth = authorNode(index);
347
+ if (auth.empty()) {
348
+ using namespace std::literals::string_literals;
349
+ throw XLException("XLComments::author: index "s + std::to_string(index) + " is out of bounds"s);
350
+ }
351
+ return auth.first_child().value(); // author name is stored as a node_pcdata within the author node
352
+ }
353
+
354
+ /**
355
+ * @details TODO: write doxygen headers for functions in this module
356
+ */
357
+ bool XLComments::deleteAuthor(uint16_t index)
358
+ {
359
+ XMLNode auth = authorNode(index);
360
+ if (auth.empty()) {
361
+ using namespace std::literals::string_literals;
362
+ throw XLException("XLComments::deleteAuthor: index "s + std::to_string(index) + " is out of bounds"s);
363
+ }
364
+ else {
365
+ while (auth.previous_sibling().type() == pugi::node_pcdata) // remove leading whitespaces
366
+ m_authors->remove_child(auth.previous_sibling());
367
+ m_authors->remove_child(auth); // then remove author node itself
368
+ }
369
+ return true;
370
+ }
371
+
372
+ /**
373
+ * @details insert author and return index
374
+ */
375
+ uint16_t XLComments::addAuthor(const std::string& authorName)
376
+ {
377
+ XMLNode auth = m_authors->first_child_of_type(pugi::node_element);
378
+ uint16_t index = 0;
379
+ while (not auth.next_sibling_of_type(pugi::node_element).empty()) {
380
+ ++index;
381
+ auth = auth.next_sibling_of_type(pugi::node_element);
382
+ }
383
+ if (auth.empty()) { // if this is the first entry
384
+ auth = m_authors->prepend_child("author"); // insert new node
385
+ m_authors->prepend_child(pugi::node_pcdata).set_value("\n\t\t"); // prefix first author with second level indentation
386
+ }
387
+ else { // found the last author node at index
388
+ auth = m_authors->insert_child_after("author", auth); // append a new author
389
+ copyLeadingWhitespaces(*m_authors, auth.previous_sibling(), auth ); // copy whitespaces prefix from previous author
390
+ ++index; // increment index
391
+ }
392
+ auth.prepend_child(pugi::node_pcdata).set_value(authorName.c_str());
393
+ return index;
394
+ }
395
+
396
+ /**
397
+ * @details TODO: write doxygen headers for functions in this module
398
+ */
399
+ size_t XLComments::count() const
400
+ {
401
+ XMLNode comment = m_commentList->first_child_of_type(pugi::node_element);
402
+ size_t count = 0;
403
+ while (not comment.empty()) {
404
+ // if (comment.name() == "comment") // TBD: safe-guard against potential rogue node
405
+ ++count;
406
+ comment = comment.next_sibling_of_type(pugi::node_element);
407
+ }
408
+ return count;
409
+ }
410
+
411
+ /**
412
+ * @details TODO: write doxygen headers for functions in this module
413
+ */
414
+ uint16_t XLComments::authorId(const std::string& cellRef) const
415
+ {
416
+ XMLNode comment = commentNode(cellRef);
417
+ return static_cast<uint16_t>(comment.attribute("authorId").as_uint());
418
+ }
419
+
420
+ /**
421
+ * @details TODO: write doxygen headers for functions in this module
422
+ */
423
+ bool XLComments::deleteComment(const std::string& cellRef)
424
+ {
425
+ XMLNode comment = commentNode(cellRef);
426
+ if (comment.empty()) return false;
427
+ else {
428
+ m_commentList->remove_child(comment);
429
+ if (not m_hintNode->empty()) m_hintNode = std::make_unique<XMLNode>(); // reset hint after modification of comment list
430
+ m_hintIndex = 0;
431
+ }
432
+ // ===== Delete the shape associated with the comment.
433
+ OpenXLSX::ignore(m_vmlDrawing->deleteShape(cellRef)); // disregard if deleteShape fails
434
+ return true;
435
+ }
436
+
437
+ // comment entries:
438
+ // attribute ref -> cell
439
+ // attribute authorId -> author index in array
440
+ // node text
441
+ // subnode t -> regular text
442
+ // attribute xml:space="preserve" - seems useful to always apply
443
+ // subnode pc_data -> the comment text
444
+ // subnode r -> rich text, repetition of:
445
+ // subnode rPr -> rich text formatting
446
+ // subnode sz -> font size (int)
447
+ // subnode rFont -> font name (string)
448
+ // subnode family -> TBC: font family (int)
449
+ // subnode t -> regular text like above
450
+
451
+ /**
452
+ * @details TODO: write doxygen headers for functions in this module
453
+ */
454
+ XLComment XLComments::get(size_t index) const { return XLComment(commentNode(index)); }
455
+ std::string XLComments::get(const std::string& cellRef) const { return getCommentString(commentNode(cellRef)); }
456
+
457
+ /**
458
+ * @details TODO: write doxygen headers for functions in this module
459
+ */
460
+ bool XLComments::set(std::string const& cellRef, std::string const& commentText, uint16_t authorId_)
461
+ {
462
+ XLCellReference destRef(cellRef);
463
+ uint32_t destRow = destRef.row();
464
+ uint16_t destCol = destRef.column();
465
+ bool newCommentCreated = false; // if false, try to find an existing shape before creating one
466
+
467
+ using namespace std::literals::string_literals;
468
+ XMLNode comment = m_commentList->first_child_of_type(pugi::node_element);
469
+ while (not comment.empty()) {
470
+ if (comment.name() == "comment"s) { // safeguard against rogue nodes
471
+ XLCellReference ref(comment.attribute("ref").value());
472
+ if (ref.row() > destRow ||(ref.row() == destRow && ref.column() >= destCol)) // abort when node or a node behind it is found
473
+ break;
474
+ }
475
+ comment = comment.next_sibling_of_type(pugi::node_element);
476
+ }
477
+ if(comment.empty()) { // no comments yet or this will be the last comment
478
+ comment = m_commentList->last_child_of_type(pugi::node_element);
479
+ if (comment.empty()) { // if this is the only comment so far
480
+ comment = m_commentList->prepend_child("comment"); // prepend new comment
481
+ m_commentList->insert_child_before(pugi::node_pcdata, comment).set_value("\n\t\t"); // insert double indent before comment
482
+ }
483
+ else {
484
+ comment = m_commentList->insert_child_after("comment", comment); // insert new comment at end of list
485
+ copyLeadingWhitespaces(*m_commentList, comment.previous_sibling(), comment); // and copy whitespaces prefix from previous comment
486
+ }
487
+ newCommentCreated = true;
488
+ }
489
+ else {
490
+ XLCellReference ref(comment.attribute("ref").value());
491
+ if(ref.row() != destRow || ref.column() != destCol) { // if node has to be inserted *before* this one
492
+ comment = m_commentList->insert_child_before("comment", comment); // insert new comment
493
+ copyLeadingWhitespaces(*m_commentList, comment, comment.next_sibling()); // and copy whitespaces prefix from next node
494
+ newCommentCreated = true;
495
+ }
496
+ else // node exists / was found
497
+ comment.remove_children(); // clear node content
498
+ }
499
+
500
+ // ===== If the list of nodes was modified, re-set m_hintNode that is used to access nodes by index
501
+ if (newCommentCreated) {
502
+ if (not m_hintNode->empty()) m_hintNode = std::make_unique<XMLNode>(); // reset hint after modification of comment list
503
+ m_hintIndex = 0;
504
+ }
505
+
506
+ // now that we have a valid comment node: update attributes and content
507
+ if (comment.attribute("ref").empty()) // if ref has to be created
508
+ comment.append_attribute("ref").set_value(destRef.address().c_str()); // then do so - otherwise it can remain untouched
509
+ appendAndSetAttribute(comment, "authorId", std::to_string(authorId_)); // update authorId
510
+ XMLNode tNode = comment.prepend_child("text").prepend_child("t"); // insert <text><t/></text> nodes
511
+ tNode.append_attribute("xml:space").set_value("preserve"); // set <t> node attribute xml:space
512
+ tNode.prepend_child(pugi::node_pcdata).set_value(commentText.c_str()); // finally, insert <t> node_pcdata value
513
+
514
+ if (m_vmlDrawing->valid()) {
515
+ XLShape cShape{};
516
+ bool newShapeNeeded = newCommentCreated; // on new comments: create new shape
517
+ if (!newCommentCreated) {
518
+ try {
519
+ cShape = shape(cellRef); // for existing comments, try to access existing shape
520
+ }
521
+ catch (XLException const& e) {
522
+ newShapeNeeded = true; // not found: create fresh
523
+ }
524
+ }
525
+ if (newShapeNeeded)
526
+ cShape = m_vmlDrawing->createShape();
527
+
528
+ cShape.setFillColor("#ffffc0");
529
+ cShape.setStroked(true);
530
+ // setType: already done by XLVmlDrawing::createShape
531
+ cShape.setAllowInCell(false);
532
+ {
533
+ // XLShapeStyle shapeStyle("position:absolute;margin-left:100pt;margin-top:0pt;width:50pt;height:50.0pt;mso-wrap-style:none;v-text-anchor:middle;visibility:hidden");
534
+ XLShapeStyle shapeStyle{}; // default construct with meaningful values
535
+ cShape.setStyle(shapeStyle);
536
+ }
537
+
538
+ XLShapeClientData clientData = cShape.clientData();
539
+ clientData.setObjectType("Note");
540
+ clientData.setMoveWithCells();
541
+ clientData.setSizeWithCells();
542
+
543
+ {
544
+ constexpr const uint16_t leftColOffset = 1;
545
+ constexpr const uint16_t widthCols = 2;
546
+ constexpr const uint16_t topRowOffset = 1;
547
+ constexpr const uint16_t heightRows = 2;
548
+
549
+ uint16_t anchorLeftCol, anchorRightCol;
550
+ if( OpenXLSX::MAX_COLS - destCol > leftColOffset + widthCols ) {
551
+ anchorLeftCol = (destCol - 1) + leftColOffset;
552
+ anchorRightCol = (destCol - 1) + leftColOffset + widthCols;
553
+ }
554
+ else { // if anchor would overflow MAX_COLS: move column anchor to the left of destCol
555
+ anchorLeftCol = (destCol - 1) - leftColOffset - widthCols;
556
+ anchorRightCol = (destCol - 1) - leftColOffset;
557
+ }
558
+
559
+ uint32_t anchorTopRow, anchorBottomRow;
560
+ if( OpenXLSX::MAX_ROWS - destRow > topRowOffset + heightRows ) {
561
+ anchorTopRow = (destRow - 1) + topRowOffset;
562
+ anchorBottomRow = (destRow - 1) + topRowOffset + heightRows;
563
+ }
564
+ else { // if anchor would overflow MAX_ROWS: move row anchor to the top of destCol
565
+ anchorTopRow = (destRow - 1) - topRowOffset - heightRows;
566
+ anchorBottomRow = (destRow - 1) - topRowOffset;
567
+ }
568
+ if (anchorRightCol > MAX_SHAPE_ANCHOR_COLUMN)
569
+ std::cout << "XLComments::set WARNING: anchoring comment shapes beyond column "s
570
+ /**/ + XLCellReference::columnAsString(MAX_SHAPE_ANCHOR_COLUMN) + " may not get displayed correctly (LO Calc, TBD in Excel)"s << std::endl;
571
+ if (anchorBottomRow > MAX_SHAPE_ANCHOR_ROW)
572
+ std::cout << "XLComments::set WARNING: anchoring comment shapes beyond row "s
573
+ /**/ + std::to_string(MAX_SHAPE_ANCHOR_ROW ) + " may not get displayed correctly (LO Calc, TBD in Excel)"s << std::endl;
574
+
575
+ uint16_t anchorLeftOffsetInCell = 10, anchorRightOffsetInCell = 10;
576
+ uint16_t anchorTopOffsetInCell = 5, anchorBottomOffsetInCell = 5;
577
+
578
+ // clientData.setAnchor("3, 23, 0, 0, 4, 25, 3, 5");
579
+ using namespace std::literals::string_literals;
580
+ clientData.setAnchor(
581
+ std::to_string(anchorLeftCol) + ","s
582
+ + std::to_string(anchorLeftOffsetInCell) + ","s
583
+ + std::to_string(anchorTopRow) + ","s
584
+ + std::to_string(anchorTopOffsetInCell) + ","s
585
+ + std::to_string(anchorRightCol) + ","s
586
+ + std::to_string(anchorRightOffsetInCell) + ","s
587
+ + std::to_string(anchorBottomRow) + ","s
588
+ + std::to_string(anchorBottomOffsetInCell)
589
+ );
590
+ }
591
+ clientData.setAutoFill(false);
592
+ clientData.setTextVAlign(XLShapeTextVAlign::Top);
593
+ clientData.setTextHAlign(XLShapeTextHAlign::Left);
594
+ clientData.setRow(destRow - 1); // row and column are zero-indexed in XLShapeClientData
595
+ clientData.setColumn(destCol - 1); // ..
596
+
597
+ // <v:shadow on="t" obscured="t" color="black"/>
598
+ // <v:fill o:detectmouseclick="t" type="solid" color2="#00003f"/>
599
+ // <v:stroke color="#3465a4" startarrow="block" startarrowwidth="medium" startarrowlength="medium" joinstyle="round" endcap="flat"/>
600
+ // <x:ClientData ObjectType="Note">
601
+ // <x:MoveWithCells/>
602
+ // <x:SizeWithCells/>
603
+ // <x:Anchor>3, 23, 0, 0, 4, 25, 3, 5</x:Anchor>
604
+ // <x:AutoFill>False</x:AutoFill>
605
+ // <x:TextVAlign>Top</x:TextVAlign>
606
+ // <x:TextHAlign>Left</x:TextHAlign>
607
+ // <x:Row>0</x:Row>
608
+ // <x:Column>2</x:Column>
609
+ // </x:ClientData>
610
+ // </v:shape>
611
+ }
612
+ else
613
+ throw XLException("XLComments::set: can not set (format) any comments when VML Drawing object is invalid");
614
+
615
+ return true;
616
+ }
617
+
618
+ /**
619
+ * @details
620
+ */
621
+ XLShape XLComments::shape(std::string const& cellRef)
622
+ {
623
+ if (!m_vmlDrawing->valid())
624
+ throw XLException("XLComments::shape: can not access any shapes when VML Drawing object is invalid");
625
+
626
+ XMLNode shape = m_vmlDrawing->shapeNode(cellRef);
627
+ if (shape.empty()) {
628
+ using namespace std::literals::string_literals;
629
+ throw XLException("XLComments::shape: not found for cell "s + cellRef + " - was XLComment::set invoked first?"s);
630
+ }
631
+ return XLShape(shape);
632
+ }
633
+
634
+ /**
635
+ * @details Print the underlying XML using pugixml::xml_node::print
636
+ */
637
+ void XLComments::print(std::basic_ostream<char>& ostr) const { xmlDocument().document_element().print( ostr ); }