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,637 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
____ ____ ___ ____ ____ ____ ___
|
|
4
|
+
6MMMMb `MM( )M' `MM' 6MMMMb\`MM( )M'
|
|
5
|
+
8P Y8 `MM. d' MM 6M' ` `MM. d'
|
|
6
|
+
6M Mb __ ____ ____ ___ __ `MM. d' MM MM `MM. d'
|
|
7
|
+
MM MM `M6MMMMb 6MMMMb `MM 6MMb `MM. d' MM YM. `MM. d'
|
|
8
|
+
MM MM MM' `Mb 6M' `Mb MMM9 `Mb `MMd MM YMMMMb `MMd
|
|
9
|
+
MM MM MM MM MM MM MM' MM dMM. MM `Mb dMM.
|
|
10
|
+
MM MM MM MM MMMMMMMM MM MM d'`MM. MM MM d'`MM.
|
|
11
|
+
YM M9 MM MM MM MM MM d' `MM. MM MM d' `MM.
|
|
12
|
+
8b d8 MM. ,M9 YM d9 MM MM d' `MM. MM / L ,M9 d' `MM.
|
|
13
|
+
YMMMM9 MMYMMM9 YMMMM9 _MM_ _MM_M(_ _)MM_ _MMMMMMM MYMMMM9 _M(_ _)MM_
|
|
14
|
+
MM
|
|
15
|
+
MM
|
|
16
|
+
_MM_
|
|
17
|
+
|
|
18
|
+
Copyright (c) 2018, Kenneth Troldal Balslev
|
|
19
|
+
|
|
20
|
+
All rights reserved.
|
|
21
|
+
|
|
22
|
+
Redistribution and use in source and binary forms, with or without
|
|
23
|
+
modification, are permitted provided that the following conditions are met:
|
|
24
|
+
- Redistributions of source code must retain the above copyright
|
|
25
|
+
notice, this list of conditions and the following disclaimer.
|
|
26
|
+
- Redistributions in binary form must reproduce the above copyright
|
|
27
|
+
notice, this list of conditions and the following disclaimer in the
|
|
28
|
+
documentation and/or other materials provided with the distribution.
|
|
29
|
+
- Neither the name of the author nor the
|
|
30
|
+
names of any contributors may be used to endorse or promote products
|
|
31
|
+
derived from this software without specific prior written permission.
|
|
32
|
+
|
|
33
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
34
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
35
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
36
|
+
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
37
|
+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
38
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
39
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
40
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
41
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
42
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
43
|
+
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
// ===== External Includes ===== //
|
|
47
|
+
// #include <algorithm>
|
|
48
|
+
#include <iostream> // std::cout
|
|
49
|
+
|
|
50
|
+
// ===== OpenXLSX Includes ===== //
|
|
51
|
+
#include "XLDocument.hpp" // pugi_parse_settings
|
|
52
|
+
#include "XLComments.hpp"
|
|
53
|
+
#include "XLXmlParser.hpp" // pugixml wrapper
|
|
54
|
+
#include "utilities/XLUtilities.hpp" // OpenXLSX::ignore, appendAndGetNode
|
|
55
|
+
|
|
56
|
+
using namespace OpenXLSX;
|
|
57
|
+
|
|
58
|
+
namespace {
|
|
59
|
+
// module-local utility functions
|
|
60
|
+
/**
|
|
61
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
62
|
+
*/
|
|
63
|
+
std::string getCommentString(XMLNode const & commentNode)
|
|
64
|
+
{
|
|
65
|
+
std::string result{};
|
|
66
|
+
|
|
67
|
+
using namespace std::literals::string_literals;
|
|
68
|
+
XMLNode textElement = commentNode.child("text").first_child_of_type(pugi::node_element);
|
|
69
|
+
while (not textElement.empty()) {
|
|
70
|
+
if (textElement.name() == "t"s) {
|
|
71
|
+
result += textElement.first_child().value();
|
|
72
|
+
}
|
|
73
|
+
else if (textElement.name() == "r"s) { // rich text
|
|
74
|
+
XMLNode richTextSubnode = textElement.first_child_of_type(pugi::node_element);
|
|
75
|
+
while (not richTextSubnode.empty()) {
|
|
76
|
+
if (richTextSubnode.name() == "t"s) {
|
|
77
|
+
result += richTextSubnode.first_child().value();
|
|
78
|
+
}
|
|
79
|
+
else if (richTextSubnode.name() == "rPr"s) {} // ignore rich text formatting info
|
|
80
|
+
else {} // ignore other nodes
|
|
81
|
+
richTextSubnode = richTextSubnode.next_sibling_of_type(pugi::node_element);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {} // ignore other elements (for now)
|
|
85
|
+
textElement = textElement.next_sibling_of_type(pugi::node_element);
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
} // namespace
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
// ========== XLComment Member Functions
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @details
|
|
96
|
+
*/
|
|
97
|
+
// XLComment::XLComment()
|
|
98
|
+
// : m_commentNode(std::make_unique<XMLNode>())
|
|
99
|
+
// {}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @details
|
|
103
|
+
*/
|
|
104
|
+
XLComment::XLComment(const XMLNode& node)
|
|
105
|
+
: m_commentNode(std::make_unique<XMLNode>(node))
|
|
106
|
+
{}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @details copy constructor
|
|
110
|
+
*/
|
|
111
|
+
XLComment::XLComment(const XLComment& other)
|
|
112
|
+
: m_commentNode(std::make_unique<XMLNode>(*other.m_commentNode))
|
|
113
|
+
{}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* @details
|
|
118
|
+
*/
|
|
119
|
+
XLComment::XLComment(XLComment&& other) noexcept = default;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @details
|
|
123
|
+
*/
|
|
124
|
+
XLComment::~XLComment() = default;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @details copy assignment operator
|
|
128
|
+
*/
|
|
129
|
+
XLComment& XLComment::operator=(const XLComment& other)
|
|
130
|
+
{
|
|
131
|
+
if (&other != this) {
|
|
132
|
+
XLComment temp = other; // copy-construct
|
|
133
|
+
*this = std::move(temp); // move-assign & invalidate temp
|
|
134
|
+
}
|
|
135
|
+
return *this;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @details
|
|
140
|
+
*/
|
|
141
|
+
XLComment& XLComment::operator=(XLComment&& other) noexcept = default;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @details
|
|
145
|
+
* @note Function body moved to cpp module as it uses "not" keyword for readability, which MSVC sabotages with non-CPP compatibility.
|
|
146
|
+
* @note For the library it is reasonable to expect users to compile it with MSCV /permissive- flag, but for the user's own projects the header files shall "just work"
|
|
147
|
+
*/
|
|
148
|
+
bool XLComment::valid() const { return m_commentNode != nullptr &&(not m_commentNode->empty()); }
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @brief Getter functions
|
|
152
|
+
*/
|
|
153
|
+
std::string XLComment::ref() const { return m_commentNode->attribute("ref").value(); }
|
|
154
|
+
std::string XLComment::text() const { return getCommentString(*m_commentNode); }
|
|
155
|
+
uint16_t XLComment::authorId() const { return static_cast<uint16_t>(m_commentNode->attribute("authorId").as_uint()); }
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* @brief Setter functions
|
|
159
|
+
*/
|
|
160
|
+
bool XLComment::setText(std::string newText)
|
|
161
|
+
{
|
|
162
|
+
m_commentNode->remove_children(); // clear previous text
|
|
163
|
+
XMLNode tNode = m_commentNode->prepend_child("text").prepend_child("t"); // insert <text><t/></text> nodes
|
|
164
|
+
tNode.append_attribute("xml:space").set_value("preserve"); // set <t> node attribute xml:space
|
|
165
|
+
return tNode.prepend_child(pugi::node_pcdata).set_value(newText.c_str()); // finally, insert <t> node_pcdata value
|
|
166
|
+
}
|
|
167
|
+
bool XLComment::setAuthorId(uint16_t newAuthorId) { return appendAndSetAttribute(*m_commentNode, "authorId", std::to_string(newAuthorId)).empty() == false; }
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
// ========== XLComments Member Functions
|
|
171
|
+
|
|
172
|
+
XLComments::XLComments()
|
|
173
|
+
: XLXmlFile(nullptr),
|
|
174
|
+
m_authors(std::make_unique<XMLNode>()),
|
|
175
|
+
m_commentList(std::make_unique<XMLNode>()),
|
|
176
|
+
m_vmlDrawing(std::make_unique<XLVmlDrawing>()),
|
|
177
|
+
m_hintNode(std::make_unique<XMLNode>())
|
|
178
|
+
{}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* @details The constructor creates an instance of the superclass, XLXmlFile
|
|
182
|
+
*/
|
|
183
|
+
XLComments::XLComments(XLXmlData* xmlData)
|
|
184
|
+
: XLXmlFile(xmlData),
|
|
185
|
+
// m_authors(std::make_unique<XMLNode>()), // manually initialized below
|
|
186
|
+
// m_commentList(std::make_unique<XMLNode>()), // "
|
|
187
|
+
m_vmlDrawing(std::make_unique<XLVmlDrawing>()),
|
|
188
|
+
m_hintNode(std::make_unique<XMLNode>()),
|
|
189
|
+
m_hintIndex(0)
|
|
190
|
+
{
|
|
191
|
+
if (xmlData->getXmlType() != XLContentType::Comments)
|
|
192
|
+
throw XLInternalError("XLComments constructor: Invalid XML data.");
|
|
193
|
+
|
|
194
|
+
XMLDocument & doc = xmlDocument();
|
|
195
|
+
if (doc.document_element().empty()) // handle a bad (no document element) comments XML file
|
|
196
|
+
doc.load_string(
|
|
197
|
+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
|
198
|
+
"<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\""
|
|
199
|
+
" xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\">\n"
|
|
200
|
+
"</comments>",
|
|
201
|
+
pugi_parse_settings
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
XMLNode rootNode = doc.document_element();
|
|
205
|
+
bool docNew = rootNode.first_child_of_type(pugi::node_element).empty(); // check and store status: was document empty?
|
|
206
|
+
m_authors = std::make_unique<XMLNode>( // (insert and) get authors node
|
|
207
|
+
appendAndGetNode (rootNode, "authors", m_nodeOrder)); //
|
|
208
|
+
if (docNew) rootNode.prepend_child(pugi::node_pcdata).set_value("\n\t"); // if document was empty: prefix the newly inserted authors node with a single tab
|
|
209
|
+
m_commentList = std::make_unique<XMLNode>( // (insert and) get commentList node -> this should now copy the whitespace prefix of m_authors
|
|
210
|
+
appendAndGetNode (rootNode, "commentList", m_nodeOrder)); //
|
|
211
|
+
|
|
212
|
+
// whitespace formatting / indentation for closing tags:
|
|
213
|
+
if ( m_authors->first_child().empty()) m_authors->append_child(pugi::node_pcdata).set_value("\n\t");
|
|
214
|
+
if (m_commentList->first_child().empty()) m_commentList->append_child(pugi::node_pcdata).set_value("\n\t");
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* @details copy-construct an XLComments object
|
|
219
|
+
*/
|
|
220
|
+
XLComments::XLComments(const XLComments& other)
|
|
221
|
+
: XLXmlFile(other),
|
|
222
|
+
m_authors(std::make_unique<XMLNode>(*other.m_authors)),
|
|
223
|
+
m_commentList(std::make_unique<XMLNode>(*other.m_commentList)),
|
|
224
|
+
m_vmlDrawing(std::make_unique<XLVmlDrawing>(*other.m_vmlDrawing)),
|
|
225
|
+
// m_vmlDrawing(std::make_unique<XLVmlDrawing>(other.m_vmlDrawing ? *other.m_vmlDrawing : XLVmlDrawing())) // this can be used if other.m_vmlDrawing can be uninitialized
|
|
226
|
+
m_hintNode(std::make_unique<XMLNode>(*other.m_hintNode)),
|
|
227
|
+
m_hintIndex(other.m_hintIndex)
|
|
228
|
+
{}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* @details move-construct an XLComments object
|
|
232
|
+
*/
|
|
233
|
+
XLComments::XLComments(XLComments&& other) noexcept
|
|
234
|
+
: XLXmlFile(other),
|
|
235
|
+
m_authors(std::move(other.m_authors)),
|
|
236
|
+
m_commentList(std::move(other.m_commentList)),
|
|
237
|
+
m_vmlDrawing(std::move(other.m_vmlDrawing)),
|
|
238
|
+
m_hintNode(std::move(other.m_hintNode)),
|
|
239
|
+
m_hintIndex(other.m_hintIndex)
|
|
240
|
+
{}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* @brief The destructor
|
|
244
|
+
*/
|
|
245
|
+
XLComments::~XLComments() = default;
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @details move-assign an XLComments object
|
|
249
|
+
*/
|
|
250
|
+
XLComments& XLComments::operator=(XLComments&& other) noexcept
|
|
251
|
+
{
|
|
252
|
+
if (&other != this) {
|
|
253
|
+
XLXmlFile::operator=(std::move(other)); // TBD: std::move of xvalue other is possibly redundant here
|
|
254
|
+
m_authors = std::move(other.m_authors);
|
|
255
|
+
m_commentList = std::move(other.m_commentList);
|
|
256
|
+
m_vmlDrawing = std::move(other.m_vmlDrawing);
|
|
257
|
+
m_hintNode = std::move(other.m_hintNode);
|
|
258
|
+
m_hintIndex = other.m_hintIndex;
|
|
259
|
+
}
|
|
260
|
+
return *this;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* @details copy-assign an XLComments object
|
|
265
|
+
*/
|
|
266
|
+
XLComments& XLComments::operator=(const XLComments& other)
|
|
267
|
+
{
|
|
268
|
+
if (&other != this) {
|
|
269
|
+
XLComments temp = other; // copy-construct
|
|
270
|
+
*this = std::move(temp); // move-assign & invalidate temp
|
|
271
|
+
}
|
|
272
|
+
return *this;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
bool XLComments::setVmlDrawing(XLVmlDrawing &vmlDrawing)
|
|
277
|
+
{
|
|
278
|
+
m_vmlDrawing = std::make_unique<XLVmlDrawing>(vmlDrawing);
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
284
|
+
*/
|
|
285
|
+
XMLNode XLComments::authorNode(uint16_t index) const
|
|
286
|
+
{
|
|
287
|
+
XMLNode auth = m_authors->first_child_of_type(pugi::node_element);
|
|
288
|
+
uint16_t i = 0;
|
|
289
|
+
while (not auth.empty() && i != index) {
|
|
290
|
+
++i;
|
|
291
|
+
auth = auth.next_sibling_of_type(pugi::node_element);
|
|
292
|
+
}
|
|
293
|
+
return auth; // auth.empty() will be true if not found
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* @brief find a comment XML node by index (sequence within source XML)
|
|
298
|
+
* @param index the position (0-based) of the comment node to return
|
|
299
|
+
* @throws XLException if index is out of bounds vs. XLComments::count()
|
|
300
|
+
*/
|
|
301
|
+
XMLNode XLComments::commentNode(size_t index) const
|
|
302
|
+
{
|
|
303
|
+
if( m_hintNode->empty() || m_hintIndex > index ) { // check if m_hintNode can be used - otherwise initialize it
|
|
304
|
+
m_hintNode = std::make_unique<XMLNode>(m_commentList->first_child_of_type(pugi::node_element));
|
|
305
|
+
m_hintIndex = 0;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
while (not m_hintNode->empty() && m_hintIndex < index) {
|
|
309
|
+
++m_hintIndex;
|
|
310
|
+
m_hintNode = std::make_unique<XMLNode>(m_hintNode->next_sibling_of_type(pugi::node_element));
|
|
311
|
+
}
|
|
312
|
+
if (m_hintNode->empty()) {
|
|
313
|
+
using namespace std::literals::string_literals;
|
|
314
|
+
throw XLException("XLComments::commentNode: index "s + std::to_string(index) + " is out of bounds"s);
|
|
315
|
+
}
|
|
316
|
+
return *m_hintNode; // can be empty XMLNode if index is >= count
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
321
|
+
*/
|
|
322
|
+
XMLNode XLComments::commentNode(const std::string& cellRef) const
|
|
323
|
+
{
|
|
324
|
+
return m_commentList->find_child_by_attribute("comment", "ref", cellRef.c_str());
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
329
|
+
*/
|
|
330
|
+
uint16_t XLComments::authorCount() const
|
|
331
|
+
{
|
|
332
|
+
XMLNode auth = m_authors->first_child_of_type(pugi::node_element);
|
|
333
|
+
uint16_t count = 0;
|
|
334
|
+
while (not auth.empty()) {
|
|
335
|
+
++count;
|
|
336
|
+
auth = auth.next_sibling_of_type(pugi::node_element);
|
|
337
|
+
}
|
|
338
|
+
return count;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
343
|
+
*/
|
|
344
|
+
std::string XLComments::author(uint16_t index) const
|
|
345
|
+
{
|
|
346
|
+
XMLNode auth = authorNode(index);
|
|
347
|
+
if (auth.empty()) {
|
|
348
|
+
using namespace std::literals::string_literals;
|
|
349
|
+
throw XLException("XLComments::author: index "s + std::to_string(index) + " is out of bounds"s);
|
|
350
|
+
}
|
|
351
|
+
return auth.first_child().value(); // author name is stored as a node_pcdata within the author node
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
356
|
+
*/
|
|
357
|
+
bool XLComments::deleteAuthor(uint16_t index)
|
|
358
|
+
{
|
|
359
|
+
XMLNode auth = authorNode(index);
|
|
360
|
+
if (auth.empty()) {
|
|
361
|
+
using namespace std::literals::string_literals;
|
|
362
|
+
throw XLException("XLComments::deleteAuthor: index "s + std::to_string(index) + " is out of bounds"s);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
while (auth.previous_sibling().type() == pugi::node_pcdata) // remove leading whitespaces
|
|
366
|
+
m_authors->remove_child(auth.previous_sibling());
|
|
367
|
+
m_authors->remove_child(auth); // then remove author node itself
|
|
368
|
+
}
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* @details insert author and return index
|
|
374
|
+
*/
|
|
375
|
+
uint16_t XLComments::addAuthor(const std::string& authorName)
|
|
376
|
+
{
|
|
377
|
+
XMLNode auth = m_authors->first_child_of_type(pugi::node_element);
|
|
378
|
+
uint16_t index = 0;
|
|
379
|
+
while (not auth.next_sibling_of_type(pugi::node_element).empty()) {
|
|
380
|
+
++index;
|
|
381
|
+
auth = auth.next_sibling_of_type(pugi::node_element);
|
|
382
|
+
}
|
|
383
|
+
if (auth.empty()) { // if this is the first entry
|
|
384
|
+
auth = m_authors->prepend_child("author"); // insert new node
|
|
385
|
+
m_authors->prepend_child(pugi::node_pcdata).set_value("\n\t\t"); // prefix first author with second level indentation
|
|
386
|
+
}
|
|
387
|
+
else { // found the last author node at index
|
|
388
|
+
auth = m_authors->insert_child_after("author", auth); // append a new author
|
|
389
|
+
copyLeadingWhitespaces(*m_authors, auth.previous_sibling(), auth ); // copy whitespaces prefix from previous author
|
|
390
|
+
++index; // increment index
|
|
391
|
+
}
|
|
392
|
+
auth.prepend_child(pugi::node_pcdata).set_value(authorName.c_str());
|
|
393
|
+
return index;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
398
|
+
*/
|
|
399
|
+
size_t XLComments::count() const
|
|
400
|
+
{
|
|
401
|
+
XMLNode comment = m_commentList->first_child_of_type(pugi::node_element);
|
|
402
|
+
size_t count = 0;
|
|
403
|
+
while (not comment.empty()) {
|
|
404
|
+
// if (comment.name() == "comment") // TBD: safe-guard against potential rogue node
|
|
405
|
+
++count;
|
|
406
|
+
comment = comment.next_sibling_of_type(pugi::node_element);
|
|
407
|
+
}
|
|
408
|
+
return count;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
413
|
+
*/
|
|
414
|
+
uint16_t XLComments::authorId(const std::string& cellRef) const
|
|
415
|
+
{
|
|
416
|
+
XMLNode comment = commentNode(cellRef);
|
|
417
|
+
return static_cast<uint16_t>(comment.attribute("authorId").as_uint());
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
422
|
+
*/
|
|
423
|
+
bool XLComments::deleteComment(const std::string& cellRef)
|
|
424
|
+
{
|
|
425
|
+
XMLNode comment = commentNode(cellRef);
|
|
426
|
+
if (comment.empty()) return false;
|
|
427
|
+
else {
|
|
428
|
+
m_commentList->remove_child(comment);
|
|
429
|
+
if (not m_hintNode->empty()) m_hintNode = std::make_unique<XMLNode>(); // reset hint after modification of comment list
|
|
430
|
+
m_hintIndex = 0;
|
|
431
|
+
}
|
|
432
|
+
// ===== Delete the shape associated with the comment.
|
|
433
|
+
OpenXLSX::ignore(m_vmlDrawing->deleteShape(cellRef)); // disregard if deleteShape fails
|
|
434
|
+
return true;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// comment entries:
|
|
438
|
+
// attribute ref -> cell
|
|
439
|
+
// attribute authorId -> author index in array
|
|
440
|
+
// node text
|
|
441
|
+
// subnode t -> regular text
|
|
442
|
+
// attribute xml:space="preserve" - seems useful to always apply
|
|
443
|
+
// subnode pc_data -> the comment text
|
|
444
|
+
// subnode r -> rich text, repetition of:
|
|
445
|
+
// subnode rPr -> rich text formatting
|
|
446
|
+
// subnode sz -> font size (int)
|
|
447
|
+
// subnode rFont -> font name (string)
|
|
448
|
+
// subnode family -> TBC: font family (int)
|
|
449
|
+
// subnode t -> regular text like above
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
453
|
+
*/
|
|
454
|
+
XLComment XLComments::get(size_t index) const { return XLComment(commentNode(index)); }
|
|
455
|
+
std::string XLComments::get(const std::string& cellRef) const { return getCommentString(commentNode(cellRef)); }
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* @details TODO: write doxygen headers for functions in this module
|
|
459
|
+
*/
|
|
460
|
+
bool XLComments::set(std::string const& cellRef, std::string const& commentText, uint16_t authorId_)
|
|
461
|
+
{
|
|
462
|
+
XLCellReference destRef(cellRef);
|
|
463
|
+
uint32_t destRow = destRef.row();
|
|
464
|
+
uint16_t destCol = destRef.column();
|
|
465
|
+
bool newCommentCreated = false; // if false, try to find an existing shape before creating one
|
|
466
|
+
|
|
467
|
+
using namespace std::literals::string_literals;
|
|
468
|
+
XMLNode comment = m_commentList->first_child_of_type(pugi::node_element);
|
|
469
|
+
while (not comment.empty()) {
|
|
470
|
+
if (comment.name() == "comment"s) { // safeguard against rogue nodes
|
|
471
|
+
XLCellReference ref(comment.attribute("ref").value());
|
|
472
|
+
if (ref.row() > destRow ||(ref.row() == destRow && ref.column() >= destCol)) // abort when node or a node behind it is found
|
|
473
|
+
break;
|
|
474
|
+
}
|
|
475
|
+
comment = comment.next_sibling_of_type(pugi::node_element);
|
|
476
|
+
}
|
|
477
|
+
if(comment.empty()) { // no comments yet or this will be the last comment
|
|
478
|
+
comment = m_commentList->last_child_of_type(pugi::node_element);
|
|
479
|
+
if (comment.empty()) { // if this is the only comment so far
|
|
480
|
+
comment = m_commentList->prepend_child("comment"); // prepend new comment
|
|
481
|
+
m_commentList->insert_child_before(pugi::node_pcdata, comment).set_value("\n\t\t"); // insert double indent before comment
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
comment = m_commentList->insert_child_after("comment", comment); // insert new comment at end of list
|
|
485
|
+
copyLeadingWhitespaces(*m_commentList, comment.previous_sibling(), comment); // and copy whitespaces prefix from previous comment
|
|
486
|
+
}
|
|
487
|
+
newCommentCreated = true;
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
XLCellReference ref(comment.attribute("ref").value());
|
|
491
|
+
if(ref.row() != destRow || ref.column() != destCol) { // if node has to be inserted *before* this one
|
|
492
|
+
comment = m_commentList->insert_child_before("comment", comment); // insert new comment
|
|
493
|
+
copyLeadingWhitespaces(*m_commentList, comment, comment.next_sibling()); // and copy whitespaces prefix from next node
|
|
494
|
+
newCommentCreated = true;
|
|
495
|
+
}
|
|
496
|
+
else // node exists / was found
|
|
497
|
+
comment.remove_children(); // clear node content
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// ===== If the list of nodes was modified, re-set m_hintNode that is used to access nodes by index
|
|
501
|
+
if (newCommentCreated) {
|
|
502
|
+
if (not m_hintNode->empty()) m_hintNode = std::make_unique<XMLNode>(); // reset hint after modification of comment list
|
|
503
|
+
m_hintIndex = 0;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// now that we have a valid comment node: update attributes and content
|
|
507
|
+
if (comment.attribute("ref").empty()) // if ref has to be created
|
|
508
|
+
comment.append_attribute("ref").set_value(destRef.address().c_str()); // then do so - otherwise it can remain untouched
|
|
509
|
+
appendAndSetAttribute(comment, "authorId", std::to_string(authorId_)); // update authorId
|
|
510
|
+
XMLNode tNode = comment.prepend_child("text").prepend_child("t"); // insert <text><t/></text> nodes
|
|
511
|
+
tNode.append_attribute("xml:space").set_value("preserve"); // set <t> node attribute xml:space
|
|
512
|
+
tNode.prepend_child(pugi::node_pcdata).set_value(commentText.c_str()); // finally, insert <t> node_pcdata value
|
|
513
|
+
|
|
514
|
+
if (m_vmlDrawing->valid()) {
|
|
515
|
+
XLShape cShape{};
|
|
516
|
+
bool newShapeNeeded = newCommentCreated; // on new comments: create new shape
|
|
517
|
+
if (!newCommentCreated) {
|
|
518
|
+
try {
|
|
519
|
+
cShape = shape(cellRef); // for existing comments, try to access existing shape
|
|
520
|
+
}
|
|
521
|
+
catch (XLException const& e) {
|
|
522
|
+
newShapeNeeded = true; // not found: create fresh
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
if (newShapeNeeded)
|
|
526
|
+
cShape = m_vmlDrawing->createShape();
|
|
527
|
+
|
|
528
|
+
cShape.setFillColor("#ffffc0");
|
|
529
|
+
cShape.setStroked(true);
|
|
530
|
+
// setType: already done by XLVmlDrawing::createShape
|
|
531
|
+
cShape.setAllowInCell(false);
|
|
532
|
+
{
|
|
533
|
+
// XLShapeStyle shapeStyle("position:absolute;margin-left:100pt;margin-top:0pt;width:50pt;height:50.0pt;mso-wrap-style:none;v-text-anchor:middle;visibility:hidden");
|
|
534
|
+
XLShapeStyle shapeStyle{}; // default construct with meaningful values
|
|
535
|
+
cShape.setStyle(shapeStyle);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
XLShapeClientData clientData = cShape.clientData();
|
|
539
|
+
clientData.setObjectType("Note");
|
|
540
|
+
clientData.setMoveWithCells();
|
|
541
|
+
clientData.setSizeWithCells();
|
|
542
|
+
|
|
543
|
+
{
|
|
544
|
+
constexpr const uint16_t leftColOffset = 1;
|
|
545
|
+
constexpr const uint16_t widthCols = 2;
|
|
546
|
+
constexpr const uint16_t topRowOffset = 1;
|
|
547
|
+
constexpr const uint16_t heightRows = 2;
|
|
548
|
+
|
|
549
|
+
uint16_t anchorLeftCol, anchorRightCol;
|
|
550
|
+
if( OpenXLSX::MAX_COLS - destCol > leftColOffset + widthCols ) {
|
|
551
|
+
anchorLeftCol = (destCol - 1) + leftColOffset;
|
|
552
|
+
anchorRightCol = (destCol - 1) + leftColOffset + widthCols;
|
|
553
|
+
}
|
|
554
|
+
else { // if anchor would overflow MAX_COLS: move column anchor to the left of destCol
|
|
555
|
+
anchorLeftCol = (destCol - 1) - leftColOffset - widthCols;
|
|
556
|
+
anchorRightCol = (destCol - 1) - leftColOffset;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
uint32_t anchorTopRow, anchorBottomRow;
|
|
560
|
+
if( OpenXLSX::MAX_ROWS - destRow > topRowOffset + heightRows ) {
|
|
561
|
+
anchorTopRow = (destRow - 1) + topRowOffset;
|
|
562
|
+
anchorBottomRow = (destRow - 1) + topRowOffset + heightRows;
|
|
563
|
+
}
|
|
564
|
+
else { // if anchor would overflow MAX_ROWS: move row anchor to the top of destCol
|
|
565
|
+
anchorTopRow = (destRow - 1) - topRowOffset - heightRows;
|
|
566
|
+
anchorBottomRow = (destRow - 1) - topRowOffset;
|
|
567
|
+
}
|
|
568
|
+
if (anchorRightCol > MAX_SHAPE_ANCHOR_COLUMN)
|
|
569
|
+
std::cout << "XLComments::set WARNING: anchoring comment shapes beyond column "s
|
|
570
|
+
/**/ + XLCellReference::columnAsString(MAX_SHAPE_ANCHOR_COLUMN) + " may not get displayed correctly (LO Calc, TBD in Excel)"s << std::endl;
|
|
571
|
+
if (anchorBottomRow > MAX_SHAPE_ANCHOR_ROW)
|
|
572
|
+
std::cout << "XLComments::set WARNING: anchoring comment shapes beyond row "s
|
|
573
|
+
/**/ + std::to_string(MAX_SHAPE_ANCHOR_ROW ) + " may not get displayed correctly (LO Calc, TBD in Excel)"s << std::endl;
|
|
574
|
+
|
|
575
|
+
uint16_t anchorLeftOffsetInCell = 10, anchorRightOffsetInCell = 10;
|
|
576
|
+
uint16_t anchorTopOffsetInCell = 5, anchorBottomOffsetInCell = 5;
|
|
577
|
+
|
|
578
|
+
// clientData.setAnchor("3, 23, 0, 0, 4, 25, 3, 5");
|
|
579
|
+
using namespace std::literals::string_literals;
|
|
580
|
+
clientData.setAnchor(
|
|
581
|
+
std::to_string(anchorLeftCol) + ","s
|
|
582
|
+
+ std::to_string(anchorLeftOffsetInCell) + ","s
|
|
583
|
+
+ std::to_string(anchorTopRow) + ","s
|
|
584
|
+
+ std::to_string(anchorTopOffsetInCell) + ","s
|
|
585
|
+
+ std::to_string(anchorRightCol) + ","s
|
|
586
|
+
+ std::to_string(anchorRightOffsetInCell) + ","s
|
|
587
|
+
+ std::to_string(anchorBottomRow) + ","s
|
|
588
|
+
+ std::to_string(anchorBottomOffsetInCell)
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
clientData.setAutoFill(false);
|
|
592
|
+
clientData.setTextVAlign(XLShapeTextVAlign::Top);
|
|
593
|
+
clientData.setTextHAlign(XLShapeTextHAlign::Left);
|
|
594
|
+
clientData.setRow(destRow - 1); // row and column are zero-indexed in XLShapeClientData
|
|
595
|
+
clientData.setColumn(destCol - 1); // ..
|
|
596
|
+
|
|
597
|
+
// <v:shadow on="t" obscured="t" color="black"/>
|
|
598
|
+
// <v:fill o:detectmouseclick="t" type="solid" color2="#00003f"/>
|
|
599
|
+
// <v:stroke color="#3465a4" startarrow="block" startarrowwidth="medium" startarrowlength="medium" joinstyle="round" endcap="flat"/>
|
|
600
|
+
// <x:ClientData ObjectType="Note">
|
|
601
|
+
// <x:MoveWithCells/>
|
|
602
|
+
// <x:SizeWithCells/>
|
|
603
|
+
// <x:Anchor>3, 23, 0, 0, 4, 25, 3, 5</x:Anchor>
|
|
604
|
+
// <x:AutoFill>False</x:AutoFill>
|
|
605
|
+
// <x:TextVAlign>Top</x:TextVAlign>
|
|
606
|
+
// <x:TextHAlign>Left</x:TextHAlign>
|
|
607
|
+
// <x:Row>0</x:Row>
|
|
608
|
+
// <x:Column>2</x:Column>
|
|
609
|
+
// </x:ClientData>
|
|
610
|
+
// </v:shape>
|
|
611
|
+
}
|
|
612
|
+
else
|
|
613
|
+
throw XLException("XLComments::set: can not set (format) any comments when VML Drawing object is invalid");
|
|
614
|
+
|
|
615
|
+
return true;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* @details
|
|
620
|
+
*/
|
|
621
|
+
XLShape XLComments::shape(std::string const& cellRef)
|
|
622
|
+
{
|
|
623
|
+
if (!m_vmlDrawing->valid())
|
|
624
|
+
throw XLException("XLComments::shape: can not access any shapes when VML Drawing object is invalid");
|
|
625
|
+
|
|
626
|
+
XMLNode shape = m_vmlDrawing->shapeNode(cellRef);
|
|
627
|
+
if (shape.empty()) {
|
|
628
|
+
using namespace std::literals::string_literals;
|
|
629
|
+
throw XLException("XLComments::shape: not found for cell "s + cellRef + " - was XLComment::set invoked first?"s);
|
|
630
|
+
}
|
|
631
|
+
return XLShape(shape);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* @details Print the underlying XML using pugixml::xml_node::print
|
|
636
|
+
*/
|
|
637
|
+
void XLComments::print(std::basic_ostream<char>& ostr) const { xmlDocument().document_element().print( ostr ); }
|