react-native-nitro-xlsx 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NitroXlsx.podspec +26 -27
- package/Package.swift +31 -10
- package/README.md +21 -9
- package/android/CMakeLists.txt +20 -27
- package/cpp/HybridNitroXlsx.cpp +25 -1
- package/cpp/HybridXlsxCellFormat.cpp +46 -146
- package/cpp/HybridXlsxCellFormat.hpp +9 -41
- package/cpp/HybridXlsxConditionalFormat.cpp +4 -1
- package/cpp/HybridXlsxConditionalFormats.cpp +5 -1
- package/cpp/HybridXlsxWorkbook.cpp +38 -8
- package/cpp/HybridXlsxWorkbook.hpp +10 -1
- package/cpp/HybridXlsxWorksheet.cpp +422 -141
- package/cpp/HybridXlsxWorksheet.hpp +4 -1
- package/cpp/XlsxCacheDir.cpp +25 -2
- package/cpp/XlsxCacheDir.hpp +3 -1
- package/cpp/XlsxCellStyle.hpp +360 -0
- package/cpp/XlsxJson.cpp +29 -8
- package/package.json +2 -2
- package/scripts/run-cpp-tests.sh +1 -1
- package/scripts/sync-openxlsx-headers.sh +34 -0
- package/src/__mocks__/react-native-nitro-modules.ts +523 -20
- package/src/__tests__/index.test.ts +124 -16
- package/src/index.ts +13 -13
- package/thirdparty/OpenXLSX/.clang-format +118 -0
- package/thirdparty/OpenXLSX/.clang-tidy +28 -0
- package/thirdparty/OpenXLSX/.gitignore +130 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_before_XMLNode_wrappers +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_and_stripping +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_char_support +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_support +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespaced_name_disabled +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-08-11-benchmarks_post-XLCellIterator-Rework +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-08-14-benchmarks_post-default-row-column-style-support +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-09-02-benchmarks +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-12-19-benchmarks +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-12-30-benchmarks-post-XLSharedStrings-by-ref +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-09-benchmarks-post-conditionalFormatsAndSheetProtection +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-10-benchmarks-post-XLCellValue-bugfix +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-31-benchmarks-post-XLComments-implementation +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-02-02-benchmarks-post-XLRowIterator-Rework +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-07-20-benchmarks-after-hiding-pugixml-internals +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-08-29-benchmarks-after-code-review-with-libzip +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/Benchmark.cpp +249 -0
- package/thirdparty/OpenXLSX/Benchmarks/CMakeLists.txt +19 -0
- package/thirdparty/OpenXLSX/CMakeLists.txt +466 -0
- package/thirdparty/OpenXLSX/Documentation/CMakeLists.txt +31 -0
- package/thirdparty/OpenXLSX/Documentation/Doxyfile.in +2471 -0
- package/thirdparty/OpenXLSX/Documentation/DoxygenLayout.xml +194 -0
- package/thirdparty/OpenXLSX/Documentation/customdoxygen.css +1355 -0
- package/thirdparty/OpenXLSX/Examples/CMakeLists.txt +103 -0
- package/thirdparty/OpenXLSX/Examples/Demo1.cpp +279 -0
- package/thirdparty/OpenXLSX/Examples/Demo10.cpp +545 -0
- package/thirdparty/OpenXLSX/Examples/Demo1A.cpp +137 -0
- package/thirdparty/OpenXLSX/Examples/Demo2.cpp +65 -0
- package/thirdparty/OpenXLSX/Examples/Demo3.cpp +89 -0
- package/thirdparty/OpenXLSX/Examples/Demo4.cpp +86 -0
- package/thirdparty/OpenXLSX/Examples/Demo5.cpp +77 -0
- package/thirdparty/OpenXLSX/Examples/Demo6.cpp +103 -0
- package/thirdparty/OpenXLSX/Examples/Demo7.cpp +79 -0
- package/thirdparty/OpenXLSX/Examples/Demo8.cpp +117 -0
- package/thirdparty/OpenXLSX/Examples/Demo9.cpp +363 -0
- package/thirdparty/OpenXLSX/Examples/cmake/FindLIBZIP.cmake +61 -0
- package/thirdparty/OpenXLSX/Examples/external/CustomZip/CustomZip.hpp +256 -0
- package/thirdparty/OpenXLSX/LICENSE.md +29 -0
- package/thirdparty/OpenXLSX/Makefile.GNU +530 -0
- package/thirdparty/OpenXLSX/Notes/TBDs.txt +16 -0
- package/thirdparty/OpenXLSX/Notes/confirmed-TBCs.txt +8 -0
- package/thirdparty/OpenXLSX/Notes/styles-missing-support.xml +12 -0
- package/thirdparty/OpenXLSX/Notes/todo-list.txt +108 -0
- package/thirdparty/OpenXLSX/OpenXLSX/CMakeLists.txt +631 -0
- package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSX.hpp +63 -0
- package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSXConfig.cmake +11 -0
- package/thirdparty/OpenXLSX/OpenXLSX/cmake/bundle_static_library.cmake +198 -0
- package/thirdparty/OpenXLSX/OpenXLSX/cmake/patch_pkg_config.cmake +69 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/IZipArchive.hpp +361 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/IZipArchive.hpp +361 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/OpenXLSX-Exports.hpp +12 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCell.hpp +367 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellIterator.hpp +252 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellRange.hpp +223 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellReference.hpp +317 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCellValue.hpp +793 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLColor.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLColumn.hpp +159 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLCommandQuery.hpp +228 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLComments.hpp +270 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLConstants.hpp +18 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLContentTypes.hpp +264 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDateTime.hpp +175 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDocument.hpp +505 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLDrawing.hpp +452 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLException.hpp +161 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLFormula.hpp +375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLIterator.hpp +40 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLMergeCells.hpp +216 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLProperties.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRelationships.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRow.hpp +721 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLRowData.hpp +488 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLSharedStrings.hpp +204 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLSheet.hpp +1640 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLStyles.hpp +2390 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLTables.hpp +132 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLWorkbook.hpp +404 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlData.hpp +283 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlFile.hpp +194 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlParser.hpp +282 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLXmlParserForwardDeclarations.hpp +85 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/XLZipArchive.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/LibZip.hpp +447 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/OpenXLSXFileSystemTools.hpp +207 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX/detail/Zippy.hpp +1375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX-Exports.hpp +12 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCell.hpp +367 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellIterator.hpp +252 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellRange.hpp +223 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellReference.hpp +317 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellValue.hpp +793 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColor.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColumn.hpp +159 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCommandQuery.hpp +228 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLComments.hpp +270 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLConstants.hpp +18 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLContentTypes.hpp +264 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDateTime.hpp +175 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDocument.hpp +505 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDrawing.hpp +452 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLException.hpp +161 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLFormula.hpp +375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLIterator.hpp +40 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLMergeCells.hpp +216 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLProperties.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRelationships.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRow.hpp +721 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRowData.hpp +488 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSharedStrings.hpp +204 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSheet.hpp +1640 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLStyles.hpp +2390 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLTables.hpp +132 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLWorkbook.hpp +404 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlData.hpp +283 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlFile.hpp +194 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParser.hpp +282 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParserForwardDeclarations.hpp +85 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLZipArchive.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/LibZip.hpp +447 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/OpenXLSXFileSystemTools.hpp +207 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/Zippy.hpp +1375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCell.cpp +340 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellIterator.cpp +427 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellRange.cpp +221 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellReference.cpp +408 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellValue.cpp +519 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColor.cpp +202 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColumn.cpp +141 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLComments.cpp +637 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLContentTypes.cpp +329 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDateTime.cpp +269 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDocument.cpp +1678 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDrawing.cpp +784 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLFormula.cpp +201 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLMergeCells.cpp +357 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLProperties.cpp +810 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRelationships.cpp +529 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRow.cpp +918 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRowData.cpp +508 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSharedStrings.cpp +220 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSheet.cpp +1970 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLStyles.cpp +3014 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLTables.cpp +125 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLWorkbook.cpp +784 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlData.cpp +247 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlFile.cpp +160 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlParser.cpp +261 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLZipArchive.cpp +266 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/utilities/XLUtilities.hpp +478 -0
- package/thirdparty/OpenXLSX/README.md +1279 -0
- package/thirdparty/OpenXLSX/Scripts/cmake-cleanup.sh +102 -0
- package/thirdparty/OpenXLSX/Scripts/compile.sh +23 -0
- package/thirdparty/OpenXLSX/Scripts/demos-cleanup.sh +25 -0
- package/thirdparty/OpenXLSX/Scripts/demos-run-all.sh +60 -0
- package/thirdparty/OpenXLSX/Scripts/guarded-xml-format.sh +47 -0
- package/thirdparty/OpenXLSX/Scripts/make-gnu.sh +11 -0
- package/thirdparty/OpenXLSX/Scripts/uninstall-manifest.sh +48 -0
- package/thirdparty/OpenXLSX/Scripts/xml-format-all.sh +19 -0
- package/thirdparty/OpenXLSX/Scripts/xml-format.sh +38 -0
- package/thirdparty/OpenXLSX/Tests/CMakeLists.txt +37 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch.hpp +17799 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_automake.hpp +68 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_sonarqube.hpp +182 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_tap.hpp +278 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_teamcity.hpp +212 -0
- package/thirdparty/OpenXLSX/Tests/main.cpp +55 -0
- package/thirdparty/OpenXLSX/Tests/testXLCell.cpp +176 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellRange.cpp +180 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellReference.cpp +160 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellValue.cpp +366 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellValueProxy.cpp +255 -0
- package/thirdparty/OpenXLSX/Tests/testXLColor.cpp +75 -0
- package/thirdparty/OpenXLSX/Tests/testXLDateTime.cpp +229 -0
- package/thirdparty/OpenXLSX/Tests/testXLDocument.cpp +197 -0
- package/thirdparty/OpenXLSX/Tests/testXLFormula.cpp +131 -0
- package/thirdparty/OpenXLSX/Tests/testXLRow.cpp +597 -0
- package/thirdparty/OpenXLSX/Tests/testXLSheet.cpp +77 -0
- package/thirdparty/OpenXLSX/Tests/ziptest-with-libs.cpp +88 -0
- package/thirdparty/OpenXLSX/Tests/ziptest.cpp +735 -0
- package/thirdparty/OpenXLSX/cmake/get-git-HEAD-ID.cmake +45 -0
- package/thirdparty/OpenXLSX/cmake/libopenxlsxCPackOptions.cmake.in +20 -0
- package/thirdparty/OpenXLSX/cmake/manage_dependency.cmake +813 -0
- package/thirdparty/OpenXLSX/cmake/recursive_library_type_test.cmake +52 -0
- package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-shared.hpp +42 -0
- package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-static.hpp +42 -0
- package/thirdparty/OpenXLSX/vcpkg.json +24 -0
- package/thirdparty/README.md +46 -0
- package/thirdparty/miniz/.clang-format +47 -0
- package/thirdparty/miniz/.travis.yml +2 -0
- package/thirdparty/miniz/CMakeLists.txt +333 -0
- package/thirdparty/miniz/CMakePresets.json +31 -0
- package/thirdparty/miniz/ChangeLog.md +272 -0
- package/thirdparty/miniz/Config.cmake.in +1 -0
- package/thirdparty/miniz/LICENSE +22 -0
- package/thirdparty/miniz/amalgamate.sh +57 -0
- package/thirdparty/miniz/examples/example1.c +105 -0
- package/thirdparty/miniz/examples/example2.c +164 -0
- package/thirdparty/miniz/examples/example3.c +269 -0
- package/thirdparty/miniz/examples/example4.c +102 -0
- package/thirdparty/miniz/examples/example5.c +327 -0
- package/thirdparty/miniz/examples/example6.c +189 -0
- package/thirdparty/miniz/meson.build +21 -0
- package/thirdparty/miniz/miniz.c +646 -0
- package/thirdparty/miniz/miniz.h +615 -0
- package/thirdparty/miniz/miniz.pc.in +13 -0
- package/thirdparty/miniz/miniz_common.h +89 -0
- package/thirdparty/miniz/miniz_export.h +20 -0
- package/thirdparty/miniz/miniz_tdef.c +1602 -0
- package/thirdparty/miniz/miniz_tdef.h +199 -0
- package/thirdparty/miniz/miniz_tinfl.c +778 -0
- package/thirdparty/miniz/miniz_tinfl.h +150 -0
- package/thirdparty/miniz/miniz_zip.c +4895 -0
- package/thirdparty/miniz/miniz_zip.h +454 -0
- package/thirdparty/miniz/readme.md +46 -0
- package/thirdparty/miniz/test.sh +36 -0
- package/thirdparty/miniz/tests/add_in_place_fuzzer.c +87 -0
- package/thirdparty/miniz/tests/catch_amalgamated.cpp +10795 -0
- package/thirdparty/miniz/tests/catch_amalgamated.hpp +13143 -0
- package/thirdparty/miniz/tests/checksum_fuzzer.c +26 -0
- package/thirdparty/miniz/tests/compress_fuzzer.c +91 -0
- package/thirdparty/miniz/tests/flush_fuzzer.c +88 -0
- package/thirdparty/miniz/tests/fuzz_main.c +55 -0
- package/thirdparty/miniz/tests/large_fuzzer.c +133 -0
- package/thirdparty/miniz/tests/main.cpp +185 -0
- package/thirdparty/miniz/tests/miniz_tdefl_fuzzer.cc +115 -0
- package/thirdparty/miniz/tests/miniz_tester.cpp +1881 -0
- package/thirdparty/miniz/tests/miniz_zip_validate_fuzzer.cc +71 -0
- package/thirdparty/miniz/tests/miniz_zip_writer_fuzzer.cc +96 -0
- package/thirdparty/miniz/tests/ossfuzz.sh +48 -0
- package/thirdparty/miniz/tests/small_fuzzer.c +126 -0
- package/thirdparty/miniz/tests/timer.cpp +152 -0
- package/thirdparty/miniz/tests/timer.h +40 -0
- package/thirdparty/miniz/tests/uncompress2_fuzzer.c +21 -0
- package/thirdparty/miniz/tests/uncompress_fuzzer.c +30 -0
- package/thirdparty/miniz/tests/zip.dict +9 -0
- package/thirdparty/miniz/tests/zip_fuzzer.c +63 -0
- package/thirdparty/pugixml/.codecov.yml +7 -0
- package/thirdparty/pugixml/.gitattributes +1 -0
- package/thirdparty/pugixml/CMakeLists.txt +330 -0
- package/thirdparty/pugixml/LICENSE.md +24 -0
- package/thirdparty/pugixml/Makefile +98 -0
- package/thirdparty/pugixml/README.md +81 -0
- package/thirdparty/pugixml/SECURITY.md +9 -0
- package/thirdparty/pugixml/appveyor.yml +50 -0
- package/thirdparty/pugixml/docs/config.adoc +7 -0
- package/thirdparty/pugixml/docs/images/dom_tree.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_link1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_link2.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch2.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch3.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch4.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2010_link1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2010_link2.png +0 -0
- package/thirdparty/pugixml/docs/manual.adoc +3326 -0
- package/thirdparty/pugixml/docs/manual.html +6395 -0
- package/thirdparty/pugixml/docs/quickstart.adoc +287 -0
- package/thirdparty/pugixml/docs/quickstart.html +1107 -0
- package/thirdparty/pugixml/docs/samples/character.xml +8 -0
- package/thirdparty/pugixml/docs/samples/custom_memory_management.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/include.cpp +64 -0
- package/thirdparty/pugixml/docs/samples/load_error_handling.cpp +33 -0
- package/thirdparty/pugixml/docs/samples/load_file.cpp +16 -0
- package/thirdparty/pugixml/docs/samples/load_memory.cpp +66 -0
- package/thirdparty/pugixml/docs/samples/load_options.cpp +30 -0
- package/thirdparty/pugixml/docs/samples/load_stream.cpp +97 -0
- package/thirdparty/pugixml/docs/samples/modify_add.cpp +29 -0
- package/thirdparty/pugixml/docs/samples/modify_base.cpp +43 -0
- package/thirdparty/pugixml/docs/samples/modify_remove.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/save_custom_writer.cpp +116 -0
- package/thirdparty/pugixml/docs/samples/save_declaration.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/save_file.cpp +17 -0
- package/thirdparty/pugixml/docs/samples/save_options.cpp +48 -0
- package/thirdparty/pugixml/docs/samples/save_stream.cpp +18 -0
- package/thirdparty/pugixml/docs/samples/save_subtree.cpp +26 -0
- package/thirdparty/pugixml/docs/samples/text.cpp +35 -0
- package/thirdparty/pugixml/docs/samples/transitions.xml +7 -0
- package/thirdparty/pugixml/docs/samples/traverse_base.cpp +51 -0
- package/thirdparty/pugixml/docs/samples/traverse_iter.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/traverse_predicate.cpp +48 -0
- package/thirdparty/pugixml/docs/samples/traverse_rangefor.cpp +32 -0
- package/thirdparty/pugixml/docs/samples/traverse_walker.cpp +35 -0
- package/thirdparty/pugixml/docs/samples/tree.xml +12 -0
- package/thirdparty/pugixml/docs/samples/weekly-shift_jis.xml +78 -0
- package/thirdparty/pugixml/docs/samples/weekly-utf-16.xml +0 -0
- package/thirdparty/pugixml/docs/samples/weekly-utf-8.xml +78 -0
- package/thirdparty/pugixml/docs/samples/xgconsole.xml +12 -0
- package/thirdparty/pugixml/docs/samples/xpath_error.cpp +43 -0
- package/thirdparty/pugixml/docs/samples/xpath_query.cpp +36 -0
- package/thirdparty/pugixml/docs/samples/xpath_select.cpp +28 -0
- package/thirdparty/pugixml/docs/samples/xpath_variables.cpp +38 -0
- package/thirdparty/pugixml/readme.txt +50 -0
- package/thirdparty/pugixml/scripts/archive.py +54 -0
- package/thirdparty/pugixml/scripts/cocoapods_push.sh +4 -0
- package/thirdparty/pugixml/scripts/natvis/pugixml.natvis +77 -0
- package/thirdparty/pugixml/scripts/natvis/pugixml_compact.natvis +506 -0
- package/thirdparty/pugixml/scripts/nuget/build/native/pugixml-propertiesui.xml +17 -0
- package/thirdparty/pugixml/scripts/nuget/build/native/pugixml.targets +28 -0
- package/thirdparty/pugixml/scripts/nuget/pugixml.nuspec +20 -0
- package/thirdparty/pugixml/scripts/nuget_build.ps1 +60 -0
- package/thirdparty/pugixml/scripts/premake4.lua +92 -0
- package/thirdparty/pugixml/scripts/pugixml-config.cmake.in +12 -0
- package/thirdparty/pugixml/scripts/pugixml.pc.in +11 -0
- package/thirdparty/pugixml/scripts/pugixml.podspec +14 -0
- package/thirdparty/pugixml/scripts/pugixml.xcodeproj/project.pbxproj +212 -0
- package/thirdparty/pugixml/scripts/pugixml_airplay.mkf +13 -0
- package/thirdparty/pugixml/scripts/pugixml_codeblocks.cbp +44 -0
- package/thirdparty/pugixml/scripts/pugixml_codelite.project +56 -0
- package/thirdparty/pugixml/scripts/pugixml_dll.rc +45 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2005.vcproj +343 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2005_static.vcproj +343 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2008.vcproj +339 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2008_static.vcproj +339 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2010.vcxproj +191 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2010_static.vcxproj +191 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2013.vcxproj +199 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2013_static.vcxproj +199 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2015.vcxproj +172 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2015_static.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2017.vcxproj +172 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2017_static.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2019.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2019_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2022.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2022_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2026.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2026_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/sbom.cdx.json +47 -0
- package/thirdparty/pugixml/src/pugiconfig.hpp +81 -0
- package/thirdparty/pugixml/src/pugixml.cpp +13776 -0
- package/thirdparty/pugixml/src/pugixml.hpp +1604 -0
- package/thirdparty/pugixml/tests/allocator.cpp +175 -0
- package/thirdparty/pugixml/tests/allocator.hpp +10 -0
- package/thirdparty/pugixml/tests/autotest-appveyor.ps1 +93 -0
- package/thirdparty/pugixml/tests/cmake-appveyor.ps1 +57 -0
- package/thirdparty/pugixml/tests/data/empty.xml +0 -0
- package/thirdparty/pugixml/tests/data/large.xml +1 -0
- package/thirdparty/pugixml/tests/data/latintest_latin1.xml +1 -0
- package/thirdparty/pugixml/tests/data/latintest_utf8.xml +1 -0
- package/thirdparty/pugixml/tests/data/multiline.xml +3 -0
- package/thirdparty/pugixml/tests/data/small.xml +1 -0
- package/thirdparty/pugixml/tests/data/truncation.xml +19 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8.xml +87 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_bom.xml +87 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_clean.xml +84 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_nodecl.xml +86 -0
- package/thirdparty/pugixml/tests/data//321/202/320/265/321/201/321/202.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/basic.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/doctype.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/refs.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/types.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/utf16.xml +0 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/utf32.xml +0 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/basic.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/functions.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/math.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/path.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/predicate.xpath +1 -0
- package/thirdparty/pugixml/tests/fuzz_parse.cpp +14 -0
- package/thirdparty/pugixml/tests/fuzz_parse.dict +72 -0
- package/thirdparty/pugixml/tests/fuzz_setup.sh +11 -0
- package/thirdparty/pugixml/tests/fuzz_xpath.cpp +46 -0
- package/thirdparty/pugixml/tests/fuzz_xpath.dict +72 -0
- package/thirdparty/pugixml/tests/helpers.hpp +114 -0
- package/thirdparty/pugixml/tests/main.cpp +218 -0
- package/thirdparty/pugixml/tests/test.cpp +220 -0
- package/thirdparty/pugixml/tests/test.hpp +175 -0
- package/thirdparty/pugixml/tests/test_compact.cpp +150 -0
- package/thirdparty/pugixml/tests/test_deprecated.cpp +25 -0
- package/thirdparty/pugixml/tests/test_document.cpp +1910 -0
- package/thirdparty/pugixml/tests/test_dom_modify.cpp +2122 -0
- package/thirdparty/pugixml/tests/test_dom_text.cpp +601 -0
- package/thirdparty/pugixml/tests/test_dom_traverse.cpp +1481 -0
- package/thirdparty/pugixml/tests/test_header_guard.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iosfwd_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iosfwd_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iostream_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iostream_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_only_1.cpp +21 -0
- package/thirdparty/pugixml/tests/test_header_only_2.cpp +21 -0
- package/thirdparty/pugixml/tests/test_header_string_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_string_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_string_iostream.cpp +5 -0
- package/thirdparty/pugixml/tests/test_memory.cpp +303 -0
- package/thirdparty/pugixml/tests/test_parse.cpp +1463 -0
- package/thirdparty/pugixml/tests/test_parse_doctype.cpp +366 -0
- package/thirdparty/pugixml/tests/test_unicode.cpp +152 -0
- package/thirdparty/pugixml/tests/test_version.cpp +5 -0
- package/thirdparty/pugixml/tests/test_write.cpp +757 -0
- package/thirdparty/pugixml/tests/test_xpath.cpp +833 -0
- package/thirdparty/pugixml/tests/test_xpath_api.cpp +646 -0
- package/thirdparty/pugixml/tests/test_xpath_functions.cpp +844 -0
- package/thirdparty/pugixml/tests/test_xpath_operators.cpp +566 -0
- package/thirdparty/pugixml/tests/test_xpath_parse.cpp +428 -0
- package/thirdparty/pugixml/tests/test_xpath_paths.cpp +787 -0
- package/thirdparty/pugixml/tests/test_xpath_paths_abbrev_w3c.cpp +219 -0
- package/thirdparty/pugixml/tests/test_xpath_paths_w3c.cpp +312 -0
- package/thirdparty/pugixml/tests/test_xpath_variables.cpp +683 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_1.cpp +411 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_2.cpp +417 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_3.cpp +321 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_4.cpp +300 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_5.cpp +295 -0
- package/thirdparty/pugixml/tests/writer_string.cpp +79 -0
- package/thirdparty/pugixml/tests/writer_string.hpp +27 -0
- package/scripts/prepare-openxlsx.js +0 -126
|
@@ -0,0 +1,329 @@
|
|
|
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 <cstring>
|
|
48
|
+
|
|
49
|
+
// ===== OpenXLSX Includes ===== //
|
|
50
|
+
#include "XLContentTypes.hpp"
|
|
51
|
+
#include "XLDocument.hpp"
|
|
52
|
+
#include "XLException.hpp"
|
|
53
|
+
#include "XLXmlParser.hpp" // pugixml wrapper
|
|
54
|
+
|
|
55
|
+
using namespace OpenXLSX;
|
|
56
|
+
|
|
57
|
+
namespace { // anonymous namespace for local functions
|
|
58
|
+
|
|
59
|
+
const std::string applicationOpenXmlOfficeDocument = "application/vnd.openxmlformats-officedocument";
|
|
60
|
+
const std::string applicationOpenXmlPackage = "application/vnd.openxmlformats-package";
|
|
61
|
+
const std::string applicationMicrosoftExcel = "application/vnd.ms-excel";
|
|
62
|
+
const std::string applicationMicrosoftOffice = "application/vnd.ms-office";
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @details
|
|
66
|
+
* @note 2024-08-31: In line with a change to hardcoded XML relationship domains in XLRelationships.cpp, replaced the repeating
|
|
67
|
+
* hardcoded strings here with the above declared constants, preparing a potential need for a similar "dumb" fallback implementation
|
|
68
|
+
*/
|
|
69
|
+
XLContentType GetContentTypeFromString(const std::string& typeString)
|
|
70
|
+
{
|
|
71
|
+
XLContentType type { XLContentType::Unknown };
|
|
72
|
+
|
|
73
|
+
if (typeString == applicationMicrosoftExcel + ".sheet.macroEnabled.main+xml")
|
|
74
|
+
type = XLContentType::WorkbookMacroEnabled;
|
|
75
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.sheet.main+xml")
|
|
76
|
+
type = XLContentType::Workbook;
|
|
77
|
+
else if (typeString == applicationOpenXmlPackage + ".relationships+xml")
|
|
78
|
+
type = XLContentType::Relationships;
|
|
79
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.worksheet+xml")
|
|
80
|
+
type = XLContentType::Worksheet;
|
|
81
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.chartsheet+xml")
|
|
82
|
+
type = XLContentType::Chartsheet;
|
|
83
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.externalLink+xml")
|
|
84
|
+
type = XLContentType::ExternalLink;
|
|
85
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".theme+xml")
|
|
86
|
+
type = XLContentType::Theme;
|
|
87
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.styles+xml")
|
|
88
|
+
type = XLContentType::Styles;
|
|
89
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.sharedStrings+xml")
|
|
90
|
+
type = XLContentType::SharedStrings;
|
|
91
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".drawing+xml")
|
|
92
|
+
type = XLContentType::Drawing;
|
|
93
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".drawingml.chart+xml")
|
|
94
|
+
type = XLContentType::Chart;
|
|
95
|
+
else if (typeString == applicationMicrosoftOffice + ".chartstyle+xml")
|
|
96
|
+
type = XLContentType::ChartStyle;
|
|
97
|
+
else if (typeString == applicationMicrosoftOffice + ".chartcolorstyle+xml")
|
|
98
|
+
type = XLContentType::ChartColorStyle;
|
|
99
|
+
else if (typeString == applicationMicrosoftExcel + ".controlproperties+xml")
|
|
100
|
+
type = XLContentType::ControlProperties;
|
|
101
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.calcChain+xml")
|
|
102
|
+
type = XLContentType::CalculationChain;
|
|
103
|
+
else if (typeString == applicationMicrosoftOffice + ".vbaProject")
|
|
104
|
+
type = XLContentType::VBAProject;
|
|
105
|
+
else if (typeString == applicationOpenXmlPackage + ".core-properties+xml")
|
|
106
|
+
type = XLContentType::CoreProperties;
|
|
107
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".extended-properties+xml")
|
|
108
|
+
type = XLContentType::ExtendedProperties;
|
|
109
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".custom-properties+xml")
|
|
110
|
+
type = XLContentType::CustomProperties;
|
|
111
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.comments+xml")
|
|
112
|
+
type = XLContentType::Comments;
|
|
113
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".spreadsheetml.table+xml")
|
|
114
|
+
type = XLContentType::Table;
|
|
115
|
+
else if (typeString == applicationOpenXmlOfficeDocument + ".vmlDrawing")
|
|
116
|
+
type = XLContentType::VMLDrawing;
|
|
117
|
+
else
|
|
118
|
+
type = XLContentType::Unknown;
|
|
119
|
+
|
|
120
|
+
return type;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @details
|
|
125
|
+
*/
|
|
126
|
+
std::string GetStringFromType(XLContentType type)
|
|
127
|
+
{
|
|
128
|
+
std::string typeString;
|
|
129
|
+
|
|
130
|
+
if (type == XLContentType::WorkbookMacroEnabled)
|
|
131
|
+
typeString = applicationMicrosoftExcel + ".sheet.macroEnabled.main+xml";
|
|
132
|
+
else if (type == XLContentType::Workbook)
|
|
133
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.sheet.main+xml";
|
|
134
|
+
else if (type == XLContentType::Relationships)
|
|
135
|
+
typeString = applicationOpenXmlPackage + ".relationships+xml";
|
|
136
|
+
else if (type == XLContentType::Worksheet)
|
|
137
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.worksheet+xml";
|
|
138
|
+
else if (type == XLContentType::Chartsheet)
|
|
139
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.chartsheet+xml";
|
|
140
|
+
else if (type == XLContentType::ExternalLink)
|
|
141
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.externalLink+xml";
|
|
142
|
+
else if (type == XLContentType::Theme)
|
|
143
|
+
typeString = applicationOpenXmlOfficeDocument + ".theme+xml";
|
|
144
|
+
else if (type == XLContentType::Styles)
|
|
145
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.styles+xml";
|
|
146
|
+
else if (type == XLContentType::SharedStrings)
|
|
147
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.sharedStrings+xml";
|
|
148
|
+
else if (type == XLContentType::Drawing)
|
|
149
|
+
typeString = applicationOpenXmlOfficeDocument + ".drawing+xml";
|
|
150
|
+
else if (type == XLContentType::Chart)
|
|
151
|
+
typeString = applicationOpenXmlOfficeDocument + ".drawingml.chart+xml";
|
|
152
|
+
else if (type == XLContentType::ChartStyle)
|
|
153
|
+
typeString = applicationMicrosoftOffice + ".chartstyle+xml";
|
|
154
|
+
else if (type == XLContentType::ChartColorStyle)
|
|
155
|
+
typeString = applicationMicrosoftOffice + ".chartcolorstyle+xml";
|
|
156
|
+
else if (type == XLContentType::ControlProperties)
|
|
157
|
+
typeString = applicationMicrosoftExcel + ".controlproperties+xml";
|
|
158
|
+
else if (type == XLContentType::CalculationChain)
|
|
159
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.calcChain+xml";
|
|
160
|
+
else if (type == XLContentType::VBAProject)
|
|
161
|
+
typeString = applicationMicrosoftOffice + ".vbaProject";
|
|
162
|
+
else if (type == XLContentType::CoreProperties)
|
|
163
|
+
typeString = applicationOpenXmlPackage + ".core-properties+xml";
|
|
164
|
+
else if (type == XLContentType::ExtendedProperties)
|
|
165
|
+
typeString = applicationOpenXmlOfficeDocument + ".extended-properties+xml";
|
|
166
|
+
else if (type == XLContentType::CustomProperties)
|
|
167
|
+
typeString = applicationOpenXmlOfficeDocument + ".custom-properties+xml";
|
|
168
|
+
else if (type == XLContentType::Comments)
|
|
169
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.comments+xml";
|
|
170
|
+
else if (type == XLContentType::Table)
|
|
171
|
+
typeString = applicationOpenXmlOfficeDocument + ".spreadsheetml.table+xml";
|
|
172
|
+
else if (type == XLContentType::VMLDrawing)
|
|
173
|
+
typeString = applicationOpenXmlOfficeDocument + ".vmlDrawing";
|
|
174
|
+
else
|
|
175
|
+
throw XLInternalError("Unknown ContentType");
|
|
176
|
+
|
|
177
|
+
return typeString;
|
|
178
|
+
}
|
|
179
|
+
} // anonymous namespace
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @details
|
|
183
|
+
*/
|
|
184
|
+
XLContentItem::XLContentItem() : m_contentNode(std::make_unique<XMLNode>()) {}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* @details
|
|
188
|
+
*/
|
|
189
|
+
XLContentItem::XLContentItem(const XMLNode& node) : m_contentNode(std::make_unique<XMLNode>(node)) {}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @details
|
|
193
|
+
*/
|
|
194
|
+
XLContentItem::XLContentItem(const XLContentItem& other) : m_contentNode(std::make_unique<XMLNode>(*other.m_contentNode)) {}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* @details
|
|
198
|
+
*/
|
|
199
|
+
XLContentItem::XLContentItem(XLContentItem&& other) noexcept = default;
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* @details
|
|
203
|
+
*/
|
|
204
|
+
XLContentItem::~XLContentItem() = default;
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* @details
|
|
208
|
+
*/
|
|
209
|
+
XLContentItem& XLContentItem::operator=(const XLContentItem& other)
|
|
210
|
+
{
|
|
211
|
+
if (&other != this) *m_contentNode = *other.m_contentNode;
|
|
212
|
+
return *this;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
XLContentItem& XLContentItem::operator=(XLContentItem&& other) noexcept = default;
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* @details
|
|
219
|
+
*/
|
|
220
|
+
XLContentType XLContentItem::type() const { return GetContentTypeFromString(m_contentNode->attribute("ContentType").value()); }
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* @details
|
|
224
|
+
*/
|
|
225
|
+
std::string XLContentItem::path() const { return m_contentNode->attribute("PartName").value(); }
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* @details
|
|
229
|
+
*/
|
|
230
|
+
XLContentTypes::XLContentTypes() = default;
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* @details
|
|
234
|
+
*/
|
|
235
|
+
XLContentTypes::XLContentTypes(XLXmlData* xmlData) : XLXmlFile(xmlData) {}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* @details explicit default destructor
|
|
239
|
+
*/
|
|
240
|
+
XLContentTypes::~XLContentTypes() = default;
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* @details explicit default copy constructor - invokes base class copy constructor
|
|
244
|
+
*/
|
|
245
|
+
XLContentTypes::XLContentTypes(const XLContentTypes& other) = default;
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @details
|
|
249
|
+
*/
|
|
250
|
+
XLContentTypes::XLContentTypes(XLContentTypes&& other) noexcept = default;
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* @details explicit default copy assignment operator - invokes base class copy assignment
|
|
254
|
+
*/
|
|
255
|
+
XLContentTypes& XLContentTypes::operator=(const XLContentTypes& other) = default;
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* @details explicit default move assignment operator - invokes base class move assignment
|
|
259
|
+
*/
|
|
260
|
+
XLContentTypes& XLContentTypes::operator=(XLContentTypes&& other) noexcept = default;
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* @details
|
|
264
|
+
* @note 2024-07-22: added more intelligent whitespace support
|
|
265
|
+
*/
|
|
266
|
+
void XLContentTypes::addOverride(const std::string& path, XLContentType type)
|
|
267
|
+
{
|
|
268
|
+
const std::string typeString = GetStringFromType(type);
|
|
269
|
+
|
|
270
|
+
XMLNode lastOverride = xmlDocument().document_element().last_child_of_type(pugi::node_element); // see if there's a last element
|
|
271
|
+
XMLNode node{}; // scope declaration
|
|
272
|
+
|
|
273
|
+
// Create new node in the [Content_Types].xml file
|
|
274
|
+
if (lastOverride.empty())
|
|
275
|
+
node = xmlDocument().document_element().prepend_child("Override");
|
|
276
|
+
else { // if last element found
|
|
277
|
+
// ===== Insert node after previous override
|
|
278
|
+
node = xmlDocument().document_element().insert_child_after("Override", lastOverride);
|
|
279
|
+
|
|
280
|
+
// ===== Using whitespace nodes prior to lastOverride as a template, insert whitespaces between lastOverride and the new node
|
|
281
|
+
XMLNode copyWhitespaceFrom = lastOverride; // start looking for whitespace nodes before previous override
|
|
282
|
+
XMLNode insertBefore = node; // start inserting the same whitespace nodes before new override
|
|
283
|
+
while (copyWhitespaceFrom.previous_sibling().type() == pugi::node_pcdata) { // empty node returns pugi::node_null
|
|
284
|
+
// Advance to previous "template" whitespace node, ensured to exist in while-condition
|
|
285
|
+
copyWhitespaceFrom = copyWhitespaceFrom.previous_sibling();
|
|
286
|
+
// ===== Insert a whitespace node
|
|
287
|
+
insertBefore = xmlDocument().document_element().insert_child_before(pugi::node_pcdata, insertBefore);
|
|
288
|
+
insertBefore.set_value(copyWhitespaceFrom.value()); // copy the a whitespace in sequence node value
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
node.append_attribute("PartName").set_value(path.c_str());
|
|
292
|
+
node.append_attribute("ContentType").set_value(typeString.c_str());
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* @details
|
|
297
|
+
*/
|
|
298
|
+
void XLContentTypes::deleteOverride(const std::string& path)
|
|
299
|
+
{
|
|
300
|
+
xmlDocument().document_element().remove_child(xmlDocument().document_element().find_child_by_attribute("PartName", path.c_str()));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* @details
|
|
305
|
+
*/
|
|
306
|
+
void XLContentTypes::deleteOverride(const XLContentItem& item) { deleteOverride(item.path()); }
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* @details
|
|
310
|
+
*/
|
|
311
|
+
XLContentItem XLContentTypes::contentItem(const std::string& path)
|
|
312
|
+
{
|
|
313
|
+
return XLContentItem(xmlDocument().document_element().find_child_by_attribute("PartName", path.c_str()));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* @details
|
|
318
|
+
*/
|
|
319
|
+
std::vector<XLContentItem> XLContentTypes::getContentItems()
|
|
320
|
+
{
|
|
321
|
+
std::vector<XLContentItem> result;
|
|
322
|
+
XMLNode item = xmlDocument().document_element().first_child_of_type(pugi::node_element);
|
|
323
|
+
while (not item.empty()) {
|
|
324
|
+
if (strcmp(item.name(), "Override") == 0) result.emplace_back(item);
|
|
325
|
+
item = item.next_sibling_of_type(pugi::node_element);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return result;
|
|
329
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Created by Kenneth Balslev on 28/08/2021.
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
#include "XLDateTime.hpp"
|
|
6
|
+
#include "XLException.hpp"
|
|
7
|
+
|
|
8
|
+
#include <cmath>
|
|
9
|
+
#include <cstdint> // int32_t
|
|
10
|
+
|
|
11
|
+
namespace
|
|
12
|
+
{
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @brief
|
|
16
|
+
* @param year
|
|
17
|
+
* @return
|
|
18
|
+
*/
|
|
19
|
+
bool isLeapYear(int year)
|
|
20
|
+
{
|
|
21
|
+
if (year == 1900) return true; // historical Excel Date error inherited from older spreadsheet apps
|
|
22
|
+
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) return true;
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @brief
|
|
28
|
+
* @param month
|
|
29
|
+
* @param year
|
|
30
|
+
* @return
|
|
31
|
+
*/
|
|
32
|
+
int daysInMonth(int month, int year)
|
|
33
|
+
{
|
|
34
|
+
switch (month) {
|
|
35
|
+
case 1:
|
|
36
|
+
return 31;
|
|
37
|
+
case 2:
|
|
38
|
+
return (isLeapYear(year) ? 29 : 28);
|
|
39
|
+
case 3:
|
|
40
|
+
return 31;
|
|
41
|
+
case 4:
|
|
42
|
+
return 30;
|
|
43
|
+
case 5:
|
|
44
|
+
return 31;
|
|
45
|
+
case 6:
|
|
46
|
+
return 30;
|
|
47
|
+
case 7:
|
|
48
|
+
return 31;
|
|
49
|
+
case 8:
|
|
50
|
+
return 31;
|
|
51
|
+
case 9:
|
|
52
|
+
return 30;
|
|
53
|
+
case 10:
|
|
54
|
+
return 31;
|
|
55
|
+
case 11:
|
|
56
|
+
return 30;
|
|
57
|
+
case 12:
|
|
58
|
+
return 31;
|
|
59
|
+
default:
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @brief
|
|
66
|
+
* @param serial
|
|
67
|
+
* @return
|
|
68
|
+
*/
|
|
69
|
+
int dayOfWeek(double serial)
|
|
70
|
+
{
|
|
71
|
+
const auto day = static_cast<int32_t>(serial) % 7;
|
|
72
|
+
return (day == 0 ? 6 : day - 1);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
} // namespace
|
|
76
|
+
|
|
77
|
+
namespace OpenXLSX
|
|
78
|
+
{
|
|
79
|
+
/**
|
|
80
|
+
* @details Conctructor. Default implementation.
|
|
81
|
+
*/
|
|
82
|
+
XLDateTime::XLDateTime() = default;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @details Constructor taking an Excel date/time serial number as an argument.
|
|
86
|
+
*/
|
|
87
|
+
XLDateTime::XLDateTime(double serial) : m_serial(serial)
|
|
88
|
+
{
|
|
89
|
+
if (serial < 1.0) throw XLDateTimeError("Excel date/time serial number is invalid (must be >= 1.0.)"); // don't permit dates before 1900-01-01T00:00:00.000
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @details Constructor taking a std::tm object as an argument.
|
|
94
|
+
*/
|
|
95
|
+
XLDateTime::XLDateTime(const std::tm& timepoint)
|
|
96
|
+
{
|
|
97
|
+
// ===== Check validity of tm struct.
|
|
98
|
+
// ===== Only year, month and day of the month are checked. Other variables are ignored.
|
|
99
|
+
if (timepoint.tm_year < 0) throw XLDateTimeError("Invalid year. Must be >= 0.");
|
|
100
|
+
if (timepoint.tm_mon < 0 || timepoint.tm_mon > 11) throw XLDateTimeError("Invalid month. Must be >= 0 or <= 11.");
|
|
101
|
+
if (timepoint.tm_mday <= 0 || timepoint.tm_mday > daysInMonth(timepoint.tm_mon + 1, timepoint.tm_year + 1900))
|
|
102
|
+
throw XLDateTimeError("Invalid day. Must be >= 1 or <= total days in the month.");
|
|
103
|
+
|
|
104
|
+
// ===== Count the number of days for full years past 1900
|
|
105
|
+
for (int i = 0; i < timepoint.tm_year; ++i) {
|
|
106
|
+
m_serial += (isLeapYear(1900 + i) ? 366 : 365);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ===== Count the number of days for full months of the last year
|
|
110
|
+
for (int i = 0; i < timepoint.tm_mon; ++i) {
|
|
111
|
+
m_serial += daysInMonth(i + 1, timepoint.tm_year + 1900);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ===== Add the number of days of the month, minus one.
|
|
115
|
+
// ===== (The reason for the 'minus one' is that unlike the other fields in the struct,
|
|
116
|
+
// ===== tm_day represents the date of a month, whereas the other fields typically
|
|
117
|
+
// ===== represents the number of whole units since the start).
|
|
118
|
+
m_serial += timepoint.tm_mday - 1;
|
|
119
|
+
|
|
120
|
+
// ===== Convert hour, minute and second to fraction of a full day.
|
|
121
|
+
const int32_t seconds = timepoint.tm_hour * 3600 + timepoint.tm_min * 60 + timepoint.tm_sec;
|
|
122
|
+
m_serial += seconds / 86400.0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* @details Constructor taking a unixtime format (seconds since 1/1/1970) as an argument.
|
|
127
|
+
*/
|
|
128
|
+
XLDateTime::XLDateTime(time_t unixtime)
|
|
129
|
+
{
|
|
130
|
+
// There are 86400 seconds in a day
|
|
131
|
+
// There are 25569 days between 1/1/1970 and 30/12/1899 (the epoch used by Excel)
|
|
132
|
+
m_serial = ( static_cast<double>(unixtime) / 86400 ) + 25569;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @details Copy constructor. Default implementation.
|
|
137
|
+
*/
|
|
138
|
+
XLDateTime::XLDateTime(const XLDateTime& other) = default;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @details Move constructor. Default implementation.
|
|
142
|
+
*/
|
|
143
|
+
XLDateTime::XLDateTime(XLDateTime&& other) noexcept = default;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* @details Destructor. Default implementation.
|
|
147
|
+
*/
|
|
148
|
+
XLDateTime::~XLDateTime() = default;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @details Copy assignment operator. Default implementation.
|
|
152
|
+
*/
|
|
153
|
+
XLDateTime& XLDateTime::operator=(const XLDateTime& other) = default;
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @details Move assignment operator. Default implementation.
|
|
157
|
+
*/
|
|
158
|
+
XLDateTime& XLDateTime::operator=(XLDateTime&& other) noexcept = default;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* @details
|
|
162
|
+
*/
|
|
163
|
+
XLDateTime& XLDateTime::operator=(double serial)
|
|
164
|
+
{
|
|
165
|
+
XLDateTime temp(serial);
|
|
166
|
+
std::swap(*this, temp);
|
|
167
|
+
return *this;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @details
|
|
172
|
+
*/
|
|
173
|
+
XLDateTime& XLDateTime::operator=(const std::tm& timepoint)
|
|
174
|
+
{
|
|
175
|
+
XLDateTime temp(timepoint);
|
|
176
|
+
std::swap(*this, temp);
|
|
177
|
+
return *this;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* @details
|
|
182
|
+
*/
|
|
183
|
+
XLDateTime::operator std::tm() const { return tm(); }
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* @details Get the time point as an Excel date/time serial number.
|
|
187
|
+
*/
|
|
188
|
+
double XLDateTime::serial() const { return m_serial; }
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* @details Get the time point as a std::tm object.
|
|
192
|
+
*/
|
|
193
|
+
std::tm XLDateTime::tm() const
|
|
194
|
+
{
|
|
195
|
+
// ===== Create and initialize the resulting object.
|
|
196
|
+
std::tm result {};
|
|
197
|
+
result.tm_year = 0;
|
|
198
|
+
result.tm_mon = 0;
|
|
199
|
+
result.tm_mday = 0;
|
|
200
|
+
result.tm_wday = 0;
|
|
201
|
+
result.tm_yday = 0;
|
|
202
|
+
result.tm_hour = 0;
|
|
203
|
+
result.tm_min = 0;
|
|
204
|
+
result.tm_sec = 0;
|
|
205
|
+
result.tm_isdst = -1;
|
|
206
|
+
double serial = m_serial;
|
|
207
|
+
|
|
208
|
+
// ===== Count the number of whole years since 1900.
|
|
209
|
+
while (serial > 1) { // 2025-01-10: safeguard against infinite loop (preemptive)
|
|
210
|
+
const int days = (isLeapYear(result.tm_year + 1900) ? 366 : 365);
|
|
211
|
+
if (days + 1 > serial) break; // 2025-01-10: BUGFIX: break on days + 1 > serial (was days >= serial) to account for fractions
|
|
212
|
+
serial -= days;
|
|
213
|
+
++result.tm_year;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ===== Calculate the day of the year, and the day of the week
|
|
217
|
+
result.tm_yday = static_cast<int>(serial) - 1;
|
|
218
|
+
result.tm_wday = dayOfWeek(m_serial);
|
|
219
|
+
|
|
220
|
+
// ===== Count the number of whole months in the year.
|
|
221
|
+
while (result.tm_mon < 11) { // 2025-01-10 BUGFIX: break on December to prevent infinite loop after adjusted bugfix below
|
|
222
|
+
int days = daysInMonth(result.tm_mon + 1, 1900 + result.tm_year);
|
|
223
|
+
if (days + 1 > serial) break; // 2025-01-10: BUGFIX: break on days + 1 > serial (was days >= serial) to account for fractions
|
|
224
|
+
serial -= days;
|
|
225
|
+
++result.tm_mon;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// ===== Calculate the number of days.
|
|
229
|
+
result.tm_mday = static_cast<int>(serial);
|
|
230
|
+
serial -= result.tm_mday;
|
|
231
|
+
|
|
232
|
+
// ===== Calculate the number of hours.
|
|
233
|
+
result.tm_hour = static_cast<int>(serial * 24);
|
|
234
|
+
serial -= (result.tm_hour / 24.0);
|
|
235
|
+
|
|
236
|
+
// ===== Calculate the number of minutes.
|
|
237
|
+
result.tm_min = static_cast<int>(serial * 24 * 60);
|
|
238
|
+
serial -= (result.tm_min / (24.0 * 60.0));
|
|
239
|
+
|
|
240
|
+
// ===== Calculate the number of seconds.
|
|
241
|
+
result.tm_sec = static_cast<int>(lround(serial * 24 * 60 * 60));
|
|
242
|
+
|
|
243
|
+
// ===== BEGIN: pass rounded overflow back up the date components. BUGFIX 2025-01-10: added this overflow handling to address issue #138
|
|
244
|
+
if (result.tm_sec >= 60) {
|
|
245
|
+
result.tm_sec -= 60;
|
|
246
|
+
++result.tm_min;
|
|
247
|
+
if (result.tm_min >= 60) {
|
|
248
|
+
result.tm_min -= 60;
|
|
249
|
+
++result.tm_hour;
|
|
250
|
+
if (result.tm_hour >= 24) {
|
|
251
|
+
result.tm_hour -= 24;
|
|
252
|
+
++result.tm_mday;
|
|
253
|
+
int days = daysInMonth(result.tm_mon + 1, 1900 + result.tm_year);
|
|
254
|
+
if (result.tm_mday >= days) {
|
|
255
|
+
result.tm_mday -= days;
|
|
256
|
+
++result.tm_mon;
|
|
257
|
+
if (result.tm_mon >= 12) {
|
|
258
|
+
result.tm_mon -= 12;
|
|
259
|
+
++result.tm_year;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
} // END: pass rounded overflow back up the date components
|
|
265
|
+
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
} // namespace OpenXLSX
|