react-native-nitro-xlsx 0.1.4 → 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 (428) hide show
  1. package/NitroXlsx.podspec +27 -27
  2. package/Package.swift +35 -10
  3. package/README.md +220 -58
  4. package/android/CMakeLists.txt +24 -27
  5. package/android/cpp-adapter.cpp +12 -0
  6. package/android/src/main/java/com/margelo/nitro/xlsx/NitroXlsxPackage.kt +9 -0
  7. package/cpp/HybridNitroXlsx.cpp +25 -179
  8. package/cpp/HybridNitroXlsx.hpp +2 -2
  9. package/cpp/HybridXlsxConditionalFormat.cpp +252 -0
  10. package/cpp/HybridXlsxConditionalFormat.hpp +62 -0
  11. package/cpp/HybridXlsxConditionalFormats.cpp +46 -0
  12. package/cpp/HybridXlsxConditionalFormats.hpp +28 -0
  13. package/cpp/HybridXlsxWorkbook.cpp +159 -196
  14. package/cpp/HybridXlsxWorkbook.hpp +7 -2
  15. package/cpp/HybridXlsxWorksheet.cpp +433 -62
  16. package/cpp/HybridXlsxWorksheet.hpp +73 -26
  17. package/cpp/XlsxCacheDir.cpp +76 -0
  18. package/cpp/XlsxCacheDir.hpp +27 -0
  19. package/cpp/XlsxError.hpp +68 -0
  20. package/cpp/XlsxJson.cpp +185 -0
  21. package/cpp/XlsxJson.hpp +36 -0
  22. package/ios/XlsxCacheDir.mm +60 -0
  23. package/nitrogen/generated/android/NitroXlsx+autolinking.cmake +2 -0
  24. package/nitrogen/generated/shared/c++/HybridNitroXlsxSpec.hpp +5 -3
  25. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatSpec.cpp +54 -0
  26. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatSpec.hpp +95 -0
  27. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatsSpec.cpp +24 -0
  28. package/nitrogen/generated/shared/c++/HybridXlsxConditionalFormatsSpec.hpp +68 -0
  29. package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.cpp +3 -0
  30. package/nitrogen/generated/shared/c++/HybridXlsxWorkbookSpec.hpp +6 -1
  31. package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.cpp +47 -19
  32. package/nitrogen/generated/shared/c++/HybridXlsxWorksheetSpec.hpp +52 -20
  33. package/package.json +3 -3
  34. package/scripts/run-cpp-tests.sh +14 -0
  35. package/src/__mocks__/react-native-nitro-modules.ts +1 -0
  36. package/src/__tests__/index.test.ts +76 -7
  37. package/src/index.ts +107 -18
  38. package/src/specs/NitroXlsx.nitro.ts +141 -44
  39. package/thirdparty/OpenXLSX/.clang-format +118 -0
  40. package/thirdparty/OpenXLSX/.clang-tidy +28 -0
  41. package/thirdparty/OpenXLSX/.gitignore +130 -0
  42. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_before_XMLNode_wrappers +46 -0
  43. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_and_stripping +49 -0
  44. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_char_support +49 -0
  45. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_support +49 -0
  46. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespaced_name_disabled +49 -0
  47. package/thirdparty/OpenXLSX/Benchmarks/2024-08-11-benchmarks_post-XLCellIterator-Rework +46 -0
  48. package/thirdparty/OpenXLSX/Benchmarks/2024-08-14-benchmarks_post-default-row-column-style-support +46 -0
  49. package/thirdparty/OpenXLSX/Benchmarks/2024-09-02-benchmarks +46 -0
  50. package/thirdparty/OpenXLSX/Benchmarks/2024-12-19-benchmarks +46 -0
  51. package/thirdparty/OpenXLSX/Benchmarks/2024-12-30-benchmarks-post-XLSharedStrings-by-ref +46 -0
  52. package/thirdparty/OpenXLSX/Benchmarks/2025-01-09-benchmarks-post-conditionalFormatsAndSheetProtection +46 -0
  53. package/thirdparty/OpenXLSX/Benchmarks/2025-01-10-benchmarks-post-XLCellValue-bugfix +46 -0
  54. package/thirdparty/OpenXLSX/Benchmarks/2025-01-31-benchmarks-post-XLComments-implementation +46 -0
  55. package/thirdparty/OpenXLSX/Benchmarks/2025-02-02-benchmarks-post-XLRowIterator-Rework +46 -0
  56. package/thirdparty/OpenXLSX/Benchmarks/2025-07-20-benchmarks-after-hiding-pugixml-internals +46 -0
  57. package/thirdparty/OpenXLSX/Benchmarks/2025-08-29-benchmarks-after-code-review-with-libzip +46 -0
  58. package/thirdparty/OpenXLSX/Benchmarks/Benchmark.cpp +249 -0
  59. package/thirdparty/OpenXLSX/Benchmarks/CMakeLists.txt +19 -0
  60. package/thirdparty/OpenXLSX/CMakeLists.txt +466 -0
  61. package/thirdparty/OpenXLSX/Documentation/CMakeLists.txt +31 -0
  62. package/thirdparty/OpenXLSX/Documentation/Doxyfile.in +2471 -0
  63. package/thirdparty/OpenXLSX/Documentation/DoxygenLayout.xml +194 -0
  64. package/thirdparty/OpenXLSX/Documentation/customdoxygen.css +1355 -0
  65. package/thirdparty/OpenXLSX/Examples/CMakeLists.txt +103 -0
  66. package/thirdparty/OpenXLSX/Examples/Demo1.cpp +279 -0
  67. package/thirdparty/OpenXLSX/Examples/Demo10.cpp +545 -0
  68. package/thirdparty/OpenXLSX/Examples/Demo1A.cpp +137 -0
  69. package/thirdparty/OpenXLSX/Examples/Demo2.cpp +65 -0
  70. package/thirdparty/OpenXLSX/Examples/Demo3.cpp +89 -0
  71. package/thirdparty/OpenXLSX/Examples/Demo4.cpp +86 -0
  72. package/thirdparty/OpenXLSX/Examples/Demo5.cpp +77 -0
  73. package/thirdparty/OpenXLSX/Examples/Demo6.cpp +103 -0
  74. package/thirdparty/OpenXLSX/Examples/Demo7.cpp +79 -0
  75. package/thirdparty/OpenXLSX/Examples/Demo8.cpp +117 -0
  76. package/thirdparty/OpenXLSX/Examples/Demo9.cpp +363 -0
  77. package/thirdparty/OpenXLSX/Examples/cmake/FindLIBZIP.cmake +61 -0
  78. package/thirdparty/OpenXLSX/Examples/external/CustomZip/CustomZip.hpp +256 -0
  79. package/thirdparty/OpenXLSX/LICENSE.md +29 -0
  80. package/thirdparty/OpenXLSX/Makefile.GNU +530 -0
  81. package/thirdparty/OpenXLSX/Notes/TBDs.txt +16 -0
  82. package/thirdparty/OpenXLSX/Notes/confirmed-TBCs.txt +8 -0
  83. package/thirdparty/OpenXLSX/Notes/styles-missing-support.xml +12 -0
  84. package/thirdparty/OpenXLSX/Notes/todo-list.txt +108 -0
  85. package/thirdparty/OpenXLSX/OpenXLSX/CMakeLists.txt +631 -0
  86. package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSX.hpp +63 -0
  87. package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSXConfig.cmake +11 -0
  88. package/thirdparty/OpenXLSX/OpenXLSX/cmake/bundle_static_library.cmake +198 -0
  89. package/thirdparty/OpenXLSX/OpenXLSX/cmake/patch_pkg_config.cmake +69 -0
  90. package/thirdparty/OpenXLSX/OpenXLSX/headers/IZipArchive.hpp +361 -0
  91. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX-Exports.hpp +12 -0
  92. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCell.hpp +367 -0
  93. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellIterator.hpp +252 -0
  94. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellRange.hpp +223 -0
  95. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellReference.hpp +317 -0
  96. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellValue.hpp +793 -0
  97. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColor.hpp +232 -0
  98. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColumn.hpp +159 -0
  99. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCommandQuery.hpp +228 -0
  100. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLComments.hpp +270 -0
  101. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLConstants.hpp +18 -0
  102. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLContentTypes.hpp +264 -0
  103. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDateTime.hpp +175 -0
  104. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDocument.hpp +505 -0
  105. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDrawing.hpp +452 -0
  106. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLException.hpp +161 -0
  107. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLFormula.hpp +375 -0
  108. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLIterator.hpp +40 -0
  109. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLMergeCells.hpp +216 -0
  110. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLProperties.hpp +348 -0
  111. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRelationships.hpp +348 -0
  112. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRow.hpp +721 -0
  113. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRowData.hpp +488 -0
  114. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSharedStrings.hpp +204 -0
  115. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSheet.hpp +1640 -0
  116. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLStyles.hpp +2390 -0
  117. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLTables.hpp +132 -0
  118. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLWorkbook.hpp +404 -0
  119. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlData.hpp +283 -0
  120. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlFile.hpp +194 -0
  121. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParser.hpp +282 -0
  122. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParserForwardDeclarations.hpp +85 -0
  123. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLZipArchive.hpp +232 -0
  124. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/LibZip.hpp +447 -0
  125. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/OpenXLSXFileSystemTools.hpp +207 -0
  126. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/Zippy.hpp +1375 -0
  127. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCell.cpp +340 -0
  128. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellIterator.cpp +427 -0
  129. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellRange.cpp +221 -0
  130. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellReference.cpp +408 -0
  131. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellValue.cpp +519 -0
  132. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColor.cpp +202 -0
  133. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColumn.cpp +141 -0
  134. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLComments.cpp +637 -0
  135. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLContentTypes.cpp +329 -0
  136. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDateTime.cpp +269 -0
  137. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDocument.cpp +1678 -0
  138. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDrawing.cpp +784 -0
  139. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLFormula.cpp +201 -0
  140. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLMergeCells.cpp +357 -0
  141. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLProperties.cpp +810 -0
  142. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRelationships.cpp +529 -0
  143. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRow.cpp +918 -0
  144. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRowData.cpp +508 -0
  145. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSharedStrings.cpp +220 -0
  146. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSheet.cpp +1970 -0
  147. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLStyles.cpp +3014 -0
  148. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLTables.cpp +125 -0
  149. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLWorkbook.cpp +784 -0
  150. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlData.cpp +247 -0
  151. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlFile.cpp +160 -0
  152. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlParser.cpp +261 -0
  153. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLZipArchive.cpp +266 -0
  154. package/thirdparty/OpenXLSX/OpenXLSX/sources/utilities/XLUtilities.hpp +478 -0
  155. package/thirdparty/OpenXLSX/README.md +1279 -0
  156. package/thirdparty/OpenXLSX/Scripts/cmake-cleanup.sh +102 -0
  157. package/thirdparty/OpenXLSX/Scripts/compile.sh +23 -0
  158. package/thirdparty/OpenXLSX/Scripts/demos-cleanup.sh +25 -0
  159. package/thirdparty/OpenXLSX/Scripts/demos-run-all.sh +60 -0
  160. package/thirdparty/OpenXLSX/Scripts/guarded-xml-format.sh +47 -0
  161. package/thirdparty/OpenXLSX/Scripts/make-gnu.sh +11 -0
  162. package/thirdparty/OpenXLSX/Scripts/uninstall-manifest.sh +48 -0
  163. package/thirdparty/OpenXLSX/Scripts/xml-format-all.sh +19 -0
  164. package/thirdparty/OpenXLSX/Scripts/xml-format.sh +38 -0
  165. package/thirdparty/OpenXLSX/Tests/CMakeLists.txt +37 -0
  166. package/thirdparty/OpenXLSX/Tests/catch/catch.hpp +17799 -0
  167. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_automake.hpp +68 -0
  168. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_sonarqube.hpp +182 -0
  169. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_tap.hpp +278 -0
  170. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_teamcity.hpp +212 -0
  171. package/thirdparty/OpenXLSX/Tests/main.cpp +55 -0
  172. package/thirdparty/OpenXLSX/Tests/testXLCell.cpp +176 -0
  173. package/thirdparty/OpenXLSX/Tests/testXLCellRange.cpp +180 -0
  174. package/thirdparty/OpenXLSX/Tests/testXLCellReference.cpp +160 -0
  175. package/thirdparty/OpenXLSX/Tests/testXLCellValue.cpp +366 -0
  176. package/thirdparty/OpenXLSX/Tests/testXLCellValueProxy.cpp +255 -0
  177. package/thirdparty/OpenXLSX/Tests/testXLColor.cpp +75 -0
  178. package/thirdparty/OpenXLSX/Tests/testXLDateTime.cpp +229 -0
  179. package/thirdparty/OpenXLSX/Tests/testXLDocument.cpp +197 -0
  180. package/thirdparty/OpenXLSX/Tests/testXLFormula.cpp +131 -0
  181. package/thirdparty/OpenXLSX/Tests/testXLRow.cpp +597 -0
  182. package/thirdparty/OpenXLSX/Tests/testXLSheet.cpp +77 -0
  183. package/thirdparty/OpenXLSX/Tests/ziptest-with-libs.cpp +88 -0
  184. package/thirdparty/OpenXLSX/Tests/ziptest.cpp +735 -0
  185. package/thirdparty/OpenXLSX/cmake/get-git-HEAD-ID.cmake +45 -0
  186. package/thirdparty/OpenXLSX/cmake/libopenxlsxCPackOptions.cmake.in +20 -0
  187. package/thirdparty/OpenXLSX/cmake/manage_dependency.cmake +813 -0
  188. package/thirdparty/OpenXLSX/cmake/recursive_library_type_test.cmake +52 -0
  189. package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-shared.hpp +42 -0
  190. package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-static.hpp +42 -0
  191. package/thirdparty/OpenXLSX/vcpkg.json +24 -0
  192. package/thirdparty/README.md +42 -0
  193. package/thirdparty/miniz/.clang-format +47 -0
  194. package/thirdparty/miniz/.travis.yml +2 -0
  195. package/thirdparty/miniz/CMakeLists.txt +333 -0
  196. package/thirdparty/miniz/CMakePresets.json +31 -0
  197. package/thirdparty/miniz/ChangeLog.md +272 -0
  198. package/thirdparty/miniz/Config.cmake.in +1 -0
  199. package/thirdparty/miniz/LICENSE +22 -0
  200. package/thirdparty/miniz/amalgamate.sh +57 -0
  201. package/thirdparty/miniz/examples/example1.c +105 -0
  202. package/thirdparty/miniz/examples/example2.c +164 -0
  203. package/thirdparty/miniz/examples/example3.c +269 -0
  204. package/thirdparty/miniz/examples/example4.c +102 -0
  205. package/thirdparty/miniz/examples/example5.c +327 -0
  206. package/thirdparty/miniz/examples/example6.c +189 -0
  207. package/thirdparty/miniz/meson.build +21 -0
  208. package/thirdparty/miniz/miniz.c +646 -0
  209. package/thirdparty/miniz/miniz.h +615 -0
  210. package/thirdparty/miniz/miniz.pc.in +13 -0
  211. package/thirdparty/miniz/miniz_common.h +89 -0
  212. package/thirdparty/miniz/miniz_export.h +20 -0
  213. package/thirdparty/miniz/miniz_tdef.c +1602 -0
  214. package/thirdparty/miniz/miniz_tdef.h +199 -0
  215. package/thirdparty/miniz/miniz_tinfl.c +778 -0
  216. package/thirdparty/miniz/miniz_tinfl.h +150 -0
  217. package/thirdparty/miniz/miniz_zip.c +4895 -0
  218. package/thirdparty/miniz/miniz_zip.h +454 -0
  219. package/thirdparty/miniz/readme.md +46 -0
  220. package/thirdparty/miniz/test.sh +36 -0
  221. package/thirdparty/miniz/tests/add_in_place_fuzzer.c +87 -0
  222. package/thirdparty/miniz/tests/catch_amalgamated.cpp +10795 -0
  223. package/thirdparty/miniz/tests/catch_amalgamated.hpp +13143 -0
  224. package/thirdparty/miniz/tests/checksum_fuzzer.c +26 -0
  225. package/thirdparty/miniz/tests/compress_fuzzer.c +91 -0
  226. package/thirdparty/miniz/tests/flush_fuzzer.c +88 -0
  227. package/thirdparty/miniz/tests/fuzz_main.c +55 -0
  228. package/thirdparty/miniz/tests/large_fuzzer.c +133 -0
  229. package/thirdparty/miniz/tests/main.cpp +185 -0
  230. package/thirdparty/miniz/tests/miniz_tdefl_fuzzer.cc +115 -0
  231. package/thirdparty/miniz/tests/miniz_tester.cpp +1881 -0
  232. package/thirdparty/miniz/tests/miniz_zip_validate_fuzzer.cc +71 -0
  233. package/thirdparty/miniz/tests/miniz_zip_writer_fuzzer.cc +96 -0
  234. package/thirdparty/miniz/tests/ossfuzz.sh +48 -0
  235. package/thirdparty/miniz/tests/small_fuzzer.c +126 -0
  236. package/thirdparty/miniz/tests/timer.cpp +152 -0
  237. package/thirdparty/miniz/tests/timer.h +40 -0
  238. package/thirdparty/miniz/tests/uncompress2_fuzzer.c +21 -0
  239. package/thirdparty/miniz/tests/uncompress_fuzzer.c +30 -0
  240. package/thirdparty/miniz/tests/zip.dict +9 -0
  241. package/thirdparty/miniz/tests/zip_fuzzer.c +63 -0
  242. package/thirdparty/pugixml/.codecov.yml +7 -0
  243. package/thirdparty/pugixml/.gitattributes +1 -0
  244. package/thirdparty/pugixml/CMakeLists.txt +330 -0
  245. package/thirdparty/pugixml/LICENSE.md +24 -0
  246. package/thirdparty/pugixml/Makefile +98 -0
  247. package/thirdparty/pugixml/README.md +81 -0
  248. package/thirdparty/pugixml/SECURITY.md +9 -0
  249. package/thirdparty/pugixml/appveyor.yml +50 -0
  250. package/thirdparty/pugixml/docs/config.adoc +7 -0
  251. package/thirdparty/pugixml/docs/images/dom_tree.png +0 -0
  252. package/thirdparty/pugixml/docs/images/vs2005_link1.png +0 -0
  253. package/thirdparty/pugixml/docs/images/vs2005_link2.png +0 -0
  254. package/thirdparty/pugixml/docs/images/vs2005_pch1.png +0 -0
  255. package/thirdparty/pugixml/docs/images/vs2005_pch2.png +0 -0
  256. package/thirdparty/pugixml/docs/images/vs2005_pch3.png +0 -0
  257. package/thirdparty/pugixml/docs/images/vs2005_pch4.png +0 -0
  258. package/thirdparty/pugixml/docs/images/vs2010_link1.png +0 -0
  259. package/thirdparty/pugixml/docs/images/vs2010_link2.png +0 -0
  260. package/thirdparty/pugixml/docs/manual.adoc +3326 -0
  261. package/thirdparty/pugixml/docs/manual.html +6395 -0
  262. package/thirdparty/pugixml/docs/quickstart.adoc +287 -0
  263. package/thirdparty/pugixml/docs/quickstart.html +1107 -0
  264. package/thirdparty/pugixml/docs/samples/character.xml +8 -0
  265. package/thirdparty/pugixml/docs/samples/custom_memory_management.cpp +27 -0
  266. package/thirdparty/pugixml/docs/samples/include.cpp +64 -0
  267. package/thirdparty/pugixml/docs/samples/load_error_handling.cpp +33 -0
  268. package/thirdparty/pugixml/docs/samples/load_file.cpp +16 -0
  269. package/thirdparty/pugixml/docs/samples/load_memory.cpp +66 -0
  270. package/thirdparty/pugixml/docs/samples/load_options.cpp +30 -0
  271. package/thirdparty/pugixml/docs/samples/load_stream.cpp +97 -0
  272. package/thirdparty/pugixml/docs/samples/modify_add.cpp +29 -0
  273. package/thirdparty/pugixml/docs/samples/modify_base.cpp +43 -0
  274. package/thirdparty/pugixml/docs/samples/modify_remove.cpp +27 -0
  275. package/thirdparty/pugixml/docs/samples/save_custom_writer.cpp +116 -0
  276. package/thirdparty/pugixml/docs/samples/save_declaration.cpp +27 -0
  277. package/thirdparty/pugixml/docs/samples/save_file.cpp +17 -0
  278. package/thirdparty/pugixml/docs/samples/save_options.cpp +48 -0
  279. package/thirdparty/pugixml/docs/samples/save_stream.cpp +18 -0
  280. package/thirdparty/pugixml/docs/samples/save_subtree.cpp +26 -0
  281. package/thirdparty/pugixml/docs/samples/text.cpp +35 -0
  282. package/thirdparty/pugixml/docs/samples/transitions.xml +7 -0
  283. package/thirdparty/pugixml/docs/samples/traverse_base.cpp +51 -0
  284. package/thirdparty/pugixml/docs/samples/traverse_iter.cpp +27 -0
  285. package/thirdparty/pugixml/docs/samples/traverse_predicate.cpp +48 -0
  286. package/thirdparty/pugixml/docs/samples/traverse_rangefor.cpp +32 -0
  287. package/thirdparty/pugixml/docs/samples/traverse_walker.cpp +35 -0
  288. package/thirdparty/pugixml/docs/samples/tree.xml +12 -0
  289. package/thirdparty/pugixml/docs/samples/weekly-shift_jis.xml +78 -0
  290. package/thirdparty/pugixml/docs/samples/weekly-utf-16.xml +0 -0
  291. package/thirdparty/pugixml/docs/samples/weekly-utf-8.xml +78 -0
  292. package/thirdparty/pugixml/docs/samples/xgconsole.xml +12 -0
  293. package/thirdparty/pugixml/docs/samples/xpath_error.cpp +43 -0
  294. package/thirdparty/pugixml/docs/samples/xpath_query.cpp +36 -0
  295. package/thirdparty/pugixml/docs/samples/xpath_select.cpp +28 -0
  296. package/thirdparty/pugixml/docs/samples/xpath_variables.cpp +38 -0
  297. package/thirdparty/pugixml/readme.txt +50 -0
  298. package/thirdparty/pugixml/scripts/archive.py +54 -0
  299. package/thirdparty/pugixml/scripts/cocoapods_push.sh +4 -0
  300. package/thirdparty/pugixml/scripts/natvis/pugixml.natvis +77 -0
  301. package/thirdparty/pugixml/scripts/natvis/pugixml_compact.natvis +506 -0
  302. package/thirdparty/pugixml/scripts/nuget/build/native/pugixml-propertiesui.xml +17 -0
  303. package/thirdparty/pugixml/scripts/nuget/build/native/pugixml.targets +28 -0
  304. package/thirdparty/pugixml/scripts/nuget/pugixml.nuspec +20 -0
  305. package/thirdparty/pugixml/scripts/nuget_build.ps1 +60 -0
  306. package/thirdparty/pugixml/scripts/premake4.lua +92 -0
  307. package/thirdparty/pugixml/scripts/pugixml-config.cmake.in +12 -0
  308. package/thirdparty/pugixml/scripts/pugixml.pc.in +11 -0
  309. package/thirdparty/pugixml/scripts/pugixml.podspec +14 -0
  310. package/thirdparty/pugixml/scripts/pugixml.xcodeproj/project.pbxproj +212 -0
  311. package/thirdparty/pugixml/scripts/pugixml_airplay.mkf +13 -0
  312. package/thirdparty/pugixml/scripts/pugixml_codeblocks.cbp +44 -0
  313. package/thirdparty/pugixml/scripts/pugixml_codelite.project +56 -0
  314. package/thirdparty/pugixml/scripts/pugixml_dll.rc +45 -0
  315. package/thirdparty/pugixml/scripts/pugixml_vs2005.vcproj +343 -0
  316. package/thirdparty/pugixml/scripts/pugixml_vs2005_static.vcproj +343 -0
  317. package/thirdparty/pugixml/scripts/pugixml_vs2008.vcproj +339 -0
  318. package/thirdparty/pugixml/scripts/pugixml_vs2008_static.vcproj +339 -0
  319. package/thirdparty/pugixml/scripts/pugixml_vs2010.vcxproj +191 -0
  320. package/thirdparty/pugixml/scripts/pugixml_vs2010_static.vcxproj +191 -0
  321. package/thirdparty/pugixml/scripts/pugixml_vs2013.vcxproj +199 -0
  322. package/thirdparty/pugixml/scripts/pugixml_vs2013_static.vcxproj +199 -0
  323. package/thirdparty/pugixml/scripts/pugixml_vs2015.vcxproj +172 -0
  324. package/thirdparty/pugixml/scripts/pugixml_vs2015_static.vcxproj +176 -0
  325. package/thirdparty/pugixml/scripts/pugixml_vs2017.vcxproj +172 -0
  326. package/thirdparty/pugixml/scripts/pugixml_vs2017_static.vcxproj +176 -0
  327. package/thirdparty/pugixml/scripts/pugixml_vs2019.vcxproj +176 -0
  328. package/thirdparty/pugixml/scripts/pugixml_vs2019_static.vcxproj +180 -0
  329. package/thirdparty/pugixml/scripts/pugixml_vs2022.vcxproj +176 -0
  330. package/thirdparty/pugixml/scripts/pugixml_vs2022_static.vcxproj +180 -0
  331. package/thirdparty/pugixml/scripts/pugixml_vs2026.vcxproj +176 -0
  332. package/thirdparty/pugixml/scripts/pugixml_vs2026_static.vcxproj +180 -0
  333. package/thirdparty/pugixml/scripts/sbom.cdx.json +47 -0
  334. package/thirdparty/pugixml/src/pugiconfig.hpp +81 -0
  335. package/thirdparty/pugixml/src/pugixml.cpp +13776 -0
  336. package/thirdparty/pugixml/src/pugixml.hpp +1604 -0
  337. package/thirdparty/pugixml/tests/allocator.cpp +175 -0
  338. package/thirdparty/pugixml/tests/allocator.hpp +10 -0
  339. package/thirdparty/pugixml/tests/autotest-appveyor.ps1 +93 -0
  340. package/thirdparty/pugixml/tests/cmake-appveyor.ps1 +57 -0
  341. package/thirdparty/pugixml/tests/data/empty.xml +0 -0
  342. package/thirdparty/pugixml/tests/data/large.xml +1 -0
  343. package/thirdparty/pugixml/tests/data/latintest_latin1.xml +1 -0
  344. package/thirdparty/pugixml/tests/data/latintest_utf8.xml +1 -0
  345. package/thirdparty/pugixml/tests/data/multiline.xml +3 -0
  346. package/thirdparty/pugixml/tests/data/small.xml +1 -0
  347. package/thirdparty/pugixml/tests/data/truncation.xml +19 -0
  348. package/thirdparty/pugixml/tests/data/utftest_utf16_be.xml +0 -0
  349. package/thirdparty/pugixml/tests/data/utftest_utf16_be_bom.xml +0 -0
  350. package/thirdparty/pugixml/tests/data/utftest_utf16_be_clean.xml +0 -0
  351. package/thirdparty/pugixml/tests/data/utftest_utf16_be_nodecl.xml +0 -0
  352. package/thirdparty/pugixml/tests/data/utftest_utf16_le.xml +0 -0
  353. package/thirdparty/pugixml/tests/data/utftest_utf16_le_bom.xml +0 -0
  354. package/thirdparty/pugixml/tests/data/utftest_utf16_le_clean.xml +0 -0
  355. package/thirdparty/pugixml/tests/data/utftest_utf16_le_nodecl.xml +0 -0
  356. package/thirdparty/pugixml/tests/data/utftest_utf32_be.xml +0 -0
  357. package/thirdparty/pugixml/tests/data/utftest_utf32_be_bom.xml +0 -0
  358. package/thirdparty/pugixml/tests/data/utftest_utf32_be_clean.xml +0 -0
  359. package/thirdparty/pugixml/tests/data/utftest_utf32_be_nodecl.xml +0 -0
  360. package/thirdparty/pugixml/tests/data/utftest_utf32_le.xml +0 -0
  361. package/thirdparty/pugixml/tests/data/utftest_utf32_le_bom.xml +0 -0
  362. package/thirdparty/pugixml/tests/data/utftest_utf32_le_clean.xml +0 -0
  363. package/thirdparty/pugixml/tests/data/utftest_utf32_le_nodecl.xml +0 -0
  364. package/thirdparty/pugixml/tests/data/utftest_utf8.xml +87 -0
  365. package/thirdparty/pugixml/tests/data/utftest_utf8_bom.xml +87 -0
  366. package/thirdparty/pugixml/tests/data/utftest_utf8_clean.xml +84 -0
  367. package/thirdparty/pugixml/tests/data/utftest_utf8_nodecl.xml +86 -0
  368. package/thirdparty/pugixml/tests/data//321/202/320/265/321/201/321/202.xml +1 -0
  369. package/thirdparty/pugixml/tests/data_fuzz_parse/basic.xml +1 -0
  370. package/thirdparty/pugixml/tests/data_fuzz_parse/doctype.xml +1 -0
  371. package/thirdparty/pugixml/tests/data_fuzz_parse/refs.xml +1 -0
  372. package/thirdparty/pugixml/tests/data_fuzz_parse/types.xml +1 -0
  373. package/thirdparty/pugixml/tests/data_fuzz_parse/utf16.xml +0 -0
  374. package/thirdparty/pugixml/tests/data_fuzz_parse/utf32.xml +0 -0
  375. package/thirdparty/pugixml/tests/data_fuzz_xpath/basic.xpath +1 -0
  376. package/thirdparty/pugixml/tests/data_fuzz_xpath/functions.xpath +1 -0
  377. package/thirdparty/pugixml/tests/data_fuzz_xpath/math.xpath +1 -0
  378. package/thirdparty/pugixml/tests/data_fuzz_xpath/path.xpath +1 -0
  379. package/thirdparty/pugixml/tests/data_fuzz_xpath/predicate.xpath +1 -0
  380. package/thirdparty/pugixml/tests/fuzz_parse.cpp +14 -0
  381. package/thirdparty/pugixml/tests/fuzz_parse.dict +72 -0
  382. package/thirdparty/pugixml/tests/fuzz_setup.sh +11 -0
  383. package/thirdparty/pugixml/tests/fuzz_xpath.cpp +46 -0
  384. package/thirdparty/pugixml/tests/fuzz_xpath.dict +72 -0
  385. package/thirdparty/pugixml/tests/helpers.hpp +114 -0
  386. package/thirdparty/pugixml/tests/main.cpp +218 -0
  387. package/thirdparty/pugixml/tests/test.cpp +220 -0
  388. package/thirdparty/pugixml/tests/test.hpp +175 -0
  389. package/thirdparty/pugixml/tests/test_compact.cpp +150 -0
  390. package/thirdparty/pugixml/tests/test_deprecated.cpp +25 -0
  391. package/thirdparty/pugixml/tests/test_document.cpp +1910 -0
  392. package/thirdparty/pugixml/tests/test_dom_modify.cpp +2122 -0
  393. package/thirdparty/pugixml/tests/test_dom_text.cpp +601 -0
  394. package/thirdparty/pugixml/tests/test_dom_traverse.cpp +1481 -0
  395. package/thirdparty/pugixml/tests/test_header_guard.cpp +3 -0
  396. package/thirdparty/pugixml/tests/test_header_iosfwd_1.cpp +3 -0
  397. package/thirdparty/pugixml/tests/test_header_iosfwd_2.cpp +3 -0
  398. package/thirdparty/pugixml/tests/test_header_iostream_1.cpp +3 -0
  399. package/thirdparty/pugixml/tests/test_header_iostream_2.cpp +3 -0
  400. package/thirdparty/pugixml/tests/test_header_only_1.cpp +21 -0
  401. package/thirdparty/pugixml/tests/test_header_only_2.cpp +21 -0
  402. package/thirdparty/pugixml/tests/test_header_string_1.cpp +3 -0
  403. package/thirdparty/pugixml/tests/test_header_string_2.cpp +3 -0
  404. package/thirdparty/pugixml/tests/test_header_string_iostream.cpp +5 -0
  405. package/thirdparty/pugixml/tests/test_memory.cpp +303 -0
  406. package/thirdparty/pugixml/tests/test_parse.cpp +1463 -0
  407. package/thirdparty/pugixml/tests/test_parse_doctype.cpp +366 -0
  408. package/thirdparty/pugixml/tests/test_unicode.cpp +152 -0
  409. package/thirdparty/pugixml/tests/test_version.cpp +5 -0
  410. package/thirdparty/pugixml/tests/test_write.cpp +757 -0
  411. package/thirdparty/pugixml/tests/test_xpath.cpp +833 -0
  412. package/thirdparty/pugixml/tests/test_xpath_api.cpp +646 -0
  413. package/thirdparty/pugixml/tests/test_xpath_functions.cpp +844 -0
  414. package/thirdparty/pugixml/tests/test_xpath_operators.cpp +566 -0
  415. package/thirdparty/pugixml/tests/test_xpath_parse.cpp +428 -0
  416. package/thirdparty/pugixml/tests/test_xpath_paths.cpp +787 -0
  417. package/thirdparty/pugixml/tests/test_xpath_paths_abbrev_w3c.cpp +219 -0
  418. package/thirdparty/pugixml/tests/test_xpath_paths_w3c.cpp +312 -0
  419. package/thirdparty/pugixml/tests/test_xpath_variables.cpp +683 -0
  420. package/thirdparty/pugixml/tests/test_xpath_xalan_1.cpp +411 -0
  421. package/thirdparty/pugixml/tests/test_xpath_xalan_2.cpp +417 -0
  422. package/thirdparty/pugixml/tests/test_xpath_xalan_3.cpp +321 -0
  423. package/thirdparty/pugixml/tests/test_xpath_xalan_4.cpp +300 -0
  424. package/thirdparty/pugixml/tests/test_xpath_xalan_5.cpp +295 -0
  425. package/thirdparty/pugixml/tests/writer_string.cpp +79 -0
  426. package/thirdparty/pugixml/tests/writer_string.hpp +27 -0
  427. package/ios/dummy.swift +0 -2
  428. package/scripts/prepare-openxlsx.js +0 -109
