@apollohg/react-native-rich-text-editor 2.0.0

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 (494) hide show
  1. package/LICENSE +160 -0
  2. package/README.md +259 -0
  3. package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
  4. package/ReactNativeProseEditor.podspec +59 -0
  5. package/THIRD_PARTY_NOTICES.md +31155 -0
  6. package/android/build.gradle +188 -0
  7. package/android/consumer-rules.pro +18 -0
  8. package/android/expo/build.gradle +17 -0
  9. package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
  10. package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
  11. package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
  12. package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
  13. package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
  14. package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
  15. package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
  16. package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
  17. package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
  18. package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
  19. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
  20. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
  21. package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
  22. package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
  23. package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
  24. package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
  25. package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
  26. package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
  27. package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
  28. package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
  29. package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
  30. package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
  31. package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
  32. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
  33. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
  34. package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
  35. package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
  36. package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
  37. package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
  38. package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
  39. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
  40. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
  41. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
  42. package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
  43. package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
  44. package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
  45. package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
  46. package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
  47. package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
  48. package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
  49. package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
  50. package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
  51. package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
  52. package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
  53. package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
  54. package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
  55. package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
  56. package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
  57. package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
  58. package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
  59. package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
  60. package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
  61. package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
  62. package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
  63. package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
  64. package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
  65. package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
  66. package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
  67. package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
  68. package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
  69. package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
  70. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
  71. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
  72. package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
  73. package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
  74. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
  75. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
  76. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
  77. package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
  78. package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
  79. package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
  80. package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
  81. package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
  82. package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
  83. package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
  84. package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
  85. package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
  86. package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
  87. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
  88. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
  89. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
  90. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
  91. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
  92. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
  93. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
  94. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
  95. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
  96. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
  97. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
  98. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
  99. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
  100. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
  101. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
  102. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
  103. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
  104. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
  105. package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
  106. package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
  107. package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
  108. package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
  109. package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
  110. package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
  111. package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
  112. package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
  113. package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
  114. package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
  115. package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
  116. package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
  117. package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
  118. package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
  119. package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
  120. package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
  121. package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
  122. package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
  123. package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
  124. package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
  125. package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
  126. package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
  127. package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
  128. package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
  129. package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
  130. package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
  131. package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
  132. package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
  133. package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
  134. package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
  135. package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
  136. package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
  137. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
  138. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
  139. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
  140. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
  141. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
  142. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
  143. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
  144. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
  145. package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
  146. package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
  147. package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
  148. package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
  149. package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
  150. package/android/src/main/jni/CMakeLists.txt +85 -0
  151. package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
  152. package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
  153. package/android/src/main/jni/reactnativeproseeditor.h +6 -0
  154. package/android/src/main/res/values/attrs.xml +6 -0
  155. package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
  156. package/app.plugin.js +62 -0
  157. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
  158. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
  159. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
  160. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
  161. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
  162. package/dist/AtomHost.d.ts +17 -0
  163. package/dist/AtomHost.js +135 -0
  164. package/dist/DefaultAtomChip.d.ts +2 -0
  165. package/dist/DefaultAtomChip.js +22 -0
  166. package/dist/EditorAddon.d.ts +32 -0
  167. package/dist/EditorAddon.js +29 -0
  168. package/dist/EditorAddonNormalization.d.ts +6 -0
  169. package/dist/EditorAddonNormalization.js +48 -0
  170. package/dist/EditorMentionThemeNormalization.d.ts +8 -0
  171. package/dist/EditorMentionThemeNormalization.js +22 -0
  172. package/dist/EditorMentionThemeValidation.d.ts +12 -0
  173. package/dist/EditorMentionThemeValidation.js +95 -0
  174. package/dist/EditorStyleSheet.d.ts +4 -0
  175. package/dist/EditorStyleSheet.js +10 -0
  176. package/dist/EditorStyleSheetNormalization.d.ts +3 -0
  177. package/dist/EditorStyleSheetNormalization.js +226 -0
  178. package/dist/EditorStyleSheetTypes.d.ts +151 -0
  179. package/dist/EditorStyleSheetTypes.js +2 -0
  180. package/dist/EditorTheme.d.ts +117 -0
  181. package/dist/EditorTheme.js +41 -0
  182. package/dist/EditorToolbar.d.ts +4 -0
  183. package/dist/EditorToolbar.js +17 -0
  184. package/dist/EditorToolbarComponent.d.ts +13 -0
  185. package/dist/EditorToolbarComponent.js +24 -0
  186. package/dist/EditorToolbarItems.d.ts +9 -0
  187. package/dist/EditorToolbarItems.js +58 -0
  188. package/dist/EditorToolbarRegistry.d.ts +59 -0
  189. package/dist/EditorToolbarRegistry.js +175 -0
  190. package/dist/EditorToolbarTypes.d.ts +273 -0
  191. package/dist/EditorToolbarTypes.js +2 -0
  192. package/dist/EditorToolbarVisuals.d.ts +154 -0
  193. package/dist/EditorToolbarVisuals.js +228 -0
  194. package/dist/EditorUpdateRevision.d.ts +8 -0
  195. package/dist/EditorUpdateRevision.js +22 -0
  196. package/dist/ExternalTextComposition.d.ts +45 -0
  197. package/dist/ExternalTextComposition.js +537 -0
  198. package/dist/ImageLoadingPolicy.d.ts +54 -0
  199. package/dist/ImageLoadingPolicy.js +60 -0
  200. package/dist/NativeEditorBoundaryError.d.ts +111 -0
  201. package/dist/NativeEditorBoundaryError.js +268 -0
  202. package/dist/NativeEditorBridge.d.ts +9 -0
  203. package/dist/NativeEditorBridge.js +37 -0
  204. package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
  205. package/dist/NativeEditorCollaborationTransport.js +275 -0
  206. package/dist/NativeEditorCreateConfig.d.ts +16 -0
  207. package/dist/NativeEditorCreateConfig.js +249 -0
  208. package/dist/NativeEditorCreateJson.d.ts +76 -0
  209. package/dist/NativeEditorCreateJson.js +474 -0
  210. package/dist/NativeEditorCreateValidation.d.ts +32 -0
  211. package/dist/NativeEditorCreateValidation.js +150 -0
  212. package/dist/NativeEditorDocumentBridge.d.ts +72 -0
  213. package/dist/NativeEditorDocumentBridge.js +305 -0
  214. package/dist/NativeEditorDocumentHandle.d.ts +70 -0
  215. package/dist/NativeEditorDocumentHandle.js +89 -0
  216. package/dist/NativeEditorLocalAwareness.d.ts +34 -0
  217. package/dist/NativeEditorLocalAwareness.js +153 -0
  218. package/dist/NativeEditorNativeModule.d.ts +48 -0
  219. package/dist/NativeEditorNativeModule.js +34 -0
  220. package/dist/NativeEditorRenderNormalization.d.ts +22 -0
  221. package/dist/NativeEditorRenderNormalization.js +274 -0
  222. package/dist/NativeEditorResultNormalization.d.ts +108 -0
  223. package/dist/NativeEditorResultNormalization.js +400 -0
  224. package/dist/NativeEditorTypes.d.ts +318 -0
  225. package/dist/NativeEditorTypes.js +15 -0
  226. package/dist/NativeEditorV2Decimal.d.ts +5 -0
  227. package/dist/NativeEditorV2Decimal.js +18 -0
  228. package/dist/NativeProseViewer.d.ts +122 -0
  229. package/dist/NativeProseViewer.js +130 -0
  230. package/dist/NativeRichTextEditor.d.ts +3 -0
  231. package/dist/NativeRichTextEditor.js +6 -0
  232. package/dist/ResourceLimits.d.ts +100 -0
  233. package/dist/ResourceLimits.js +80 -0
  234. package/dist/RichTextEditor.d.ts +4 -0
  235. package/dist/RichTextEditor.js +25 -0
  236. package/dist/RichTextEditorNativeTypes.d.ts +122 -0
  237. package/dist/RichTextEditorNativeTypes.js +2 -0
  238. package/dist/RichTextEditorNativeView.d.ts +12 -0
  239. package/dist/RichTextEditorNativeView.js +15 -0
  240. package/dist/RichTextEditorSerialization.d.ts +53 -0
  241. package/dist/RichTextEditorSerialization.js +283 -0
  242. package/dist/RichTextEditorTypes.d.ts +281 -0
  243. package/dist/RichTextEditorTypes.js +2 -0
  244. package/dist/ViewerConfiguration.d.ts +22 -0
  245. package/dist/ViewerConfiguration.js +6 -0
  246. package/dist/YjsCollaboration.d.ts +146 -0
  247. package/dist/YjsCollaboration.js +496 -0
  248. package/dist/addons.d.ts +193 -0
  249. package/dist/addons.js +122 -0
  250. package/dist/atomConstants.d.ts +3 -0
  251. package/dist/atomConstants.js +6 -0
  252. package/dist/atomInstances.d.ts +35 -0
  253. package/dist/atomInstances.js +79 -0
  254. package/dist/atomPolicy.d.ts +4 -0
  255. package/dist/atomPolicy.js +47 -0
  256. package/dist/atomUpdates.d.ts +2 -0
  257. package/dist/atomUpdates.js +38 -0
  258. package/dist/atoms.d.ts +92 -0
  259. package/dist/atoms.js +222 -0
  260. package/dist/attributeValidation.d.ts +4 -0
  261. package/dist/attributeValidation.js +97 -0
  262. package/dist/contentExpression.d.ts +6 -0
  263. package/dist/contentExpression.js +335 -0
  264. package/dist/index.d.ts +21 -0
  265. package/dist/index.js +78 -0
  266. package/dist/listMarkers.d.ts +15 -0
  267. package/dist/listMarkers.js +21 -0
  268. package/dist/schemaDefinition.d.ts +143 -0
  269. package/dist/schemaDefinition.js +206 -0
  270. package/dist/schemaDocument.d.ts +17 -0
  271. package/dist/schemaDocument.js +69 -0
  272. package/dist/schemaDocumentConstruction.d.ts +5 -0
  273. package/dist/schemaDocumentConstruction.js +125 -0
  274. package/dist/schemaNormalization.d.ts +29 -0
  275. package/dist/schemaNormalization.js +313 -0
  276. package/dist/schemaPresets.d.ts +68 -0
  277. package/dist/schemaPresets.js +198 -0
  278. package/dist/schemaResolution.d.ts +9 -0
  279. package/dist/schemaResolution.js +211 -0
  280. package/dist/schemas.d.ts +5 -0
  281. package/dist/schemas.js +28 -0
  282. package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
  283. package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
  284. package/dist/useEditorToolbarInteractions.d.ts +12 -0
  285. package/dist/useEditorToolbarInteractions.js +218 -0
  286. package/dist/useEditorToolbarItems.d.ts +8 -0
  287. package/dist/useEditorToolbarItems.js +280 -0
  288. package/dist/useEditorToolbarPresentation.d.ts +4 -0
  289. package/dist/useEditorToolbarPresentation.js +203 -0
  290. package/dist/useEditorToolbarState.d.ts +63 -0
  291. package/dist/useEditorToolbarState.js +108 -0
  292. package/dist/useFocusPreservingFrames.d.ts +17 -0
  293. package/dist/useFocusPreservingFrames.js +108 -0
  294. package/dist/useNativeEditor.d.ts +66 -0
  295. package/dist/useNativeEditor.js +370 -0
  296. package/dist/useRichTextEditorCommands.d.ts +21 -0
  297. package/dist/useRichTextEditorCommands.js +299 -0
  298. package/dist/useRichTextEditorEvents.d.ts +18 -0
  299. package/dist/useRichTextEditorEvents.js +216 -0
  300. package/dist/useRichTextEditorMentions.d.ts +11 -0
  301. package/dist/useRichTextEditorMentions.js +316 -0
  302. package/dist/useRichTextEditorPresentation.d.ts +5 -0
  303. package/dist/useRichTextEditorPresentation.js +178 -0
  304. package/dist/useRichTextEditorState.d.ts +180 -0
  305. package/dist/useRichTextEditorState.js +405 -0
  306. package/dist/useRichTextEditorUpdates.d.ts +10 -0
  307. package/dist/useRichTextEditorUpdates.js +308 -0
  308. package/dist/useViewerAtoms.d.ts +38 -0
  309. package/dist/useViewerAtoms.js +288 -0
  310. package/expo-module.config.json +13 -0
  311. package/ios/EditorAddons.swift +354 -0
  312. package/ios/EditorCodeHighlighting.swift +184 -0
  313. package/ios/EditorCore.xcframework/Info.plist +44 -0
  314. package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
  315. package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
  316. package/ios/EditorInteractionOverlays.swift +697 -0
  317. package/ios/EditorLayoutManager.swift +971 -0
  318. package/ios/EditorNodeTypes.swift +37 -0
  319. package/ios/EditorStyleSheet.swift +461 -0
  320. package/ios/EditorTextView+AttributedPatch.swift +305 -0
  321. package/ios/EditorTextView+Binding.swift +61 -0
  322. package/ios/EditorTextView+Caret.swift +333 -0
  323. package/ios/EditorTextView+Commands.swift +203 -0
  324. package/ios/EditorTextView+Delegate.swift +65 -0
  325. package/ios/EditorTextView+Diagnostics.swift +225 -0
  326. package/ios/EditorTextView+DragDrop.swift +290 -0
  327. package/ios/EditorTextView+ExternalComposition.swift +364 -0
  328. package/ios/EditorTextView+Images.swift +354 -0
  329. package/ios/EditorTextView+InputTraits.swift +200 -0
  330. package/ios/EditorTextView+KeyboardInput.swift +318 -0
  331. package/ios/EditorTextView+Layout.swift +245 -0
  332. package/ios/EditorTextView+MarkedText.swift +267 -0
  333. package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
  334. package/ios/EditorTextView+NativeMutation.swift +471 -0
  335. package/ios/EditorTextView+Reconciliation.swift +97 -0
  336. package/ios/EditorTextView+RenderPatch.swift +573 -0
  337. package/ios/EditorTextView+Rendering.swift +539 -0
  338. package/ios/EditorTextView+Selection.swift +542 -0
  339. package/ios/EditorTextView.swift +953 -0
  340. package/ios/EditorTheme.swift +626 -0
  341. package/ios/EditorV2Adapter+Commands.swift +204 -0
  342. package/ios/EditorV2Adapter+Envelope.swift +238 -0
  343. package/ios/EditorV2Adapter+Mutation.swift +392 -0
  344. package/ios/EditorV2Adapter+Registry.swift +185 -0
  345. package/ios/EditorV2Adapter+RenderState.swift +360 -0
  346. package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
  347. package/ios/EditorV2Adapter+Selection.swift +329 -0
  348. package/ios/EditorV2Adapter+TextCommands.swift +430 -0
  349. package/ios/EditorV2Adapter.swift +376 -0
  350. package/ios/EditorV2Shadow.swift +353 -0
  351. package/ios/Generated_editor_core.swift +2378 -0
  352. package/ios/NativeCodeHighlighting.swift +159 -0
  353. package/ios/NativeCollaborationSocket.swift +144 -0
  354. package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
  355. package/ios/NativeCollaborationTransport+Socket.swift +379 -0
  356. package/ios/NativeCollaborationTransport+Validation.swift +103 -0
  357. package/ios/NativeCollaborationTransport.swift +322 -0
  358. package/ios/NativeCollaborationTransportRegistry.swift +521 -0
  359. package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
  360. package/ios/NativeEditorExpoView+Binding.swift +268 -0
  361. package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
  362. package/ios/NativeEditorExpoView+Events.swift +131 -0
  363. package/ios/NativeEditorExpoView+Focus.swift +169 -0
  364. package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
  365. package/ios/NativeEditorExpoView+Mentions.swift +288 -0
  366. package/ios/NativeEditorExpoView+Properties.swift +300 -0
  367. package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
  368. package/ios/NativeEditorExpoView+Updates.swift +312 -0
  369. package/ios/NativeEditorExpoView.swift +349 -0
  370. package/ios/NativeEditorModule.swift +856 -0
  371. package/ios/NativeEditorViewRegistry.swift +226 -0
  372. package/ios/NativeToolbar+ButtonStyle.swift +214 -0
  373. package/ios/NativeToolbar+Buttons.swift +228 -0
  374. package/ios/NativeToolbar+Diagnostics.swift +114 -0
  375. package/ios/NativeToolbar+Menu.swift +101 -0
  376. package/ios/NativeToolbar+Models.swift +519 -0
  377. package/ios/NativeToolbar+Placeholder.swift +39 -0
  378. package/ios/NativeToolbar.swift +612 -0
  379. package/ios/OrderedListMarkerFormatter.swift +103 -0
  380. package/ios/PositionBridge.swift +596 -0
  381. package/ios/ProseViewerView.swift +462 -0
  382. package/ios/RenderBridge+Atoms.swift +288 -0
  383. package/ios/RenderBridge+Attachments.swift +246 -0
  384. package/ios/RenderBridge+BlockBoundaries.swift +313 -0
  385. package/ios/RenderBridge+Style.swift +343 -0
  386. package/ios/RenderBridge.swift +704 -0
  387. package/ios/RichTextEditorView.swift +930 -0
  388. package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
  389. package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
  390. package/ios/SharedNativeImagePipeline.swift +533 -0
  391. package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
  392. package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
  393. package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
  394. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
  395. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
  396. package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
  397. package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
  398. package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
  399. package/ios/Viewer/NativeSVGPreflight.h +11 -0
  400. package/ios/Viewer/NativeSVGPreflight.mm +219 -0
  401. package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
  402. package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
  403. package/ios/Viewer/PreparedProseLayout.swift +326 -0
  404. package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
  405. package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
  406. package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
  407. package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
  408. package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
  409. package/ios/Viewer/ViewerDocument.swift +575 -0
  410. package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
  411. package/ios/Viewer/ViewerImagePipeline.swift +478 -0
  412. package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
  413. package/ios/editor_coreFFI/module.modulemap +7 -0
  414. package/package.json +151 -0
  415. package/react-native.config.js +17 -0
  416. package/rust/android/arm64-v8a/libeditor_core.so +0 -0
  417. package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
  418. package/rust/android/x86/libeditor_core.so +0 -0
  419. package/rust/android/x86_64/libeditor_core.so +0 -0
  420. package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
  421. package/src/AtomHost.tsx +180 -0
  422. package/src/DefaultAtomChip.tsx +27 -0
  423. package/src/EditorAddon.ts +65 -0
  424. package/src/EditorAddonNormalization.ts +49 -0
  425. package/src/EditorMentionThemeNormalization.ts +25 -0
  426. package/src/EditorMentionThemeValidation.ts +133 -0
  427. package/src/EditorStyleSheet.ts +9 -0
  428. package/src/EditorStyleSheetNormalization.ts +219 -0
  429. package/src/EditorStyleSheetTypes.ts +189 -0
  430. package/src/EditorTheme.ts +196 -0
  431. package/src/EditorToolbar.tsx +31 -0
  432. package/src/EditorToolbarComponent.tsx +23 -0
  433. package/src/EditorToolbarItems.tsx +64 -0
  434. package/src/EditorToolbarRegistry.tsx +254 -0
  435. package/src/EditorToolbarTypes.tsx +322 -0
  436. package/src/EditorToolbarVisuals.tsx +270 -0
  437. package/src/EditorUpdateRevision.ts +26 -0
  438. package/src/ExternalTextComposition.ts +658 -0
  439. package/src/ImageLoadingPolicy.ts +125 -0
  440. package/src/NativeEditorBoundaryError.ts +345 -0
  441. package/src/NativeEditorBridge.ts +93 -0
  442. package/src/NativeEditorCollaborationTransport.ts +493 -0
  443. package/src/NativeEditorCreateConfig.ts +326 -0
  444. package/src/NativeEditorCreateJson.ts +579 -0
  445. package/src/NativeEditorCreateValidation.ts +178 -0
  446. package/src/NativeEditorDocumentBridge.ts +485 -0
  447. package/src/NativeEditorDocumentHandle.ts +168 -0
  448. package/src/NativeEditorLocalAwareness.ts +168 -0
  449. package/src/NativeEditorNativeModule.ts +97 -0
  450. package/src/NativeEditorRenderNormalization.ts +320 -0
  451. package/src/NativeEditorResultNormalization.ts +469 -0
  452. package/src/NativeEditorTypes.ts +366 -0
  453. package/src/NativeEditorV2Decimal.ts +13 -0
  454. package/src/NativeProseViewer.tsx +356 -0
  455. package/src/NativeRichTextEditor.tsx +33 -0
  456. package/src/ResourceLimits.ts +187 -0
  457. package/src/RichTextEditor.tsx +27 -0
  458. package/src/RichTextEditorNativeTypes.tsx +144 -0
  459. package/src/RichTextEditorNativeView.tsx +21 -0
  460. package/src/RichTextEditorSerialization.tsx +381 -0
  461. package/src/RichTextEditorTypes.tsx +327 -0
  462. package/src/ViewerConfiguration.ts +23 -0
  463. package/src/YjsCollaboration.ts +692 -0
  464. package/src/addons.ts +311 -0
  465. package/src/atomConstants.ts +3 -0
  466. package/src/atomInstances.ts +123 -0
  467. package/src/atomPolicy.ts +47 -0
  468. package/src/atomUpdates.ts +52 -0
  469. package/src/atoms.ts +379 -0
  470. package/src/attributeValidation.ts +116 -0
  471. package/src/contentExpression.ts +338 -0
  472. package/src/index.ts +295 -0
  473. package/src/listMarkers.ts +18 -0
  474. package/src/schemaDefinition.ts +395 -0
  475. package/src/schemaDocument.ts +92 -0
  476. package/src/schemaDocumentConstruction.ts +148 -0
  477. package/src/schemaNormalization.ts +367 -0
  478. package/src/schemaPresets.ts +250 -0
  479. package/src/schemaResolution.ts +242 -0
  480. package/src/schemas.ts +43 -0
  481. package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
  482. package/src/useEditorToolbarInteractions.tsx +329 -0
  483. package/src/useEditorToolbarItems.tsx +390 -0
  484. package/src/useEditorToolbarPresentation.tsx +483 -0
  485. package/src/useEditorToolbarState.tsx +172 -0
  486. package/src/useFocusPreservingFrames.ts +171 -0
  487. package/src/useNativeEditor.ts +534 -0
  488. package/src/useRichTextEditorCommands.tsx +478 -0
  489. package/src/useRichTextEditorEvents.tsx +342 -0
  490. package/src/useRichTextEditorMentions.tsx +441 -0
  491. package/src/useRichTextEditorPresentation.tsx +563 -0
  492. package/src/useRichTextEditorState.tsx +620 -0
  493. package/src/useRichTextEditorUpdates.tsx +403 -0
  494. package/src/useViewerAtoms.tsx +427 -0
