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,529 @@
|
|
|
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 <cstdint> // uint32_t
|
|
48
|
+
#include <cstring> // strlen
|
|
49
|
+
#include <memory> // std::make_unique
|
|
50
|
+
#include <random> // std::mt19937, std::random_device
|
|
51
|
+
#include <stdexcept> // std::invalid_argument
|
|
52
|
+
#include <string> // std::stoi, std::literals::string_literals
|
|
53
|
+
#include <vector> // std::vector
|
|
54
|
+
|
|
55
|
+
// ===== OpenXLSX Includes ===== //
|
|
56
|
+
#include "XLDocument.hpp"
|
|
57
|
+
#include "XLRelationships.hpp"
|
|
58
|
+
#include "XLXmlParser.hpp" // pugixml wrapper
|
|
59
|
+
|
|
60
|
+
#include "XLException.hpp"
|
|
61
|
+
|
|
62
|
+
using namespace OpenXLSX;
|
|
63
|
+
|
|
64
|
+
namespace { // anonymous namespace: do not export these symbols
|
|
65
|
+
bool RandomIDs{false}; // default: use sequential IDs
|
|
66
|
+
bool RandomizerInitialized{false}; // will be initialized by GetNewRelsID, if XLRand32 / XLRand64 are used elsewhere, user should invoke XLInitRandom
|
|
67
|
+
} // anonymous namespace
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
namespace OpenXLSX { // anonymous namespace: do not export these symbols
|
|
71
|
+
/**
|
|
72
|
+
* @details Set the module-local status variable RandomIDs to true
|
|
73
|
+
*/
|
|
74
|
+
void UseRandomIDs() { RandomIDs = true; }
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @details Set the module-local status variable RandomIDs to false
|
|
78
|
+
*/
|
|
79
|
+
void UseSequentialIDs() { RandomIDs = false; }
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @details Use the std::mt19937 default return on operator()
|
|
83
|
+
*/
|
|
84
|
+
std::mt19937 Rand32(0);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @details Combine values from two subsequent invocations of Rand32()
|
|
88
|
+
*/
|
|
89
|
+
uint64_t Rand64() { return (static_cast<uint64_t>(Rand32()) << 32) + Rand32(); } // 2024-08-18 BUGFIX: left-shift does *not* do integer promotion to long on the left operand
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @details Initialize the module's random functions
|
|
93
|
+
*/
|
|
94
|
+
void InitRandom(bool pseudoRandom)
|
|
95
|
+
{
|
|
96
|
+
uint64_t rdSeed;
|
|
97
|
+
if (pseudoRandom) rdSeed = 3744821255L; // in pseudo-random mode, always use the same seed
|
|
98
|
+
else {
|
|
99
|
+
std::random_device rd;
|
|
100
|
+
rdSeed = rd();
|
|
101
|
+
}
|
|
102
|
+
Rand32.seed(rdSeed);
|
|
103
|
+
RandomizerInitialized = true;
|
|
104
|
+
}
|
|
105
|
+
} // namespace OpenXLSX
|
|
106
|
+
|
|
107
|
+
namespace
|
|
108
|
+
{
|
|
109
|
+
const std::string relationshipDomainOpenXml2006 = "http://schemas.openxmlformats.org/officeDocument/2006";
|
|
110
|
+
const std::string relationshipDomainOpenXml2006CoreProps = "http://schemas.openxmlformats.org/package/2006";
|
|
111
|
+
const std::string relationshipDomainMicrosoft2006 = "http://schemas.microsoft.com/office/2006";
|
|
112
|
+
const std::string relationshipDomainMicrosoft2011 = "http://schemas.microsoft.com/office/2011";
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @note 2024-08-31: Included a "dumb" fallback solution in relationship tests to support
|
|
116
|
+
* previously unknown relationship domains, e.g. type="http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"
|
|
117
|
+
*/
|
|
118
|
+
XLRelationshipType GetRelationshipTypeFromString(const std::string& typeString)
|
|
119
|
+
{
|
|
120
|
+
// TODO 2024-08-09: support dumb applications that implemented relationship Type in different case (e.g. vmldrawing instead of vmlDrawing)
|
|
121
|
+
// easy approach: convert typestring and comparison string to all lower characters
|
|
122
|
+
size_t comparePos = 0; // start by comparing full relationship type strings
|
|
123
|
+
do {
|
|
124
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/extended-properties")
|
|
125
|
+
return XLRelationshipType::ExtendedProperties;
|
|
126
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/custom-properties")
|
|
127
|
+
return XLRelationshipType::CustomProperties;
|
|
128
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/officeDocument")
|
|
129
|
+
return XLRelationshipType::Workbook;
|
|
130
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/worksheet")
|
|
131
|
+
return XLRelationshipType::Worksheet;
|
|
132
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/styles")
|
|
133
|
+
return XLRelationshipType::Styles;
|
|
134
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/sharedStrings")
|
|
135
|
+
return XLRelationshipType::SharedStrings;
|
|
136
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/calcChain")
|
|
137
|
+
return XLRelationshipType::CalculationChain;
|
|
138
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/externalLink")
|
|
139
|
+
return XLRelationshipType::ExternalLink;
|
|
140
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/theme")
|
|
141
|
+
return XLRelationshipType::Theme;
|
|
142
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/chartsheet")
|
|
143
|
+
return XLRelationshipType::Chartsheet;
|
|
144
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/drawing")
|
|
145
|
+
return XLRelationshipType::Drawing;
|
|
146
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/image")
|
|
147
|
+
return XLRelationshipType::Image;
|
|
148
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/chart")
|
|
149
|
+
return XLRelationshipType::Chart;
|
|
150
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/externalLinkPath")
|
|
151
|
+
return XLRelationshipType::ExternalLinkPath;
|
|
152
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/printerSettings")
|
|
153
|
+
return XLRelationshipType::PrinterSettings;
|
|
154
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/vmlDrawing")
|
|
155
|
+
return XLRelationshipType::VMLDrawing;
|
|
156
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/ctrlProp")
|
|
157
|
+
return XLRelationshipType::ControlProperties;
|
|
158
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006CoreProps) + "/relationships/metadata/core-properties")
|
|
159
|
+
return XLRelationshipType::CoreProperties;
|
|
160
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainMicrosoft2006) + "/relationships/vbaProject")
|
|
161
|
+
return XLRelationshipType::VBAProject;
|
|
162
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainMicrosoft2011) + "/relationships/chartStyle")
|
|
163
|
+
return XLRelationshipType::ChartStyle;
|
|
164
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainMicrosoft2011) + "/relationships/chartColorStyle")
|
|
165
|
+
return XLRelationshipType::ChartColorStyle;
|
|
166
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/comments")
|
|
167
|
+
return XLRelationshipType::Comments;
|
|
168
|
+
if (typeString.substr(comparePos) == (comparePos ? "" : relationshipDomainOpenXml2006) + "/relationships/table")
|
|
169
|
+
return XLRelationshipType::Table;
|
|
170
|
+
|
|
171
|
+
// ===== relationship could not be identified
|
|
172
|
+
if (comparePos == 0 ) // If fallback solution has not yet been tried
|
|
173
|
+
comparePos = typeString.find("/relationships/"); // attempt to find the relationships section of the type string, regardless of domain
|
|
174
|
+
else // If fallback solution was tried & unsuccessful
|
|
175
|
+
comparePos = 0; // trigger loop exit
|
|
176
|
+
|
|
177
|
+
} while(comparePos > 0 && comparePos != std::string::npos);
|
|
178
|
+
// ===== loop exits if comparePos is not within typeString (= fallback solution failed or not possible)
|
|
179
|
+
|
|
180
|
+
return XLRelationshipType::Unknown; // default: relationship could not be identified
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
} // namespace
|
|
184
|
+
|
|
185
|
+
namespace OpenXLSX_XLRelationships { // make GetStringFromType accessible throughout the project (for use by XLAppProperties)
|
|
186
|
+
using namespace OpenXLSX;
|
|
187
|
+
std::string GetStringFromType(XLRelationshipType type)
|
|
188
|
+
{
|
|
189
|
+
switch (type) {
|
|
190
|
+
case XLRelationshipType::ExtendedProperties: return relationshipDomainOpenXml2006 + "/relationships/extended-properties";
|
|
191
|
+
case XLRelationshipType::CustomProperties: return relationshipDomainOpenXml2006 + "/relationships/custom-properties";
|
|
192
|
+
case XLRelationshipType::Workbook: return relationshipDomainOpenXml2006 + "/relationships/officeDocument";
|
|
193
|
+
case XLRelationshipType::Worksheet: return relationshipDomainOpenXml2006 + "/relationships/worksheet";
|
|
194
|
+
case XLRelationshipType::Styles: return relationshipDomainOpenXml2006 + "/relationships/styles";
|
|
195
|
+
case XLRelationshipType::SharedStrings: return relationshipDomainOpenXml2006 + "/relationships/sharedStrings";
|
|
196
|
+
case XLRelationshipType::CalculationChain: return relationshipDomainOpenXml2006 + "/relationships/calcChain";
|
|
197
|
+
case XLRelationshipType::ExternalLink: return relationshipDomainOpenXml2006 + "/relationships/externalLink";
|
|
198
|
+
case XLRelationshipType::Theme: return relationshipDomainOpenXml2006 + "/relationships/theme";
|
|
199
|
+
case XLRelationshipType::Chartsheet: return relationshipDomainOpenXml2006 + "/relationships/chartsheet";
|
|
200
|
+
case XLRelationshipType::Drawing: return relationshipDomainOpenXml2006 + "/relationships/drawing";
|
|
201
|
+
case XLRelationshipType::Image: return relationshipDomainOpenXml2006 + "/relationships/image";
|
|
202
|
+
case XLRelationshipType::Chart: return relationshipDomainOpenXml2006 + "/relationships/chart";
|
|
203
|
+
case XLRelationshipType::ExternalLinkPath: return relationshipDomainOpenXml2006 + "/relationships/externalLinkPath";
|
|
204
|
+
case XLRelationshipType::PrinterSettings: return relationshipDomainOpenXml2006 + "/relationships/printerSettings";
|
|
205
|
+
case XLRelationshipType::VMLDrawing: return relationshipDomainOpenXml2006 + "/relationships/vmlDrawing";
|
|
206
|
+
case XLRelationshipType::ControlProperties: return relationshipDomainOpenXml2006 + "/relationships/ctrlProp";
|
|
207
|
+
case XLRelationshipType::CoreProperties: return relationshipDomainOpenXml2006CoreProps + "/relationships/metadata/core-properties";
|
|
208
|
+
case XLRelationshipType::VBAProject: return relationshipDomainMicrosoft2006 + "/relationships/vbaProject";
|
|
209
|
+
case XLRelationshipType::ChartStyle: return relationshipDomainMicrosoft2011 + "/relationships/chartStyle";
|
|
210
|
+
case XLRelationshipType::ChartColorStyle: return relationshipDomainMicrosoft2011 + "/relationships/chartColorStyle";
|
|
211
|
+
case XLRelationshipType::Comments: return relationshipDomainOpenXml2006 + "/relationships/comments";
|
|
212
|
+
case XLRelationshipType::Table: return relationshipDomainOpenXml2006 + "/relationships/table";
|
|
213
|
+
default:
|
|
214
|
+
throw XLInternalError("RelationshipType not recognized!");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
} // namespace OpenXLSX_XLRelationships
|
|
218
|
+
|
|
219
|
+
namespace { // re-open anonymous namespace
|
|
220
|
+
/**
|
|
221
|
+
* @brief Get a new, unique relationship ID
|
|
222
|
+
* @param relationshipsNode the XML node that contains the document relationships
|
|
223
|
+
* @return A 64 bit integer with a relationship ID
|
|
224
|
+
*/
|
|
225
|
+
uint64_t GetNewRelsID(XMLNode relationshipsNode)
|
|
226
|
+
{
|
|
227
|
+
if (RandomIDs) {
|
|
228
|
+
if (!RandomizerInitialized) InitRandom();
|
|
229
|
+
return Rand64();
|
|
230
|
+
}
|
|
231
|
+
using namespace std::literals::string_literals;
|
|
232
|
+
// ===== workaround for pugi::xml_node currently not having an iterator for node_element only
|
|
233
|
+
XMLNode relationship = relationshipsNode.first_child_of_type(pugi::node_element);
|
|
234
|
+
uint64_t newId = 1; // default
|
|
235
|
+
while (not relationship.empty()) {
|
|
236
|
+
uint64_t id;
|
|
237
|
+
try {
|
|
238
|
+
id = std::stoi(std::string(relationship.attribute("Id").value()).substr(3));
|
|
239
|
+
}
|
|
240
|
+
catch (std::invalid_argument const & e) { // expected stoi exception
|
|
241
|
+
throw XLInputError("GetNewRelsID could not convert attribute Id to uint32_t ("s + e.what() + ")"s);
|
|
242
|
+
}
|
|
243
|
+
catch (...) { // catch all other errors during conversion of attribute to uint32_t
|
|
244
|
+
throw XLInputError("GetNewRelsID could not convert attribute Id to uint32_t"s);
|
|
245
|
+
}
|
|
246
|
+
if (id >= newId) newId = id + 1;
|
|
247
|
+
relationship = relationship.next_sibling_of_type(pugi::node_element);
|
|
248
|
+
}
|
|
249
|
+
return newId;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* @brief Get a string representation of GetNewRelsID
|
|
254
|
+
* @param relationshipsNode pass-through parameter to GetNewRelsID
|
|
255
|
+
* @return A std::string that can be used as relationship ID
|
|
256
|
+
* @note The format of the returned value will be a base-16 number if RandomIDs is true, otherwise a base-10 number
|
|
257
|
+
*/
|
|
258
|
+
std::string GetNewRelsIDString(XMLNode relationshipsNode) {
|
|
259
|
+
uint64_t newId = GetNewRelsID(relationshipsNode);
|
|
260
|
+
if (RandomIDs) return "R" + BinaryAsHexString(&newId, sizeof(newId));
|
|
261
|
+
return "rId" + std::to_string(newId);
|
|
262
|
+
}
|
|
263
|
+
} // anonymous namespace
|
|
264
|
+
|
|
265
|
+
XLRelationshipItem::XLRelationshipItem() : m_relationshipNode(std::make_unique<XMLNode>()) {}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @details Constructor. Initializes the member variables for the new XLRelationshipItem object.
|
|
269
|
+
*/
|
|
270
|
+
XLRelationshipItem::XLRelationshipItem(const XMLNode& node) : m_relationshipNode(std::make_unique<XMLNode>(node)) {}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @details copy constructor
|
|
274
|
+
*/
|
|
275
|
+
XLRelationshipItem::XLRelationshipItem(const XLRelationshipItem& other)
|
|
276
|
+
: m_relationshipNode(std::make_unique<XMLNode>(*other.m_relationshipNode))
|
|
277
|
+
{}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* @details explicit default move constructor
|
|
281
|
+
*/
|
|
282
|
+
XLRelationshipItem::XLRelationshipItem(XLRelationshipItem&& other) noexcept = default;
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* @details explicit default destructor
|
|
286
|
+
*/
|
|
287
|
+
XLRelationshipItem::~XLRelationshipItem() = default;
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @details copy assignment operator
|
|
291
|
+
*/
|
|
292
|
+
XLRelationshipItem& XLRelationshipItem::operator=(const XLRelationshipItem& other)
|
|
293
|
+
{
|
|
294
|
+
if (&other != this) {
|
|
295
|
+
XLRelationshipItem temp = other; // copy-construct
|
|
296
|
+
*this = std::move(temp); // move-assign & invalidate temp
|
|
297
|
+
}
|
|
298
|
+
return *this;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* @details explicit default move assignment operator
|
|
303
|
+
*/
|
|
304
|
+
XLRelationshipItem& XLRelationshipItem::operator=(XLRelationshipItem&& other) noexcept = default;
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* @details Returns the m_relationshipType member variable by getValue.
|
|
308
|
+
*/
|
|
309
|
+
XLRelationshipType XLRelationshipItem::type() const { return GetRelationshipTypeFromString(m_relationshipNode->attribute("Type").value()); }
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* @details Returns the m_relationshipTarget member variable by getValue.
|
|
313
|
+
*/
|
|
314
|
+
std::string XLRelationshipItem::target() const
|
|
315
|
+
{
|
|
316
|
+
// 2024-12-15 Returned to old behavior: do not strip leading slashes as this loses info about path being absolute.
|
|
317
|
+
// Instead, treat absolute vs. relative path distinction in caller
|
|
318
|
+
return m_relationshipNode->attribute("Target").value();
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* @details Returns the m_relationshipId member variable by getValue.
|
|
323
|
+
*/
|
|
324
|
+
std::string XLRelationshipItem::id() const { return m_relationshipNode->attribute("Id").value(); }
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* @details Returns the m_relationshipNode->empty() status
|
|
328
|
+
*/
|
|
329
|
+
bool XLRelationshipItem::empty() const { return m_relationshipNode->empty(); }
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* @details Default constructor
|
|
334
|
+
*/
|
|
335
|
+
XLRelationships::XLRelationships() = default;
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* @details Creates a XLRelationships object, which will read the XML file with the given path
|
|
339
|
+
* The pathTo the relationships XML file will be verified & stored in m_path, which is subsequently
|
|
340
|
+
* used to return all relationship targets as absolute paths within the XLSX archive
|
|
341
|
+
*/
|
|
342
|
+
XLRelationships::XLRelationships(XLXmlData* xmlData, std::string pathTo)
|
|
343
|
+
: XLXmlFile(xmlData),
|
|
344
|
+
m_path("")
|
|
345
|
+
{
|
|
346
|
+
constexpr const char *relFolder = "_rels/"; // all relationships are stored in a (sub-)folder named "_rels/"
|
|
347
|
+
static const size_t relFolderLen = strlen(relFolder); // 2024-08-23: strlen seems to not be accepted in a constexpr in VS2019 with c++17
|
|
348
|
+
|
|
349
|
+
bool addFirstSlash = (pathTo[0] != '/'); // if first character of pathTo is NOT a slash, then addFirstSlash = true
|
|
350
|
+
size_t pathToEndsAt = pathTo.find_last_of('/');
|
|
351
|
+
if ((pathToEndsAt != std::string::npos) && (pathToEndsAt + 1 >= relFolderLen)
|
|
352
|
+
&& (pathTo.substr(pathToEndsAt + 1 - relFolderLen, relFolderLen) == relFolder)) // nominal
|
|
353
|
+
m_path = (addFirstSlash ? "/" : "") + pathTo.substr(0, pathToEndsAt - relFolderLen + 1);
|
|
354
|
+
else {
|
|
355
|
+
using namespace std::literals::string_literals;
|
|
356
|
+
throw XLException("XLRelationships constructor: pathTo \""s + pathTo + "\" does not point to a file in a folder named \"" + relFolder + "\""s);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
XMLDocument & doc = xmlDocument();
|
|
360
|
+
if (doc.document_element().empty()) // handle a bad (no document element) relationships XML file
|
|
361
|
+
doc.load_string(
|
|
362
|
+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
|
363
|
+
"<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"\n"
|
|
364
|
+
"</Relationships>",
|
|
365
|
+
pugi_parse_settings
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* @details copy constructor
|
|
371
|
+
*/
|
|
372
|
+
XLRelationships::XLRelationships(const XLRelationships& other)
|
|
373
|
+
: XLXmlFile(other),
|
|
374
|
+
m_path(other.m_path)
|
|
375
|
+
{}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* @details explicit default move constructor
|
|
379
|
+
*/
|
|
380
|
+
XLRelationships::XLRelationships(XLRelationships&& other) noexcept = default;
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* @details explicit default destructor
|
|
384
|
+
*/
|
|
385
|
+
XLRelationships::~XLRelationships() = default;
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* @details copy assignment operator
|
|
389
|
+
*/
|
|
390
|
+
XLRelationships& XLRelationships::operator=(const XLRelationships& other)
|
|
391
|
+
{
|
|
392
|
+
if (&other != this) {
|
|
393
|
+
XLRelationships temp = other; // copy-construct
|
|
394
|
+
*this = std::move(temp); // move-assign & invalidate temp
|
|
395
|
+
}
|
|
396
|
+
return *this;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* @details explicit default move assignment operator
|
|
401
|
+
*/
|
|
402
|
+
XLRelationships& XLRelationships::operator=(XLRelationships&& other) noexcept = default;
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* @details Returns the XLRelationshipItem with the given ID, by looking it up in the m_relationships map.
|
|
406
|
+
*/
|
|
407
|
+
XLRelationshipItem XLRelationships::relationshipById(const std::string& id) const
|
|
408
|
+
{
|
|
409
|
+
return XLRelationshipItem(xmlDocument().document_element().find_child_by_attribute("Id", id.c_str()));
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* @details Returns the XLRelationshipItem with the requested target, by iterating through the items.
|
|
414
|
+
* @note 2024-07-24: perform a match that is agnostic to relative vs. absolute (leading slash) paths
|
|
415
|
+
*/
|
|
416
|
+
XLRelationshipItem XLRelationships::relationshipByTarget(const std::string& target, bool throwIfNotFound) const
|
|
417
|
+
{
|
|
418
|
+
// turn relative path into an absolute and resolve . and .. entries
|
|
419
|
+
std::string absoluteTarget = eliminateDotAndDotDotFromPath(target[0] == '/' ? target : m_path + target);
|
|
420
|
+
|
|
421
|
+
XMLNode relationshipNode = xmlDocument().document_element().first_child_of_type(pugi::node_element);
|
|
422
|
+
while (not relationshipNode.empty()) {
|
|
423
|
+
std::string relationTarget = relationshipNode.attribute("Target").value();
|
|
424
|
+
if (relationTarget[0] != '/') relationTarget = m_path + relationTarget; // turn relative path into an absolute
|
|
425
|
+
relationTarget = eliminateDotAndDotDotFromPath(relationTarget); // and resolve . and .. entries, if any
|
|
426
|
+
|
|
427
|
+
// ===== Attempt to match absoluteTarget & relationTarget
|
|
428
|
+
if (absoluteTarget == relationTarget) return XLRelationshipItem(relationshipNode); // found!
|
|
429
|
+
relationshipNode = relationshipNode.next_sibling_of_type(pugi::node_element);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
if (throwIfNotFound) {
|
|
433
|
+
using namespace std::literals::string_literals;
|
|
434
|
+
throw XLException("XLRelationships::"s + __func__ + ": relationship with target \""s + target + "\" (absolute: \""s + absoluteTarget + "\" does not exist!"s);
|
|
435
|
+
}
|
|
436
|
+
return XLRelationshipItem(); // fail with an empty XLRelationshipItem return value -> can be tested for ::empty()
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* @details Returns a const reference to the internal datastructure (std::vector)
|
|
441
|
+
*/
|
|
442
|
+
std::vector<XLRelationshipItem> XLRelationships::relationships() const
|
|
443
|
+
{
|
|
444
|
+
// ===== workaround for pugi::xml_node currently not having an iterator for node_element only
|
|
445
|
+
auto result = std::vector<XLRelationshipItem>();
|
|
446
|
+
XMLNode item = xmlDocument().document_element().first_child_of_type(pugi::node_element);
|
|
447
|
+
while (not item.empty()) {
|
|
448
|
+
result.emplace_back(XLRelationshipItem(item));
|
|
449
|
+
item = item.next_sibling_of_type(pugi::node_element);
|
|
450
|
+
}
|
|
451
|
+
// ===== if a node_element iterator can be implemented for pugi::xml_node, the below code can be used again
|
|
452
|
+
// for (const auto& item : xmlDocument().document_element().children()) result.emplace_back(XLRelationshipItem(item));
|
|
453
|
+
|
|
454
|
+
return result;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
void XLRelationships::deleteRelationship(const std::string& relID)
|
|
458
|
+
{
|
|
459
|
+
xmlDocument().document_element().remove_child(xmlDocument().document_element().find_child_by_attribute("Id", relID.c_str()));
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
void XLRelationships::deleteRelationship(const XLRelationshipItem& item) { deleteRelationship(item.id()); }
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* @details Adds a new relationship by creating new XML node in the .rels file and creating a new XLRelationshipItem
|
|
466
|
+
* based on the newly created node.
|
|
467
|
+
* @note 2024-07-22: added more intelligent whitespace support
|
|
468
|
+
*/
|
|
469
|
+
XLRelationshipItem XLRelationships::addRelationship(XLRelationshipType type, const std::string& target)
|
|
470
|
+
{
|
|
471
|
+
const std::string typeString = OpenXLSX_XLRelationships::GetStringFromType(type);
|
|
472
|
+
// const std::string id = "rId" + std::to_string(GetNewRelsID(xmlDocument().document_element()));
|
|
473
|
+
const std::string id = GetNewRelsIDString(xmlDocument().document_element()); // 2024-07-24: wrapper for relationship IDs with support for 64 bit random IDs
|
|
474
|
+
|
|
475
|
+
XMLNode lastRelationship = xmlDocument().document_element().last_child_of_type(pugi::node_element); // see if there's a last element
|
|
476
|
+
XMLNode node{}; // scope declaration
|
|
477
|
+
|
|
478
|
+
// Create new node in the .rels file
|
|
479
|
+
if (lastRelationship.empty())
|
|
480
|
+
node = xmlDocument().document_element().prepend_child("Relationship");
|
|
481
|
+
else { // if last element found
|
|
482
|
+
// ===== Insert node after previous relationship
|
|
483
|
+
node = xmlDocument().document_element().insert_child_after("Relationship", lastRelationship);
|
|
484
|
+
|
|
485
|
+
// ===== Using whitespace nodes prior to lastRelationship as a template, insert whitespaces between lastRelationship and the new node
|
|
486
|
+
XMLNode copyWhitespaceFrom = lastRelationship; // start looking for whitespace nodes before previous relationship
|
|
487
|
+
XMLNode insertBefore = node; // start inserting the same whitespace nodes before new relationship
|
|
488
|
+
while (copyWhitespaceFrom.previous_sibling().type() == pugi::node_pcdata) { // empty node returns pugi::node_null
|
|
489
|
+
// Advance to previous "template" whitespace node, ensured to exist in while-condition
|
|
490
|
+
copyWhitespaceFrom = copyWhitespaceFrom.previous_sibling();
|
|
491
|
+
// ===== Insert a whitespace node
|
|
492
|
+
insertBefore = xmlDocument().document_element().insert_child_before(pugi::node_pcdata, insertBefore);
|
|
493
|
+
insertBefore.set_value(copyWhitespaceFrom.value()); // copy the whitespace node value in sequence
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
node.append_attribute("Id").set_value(id.c_str());
|
|
497
|
+
node.append_attribute("Type").set_value(typeString.c_str());
|
|
498
|
+
node.append_attribute("Target").set_value(target.c_str());
|
|
499
|
+
|
|
500
|
+
if (type == XLRelationshipType::ExternalLinkPath) {
|
|
501
|
+
node.append_attribute("TargetMode").set_value("External");
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
return XLRelationshipItem(node);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* @details check whether relationshipByTarget finds an XLRelationshipItem or returns an empty one
|
|
509
|
+
* @note 2024-07-24: let relationshipByTarget perform the find with a match that is agnostic to a potential leading slash
|
|
510
|
+
*/
|
|
511
|
+
bool XLRelationships::targetExists(const std::string& target) const
|
|
512
|
+
{
|
|
513
|
+
constexpr const bool DO_NOT_THROW = false; // const for code readability
|
|
514
|
+
return not relationshipByTarget(target, DO_NOT_THROW).empty(); // target exists if relationshipByTarget.empty() returns false
|
|
515
|
+
// return xmlDocument().document_element().find_child_by_attribute("Target", target.c_str()) != nullptr;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* @details
|
|
520
|
+
*/
|
|
521
|
+
bool XLRelationships::idExists(const std::string& id) const
|
|
522
|
+
{
|
|
523
|
+
return xmlDocument().document_element().find_child_by_attribute("Id", id.c_str()) != nullptr;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* @details Print the underlying XML using pugixml::xml_node::print
|
|
528
|
+
*/
|
|
529
|
+
void XLRelationships::print(std::basic_ostream<char>& ostr) const { xmlDocument().document_element().print(ostr); }
|