@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,113 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.text.style.AbsoluteSizeSpan
4
+ import android.text.style.ForegroundColorSpan
5
+ import android.text.style.StyleSpan
6
+ import android.text.style.TypefaceSpan
7
+
8
+ internal data class HardwareKeyEventSignature(
9
+ val keyCode: Int,
10
+ val downTime: Long,
11
+ val repeatCount: Int
12
+ )
13
+
14
+ internal data class ParsedRenderPatch(
15
+ val baseDocumentVersion: String?,
16
+ val startIndex: Int,
17
+ val deleteCount: Int,
18
+ val renderBlocks: org.json.JSONArray
19
+ )
20
+
21
+ internal data class RenderReplaceRange(val start: Int, val endExclusive: Int)
22
+
23
+ internal data class ParagraphSpanSnapshot(
24
+ val span: Any,
25
+ val start: Int,
26
+ val end: Int,
27
+ val flags: Int
28
+ )
29
+
30
+ internal data class PatchApplyTrace(
31
+ val applied: Boolean,
32
+ val eligibilityNanos: Long,
33
+ val buildRenderNanos: Long,
34
+ val applyRenderNanos: Long
35
+ )
36
+
37
+ internal data class ImageSelectionRange(val start: Int, val end: Int)
38
+
39
+ internal data class LogicalSelectionSnapshot(
40
+ val scalarAnchor: Int,
41
+ val scalarHead: Int,
42
+ val utf16Anchor: Int,
43
+ val utf16Head: Int,
44
+ val documentVersion: String?
45
+ )
46
+
47
+ internal data class ImageSpanHit(val span: BlockImageSpan, val start: Int, val end: Int)
48
+
49
+ internal data class ImageGesture(
50
+ val target: BlockImageSpan,
51
+ val pointerId: Int,
52
+ val downX: Float,
53
+ val downY: Float
54
+ )
55
+
56
+ internal data class LocalTextDrag(
57
+ val scalarFrom: Int,
58
+ val scalarTo: Int,
59
+ val documentVersion: String?,
60
+ val editorId: Long
61
+ )
62
+
63
+ internal data class NativeTextMutation(
64
+ val scalarFrom: Int,
65
+ val scalarTo: Int,
66
+ val replacementText: String,
67
+ val resultingText: String,
68
+ val replacementStartUtf16: Int,
69
+ val replacementEndUtf16: Int,
70
+ val selectionScalarAnchor: Int?,
71
+ val selectionScalarHead: Int?
72
+ )
73
+
74
+ internal data class NativeTextMutationAfterBlurWindow(
75
+ val editorId: Long,
76
+ val authorizedTextRevision: Long,
77
+ val deadlineMs: Long,
78
+ var didAdoptMutation: Boolean = false
79
+ )
80
+
81
+ internal data class NativeTextMutationAdoptionSuppression(
82
+ val editorId: Long,
83
+ val authorizedTextRevision: Long
84
+ )
85
+
86
+ internal data class ExternalTextCompositionState(
87
+ val sessionId: String,
88
+ var latestText: String,
89
+ val replacementStartUtf16: Int,
90
+ val replacementEndUtf16: Int,
91
+ val startingAuthorizedText: String,
92
+ val startingAuthorizedRenderedText: CharSequence?
93
+ )
94
+
95
+ internal interface TransientComposingTextStyleSpan
96
+
97
+ internal class TransientComposingSizeSpan(sizePx: Int) :
98
+ AbsoluteSizeSpan(sizePx, false),
99
+ TransientComposingTextStyleSpan
100
+
101
+ internal class TransientComposingColorSpan(color: Int) :
102
+ ForegroundColorSpan(color),
103
+ TransientComposingTextStyleSpan
104
+
105
+ internal class TransientComposingTypefaceSpan(family: String) :
106
+ TypefaceSpan(family),
107
+ TransientComposingTextStyleSpan
108
+
109
+ internal class TransientComposingStyleSpan(style: Int) :
110
+ StyleSpan(style),
111
+ TransientComposingTextStyleSpan
112
+
113
+ internal data class OptimisticInlineSpan(val span: Any, val flags: Int)
@@ -0,0 +1,92 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.text.Spanned
4
+ import android.view.MotionEvent
5
+ import com.apollohg.editor.EditorEditText.Companion.MARKER_TAP_HORIZONTAL_SLOP_DP
6
+
7
+ /**
8
+ * Task-marker taps are recognized as a paired DOWN+UP on the same marker
9
+ * within touch slop. DOWN is never consumed (so scrolls and selection
10
+ * gestures that start on a checkbox keep working); only the matching UP
11
+ * is consumed.
12
+ */
13
+ internal fun EditorEditText.handleTaskListMarkerTap(event: MotionEvent): Boolean {
14
+ when (event.actionMasked) {
15
+ MotionEvent.ACTION_DOWN -> {
16
+ pendingTaskMarkerDownScalar = taskListMarkerScalarHitAt(event.x, event.y)
17
+ pendingTaskMarkerDownX = event.x
18
+ pendingTaskMarkerDownY = event.y
19
+ return false
20
+ }
21
+
22
+ MotionEvent.ACTION_MOVE -> {
23
+ if (pendingTaskMarkerDownScalar != null && !withinTouchSlop(event)) {
24
+ pendingTaskMarkerDownScalar = null
25
+ }
26
+ return false
27
+ }
28
+
29
+ MotionEvent.ACTION_UP -> {
30
+ val downScalar = pendingTaskMarkerDownScalar ?: return false
31
+ pendingTaskMarkerDownScalar = null
32
+ if (!withinTouchSlop(event)) return false
33
+ val upScalar = taskListMarkerScalarHitAt(event.x, event.y) ?: return false
34
+ if (upScalar != downScalar) return false
35
+ if (!commitExternalTextCompositionBeforeInteractionIfNeeded()) return true
36
+ val authoritativeScalar = taskListMarkerScalarHitAt(event.x, event.y) ?: return true
37
+ toggleTaskItemCheckedAtSelectionScalarInRust(
38
+ authoritativeScalar,
39
+ authoritativeScalar
40
+ )
41
+ performClick()
42
+ return true
43
+ }
44
+
45
+ MotionEvent.ACTION_CANCEL -> {
46
+ pendingTaskMarkerDownScalar = null
47
+ return false
48
+ }
49
+
50
+ else -> return false
51
+ }
52
+ }
53
+
54
+ internal fun EditorEditText.withinTouchSlop(event: MotionEvent): Boolean =
55
+ kotlin.math.abs(event.x - pendingTaskMarkerDownX) <= touchSlopPx &&
56
+ kotlin.math.abs(event.y - pendingTaskMarkerDownY) <= touchSlopPx
57
+
58
+ internal fun EditorEditText.taskListMarkerScalarHitAt(x: Float, y: Float): Int? {
59
+ val spanned = text as? Spanned ?: return null
60
+ val textLayout = layout ?: return null
61
+ if (spanned.isEmpty()) return null
62
+
63
+ val localX = x + scrollX - totalPaddingLeft
64
+ val localY = y + scrollY - totalPaddingTop
65
+ if (localY < 0) return null
66
+
67
+ val line = textLayout.getLineForVertical(localY.toInt().coerceAtLeast(0))
68
+ val lineTop = textLayout.editorTextLineTop(line).toFloat()
69
+ val lineBottom = textLayout.editorTextLineBottom(line).toFloat()
70
+ if (localY < lineTop || localY > lineBottom) {
71
+ return null
72
+ }
73
+ val lineStart = textLayout.getLineStart(line).coerceIn(0, spanned.length)
74
+ val lineEnd = textLayout.getLineEnd(line).coerceIn(lineStart, spanned.length)
75
+ val markerEnd = renderedTaskListMarkerEnd(spanned, lineStart, lineEnd) ?: return null
76
+ val markerRight = textLayout.getPrimaryHorizontal(markerEnd).coerceAtLeast(
77
+ textLayout.getPrimaryHorizontal(lineStart)
78
+ ) + MARKER_TAP_HORIZONTAL_SLOP_DP * resources.displayMetrics.density
79
+ if (localX > markerRight) {
80
+ return null
81
+ }
82
+
83
+ // Confirmed hit: only now pay for the String conversion the
84
+ // PositionBridge scalar math requires.
85
+ val currentText = spanned.toString()
86
+ val snappedUtf16 = PositionBridge.snapToScalarBoundary(
87
+ lineStart,
88
+ currentText,
89
+ biasForward = true
90
+ )
91
+ return PositionBridge.utf16ToScalar(snappedUtf16, currentText)
92
+ }
@@ -0,0 +1,327 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.text.Editable
4
+ import android.text.Selection
5
+ import android.text.Spanned
6
+ import android.text.style.AbsoluteSizeSpan
7
+ import android.text.style.BackgroundColorSpan
8
+ import android.text.style.ForegroundColorSpan
9
+ import android.text.style.StrikethroughSpan
10
+ import android.text.style.StyleSpan
11
+ import android.text.style.UnderlineSpan
12
+
13
+ /**
14
+ * Handle committed text from the IME (typed characters, autocomplete).
15
+ *
16
+ * Called by [EditorInputConnection.commitText]. Routes the text through
17
+ * the Rust editor instead of directly inserting into the EditText.
18
+ */
19
+ internal fun EditorEditText.handleTextCommitImpl(text: String, newCursorPosition: Int = 1) {
20
+ val startedAt = System.nanoTime()
21
+ if (!isEditable) {
22
+ recordImeTraceForTesting(
23
+ "handleTextCommitNoop",
24
+ "reason=notEditable textLength=${text.length}"
25
+ )
26
+ return
27
+ }
28
+ if (isApplyingRustState) {
29
+ recordImeTraceForTesting(
30
+ "handleTextCommitNoop",
31
+ "reason=applyingRust textLength=${text.length}"
32
+ )
33
+ return
34
+ }
35
+ val selectionRange = normalizedUtf16SelectionRange()
36
+ if (selectionRange == null) {
37
+ recordImeTraceForTesting(
38
+ "handleTextCommitNoop",
39
+ "reason=noSelection textLength=${text.length}"
40
+ )
41
+ return
42
+ }
43
+ if (isCollapsedAtomBoundarySelection(selectionRange.first, selectionRange.second)) {
44
+ recordImeTraceForTesting(
45
+ "handleTextCommitNoop",
46
+ "reason=atomBoundary textLength=${text.length}"
47
+ )
48
+ return
49
+ }
50
+ if (editorId == 0L) {
51
+ val editable = this.text ?: return
52
+ val (start, end) = selectionRange
53
+ editable.replace(start, end, text)
54
+ recordImeTraceForTesting(
55
+ "handleTextCommitDirect",
56
+ "textLength=${text.length} utf16Sel=$start..$end totalUs=${nanosToMicros(
57
+ System.nanoTime() - startedAt
58
+ )}"
59
+ )
60
+ return
61
+ }
62
+ if (discardTransientInputForDestroyedEditorIfNeeded()) {
63
+ recordImeTraceForTesting(
64
+ "handleTextCommitNoop",
65
+ "reason=destroyedEditor textLength=${text.length}"
66
+ )
67
+ return
68
+ }
69
+
70
+ if (text == "\n") {
71
+ recordImeTraceForTesting(
72
+ "handleTextCommit",
73
+ "route=return utf16Sel=${selectionRange.first}..${selectionRange.second}"
74
+ )
75
+ handleReturnKey()
76
+ recordImeTraceForTesting(
77
+ "handleTextCommitDone",
78
+ "route=return totalUs=${nanosToMicros(System.nanoTime() - startedAt)}"
79
+ )
80
+ return
81
+ }
82
+
83
+ val currentText = this.text?.toString() ?: ""
84
+ val scalarSelectionRange = normalizedScalarSelectionRange(currentText)
85
+ if (scalarSelectionRange == null) {
86
+ recordImeTraceForTesting(
87
+ "handleTextCommitNoop",
88
+ "reason=noScalarSelection textLength=${text.length}"
89
+ )
90
+ return
91
+ }
92
+ val (scalarStart, scalarEnd) = scalarSelectionRange
93
+ val requestedCursor = requestedCursorScalar(
94
+ scalarStart,
95
+ scalarEnd,
96
+ currentText,
97
+ text,
98
+ newCursorPosition
99
+ )
100
+ recordImeTraceForTesting(
101
+ "handleTextCommit",
102
+ "textLength=${text.length} cursor=$newCursorPosition utf16Sel=${selectionRange.first}..${selectionRange.second} scalarSel=$scalarStart..$scalarEnd requestedCursor=$requestedCursor"
103
+ )
104
+ val didApplyOptimisticVisibleText = applyOptimisticPlainTextCommitIfPossible(
105
+ startUtf16 = selectionRange.first,
106
+ endUtf16 = selectionRange.second,
107
+ committedText = text,
108
+ newCursorPosition = newCursorPosition,
109
+ logicalCursorAfter = requestedCursor
110
+ ?: scalarStart + text.codePointCount(0, text.length)
111
+ )
112
+ if (didApplyOptimisticVisibleText) {
113
+ recordImeTraceForTesting(
114
+ "optimisticVisibleTextCommit",
115
+ "textLength=${text.length} utf16Sel=${selectionRange.first}..${selectionRange.second}"
116
+ )
117
+ }
118
+ insertPlainTextRangeInRust(
119
+ scalarStart,
120
+ scalarEnd,
121
+ text,
122
+ requestedCursorScalar = requestedCursor
123
+ )
124
+ recordImeTraceForTesting(
125
+ "handleTextCommitDone",
126
+ "textLength=${text.length} totalUs=${nanosToMicros(System.nanoTime() - startedAt)}"
127
+ )
128
+ }
129
+
130
+ internal fun EditorEditText.applyOptimisticPlainTextCommitIfPossible(
131
+ startUtf16: Int,
132
+ endUtf16: Int,
133
+ committedText: String,
134
+ newCursorPosition: Int,
135
+ logicalCursorAfter: Int
136
+ ): Boolean {
137
+ if (newCursorPosition != 1) return false
138
+ if (startUtf16 != endUtf16) return false
139
+ if (committedText.isEmpty()) return false
140
+ if (committedText.codePointCount(0, committedText.length) != 1) return false
141
+ if (committedText.indexOf('\n') >= 0 || committedText.indexOf('\r') >= 0) return false
142
+ if (hasCompositionTrackingForEditor()) return false
143
+ val editable = text ?: return false
144
+ val currentText = editable.toString()
145
+ if (currentText != lastAuthorizedText) return false
146
+ if (startUtf16 < 0 || endUtf16 < startUtf16 || endUtf16 > editable.length) return false
147
+ val spanned = editable as? Spanned
148
+ if (spanned != null &&
149
+ spannedRangeContainsImageSpan(spanned, startUtf16, endUtf16)
150
+ ) {
151
+ return false
152
+ }
153
+
154
+ val inlineSpans = spanned?.let {
155
+ optimisticInlineSpansForInsertion(it, startUtf16)
156
+ }.orEmpty()
157
+ var didApply = false
158
+ runWithTransientInputMutationGuard {
159
+ editable.replace(startUtf16, endUtf16, committedText)
160
+ val insertedEnd = startUtf16 + committedText.length
161
+ applyOptimisticInlineSpans(editable, startUtf16, insertedEnd, inlineSpans)
162
+ rememberLogicalSelection(
163
+ scalarAnchor = logicalCursorAfter,
164
+ scalarHead = logicalCursorAfter,
165
+ utf16Anchor = insertedEnd,
166
+ utf16Head = insertedEnd
167
+ )
168
+ Selection.setSelection(editable, insertedEnd, insertedEnd)
169
+ didApply = true
170
+ true
171
+ }
172
+ if (didApply) {
173
+ pendingOptimisticRenderText = editable.toString()
174
+ }
175
+ return didApply
176
+ }
177
+
178
+ internal fun EditorEditText.optimisticInlineSpansForInsertion(
179
+ spanned: Spanned,
180
+ insertionStart: Int
181
+ ): List<OptimisticInlineSpan> {
182
+ if (spanned.isEmpty()) return emptyList()
183
+ val sourceIndex = when {
184
+ insertionStart > 0 -> insertionStart - 1
185
+ insertionStart < spanned.length -> insertionStart
186
+ else -> return emptyList()
187
+ }
188
+ val queryStart = sourceIndex.coerceIn(0, spanned.length - 1)
189
+ val queryEnd = (queryStart + 1).coerceAtMost(spanned.length)
190
+ val spans = mutableListOf<OptimisticInlineSpan>()
191
+ spanned.getSpans(queryStart, queryEnd, Any::class.java).forEach { span ->
192
+ if (spanned.getSpanStart(span) > queryStart || spanned.getSpanEnd(span) <= queryStart) {
193
+ return@forEach
194
+ }
195
+ cloneOptimisticInlineSpan(span)?.let { clone ->
196
+ spans.add(OptimisticInlineSpan(clone, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE))
197
+ }
198
+ }
199
+ return spans
200
+ }
201
+
202
+ internal fun EditorEditText.cloneOptimisticInlineSpan(span: Any): Any? = when (span) {
203
+ is ForegroundColorSpan -> ForegroundColorSpan(span.foregroundColor)
204
+ is BackgroundColorSpan -> BackgroundColorSpan(span.backgroundColor)
205
+ is AbsoluteSizeSpan -> AbsoluteSizeSpan(span.size, span.dip)
206
+ is StyleSpan -> StyleSpan(span.style)
207
+ is UnderlineSpan -> UnderlineSpan()
208
+ is StrikethroughSpan -> StrikethroughSpan()
209
+ else -> null
210
+ }
211
+
212
+ internal fun EditorEditText.applyOptimisticInlineSpans(
213
+ editable: Editable,
214
+ start: Int,
215
+ end: Int,
216
+ inlineSpans: List<OptimisticInlineSpan>
217
+ ) {
218
+ if (start >= end || end > editable.length) return
219
+ var hasColor = false
220
+ var hasSize = false
221
+ inlineSpans.forEach { spec ->
222
+ hasColor = hasColor || spec.span is ForegroundColorSpan
223
+ hasSize = hasSize || spec.span is AbsoluteSizeSpan
224
+ editable.setSpan(spec.span, start, end, spec.flags)
225
+ }
226
+ val textStyle = theme?.effectiveTextStyle("paragraph")
227
+ if (!hasColor) {
228
+ editable.setSpan(
229
+ ForegroundColorSpan(textStyle?.color ?: baseTextColor),
230
+ start,
231
+ end,
232
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
233
+ )
234
+ }
235
+ if (!hasSize) {
236
+ val resolvedTextSize =
237
+ textStyle?.fontSize?.times(resources.displayMetrics.density) ?: baseFontSize
238
+ editable.setSpan(
239
+ AbsoluteSizeSpan(resolvedTextSize.toInt(), false),
240
+ start,
241
+ end,
242
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
243
+ )
244
+ }
245
+ }
246
+
247
+ internal fun EditorEditText.applyVisibleCompositionCommitForPendingImeOperationForEditorImpl(
248
+ committedText: String,
249
+ replacementStartUtf16: Int,
250
+ replacementEndUtf16: Int,
251
+ newCursorPosition: Int
252
+ ): Boolean {
253
+ val editable = text ?: return false
254
+ val currentText = editable.toString()
255
+ val (startUtf16, endUtf16) = PositionBridge.snapRangeToScalarBoundaries(
256
+ replacementStartUtf16,
257
+ replacementEndUtf16,
258
+ currentText
259
+ )
260
+ if (startUtf16 > endUtf16 || endUtf16 > editable.length) return false
261
+ var didApply = false
262
+ runWithTransientInputMutationGuard {
263
+ editable.replace(startUtf16, endUtf16, committedText)
264
+ val insertedEnd = startUtf16 + committedText.length
265
+ val requestedCursor = when {
266
+ newCursorPosition > 0 -> insertedEnd + newCursorPosition - 1
267
+ newCursorPosition < 0 -> startUtf16 + newCursorPosition
268
+ else -> insertedEnd
269
+ }.coerceIn(0, editable.length)
270
+ Selection.setSelection(editable, requestedCursor, requestedCursor)
271
+ didApply = true
272
+ true
273
+ }
274
+ if (didApply) {
275
+ pendingOptimisticRenderText = null
276
+ }
277
+ return didApply
278
+ }
279
+
280
+ internal fun EditorEditText.commitVisibleCompositionMutationForPendingImeOperationImpl(
281
+ committedText: String,
282
+ newCursorPosition: Int
283
+ ): Boolean {
284
+ if (committedText.isEmpty()) return false
285
+ val currentText = text?.toString() ?: return false
286
+ val mutation = nativeTextMutationFromAuthorizedDiff(currentText) ?: return false
287
+ val tokenRange = committedTokenRangeAroundMutation(
288
+ currentText,
289
+ mutation.replacementStartUtf16,
290
+ mutation.replacementEndUtf16
291
+ ) ?: run {
292
+ recordImeTraceForTesting(
293
+ "alreadyVisibleCompositionNoop",
294
+ "reason=noToken committedLength=${committedText.length} visibleRange=${mutation.replacementStartUtf16}..${mutation.replacementEndUtf16}"
295
+ )
296
+ return false
297
+ }
298
+ val visibleToken = currentText.substring(tokenRange.first, tokenRange.second)
299
+ if (visibleToken != committedText) {
300
+ recordImeTraceForTesting(
301
+ "alreadyVisibleCompositionNoop",
302
+ "reason=tokenMismatch committedLength=${committedText.length} tokenLength=${visibleToken.length} visibleRange=${mutation.replacementStartUtf16}..${mutation.replacementEndUtf16}"
303
+ )
304
+ return false
305
+ }
306
+
307
+ val authorizedText = lastAuthorizedText
308
+ val requestedCursor = requestedCursorScalar(
309
+ mutation.scalarFrom,
310
+ mutation.scalarTo,
311
+ authorizedText,
312
+ mutation.replacementText,
313
+ newCursorPosition
314
+ )
315
+ recordImeTraceForTesting(
316
+ "alreadyVisibleCompositionApply",
317
+ "range=${mutation.scalarFrom}..${mutation.scalarTo} replacementLength=${mutation.replacementText.length} committedLength=${committedText.length} requestedCursor=$requestedCursor"
318
+ )
319
+ pendingOptimisticRenderText = null
320
+ insertPlainTextRangeInRust(
321
+ mutation.scalarFrom,
322
+ mutation.scalarTo,
323
+ mutation.replacementText,
324
+ requestedCursorScalar = requestedCursor
325
+ )
326
+ return true
327
+ }
@@ -0,0 +1,84 @@
1
+ package com.apollohg.editor
2
+
3
+ internal fun EditorEditText.prepareForToolbarCommandWithExternalOwner(): Boolean {
4
+ if (!isEditable || isApplyingRustState || !hasLiveEditor()) return false
5
+ if (externalTextComposition == null) return true
6
+ return commitExternalTextCompositionBeforeInteractionIfNeeded() &&
7
+ prepareForExternalEditorUpdate()
8
+ }
9
+
10
+ internal fun EditorEditText.performToolbarToggleMarkImpl(markName: String) {
11
+ if (!prepareForToolbarCommandWithExternalOwner()) return
12
+ val selection = currentScalarSelection() ?: return
13
+ v2Driver?.let { driver ->
14
+ driver.toggleMark(markName, selection.first, selection.second)?.let { applyUpdateJSON(it) }
15
+ }
16
+ }
17
+
18
+ internal fun EditorEditText.performToolbarToggleListImpl(listType: String, isActive: Boolean) {
19
+ if (!prepareForToolbarCommandWithExternalOwner()) return
20
+ val selection = currentScalarSelection() ?: return
21
+ v2Driver?.let { driver ->
22
+ val update = if (isActive) {
23
+ driver.unwrapFromList(selection.first, selection.second)
24
+ } else {
25
+ driver.wrapInList(listType, selection.first, selection.second)
26
+ }
27
+ update?.let { applyUpdateJSON(it) }
28
+ }
29
+ }
30
+
31
+ internal fun EditorEditText.performToolbarToggleBlockquoteImpl() {
32
+ if (!prepareForToolbarCommandWithExternalOwner()) return
33
+ val selection = currentScalarSelection() ?: return
34
+ v2Driver?.let { driver ->
35
+ driver.toggleBlockquote(selection.first, selection.second)?.let { applyUpdateJSON(it) }
36
+ }
37
+ }
38
+
39
+ internal fun EditorEditText.performToolbarToggleHeadingImpl(level: Int) {
40
+ if (!prepareForToolbarCommandWithExternalOwner()) return
41
+ if (level !in 1..6) return
42
+ val selection = currentScalarSelection() ?: return
43
+ v2Driver?.let { driver ->
44
+ driver.toggleHeading(level, selection.first, selection.second)?.let { applyUpdateJSON(it) }
45
+ }
46
+ }
47
+
48
+ internal fun EditorEditText.performToolbarIndentListItemImpl() {
49
+ if (!prepareForToolbarCommandWithExternalOwner()) return
50
+ val selection = currentScalarSelection() ?: return
51
+ v2Driver?.let { driver ->
52
+ driver.indentListItem(selection.first, selection.second)?.let { applyUpdateJSON(it) }
53
+ }
54
+ }
55
+
56
+ internal fun EditorEditText.performToolbarOutdentListItemImpl() {
57
+ if (!prepareForToolbarCommandWithExternalOwner()) return
58
+ val selection = currentScalarSelection() ?: return
59
+ v2Driver?.let { driver ->
60
+ driver.outdentListItem(selection.first, selection.second)?.let { applyUpdateJSON(it) }
61
+ }
62
+ }
63
+
64
+ internal fun EditorEditText.performToolbarInsertNodeImpl(nodeType: String) {
65
+ if (!prepareForToolbarCommandWithExternalOwner()) return
66
+ val selection = currentScalarSelection() ?: return
67
+ v2Driver?.let { driver ->
68
+ driver.insertNode(nodeType, selection.first, selection.second)?.let { applyUpdateJSON(it) }
69
+ }
70
+ }
71
+
72
+ internal fun EditorEditText.performToolbarUndoImpl() {
73
+ if (!prepareForToolbarCommandWithExternalOwner()) return
74
+ v2Driver?.let { driver ->
75
+ driver.undo()?.let { applyUpdateJSON(it) }
76
+ }
77
+ }
78
+
79
+ internal fun EditorEditText.performToolbarRedoImpl() {
80
+ if (!prepareForToolbarCommandWithExternalOwner()) return
81
+ v2Driver?.let { driver ->
82
+ driver.redo()?.let { applyUpdateJSON(it) }
83
+ }
84
+ }