@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,224 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.graphics.Color
4
+ import android.text.Layout
5
+ import android.text.SpannableStringBuilder
6
+ import android.view.View
7
+ import org.json.JSONArray
8
+ import org.json.JSONObject
9
+
10
+ object RenderBridge {
11
+ internal const val NATIVE_BLOCKQUOTE_ANNOTATION = "nativeBlockquote"
12
+ internal const val NATIVE_TOP_LEVEL_CHILD_INDEX_ANNOTATION = "nativeTopLevelChildIndex"
13
+ internal const val NATIVE_LINK_HREF_ANNOTATION = "nativeLinkHref"
14
+ internal const val NATIVE_TASK_LIST_MARKER_ANNOTATION = "nativeTaskListMarker"
15
+ internal const val NATIVE_INTER_BLOCK_SEPARATOR_ANNOTATION = "nativeInterBlockSeparator"
16
+ internal const val NATIVE_LIST_MARKER_ANNOTATION = "nativeListMarker"
17
+ internal const val NATIVE_SYNTHETIC_PLACEHOLDER_ANNOTATION = "nativeSyntheticPlaceholder"
18
+
19
+ internal data class RenderBuildState(
20
+ val result: SpannableStringBuilder = SpannableStringBuilder(),
21
+ val blockStack: MutableList<BlockContext> = mutableListOf(),
22
+ val pendingLeadingMargins: MutableMap<Int, PendingLeadingMargin> = linkedMapOf(),
23
+ val pendingCodeBlockSpans: MutableList<PendingCodeBlockSpan> = mutableListOf(),
24
+ val atomOccurrences: MutableMap<String, Int> = mutableMapOf(),
25
+ val reusableImages: MutableList<BlockImageSpan> = mutableListOf(),
26
+ var isFirstBlock: Boolean = true,
27
+ var nextBlockSpacingBefore: Float? = null,
28
+ var pendingListBoundarySpacing: Float? = null
29
+ ) {
30
+ fun replaceNextBlockSpacing(spacing: Float?) {
31
+ nextBlockSpacingBefore = spacing
32
+ pendingListBoundarySpacing = null
33
+ }
34
+
35
+ fun addListBoundarySpacing(spacing: Float?) {
36
+ if (spacing == null) {
37
+ if (pendingListBoundarySpacing == null) {
38
+ nextBlockSpacingBefore = null
39
+ }
40
+ return
41
+ }
42
+ pendingListBoundarySpacing = (pendingListBoundarySpacing ?: 0f) + spacing
43
+ nextBlockSpacingBefore = pendingListBoundarySpacing
44
+ }
45
+ }
46
+
47
+ fun buildSpannable(
48
+ json: String,
49
+ baseFontSize: Float,
50
+ textColor: Int,
51
+ theme: EditorTheme? = null,
52
+ density: Float = 1f,
53
+ hostView: View? = null,
54
+ atomConfiguration: AtomRenderConfiguration? = null
55
+ ): SpannableStringBuilder {
56
+ val elements = try {
57
+ JSONArray(json)
58
+ } catch (_: Exception) {
59
+ return SpannableStringBuilder()
60
+ }
61
+
62
+ return buildSpannableFromArray(
63
+ elements,
64
+ baseFontSize,
65
+ textColor,
66
+ theme,
67
+ density,
68
+ hostView,
69
+ atomConfiguration
70
+ )
71
+ }
72
+
73
+ fun buildSpannableFromArray(
74
+ elements: JSONArray,
75
+ baseFontSize: Float,
76
+ textColor: Int,
77
+ theme: EditorTheme? = null,
78
+ density: Float = 1f,
79
+ hostView: View? = null,
80
+ atomConfiguration: AtomRenderConfiguration? = null
81
+ ): SpannableStringBuilder {
82
+ val state = RenderBuildState(reusableImages = reusableImages(hostView))
83
+ appendElements(
84
+ state = state,
85
+ elements = elements,
86
+ baseFontSize = baseFontSize,
87
+ textColor = textColor,
88
+ theme = theme,
89
+ density = density,
90
+ hostView = hostView,
91
+ atomConfiguration = atomConfiguration
92
+ )
93
+ applyPendingLeadingMargins(state.result, state.pendingLeadingMargins)
94
+ applyPendingCodeBlockSpans(state.result, state.pendingCodeBlockSpans, theme, density)
95
+ if (theme?.styleSheet != null) state.result.applyStyleSheetLineMetrics()
96
+ return state.result
97
+ }
98
+
99
+ fun buildSpannableFromBlocks(
100
+ blocks: JSONArray,
101
+ startIndex: Int = 0,
102
+ includeTrailingInterBlockSeparator: Boolean = false,
103
+ baseFontSize: Float,
104
+ textColor: Int,
105
+ theme: EditorTheme? = null,
106
+ density: Float = 1f,
107
+ hostView: View? = null,
108
+ atomConfiguration: AtomRenderConfiguration? = null,
109
+ reuseImages: Boolean = true
110
+ ): SpannableStringBuilder {
111
+ val state =
112
+ RenderBuildState(
113
+ reusableImages = if (reuseImages) reusableImages(hostView) else mutableListOf()
114
+ )
115
+ for (blockOffset in 0 until blocks.length()) {
116
+ val blockElements = blocks.optJSONArray(blockOffset) ?: continue
117
+ appendElements(
118
+ state = state,
119
+ elements = blockElements,
120
+ baseFontSize = baseFontSize,
121
+ textColor = textColor,
122
+ theme = theme,
123
+ density = density,
124
+ hostView = hostView,
125
+ atomConfiguration = atomConfiguration,
126
+ topLevelChildIndex = startIndex + blockOffset
127
+ )
128
+ }
129
+ if (includeTrailingInterBlockSeparator && !state.isFirstBlock) {
130
+ val spacingPx = ((state.nextBlockSpacingBefore ?: 0f) * density).toInt()
131
+ appendInterBlockNewline(
132
+ state.result,
133
+ baseFontSize,
134
+ textColor,
135
+ spacingPx,
136
+ topLevelChildIndex = startIndex + blocks.length()
137
+ )
138
+ }
139
+ applyPendingLeadingMargins(state.result, state.pendingLeadingMargins)
140
+ applyPendingCodeBlockSpans(state.result, state.pendingCodeBlockSpans, theme, density)
141
+ if (theme?.styleSheet != null) state.result.applyStyleSheetLineMetrics()
142
+ return state.result
143
+ }
144
+
145
+ private fun reusableImages(host: View?): MutableList<BlockImageSpan> =
146
+ if (host is EditorEditText) {
147
+ host.text.getSpans(0, host.length(), BlockImageSpan::class.java).filter {
148
+ it.canReuseFor(host)
149
+ }.toMutableList()
150
+ } else {
151
+ mutableListOf()
152
+ }
153
+
154
+ fun measureHeight(json: String, themeJson: String?, width: Float, density: Float): Float {
155
+ if (width <= 0) return 0f
156
+
157
+ val theme = EditorTheme.fromJson(themeJson)
158
+ val baseFontSize = theme?.text?.fontSize
159
+ ?: theme?.paragraph?.fontSize
160
+ ?: 16f
161
+
162
+ val spannable = buildSpannable(
163
+ json = json,
164
+ baseFontSize = baseFontSize,
165
+ textColor = android.graphics.Color.BLACK,
166
+ theme = theme,
167
+ density = density,
168
+ hostView = null
169
+ )
170
+
171
+ if (spannable.isEmpty() &&
172
+ spannable.getSpans(0, 0, EditorBlockBoxSpan::class.java).isEmpty()
173
+ ) {
174
+ return 0f
175
+ }
176
+
177
+ val contentInsets = theme?.contentInsets
178
+ val topInset = ((contentInsets?.top ?: 0f) * density).toInt()
179
+ val bottomInset = ((contentInsets?.bottom ?: 0f) * density).toInt()
180
+ val leftInset = ((contentInsets?.left ?: 0f) * density).toInt()
181
+ val rightInset = ((contentInsets?.right ?: 0f) * density).toInt()
182
+
183
+ val paint = android.text.TextPaint().apply {
184
+ textSize = baseFontSize * density
185
+ isAntiAlias = true
186
+ }
187
+
188
+ val availableWidth = (width - leftInset - rightInset).coerceAtLeast(0f).toInt()
189
+
190
+ val staticLayout =
191
+ EditorDocumentLayout(spannable, paint, availableWidth, includeFontPadding = true)
192
+
193
+ val height = staticLayout.height + topInset + bottomInset
194
+ return height.toFloat()
195
+ }
196
+
197
+ fun listMarkerString(listContext: JSONObject): String {
198
+ if (listContext.optString("kind", "") == "task") {
199
+ return if (listContext.optBoolean("checked", false)) {
200
+ LayoutConstants.TASK_LIST_MARKER_CHECKED
201
+ } else {
202
+ LayoutConstants.TASK_LIST_MARKER_UNCHECKED
203
+ }
204
+ }
205
+ val ordered = listContext.optBoolean("ordered", false)
206
+ return if (ordered) {
207
+ val index = if (!listContext.has("index")) {
208
+ 1L
209
+ } else {
210
+ exactV2U32(listContext.opt("index") as? Number)?.toLong() ?: return ""
211
+ }
212
+ "$index. "
213
+ } else {
214
+ LayoutConstants.UNORDERED_LIST_BULLET
215
+ }
216
+ }
217
+ }
218
+
219
+ internal fun JSONObject.optPositiveFiniteFloat(key: String): Float? {
220
+ if (!has(key) || isNull(key)) return null
221
+ val value = optDouble(key, Double.NaN)
222
+ if (!value.isFinite() || value <= 0.0 || value > Int.MAX_VALUE.toDouble()) return null
223
+ return value.toFloat().takeIf { it.isFinite() && it > 0f }
224
+ }
@@ -0,0 +1,407 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.graphics.Color
4
+ import android.text.Annotation
5
+ import android.text.Layout
6
+ import android.text.SpannableStringBuilder
7
+ import android.text.Spanned
8
+ import android.text.TextPaint
9
+ import android.text.style.LeadingMarginSpan
10
+ import org.json.JSONObject
11
+
12
+ internal fun RenderBridge.applyBlockStyle(
13
+ builder: SpannableStringBuilder,
14
+ start: Int,
15
+ end: Int,
16
+ blockStack: List<BlockContext>,
17
+ pendingLeadingMargins: MutableMap<Int, PendingLeadingMargin>,
18
+ theme: EditorTheme?,
19
+ density: Float
20
+ ) {
21
+ val currentBlock = effectiveBlockContext(blockStack) ?: return
22
+ val indent = calculateIndent(currentBlock, blockStack, theme, density)
23
+ val quoteDepth = blockquoteDepth(blockStack)
24
+ val indentPerDepth = (theme?.list?.indent ?: LayoutConstants.INDENT_PER_DEPTH) * density
25
+ val listBaseIndentAdjustment =
26
+ calculateListBaseIndentAdjustment(currentBlock, theme, density)
27
+ val quoteStripeColor = if (quoteDepth > 0 && theme?.styleSheet == null) {
28
+ theme?.blockquote?.borderColor ?: Color.argb(
29
+ (Color.alpha(resolveInlineTextColor(blockStack, Color.BLACK, theme)) * 0.3f).toInt(),
30
+ Color.red(resolveInlineTextColor(blockStack, Color.BLACK, theme)),
31
+ Color.green(resolveInlineTextColor(blockStack, Color.BLACK, theme)),
32
+ Color.blue(resolveInlineTextColor(blockStack, Color.BLACK, theme))
33
+ )
34
+ } else {
35
+ null
36
+ }
37
+ val quoteStripeWidth = (
38
+ (
39
+ theme?.blockquote?.borderWidth
40
+ ?: LayoutConstants.BLOCKQUOTE_BORDER_WIDTH
41
+ ) * density
42
+ ).toInt()
43
+ val quoteGapWidth = (
44
+ (
45
+ theme?.blockquote?.markerGap
46
+ ?: LayoutConstants.BLOCKQUOTE_MARKER_GAP
47
+ ) * density
48
+ ).toInt()
49
+ val quoteIndent = maxOf(
50
+ theme?.blockquote?.indent ?: LayoutConstants.BLOCKQUOTE_INDENT,
51
+ (theme?.blockquote?.markerGap ?: LayoutConstants.BLOCKQUOTE_MARKER_GAP) +
52
+ (theme?.blockquote?.borderWidth ?: LayoutConstants.BLOCKQUOTE_BORDER_WIDTH)
53
+ ) * density
54
+ val blockquoteIndentPx = (quoteDepth * quoteIndent).toInt()
55
+ val quoteBaseIndent = if (quoteDepth > 0) {
56
+ (
57
+ (currentBlock.depth * indentPerDepth) -
58
+ (quoteDepth * indentPerDepth) +
59
+ listBaseIndentAdjustment +
60
+ ((quoteDepth - 1f) * quoteIndent)
61
+ ).toInt()
62
+ } else {
63
+ 0
64
+ }
65
+ val paragraphStart = renderedParagraphStart(
66
+ builder = builder,
67
+ candidateStart = effectiveParagraphStart(blockStack)
68
+ )
69
+ if (paragraphStart < end) {
70
+ if (currentBlock.listContext != null) {
71
+ pendingLeadingMargins[paragraphStart] = PendingLeadingMargin(
72
+ indentPx = indent.toInt(),
73
+ restIndentPx = indent.toInt() + renderedListMarkerWidth(builder, paragraphStart),
74
+ blockquoteIndentPx = blockquoteIndentPx,
75
+ blockquoteStripeColor = quoteStripeColor,
76
+ blockquoteStripeWidthPx = quoteStripeWidth,
77
+ blockquoteGapWidthPx = quoteGapWidth,
78
+ blockquoteBaseIndentPx = quoteBaseIndent
79
+ )
80
+ } else if (indent > 0) {
81
+ pendingLeadingMargins[paragraphStart] = PendingLeadingMargin(
82
+ indentPx = indent.toInt(),
83
+ restIndentPx = null,
84
+ blockquoteIndentPx = blockquoteIndentPx,
85
+ blockquoteStripeColor = quoteStripeColor,
86
+ blockquoteStripeWidthPx = quoteStripeWidth,
87
+ blockquoteGapWidthPx = quoteGapWidth,
88
+ blockquoteBaseIndentPx = quoteBaseIndent
89
+ )
90
+ }
91
+ }
92
+
93
+ if (quoteDepth > 0f) {
94
+ builder.setSpan(
95
+ Annotation(NATIVE_BLOCKQUOTE_ANNOTATION, "1"),
96
+ start,
97
+ end,
98
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
99
+ )
100
+ }
101
+ annotateTopLevelChild(builder, start, end, currentBlock.topLevelChildIndex)
102
+
103
+ val lineHeight =
104
+ theme?.styleSheet?.resolveText(
105
+ currentBlock.nodeType,
106
+ blockStack.dropLast(1).map {
107
+ it.nodeType
108
+ }
109
+ )?.lineHeight
110
+ ?: resolveTextStyle(
111
+ currentBlock.nodeType,
112
+ theme,
113
+ quoteDepth > 0
114
+ ).lineHeight
115
+ applyLineHeightSpan(builder, start, end, lineHeight, density)
116
+ }
117
+
118
+ private fun renderedListMarkerWidth(builder: Spanned, paragraphStart: Int): Int {
119
+ val marker = builder.getSpans(paragraphStart, paragraphStart + 1, Annotation::class.java)
120
+ .firstOrNull { it.key == RenderBridge.NATIVE_LIST_MARKER_ANNOTATION }
121
+ ?: return 0
122
+ val markerText =
123
+ SpannableStringBuilder(builder, builder.getSpanStart(marker), builder.getSpanEnd(marker))
124
+ // Desired width includes paragraph margins unless they are removed.
125
+ markerText.getSpans(
126
+ 0,
127
+ markerText.length,
128
+ LeadingMarginSpan::class.java
129
+ ).forEach(markerText::removeSpan)
130
+ val width = Layout.getDesiredWidth(markerText, TextPaint())
131
+ return kotlin.math.ceil(width.toDouble()).toInt()
132
+ }
133
+
134
+ internal fun RenderBridge.applyLineHeightSpan(
135
+ builder: SpannableStringBuilder,
136
+ start: Int,
137
+ end: Int,
138
+ lineHeight: Float?,
139
+ density: Float
140
+ ) {
141
+ if (lineHeight == null || lineHeight <= 0 || start >= end) {
142
+ return
143
+ }
144
+ builder.setSpan(
145
+ FixedLineHeightSpan((lineHeight * density).toInt()),
146
+ start,
147
+ end,
148
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
149
+ )
150
+ }
151
+
152
+ internal fun RenderBridge.applyPendingLeadingMargins(
153
+ builder: SpannableStringBuilder,
154
+ pendingLeadingMargins: Map<Int, PendingLeadingMargin>
155
+ ) {
156
+ if (pendingLeadingMargins.isEmpty()) return
157
+
158
+ val text = builder.toString()
159
+ val entries = pendingLeadingMargins.toSortedMap().entries.toList()
160
+ var index = 0
161
+ while (index < entries.size) {
162
+ val paragraphStart = entries[index].key
163
+ val spec = entries[index].value
164
+ if (paragraphStart >= builder.length) {
165
+ index += 1
166
+ continue
167
+ }
168
+ if (spec.blockquoteStripeColor != null) {
169
+ val paragraphEnd = blockquoteSpanEnd(builder, text, paragraphStart)
170
+ val quoteEntries = mutableListOf(entries[index])
171
+ var nextIndex = index + 1
172
+ while (nextIndex < entries.size && entries[nextIndex].key < paragraphEnd) {
173
+ quoteEntries.add(entries[nextIndex])
174
+ nextIndex += 1
175
+ }
176
+ index = nextIndex
177
+
178
+ builder
179
+ .getSpans(0, builder.length, LeadingMarginSpan::class.java)
180
+ .filter { it !is EditorBlockBoxSpan && builder.getSpanStart(it) == paragraphStart }
181
+ .forEach(builder::removeSpan)
182
+
183
+ builder.setSpan(
184
+ BlockquoteSpan(
185
+ baseIndentPx = spec.blockquoteBaseIndentPx,
186
+ totalIndentPx = spec.blockquoteIndentPx,
187
+ stripeColor = spec.blockquoteStripeColor,
188
+ stripeWidthPx = spec.blockquoteStripeWidthPx,
189
+ gapWidthPx = spec.blockquoteGapWidthPx
190
+ ),
191
+ paragraphStart,
192
+ paragraphEnd,
193
+ Spanned.SPAN_PARAGRAPH
194
+ )
195
+
196
+ quoteEntries.forEach { (entryStart, entrySpec) ->
197
+ applyAdditionalLeadingMargin(
198
+ builder = builder,
199
+ text = text,
200
+ paragraphStart = entryStart,
201
+ spec = entrySpec
202
+ )
203
+ }
204
+ } else {
205
+ index += 1
206
+ val paragraphEnd = defaultParagraphEnd(text, builder.length, paragraphStart)
207
+ val span = spec.restIndentPx?.let {
208
+ LeadingMarginSpan.Standard(spec.indentPx, it)
209
+ } ?: LeadingMarginSpan.Standard(spec.indentPx)
210
+
211
+ builder
212
+ .getSpans(0, builder.length, LeadingMarginSpan::class.java)
213
+ .filter { it !is EditorBlockBoxSpan && builder.getSpanStart(it) == paragraphStart }
214
+ .forEach(builder::removeSpan)
215
+
216
+ builder.setSpan(span, paragraphStart, paragraphEnd, Spanned.SPAN_PARAGRAPH)
217
+ }
218
+ }
219
+ }
220
+
221
+ internal fun RenderBridge.applyPendingCodeBlockSpans(
222
+ builder: SpannableStringBuilder,
223
+ pendingCodeBlockSpans: List<PendingCodeBlockSpan>,
224
+ theme: EditorTheme?,
225
+ density: Float
226
+ ) {
227
+ if (pendingCodeBlockSpans.isEmpty() || theme?.styleSheet != null) return
228
+
229
+ val backgroundColor = theme?.codeBlock?.backgroundColor ?: LayoutConstants.CODE_BACKGROUND_COLOR
230
+ val cornerRadiusPx = (theme?.codeBlock?.borderRadius ?: 8f) * density
231
+ val paddingHorizontalPx = ((theme?.codeBlock?.paddingHorizontal ?: 12f) * density).toInt()
232
+ val paddingVerticalPx = ((theme?.codeBlock?.paddingVertical ?: 8f) * density).toInt()
233
+
234
+ for (pending in pendingCodeBlockSpans) {
235
+ if (pending.start >= pending.end || pending.start >= builder.length) {
236
+ continue
237
+ }
238
+ val spanEnd = pending.end.coerceAtMost(builder.length)
239
+ val span = CodeBlockSpan(
240
+ backgroundColor = backgroundColor,
241
+ cornerRadiusPx = cornerRadiusPx,
242
+ paddingHorizontalPx = paddingHorizontalPx,
243
+ paddingVerticalPx = paddingVerticalPx
244
+ )
245
+ builder.setSpan(
246
+ span,
247
+ pending.start,
248
+ spanEnd,
249
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
250
+ )
251
+ }
252
+ }
253
+
254
+ internal fun RenderBridge.applyAdditionalLeadingMargin(
255
+ builder: SpannableStringBuilder,
256
+ text: String,
257
+ paragraphStart: Int,
258
+ spec: PendingLeadingMargin
259
+ ) {
260
+ val extraFirstIndent = (spec.indentPx - spec.blockquoteIndentPx).coerceAtLeast(0)
261
+ val extraRestIndent = spec.restIndentPx?.let {
262
+ (it - spec.blockquoteIndentPx).coerceAtLeast(0)
263
+ }
264
+ if (extraRestIndent != null) {
265
+ builder.setSpan(
266
+ LeadingMarginSpan.Standard(extraFirstIndent, extraRestIndent),
267
+ paragraphStart,
268
+ defaultParagraphEnd(text, builder.length, paragraphStart),
269
+ Spanned.SPAN_PARAGRAPH
270
+ )
271
+ } else if (extraFirstIndent > 0) {
272
+ builder.setSpan(
273
+ LeadingMarginSpan.Standard(extraFirstIndent),
274
+ paragraphStart,
275
+ defaultParagraphEnd(text, builder.length, paragraphStart),
276
+ Spanned.SPAN_PARAGRAPH
277
+ )
278
+ }
279
+ }
280
+
281
+ internal fun RenderBridge.calculateIndent(
282
+ context: BlockContext,
283
+ blockStack: List<BlockContext>,
284
+ theme: EditorTheme?,
285
+ density: Float
286
+ ): Float {
287
+ theme?.styleSheet?.let { sheet ->
288
+ val lists = blockStack.filter { it.listContext != null }
289
+ return lists.mapIndexed { index, block ->
290
+ val context = block.listContext!!
291
+ val name = if (context.optString("kind") ==
292
+ "task"
293
+ ) {
294
+ "taskList"
295
+ } else if (context.optBoolean("ordered")) {
296
+ "orderedList"
297
+ } else {
298
+ "bulletList"
299
+ }
300
+ val style = sheet[name]
301
+ (style?.indent ?: LayoutConstants.INDENT_PER_DEPTH) *
302
+ (if (index == 0) style?.baseIndentMultiplier ?: 1f else 1f) *
303
+ density
304
+ }.sum()
305
+ }
306
+ val indentPerDepth = (theme?.list?.indent ?: LayoutConstants.INDENT_PER_DEPTH) * density
307
+ val quoteDepth = blockquoteDepth(blockStack)
308
+ val columnsDepth = columnContainerDepth(blockStack)
309
+ val quoteIndent = maxOf(
310
+ theme?.blockquote?.indent ?: LayoutConstants.BLOCKQUOTE_INDENT,
311
+ (theme?.blockquote?.markerGap ?: LayoutConstants.BLOCKQUOTE_MARKER_GAP) +
312
+ (theme?.blockquote?.borderWidth ?: LayoutConstants.BLOCKQUOTE_BORDER_WIDTH)
313
+ ) * density
314
+ val listBaseIndentAdjustment = calculateListBaseIndentAdjustment(context, theme, density)
315
+ return (context.depth * indentPerDepth) -
316
+ (quoteDepth * indentPerDepth) +
317
+ -(columnsDepth * indentPerDepth) +
318
+ listBaseIndentAdjustment +
319
+ (quoteDepth * quoteIndent)
320
+ }
321
+
322
+ internal fun RenderBridge.calculateListBaseIndentAdjustment(
323
+ context: BlockContext,
324
+ theme: EditorTheme?,
325
+ density: Float
326
+ ): Float {
327
+ if (context.listContext == null) {
328
+ return 0f
329
+ }
330
+
331
+ val indentPerDepth = (theme?.list?.indent ?: LayoutConstants.INDENT_PER_DEPTH) * density
332
+ val listBaseIndentMultiplier = maxOf(theme?.list?.baseIndentMultiplier ?: 1f, 0f)
333
+ return (listBaseIndentMultiplier - 1f) * indentPerDepth
334
+ }
335
+
336
+ internal fun RenderBridge.effectiveBlockContext(blockStack: List<BlockContext>): BlockContext? {
337
+ val currentBlock = blockStack.lastOrNull() ?: return null
338
+ if (currentBlock.listContext != null) {
339
+ return currentBlock
340
+ }
341
+ val inheritedListBlock = blockStack
342
+ .dropLast(1)
343
+ .asReversed()
344
+ .firstOrNull { it.listContext != null }
345
+ ?: return currentBlock
346
+ return currentBlock.copy(
347
+ depth = currentBlock.depth,
348
+ listContext = inheritedListBlock.listContext,
349
+ markerPending = false
350
+ )
351
+ }
352
+
353
+ internal fun RenderBridge.effectiveParagraphStart(blockStack: List<BlockContext>): Int {
354
+ val currentBlock = blockStack.lastOrNull() ?: return 0
355
+ if (currentBlock.listContext != null) {
356
+ return currentBlock.renderStart
357
+ }
358
+ return blockStack
359
+ .dropLast(1)
360
+ .asReversed()
361
+ .firstOrNull { it.listContext != null }
362
+ ?.renderStart
363
+ ?: currentBlock.renderStart
364
+ }
365
+
366
+ internal fun RenderBridge.renderedParagraphStart(builder: CharSequence, candidateStart: Int): Int {
367
+ val boundedStart = candidateStart.coerceIn(0, builder.length)
368
+ if (boundedStart == 0) return 0
369
+
370
+ for (index in boundedStart - 1 downTo 0) {
371
+ if (builder[index] == '\n') {
372
+ return index + 1
373
+ }
374
+ }
375
+ return 0
376
+ }
377
+
378
+ internal fun RenderBridge.consumePendingListMarker(
379
+ blockStack: MutableList<BlockContext>,
380
+ markerRenderStart: Int
381
+ ): JSONObject? {
382
+ if (blockStack.size < 2) return null
383
+ for (idx in blockStack.lastIndex - 1 downTo 0) {
384
+ val context = blockStack[idx]
385
+ if (!context.markerPending) continue
386
+ context.markerPending = false
387
+ context.renderStart = markerRenderStart
388
+ return context.listContext
389
+ }
390
+ return null
391
+ }
392
+
393
+ internal fun RenderBridge.calculateMarkerWidth(density: Float): Float =
394
+ LayoutConstants.LIST_MARKER_WIDTH * density
395
+
396
+ internal fun RenderBridge.blockquoteDepth(blockStack: List<BlockContext>): Float =
397
+ blockStack.count {
398
+ it.nodeType == "blockquote"
399
+ }.toFloat()
400
+
401
+ internal fun RenderBridge.columnContainerDepth(blockStack: List<BlockContext>): Float =
402
+ blockStack.count {
403
+ it.nodeType == "columns" || it.nodeType == "column"
404
+ }.toFloat()
405
+
406
+ internal fun RenderBridge.isTransparentContainer(nodeType: String): Boolean = nodeType in
407
+ setOf("blockquote", "columns", "column", "bulletList", "orderedList", "taskList")