@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,372 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.os.Handler
4
+ import android.os.Looper
5
+ import java.lang.ref.WeakReference
6
+ import java.util.concurrent.CountDownLatch
7
+ import java.util.concurrent.TimeUnit
8
+ import java.util.concurrent.atomic.AtomicInteger
9
+ import java.util.concurrent.atomic.AtomicReference
10
+ import org.json.JSONObject
11
+
12
+ private const val DESTROY_INVALIDATION_AWAIT_TIMEOUT_MS = 250L
13
+
14
+ internal enum class NativeEditorDestroyReservationResult {
15
+ RESERVED,
16
+ ALREADY_IN_PROGRESS,
17
+ UNAVAILABLE
18
+ }
19
+
20
+ private class WeakNativeEditorExpoView private constructor(
21
+ val view: WeakReference<NativeEditorExpoView?>
22
+ ) {
23
+ constructor(view: NativeEditorExpoView) : this(WeakReference(view))
24
+
25
+ companion object {
26
+ fun cleared(): WeakNativeEditorExpoView =
27
+ WeakNativeEditorExpoView(WeakReference<NativeEditorExpoView?>(null))
28
+ }
29
+ }
30
+
31
+ internal object NativeEditorViewRegistry {
32
+ private data class CommandPreparationSnapshot(
33
+ val view: NativeEditorExpoView?,
34
+ val isDetached: Boolean,
35
+ val isDestroyed: Boolean
36
+ )
37
+
38
+ private val liveEditorIds = mutableSetOf<Long>()
39
+ private val viewsByEditorId = mutableMapOf<Long, MutableList<WeakNativeEditorExpoView>>()
40
+ private val inputViewsByEditorId =
41
+ mutableMapOf<Long, MutableList<WeakReference<EditorEditText>>>()
42
+ private val detachedEditorOwnersByEditorId = mutableMapOf<Long, WeakNativeEditorExpoView>()
43
+ private val destroyingEditorIds = mutableSetOf<Long>()
44
+ private val destroyReservationWasLive = mutableMapOf<Long, Boolean>()
45
+ private val mainHandler = Handler(Looper.getMainLooper())
46
+
47
+ @Volatile
48
+ internal var onFinalizeDestroyForTesting: ((Long) -> Unit)? = null
49
+
50
+ @Synchronized
51
+ fun markEditorCreated(editorId: Long) {
52
+ if (editorId == 0L) return
53
+ liveEditorIds.add(editorId)
54
+ destroyingEditorIds.remove(editorId)
55
+ destroyReservationWasLive.remove(editorId)
56
+ }
57
+
58
+ @Synchronized
59
+ fun register(editorId: Long, view: NativeEditorExpoView): Boolean {
60
+ if (editorId == 0L) return false
61
+ if (destroyingEditorIds.contains(editorId)) return false
62
+ val isKnownDetachedOwner = detachedEditorOwnersByEditorId[editorId]?.view?.get() === view
63
+ if (
64
+ !liveEditorIds.contains(editorId) &&
65
+ !isKnownDetachedOwner &&
66
+ !rustEditorExists(editorId)
67
+ ) {
68
+ return false
69
+ }
70
+ val views = viewsByEditorId.getOrPut(editorId) { mutableListOf() }
71
+ views.removeAll { it.view.get() == null || it.view.get() === view }
72
+ views += WeakNativeEditorExpoView(view)
73
+ detachedEditorOwnersByEditorId.remove(editorId)
74
+ return true
75
+ }
76
+
77
+ @Synchronized
78
+ fun unregister(
79
+ editorId: Long,
80
+ view: NativeEditorExpoView,
81
+ blockCommandsUntilRegistered: Boolean = false
82
+ ) {
83
+ if (editorId == 0L) return
84
+ val registeredViews = viewsByEditorId[editorId]
85
+ val wasRegistered = registeredViews?.any { it.view.get() === view } == true
86
+ registeredViews?.removeAll { it.view.get() == null || it.view.get() === view }
87
+ if (registeredViews?.isEmpty() == true) viewsByEditorId.remove(editorId)
88
+ if (blockCommandsUntilRegistered) {
89
+ detachedEditorOwnersByEditorId[editorId] = WeakNativeEditorExpoView(view)
90
+ } else {
91
+ val detachedOwner = detachedEditorOwnersByEditorId[editorId]?.view?.get()
92
+ if (wasRegistered || detachedOwner === view) {
93
+ detachedEditorOwnersByEditorId.remove(editorId)
94
+ }
95
+ }
96
+ }
97
+
98
+ @Synchronized
99
+ fun isDestroyed(editorId: Long): Boolean = destroyingEditorIds.contains(editorId)
100
+
101
+ @Synchronized
102
+ internal fun retainedDestroyedIdCountForTests(): Int = destroyingEditorIds.size
103
+
104
+ @Synchronized
105
+ internal fun forceDetachedOwnerClearedForTesting(editorId: Long) {
106
+ detachedEditorOwnersByEditorId[editorId] = WeakNativeEditorExpoView.cleared()
107
+ }
108
+
109
+ @Synchronized
110
+ internal fun forceRegisteredViewsClearedForTesting(editorId: Long) {
111
+ viewsByEditorId[editorId] = mutableListOf(WeakNativeEditorExpoView.cleared())
112
+ }
113
+
114
+ @Synchronized
115
+ internal fun boundViewReferenceCountForTests(editorId: Long): Int =
116
+ viewsByEditorId[editorId]?.size ?: 0
117
+
118
+ @Synchronized
119
+ private fun liveViewsFor(editorId: Long): List<NativeEditorExpoView> =
120
+ viewsByEditorId[editorId]?.mapNotNull { it.view.get() }.orEmpty()
121
+
122
+ fun rebaseAfterRemoteCommit(handle: String) {
123
+ val viewToken = EditorV2Registry.viewTokenForHandle(handle) ?: return
124
+ liveViewsFor(viewToken).forEach { view ->
125
+ if (view.markRemoteCommitRebaseScheduled(viewToken)) {
126
+ mainHandler.post { view.applyRemoteCommitRefresh(viewToken) }
127
+ }
128
+ }
129
+ }
130
+
131
+ @Synchronized
132
+ fun registerInputView(editorId: Long, view: EditorEditText) {
133
+ if (editorId == 0L || destroyingEditorIds.contains(editorId)) return
134
+ if (!liveEditorIds.contains(editorId) && !rustEditorExists(editorId)) return
135
+ val views = inputViewsByEditorId.getOrPut(editorId) { mutableListOf() }
136
+ views.removeAll { it.get() == null || it.get() === view }
137
+ views += WeakReference(view)
138
+ }
139
+
140
+ @Synchronized
141
+ fun acquireDestroyReservation(editorId: Long): NativeEditorDestroyReservationResult {
142
+ if (editorId == 0L) return NativeEditorDestroyReservationResult.UNAVAILABLE
143
+ if (destroyingEditorIds.contains(editorId)) {
144
+ return NativeEditorDestroyReservationResult.ALREADY_IN_PROGRESS
145
+ }
146
+ if (!liveEditorIds.contains(editorId) && !rustEditorExists(editorId)) {
147
+ return NativeEditorDestroyReservationResult.UNAVAILABLE
148
+ }
149
+ destroyingEditorIds.add(editorId)
150
+ destroyReservationWasLive[editorId] = liveEditorIds.remove(editorId)
151
+ return NativeEditorDestroyReservationResult.RESERVED
152
+ }
153
+
154
+ fun beginDestroy(editorId: Long): Boolean =
155
+ acquireDestroyReservation(editorId) == NativeEditorDestroyReservationResult.RESERVED
156
+
157
+ /** Undo an in-flight reservation after an FFI result that is retryable or malformed. */
158
+ @Synchronized
159
+ fun rollbackDestroy(editorId: Long) {
160
+ if (!destroyingEditorIds.remove(editorId)) return
161
+ if (destroyReservationWasLive.remove(editorId) == true) {
162
+ liveEditorIds.add(editorId)
163
+ }
164
+ }
165
+
166
+ fun invalidateDestroyedEditor(editorId: Long) {
167
+ if (!beginDestroy(editorId)) return
168
+ finalizeDestroy(editorId)
169
+ }
170
+
171
+ /**
172
+ * Finalize a reserved destroy. Off-main callers may time out while the
173
+ * main-thread invalidation is still queued, so completion is reported only
174
+ * after the reservation itself has been released.
175
+ */
176
+ fun finalizeDestroy(editorId: Long, onCompleted: (() -> Unit)? = null) {
177
+ val affectedViews = synchronized(this) {
178
+ if (!destroyingEditorIds.contains(editorId)) return@synchronized null
179
+ val views = listOfNotNull(
180
+ *viewsByEditorId.remove(editorId)
181
+ .orEmpty()
182
+ .mapNotNull { it.view.get() }
183
+ .toTypedArray(),
184
+ detachedEditorOwnersByEditorId.remove(editorId)?.view?.get()
185
+ ).distinct()
186
+ val inputViews = inputViewsByEditorId.remove(editorId)
187
+ .orEmpty()
188
+ .mapNotNull { it.get() }
189
+ .distinct()
190
+ views to inputViews
191
+ }
192
+ if (affectedViews == null) {
193
+ onCompleted?.invoke()
194
+ return
195
+ }
196
+ fun releaseReservation() {
197
+ synchronized(this) {
198
+ destroyingEditorIds.remove(editorId)
199
+ destroyReservationWasLive.remove(editorId)
200
+ }
201
+ onCompleted?.invoke()
202
+ }
203
+ invokeDestroyTestingHook(onFinalizeDestroyForTesting, editorId)
204
+ if (affectedViews.first.isEmpty() && affectedViews.second.isEmpty()) {
205
+ releaseReservation()
206
+ return
207
+ }
208
+ val invalidate = Runnable {
209
+ try {
210
+ affectedViews.first.forEach { view ->
211
+ view.handleEditorDestroyed(editorId)
212
+ }
213
+ affectedViews.second.forEach { view ->
214
+ view.handleEditorDestroyedFromRegistry(editorId)
215
+ }
216
+ } finally {
217
+ releaseReservation()
218
+ }
219
+ }
220
+ if (Looper.myLooper() == Looper.getMainLooper()) {
221
+ invalidate.run()
222
+ } else {
223
+ val latch = CountDownLatch(1)
224
+ val posted = mainHandler.post {
225
+ try {
226
+ invalidate.run()
227
+ } finally {
228
+ latch.countDown()
229
+ }
230
+ }
231
+ if (!posted) {
232
+ releaseReservation()
233
+ return
234
+ }
235
+ try {
236
+ latch.await(DESTROY_INVALIDATION_AWAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)
237
+ } catch (_: InterruptedException) {
238
+ Thread.currentThread().interrupt()
239
+ } catch (_: Throwable) {
240
+ return
241
+ }
242
+ }
243
+ }
244
+
245
+ fun prepareForCommandJSON(editorId: Long): String {
246
+ val prepare = {
247
+ val snapshot = synchronized(this) {
248
+ val isDestroyed = destroyingEditorIds.contains(editorId)
249
+ if (isDestroyed) {
250
+ return@synchronized CommandPreparationSnapshot(
251
+ view = null,
252
+ isDetached = false,
253
+ isDestroyed = true
254
+ )
255
+ }
256
+ val registeredViews = viewsByEditorId[editorId]
257
+ registeredViews?.removeAll { it.view.get() == null }
258
+ val candidate = registeredViews?.firstNotNullOfOrNull { it.view.get() }
259
+ if (registeredViews?.isEmpty() == true) {
260
+ viewsByEditorId.remove(editorId)
261
+ }
262
+ val detachedOwner = detachedEditorOwnersByEditorId[editorId]?.view?.get()
263
+ val isDetached = if (detachedOwner == null) {
264
+ detachedEditorOwnersByEditorId.remove(editorId)
265
+ false
266
+ } else {
267
+ true
268
+ }
269
+ val missingFromRust =
270
+ !liveEditorIds.contains(editorId) &&
271
+ candidate == null &&
272
+ !isDetached &&
273
+ !rustEditorExists(editorId)
274
+ CommandPreparationSnapshot(
275
+ view = candidate,
276
+ isDetached = isDetached,
277
+ isDestroyed = missingFromRust
278
+ )
279
+ }
280
+ snapshot.view?.prepareForEditorCommandJSON()
281
+ ?: commandPreparationJSON(
282
+ ready = !snapshot.isDetached && !snapshot.isDestroyed,
283
+ blockedReason = if (snapshot.isDestroyed) {
284
+ "destroyed"
285
+ } else if (snapshot.isDetached) {
286
+ "detached"
287
+ } else {
288
+ null
289
+ }
290
+ )
291
+ }
292
+
293
+ if (Looper.myLooper() == Looper.getMainLooper()) {
294
+ return prepare()
295
+ }
296
+
297
+ val result =
298
+ AtomicReference(commandPreparationJSON(ready = false, blockedReason = "unknown"))
299
+ val state = AtomicInteger(PREFLIGHT_STATE_QUEUED)
300
+ val latch = CountDownLatch(1)
301
+ if (!mainHandler.post {
302
+ try {
303
+ if (state.compareAndSet(PREFLIGHT_STATE_QUEUED, PREFLIGHT_STATE_RUNNING)) {
304
+ result.set(prepare())
305
+ state.set(PREFLIGHT_STATE_DONE)
306
+ }
307
+ } finally {
308
+ latch.countDown()
309
+ }
310
+ }
311
+ ) {
312
+ return commandPreparationJSON(ready = false, blockedReason = "unknown")
313
+ }
314
+ try {
315
+ if (!latch.await(DESTROY_INVALIDATION_AWAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
316
+ if (state.compareAndSet(PREFLIGHT_STATE_QUEUED, PREFLIGHT_STATE_CANCELLED)) {
317
+ return commandPreparationJSON(ready = false, blockedReason = "unknown")
318
+ }
319
+ if (state.get() == PREFLIGHT_STATE_RUNNING) {
320
+ latch.await()
321
+ return result.get()
322
+ }
323
+ return commandPreparationJSON(ready = false, blockedReason = "unknown")
324
+ }
325
+ } catch (_: InterruptedException) {
326
+ var interrupted = true
327
+ if (state.compareAndSet(PREFLIGHT_STATE_QUEUED, PREFLIGHT_STATE_CANCELLED)) {
328
+ Thread.currentThread().interrupt()
329
+ return commandPreparationJSON(ready = false, blockedReason = "unknown")
330
+ }
331
+ while (state.get() == PREFLIGHT_STATE_RUNNING) {
332
+ try {
333
+ latch.await()
334
+ break
335
+ } catch (_: InterruptedException) {
336
+ interrupted = true
337
+ }
338
+ }
339
+ if (interrupted) {
340
+ Thread.currentThread().interrupt()
341
+ }
342
+ return if (state.get() == PREFLIGHT_STATE_DONE) {
343
+ result.get()
344
+ } else {
345
+ commandPreparationJSON(ready = false, blockedReason = "unknown")
346
+ }
347
+ }
348
+ return result.get()
349
+ }
350
+
351
+ private fun rustEditorExists(viewToken: Long): Boolean =
352
+ EditorV2Registry.adapterForViewToken(viewToken) != null
353
+
354
+ fun commandPreparationJSON(
355
+ ready: Boolean,
356
+ updateJSON: String? = null,
357
+ blockedReason: String? = null
358
+ ): String = JSONObject().apply {
359
+ put("ready", ready)
360
+ if (updateJSON != null) {
361
+ put("updateJSON", updateJSON)
362
+ }
363
+ if (!ready && blockedReason != null) {
364
+ put("blockedReason", blockedReason)
365
+ }
366
+ }.toString()
367
+
368
+ private const val PREFLIGHT_STATE_QUEUED = 0
369
+ private const val PREFLIGHT_STATE_RUNNING = 1
370
+ private const val PREFLIGHT_STATE_CANCELLED = 2
371
+ private const val PREFLIGHT_STATE_DONE = 3
372
+ }
@@ -0,0 +1,22 @@
1
+ package com.apollohg.editor
2
+
3
+ /**
4
+ * Neutral editor/viewer facade over the shared bounded image loader.
5
+ * Keep viewer code out of the editor render bridge's dependency graph.
6
+ */
7
+ internal object NativeImagePipeline {
8
+ fun prepare(source: String, policy: ImageLoadingPolicy): RenderImageLoader.PreparedSource? =
9
+ RenderImageLoader.prepare(source, policy)
10
+
11
+ fun load(
12
+ source: RenderImageLoader.PreparedSource,
13
+ ownerId: Long,
14
+ priority: DecodedBitmapPriority,
15
+ callback: (DecodedBitmapLease?) -> Unit
16
+ ): RenderImageLoader.LoadHandle = RenderImageLoader.loadLease(
17
+ source,
18
+ ownerId,
19
+ priority,
20
+ callback
21
+ )
22
+ }
@@ -0,0 +1,193 @@
1
+ package com.apollohg.editor
2
+
3
+ import kotlin.math.roundToInt
4
+ import org.json.JSONObject
5
+
6
+ internal fun physicalToolbarBorderWidth(widthDp: Float, density: Float): Int = when {
7
+ widthDp <= 0f -> 0
8
+ else -> maxOf(1, (widthDp * density).roundToInt())
9
+ }
10
+
11
+ internal data class NativeToolbarState(
12
+ val marks: Map<String, Boolean>,
13
+ val nodes: Map<String, Boolean>,
14
+ val commands: Map<String, Boolean>,
15
+ val allowedMarks: Set<String>,
16
+ val insertableNodes: Set<String>,
17
+ val canUndo: Boolean,
18
+ val canRedo: Boolean
19
+ ) {
20
+ companion object {
21
+ val empty = NativeToolbarState(
22
+ marks = emptyMap(),
23
+ nodes = emptyMap(),
24
+ commands = emptyMap(),
25
+ allowedMarks = emptySet(),
26
+ insertableNodes = emptySet(),
27
+ canUndo = false,
28
+ canRedo = false
29
+ )
30
+
31
+ fun fromUpdateJson(updateJson: String): NativeToolbarState? {
32
+ val root = try {
33
+ JSONObject(updateJson)
34
+ } catch (_: Exception) {
35
+ return null
36
+ }
37
+ val activeState = root.optJSONObject("activeState") ?: JSONObject()
38
+ val historyState = root.optJSONObject("historyState") ?: JSONObject()
39
+ return NativeToolbarState(
40
+ marks = boolMap(activeState.optJSONObject("marks")),
41
+ nodes = boolMap(activeState.optJSONObject("nodes")),
42
+ commands = boolMap(activeState.optJSONObject("commands")),
43
+ allowedMarks = stringSet(activeState.optJSONArray("allowedMarks")),
44
+ insertableNodes = stringSet(activeState.optJSONArray("insertableNodes")),
45
+ canUndo = historyState.optBoolean("canUndo", false),
46
+ canRedo = historyState.optBoolean("canRedo", false)
47
+ )
48
+ }
49
+
50
+ private fun boolMap(json: JSONObject?): Map<String, Boolean> {
51
+ json ?: return emptyMap()
52
+ val result = mutableMapOf<String, Boolean>()
53
+ val keys = json.keys()
54
+ while (keys.hasNext()) {
55
+ val key = keys.next()
56
+ result[key] = json.optBoolean(key, false)
57
+ }
58
+ return result
59
+ }
60
+
61
+ private fun stringSet(array: org.json.JSONArray?): Set<String> {
62
+ array ?: return emptySet()
63
+ val result = linkedSetOf<String>()
64
+ for (index in 0 until array.length()) {
65
+ array.optString(index, null)?.let { result.add(it) }
66
+ }
67
+ return result
68
+ }
69
+ }
70
+ }
71
+
72
+ internal enum class ToolbarCommand(val wireValue: String) {
73
+ INDENT_LIST("indentList"),
74
+ OUTDENT_LIST("outdentList"),
75
+ UNDO("undo"),
76
+ REDO("redo");
77
+
78
+ companion object {
79
+ fun fromWireValue(value: String): ToolbarCommand =
80
+ entries.firstOrNull { it.wireValue == value }
81
+ ?: throw IllegalArgumentException("Unknown ToolbarCommand: $value")
82
+ }
83
+ }
84
+
85
+ internal object EditorNodeTypes {
86
+ fun listItemType(listType: String): String = when (listType) {
87
+ "bullet_list", "ordered_list" -> "list_item"
88
+ "task_list" -> "task_item"
89
+ "taskList" -> "taskItem"
90
+ else -> "listItem"
91
+ }
92
+
93
+ fun isHardBreak(nodeType: String?): Boolean =
94
+ nodeType == "hardBreak" || nodeType == "hard_break"
95
+
96
+ fun isHorizontalRule(nodeType: String?): Boolean =
97
+ nodeType == "horizontalRule" || nodeType == "horizontal_rule"
98
+
99
+ fun isListItem(nodeType: String): Boolean = nodeType == "listItem" || nodeType == "list_item" ||
100
+ nodeType == "taskItem" || nodeType == "task_item"
101
+
102
+ fun isListContainer(nodeType: String): Boolean =
103
+ nodeType == "bulletList" || nodeType == "bullet_list" ||
104
+ nodeType == "orderedList" || nodeType == "ordered_list" ||
105
+ nodeType == "taskList" || nodeType == "task_list"
106
+
107
+ fun preferredHardBreak(insertableNodes: Set<String>): String =
108
+ if (insertableNodes.contains("hard_break")) "hard_break" else "hardBreak"
109
+ }
110
+
111
+ internal enum class ToolbarListType(val wireValue: String) {
112
+ BULLET_LIST("bullet_list"),
113
+ ORDERED_LIST("ordered_list"),
114
+ CAMEL_CASE_BULLET_LIST("bulletList"),
115
+ CAMEL_CASE_ORDERED_LIST("orderedList");
116
+
117
+ companion object {
118
+ fun fromWireValue(value: String): ToolbarListType =
119
+ entries.firstOrNull { it.wireValue == value }
120
+ ?: throw IllegalArgumentException("Unknown ToolbarListType: $value")
121
+ }
122
+ }
123
+
124
+ internal enum class ToolbarDefaultIconId(val wireValue: String) {
125
+ BOLD("bold"),
126
+ ITALIC("italic"),
127
+ UNDERLINE("underline"),
128
+ STRIKE("strike"),
129
+ LINK("link"),
130
+ IMAGE("image"),
131
+ H1("h1"),
132
+ H2("h2"),
133
+ H3("h3"),
134
+ H4("h4"),
135
+ H5("h5"),
136
+ H6("h6"),
137
+ BLOCKQUOTE("blockquote"),
138
+ BULLET_LIST("bulletList"),
139
+ ORDERED_LIST("orderedList"),
140
+ INDENT_LIST("indentList"),
141
+ OUTDENT_LIST("outdentList"),
142
+ LINE_BREAK("lineBreak"),
143
+ HORIZONTAL_RULE("horizontalRule"),
144
+ UNDO("undo"),
145
+ REDO("redo");
146
+
147
+ companion object {
148
+ fun fromWireValue(value: String): ToolbarDefaultIconId =
149
+ entries.firstOrNull { it.wireValue == value }
150
+ ?: throw IllegalArgumentException("Unknown ToolbarDefaultIconId: $value")
151
+ }
152
+ }
153
+
154
+ internal enum class ToolbarItemKind(val wireValue: String) {
155
+ MARK("mark"),
156
+ HEADING("heading"),
157
+ BLOCKQUOTE("blockquote"),
158
+ LIST("list"),
159
+ COMMAND("command"),
160
+ NODE("node"),
161
+ ACTION("action"),
162
+ GROUP("group"),
163
+ SEPARATOR("separator");
164
+
165
+ companion object {
166
+ fun fromWireValue(value: String): ToolbarItemKind =
167
+ entries.firstOrNull { it.wireValue == value }
168
+ ?: throw IllegalArgumentException("Unknown ToolbarItemKind: $value")
169
+ }
170
+ }
171
+
172
+ internal enum class ToolbarGroupPresentation(val wireValue: String) {
173
+ EXPAND("expand"),
174
+ MENU("menu");
175
+
176
+ companion object {
177
+ fun fromWireValue(value: String): ToolbarGroupPresentation =
178
+ entries.firstOrNull { it.wireValue == value }
179
+ ?: throw IllegalArgumentException("Unknown ToolbarGroupPresentation: $value")
180
+ }
181
+ }
182
+
183
+ internal enum class ToolbarItemPlacement(val wireValue: String) {
184
+ START("start"),
185
+ SCROLL("scroll"),
186
+ END("end");
187
+
188
+ companion object {
189
+ fun fromWireValue(value: String): ToolbarItemPlacement =
190
+ entries.firstOrNull { it.wireValue == value }
191
+ ?: throw IllegalArgumentException("Unknown ToolbarItemPlacement: $value")
192
+ }
193
+ }