@papyrus-sdk/engine-native 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/dist/index.d.mts +90 -3
  2. package/dist/index.d.ts +90 -3
  3. package/dist/index.js +483 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +483 -4
  6. package/dist/index.mjs.map +1 -1
  7. package/ios/PapyrusNativeEngine.m +447 -372
  8. package/ios/PapyrusNativeEngine.podspec +15 -15
  9. package/ios/PapyrusPageView.h +19 -16
  10. package/ios/PapyrusPageView.m +63 -54
  11. package/package.json +36 -32
  12. package/LICENSE +0 -21
  13. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  14. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  15. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  16. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/cache-v2-55a2e41fcdfef7f23046.json +0 -1323
  17. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-ce719ceafe10fdc060d9.json +0 -184
  18. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-ba59984c0779dea51592.json +0 -60
  19. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +0 -14
  20. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/index-2025-12-22T13-33-34-0909.json +0 -92
  21. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/target-papyrus_text-Debug-29cd4996bc13fe24a65c.json +0 -168
  22. package/android/.cxx/Debug/6t29645j/arm64-v8a/.ninja_deps +0 -0
  23. package/android/.cxx/Debug/6t29645j/arm64-v8a/.ninja_log +0 -20
  24. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeCache.txt +0 -400
  25. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +0 -72
  26. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +0 -83
  27. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  28. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  29. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +0 -15
  30. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +0 -803
  31. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  32. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  33. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  34. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/CMakeOutput.log +0 -264
  35. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/TargetDirectories.txt +0 -3
  36. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/cmake.check_cache +0 -1
  37. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/papyrus_text.dir/papyrus_outline.cpp.o +0 -0
  38. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/papyrus_text.dir/papyrus_text_search.cpp.o +0 -0
  39. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/rules.ninja +0 -64
  40. package/android/.cxx/Debug/6t29645j/arm64-v8a/additional_project_files.txt +0 -0
  41. package/android/.cxx/Debug/6t29645j/arm64-v8a/android_gradle_build.json +0 -38
  42. package/android/.cxx/Debug/6t29645j/arm64-v8a/android_gradle_build_mini.json +0 -27
  43. package/android/.cxx/Debug/6t29645j/arm64-v8a/build.ninja +0 -158
  44. package/android/.cxx/Debug/6t29645j/arm64-v8a/build_file_index.txt +0 -1
  45. package/android/.cxx/Debug/6t29645j/arm64-v8a/cmake_install.cmake +0 -54
  46. package/android/.cxx/Debug/6t29645j/arm64-v8a/compile_commands.json +0 -12
  47. package/android/.cxx/Debug/6t29645j/arm64-v8a/compile_commands.json.bin +0 -0
  48. package/android/.cxx/Debug/6t29645j/arm64-v8a/configure_fingerprint.bin +0 -28
  49. package/android/.cxx/Debug/6t29645j/arm64-v8a/metadata_generation_command.txt +0 -19
  50. package/android/.cxx/Debug/6t29645j/arm64-v8a/prefab_config.json +0 -4
  51. package/android/.cxx/Debug/6t29645j/arm64-v8a/symbol_folder_index.txt +0 -1
  52. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  53. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  54. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  55. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/cache-v2-7f933b968e76d6ce336c.json +0 -1323
  56. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-439d2bc9e04bf2a43452.json +0 -184
  57. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-efc4cfee3dc3a5ec05be.json +0 -60
  58. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +0 -14
  59. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/index-2025-12-22T13-33-36-0881.json +0 -92
  60. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/target-papyrus_text-Debug-e3f83458cbaf3644c279.json +0 -168
  61. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.ninja_deps +0 -0
  62. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.ninja_log +0 -20
  63. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeCache.txt +0 -400
  64. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +0 -72
  65. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +0 -83
  66. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  67. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  68. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +0 -15
  69. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +0 -803
  70. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  71. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  72. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  73. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/CMakeOutput.log +0 -268
  74. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/TargetDirectories.txt +0 -3
  75. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/cmake.check_cache +0 -1
  76. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/papyrus_text.dir/papyrus_outline.cpp.o +0 -0
  77. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/papyrus_text.dir/papyrus_text_search.cpp.o +0 -0
  78. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/rules.ninja +0 -64
  79. package/android/.cxx/Debug/6t29645j/armeabi-v7a/additional_project_files.txt +0 -0
  80. package/android/.cxx/Debug/6t29645j/armeabi-v7a/android_gradle_build.json +0 -38
  81. package/android/.cxx/Debug/6t29645j/armeabi-v7a/android_gradle_build_mini.json +0 -27
  82. package/android/.cxx/Debug/6t29645j/armeabi-v7a/build.ninja +0 -158
  83. package/android/.cxx/Debug/6t29645j/armeabi-v7a/build_file_index.txt +0 -1
  84. package/android/.cxx/Debug/6t29645j/armeabi-v7a/cmake_install.cmake +0 -54
  85. package/android/.cxx/Debug/6t29645j/armeabi-v7a/compile_commands.json +0 -12
  86. package/android/.cxx/Debug/6t29645j/armeabi-v7a/compile_commands.json.bin +0 -0
  87. package/android/.cxx/Debug/6t29645j/armeabi-v7a/configure_fingerprint.bin +0 -28
  88. package/android/.cxx/Debug/6t29645j/armeabi-v7a/metadata_generation_command.txt +0 -19
  89. package/android/.cxx/Debug/6t29645j/armeabi-v7a/prefab_config.json +0 -4
  90. package/android/.cxx/Debug/6t29645j/armeabi-v7a/symbol_folder_index.txt +0 -1
  91. package/android/.cxx/Debug/6t29645j/hash_key.txt +0 -26
  92. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  93. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  94. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  95. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/cache-v2-921e99e188641cccb611.json +0 -1323
  96. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/cmakeFiles-v1-842a746390c683135141.json +0 -184
  97. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/codemodel-v2-5a1f9507fc5ae29259c9.json +0 -60
  98. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +0 -14
  99. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/index-2025-12-22T13-33-37-0961.json +0 -92
  100. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/target-papyrus_text-Debug-3cc07532ad82ada3b95c.json +0 -168
  101. package/android/.cxx/Debug/6t29645j/x86/.ninja_deps +0 -0
  102. package/android/.cxx/Debug/6t29645j/x86/.ninja_log +0 -20
  103. package/android/.cxx/Debug/6t29645j/x86/CMakeCache.txt +0 -400
  104. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +0 -72
  105. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +0 -83
  106. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  107. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  108. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +0 -15
  109. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +0 -803
  110. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  111. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  112. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  113. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/CMakeOutput.log +0 -258
  114. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/TargetDirectories.txt +0 -3
  115. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/cmake.check_cache +0 -1
  116. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/papyrus_text.dir/papyrus_outline.cpp.o +0 -0
  117. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/papyrus_text.dir/papyrus_text_search.cpp.o +0 -0
  118. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/rules.ninja +0 -64
  119. package/android/.cxx/Debug/6t29645j/x86/additional_project_files.txt +0 -0
  120. package/android/.cxx/Debug/6t29645j/x86/android_gradle_build.json +0 -38
  121. package/android/.cxx/Debug/6t29645j/x86/android_gradle_build_mini.json +0 -27
  122. package/android/.cxx/Debug/6t29645j/x86/build.ninja +0 -158
  123. package/android/.cxx/Debug/6t29645j/x86/build_file_index.txt +0 -1
  124. package/android/.cxx/Debug/6t29645j/x86/cmake_install.cmake +0 -54
  125. package/android/.cxx/Debug/6t29645j/x86/compile_commands.json +0 -12
  126. package/android/.cxx/Debug/6t29645j/x86/compile_commands.json.bin +0 -0
  127. package/android/.cxx/Debug/6t29645j/x86/configure_fingerprint.bin +0 -28
  128. package/android/.cxx/Debug/6t29645j/x86/metadata_generation_command.txt +0 -19
  129. package/android/.cxx/Debug/6t29645j/x86/prefab_config.json +0 -4
  130. package/android/.cxx/Debug/6t29645j/x86/symbol_folder_index.txt +0 -1
  131. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  132. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  133. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  134. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/cache-v2-de693df49d051882903b.json +0 -1323
  135. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-8206847cf10ce80b1459.json +0 -184
  136. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/codemodel-v2-ad9301b1a16c83f532c2.json +0 -60
  137. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +0 -14
  138. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/index-2025-12-22T13-33-39-0005.json +0 -92
  139. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/target-papyrus_text-Debug-e1bb1d27c41dc820b379.json +0 -168
  140. package/android/.cxx/Debug/6t29645j/x86_64/.ninja_deps +0 -0
  141. package/android/.cxx/Debug/6t29645j/x86_64/.ninja_log +0 -20
  142. package/android/.cxx/Debug/6t29645j/x86_64/CMakeCache.txt +0 -400
  143. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +0 -72
  144. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +0 -83
  145. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  146. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  147. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +0 -15
  148. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +0 -803
  149. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  150. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  151. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  152. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/CMakeOutput.log +0 -258
  153. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/TargetDirectories.txt +0 -3
  154. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/cmake.check_cache +0 -1
  155. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/papyrus_text.dir/papyrus_outline.cpp.o +0 -0
  156. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/papyrus_text.dir/papyrus_text_search.cpp.o +0 -0
  157. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/rules.ninja +0 -64
  158. package/android/.cxx/Debug/6t29645j/x86_64/additional_project_files.txt +0 -0
  159. package/android/.cxx/Debug/6t29645j/x86_64/android_gradle_build.json +0 -38
  160. package/android/.cxx/Debug/6t29645j/x86_64/android_gradle_build_mini.json +0 -27
  161. package/android/.cxx/Debug/6t29645j/x86_64/build.ninja +0 -158
  162. package/android/.cxx/Debug/6t29645j/x86_64/build_file_index.txt +0 -1
  163. package/android/.cxx/Debug/6t29645j/x86_64/cmake_install.cmake +0 -54
  164. package/android/.cxx/Debug/6t29645j/x86_64/compile_commands.json +0 -12
  165. package/android/.cxx/Debug/6t29645j/x86_64/compile_commands.json.bin +0 -0
  166. package/android/.cxx/Debug/6t29645j/x86_64/configure_fingerprint.bin +0 -28
  167. package/android/.cxx/Debug/6t29645j/x86_64/metadata_generation_command.txt +0 -19
  168. package/android/.cxx/Debug/6t29645j/x86_64/prefab_config.json +0 -4
  169. package/android/.cxx/Debug/6t29645j/x86_64/symbol_folder_index.txt +0 -1
  170. package/android/.cxx/tools/debug/arm64-v8a/compile_commands.json +0 -12
  171. package/android/.cxx/tools/debug/armeabi-v7a/compile_commands.json +0 -12
  172. package/android/.cxx/tools/debug/x86/compile_commands.json +0 -12
  173. package/android/.cxx/tools/debug/x86_64/compile_commands.json +0 -12
  174. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/results.bin +0 -1
  175. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/android/support/v4/util/ArrayMap.dex +0 -0
  176. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/BuildConfig.dex +0 -0
  177. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusEngineStore$EngineState.dex +0 -0
  178. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusEngineStore.dex +0 -0
  179. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusNativeEngineModule$1.dex +0 -0
  180. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusNativeEngineModule.dex +0 -0
  181. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusOutline.dex +0 -0
  182. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusOutlineItem.dex +0 -0
  183. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusPackage.dex +0 -0
  184. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusPageView.dex +0 -0
  185. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusPageViewManager.dex +0 -0
  186. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusTextHit.dex +0 -0
  187. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusTextSearch.dex +0 -0
  188. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusTextSelect.dex +0 -0
  189. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusTextSelection.dex +0 -0
  190. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  191. package/android/build/.transforms/b336bac6032a9c6be0544a913e5a030c/results.bin +0 -1
  192. package/android/build/.transforms/b336bac6032a9c6be0544a913e5a030c/transformed/classes/classes_dex/classes.dex +0 -0
  193. package/android/build/generated/source/buildConfig/debug/com/papyrus/engine/BuildConfig.java +0 -10
  194. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -7
  195. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  196. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  197. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  198. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  199. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  200. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  201. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/build_command_papyrus_text.bat +0 -5
  202. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/build_model.json +0 -186
  203. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/build_stderr_papyrus_text.txt +0 -0
  204. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/build_stdout_papyrus_text.txt +0 -2
  205. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_157_timing.txt +0 -8
  206. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_167_timing.txt +0 -8
  207. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_168_timing.txt +0 -14
  208. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_172_timing.txt +0 -8
  209. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_2919_timing.txt +0 -6
  210. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_3311_timing.txt +0 -3
  211. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_450_timing.txt +0 -3
  212. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/metadata_generation_record.json +0 -41
  213. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/build_command_papyrus_text.bat +0 -5
  214. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/build_model.json +0 -186
  215. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/build_stderr_papyrus_text.txt +0 -0
  216. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/build_stdout_papyrus_text.txt +0 -2
  217. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_158_timing.txt +0 -6
  218. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_160_timing.txt +0 -6
  219. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_164_timing.txt +0 -6
  220. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_168_timing.txt +0 -6
  221. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_2922_timing.txt +0 -6
  222. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_3311_timing.txt +0 -3
  223. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_450_timing.txt +0 -3
  224. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/metadata_generation_record.json +0 -41
  225. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/build_command_papyrus_text.bat +0 -5
  226. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/build_model.json +0 -186
  227. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/build_stderr_papyrus_text.txt +0 -0
  228. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/build_stdout_papyrus_text.txt +0 -2
  229. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_160_timing.txt +0 -5
  230. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_164_timing.txt +0 -3
  231. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_168_timing.txt +0 -6
  232. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_170_timing.txt +0 -6
  233. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_2907_timing.txt +0 -6
  234. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_3311_timing.txt +0 -3
  235. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_450_timing.txt +0 -3
  236. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/metadata_generation_record.json +0 -41
  237. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/build_command_papyrus_text.bat +0 -5
  238. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/build_model.json +0 -186
  239. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/build_stderr_papyrus_text.txt +0 -0
  240. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/build_stdout_papyrus_text.txt +0 -2
  241. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_155_timing.txt +0 -6
  242. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_160_timing.txt +0 -6
  243. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_164_timing.txt +0 -3
  244. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_168_timing.txt +0 -6
  245. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_2916_timing.txt +0 -6
  246. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_3311_timing.txt +0 -5
  247. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_450_timing.txt +0 -6
  248. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/metadata_generation_record.json +0 -41
  249. package/android/build/intermediates/cxx/Debug/6t29645j/obj/arm64-v8a/libpapyrus_text.so +0 -0
  250. package/android/build/intermediates/cxx/Debug/6t29645j/obj/armeabi-v7a/libpapyrus_text.so +0 -0
  251. package/android/build/intermediates/cxx/Debug/6t29645j/obj/x86/libpapyrus_text.so +0 -0
  252. package/android/build/intermediates/cxx/Debug/6t29645j/obj/x86_64/libpapyrus_text.so +0 -0
  253. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -1
  254. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  255. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  256. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  257. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
  258. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v4/util/ArrayMap.class +0 -0
  259. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/BuildConfig.class +0 -0
  260. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusEngineStore$EngineState.class +0 -0
  261. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusEngineStore.class +0 -0
  262. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusNativeEngineModule$1.class +0 -0
  263. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusNativeEngineModule.class +0 -0
  264. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusOutline.class +0 -0
  265. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusOutlineItem.class +0 -0
  266. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusPackage.class +0 -0
  267. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusPageView.class +0 -0
  268. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusPageViewManager.class +0 -0
  269. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusTextHit.class +0 -0
  270. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusTextSearch.class +0 -0
  271. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusTextSelect.class +0 -0
  272. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusTextSelection.class +0 -0
  273. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/arm64-v8a/libpapyrus_text.so +0 -0
  274. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/armeabi-v7a/libpapyrus_text.so +0 -0
  275. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86/libpapyrus_text.so +0 -0
  276. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86_64/libpapyrus_text.so +0 -0
  277. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -2
  278. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -7
  279. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -7
  280. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libpapyrus_text.so +0 -0
  281. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libpapyrus_text.so +0 -0
  282. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libpapyrus_text.so +0 -0
  283. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libpapyrus_text.so +0 -0
  284. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  285. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  286. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/android/support/v4/util/ArrayMap.class +0 -0
  287. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/BuildConfig.class +0 -0
  288. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusEngineStore$EngineState.class +0 -0
  289. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusEngineStore.class +0 -0
  290. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusNativeEngineModule$1.class +0 -0
  291. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusNativeEngineModule.class +0 -0
  292. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusOutline.class +0 -0
  293. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusOutlineItem.class +0 -0
  294. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusPackage.class +0 -0
  295. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusPageView.class +0 -0
  296. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusPageViewManager.class +0 -0
  297. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusTextHit.class +0 -0
  298. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusTextSearch.class +0 -0
  299. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusTextSelect.class +0 -0
  300. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusTextSelection.class +0 -0
  301. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  302. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -1
  303. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  304. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PapyrusNativeEngineModule$1.class.uniqueId2 +0 -0
  305. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PapyrusNativeEngineModule.class.uniqueId1 +0 -0
  306. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PapyrusPackage.class.uniqueId0 +0 -0
  307. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
