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,201 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Created by Kenneth Balslev on 27/08/2021.
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// ===== External Includes ===== //
|
|
6
|
+
#include <cassert>
|
|
7
|
+
|
|
8
|
+
// ===== OpenXLSX Includes ===== //
|
|
9
|
+
#include "XLFormula.hpp"
|
|
10
|
+
#include "XLException.hpp"
|
|
11
|
+
#include "XLXmlParser.hpp" // pugixml wrapper
|
|
12
|
+
|
|
13
|
+
using namespace OpenXLSX;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @details Constructor. Default implementation.
|
|
17
|
+
*/
|
|
18
|
+
XLFormula::XLFormula() = default;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @details Copy constructor. Default implementation.
|
|
22
|
+
*/
|
|
23
|
+
XLFormula::XLFormula(const XLFormula& other) = default;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @details Move constructor. Default implementation.
|
|
27
|
+
*/
|
|
28
|
+
XLFormula::XLFormula(XLFormula&& other) noexcept = default;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @details Destructor. Default implementation.
|
|
32
|
+
*/
|
|
33
|
+
XLFormula::~XLFormula() = default;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @details Copy assignment operator. Default implementation.
|
|
37
|
+
*/
|
|
38
|
+
XLFormula& XLFormula::operator=(const XLFormula& other) = default;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @details Move assignment operator. Default implementation.
|
|
42
|
+
*/
|
|
43
|
+
XLFormula& XLFormula::operator=(XLFormula&& other) noexcept = default;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @details Return the m_formulaString member variable.
|
|
47
|
+
*/
|
|
48
|
+
std::string XLFormula::get() const { return m_formulaString; }
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @details Set the m_formulaString member to an empty string.
|
|
52
|
+
*/
|
|
53
|
+
XLFormula& XLFormula::clear()
|
|
54
|
+
{
|
|
55
|
+
m_formulaString = "";
|
|
56
|
+
return *this;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @details
|
|
61
|
+
*/
|
|
62
|
+
XLFormula::operator std::string() const { return get(); }
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @details [private] Constructor. Set the m_cell and m_cellNode objects.
|
|
66
|
+
*/
|
|
67
|
+
XLFormulaProxy::XLFormulaProxy(XLCell* cell, XMLNode* cellNode)
|
|
68
|
+
: m_cell(cell),
|
|
69
|
+
m_cellNode(cellNode)
|
|
70
|
+
{
|
|
71
|
+
assert(cell); // NOLINT
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @details [private] Copy constructor
|
|
76
|
+
*/
|
|
77
|
+
XLFormulaProxy::XLFormulaProxy(const XLFormulaProxy& other)
|
|
78
|
+
: m_cell(other.m_cell),
|
|
79
|
+
m_cellNode(other.m_cellNode)
|
|
80
|
+
{}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @details [private] Move constructor. Default implementation.
|
|
84
|
+
*/
|
|
85
|
+
XLFormulaProxy::XLFormulaProxy(XLFormulaProxy&& other) noexcept = default;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @details Destructor. Default implementation.
|
|
89
|
+
*/
|
|
90
|
+
XLFormulaProxy::~XLFormulaProxy() = default;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @details Copy assignment operator. Calls the templated string assignment operator.
|
|
94
|
+
*/
|
|
95
|
+
XLFormulaProxy& XLFormulaProxy::operator=(const XLFormulaProxy& other)
|
|
96
|
+
{
|
|
97
|
+
if (&other != this) {
|
|
98
|
+
*this = other.getFormula();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return *this;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @details [private] Move assignment operator. Default implementation.
|
|
106
|
+
*/
|
|
107
|
+
XLFormulaProxy& XLFormulaProxy::operator=(XLFormulaProxy&& other) noexcept = default;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @details
|
|
111
|
+
*/
|
|
112
|
+
XLFormulaProxy::operator std::string() const { return get(); }
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @details Returns the underlying XLFormula object, by calling getFormula().
|
|
116
|
+
*/
|
|
117
|
+
XLFormulaProxy::operator XLFormula() const { return getFormula(); }
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @details Call the .get() function in the underlying XLFormula object.
|
|
121
|
+
*/
|
|
122
|
+
std::string XLFormulaProxy::get() const { return getFormula().get(); }
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @details If a formula node exists, it will be erased.
|
|
126
|
+
*/
|
|
127
|
+
XLFormulaProxy& XLFormulaProxy::clear()
|
|
128
|
+
{
|
|
129
|
+
// ===== Check that the m_cellNode is valid.
|
|
130
|
+
assert(m_cellNode != nullptr); // NOLINT
|
|
131
|
+
assert(not m_cellNode->empty()); // NOLINT
|
|
132
|
+
|
|
133
|
+
// ===== Remove the value node.
|
|
134
|
+
if (not m_cellNode->child("f").empty()) m_cellNode->remove_child("f");
|
|
135
|
+
return *this;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @details Convenience function for setting the formula. This method is called from the templated
|
|
140
|
+
* string assignment operator.
|
|
141
|
+
*/
|
|
142
|
+
void XLFormulaProxy::setFormulaString(const char* formulaString, bool resetValue) // NOLINT
|
|
143
|
+
{
|
|
144
|
+
// ===== Check that the m_cellNode is valid.
|
|
145
|
+
assert(m_cellNode != nullptr); // NOLINT
|
|
146
|
+
assert(not m_cellNode->empty()); // NOLINT
|
|
147
|
+
|
|
148
|
+
if (formulaString[0] == 0) { // if formulaString is empty
|
|
149
|
+
m_cellNode->remove_child("f"); // clear the formula node
|
|
150
|
+
return; // and exit
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ===== If the cell node doesn't have formula or value child nodes, create them.
|
|
154
|
+
if (m_cellNode->child("f").empty()) m_cellNode->append_child("f");
|
|
155
|
+
if (m_cellNode->child("v").empty()) m_cellNode->append_child("v");
|
|
156
|
+
|
|
157
|
+
// ===== Remove the formula type and shared index attributes, if they exist.
|
|
158
|
+
m_cellNode->child("f").remove_attribute("t");
|
|
159
|
+
m_cellNode->child("f").remove_attribute("si");
|
|
160
|
+
|
|
161
|
+
// ===== Set the text of the formula and value nodes.
|
|
162
|
+
m_cellNode->child("f").text().set(formulaString);
|
|
163
|
+
if (resetValue) m_cellNode->child("v").text().set(0);
|
|
164
|
+
|
|
165
|
+
// BEGIN pull request #189
|
|
166
|
+
// ===== Remove cell type attribute so that it can be determined by Office Suite when next calculating the formula.
|
|
167
|
+
m_cellNode->remove_attribute("t");
|
|
168
|
+
|
|
169
|
+
// ===== Remove inline string <is> tag, in case previous type was "inlineStr".
|
|
170
|
+
m_cellNode->remove_child("is");
|
|
171
|
+
|
|
172
|
+
// ===== Ensure that the formula node <f> is the first child, listed before the value <v> node.
|
|
173
|
+
m_cellNode->prepend_move(m_cellNode->child("f"));
|
|
174
|
+
// END pull request #189
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* @details Creates and returns an XLFormula object, based on the formula string in the underlying
|
|
179
|
+
* XML document.
|
|
180
|
+
*/
|
|
181
|
+
XLFormula XLFormulaProxy::getFormula() const
|
|
182
|
+
{
|
|
183
|
+
assert(m_cellNode != nullptr); // NOLINT
|
|
184
|
+
assert(not m_cellNode->empty()); // NOLINT
|
|
185
|
+
|
|
186
|
+
const auto formulaNode = m_cellNode->child("f");
|
|
187
|
+
|
|
188
|
+
// ===== If the formula node doesn't exist, return an empty XLFormula object.
|
|
189
|
+
if (formulaNode.empty()) return XLFormula();
|
|
190
|
+
|
|
191
|
+
// ===== If the formula type is 'shared' or 'array', throw an exception.
|
|
192
|
+
if (not formulaNode.attribute("t").empty() ) { // 2024-05-28: de-duplicated check (only relevant for performance,
|
|
193
|
+
// xml_attribute::value() returns an empty string for empty attributes)
|
|
194
|
+
if (std::string(formulaNode.attribute("t").value()) == "shared")
|
|
195
|
+
throw XLFormulaError("Shared formulas not supported.");
|
|
196
|
+
if (std::string(formulaNode.attribute("t").value()) == "array")
|
|
197
|
+
throw XLFormulaError("Array formulas not supported.");
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return XLFormula(formulaNode.text().get());
|
|
201
|
+
}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
____ ____ ___ ____ ____ ____ ___
|
|
4
|
+
6MMMMb `MM( )M' `MM' 6MMMMb\`MM( )M'
|
|
5
|
+
8P Y8 `MM. d' MM 6M' ` `MM. d'
|
|
6
|
+
6M Mb __ ____ ____ ___ __ `MM. d' MM MM `MM. d'
|
|
7
|
+
MM MM `M6MMMMb 6MMMMb `MM 6MMb `MM. d' MM YM. `MM. d'
|
|
8
|
+
MM MM MM' `Mb 6M' `Mb MMM9 `Mb `MMd MM YMMMMb `MMd
|
|
9
|
+
MM MM MM MM MM MM MM' MM dMM. MM `Mb dMM.
|
|
10
|
+
MM MM MM MM MMMMMMMM MM MM d'`MM. MM MM d'`MM.
|
|
11
|
+
YM M9 MM MM MM MM MM d' `MM. MM MM d' `MM.
|
|
12
|
+
8b d8 MM. ,M9 YM d9 MM MM d' `MM. MM / L ,M9 d' `MM.
|
|
13
|
+
YMMMM9 MMYMMM9 YMMMM9 _MM_ _MM_M(_ _)MM_ _MMMMMMM MYMMMM9 _M(_ _)MM_
|
|
14
|
+
MM
|
|
15
|
+
MM
|
|
16
|
+
_MM_
|
|
17
|
+
|
|
18
|
+
Copyright (c) 2018, Kenneth Troldal Balslev
|
|
19
|
+
|
|
20
|
+
All rights reserved.
|
|
21
|
+
|
|
22
|
+
Redistribution and use in source and binary forms, with or without
|
|
23
|
+
modification, are permitted provided that the following conditions are met:
|
|
24
|
+
- Redistributions of source code must retain the above copyright
|
|
25
|
+
notice, this list of conditions and the following disclaimer.
|
|
26
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
27
|
+
notice, this list of conditions and the following disclaimer in the
|
|
28
|
+
documentation and/or other materials provided with the distribution.
|
|
29
|
+
- Neither the name of the author nor the
|
|
30
|
+
names of any contributors may be used to endorse or promote products
|
|
31
|
+
derived from this software without specific prior written permission.
|
|
32
|
+
|
|
33
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
34
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
35
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
36
|
+
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
37
|
+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
38
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
39
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
40
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
41
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
42
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
43
|
+
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
// ===== External Includes ===== //
|
|
47
|
+
#include <algorithm>
|
|
48
|
+
#include <iostream>
|
|
49
|
+
|
|
50
|
+
// ===== OpenXLSX Includes ===== //
|
|
51
|
+
#include "XLMergeCells.hpp"
|
|
52
|
+
#include "XLCellReference.hpp"
|
|
53
|
+
#include "XLException.hpp"
|
|
54
|
+
#include "XLXmlParser.hpp" // pugixml wrapper
|
|
55
|
+
#include "utilities/XLUtilities.hpp" // appendAndGetNode
|
|
56
|
+
|
|
57
|
+
using namespace OpenXLSX;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @details Constructs an uninitialized XLMergeCells object
|
|
61
|
+
*/
|
|
62
|
+
XLMergeCells::XLMergeCells() = default;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @details Constructs a new XLMergeCells object. Invoked by XLWorksheet::mergeCells / ::unmergeCells
|
|
66
|
+
* @note Unfortunately, there is no easy way to persist the reference cache, this could be optimized - however, references access shouldn't
|
|
67
|
+
* be much of a performance issue
|
|
68
|
+
*/
|
|
69
|
+
XLMergeCells::XLMergeCells(const XMLNode& rootNode, std::vector< std::string_view > const & nodeOrder)
|
|
70
|
+
: m_rootNode(std::make_unique<XMLNode>(rootNode)),
|
|
71
|
+
m_nodeOrder(nodeOrder),
|
|
72
|
+
m_mergeCellsNode() // std::unique_ptr initializes to nullptr
|
|
73
|
+
{
|
|
74
|
+
if (m_rootNode->empty())
|
|
75
|
+
throw XLInternalError("XLMergeCells constructor: can not construct with an empty XML root node");
|
|
76
|
+
|
|
77
|
+
m_mergeCellsNode = std::make_unique<XMLNode>(m_rootNode->child("mergeCells"));
|
|
78
|
+
XMLNode mergeNode = m_mergeCellsNode->first_child_of_type(pugi::node_element);
|
|
79
|
+
while (not mergeNode.empty()) {
|
|
80
|
+
bool invalidNode = true;
|
|
81
|
+
|
|
82
|
+
// ===== For valid mergeCell nodes, add the reference to the reference cache
|
|
83
|
+
if (std::string(mergeNode.name()) == "mergeCell") {
|
|
84
|
+
std::string ref = mergeNode.attribute("ref").value();
|
|
85
|
+
if (ref.length() > 0) {
|
|
86
|
+
m_referenceCache.emplace_back(ref);
|
|
87
|
+
invalidNode = false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ===== Determine next element mergeNode
|
|
92
|
+
XMLNode nextNode = mergeNode.next_sibling_of_type(pugi::node_element);
|
|
93
|
+
|
|
94
|
+
// ===== In case of an invalid XML element: print an error and remove it from the XML, including whitespaces to the next sibling
|
|
95
|
+
if (invalidNode) { // if mergeNode is not named mergeCell or does not have a valid ref attribute: remove it from the XML
|
|
96
|
+
std::cerr << "XLMergeCells constructor: invalid child element, either name is not mergeCell or reference is invalid:" << std::endl;
|
|
97
|
+
mergeNode.print(std::cerr);
|
|
98
|
+
if (not nextNode.empty()) {
|
|
99
|
+
// delete whitespaces between mergeNode and nextNode
|
|
100
|
+
while (mergeNode.next_sibling() != nextNode) m_mergeCellsNode->remove_child(mergeNode.next_sibling());
|
|
101
|
+
}
|
|
102
|
+
m_mergeCellsNode->remove_child(mergeNode);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ===== Advance to next element mergeNode
|
|
106
|
+
mergeNode = nextNode;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (m_referenceCache.size() > 0) {
|
|
110
|
+
// ===== Ensure initial array count attribute / issue #351
|
|
111
|
+
XMLAttribute attr = m_mergeCellsNode->attribute("count");
|
|
112
|
+
if (attr.empty()) attr = m_mergeCellsNode->append_attribute("count");
|
|
113
|
+
attr.set_value(m_referenceCache.size());
|
|
114
|
+
}
|
|
115
|
+
else // no merges left
|
|
116
|
+
deleteAll(); // delete mergeCells element & re-initialize m_mergeCellsNode to a default-constructed XMLNode()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @details
|
|
121
|
+
*/
|
|
122
|
+
XLMergeCells::~XLMergeCells() = default;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @details Copy constructor
|
|
126
|
+
*/
|
|
127
|
+
XLMergeCells::XLMergeCells(const XLMergeCells& other)
|
|
128
|
+
{
|
|
129
|
+
m_rootNode = other.m_rootNode ? std::make_unique<XMLNode>( *other.m_rootNode ) : std::unique_ptr<XMLNode> {};
|
|
130
|
+
m_nodeOrder = other.m_nodeOrder;
|
|
131
|
+
m_mergeCellsNode = other.m_mergeCellsNode ? std::make_unique<XMLNode>( *other.m_mergeCellsNode ) : std::unique_ptr<XMLNode> {};
|
|
132
|
+
m_referenceCache = other.m_referenceCache;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @details Move constructor
|
|
137
|
+
*/
|
|
138
|
+
XLMergeCells::XLMergeCells(XLMergeCells&& other)
|
|
139
|
+
{
|
|
140
|
+
m_rootNode = std::move( other.m_rootNode );
|
|
141
|
+
m_nodeOrder = std::move( other.m_nodeOrder );
|
|
142
|
+
m_mergeCellsNode = std::move( other.m_mergeCellsNode );
|
|
143
|
+
m_referenceCache = std::move( other.m_referenceCache );
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* @details Copy assignment operator
|
|
148
|
+
*/
|
|
149
|
+
XLMergeCells& XLMergeCells::operator=(const XLMergeCells& other)
|
|
150
|
+
{
|
|
151
|
+
if (&other != this) {
|
|
152
|
+
XLMergeCells temp = other; // copy-construct
|
|
153
|
+
*this = std::move(temp); // move-assign & invalidate temp
|
|
154
|
+
}
|
|
155
|
+
return *this;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* @details Move assignment operator
|
|
160
|
+
*/
|
|
161
|
+
XLMergeCells& XLMergeCells::operator=(XLMergeCells&& other)
|
|
162
|
+
{
|
|
163
|
+
m_rootNode = std::move( other.m_rootNode );
|
|
164
|
+
m_nodeOrder = std::move( other.m_nodeOrder );
|
|
165
|
+
m_mergeCellsNode = std::move( other.m_mergeCellsNode );
|
|
166
|
+
m_referenceCache = std::move( other.m_referenceCache );
|
|
167
|
+
return *this;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* @details
|
|
172
|
+
*/
|
|
173
|
+
bool XLMergeCells::valid() const { return ( m_rootNode != nullptr && not m_rootNode->empty() ); }
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
namespace { // anonymous namespace: do not export any symbols from here
|
|
177
|
+
/**
|
|
178
|
+
* @brief Test if (range) reference overlaps with the cell window defined by topRow, firstCol, bottomRow, lastCol
|
|
179
|
+
* @return true in case of overlap, false if no overlap
|
|
180
|
+
*/
|
|
181
|
+
bool XLReferenceOverlaps(std::string reference, uint32_t topRow, uint16_t firstCol, uint32_t bottomRow, uint16_t lastCol)
|
|
182
|
+
{
|
|
183
|
+
using namespace std::literals::string_literals;
|
|
184
|
+
|
|
185
|
+
size_t pos = reference.find_first_of(':'); // find split mark between top left and bottom right cell
|
|
186
|
+
if (pos < 2 || pos + 2 >= reference.length()) // range reference must have at least 2 characters before and after the colon
|
|
187
|
+
throw XLInputError("XLMergeCells::"s + __func__ + ": not a valid range reference: \""s + reference + "\""s);
|
|
188
|
+
XLCellReference refTL(reference.substr(0, pos)); // get top left cell reference
|
|
189
|
+
XLCellReference refBR(reference.substr(pos + 1)); // get bottom right cell reference
|
|
190
|
+
|
|
191
|
+
uint32_t refTopRow = refTL.row();
|
|
192
|
+
uint16_t refFirstCol = refTL.column();
|
|
193
|
+
uint32_t refBottomRow = refBR.row();
|
|
194
|
+
uint16_t refLastCol = refBR.column();
|
|
195
|
+
if (refBottomRow < refTopRow || refLastCol < refFirstCol || (refBottomRow == refTopRow && refLastCol == refFirstCol))
|
|
196
|
+
throw XLInputError("XLMergeCells::"s + __func__ + ": not a valid range reference: \""s + reference + "\""s);
|
|
197
|
+
|
|
198
|
+
// std::cout << __func__ << ":" << " reference is " << reference
|
|
199
|
+
// << " refTopRow is " << refTopRow << " refBottomRow is " << refBottomRow << " refFirstCol is " << refFirstCol << " refLastCol is " << refLastCol
|
|
200
|
+
// << " topRow is " << topRow << " bottomRow is " << bottomRow << " firstCol is " << firstCol << " lastCol is " << lastCol
|
|
201
|
+
// << std::endl;
|
|
202
|
+
|
|
203
|
+
// overlap
|
|
204
|
+
if (refTopRow <= bottomRow && refBottomRow >= topRow // vertical overlap
|
|
205
|
+
&& refFirstCol <= lastCol && refLastCol >= firstCol) // horizontal overlap
|
|
206
|
+
return true;
|
|
207
|
+
return false; // otherwise: no overlap
|
|
208
|
+
}
|
|
209
|
+
} // anonymous namespace
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* @details Look up a merge index by the reference. If the reference does not exist, the returned index is XLMergeNotFound (-1).
|
|
213
|
+
*/
|
|
214
|
+
XLMergeIndex XLMergeCells::findMerge(const std::string& reference) const
|
|
215
|
+
{
|
|
216
|
+
const auto iter = std::find_if(m_referenceCache.begin(), m_referenceCache.end(), [&](const std::string& ref) { return reference == ref; });
|
|
217
|
+
|
|
218
|
+
return iter == m_referenceCache.end() ? XLMergeNotFound : static_cast<XLMergeIndex>(std::distance(m_referenceCache.begin(), iter));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* @details
|
|
223
|
+
*/
|
|
224
|
+
bool XLMergeCells::mergeExists(const std::string& reference) const { return findMerge(reference) >= 0; }
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* @details Find the index of the merge of which cellRef is a part. If no such merge exists, the returned index is XLMergeNotFound (-1).
|
|
228
|
+
*/
|
|
229
|
+
XLMergeIndex XLMergeCells::findMergeByCell(const std::string& cellRef) const { return findMergeByCell(XLCellReference(cellRef)); }
|
|
230
|
+
XLMergeIndex XLMergeCells::findMergeByCell(XLCellReference cellRef) const
|
|
231
|
+
{
|
|
232
|
+
const auto iter = std::find_if(m_referenceCache.begin(), m_referenceCache.end(),
|
|
233
|
+
/**/ [&](const std::string& ref) { // use XLReferenceOverlaps with a "range" that only contains cellRef
|
|
234
|
+
/**/ return XLReferenceOverlaps( ref, cellRef.row(), cellRef.column(), cellRef.row(), cellRef.column());
|
|
235
|
+
/**/ });
|
|
236
|
+
|
|
237
|
+
return iter == m_referenceCache.end() ? XLMergeNotFound : static_cast<XLMergeIndex>(std::distance(m_referenceCache.begin(), iter));
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* @details
|
|
242
|
+
*/
|
|
243
|
+
size_t XLMergeCells::count() const { return m_referenceCache.size(); }
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* @details
|
|
247
|
+
*/
|
|
248
|
+
const char* XLMergeCells::merge(XLMergeIndex index) const
|
|
249
|
+
{
|
|
250
|
+
if (index < 0 || static_cast<uint32_t>(index) >= m_referenceCache.size()) {
|
|
251
|
+
using namespace std::literals::string_literals;
|
|
252
|
+
throw XLInputError("XLMergeCells::"s + __func__ + ": index "s + std::to_string(index) + " is out of range"s);
|
|
253
|
+
}
|
|
254
|
+
return m_referenceCache[index].c_str();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* @details Append a mergeCell by creating a new node in the XML file and adding the string to it. The index to the
|
|
259
|
+
* appended merge is returned
|
|
260
|
+
* Before appending a mergeCell entry with reference, check that reference does not overlap with any existing references
|
|
261
|
+
*/
|
|
262
|
+
XLMergeIndex XLMergeCells::appendMerge(const std::string& reference)
|
|
263
|
+
{
|
|
264
|
+
using namespace std::literals::string_literals;
|
|
265
|
+
|
|
266
|
+
size_t referenceCacheSize = m_referenceCache.size();
|
|
267
|
+
if (referenceCacheSize >= XLMaxMergeCells)
|
|
268
|
+
throw XLInputError("XLMergeCells::"s + __func__ + ": exceeded max merge cells count "s + std::to_string(XLMaxMergeCells));
|
|
269
|
+
|
|
270
|
+
size_t pos = reference.find_first_of(':'); // find split mark between top left and bottom right cell
|
|
271
|
+
if (pos < 2 || pos + 2 >= reference.length()) // range reference must have at least 2 characters before and after the colon
|
|
272
|
+
throw XLInputError("XLMergeCells::"s + __func__ + ": not a valid range reference: \""s + reference + "\""s);
|
|
273
|
+
XLCellReference refTL(reference.substr(0, pos)); // get top left cell reference
|
|
274
|
+
XLCellReference refBR(reference.substr(pos + 1)); // get bottom right cell reference
|
|
275
|
+
|
|
276
|
+
uint32_t refTopRow = refTL.row();
|
|
277
|
+
uint16_t refFirstCol = refTL.column();
|
|
278
|
+
uint32_t refBottomRow = refBR.row();
|
|
279
|
+
uint16_t refLastCol = refBR.column();
|
|
280
|
+
if (refBottomRow < refTopRow || refLastCol < refFirstCol || (refBottomRow == refTopRow && refLastCol == refFirstCol))
|
|
281
|
+
throw XLInputError("XLMergeCells::"s + __func__ + ": not a valid range reference: \""s + reference + "\""s);
|
|
282
|
+
|
|
283
|
+
for (std::string ref : m_referenceCache) {
|
|
284
|
+
if (XLReferenceOverlaps(ref, refTopRow, refFirstCol, refBottomRow, refLastCol))
|
|
285
|
+
throw XLInputError("XLMergeCells::"s + __func__ + ": reference \""s + reference
|
|
286
|
+
/**/ + "\" overlaps with existing reference \""s + ref + "\""s);
|
|
287
|
+
}
|
|
288
|
+
// if execution gets here: no overlaps
|
|
289
|
+
|
|
290
|
+
if (m_mergeCellsNode->empty()) // create mergeCells element if needed
|
|
291
|
+
m_mergeCellsNode = std::make_unique<XMLNode>(appendAndGetNode(*m_rootNode, "mergeCells", m_nodeOrder));
|
|
292
|
+
|
|
293
|
+
// append new mergeCell element and set attribute ref
|
|
294
|
+
XMLNode insertAfter = m_mergeCellsNode->last_child_of_type(pugi::node_element);
|
|
295
|
+
XMLNode newMerge{};
|
|
296
|
+
if (insertAfter.empty()) newMerge = m_mergeCellsNode->prepend_child("mergeCell");
|
|
297
|
+
else newMerge = m_mergeCellsNode->insert_child_after("mergeCell", insertAfter);
|
|
298
|
+
if (newMerge.empty())
|
|
299
|
+
throw XLInternalError("XLMergeCells::"s + __func__ + ": failed to insert reference: \""s + reference + "\""s);
|
|
300
|
+
newMerge.append_attribute("ref").set_value(reference.c_str());
|
|
301
|
+
|
|
302
|
+
m_referenceCache.emplace_back(newMerge.attribute("ref").value()); // index of this element = previous referenceCacheSize
|
|
303
|
+
|
|
304
|
+
// ===== Update the array count attribute
|
|
305
|
+
XMLAttribute attr = m_mergeCellsNode->attribute("count");
|
|
306
|
+
if (attr.empty()) attr = m_mergeCellsNode->append_attribute("count");
|
|
307
|
+
attr.set_value(m_referenceCache.size());
|
|
308
|
+
|
|
309
|
+
return static_cast<XLMergeIndex>(referenceCacheSize);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* @details Delete the merge at the given index
|
|
314
|
+
*/
|
|
315
|
+
void XLMergeCells::deleteMerge(XLMergeIndex index)
|
|
316
|
+
{
|
|
317
|
+
using namespace std::literals::string_literals;
|
|
318
|
+
|
|
319
|
+
if (index < 0 || static_cast<uint32_t>(index) >= m_referenceCache.size())
|
|
320
|
+
throw XLInputError("XLMergeCells::"s + __func__ + ": index "s + std::to_string(index) + " is out of range"s);
|
|
321
|
+
|
|
322
|
+
XLMergeIndex curIndex = 0;
|
|
323
|
+
XMLNode node = m_mergeCellsNode->first_child_of_type(pugi::node_element);
|
|
324
|
+
while(curIndex < index && not node.empty()) {
|
|
325
|
+
node = node.next_sibling_of_type(pugi::node_element);
|
|
326
|
+
++curIndex;
|
|
327
|
+
}
|
|
328
|
+
if (node.empty())
|
|
329
|
+
throw XLInternalError("XLMergeCells::"s + __func__ + ": mismatch between size of mergeCells XML node and internal reference cache"s);
|
|
330
|
+
|
|
331
|
+
// ===== node was found: delete preceeding whitespace nodes and the node itself
|
|
332
|
+
while (node.previous_sibling().type() == pugi::node_pcdata) m_mergeCellsNode->remove_child(node.previous_sibling());
|
|
333
|
+
m_mergeCellsNode->remove_child(node);
|
|
334
|
+
|
|
335
|
+
m_referenceCache.erase(m_referenceCache.begin() + curIndex);
|
|
336
|
+
|
|
337
|
+
if (m_referenceCache.size() > 0) {
|
|
338
|
+
// ===== Update the array count attribute
|
|
339
|
+
XMLAttribute attr = m_mergeCellsNode->attribute("count");
|
|
340
|
+
if (attr.empty()) attr = m_mergeCellsNode->append_attribute("count");
|
|
341
|
+
attr.set_value(m_referenceCache.size()); // update the array count attribute
|
|
342
|
+
}
|
|
343
|
+
else // no merges left
|
|
344
|
+
deleteAll(); // delete mergeCells element & re-initialize m_mergeCellsNode to a default-constructed XMLNode()
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
void XLMergeCells::deleteAll()
|
|
348
|
+
{
|
|
349
|
+
m_referenceCache.clear();
|
|
350
|
+
m_rootNode->remove_child(*m_mergeCellsNode);
|
|
351
|
+
m_mergeCellsNode = std::make_unique<XMLNode>(XMLNode());
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* @details Print the underlying XML using pugixml::xml_node::print
|
|
356
|
+
*/
|
|
357
|
+
void XLMergeCells::print(std::basic_ostream<char>& ostr) const { m_mergeCellsNode->print(ostr); }
|