@@ -0,0 +1,191 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.os.Handler
4
+ import android.os.Looper
5
+ import android.os.SystemClock
6
+ import android.text.Selection
7
+ import android.text.Spanned
8
+ import android.view.KeyEvent
9
+ import android.view.inputmethod.BaseInputConnection
10
+ import android.view.inputmethod.CompletionInfo
11
+ import android.view.inputmethod.CorrectionInfo
12
+ import android.view.inputmethod.InputConnection
13
+ import android.view.inputmethod.InputConnectionWrapper
14
+
15
+ internal fun EditorInputConnection.isCurrentInputSession(): Boolean =
16
+ !closedForInput && editorView.activeInputConnection === this &&
17
+ editorView.isInputConnectionCurrentForEditor(boundEditorId, boundGeneration)
18
+
19
+ internal fun EditorInputConnection.currentMapper(): ImeTextCoordinateMapper? =
20
+ if (isCurrentInputSession()) {
21
+ editorView.imeTextCoordinateMapperForEditor(
22
+ boundMapperGeneration
23
+ )
24
+ } else {
25
+ null
26
+ }
27
+
28
+ internal fun EditorInputConnection.imeTextSlice(
29
+ mapper: ImeTextCoordinateMapper,
30
+ start: Int,
31
+ end: Int,
32
+ flags: Int
33
+ ): CharSequence {
34
+ val slice = mapper.visibleText.subSequence(start, end)
35
+ return if ((flags and InputConnection.GET_TEXT_WITH_STYLES) != 0 && slice is Spanned) {
36
+ slice
37
+ } else {
38
+ slice.toString()
39
+ }
40
+ }
41
+
42
+ internal fun EditorInputConnection.rawRangeForIme(start: Int, end: Int): Pair<Int, Int>? {
43
+ val mapper = currentMapper() ?: return null
44
+ if (start == end) {
45
+ val raw = mapper.imeToRaw(start, ImeTextCoordinateMapper.Affinity.AFTER)
46
+ return raw to raw
47
+ }
48
+ return if (start < end) {
49
+ mapper.imeToRaw(start, ImeTextCoordinateMapper.Affinity.AFTER) to
50
+ mapper.imeToRaw(end, ImeTextCoordinateMapper.Affinity.BEFORE)
51
+ } else {
52
+ mapper.imeToRaw(start, ImeTextCoordinateMapper.Affinity.BEFORE) to
53
+ mapper.imeToRaw(end, ImeTextCoordinateMapper.Affinity.AFTER)
54
+ }
55
+ }
56
+
57
+ internal fun EditorInputConnection.nanosToMicros(nanos: Long): Long = nanos / 1_000L
58
+
59
+ internal fun EditorInputConnection.isCurrentInputSessionFor(event: String): Boolean {
60
+ val isCurrent = isCurrentInputSession()
61
+ if (!isCurrent) {
62
+ editorView.recordImeTraceForTesting(
63
+ "${event}Ignored",
64
+ "reason=stale boundEditor=$boundEditorId boundGen=$boundGeneration"
65
+ )
66
+ }
67
+ return isCurrent
68
+ }
69
+
70
+ internal fun EditorInputConnection.refreshComposingTextFromEditable() {
71
+ val editable = editorView.text ?: return
72
+ val visibleReplacementText = editorView.composingTextFromVisibleReplacementForEditor()
73
+ if (visibleReplacementText != null) {
74
+ editorView.setComposingTextForEditor(
75
+ ImeTextCoordinateMapper.build(visibleReplacementText, boundMapperGeneration)
76
+ .visibleText
77
+ .toString()
78
+ )
79
+ return
80
+ }
81
+ val start = BaseInputConnection.getComposingSpanStart(editable)
82
+ val end = BaseInputConnection.getComposingSpanEnd(editable)
83
+ if (start < 0 || end < 0 || start > end || end > editable.length) {
84
+ editorView.setComposingTextForEditor(null)
85
+ return
86
+ }
87
+ val mapper = currentMapper()
88
+ val composingText = if (mapper != null) {
89
+ mapper.visibleText.subSequence(
90
+ mapper.rawToIme(start),
91
+ mapper.rawToIme(end)
92
+ ).toString()
93
+ } else {
94
+ editable.subSequence(start, end).toString()
95
+ }
96
+ editorView.setComposingTextForEditor(composingText)
97
+ }
98
+
99
+ internal fun EditorInputConnection.deleteTransientTextAroundSelection(
100
+ beforeLength: Int,
101
+ afterLength: Int
102
+ ): Boolean {
103
+ val editable = editorView.text ?: return false
104
+ val rawStart = editorView.selectionStart
105
+ val rawEnd = editorView.selectionEnd
106
+ if (rawStart < 0 || rawEnd < 0) return false
107
+ val selectionStart = rawStart.coerceIn(0, editable.length)
108
+ val selectionEnd = rawEnd.coerceIn(0, editable.length)
109
+ val normalizedStart = minOf(selectionStart, selectionEnd)
110
+ val normalizedEnd = maxOf(selectionStart, selectionEnd)
111
+ val deleteStart: Int
112
+ val deleteEnd: Int
113
+ if (normalizedStart != normalizedEnd) {
114
+ deleteStart = normalizedStart
115
+ deleteEnd = normalizedEnd
116
+ } else {
117
+ deleteStart = maxOf(0, normalizedStart - beforeLength.coerceAtLeast(0))
118
+ deleteEnd = minOf(editable.length, normalizedEnd + afterLength.coerceAtLeast(0))
119
+ }
120
+ if (deleteStart >= deleteEnd) return false
121
+ val (snappedStart, snappedEnd) = PositionBridge.snapRangeToScalarBoundaries(
122
+ deleteStart,
123
+ deleteEnd,
124
+ editable.toString()
125
+ )
126
+ if (snappedStart >= snappedEnd) return false
127
+ editable.delete(snappedStart, snappedEnd)
128
+ Selection.setSelection(editable, snappedStart.coerceIn(0, editable.length))
129
+ return true
130
+ }
131
+
132
+ internal fun EditorInputConnection.deleteTransientTextAroundSelectionInCodePoints(
133
+ beforeLength: Int,
134
+ afterLength: Int
135
+ ): Boolean {
136
+ val currentText = editorView.text?.toString() ?: return false
137
+ val rawStart = editorView.selectionStart
138
+ val rawEnd = editorView.selectionEnd
139
+ if (rawStart < 0 || rawEnd < 0) return false
140
+ val selectionStart = rawStart.coerceIn(0, currentText.length)
141
+ val selectionEnd = rawEnd.coerceIn(0, currentText.length)
142
+ val normalizedStart = minOf(selectionStart, selectionEnd)
143
+ val normalizedEnd = maxOf(selectionStart, selectionEnd)
144
+ if (normalizedStart != normalizedEnd) {
145
+ return deleteTransientTextAroundSelection(0, 0)
146
+ }
147
+ val beforeUtf16Length = EditorInputConnection.codePointsToUtf16Length(
148
+ text = currentText,
149
+ fromUtf16Offset = normalizedStart,
150
+ codePointCount = beforeLength,
151
+ forward = false
152
+ )
153
+ val afterUtf16Length = EditorInputConnection.codePointsToUtf16Length(
154
+ text = currentText,
155
+ fromUtf16Offset = normalizedEnd,
156
+ codePointCount = afterLength,
157
+ forward = true
158
+ )
159
+ return deleteTransientTextAroundSelection(beforeUtf16Length, afterUtf16Length)
160
+ }
161
+
162
+ internal fun EditorInputConnection.currentComposingSpanText(): String? {
163
+ val editable = editorView.text ?: return null
164
+ val start = BaseInputConnection.getComposingSpanStart(editable)
165
+ val end = BaseInputConnection.getComposingSpanEnd(editable)
166
+ if (start < 0 || end < 0 || start > end || end > editable.length) {
167
+ return null
168
+ }
169
+ return editable.subSequence(start, end).toString()
170
+ }
171
+
172
+ internal fun EditorInputConnection.currentComposingSpanRange(): Pair<Int, Int>? {
173
+ if (!editorView.isCurrentTextAuthorizedForEditor()) return null
174
+ val editable = editorView.text ?: return null
175
+ val start = BaseInputConnection.getComposingSpanStart(editable)
176
+ val end = BaseInputConnection.getComposingSpanEnd(editable)
177
+ if (start < 0 || end < 0 || start > end || end > editable.length) {
178
+ return null
179
+ }
180
+ return editorView.authorizedUtf16Range(start, end)
181
+ }
182
+
183
+ internal fun EditorInputConnection.currentComposingSpanRawRange(): Pair<Int, Int>? {
184
+ val editable = editorView.text ?: return null
185
+ val start = BaseInputConnection.getComposingSpanStart(editable)
186
+ val end = BaseInputConnection.getComposingSpanEnd(editable)
187
+ if (start < 0 || end < 0 || start > end || end > editable.length) {
188
+ return null
189
+ }
190
+ return start to end
191
+ }
@@ -0,0 +1,107 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.os.Handler
4
+ import android.os.Looper
5
+ import android.os.SystemClock
6
+ import android.text.Selection
7
+ import android.text.Spanned
8
+ import android.view.KeyEvent
9
+ import android.view.inputmethod.BaseInputConnection
10
+ import android.view.inputmethod.CompletionInfo
11
+ import android.view.inputmethod.CorrectionInfo
12
+ import android.view.inputmethod.InputConnection
13
+ import android.view.inputmethod.InputConnectionWrapper
14
+
15
+ internal data class PendingDuplicateCorrectionCommit(val text: String, val deadlineMs: Long)
16
+
17
+ internal data class PendingCompositionCorrectionCommit(
18
+ val text: String,
19
+ val deadlineMs: Long,
20
+ val generation: Long
21
+ )
22
+
23
+ internal data class GeneratedCompositionAdjustment(
24
+ val leadingText: String,
25
+ val trailingText: String
26
+ ) {
27
+ fun sanitize(text: String): String {
28
+ var sanitized = text
29
+ if (leadingText.isNotEmpty() && sanitized.startsWith(leadingText)) {
30
+ sanitized = sanitized.substring(leadingText.length)
31
+ }
32
+ if (trailingText.isNotEmpty() && sanitized.endsWith(trailingText)) {
33
+ sanitized = sanitized.substring(0, sanitized.length - trailingText.length)
34
+ }
35
+ return sanitized
36
+ }
37
+ }
38
+
39
+ internal fun EditorInputConnection.rememberPendingDuplicateCorrectionCommit(text: String) {
40
+ pendingDuplicateCorrectionCommit = PendingDuplicateCorrectionCommit(
41
+ text = text,
42
+ deadlineMs =
43
+ SystemClock.uptimeMillis() + EditorInputConnection.DUPLICATE_CORRECTION_COMMIT_WINDOW_MS
44
+ )
45
+ }
46
+
47
+ internal fun EditorInputConnection.consumePendingDuplicateCorrectionCommitIfNeeded(
48
+ text: String?
49
+ ): Boolean {
50
+ val pending = pendingDuplicateCorrectionCommit ?: return false
51
+ pendingDuplicateCorrectionCommit = null
52
+ if (text == null) return false
53
+ if (SystemClock.uptimeMillis() > pending.deadlineMs) return false
54
+ return text == pending.text
55
+ }
56
+
57
+ internal fun EditorInputConnection.rememberPendingCompositionCorrectionCommit(text: String) {
58
+ val generation = ++pendingCompositionCorrectionGeneration
59
+ pendingCompositionCorrectionCommit = PendingCompositionCorrectionCommit(
60
+ text = text,
61
+ deadlineMs =
62
+ SystemClock.uptimeMillis() +
63
+ EditorInputConnection.DUPLICATE_CORRECTION_COMMIT_WINDOW_MS,
64
+ generation = generation
65
+ )
66
+ Handler(Looper.getMainLooper()).post {
67
+ val pending = pendingCompositionCorrectionCommit ?: return@post
68
+ if (pending.generation != generation) return@post
69
+ applyPendingCompositionCorrectionCommitIfNeeded("commitCorrectionDeferred")
70
+ }
71
+ }
72
+
73
+ internal fun EditorInputConnection.consumePendingCompositionCorrectionCommitIfNeeded(
74
+ text: String?,
75
+ newCursorPosition: Int
76
+ ): Boolean {
77
+ val pending = pendingCompositionCorrectionCommit ?: return false
78
+ if (SystemClock.uptimeMillis() > pending.deadlineMs) {
79
+ pendingCompositionCorrectionCommit = null
80
+ return false
81
+ }
82
+ if (text != pending.text) return false
83
+ pendingCompositionCorrectionCommit = null
84
+ pendingCompositionCorrectionGeneration += 1L
85
+ editorView.recordImeTraceForTesting(
86
+ "commitTextConsumesPendingCorrection",
87
+ "textLength=${text.length}"
88
+ )
89
+ commitTextToEditor(text, newCursorPosition)
90
+ return true
91
+ }
92
+
93
+ internal fun EditorInputConnection.applyPendingCompositionCorrectionCommitIfNeeded(
94
+ source: String
95
+ ): Boolean {
96
+ val pending = pendingCompositionCorrectionCommit ?: return false
97
+ pendingCompositionCorrectionCommit = null
98
+ pendingCompositionCorrectionGeneration += 1L
99
+ if (!isCurrentInputSessionFor("applyPendingCompositionCorrection")) return false
100
+ if (!editorView.isEditable || editorView.editorId == 0L) return false
101
+ editorView.recordImeTraceForTesting(
102
+ "applyPendingCompositionCorrection",
103
+ "source=$source textLength=${pending.text.length}"
104
+ )
105
+ commitTextToEditor(pending.text, 1)
106
+ return true
107
+ }
@@ -0,0 +1,128 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.graphics.Matrix
4
+ import android.graphics.Rect
5
+ import android.graphics.RectF
6
+ import android.text.Layout
7
+ import android.view.View
8
+ import android.view.inputmethod.BaseInputConnection
9
+ import android.view.inputmethod.CursorAnchorInfo
10
+
11
+ internal fun EditorEditText.buildSurfaceCursorAnchorInfo(): CursorAnchorInfo {
12
+ val mapper = imeTextCoordinateMapperForEditor()
13
+ ?: ImeTextCoordinateMapper.build(editableText, inputConnectionGeneration)
14
+ val raw = editableText
15
+ val layout = layout
16
+ val originX = totalPaddingLeft.toFloat() - scrollX
17
+ val originY = totalPaddingTop.toFloat() - scrollY
18
+ val start = selectionStart.coerceIn(0, raw.length)
19
+ val end = selectionEnd.coerceIn(0, raw.length)
20
+ val builder = CursorAnchorInfo.Builder()
21
+ .setMatrix(cursorScreenMatrix())
22
+ .setSelectionRange(mapper.rawToIme(start), mapper.rawToIme(end))
23
+ val visible = Rect()
24
+ getLocalVisibleRect(visible)
25
+ visible.offset(-scrollX, -scrollY)
26
+ fun flags(left: Float, top: Float, right: Float, bottom: Float, rtl: Boolean): Int {
27
+ val overlaps =
28
+ left <= visible.right && right >= visible.left && top < visible.bottom &&
29
+ bottom > visible.top
30
+ var result = if (overlaps) CursorAnchorInfo.FLAG_HAS_VISIBLE_REGION else 0
31
+ if (left < visible.left || right > visible.right || top < visible.top ||
32
+ bottom > visible.bottom ||
33
+ !overlaps
34
+ ) {
35
+ result = result or CursorAnchorInfo.FLAG_HAS_INVISIBLE_REGION
36
+ }
37
+ if (rtl) result = result or CursorAnchorInfo.FLAG_IS_RTL
38
+ return result
39
+ }
40
+ fun top(line: Int): Float =
41
+ originY + ((layout as? EditorDocumentLayout)?.textLineTop(line) ?: layout.getLineTop(line))
42
+ fun bottom(line: Int): Float = originY +
43
+ ((layout as? EditorDocumentLayout)?.textLineBottom(line) ?: layout.getLineBottom(line))
44
+ val line = layout.getLineForOffset(end)
45
+ val x = originX + layout.getPrimaryHorizontal(end)
46
+ val top = top(line)
47
+ val bottom = bottom(line)
48
+ builder.setInsertionMarkerLocation(
49
+ x,
50
+ top,
51
+ originY + layout.getLineBaseline(line),
52
+ bottom,
53
+ flags(x, top, x, bottom, layout.getParagraphDirection(line) == Layout.DIR_RIGHT_TO_LEFT)
54
+ )
55
+ val composingStart = BaseInputConnection.getComposingSpanStart(raw)
56
+ val composingEnd = BaseInputConnection.getComposingSpanEnd(raw)
57
+ if (composingStart >= 0 && composingEnd >= composingStart) {
58
+ val imeStart = mapper.rawToIme(composingStart)
59
+ val imeEnd = mapper.rawToIme(composingEnd)
60
+ builder.setComposingText(imeStart, mapper.visibleText.subSequence(imeStart, imeEnd))
61
+ var offset = imeStart
62
+ while (offset < imeEnd) {
63
+ val next = (
64
+ offset +
65
+ Character.charCount(Character.codePointAt(mapper.visibleText, offset))
66
+ ).coerceAtMost(imeEnd)
67
+ val rawStart = mapper.imeToRaw(offset, ImeTextCoordinateMapper.Affinity.AFTER)
68
+ val rawEnd = mapper.imeToRaw(next, ImeTextCoordinateMapper.Affinity.BEFORE)
69
+ val characterLine = layout.getLineForOffset(rawStart)
70
+ val leading = originX + layout.getPrimaryHorizontal(rawStart)
71
+ val trailing =
72
+ originX +
73
+ if (layout.getLineForOffset(rawEnd) ==
74
+ characterLine
75
+ ) {
76
+ layout.getPrimaryHorizontal(rawEnd)
77
+ } else {
78
+ layout.getLineRight(characterLine)
79
+ }
80
+ val bounds =
81
+ RectF(
82
+ minOf(leading, trailing),
83
+ top(characterLine),
84
+ maxOf(leading, trailing),
85
+ bottom(characterLine)
86
+ )
87
+ val characterFlags =
88
+ flags(
89
+ bounds.left,
90
+ bounds.top,
91
+ bounds.right,
92
+ bounds.bottom,
93
+ layout.isRtlCharAt(rawStart)
94
+ )
95
+ for (unit in offset until next) {
96
+ builder.addCharacterBounds(
97
+ unit,
98
+ bounds.left,
99
+ bounds.top,
100
+ bounds.right,
101
+ bounds.bottom,
102
+ characterFlags
103
+ )
104
+ }
105
+ offset = next
106
+ }
107
+ }
108
+ return builder.build()
109
+ }
110
+
111
+ private fun View.cursorScreenMatrix(): Matrix {
112
+ val result = Matrix()
113
+ fun append(view: View) {
114
+ (view.parent as? View)?.let { parent ->
115
+ append(parent)
116
+ result.preTranslate(-parent.scrollX.toFloat(), -parent.scrollY.toFloat())
117
+ }
118
+ result.preTranslate(view.left.toFloat(), view.top.toFloat())
119
+ result.preConcat(view.matrix)
120
+ }
121
+ append(this)
122
+ val origin = floatArrayOf(0f, 0f)
123
+ result.mapPoints(origin)
124
+ val screen = IntArray(2)
125
+ getLocationOnScreen(screen)
126
+ result.postTranslate(screen[0] - origin[0], screen[1] - origin[1])
127
+ return result
128
+ }
@@ -0,0 +1,134 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.content.Context
4
+ import android.text.TextUtils
5
+ import android.view.inputmethod.BaseInputConnection
6
+ import android.view.inputmethod.ExtractedText
7
+ import android.view.inputmethod.ExtractedTextRequest
8
+ import android.view.inputmethod.InputConnection
9
+ import android.view.inputmethod.InputMethodManager
10
+ import android.view.inputmethod.SurroundingText
11
+ import android.view.inputmethod.TextSnapshot
12
+ import androidx.annotation.RequiresApi
13
+
14
+ internal fun EditorInputConnection.extractedTextForIme(
15
+ request: ExtractedTextRequest?,
16
+ flags: Int
17
+ ): ExtractedText? {
18
+ val mapper = currentMapper() ?: return null
19
+ if (request != null && flags and InputConnection.GET_EXTRACTED_TEXT_MONITOR != 0) {
20
+ extractedTextRequest = ExtractedTextRequest().apply {
21
+ token = request.token
22
+ this.flags = request.flags
23
+ hintMaxLines = request.hintMaxLines
24
+ hintMaxChars = request.hintMaxChars
25
+ }
26
+ }
27
+ return buildExtractedText(mapper, request?.flags ?: 0).also {
28
+ if (flags and InputConnection.GET_EXTRACTED_TEXT_MONITOR !=
29
+ 0
30
+ ) {
31
+ lastPublishedExtractedText = it
32
+ }
33
+ }
34
+ }
35
+
36
+ private fun EditorInputConnection.buildExtractedText(
37
+ mapper: ImeTextCoordinateMapper,
38
+ flags: Int
39
+ ): ExtractedText = ExtractedText().apply {
40
+ text = imeTextSlice(mapper, 0, mapper.visibleText.length, flags)
41
+ startOffset = 0
42
+ partialStartOffset = -1
43
+ partialEndOffset = -1
44
+ selectionStart = mapper.rawToIme(editorView.selectionStart.coerceAtLeast(0))
45
+ selectionEnd = mapper.rawToIme(editorView.selectionEnd.coerceAtLeast(0))
46
+ this.flags =
47
+ if (editorView.inputType and android.text.InputType.TYPE_TEXT_FLAG_MULTI_LINE ==
48
+ 0
49
+ ) {
50
+ ExtractedText.FLAG_SINGLE_LINE
51
+ } else {
52
+ 0
53
+ }
54
+ }
55
+
56
+ @RequiresApi(31)
57
+ internal fun EditorInputConnection.surroundingTextForIme(
58
+ beforeLength: Int,
59
+ afterLength: Int,
60
+ flags: Int
61
+ ): SurroundingText? {
62
+ if (beforeLength < 0 || afterLength < 0) return null
63
+ val mapper = currentMapper() ?: return null
64
+ if (editorView.selectionStart < 0 || editorView.selectionEnd < 0) return null
65
+ val from = mapper.rawToIme(minOf(editorView.selectionStart, editorView.selectionEnd))
66
+ val to = mapper.rawToIme(maxOf(editorView.selectionStart, editorView.selectionEnd))
67
+ val start = (from.toLong() - beforeLength).coerceAtLeast(0).toInt()
68
+ val end = (to.toLong() + afterLength).coerceAtMost(mapper.visibleText.length.toLong()).toInt()
69
+ return SurroundingText(imeTextSlice(mapper, start, end, flags), from - start, to - start, start)
70
+ }
71
+
72
+ @RequiresApi(33)
73
+ internal fun EditorInputConnection.snapshotForIme(): TextSnapshot? {
74
+ val surrounding =
75
+ surroundingTextForIme(1024, 1024, InputConnection.GET_TEXT_WITH_STYLES) ?: return null
76
+ val mapper = currentMapper() ?: return null
77
+ val composing = composingSelectionForIme(mapper)
78
+ return TextSnapshot(
79
+ surrounding,
80
+ composing.first,
81
+ composing.second,
82
+ getCursorCapsMode(
83
+ TextUtils.CAP_MODE_CHARACTERS or TextUtils.CAP_MODE_WORDS or
84
+ TextUtils.CAP_MODE_SENTENCES
85
+ )
86
+ )
87
+ }
88
+
89
+ private fun EditorInputConnection.composingSelectionForIme(
90
+ mapper: ImeTextCoordinateMapper
91
+ ): Pair<Int, Int> {
92
+ val editable = editorView.editableText
93
+ val start = BaseInputConnection.getComposingSpanStart(editable)
94
+ val end = BaseInputConnection.getComposingSpanEnd(editable)
95
+ if (start < 0 || end < 0) return -1 to -1
96
+ return mapper.rawToIme(minOf(start, end)) to mapper.rawToIme(maxOf(start, end))
97
+ }
98
+
99
+ internal fun EditorInputConnection.publishInputStateIfNeeded() {
100
+ val mapper = currentMapper() ?: return
101
+ val composing = composingSelectionForIme(mapper)
102
+ val selection = listOf(
103
+ mapper.rawToIme(editorView.selectionStart.coerceAtLeast(0)),
104
+ mapper.rawToIme(editorView.selectionEnd.coerceAtLeast(0)),
105
+ composing.first,
106
+ composing.second
107
+ )
108
+ if (selection != lastPublishedSelection) {
109
+ lastPublishedSelection = selection
110
+ val manager = editorView.context.getSystemService(
111
+ Context.INPUT_METHOD_SERVICE
112
+ ) as? InputMethodManager
113
+ manager?.updateSelection(editorView, selection[0], selection[1], selection[2], selection[3])
114
+ }
115
+ publishExtractedTextIfNeeded()
116
+ }
117
+
118
+ internal fun EditorInputConnection.publishExtractedTextIfNeeded() {
119
+ val request = extractedTextRequest ?: return
120
+ val mapper = currentMapper() ?: return
121
+ val next = buildExtractedText(mapper, request.flags)
122
+ val previous = lastPublishedExtractedText
123
+ if (previous != null && previous.text == next.text &&
124
+ previous.selectionStart == next.selectionStart &&
125
+ previous.selectionEnd == next.selectionEnd && previous.flags == next.flags
126
+ ) {
127
+ return
128
+ }
129
+ lastPublishedExtractedText = next
130
+ val manager = editorView.context.getSystemService(
131
+ Context.INPUT_METHOD_SERVICE
132
+ ) as? InputMethodManager
133
+ manager?.updateExtractedText(editorView, request.token, next)
134
+ }