@papyrus-sdk/engine-native 0.1.0 → 0.1.2

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 (323) hide show
  1. package/android/build.gradle +40 -40
  2. package/android/src/main/AndroidManifest.xml +3 -3
  3. package/android/src/main/java/com/papyrus/engine/PapyrusEngineStore.java +71 -71
  4. package/android/src/main/java/com/papyrus/engine/PapyrusNativeEngineModule.java +529 -529
  5. package/android/src/main/java/com/papyrus/engine/PapyrusNativeEngineModule.kt +540 -0
  6. package/android/src/main/java/com/papyrus/engine/PapyrusOutline.java +20 -20
  7. package/android/src/main/java/com/papyrus/engine/PapyrusOutlineItem.java +13 -13
  8. package/android/src/main/java/com/papyrus/engine/PapyrusPackage.java +24 -24
  9. package/android/src/main/java/com/papyrus/engine/PapyrusPageView.java +86 -86
  10. package/android/src/main/java/com/papyrus/engine/PapyrusPageViewManager.java +16 -16
  11. package/android/src/main/java/com/papyrus/engine/PapyrusPageViewModule.kt +12 -0
  12. package/android/src/main/java/com/papyrus/engine/PapyrusTextHit.java +15 -15
  13. package/android/src/main/java/com/papyrus/engine/PapyrusTextSearch.java +20 -20
  14. package/android/src/main/java/com/papyrus/engine/PapyrusTextSelect.java +20 -20
  15. package/android/src/main/java/com/papyrus/engine/PapyrusTextSelection.java +11 -11
  16. package/dist/index.d.mts +95 -7
  17. package/dist/index.d.ts +95 -7
  18. package/dist/index.js +683 -12
  19. package/dist/index.js.map +1 -1
  20. package/dist/index.mjs +684 -13
  21. package/dist/index.mjs.map +1 -1
  22. package/ios/PapyrusNativeEngine.m +447 -372
  23. package/ios/PapyrusNativeEngine.podspec +15 -15
  24. package/ios/PapyrusPageView.h +19 -16
  25. package/ios/PapyrusPageView.m +63 -54
  26. package/ios/PapyrusPageViewManager.m +19 -19
  27. package/package.json +11 -7
  28. package/react-native.config.js +10 -10
  29. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  30. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  31. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  32. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/cache-v2-55a2e41fcdfef7f23046.json +0 -1323
  33. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-ce719ceafe10fdc060d9.json +0 -184
  34. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-ba59984c0779dea51592.json +0 -60
  35. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +0 -14
  36. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/index-2025-12-22T13-33-34-0909.json +0 -92
  37. package/android/.cxx/Debug/6t29645j/arm64-v8a/.cmake/api/v1/reply/target-papyrus_text-Debug-29cd4996bc13fe24a65c.json +0 -168
  38. package/android/.cxx/Debug/6t29645j/arm64-v8a/.ninja_deps +0 -0
  39. package/android/.cxx/Debug/6t29645j/arm64-v8a/.ninja_log +0 -20
  40. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeCache.txt +0 -400
  41. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +0 -72
  42. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +0 -83
  43. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  44. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  45. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +0 -15
  46. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +0 -803
  47. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  48. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  49. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  50. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/CMakeOutput.log +0 -264
  51. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/TargetDirectories.txt +0 -3
  52. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/cmake.check_cache +0 -1
  53. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/papyrus_text.dir/papyrus_outline.cpp.o +0 -0
  54. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/papyrus_text.dir/papyrus_text_search.cpp.o +0 -0
  55. package/android/.cxx/Debug/6t29645j/arm64-v8a/CMakeFiles/rules.ninja +0 -64
  56. package/android/.cxx/Debug/6t29645j/arm64-v8a/additional_project_files.txt +0 -0
  57. package/android/.cxx/Debug/6t29645j/arm64-v8a/android_gradle_build.json +0 -38
  58. package/android/.cxx/Debug/6t29645j/arm64-v8a/android_gradle_build_mini.json +0 -27
  59. package/android/.cxx/Debug/6t29645j/arm64-v8a/build.ninja +0 -158
  60. package/android/.cxx/Debug/6t29645j/arm64-v8a/build_file_index.txt +0 -1
  61. package/android/.cxx/Debug/6t29645j/arm64-v8a/cmake_install.cmake +0 -54
  62. package/android/.cxx/Debug/6t29645j/arm64-v8a/compile_commands.json +0 -12
  63. package/android/.cxx/Debug/6t29645j/arm64-v8a/compile_commands.json.bin +0 -0
  64. package/android/.cxx/Debug/6t29645j/arm64-v8a/configure_fingerprint.bin +0 -28
  65. package/android/.cxx/Debug/6t29645j/arm64-v8a/metadata_generation_command.txt +0 -19
  66. package/android/.cxx/Debug/6t29645j/arm64-v8a/prefab_config.json +0 -4
  67. package/android/.cxx/Debug/6t29645j/arm64-v8a/symbol_folder_index.txt +0 -1
  68. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  69. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  70. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  71. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/cache-v2-7f933b968e76d6ce336c.json +0 -1323
  72. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-439d2bc9e04bf2a43452.json +0 -184
  73. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-efc4cfee3dc3a5ec05be.json +0 -60
  74. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +0 -14
  75. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/index-2025-12-22T13-33-36-0881.json +0 -92
  76. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.cmake/api/v1/reply/target-papyrus_text-Debug-e3f83458cbaf3644c279.json +0 -168
  77. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.ninja_deps +0 -0
  78. package/android/.cxx/Debug/6t29645j/armeabi-v7a/.ninja_log +0 -20
  79. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeCache.txt +0 -400
  80. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +0 -72
  81. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +0 -83
  82. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  83. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  84. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +0 -15
  85. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +0 -803
  86. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  87. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  88. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  89. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/CMakeOutput.log +0 -268
  90. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/TargetDirectories.txt +0 -3
  91. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/cmake.check_cache +0 -1
  92. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/papyrus_text.dir/papyrus_outline.cpp.o +0 -0
  93. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/papyrus_text.dir/papyrus_text_search.cpp.o +0 -0
  94. package/android/.cxx/Debug/6t29645j/armeabi-v7a/CMakeFiles/rules.ninja +0 -64
  95. package/android/.cxx/Debug/6t29645j/armeabi-v7a/additional_project_files.txt +0 -0
  96. package/android/.cxx/Debug/6t29645j/armeabi-v7a/android_gradle_build.json +0 -38
  97. package/android/.cxx/Debug/6t29645j/armeabi-v7a/android_gradle_build_mini.json +0 -27
  98. package/android/.cxx/Debug/6t29645j/armeabi-v7a/build.ninja +0 -158
  99. package/android/.cxx/Debug/6t29645j/armeabi-v7a/build_file_index.txt +0 -1
  100. package/android/.cxx/Debug/6t29645j/armeabi-v7a/cmake_install.cmake +0 -54
  101. package/android/.cxx/Debug/6t29645j/armeabi-v7a/compile_commands.json +0 -12
  102. package/android/.cxx/Debug/6t29645j/armeabi-v7a/compile_commands.json.bin +0 -0
  103. package/android/.cxx/Debug/6t29645j/armeabi-v7a/configure_fingerprint.bin +0 -28
  104. package/android/.cxx/Debug/6t29645j/armeabi-v7a/metadata_generation_command.txt +0 -19
  105. package/android/.cxx/Debug/6t29645j/armeabi-v7a/prefab_config.json +0 -4
  106. package/android/.cxx/Debug/6t29645j/armeabi-v7a/symbol_folder_index.txt +0 -1
  107. package/android/.cxx/Debug/6t29645j/hash_key.txt +0 -26
  108. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  109. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  110. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  111. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/cache-v2-921e99e188641cccb611.json +0 -1323
  112. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/cmakeFiles-v1-842a746390c683135141.json +0 -184
  113. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/codemodel-v2-5a1f9507fc5ae29259c9.json +0 -60
  114. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +0 -14
  115. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/index-2025-12-22T13-33-37-0961.json +0 -92
  116. package/android/.cxx/Debug/6t29645j/x86/.cmake/api/v1/reply/target-papyrus_text-Debug-3cc07532ad82ada3b95c.json +0 -168
  117. package/android/.cxx/Debug/6t29645j/x86/.ninja_deps +0 -0
  118. package/android/.cxx/Debug/6t29645j/x86/.ninja_log +0 -20
  119. package/android/.cxx/Debug/6t29645j/x86/CMakeCache.txt +0 -400
  120. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +0 -72
  121. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +0 -83
  122. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  123. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  124. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +0 -15
  125. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +0 -803
  126. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  127. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  128. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  129. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/CMakeOutput.log +0 -258
  130. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/TargetDirectories.txt +0 -3
  131. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/cmake.check_cache +0 -1
  132. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/papyrus_text.dir/papyrus_outline.cpp.o +0 -0
  133. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/papyrus_text.dir/papyrus_text_search.cpp.o +0 -0
  134. package/android/.cxx/Debug/6t29645j/x86/CMakeFiles/rules.ninja +0 -64
  135. package/android/.cxx/Debug/6t29645j/x86/additional_project_files.txt +0 -0
  136. package/android/.cxx/Debug/6t29645j/x86/android_gradle_build.json +0 -38
  137. package/android/.cxx/Debug/6t29645j/x86/android_gradle_build_mini.json +0 -27
  138. package/android/.cxx/Debug/6t29645j/x86/build.ninja +0 -158
  139. package/android/.cxx/Debug/6t29645j/x86/build_file_index.txt +0 -1
  140. package/android/.cxx/Debug/6t29645j/x86/cmake_install.cmake +0 -54
  141. package/android/.cxx/Debug/6t29645j/x86/compile_commands.json +0 -12
  142. package/android/.cxx/Debug/6t29645j/x86/compile_commands.json.bin +0 -0
  143. package/android/.cxx/Debug/6t29645j/x86/configure_fingerprint.bin +0 -28
  144. package/android/.cxx/Debug/6t29645j/x86/metadata_generation_command.txt +0 -19
  145. package/android/.cxx/Debug/6t29645j/x86/prefab_config.json +0 -4
  146. package/android/.cxx/Debug/6t29645j/x86/symbol_folder_index.txt +0 -1
  147. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/query/client-agp/cache-v2 +0 -0
  148. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 +0 -0
  149. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 +0 -0
  150. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/cache-v2-de693df49d051882903b.json +0 -1323
  151. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-8206847cf10ce80b1459.json +0 -184
  152. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/codemodel-v2-ad9301b1a16c83f532c2.json +0 -60
  153. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/directory-.-Debug-d0094a50bb2071803777.json +0 -14
  154. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/index-2025-12-22T13-33-39-0005.json +0 -92
  155. package/android/.cxx/Debug/6t29645j/x86_64/.cmake/api/v1/reply/target-papyrus_text-Debug-e1bb1d27c41dc820b379.json +0 -168
  156. package/android/.cxx/Debug/6t29645j/x86_64/.ninja_deps +0 -0
  157. package/android/.cxx/Debug/6t29645j/x86_64/.ninja_log +0 -20
  158. package/android/.cxx/Debug/6t29645j/x86_64/CMakeCache.txt +0 -400
  159. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCCompiler.cmake +0 -72
  160. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeCXXCompiler.cmake +0 -83
  161. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_C.bin +0 -0
  162. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeDetermineCompilerABI_CXX.bin +0 -0
  163. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CMakeSystem.cmake +0 -15
  164. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.c +0 -803
  165. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdC/CMakeCCompilerId.o +0 -0
  166. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.cpp +0 -791
  167. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/3.22.1-g37088a8-dirty/CompilerIdCXX/CMakeCXXCompilerId.o +0 -0
  168. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/CMakeOutput.log +0 -258
  169. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/TargetDirectories.txt +0 -3
  170. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/cmake.check_cache +0 -1
  171. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/papyrus_text.dir/papyrus_outline.cpp.o +0 -0
  172. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/papyrus_text.dir/papyrus_text_search.cpp.o +0 -0
  173. package/android/.cxx/Debug/6t29645j/x86_64/CMakeFiles/rules.ninja +0 -64
  174. package/android/.cxx/Debug/6t29645j/x86_64/additional_project_files.txt +0 -0
  175. package/android/.cxx/Debug/6t29645j/x86_64/android_gradle_build.json +0 -38
  176. package/android/.cxx/Debug/6t29645j/x86_64/android_gradle_build_mini.json +0 -27
  177. package/android/.cxx/Debug/6t29645j/x86_64/build.ninja +0 -158
  178. package/android/.cxx/Debug/6t29645j/x86_64/build_file_index.txt +0 -1
  179. package/android/.cxx/Debug/6t29645j/x86_64/cmake_install.cmake +0 -54
  180. package/android/.cxx/Debug/6t29645j/x86_64/compile_commands.json +0 -12
  181. package/android/.cxx/Debug/6t29645j/x86_64/compile_commands.json.bin +0 -0
  182. package/android/.cxx/Debug/6t29645j/x86_64/configure_fingerprint.bin +0 -28
  183. package/android/.cxx/Debug/6t29645j/x86_64/metadata_generation_command.txt +0 -19
  184. package/android/.cxx/Debug/6t29645j/x86_64/prefab_config.json +0 -4
  185. package/android/.cxx/Debug/6t29645j/x86_64/symbol_folder_index.txt +0 -1
  186. package/android/.cxx/tools/debug/arm64-v8a/compile_commands.json +0 -12
  187. package/android/.cxx/tools/debug/armeabi-v7a/compile_commands.json +0 -12
  188. package/android/.cxx/tools/debug/x86/compile_commands.json +0 -12
  189. package/android/.cxx/tools/debug/x86_64/compile_commands.json +0 -12
  190. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/results.bin +0 -1
  191. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/android/support/v4/util/ArrayMap.dex +0 -0
  192. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/BuildConfig.dex +0 -0
  193. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusEngineStore$EngineState.dex +0 -0
  194. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusEngineStore.dex +0 -0
  195. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusNativeEngineModule$1.dex +0 -0
  196. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusNativeEngineModule.dex +0 -0
  197. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusOutline.dex +0 -0
  198. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusOutlineItem.dex +0 -0
  199. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusPackage.dex +0 -0
  200. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusPageView.dex +0 -0
  201. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusPageViewManager.dex +0 -0
  202. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusTextHit.dex +0 -0
  203. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusTextSearch.dex +0 -0
  204. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusTextSelect.dex +0 -0
  205. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/papyrus/engine/PapyrusTextSelection.dex +0 -0
  206. package/android/build/.transforms/2a70e7e4bf5a7ddacb39b95e5520ae88/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  207. package/android/build/.transforms/b336bac6032a9c6be0544a913e5a030c/results.bin +0 -1
  208. package/android/build/.transforms/b336bac6032a9c6be0544a913e5a030c/transformed/classes/classes_dex/classes.dex +0 -0
  209. package/android/build/generated/source/buildConfig/debug/com/papyrus/engine/BuildConfig.java +0 -10
  210. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -7
  211. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  212. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  213. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  214. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  215. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  216. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  217. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/build_command_papyrus_text.bat +0 -5
  218. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/build_model.json +0 -186
  219. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/build_stderr_papyrus_text.txt +0 -0
  220. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/build_stdout_papyrus_text.txt +0 -2
  221. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_157_timing.txt +0 -8
  222. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_167_timing.txt +0 -8
  223. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_168_timing.txt +0 -14
  224. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_172_timing.txt +0 -8
  225. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_2919_timing.txt +0 -6
  226. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_3311_timing.txt +0 -3
  227. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/generate_cxx_metadata_450_timing.txt +0 -3
  228. package/android/build/intermediates/cxx/Debug/6t29645j/logs/arm64-v8a/metadata_generation_record.json +0 -41
  229. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/build_command_papyrus_text.bat +0 -5
  230. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/build_model.json +0 -186
  231. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/build_stderr_papyrus_text.txt +0 -0
  232. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/build_stdout_papyrus_text.txt +0 -2
  233. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_158_timing.txt +0 -6
  234. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_160_timing.txt +0 -6
  235. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_164_timing.txt +0 -6
  236. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_168_timing.txt +0 -6
  237. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_2922_timing.txt +0 -6
  238. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_3311_timing.txt +0 -3
  239. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/generate_cxx_metadata_450_timing.txt +0 -3
  240. package/android/build/intermediates/cxx/Debug/6t29645j/logs/armeabi-v7a/metadata_generation_record.json +0 -41
  241. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/build_command_papyrus_text.bat +0 -5
  242. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/build_model.json +0 -186
  243. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/build_stderr_papyrus_text.txt +0 -0
  244. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/build_stdout_papyrus_text.txt +0 -2
  245. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_160_timing.txt +0 -5
  246. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_164_timing.txt +0 -3
  247. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_168_timing.txt +0 -6
  248. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_170_timing.txt +0 -6
  249. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_2907_timing.txt +0 -6
  250. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_3311_timing.txt +0 -3
  251. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/generate_cxx_metadata_450_timing.txt +0 -3
  252. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86/metadata_generation_record.json +0 -41
  253. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/build_command_papyrus_text.bat +0 -5
  254. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/build_model.json +0 -186
  255. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/build_stderr_papyrus_text.txt +0 -0
  256. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/build_stdout_papyrus_text.txt +0 -2
  257. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_155_timing.txt +0 -6
  258. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_160_timing.txt +0 -6
  259. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_164_timing.txt +0 -3
  260. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_168_timing.txt +0 -6
  261. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_2916_timing.txt +0 -6
  262. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_3311_timing.txt +0 -5
  263. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/generate_cxx_metadata_450_timing.txt +0 -6
  264. package/android/build/intermediates/cxx/Debug/6t29645j/logs/x86_64/metadata_generation_record.json +0 -41
  265. package/android/build/intermediates/cxx/Debug/6t29645j/obj/arm64-v8a/libpapyrus_text.so +0 -0
  266. package/android/build/intermediates/cxx/Debug/6t29645j/obj/armeabi-v7a/libpapyrus_text.so +0 -0
  267. package/android/build/intermediates/cxx/Debug/6t29645j/obj/x86/libpapyrus_text.so +0 -0
  268. package/android/build/intermediates/cxx/Debug/6t29645j/obj/x86_64/libpapyrus_text.so +0 -0
  269. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -1
  270. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  271. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  272. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  273. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
  274. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/android/support/v4/util/ArrayMap.class +0 -0
  275. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/BuildConfig.class +0 -0
  276. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusEngineStore$EngineState.class +0 -0
  277. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusEngineStore.class +0 -0
  278. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusNativeEngineModule$1.class +0 -0
  279. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusNativeEngineModule.class +0 -0
  280. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusOutline.class +0 -0
  281. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusOutlineItem.class +0 -0
  282. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusPackage.class +0 -0
  283. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusPageView.class +0 -0
  284. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusPageViewManager.class +0 -0
  285. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusTextHit.class +0 -0
  286. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusTextSearch.class +0 -0
  287. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusTextSelect.class +0 -0
  288. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/papyrus/engine/PapyrusTextSelection.class +0 -0
  289. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/arm64-v8a/libpapyrus_text.so +0 -0
  290. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/armeabi-v7a/libpapyrus_text.so +0 -0
  291. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86/libpapyrus_text.so +0 -0
  292. package/android/build/intermediates/library_jni/debug/copyDebugJniLibsProjectOnly/jni/x86_64/libpapyrus_text.so +0 -0
  293. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -2
  294. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -7
  295. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -7
  296. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libpapyrus_text.so +0 -0
  297. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libpapyrus_text.so +0 -0
  298. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libpapyrus_text.so +0 -0
  299. package/android/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libpapyrus_text.so +0 -0
  300. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  301. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  302. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/android/support/v4/util/ArrayMap.class +0 -0
  303. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/BuildConfig.class +0 -0
  304. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusEngineStore$EngineState.class +0 -0
  305. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusEngineStore.class +0 -0
  306. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusNativeEngineModule$1.class +0 -0
  307. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusNativeEngineModule.class +0 -0
  308. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusOutline.class +0 -0
  309. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusOutlineItem.class +0 -0
  310. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusPackage.class +0 -0
  311. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusPageView.class +0 -0
  312. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusPageViewManager.class +0 -0
  313. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusTextHit.class +0 -0
  314. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusTextSearch.class +0 -0
  315. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusTextSelect.class +0 -0
  316. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/papyrus/engine/PapyrusTextSelection.class +0 -0
  317. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  318. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -1
  319. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  320. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PapyrusNativeEngineModule$1.class.uniqueId2 +0 -0
  321. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PapyrusNativeEngineModule.class.uniqueId1 +0 -0
  322. package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/PapyrusPackage.class.uniqueId0 +0 -0
  323. 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