@@ -10,10 +10,19 @@ class NitroXlsxPackage : ReactPackage {
10
10
  init {
11
11
  NitroXlsxOnLoad.initializeNative()
12
12
  }
13
+
14
+ /** Pass the app cache directory to the native layer for temp XLSX files. */
15
+ @JvmStatic
16
+ private external fun nativeSetCacheDir(dir: String)
13
17
  }
14
18
 
15
19
  @Suppress("OVERRIDE_DEPRECATION")
16
20
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
21
+ try {
22
+ nativeSetCacheDir(reactContext.cacheDir.absolutePath)
23
+ } catch (_: Throwable) {
24
+ // native resolver falls back to Context.getCacheDir() via JNI
25
+ }
17
26
  return emptyList()
18
27
  }
19
28
 
@@ -1,99 +1,10 @@
1
1
  #include "HybridNitroXlsx.hpp"
2
+ #include "XlsxError.hpp"
2
3
  #include <fstream>
3
4
  #include <stdexcept>
4
5
  #include <cstring>
5
6
  #include <cstdlib>
6
7
 
7
- namespace {
8
-
9
- struct JsonParser {
10
- const char* p;
11
- explicit JsonParser(const char* s) : p(s) {}
12
-
13
- void skipWs() { while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') ++p; }
14
-
15
- char peek() { skipWs(); return *p; }
16
-
17
- void expect(char c) {
18
- skipWs();
19
- if (*p != c) throw std::runtime_error(std::string("Expected '") + c + "' but got '" + *p + "'");
20
- ++p;
21
- }
22
-
23
- std::string parseString() {
24
- expect('"');
25
- std::string s;
26
- while (*p && *p != '"') {
27
- if (*p == '\\') {
28
- ++p;
29
- switch (*p) {
30
- case '"': s += '"'; break;
31
- case '\\': s += '\\'; break;
32
- case '/': s += '/'; break;
33
- case 'b': s += '\b'; break;
34
- case 'f': s += '\f'; break;
35
- case 'n': s += '\n'; break;
36
- case 'r': s += '\r'; break;
37
- case 't': s += '\t'; break;
38
- case 'u': {
39
- ++p;
40
- char hex[5] = {};
41
- std::memcpy(hex, p, 4);
42
- p += 4;
43
- unsigned long cp = std::strtoul(hex, nullptr, 16);
44
- if (cp < 0x80) {
45
- s += static_cast<char>(cp);
46
- } else if (cp < 0x800) {
47
- s += static_cast<char>(0xC0 | (cp >> 6));
48
- s += static_cast<char>(0x80 | (cp & 0x3F));
49
- } else {
50
- s += static_cast<char>(0xE0 | (cp >> 12));
51
- s += static_cast<char>(0x80 | ((cp >> 6) & 0x3F));
52
- s += static_cast<char>(0x80 | (cp & 0x3F));
53
- }
54
- continue;
55
- }
56
- default: s += '\\'; s += *p; break;
57
- }
58
- } else {
59
- s += *p;
60
- }
61
- ++p;
62
- }
63
- if (*p == '"') ++p;
64
- return s;
65
- }
66
-
67
- enum ValueType { T_STRING, T_NUMBER, T_BOOL, T_NULL };
68
-
69
- struct Value {
70
- ValueType type;
71
- std::string str;
72
- double num = 0;
73
- bool boolean = false;
74
- };
75
-
76
- Value parseValue() {
77
- skipWs();
78
- if (*p == '"') return { T_STRING, parseString(), 0, false };
79
- if (*p == 't') { p += 4; return { T_BOOL, "", 0, true }; }
80
- if (*p == 'f') { p += 5; return { T_BOOL, "", 0, false }; }
81
- if (*p == 'n') { p += 4; return { T_NULL, "", 0, false }; }
82
-
83
- // number
84
- Value v{ T_NUMBER, "", 0, false };
85
- const char* start = p;
86
- if (*p == '-') ++p;
87
- while (*p >= '0' && *p <= '9') ++p;
88
- if (*p == '.') { ++p; while (*p >= '0' && *p <= '9') ++p; }
89
- if (*p == 'e' || *p == 'E') { ++p; if (*p == '+' || *p == '-') ++p; while (*p >= '0' && *p <= '9') ++p; }
90
- v.num = std::strtod(start, nullptr);
91
- return v;
92
- }
93
- };
94
-
95
- } // anonymous namespace
96
-
97
8
  namespace margelo::nitro::xlsx {
98
9
 
99
10
  HybridNitroXlsx::HybridNitroXlsx()
@@ -103,104 +14,39 @@ HybridNitroXlsx::HybridNitroXlsx()
103
14
  HybridNitroXlsx::~HybridNitroXlsx() {
104
15
  }
105
16
 
106
- std::shared_ptr<HybridXlsxWorkbookSpec> HybridNitroXlsx::createWorkbook(const std::optional<std::string>& tempDir) {
107
- return std::make_shared<HybridXlsxWorkbook>(tempDir);
17
+ std::shared_ptr<HybridXlsxWorkbookSpec> HybridNitroXlsx::createWorkbook() {
18
+ return withXlsxError(xlsx_error::IO_ERROR, [&]() -> std::shared_ptr<HybridXlsxWorkbookSpec> {
19
+ return std::make_shared<HybridXlsxWorkbook>();
20
+ });
108
21
  }
109
22
 
110
23
  std::shared_ptr<HybridXlsxWorkbookSpec> HybridNitroXlsx::openWorkbook(const std::string& path) {
111
- auto workbook = std::make_shared<HybridXlsxWorkbook>();
112
- workbook->openFromFile(path);
113
- return workbook;
24
+ return withXlsxError(xlsx_error::IO_ERROR, [&]() -> std::shared_ptr<HybridXlsxWorkbookSpec> {
25
+ auto workbook = std::make_shared<HybridXlsxWorkbook>();
26
+ workbook->openFromFile(path);
27
+ return workbook;
28
+ });
114
29
  }
115
30
 
116
31
  std::shared_ptr<HybridXlsxWorkbookSpec> HybridNitroXlsx::openWorkbookFromBuffer(const std::shared_ptr<ArrayBuffer>& buffer) {
117
- auto workbook = std::make_shared<HybridXlsxWorkbook>();
118
- workbook->openFromBuffer(buffer->data(), buffer->size());
119
- return workbook;
32
+ return withXlsxError(xlsx_error::IO_ERROR, [&]() -> std::shared_ptr<HybridXlsxWorkbookSpec> {
33
+ auto workbook = std::make_shared<HybridXlsxWorkbook>();
34
+ workbook->openFromBuffer(buffer->data(), buffer->size());
35
+ return workbook;
36
+ });
120
37
  }
121
38
 
122
- std::shared_ptr<HybridXlsxWorkbookSpec> HybridNitroXlsx::fromJSON(const std::string& data) {
123
- auto workbook = std::make_shared<HybridXlsxWorkbook>();
124
- auto sheet = workbook->addWorksheet("Sheet1");
125
-
126
- JsonParser parser(data.c_str());
127
- parser.skipWs();
128
- parser.expect('[');
39
+ std::shared_ptr<HybridXlsxWorkbookSpec> HybridNitroXlsx::fromJSON(const std::unordered_map<std::string, std::vector<std::shared_ptr<AnyMap>>>& data) {
40
+ return withXlsxError(xlsx_error::INVALID_ARGUMENT, [&]() -> std::shared_ptr<HybridXlsxWorkbookSpec> {
41
+ auto workbook = std::make_shared<HybridXlsxWorkbook>();
42
+ if (data.empty()) return workbook;
129
43
 
130
- if (parser.peek() == ']') return workbook;
131
-
132
- // Parse first object to extract keys
133
- parser.expect('{');
134
-
135
- std::vector<std::string> keys;
136
- unsigned int col = 1;
137
-
138
- while (parser.peek() != '}') {
139
- std::string key = parser.parseString();
140
- keys.push_back(key);
141
- parser.expect(':');
142
- auto val = parser.parseValue();
143
-
144
- switch (val.type) {
145
- case JsonParser::T_STRING:
146
- sheet->writeString(1, col, val.str, std::nullopt);
147
- break;
148
- case JsonParser::T_NUMBER:
149
- sheet->writeNumber(1, col, val.num, std::nullopt);
150
- break;
151
- case JsonParser::T_BOOL:
152
- sheet->writeBoolean(1, col, val.boolean, std::nullopt);
153
- break;
154
- default:
155
- break;
44
+ for (const auto& [sheetName, rows] : data) {
45
+ auto sheet = workbook->addWorksheet(sheetName);
46
+ sheet->fromJSON(rows);
156
47
  }
157
- ++col;
158
- if (parser.peek() == ',') ++parser.p;
159
- }
160
- parser.expect('}');
161
-
162
- unsigned int row = 2;
163
-
164
- while (parser.peek() == ',') {
165
- ++parser.p;
166
- parser.expect('{');
167
-
168
- while (parser.peek() != '}') {
169
- std::string key = parser.parseString();
170
- parser.expect(':');
171
- auto val = parser.parseValue();
172
-
173
- unsigned int targetCol = 0;
174
- for (size_t k = 0; k < keys.size(); ++k) {
175
- if (keys[k] == key) { targetCol = static_cast<unsigned int>(k + 1); break; }
176
- }
177
- if (targetCol == 0) {
178
- keys.push_back(key);
179
- targetCol = static_cast<unsigned int>(keys.size());
180
- }
181
-
182
- switch (val.type) {
183
- case JsonParser::T_STRING:
184
- sheet->writeString(row, targetCol, val.str, std::nullopt);
185
- break;
186
- case JsonParser::T_NUMBER:
187
- sheet->writeNumber(row, targetCol, val.num, std::nullopt);
188
- break;
189
- case JsonParser::T_BOOL:
190
- sheet->writeBoolean(row, targetCol, val.boolean, std::nullopt);
191
- break;
192
- default:
193
- break;
194
- }
195
-
196
- if (parser.peek() == ',') ++parser.p;
197
- }
198
- parser.expect('}');
199
- ++row;
200
- }
201
-
202
- parser.expect(']');
203
- return workbook;
48
+ return workbook;
49
+ });
204
50
  }
205
51
 
206
- }
52
+ }
@@ -11,10 +11,10 @@ public:
11
11
  HybridNitroXlsx();
12
12
  ~HybridNitroXlsx() override;
13
13
 
14
- std::shared_ptr<HybridXlsxWorkbookSpec> createWorkbook(const std::optional<std::string>& tempDir = std::nullopt) override;
14
+ std::shared_ptr<HybridXlsxWorkbookSpec> createWorkbook() override;
15
15
  std::shared_ptr<HybridXlsxWorkbookSpec> openWorkbook(const std::string& path) override;
16
16
  std::shared_ptr<HybridXlsxWorkbookSpec> openWorkbookFromBuffer(const std::shared_ptr<ArrayBuffer>& buffer) override;
17
- std::shared_ptr<HybridXlsxWorkbookSpec> fromJSON(const std::string& data) override;
17
+ std::shared_ptr<HybridXlsxWorkbookSpec> fromJSON(const std::unordered_map<std::string, std::vector<std::shared_ptr<AnyMap>>>& data) override;
18
18
  };
19
19
 
20
20
  }
@@ -0,0 +1,252 @@
1
+ #include "HybridXlsxConditionalFormat.hpp"
2
+ #include "XlsxError.hpp"
3
+
4
+ namespace margelo::nitro::xlsx {
5
+
6
+ HybridXlsxConditionalFormat::HybridXlsxConditionalFormat(OpenXLSX::XLConditionalFormat format)
7
+ : HybridObject("XlsxConditionalFormat"), HybridXlsxConditionalFormatSpec(), _format(std::move(format)) {
8
+ }
9
+
10
+ HybridXlsxConditionalFormat::~HybridXlsxConditionalFormat() = default;
11
+
12
+ OpenXLSX::XLCfRules HybridXlsxConditionalFormat::rules() {
13
+ return _format.cfRules();
14
+ }
15
+
16
+ OpenXLSX::XLCfRule HybridXlsxConditionalFormat::ruleAt(double index) {
17
+ size_t idx = static_cast<size_t>(index);
18
+ auto cfRules = _format.cfRules();
19
+ if (idx >= cfRules.count()) {
20
+ throw XlsxError(xlsx_error::INDEX_OUT_OF_RANGE,
21
+ "cfRule index " + std::to_string(idx) + " out of range (count=" + std::to_string(cfRules.count()) + ")");
22
+ }
23
+ return cfRules.cfRuleByIndex(idx);
24
+ }
25
+
26
+ std::string HybridXlsxConditionalFormat::getSqref() {
27
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return _format.sqref(); });
28
+ }
29
+
30
+ void HybridXlsxConditionalFormat::setSqref(const std::string& sqref) {
31
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
32
+ if (!_format.setSqref(sqref)) {
33
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set sqref: " + sqref);
34
+ }
35
+ });
36
+ }
37
+
38
+ double HybridXlsxConditionalFormat::getRuleCount() {
39
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
40
+ return static_cast<double>(_format.cfRules().count());
41
+ });
42
+ }
43
+
44
+ double HybridXlsxConditionalFormat::createRule() {
45
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
46
+ auto cfRules = _format.cfRules();
47
+ return static_cast<double>(cfRules.create());
48
+ });
49
+ }
50
+
51
+ bool HybridXlsxConditionalFormat::deleteRule(double index) {
52
+ // OpenXLSX does not expose cfRule deletion
53
+ (void)index;
54
+ return false;
55
+ }
56
+
57
+ double HybridXlsxConditionalFormat::getRuleType(double index) {
58
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
59
+ return static_cast<double>(ruleAt(index).type());
60
+ });
61
+ }
62
+
63
+ void HybridXlsxConditionalFormat::setRuleType(double index, double type) {
64
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
65
+ if (!ruleAt(index).setType(static_cast<OpenXLSX::XLCfType>(static_cast<uint8_t>(type)))) {
66
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set rule type");
67
+ }
68
+ });
69
+ }
70
+
71
+ double HybridXlsxConditionalFormat::getRuleDxfId(double index) {
72
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
73
+ return static_cast<double>(ruleAt(index).dxfId());
74
+ });
75
+ }
76
+
77
+ void HybridXlsxConditionalFormat::setRuleDxfId(double index, double dxfId) {
78
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
79
+ if (!ruleAt(index).setDxfId(static_cast<OpenXLSX::XLStyleIndex>(dxfId))) {
80
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set rule dxfId");
81
+ }
82
+ });
83
+ }
84
+
85
+ std::string HybridXlsxConditionalFormat::getRuleFormula(double index, double formulaIndex) {
86
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
87
+ // OpenXLSX only supports the primary <formula> node
88
+ if (formulaIndex != 0) return std::string();
89
+ return ruleAt(index).formula();
90
+ });
91
+ }
92
+
93
+ void HybridXlsxConditionalFormat::setRuleFormula(double index, double formulaIndex, const std::string& formula) {
94
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
95
+ if (formulaIndex != 0) {
96
+ throw XlsxError(xlsx_error::UNSUPPORTED,
97
+ "OpenXLSX only supports a single formula per cfRule (formulaIndex must be 0)");
98
+ }
99
+ if (!ruleAt(index).setFormula(formula)) {
100
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set rule formula");
101
+ }
102
+ });
103
+ }
104
+
105
+ double HybridXlsxConditionalFormat::getRuleOperator(double index) {
106
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
107
+ return static_cast<double>(ruleAt(index).Operator());
108
+ });
109
+ }
110
+
111
+ void HybridXlsxConditionalFormat::setRuleOperator(double index, double op) {
112
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
113
+ if (!ruleAt(index).setOperator(static_cast<OpenXLSX::XLCfOperator>(static_cast<uint8_t>(op)))) {
114
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set rule operator");
115
+ }
116
+ });
117
+ }
118
+
119
+ std::string HybridXlsxConditionalFormat::getRuleText(double index) {
120
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return ruleAt(index).text(); });
121
+ }
122
+
123
+ void HybridXlsxConditionalFormat::setRuleText(double index, const std::string& text) {
124
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
125
+ if (!ruleAt(index).setText(text)) {
126
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set rule text");
127
+ }
128
+ });
129
+ }
130
+
131
+ double HybridXlsxConditionalFormat::getRulePriority(double index) {
132
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
133
+ return static_cast<double>(ruleAt(index).priority());
134
+ });
135
+ }
136
+
137
+ void HybridXlsxConditionalFormat::setRulePriority(double index, double priority) {
138
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
139
+ auto cfRules = _format.cfRules();
140
+ if (!cfRules.setPriority(static_cast<size_t>(index), static_cast<uint16_t>(priority))) {
141
+ throw XlsxError(xlsx_error::INDEX_OUT_OF_RANGE, "Failed to set rule priority");
142
+ }
143
+ });
144
+ }
145
+
146
+ bool HybridXlsxConditionalFormat::getRuleStopIfTrue(double index) {
147
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return ruleAt(index).stopIfTrue(); });
148
+ }
149
+
150
+ void HybridXlsxConditionalFormat::setRuleStopIfTrue(double index, bool stop) {
151
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
152
+ if (!ruleAt(index).setStopIfTrue(stop)) {
153
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set stopIfTrue");
154
+ }
155
+ });
156
+ }
157
+
158
+ double HybridXlsxConditionalFormat::getRuleTimePeriod(double index) {
159
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
160
+ return static_cast<double>(ruleAt(index).timePeriod());
161
+ });
162
+ }
163
+
164
+ void HybridXlsxConditionalFormat::setRuleTimePeriod(double index, double period) {
165
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
166
+ if (!ruleAt(index).setTimePeriod(static_cast<OpenXLSX::XLCfTimePeriod>(static_cast<uint8_t>(period)))) {
167
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set timePeriod");
168
+ }
169
+ });
170
+ }
171
+
172
+ double HybridXlsxConditionalFormat::getRuleRank(double index) {
173
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
174
+ return static_cast<double>(ruleAt(index).rank());
175
+ });
176
+ }
177
+
178
+ void HybridXlsxConditionalFormat::setRuleRank(double index, double rank) {
179
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
180
+ if (!ruleAt(index).setRank(static_cast<uint16_t>(rank))) {
181
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set rank");
182
+ }
183
+ });
184
+ }
185
+
186
+ double HybridXlsxConditionalFormat::getRuleStdDev(double index) {
187
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
188
+ return static_cast<double>(ruleAt(index).stdDev());
189
+ });
190
+ }
191
+
192
+ void HybridXlsxConditionalFormat::setRuleStdDev(double index, double stdDev) {
193
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
194
+ if (!ruleAt(index).setStdDev(static_cast<int16_t>(stdDev))) {
195
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set stdDev");
196
+ }
197
+ });
198
+ }
199
+
200
+ bool HybridXlsxConditionalFormat::getRuleAboveAverage(double index) {
201
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return ruleAt(index).aboveAverage(); });
202
+ }
203
+
204
+ void HybridXlsxConditionalFormat::setRuleAboveAverage(double index, bool set) {
205
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
206
+ if (!ruleAt(index).setAboveAverage(set)) {
207
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set aboveAverage");
208
+ }
209
+ });
210
+ }
211
+
212
+ bool HybridXlsxConditionalFormat::getRulePercent(double index) {
213
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return ruleAt(index).percent(); });
214
+ }
215
+
216
+ void HybridXlsxConditionalFormat::setRulePercent(double index, bool set) {
217
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
218
+ if (!ruleAt(index).setPercent(set)) {
219
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set percent");
220
+ }
221
+ });
222
+ }
223
+
224
+ bool HybridXlsxConditionalFormat::getRuleBottom(double index) {
225
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return ruleAt(index).bottom(); });
226
+ }
227
+
228
+ void HybridXlsxConditionalFormat::setRuleBottom(double index, bool set) {
229
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
230
+ if (!ruleAt(index).setBottom(set)) {
231
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set bottom");
232
+ }
233
+ });
234
+ }
235
+
236
+ bool HybridXlsxConditionalFormat::getRuleEqualAverage(double index) {
237
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return ruleAt(index).equalAverage(); });
238
+ }
239
+
240
+ void HybridXlsxConditionalFormat::setRuleEqualAverage(double index, bool set) {
241
+ withXlsxError(xlsx_error::XLSX_ERROR, [&] {
242
+ if (!ruleAt(index).setEqualAverage(set)) {
243
+ throw XlsxError(xlsx_error::XLSX_ERROR, "Failed to set equalAverage");
244
+ }
245
+ });
246
+ }
247
+
248
+ std::string HybridXlsxConditionalFormat::summary() {
249
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return _format.summary(); });
250
+ }
251
+
252
+ } // namespace margelo::nitro::xlsx
@@ -0,0 +1,62 @@
1
+ #pragma once
2
+
3
+ #include "HybridXlsxConditionalFormatSpec.hpp"
4
+ #include <OpenXLSX/XLSheet.hpp>
5
+ #include <memory>
6
+ #include <string>
7
+
8
+ namespace margelo::nitro::xlsx {
9
+
10
+ class HybridXlsxConditionalFormat : public HybridXlsxConditionalFormatSpec {
11
+ public:
12
+ explicit HybridXlsxConditionalFormat(OpenXLSX::XLConditionalFormat format);
13
+ ~HybridXlsxConditionalFormat() override;
14
+
15
+ std::string getSqref() override;
16
+ void setSqref(const std::string& sqref) override;
17
+
18
+ double getRuleCount() override;
19
+ double createRule() override;
20
+ bool deleteRule(double index) override;
21
+
22
+ double getRuleType(double index) override;
23
+ void setRuleType(double index, double type) override;
24
+ double getRuleDxfId(double index) override;
25
+ void setRuleDxfId(double index, double dxfId) override;
26
+
27
+ std::string getRuleFormula(double index, double formulaIndex) override;
28
+ void setRuleFormula(double index, double formulaIndex, const std::string& formula) override;
29
+
30
+ double getRuleOperator(double index) override;
31
+ void setRuleOperator(double index, double op) override;
32
+ std::string getRuleText(double index) override;
33
+ void setRuleText(double index, const std::string& text) override;
34
+ double getRulePriority(double index) override;
35
+ void setRulePriority(double index, double priority) override;
36
+ bool getRuleStopIfTrue(double index) override;
37
+ void setRuleStopIfTrue(double index, bool stop) override;
38
+ double getRuleTimePeriod(double index) override;
39
+ void setRuleTimePeriod(double index, double period) override;
40
+ double getRuleRank(double index) override;
41
+ void setRuleRank(double index, double rank) override;
42
+ double getRuleStdDev(double index) override;
43
+ void setRuleStdDev(double index, double stdDev) override;
44
+ bool getRuleAboveAverage(double index) override;
45
+ void setRuleAboveAverage(double index, bool set) override;
46
+ bool getRulePercent(double index) override;
47
+ void setRulePercent(double index, bool set) override;
48
+ bool getRuleBottom(double index) override;
49
+ void setRuleBottom(double index, bool set) override;
50
+ bool getRuleEqualAverage(double index) override;
51
+ void setRuleEqualAverage(double index, bool set) override;
52
+
53
+ std::string summary() override;
54
+
55
+ private:
56
+ OpenXLSX::XLConditionalFormat _format;
57
+
58
+ OpenXLSX::XLCfRule ruleAt(double index);
59
+ OpenXLSX::XLCfRules rules();
60
+ };
61
+
62
+ } // namespace margelo::nitro::xlsx
@@ -0,0 +1,46 @@
1
+ #include "HybridXlsxConditionalFormats.hpp"
2
+ #include "XlsxError.hpp"
3
+
4
+ namespace margelo::nitro::xlsx {
5
+
6
+ HybridXlsxConditionalFormats::HybridXlsxConditionalFormats(OpenXLSX::XLConditionalFormats formats)
7
+ : HybridObject("XlsxConditionalFormats"), HybridXlsxConditionalFormatsSpec(), _formats(std::move(formats)) {
8
+ }
9
+
10
+ HybridXlsxConditionalFormats::~HybridXlsxConditionalFormats() = default;
11
+
12
+ double HybridXlsxConditionalFormats::getCount() {
13
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
14
+ return static_cast<double>(_formats.count());
15
+ });
16
+ }
17
+
18
+ std::shared_ptr<HybridXlsxConditionalFormatSpec> HybridXlsxConditionalFormats::create(const std::string& sqref) {
19
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
20
+ size_t index = _formats.create();
21
+ OpenXLSX::XLConditionalFormat format = _formats.conditionalFormatByIndex(index);
22
+ format.setSqref(sqref);
23
+ auto hybrid = std::make_shared<HybridXlsxConditionalFormat>(format);
24
+ _created.push_back(hybrid);
25
+ return std::static_pointer_cast<HybridXlsxConditionalFormatSpec>(hybrid);
26
+ });
27
+ }
28
+
29
+ std::shared_ptr<HybridXlsxConditionalFormatSpec> HybridXlsxConditionalFormats::getByIndex(double index) {
30
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] {
31
+ size_t idx = static_cast<size_t>(index);
32
+ if (idx >= _formats.count()) {
33
+ throw XlsxError(xlsx_error::INDEX_OUT_OF_RANGE,
34
+ "conditionalFormat index " + std::to_string(idx) + " out of range (count=" + std::to_string(_formats.count()) + ")");
35
+ }
36
+ auto hybrid = std::make_shared<HybridXlsxConditionalFormat>(_formats.conditionalFormatByIndex(idx));
37
+ _created.push_back(hybrid);
38
+ return std::static_pointer_cast<HybridXlsxConditionalFormatSpec>(hybrid);
39
+ });
40
+ }
41
+
42
+ std::string HybridXlsxConditionalFormats::summary() {
43
+ return withXlsxError(xlsx_error::XLSX_ERROR, [&] { return _formats.summary(); });
44
+ }
45
+
46
+ } // namespace margelo::nitro::xlsx
@@ -0,0 +1,28 @@
1
+ #pragma once
2
+
3
+ #include "HybridXlsxConditionalFormatsSpec.hpp"
4
+ #include "HybridXlsxConditionalFormat.hpp"
5
+ #include <OpenXLSX/XLSheet.hpp>
6
+ #include <memory>
7
+ #include <string>
8
+ #include <vector>
9
+
10
+ namespace margelo::nitro::xlsx {
11
+
12
+ class HybridXlsxConditionalFormats : public HybridXlsxConditionalFormatsSpec {
13
+ public:
14
+ explicit HybridXlsxConditionalFormats(OpenXLSX::XLConditionalFormats formats);
15
+ ~HybridXlsxConditionalFormats() override;
16
+
17
+ double getCount() override;
18
+ std::shared_ptr<HybridXlsxConditionalFormatSpec> create(const std::string& sqref) override;
19
+ std::shared_ptr<HybridXlsxConditionalFormatSpec> getByIndex(double index) override;
20
+ std::string summary() override;
21
+
22
+ private:
23
+ OpenXLSX::XLConditionalFormats _formats;
24
+ // Keep hybrid wrappers alive so JS holds stay valid
25
+ std::vector<std::shared_ptr<HybridXlsxConditionalFormat>> _created;
26
+ };
27
+
28
+ } // namespace margelo::nitro::xlsx