@@ -1,372 +1,447 @@
1
- #import <Foundation/Foundation.h>
2
- #import <React/RCTBridge.h>
3
- #import <React/RCTBridgeModule.h>
4
- #import <React/RCTUIManager.h>
5
- #import <PDFKit/PDFKit.h>
6
-
7
- #import "PapyrusEngineStore.h"
8
- #import "PapyrusPageView.h"
9
-
10
- @interface PapyrusNativeEngine : NSObject <RCTBridgeModule>
11
- @property (nonatomic, weak) RCTBridge *bridge;
12
- @end
13
-
14
- @implementation PapyrusNativeEngine
15
-
16
- RCT_EXPORT_MODULE(PapyrusNativeEngine)
17
-
18
- static NSArray<NSDictionary *> *PapyrusBuildOutlineItems(PDFOutline *outline, PDFDocument *document) {
19
- if (!outline || !document) return @[];
20
-
21
- NSMutableArray<NSDictionary *> *items = [NSMutableArray array];
22
- NSInteger count = outline.numberOfChildren;
23
- for (NSInteger i = 0; i < count; i++) {
24
- PDFOutline *child = [outline childAtIndex:i];
25
- if (!child) continue;
26
-
27
- NSString *title = child.label ?: @"";
28
- NSInteger pageIndex = -1;
29
- PDFDestination *dest = child.destination;
30
- if (!dest && [child.action isKindOfClass:[PDFActionGoTo class]]) {
31
- dest = ((PDFActionGoTo *)child.action).destination;
32
- }
33
- if (dest.page) {
34
- pageIndex = [document indexForPage:dest.page];
35
- }
36
-
37
- NSArray<NSDictionary *> *children = PapyrusBuildOutlineItems(child, document);
38
- NSMutableDictionary *item = [NSMutableDictionary dictionaryWithCapacity:3];
39
- item[@"title"] = title;
40
- item[@"pageIndex"] = @(pageIndex);
41
- if (children.count > 0) {
42
- item[@"children"] = children;
43
- }
44
- [items addObject:item];
45
- }
46
-
47
- return items;
48
- }
49
-
50
- + (BOOL)requiresMainQueueSetup {
51
- return YES;
52
- }
53
-
54
- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(createEngine) {
55
- return [[PapyrusEngineStore shared] createEngine];
56
- }
57
-
58
- RCT_EXPORT_METHOD(destroyEngine:(NSString *)engineId) {
59
- [[PapyrusEngineStore shared] destroyEngine:engineId];
60
- }
61
-
62
- RCT_EXPORT_METHOD(load:(NSString *)engineId
63
- source:(NSDictionary *)source
64
- resolver:(RCTPromiseResolveBlock)resolve
65
- rejecter:(RCTPromiseRejectBlock)reject) {
66
- NSString *uri = source[@"uri"];
67
- id dataObject = source[@"data"];
68
-
69
- void (^loadFromData)(NSData *) = ^(NSData *data) {
70
- PDFDocument *document = [[PDFDocument alloc] initWithData:data];
71
- if (!document) {
72
- reject(@"papyrus_load_failed", @"Failed to open PDF document", nil);
73
- return;
74
- }
75
- [[PapyrusEngineStore shared] setDocument:document forEngine:engineId];
76
- resolve(@{@"pageCount": @(document.pageCount)});
77
- };
78
-
79
- if (uri && [uri isKindOfClass:[NSString class]]) {
80
- NSURL *url = [NSURL URLWithString:uri];
81
- if (!url) {
82
- reject(@"papyrus_invalid_uri", @"Invalid PDF URI", nil);
83
- return;
84
- }
85
-
86
- if ([uri hasPrefix:@"http://"] || [uri hasPrefix:@"https://"]) {
87
- NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
88
- if (error || !data) {
89
- reject(@"papyrus_download_failed", @"Failed to download PDF", error);
90
- return;
91
- }
92
- loadFromData(data);
93
- }];
94
- [task resume];
95
- return;
96
- }
97
-
98
- NSData *data = [NSData dataWithContentsOfURL:url];
99
- if (!data) {
100
- reject(@"papyrus_read_failed", @"Failed to read PDF data from URI", nil);
101
- return;
102
- }
103
- loadFromData(data);
104
- return;
105
- }
106
-
107
- if ([dataObject isKindOfClass:[NSData class]]) {
108
- loadFromData((NSData *)dataObject);
109
- return;
110
- }
111
-
112
- if ([dataObject isKindOfClass:[NSArray class]]) {
113
- NSArray *array = (NSArray *)dataObject;
114
- NSUInteger length = array.count;
115
- NSMutableData *data = [NSMutableData dataWithLength:length];
116
- uint8_t *bytes = (uint8_t *)data.mutableBytes;
117
- for (NSUInteger i = 0; i < length; i++) {
118
- bytes[i] = (uint8_t)[array[i] intValue];
119
- }
120
- loadFromData(data);
121
- return;
122
- }
123
-
124
- reject(@"papyrus_invalid_source", @"Unsupported PDF source", nil);
125
- }
126
-
127
- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getPageCount:(NSString *)engineId) {
128
- PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
129
- if (!document) return @(0);
130
- return @(document.pageCount);
131
- }
132
-
133
- RCT_EXPORT_METHOD(renderPage:(NSString *)engineId
134
- pageIndex:(NSInteger)pageIndex
135
- target:(NSNumber *)target
136
- scale:(CGFloat)scale
137
- zoom:(CGFloat)zoom
138
- rotation:(NSInteger)rotation) {
139
- dispatch_async(dispatch_get_main_queue(), ^{
140
- PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
141
- UIView *view = [self.bridge.uiManager viewForReactTag:target];
142
- if ([view isKindOfClass:[PapyrusPageView class]]) {
143
- PapyrusPageView *pageView = (PapyrusPageView *)view;
144
- [pageView renderWithDocument:document pageIndex:pageIndex scale:scale zoom:zoom rotation:rotation];
145
- }
146
- });
147
- }
148
-
149
- RCT_EXPORT_METHOD(renderTextLayer:(NSString *)engineId
150
- pageIndex:(NSInteger)pageIndex
151
- target:(NSNumber *)target
152
- scale:(CGFloat)scale
153
- zoom:(CGFloat)zoom
154
- rotation:(NSInteger)rotation) {
155
- #pragma unused(engineId, pageIndex, target, scale, zoom, rotation)
156
- }
157
-
158
- RCT_EXPORT_METHOD(getTextContent:(NSString *)engineId
159
- pageIndex:(NSInteger)pageIndex
160
- resolver:(RCTPromiseResolveBlock)resolve
161
- rejecter:(RCTPromiseRejectBlock)reject) {
162
- PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
163
- PDFPage *page = [document pageAtIndex:pageIndex];
164
- if (!page) {
165
- resolve(@[]);
166
- return;
167
- }
168
-
169
- PDFSelection *selection = [page selectionForWholePage];
170
- if (!selection) {
171
- resolve(@[]);
172
- return;
173
- }
174
-
175
- NSArray<PDFSelection *> *lines = [selection selectionsByLine];
176
- if (!lines || lines.count == 0) {
177
- lines = @[selection];
178
- }
179
-
180
- NSMutableArray *items = [NSMutableArray arrayWithCapacity:lines.count];
181
- for (PDFSelection *line in lines) {
182
- NSString *text = line.string ?: @"";
183
- if (text.length == 0) continue;
184
- CGRect bounds = [line boundsForPage:page];
185
- NSDictionary *item = @{
186
- @"str": text,
187
- @"dir": @"ltr",
188
- @"width": @(bounds.size.width),
189
- @"height": @(bounds.size.height),
190
- @"transform": @[@1, @0, @0, @1, @(bounds.origin.x), @(bounds.origin.y)],
191
- @"fontName": @""
192
- };
193
- [items addObject:item];
194
- }
195
-
196
- resolve(items);
197
- }
198
-
199
- RCT_EXPORT_METHOD(getPageDimensions:(NSString *)engineId
200
- pageIndex:(NSInteger)pageIndex
201
- resolver:(RCTPromiseResolveBlock)resolve
202
- rejecter:(RCTPromiseRejectBlock)reject) {
203
- PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
204
- PDFPage *page = [document pageAtIndex:pageIndex];
205
- if (!page) {
206
- resolve(@{@"width": @(0), @"height": @(0)});
207
- return;
208
- }
209
- CGRect box = [page boundsForBox:kPDFDisplayBoxMediaBox];
210
- resolve(@{@"width": @(box.size.width), @"height": @(box.size.height)});
211
- }
212
-
213
- RCT_EXPORT_METHOD(getOutline:(NSString *)engineId
214
- resolver:(RCTPromiseResolveBlock)resolve
215
- rejecter:(RCTPromiseRejectBlock)reject) {
216
- PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
217
- if (!document) {
218
- resolve(@[]);
219
- return;
220
- }
221
-
222
- PDFOutline *root = document.outlineRoot;
223
- if (!root) {
224
- resolve(@[]);
225
- return;
226
- }
227
-
228
- resolve(PapyrusBuildOutlineItems(root, document));
229
- }
230
-
231
- RCT_EXPORT_METHOD(getPageIndex:(NSString *)engineId
232
- dest:(id)dest
233
- resolver:(RCTPromiseResolveBlock)resolve
234
- rejecter:(RCTPromiseRejectBlock)reject) {
235
- #pragma unused(engineId, dest)
236
- resolve([NSNull null]);
237
- }
238
-
239
- RCT_EXPORT_METHOD(searchText:(NSString *)engineId
240
- query:(NSString *)query
241
- resolver:(RCTPromiseResolveBlock)resolve
242
- rejecter:(RCTPromiseRejectBlock)reject) {
243
- PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
244
- if (!document || !query || query.length < 2) {
245
- resolve(@[]);
246
- return;
247
- }
248
-
249
- NSArray<PDFSelection *> *matches = [document findString:query withOptions:NSCaseInsensitiveSearch];
250
- if (!matches || matches.count == 0) {
251
- resolve(@[]);
252
- return;
253
- }
254
-
255
- NSMutableDictionary<NSNumber *, NSNumber *> *pageCounts = [NSMutableDictionary dictionary];
256
- NSMutableArray *results = [NSMutableArray arrayWithCapacity:matches.count];
257
-
258
- for (PDFSelection *selection in matches) {
259
- NSArray<PDFPage *> *pages = selection.pages;
260
- PDFPage *page = pages.firstObject;
261
- if (!page) continue;
262
-
263
- NSInteger pageIndex = [document indexForPage:page];
264
- NSNumber *pageKey = @(pageIndex);
265
- NSInteger matchIndex = [pageCounts[pageKey] integerValue];
266
- pageCounts[pageKey] = @(matchIndex + 1);
267
-
268
- CGRect pageBounds = [page boundsForBox:kPDFDisplayBoxMediaBox];
269
- CGFloat pageWidth = pageBounds.size.width;
270
- CGFloat pageHeight = pageBounds.size.height;
271
-
272
- NSArray<PDFSelection *> *lineSelections = [selection selectionsByLine];
273
- if (!lineSelections || lineSelections.count == 0) {
274
- lineSelections = @[selection];
275
- }
276
-
277
- NSMutableArray *rects = [NSMutableArray arrayWithCapacity:lineSelections.count];
278
- for (PDFSelection *line in lineSelections) {
279
- CGRect bounds = [line boundsForPage:page];
280
- if (CGRectIsEmpty(bounds) || pageWidth <= 0 || pageHeight <= 0) continue;
281
-
282
- CGFloat topLeftY = pageHeight - (bounds.origin.y + bounds.size.height);
283
- NSDictionary *rect = @{
284
- @"x": @(bounds.origin.x / pageWidth),
285
- @"y": @(topLeftY / pageHeight),
286
- @"width": @(bounds.size.width / pageWidth),
287
- @"height": @(bounds.size.height / pageHeight)
288
- };
289
- [rects addObject:rect];
290
- }
291
-
292
- NSDictionary *result = @{
293
- @"pageIndex": @(pageIndex),
294
- @"text": selection.string ?: @"",
295
- @"matchIndex": @(matchIndex),
296
- @"rects": rects
297
- };
298
- [results addObject:result];
299
- }
300
-
301
- resolve(results);
302
- }
303
-
304
- RCT_EXPORT_METHOD(selectText:(NSString *)engineId
305
- pageIndex:(NSInteger)pageIndex
306
- x:(CGFloat)x
307
- y:(CGFloat)y
308
- width:(CGFloat)width
309
- height:(CGFloat)height
310
- resolver:(RCTPromiseResolveBlock)resolve
311
- rejecter:(RCTPromiseRejectBlock)reject) {
312
- PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
313
- if (!document || pageIndex < 0 || width <= 0 || height <= 0) {
314
- resolve([NSNull null]);
315
- return;
316
- }
317
-
318
- PDFPage *page = [document pageAtIndex:pageIndex];
319
- if (!page) {
320
- resolve([NSNull null]);
321
- return;
322
- }
323
-
324
- CGRect pageBounds = [page boundsForBox:kPDFDisplayBoxMediaBox];
325
- CGFloat pageWidth = pageBounds.size.width;
326
- CGFloat pageHeight = pageBounds.size.height;
327
- if (pageWidth <= 0 || pageHeight <= 0) {
328
- resolve([NSNull null]);
329
- return;
330
- }
331
-
332
- CGFloat rectX = x * pageWidth;
333
- CGFloat rectW = width * pageWidth;
334
- CGFloat rectH = height * pageHeight;
335
- CGFloat rectTop = y * pageHeight;
336
- CGFloat rectY = pageHeight - rectTop - rectH;
337
- CGRect selectionRect = CGRectMake(rectX, rectY, rectW, rectH);
338
-
339
- PDFSelection *selection = [page selectionForRect:selectionRect];
340
- if (!selection) {
341
- resolve([NSNull null]);
342
- return;
343
- }
344
-
345
- NSArray<PDFSelection *> *lineSelections = [selection selectionsByLine];
346
- if (!lineSelections || lineSelections.count == 0) {
347
- lineSelections = @[selection];
348
- }
349
-
350
- NSMutableArray *rects = [NSMutableArray arrayWithCapacity:lineSelections.count];
351
- for (PDFSelection *line in lineSelections) {
352
- CGRect bounds = [line boundsForPage:page];
353
- if (CGRectIsEmpty(bounds)) continue;
354
-
355
- CGFloat topLeftY = pageHeight - (bounds.origin.y + bounds.size.height);
356
- NSDictionary *rect = @{
357
- @"x": @(bounds.origin.x / pageWidth),
358
- @"y": @(topLeftY / pageHeight),
359
- @"width": @(bounds.size.width / pageWidth),
360
- @"height": @(bounds.size.height / pageHeight)
361
- };
362
- [rects addObject:rect];
363
- }
364
-
365
- NSDictionary *result = @{
366
- @"text": selection.string ?: @"",
367
- @"rects": rects
368
- };
369
- resolve(result);
370
- }
371
-
372
- @end
1
+ #import <Foundation/Foundation.h>
2
+ #import <React/RCTBridge.h>
3
+ #import <React/RCTBridgeModule.h>
4
+ #import <React/RCTUIManager.h>
5
+ #import <PDFKit/PDFKit.h>
6
+
7
+ #import "PapyrusEngineStore.h"
8
+ #import "PapyrusPageView.h"
9
+
10
+ NS_ASSUME_NONNULL_BEGIN
11
+
12
+ @interface PapyrusNativeEngine : NSObject <RCTBridgeModule>
13
+ @property (nonatomic, weak) RCTBridge *bridge;
14
+ @end
15
+
16
+ NS_ASSUME_NONNULL_END
17
+
18
+ @implementation PapyrusNativeEngine
19
+
20
+ RCT_EXPORT_MODULE(PapyrusNativeEngine)
21
+
22
+ static NSMutableDictionary<NSString *, NSNumber *> *PapyrusPageViewTags;
23
+
24
+ static NSString *PapyrusViewKeyFor(NSString *engineId, NSInteger pageIndex) {
25
+ return [NSString stringWithFormat:@"%@:%ld", engineId ?: @"", (long)pageIndex];
26
+ }
27
+
28
+ static void PapyrusEnsureViewTagStore(void) {
29
+ static dispatch_once_t onceToken;
30
+ dispatch_once(&onceToken, ^{
31
+ PapyrusPageViewTags = [NSMutableDictionary dictionary];
32
+ });
33
+ }
34
+
35
+ static void PapyrusSyncOnMain(void (^block)(void)) {
36
+ if ([NSThread isMainThread]) {
37
+ block();
38
+ } else {
39
+ dispatch_sync(dispatch_get_main_queue(), block);
40
+ }
41
+ }
42
+
43
+ static NSArray<NSDictionary *> *PapyrusBuildOutlineItems(PDFOutline *outline, PDFDocument *document) {
44
+ if (!outline || !document) return @[];
45
+
46
+ NSMutableArray<NSDictionary *> *items = [NSMutableArray array];
47
+ NSInteger count = outline.numberOfChildren;
48
+ for (NSInteger i = 0; i < count; i++) {
49
+ PDFOutline *child = [outline childAtIndex:i];
50
+ if (!child) continue;
51
+
52
+ NSString *title = child.label ?: @"";
53
+ NSInteger pageIndex = -1;
54
+ PDFDestination *dest = child.destination;
55
+ if (!dest && [child.action isKindOfClass:[PDFActionGoTo class]]) {
56
+ dest = ((PDFActionGoTo *)child.action).destination;
57
+ }
58
+ if (dest.page) {
59
+ pageIndex = [document indexForPage:dest.page];
60
+ }
61
+
62
+ NSArray<NSDictionary *> *children = PapyrusBuildOutlineItems(child, document);
63
+ NSMutableDictionary *item = [NSMutableDictionary dictionaryWithCapacity:3];
64
+ item[@"title"] = title;
65
+ item[@"pageIndex"] = @(pageIndex);
66
+ if (children.count > 0) {
67
+ item[@"children"] = children;
68
+ }
69
+ [items addObject:item];
70
+ }
71
+
72
+ return items;
73
+ }
74
+
75
+ + (BOOL)requiresMainQueueSetup {
76
+ return YES;
77
+ }
78
+
79
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(createEngine) {
80
+ return [[PapyrusEngineStore shared] createEngine];
81
+ }
82
+
83
+ RCT_EXPORT_METHOD(destroyEngine:(NSString *)engineId) {
84
+ [[PapyrusEngineStore shared] destroyEngine:engineId];
85
+ }
86
+
87
+ RCT_EXPORT_METHOD(load:(NSString *)engineId
88
+ source:(NSDictionary *)source
89
+ resolver:(RCTPromiseResolveBlock)resolve
90
+ rejecter:(RCTPromiseRejectBlock)reject) {
91
+ NSString *uri = source[@"uri"];
92
+ id dataObject = source[@"data"];
93
+
94
+ void (^loadFromData)(NSData *) = ^(NSData *data) {
95
+ PDFDocument *document = [[PDFDocument alloc] initWithData:data];
96
+ if (!document) {
97
+ reject(@"papyrus_load_failed", @"Failed to open PDF document", nil);
98
+ return;
99
+ }
100
+ [[PapyrusEngineStore shared] setDocument:document forEngine:engineId];
101
+ resolve(@{@"pageCount": @(document.pageCount)});
102
+ };
103
+
104
+ if (uri && [uri isKindOfClass:[NSString class]]) {
105
+ NSURL *url = [NSURL URLWithString:uri];
106
+ if (!url) {
107
+ reject(@"papyrus_invalid_uri", @"Invalid PDF URI", nil);
108
+ return;
109
+ }
110
+
111
+ if ([uri hasPrefix:@"http://"] || [uri hasPrefix:@"https://"]) {
112
+ NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
113
+ if (error || !data) {
114
+ reject(@"papyrus_download_failed", @"Failed to download PDF", error);
115
+ return;
116
+ }
117
+ loadFromData(data);
118
+ }];
119
+ [task resume];
120
+ return;
121
+ }
122
+
123
+ NSData *data = [NSData dataWithContentsOfURL:url];
124
+ if (!data) {
125
+ reject(@"papyrus_read_failed", @"Failed to read PDF data from URI", nil);
126
+ return;
127
+ }
128
+ loadFromData(data);
129
+ return;
130
+ }
131
+
132
+ if ([dataObject isKindOfClass:[NSData class]]) {
133
+ loadFromData((NSData *)dataObject);
134
+ return;
135
+ }
136
+
137
+ if ([dataObject isKindOfClass:[NSArray class]]) {
138
+ NSArray *array = (NSArray *)dataObject;
139
+ NSUInteger length = array.count;
140
+ NSMutableData *data = [NSMutableData dataWithLength:length];
141
+ uint8_t *bytes = (uint8_t *)data.mutableBytes;
142
+ for (NSUInteger i = 0; i < length; i++) {
143
+ bytes[i] = (uint8_t)[array[i] intValue];
144
+ }
145
+ loadFromData(data);
146
+ return;
147
+ }
148
+
149
+ reject(@"papyrus_invalid_source", @"Unsupported PDF source", nil);
150
+ }
151
+
152
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getPageCount:(NSString *)engineId) {
153
+ PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
154
+ if (!document) return @(0);
155
+ return @(document.pageCount);
156
+ }
157
+
158
+ RCT_EXPORT_METHOD(renderPage:(NSString *)engineId
159
+ pageIndex:(NSInteger)pageIndex
160
+ target:(nonnull NSNumber *)target
161
+ scale:(CGFloat)scale
162
+ zoom:(CGFloat)zoom
163
+ rotation:(NSInteger)rotation) {
164
+ dispatch_async(dispatch_get_main_queue(), ^{
165
+ PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
166
+ UIView *view = [self.bridge.uiManager viewForReactTag:target];
167
+ if ([view isKindOfClass:[PapyrusPageView class]]) {
168
+ PapyrusPageView *pageView = (PapyrusPageView *)view;
169
+ PapyrusEnsureViewTagStore();
170
+ NSString *key = PapyrusViewKeyFor(engineId, pageIndex);
171
+ @synchronized (PapyrusPageViewTags) {
172
+ PapyrusPageViewTags[key] = target;
173
+ }
174
+ [pageView renderWithDocument:document pageIndex:pageIndex scale:scale zoom:zoom rotation:rotation];
175
+ }
176
+ });
177
+ }
178
+
179
+ RCT_EXPORT_METHOD(renderTextLayer:(NSString *)engineId
180
+ pageIndex:(NSInteger)pageIndex
181
+ target:(nonnull NSNumber *)target
182
+ scale:(CGFloat)scale
183
+ zoom:(CGFloat)zoom
184
+ rotation:(NSInteger)rotation) {
185
+ #pragma unused(engineId, pageIndex, target, scale, zoom, rotation)
186
+ }
187
+
188
+ RCT_EXPORT_METHOD(getTextContent:(NSString *)engineId
189
+ pageIndex:(NSInteger)pageIndex
190
+ resolver:(RCTPromiseResolveBlock)resolve
191
+ rejecter:(RCTPromiseRejectBlock)reject) {
192
+ PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
193
+ PDFPage *page = [document pageAtIndex:pageIndex];
194
+ if (!page) {
195
+ resolve(@[]);
196
+ return;
197
+ }
198
+
199
+ CGRect pageBounds = [page boundsForBox:kPDFDisplayBoxCropBox];
200
+ PDFSelection *selection = [page selectionForRect:pageBounds];
201
+ if (!selection) {
202
+ resolve(@[]);
203
+ return;
204
+ }
205
+
206
+ NSArray<PDFSelection *> *lines = [selection selectionsByLine];
207
+ if (!lines || lines.count == 0) {
208
+ lines = @[selection];
209
+ }
210
+
211
+ NSMutableArray *items = [NSMutableArray arrayWithCapacity:lines.count];
212
+ for (PDFSelection *line in lines) {
213
+ NSString *text = line.string ?: @"";
214
+ if (text.length == 0) continue;
215
+ CGRect bounds = [line boundsForPage:page];
216
+ NSDictionary *item = @{
217
+ @"str": text,
218
+ @"dir": @"ltr",
219
+ @"width": @(bounds.size.width),
220
+ @"height": @(bounds.size.height),
221
+ @"transform": @[@1, @0, @0, @1, @(bounds.origin.x), @(bounds.origin.y)],
222
+ @"fontName": @""
223
+ };
224
+ [items addObject:item];
225
+ }
226
+
227
+ resolve(items);
228
+ }
229
+
230
+ RCT_EXPORT_METHOD(getPageDimensions:(NSString *)engineId
231
+ pageIndex:(NSInteger)pageIndex
232
+ resolver:(RCTPromiseResolveBlock)resolve
233
+ rejecter:(RCTPromiseRejectBlock)reject) {
234
+ PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
235
+ PDFPage *page = [document pageAtIndex:pageIndex];
236
+ if (!page) {
237
+ resolve(@{@"width": @(0), @"height": @(0)});
238
+ return;
239
+ }
240
+ CGRect box = [page boundsForBox:kPDFDisplayBoxCropBox];
241
+ resolve(@{@"width": @(box.size.width), @"height": @(box.size.height)});
242
+ }
243
+
244
+ RCT_EXPORT_METHOD(getOutline:(NSString *)engineId
245
+ resolver:(RCTPromiseResolveBlock)resolve
246
+ rejecter:(RCTPromiseRejectBlock)reject) {
247
+ PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
248
+ if (!document) {
249
+ resolve(@[]);
250
+ return;
251
+ }
252
+
253
+ PDFOutline *root = document.outlineRoot;
254
+ if (!root) {
255
+ resolve(@[]);
256
+ return;
257
+ }
258
+
259
+ resolve(PapyrusBuildOutlineItems(root, document));
260
+ }
261
+
262
+ RCT_EXPORT_METHOD(getPageIndex:(NSString *)engineId
263
+ dest:(id)dest
264
+ resolver:(RCTPromiseResolveBlock)resolve
265
+ rejecter:(RCTPromiseRejectBlock)reject) {
266
+ #pragma unused(engineId, dest)
267
+ resolve([NSNull null]);
268
+ }
269
+
270
+ RCT_EXPORT_METHOD(searchText:(NSString *)engineId
271
+ query:(NSString *)query
272
+ resolver:(RCTPromiseResolveBlock)resolve
273
+ rejecter:(RCTPromiseRejectBlock)reject) {
274
+ PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
275
+ if (!document || !query || query.length < 2) {
276
+ resolve(@[]);
277
+ return;
278
+ }
279
+
280
+ NSArray<PDFSelection *> *matches = [document findString:query withOptions:NSCaseInsensitiveSearch];
281
+ if (!matches || matches.count == 0) {
282
+ resolve(@[]);
283
+ return;
284
+ }
285
+
286
+ NSMutableDictionary<NSNumber *, NSNumber *> *pageCounts = [NSMutableDictionary dictionary];
287
+ NSMutableArray *results = [NSMutableArray arrayWithCapacity:matches.count];
288
+
289
+ for (PDFSelection *selection in matches) {
290
+ NSArray<PDFPage *> *pages = selection.pages;
291
+ PDFPage *page = pages.firstObject;
292
+ if (!page) continue;
293
+
294
+ NSInteger pageIndex = [document indexForPage:page];
295
+ NSNumber *pageKey = @(pageIndex);
296
+ NSInteger matchIndex = [pageCounts[pageKey] integerValue];
297
+ pageCounts[pageKey] = @(matchIndex + 1);
298
+
299
+ CGRect pageBounds = [page boundsForBox:kPDFDisplayBoxCropBox];
300
+ CGFloat pageWidth = pageBounds.size.width;
301
+ CGFloat pageHeight = pageBounds.size.height;
302
+ CGFloat pageOriginX = pageBounds.origin.x;
303
+ CGFloat pageOriginY = pageBounds.origin.y;
304
+
305
+ NSArray<PDFSelection *> *lineSelections = [selection selectionsByLine];
306
+ if (!lineSelections || lineSelections.count == 0) {
307
+ lineSelections = @[selection];
308
+ }
309
+
310
+ NSMutableArray *rects = [NSMutableArray arrayWithCapacity:lineSelections.count];
311
+ for (PDFSelection *line in lineSelections) {
312
+ CGRect bounds = [line boundsForPage:page];
313
+ if (CGRectIsEmpty(bounds) || pageWidth <= 0 || pageHeight <= 0) continue;
314
+
315
+ CGFloat topLeftY = (pageOriginY + pageHeight) - (bounds.origin.y + bounds.size.height);
316
+ NSDictionary *rect = @{
317
+ @"x": @((bounds.origin.x - pageOriginX) / pageWidth),
318
+ @"y": @(topLeftY / pageHeight),
319
+ @"width": @(bounds.size.width / pageWidth),
320
+ @"height": @(bounds.size.height / pageHeight)
321
+ };
322
+ [rects addObject:rect];
323
+ }
324
+
325
+ NSDictionary *result = @{
326
+ @"pageIndex": @(pageIndex),
327
+ @"text": selection.string ?: @"",
328
+ @"matchIndex": @(matchIndex),
329
+ @"rects": rects
330
+ };
331
+ [results addObject:result];
332
+ }
333
+
334
+ resolve(results);
335
+ }
336
+
337
+ RCT_EXPORT_METHOD(selectText:(NSString *)engineId
338
+ pageIndex:(NSInteger)pageIndex
339
+ x:(CGFloat)x
340
+ y:(CGFloat)y
341
+ width:(CGFloat)width
342
+ height:(CGFloat)height
343
+ resolver:(RCTPromiseResolveBlock)resolve
344
+ rejecter:(RCTPromiseRejectBlock)reject) {
345
+ PDFDocument *document = [[PapyrusEngineStore shared] documentForEngine:engineId];
346
+ if (!document || pageIndex < 0 || width <= 0 || height <= 0) {
347
+ resolve([NSNull null]);
348
+ return;
349
+ }
350
+
351
+ PDFPage *page = [document pageAtIndex:pageIndex];
352
+ if (!page) {
353
+ resolve([NSNull null]);
354
+ return;
355
+ }
356
+
357
+ CGRect pageBounds = [page boundsForBox:kPDFDisplayBoxCropBox];
358
+ CGFloat pageWidth = pageBounds.size.width;
359
+ CGFloat pageHeight = pageBounds.size.height;
360
+ CGFloat pageOriginX = pageBounds.origin.x;
361
+ CGFloat pageOriginY = pageBounds.origin.y;
362
+ if (pageWidth <= 0 || pageHeight <= 0) {
363
+ resolve([NSNull null]);
364
+ return;
365
+ }
366
+
367
+ CGRect selectionRect = CGRectZero;
368
+ __block PapyrusPageView *pageView = nil;
369
+ __block CGSize viewSize = CGSizeZero;
370
+ PapyrusEnsureViewTagStore();
371
+ NSString *key = PapyrusViewKeyFor(engineId, pageIndex);
372
+ NSNumber *viewTag = nil;
373
+ @synchronized (PapyrusPageViewTags) {
374
+ viewTag = PapyrusPageViewTags[key];
375
+ }
376
+
377
+ if (viewTag) {
378
+ PapyrusSyncOnMain(^{
379
+ UIView *view = [self.bridge.uiManager viewForReactTag:viewTag];
380
+ if ([view isKindOfClass:[PapyrusPageView class]]) {
381
+ pageView = (PapyrusPageView *)view;
382
+ viewSize = pageView.bounds.size;
383
+ }
384
+ });
385
+ }
386
+
387
+ if (pageView && viewSize.width > 0 && viewSize.height > 0) {
388
+ CGFloat rectX = x * viewSize.width;
389
+ CGFloat rectY = y * viewSize.height;
390
+ CGFloat rectW = width * viewSize.width;
391
+ CGFloat rectH = height * viewSize.height;
392
+ CGRect viewRect = CGRectMake(rectX, rectY, rectW, rectH);
393
+ selectionRect = [pageView convertRectToPage:viewRect page:page];
394
+ } else {
395
+ CGFloat rectX = pageOriginX + (x * pageWidth);
396
+ CGFloat rectW = width * pageWidth;
397
+ CGFloat rectH = height * pageHeight;
398
+ CGFloat rectTop = y * pageHeight;
399
+ CGFloat rectY = pageOriginY + (pageHeight - rectTop - rectH);
400
+ selectionRect = CGRectMake(rectX, rectY, rectW, rectH);
401
+ }
402
+
403
+ PDFSelection *selection = [page selectionForRect:selectionRect];
404
+ if (!selection) {
405
+ resolve([NSNull null]);
406
+ return;
407
+ }
408
+
409
+ NSArray<PDFSelection *> *lineSelections = [selection selectionsByLine];
410
+ if (!lineSelections || lineSelections.count == 0) {
411
+ lineSelections = @[selection];
412
+ }
413
+
414
+ NSMutableArray *rects = [NSMutableArray arrayWithCapacity:lineSelections.count];
415
+ for (PDFSelection *line in lineSelections) {
416
+ CGRect bounds = [line boundsForPage:page];
417
+ if (CGRectIsEmpty(bounds)) continue;
418
+
419
+ NSDictionary *rect = nil;
420
+ if (pageView && viewSize.width > 0 && viewSize.height > 0) {
421
+ CGRect viewBounds = [pageView convertRectFromPage:bounds page:page];
422
+ rect = @{
423
+ @"x": @(viewBounds.origin.x / viewSize.width),
424
+ @"y": @(viewBounds.origin.y / viewSize.height),
425
+ @"width": @(viewBounds.size.width / viewSize.width),
426
+ @"height": @(viewBounds.size.height / viewSize.height)
427
+ };
428
+ } else {
429
+ CGFloat topLeftY = (pageOriginY + pageHeight) - (bounds.origin.y + bounds.size.height);
430
+ rect = @{
431
+ @"x": @((bounds.origin.x - pageOriginX) / pageWidth),
432
+ @"y": @(topLeftY / pageHeight),
433
+ @"width": @(bounds.size.width / pageWidth),
434
+ @"height": @(bounds.size.height / pageHeight)
435
+ };
436
+ }
437
+ [rects addObject:rect];
438
+ }
439
+
440
+ NSDictionary *result = @{
441
+ @"text": selection.string ?: @"",
442
+ @"rects": rects
443
+ };
444
+ resolve(result);
445
+ }
446
+
447
+ @end