@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,626 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.graphics.Canvas
4
+ import android.graphics.Matrix
5
+ import android.graphics.Paint
6
+ import android.graphics.Path
7
+ import android.graphics.Rect
8
+ import android.graphics.RectF
9
+ import android.graphics.text.LineBreaker
10
+ import android.os.Build
11
+ import android.text.Layout
12
+ import android.text.NoCopySpan
13
+ import android.text.SpannableStringBuilder
14
+ import android.text.Spanned
15
+ import android.text.SpannedString
16
+ import android.text.StaticLayout
17
+ import android.text.TextDirectionHeuristics
18
+ import android.text.TextPaint
19
+ import android.text.style.AlignmentSpan
20
+ import android.text.style.MetricAffectingSpan
21
+ import android.text.style.ReplacementSpan
22
+ import kotlin.math.ceil
23
+
24
+ internal class EditorDocumentLayout(
25
+ text: CharSequence,
26
+ paint: TextPaint,
27
+ width: Int,
28
+ private val includeFontPadding: Boolean = false,
29
+ spacingMultiplier: Float = 1f,
30
+ spacingAdd: Float = 0f,
31
+ previous: EditorDocumentLayout? = null
32
+ ) : Layout(
33
+ SpannedString(text),
34
+ TextPaint(paint),
35
+ width.coerceAtLeast(1),
36
+ Alignment.ALIGN_NORMAL,
37
+ spacingMultiplier,
38
+ spacingAdd
39
+ ) {
40
+ private data class Paragraph(val start: Int, val end: Int)
41
+ private data class Box(
42
+ val span: Any,
43
+ val start: Int,
44
+ val end: Int,
45
+ val style: EditorBoxStyle,
46
+ val depth: Int,
47
+ val bounds: RectF = RectF()
48
+ )
49
+ private data class SpanKey(
50
+ val span: Any,
51
+ val start: Int,
52
+ val end: Int,
53
+ val flags: Int,
54
+ val measured: List<Int>?
55
+ )
56
+ private data class Key(
57
+ val text: String,
58
+ val width: Int,
59
+ val alignment: Alignment,
60
+ val justify: Boolean,
61
+ val spans: List<SpanKey>
62
+ )
63
+ private data class Fragment(
64
+ val start: Int,
65
+ val end: Int,
66
+ val x: Float,
67
+ val y: Int,
68
+ val firstLine: Int,
69
+ val layout: StaticLayout,
70
+ val key: Key,
71
+ val topTrim: Int,
72
+ val bottomTrim: Int,
73
+ val afterSpacing: Int
74
+ )
75
+ private data class Line(val fragment: Fragment, val local: Int)
76
+
77
+ private val fragmentSpacingMultiplier = spacingMultiplier
78
+ private val fragmentSpacingAdd = spacingAdd
79
+ private val content = this.text as Spanned
80
+ private val boxes: List<Box>
81
+ private val fragments: List<Fragment>
82
+ private val lines: List<Line>
83
+ private val monotonicLineTops: Boolean
84
+ private val documentHeight: Int
85
+ private val paintKey =
86
+ listOf(
87
+ paint.textSize,
88
+ paint.textScaleX,
89
+ paint.textSkewX,
90
+ paint.letterSpacing,
91
+ paint.flags,
92
+ paint.typeface,
93
+ paint.color,
94
+ paint.bgColor,
95
+ paint.baselineShift,
96
+ paint.density,
97
+ paint.textLocale,
98
+ paint.fontFeatureSettings
99
+ )
100
+ internal val reusedFragmentCount: Int
101
+
102
+ init {
103
+ val paragraphs = mutableListOf<Paragraph>()
104
+ var start = 0
105
+ for (index in content.indices) {
106
+ if (content[index] == '\n') {
107
+ paragraphs += Paragraph(start, index)
108
+ start = index + 1
109
+ }
110
+ }
111
+ paragraphs += Paragraph(start, content.length)
112
+ fun paragraphAt(offset: Int): Int {
113
+ var low = 0
114
+ var high = paragraphs.lastIndex
115
+ while (low < high) {
116
+ val middle = (low + high + 1) / 2
117
+ if (paragraphs[middle].start <= offset) low = middle else high = middle - 1
118
+ }
119
+ return low
120
+ }
121
+ boxes = content.resolvedBlockSpacing().map { (span, style) ->
122
+ Box(span, content.getSpanStart(span), content.getSpanEnd(span), style, span.depth)
123
+ } + content.getSpans(0, content.length, CodeBlockSpan::class.java).map {
124
+ Box(it, content.getSpanStart(it), content.getSpanEnd(it), it.documentBox, Int.MAX_VALUE)
125
+ }
126
+ val opens = Array(paragraphs.size) { mutableListOf<Box>() }
127
+ val closes = Array(paragraphs.size) { mutableListOf<Box>() }
128
+ val trailingCodeLines = boxes.filter {
129
+ (
130
+ (it.span as? EditorBlockBoxSpan)?.nodeType == "codeBlock" ||
131
+ it.span is CodeBlockSpan
132
+ ) &&
133
+ it.start >= 0 && it.end > it.start && content[it.end - 1] == '\n'
134
+ }.map { it.end }.toSet()
135
+ for (box in boxes) {
136
+ if (box.start < 0 || box.end < box.start) continue
137
+ opens[paragraphAt(box.start)] += box
138
+ val lastOffset = if (box.end in
139
+ trailingCodeLines
140
+ ) {
141
+ box.end
142
+ } else {
143
+ maxOf(box.start, box.end - 1)
144
+ }
145
+ closes[paragraphAt(lastOffset)] += box
146
+ }
147
+ val reusable = if (previous != null && previous.paintKey == paintKey &&
148
+ previous.includeFontPadding == includeFontPadding &&
149
+ previous.fragmentSpacingMultiplier == spacingMultiplier &&
150
+ previous.fragmentSpacingAdd == spacingAdd
151
+ ) {
152
+ previous.fragments.groupBy {
153
+ it.key
154
+ }.mapValues { it.value.toMutableList() }.toMutableMap()
155
+ } else {
156
+ mutableMapOf()
157
+ }
158
+ val built = mutableListOf<Fragment>()
159
+ val builtLines = mutableListOf<Line>()
160
+ var left = 0f
161
+ var right = 0f
162
+ var y = 0
163
+ var reused = 0
164
+ for ((index, paragraph) in paragraphs.withIndex()) {
165
+ opens[index].sortBy { it.depth }
166
+ for (box in opens[index]) {
167
+ box.bounds.left = left + box.style.margin.left
168
+ box.bounds.right = this.width - right - box.style.margin.right
169
+ box.bounds.top = y + box.style.margin.top
170
+ left += box.style.outerInset.left
171
+ right += box.style.outerInset.right
172
+ y += ceil(box.style.outerInset.top).toInt()
173
+ }
174
+ val local = SpannableStringBuilder(content, paragraph.start, paragraph.end)
175
+ if (local.isEmpty() && paragraph.start in trailingCodeLines) {
176
+ content.getSpans(
177
+ paragraph.start - 1,
178
+ paragraph.start,
179
+ MetricAffectingSpan::class.java
180
+ )
181
+ .filter {
182
+ content.getSpanStart(it) < paragraph.start &&
183
+ content.getSpanEnd(it) >= paragraph.start
184
+ }
185
+ .forEach { local.setSpan(it, 0, 0, Spanned.SPAN_MARK_MARK) }
186
+ }
187
+ local.getSpans(0, local.length, Any::class.java).filter {
188
+ it is EditorBlockBoxSpan || it is CodeBlockSpan || it is NoCopySpan
189
+ }.forEach(local::removeSpan)
190
+ local.setSpan(
191
+ EditorOwnedBlockGeometrySpan,
192
+ 0,
193
+ local.length,
194
+ Spanned.SPAN_INCLUSIVE_INCLUSIVE
195
+ )
196
+ val requestedAlignment = local.getSpans(
197
+ 0,
198
+ local.length,
199
+ EditorParagraphAlignmentSpan::class.java
200
+ ).lastOrNull()?.value
201
+ val rtl = TextDirectionHeuristics.FIRSTSTRONG_LTR.isRtl(local, 0, local.length)
202
+ val alignment = when (requestedAlignment) {
203
+ "left" -> if (rtl) Alignment.ALIGN_OPPOSITE else Alignment.ALIGN_NORMAL
204
+ "right" -> if (rtl) Alignment.ALIGN_NORMAL else Alignment.ALIGN_OPPOSITE
205
+ "center" -> Alignment.ALIGN_CENTER
206
+ else -> Alignment.ALIGN_NORMAL
207
+ }
208
+ if (requestedAlignment !=
209
+ null
210
+ ) {
211
+ local.getSpans(
212
+ 0,
213
+ local.length,
214
+ AlignmentSpan::class.java
215
+ ).forEach(local::removeSpan)
216
+ }
217
+ val available = (this.width - ceil(left).toInt() - ceil(right).toInt()).coerceAtLeast(1)
218
+ val spanKeys = local.getSpans(0, local.length, Any::class.java).map { span ->
219
+ val spanStart = local.getSpanStart(span)
220
+ val spanEnd = local.getSpanEnd(span)
221
+ val measured = if (span is ReplacementSpan) {
222
+ val fm = Paint.FontMetricsInt()
223
+ val size = span.getSize(TextPaint(this.paint), local, spanStart, spanEnd, fm)
224
+ listOf(size, fm.ascent, fm.descent, fm.top, fm.bottom)
225
+ } else {
226
+ null
227
+ }
228
+ SpanKey(span, spanStart, spanEnd, local.getSpanFlags(span), measured)
229
+ }
230
+ val key =
231
+ Key(
232
+ local.toString(),
233
+ available,
234
+ alignment,
235
+ requestedAlignment == "justify",
236
+ spanKeys
237
+ )
238
+ val cached = reusable[key]?.removeFirstOrNull()
239
+ val fragmentPaint = TextPaint(this.paint)
240
+ val emptyStyles = if (local.isEmpty()) {
241
+ local.getSpans(
242
+ 0,
243
+ 0,
244
+ EditorResolvedTextSpan::class.java
245
+ ).toList()
246
+ } else {
247
+ emptyList()
248
+ }
249
+ if (local.isEmpty()) {
250
+ local.getSpans(0, 0, MetricAffectingSpan::class.java).forEach {
251
+ it.updateMeasureState(fragmentPaint)
252
+ }
253
+ }
254
+ val shaped =
255
+ cached?.layout
256
+ ?: StaticLayout.Builder.obtain(
257
+ SpannedString(local),
258
+ 0,
259
+ local.length,
260
+ fragmentPaint,
261
+ available
262
+ )
263
+ .setIncludePad(includeFontPadding)
264
+ .setAlignment(alignment)
265
+ .setTextDirection(TextDirectionHeuristics.FIRSTSTRONG_LTR)
266
+ .setLineSpacing(spacingAdd, spacingMultiplier)
267
+ .apply {
268
+ if (Build.VERSION.SDK_INT >=
269
+ 26
270
+ ) {
271
+ setJustificationMode(
272
+ if (key.justify) {
273
+ LineBreaker.JUSTIFICATION_MODE_INTER_WORD
274
+ } else {
275
+ LineBreaker.JUSTIFICATION_MODE_NONE
276
+ }
277
+ )
278
+ }
279
+ }
280
+ .build()
281
+ if (cached != null) reused++
282
+ val emptyExtra = (
283
+ (emptyStyles.maxOfOrNull { it.lineHeightPx ?: 0 } ?: 0) -
284
+ shaped.height
285
+ ).coerceAtLeast(0)
286
+ val topTrim =
287
+ (if (includeFontPadding && index > 0) -shaped.topPadding else 0) - emptyExtra / 2
288
+ val bottomTrim =
289
+ (
290
+ if (includeFontPadding &&
291
+ index < paragraphs.lastIndex
292
+ ) {
293
+ shaped.bottomPadding
294
+ } else {
295
+ 0
296
+ }
297
+ ) -
298
+ (emptyExtra - emptyExtra / 2)
299
+ val lastLine = shaped.lineCount - 1
300
+ val naturalHeight =
301
+ shaped.getLineDescent(lastLine) - bottomTrim - shaped.getLineAscent(lastLine) -
302
+ if (lastLine == 0) topTrim else 0
303
+ val afterSpacing = if (index <
304
+ paragraphs.lastIndex
305
+ ) {
306
+ kotlin.math.round(naturalHeight * (spacingMultiplier - 1) + spacingAdd).toInt()
307
+ } else {
308
+ 0
309
+ }
310
+ val fragment =
311
+ Fragment(
312
+ paragraph.start, paragraph.end,
313
+ ceil(
314
+ left
315
+ ),
316
+ y - topTrim, builtLines.size, shaped, key, topTrim, bottomTrim, afterSpacing
317
+ )
318
+ built += fragment
319
+ repeat(shaped.lineCount) { builtLines += Line(fragment, it) }
320
+ y += shaped.height - topTrim - bottomTrim + afterSpacing
321
+ closes[index].sortByDescending { it.depth }
322
+ for (box in closes[index]) {
323
+ box.bounds.bottom = y + box.style.inset.bottom
324
+ y += ceil(box.style.outerInset.bottom).toInt()
325
+ left -= box.style.outerInset.left
326
+ right -= box.style.outerInset.right
327
+ }
328
+ if (paragraph.end < content.length) {
329
+ y +=
330
+ content.getSpans(
331
+ paragraph.end,
332
+ paragraph.end + 1,
333
+ ParagraphSpacerSpan::class.java
334
+ ).maxOfOrNull {
335
+ it.spacingPx
336
+ }
337
+ ?: 0
338
+ }
339
+ }
340
+ fragments = built
341
+ lines = builtLines
342
+ monotonicLineTops = (1 until lines.size).all { textLineTop(it - 1) <= textLineTop(it) }
343
+ documentHeight = y
344
+ reusedFragmentCount = reused
345
+ }
346
+
347
+ internal fun emptyLinePaint(offset: Int): TextPaint? =
348
+ lines[getLineForOffset(offset)].fragment.let {
349
+ if (it.start == it.end) it.layout.paint else null
350
+ }
351
+
352
+ internal fun contentLeft(line: Int): Float = lines[line].let {
353
+ it.fragment.x +
354
+ it.fragment.layout.getParagraphLeft(it.local)
355
+ }
356
+ internal fun contentRight(line: Int): Float = lines[line].let {
357
+ it.fragment.x +
358
+ it.fragment.layout.getParagraphRight(it.local)
359
+ }
360
+ internal fun textLineTop(line: Int): Int = lines[line].let {
361
+ it.fragment.y +
362
+ it.fragment.layout.getLineTop(it.local) +
363
+ if (it.local == 0) it.fragment.topTrim else 0
364
+ }
365
+ internal fun textLineBottom(line: Int): Int = lines[line].let {
366
+ it.fragment.y +
367
+ it.fragment.layout.getLineBottom(it.local) +
368
+ if (it.local ==
369
+ it.fragment.layout.lineCount - 1
370
+ ) {
371
+ it.fragment.afterSpacing - it.fragment.bottomTrim
372
+ } else {
373
+ 0
374
+ }
375
+ }
376
+ internal fun boxBounds(span: EditorBlockBoxSpan): RectF? =
377
+ boxes.firstOrNull { it.span === span }?.bounds?.let(::RectF)
378
+ internal fun imageBounds(span: BlockImageSpan): RectF? {
379
+ val start = content.getSpanStart(span)
380
+ val end = content.getSpanEnd(span)
381
+ if (start < 0 || end <= start) return null
382
+ return span.boxRect(
383
+ minOf(getPrimaryHorizontal(start), getPrimaryHorizontal(end)),
384
+ getLineBaseline(getLineForOffset(start)).toFloat()
385
+ )
386
+ }
387
+ override fun getHeight(): Int = documentHeight
388
+ override fun getLineCount(): Int = lines.size
389
+ override fun getLineTop(line: Int): Int = if (line ==
390
+ lines.size
391
+ ) {
392
+ documentHeight
393
+ } else {
394
+ textLineTop(line)
395
+ }
396
+ override fun getLineDescent(line: Int): Int = lines[line].let {
397
+ getLineTop(line + 1) -
398
+ it.fragment.y -
399
+ it.fragment.layout.getLineBaseline(it.local)
400
+ }
401
+ override fun getLineStart(line: Int): Int = if (line ==
402
+ lines.size
403
+ ) {
404
+ content.length
405
+ } else {
406
+ lines[line].let {
407
+ it.fragment.start +
408
+ it.fragment.layout.getLineStart(it.local)
409
+ }
410
+ }
411
+ override fun getParagraphDirection(line: Int): Int =
412
+ lines[line].let { it.fragment.layout.getParagraphDirection(it.local) }
413
+ override fun getLineContainsTab(line: Int): Boolean =
414
+ lines[line].let { it.fragment.layout.getLineContainsTab(it.local) }
415
+ override fun getLineDirections(line: Int): Directions =
416
+ lines[line].let { it.fragment.layout.getLineDirections(it.local) }
417
+ override fun getTopPadding(): Int = fragments.first().layout.topPadding
418
+ override fun getBottomPadding(): Int = fragments.last().layout.bottomPadding
419
+ override fun getEllipsisStart(line: Int): Int = 0
420
+ override fun getEllipsisCount(line: Int): Int = 0
421
+ override fun getLineLeft(line: Int): Float = lines[line].let {
422
+ it.fragment.x +
423
+ it.fragment.layout.getLineLeft(it.local)
424
+ }
425
+ override fun getLineRight(line: Int): Float = lines[line].let {
426
+ it.fragment.x +
427
+ it.fragment.layout.getLineRight(it.local)
428
+ }
429
+ override fun getLineMax(line: Int): Float =
430
+ lines[line].let { it.fragment.layout.getLineMax(it.local) }
431
+ override fun getLineWidth(line: Int): Float =
432
+ lines[line].let { it.fragment.layout.getLineWidth(it.local) }
433
+ override fun getLineVisibleEnd(line: Int): Int = lines[line].let {
434
+ it.fragment.start +
435
+ it.fragment.layout.getLineVisibleEnd(it.local)
436
+ }
437
+ override fun getLineBottom(line: Int, includeLineSpacing: Boolean): Int = textLineBottom(line)
438
+
439
+ override fun getLineBounds(line: Int, bounds: Rect): Int {
440
+ bounds.set(
441
+ contentLeft(line).toInt(),
442
+ textLineTop(line),
443
+ contentRight(line).toInt(),
444
+ textLineBottom(line)
445
+ )
446
+ return getLineBaseline(line)
447
+ }
448
+
449
+ override fun getLineForVertical(vertical: Int): Int {
450
+ if (monotonicLineTops) return findLine { textLineTop(it) <= vertical }
451
+ val paintedLines = lines.indices.reversed()
452
+ return paintedLines.firstOrNull {
453
+ vertical >= textLineTop(it) &&
454
+ vertical < textLineBottom(it)
455
+ }
456
+ ?: paintedLines.minBy {
457
+ maxOf(textLineTop(it) - vertical, vertical - textLineBottom(it), 0)
458
+ }
459
+ }
460
+ override fun getLineForOffset(offset: Int): Int = findLine {
461
+ getLineStart(it) <=
462
+ offset.coerceIn(0, content.length)
463
+ }
464
+ private inline fun findLine(before: (Int) -> Boolean): Int {
465
+ var low = 0
466
+ var high = lines.lastIndex
467
+ while (low < high) {
468
+ val middle = (low + high + 1) / 2
469
+ if (before(middle)) low = middle else high = middle - 1
470
+ }
471
+ return low
472
+ }
473
+
474
+ override fun getPrimaryHorizontal(offset: Int): Float = horizontal(offset, false)
475
+ override fun getSecondaryHorizontal(offset: Int): Float = horizontal(offset, true)
476
+ private fun horizontal(offset: Int, secondary: Boolean): Float {
477
+ val fragment = lines[getLineForOffset(offset)].fragment
478
+ val local = (offset - fragment.start).coerceIn(0, fragment.end - fragment.start)
479
+ return fragment.x +
480
+ if (secondary) {
481
+ fragment.layout.getSecondaryHorizontal(
482
+ local
483
+ )
484
+ } else {
485
+ fragment.layout.getPrimaryHorizontal(local)
486
+ }
487
+ }
488
+ override fun getOffsetForHorizontal(line: Int, horiz: Float): Int = lines[line].let {
489
+ it.fragment.start +
490
+ it.fragment.layout.getOffsetForHorizontal(it.local, horiz - it.fragment.x)
491
+ }
492
+ override fun isRtlCharAt(offset: Int): Boolean = lines[getLineForOffset(offset)].fragment.let {
493
+ it.layout.isRtlCharAt((offset - it.start).coerceIn(0, it.end - it.start))
494
+ }
495
+ override fun getOffsetToLeftOf(offset: Int): Int = adjacentOffset(offset, true)
496
+ override fun getOffsetToRightOf(offset: Int): Int = adjacentOffset(offset, false)
497
+ private fun adjacentOffset(offset: Int, left: Boolean): Int {
498
+ val line = getLineForOffset(offset)
499
+ val fragment = lines[line].fragment
500
+ val local = (offset - fragment.start).coerceIn(0, fragment.end - fragment.start)
501
+ val next = if (left) {
502
+ fragment.layout.getOffsetToLeftOf(
503
+ local
504
+ )
505
+ } else {
506
+ fragment.layout.getOffsetToRightOf(local)
507
+ }
508
+ if (next != local) return fragment.start + next
509
+ val backward = left == (getParagraphDirection(line) > 0)
510
+ return (offset + if (backward) -1 else 1).coerceIn(0, content.length)
511
+ }
512
+
513
+ override fun getCursorPath(point: Int, dest: Path, editingBuffer: CharSequence) {
514
+ dest.reset()
515
+ val line = getLineForOffset(point)
516
+ val x = getPrimaryHorizontal(point)
517
+ dest.moveTo(x, textLineTop(line).toFloat())
518
+ dest.lineTo(x, textLineBottom(line).toFloat())
519
+ }
520
+
521
+ override fun getSelectionPath(start: Int, end: Int, dest: Path) {
522
+ dest.reset()
523
+ val from = minOf(start, end).coerceIn(0, content.length)
524
+ val to = maxOf(start, end).coerceIn(from, content.length)
525
+ if (from == to) return
526
+ for (fragment in fragments) {
527
+ if (from > fragment.end || to <= fragment.start) continue
528
+ val localFrom = (from - fragment.start).coerceAtLeast(0)
529
+ val localTo = (to - fragment.start).coerceAtMost(fragment.end - fragment.start)
530
+ for (localLine in fragment.layout.getLineForOffset(
531
+ localFrom
532
+ )..fragment.layout.getLineForOffset(localTo)) {
533
+ val lineFrom = maxOf(localFrom, fragment.layout.getLineStart(localLine))
534
+ val lineTo = minOf(localTo, fragment.layout.getLineEnd(localLine))
535
+ if (lineFrom >= lineTo) continue
536
+ val localPath = Path()
537
+ fragment.layout.getSelectionPath(lineFrom, lineTo, localPath)
538
+ val line = fragment.firstLine + localLine
539
+ val matrix = Matrix()
540
+ matrix.setRectToRect(
541
+ RectF(
542
+ 0f,
543
+ fragment.layout.getLineTop(localLine).toFloat(),
544
+ 1f,
545
+ fragment.layout.getLineBottom(localLine).toFloat()
546
+ ),
547
+ RectF(
548
+ fragment.x,
549
+ textLineTop(line).toFloat(),
550
+ fragment.x + 1,
551
+ textLineBottom(line).toFloat()
552
+ ),
553
+ Matrix.ScaleToFit.FILL
554
+ )
555
+ localPath.transform(matrix)
556
+ dest.addPath(localPath)
557
+ }
558
+ if (to > fragment.end && fragment.end < content.length) {
559
+ val line = fragment.firstLine + fragment.layout.lineCount - 1
560
+ val x = getPrimaryHorizontal(fragment.end)
561
+ val edge = if (getParagraphDirection(line) <
562
+ 0
563
+ ) {
564
+ contentLeft(line)
565
+ } else {
566
+ contentRight(line)
567
+ }
568
+ dest.addRect(
569
+ minOf(x, edge),
570
+ textLineTop(line).toFloat(),
571
+ maxOf(x + 1, edge),
572
+ textLineBottom(line).toFloat(),
573
+ Path.Direction.CW
574
+ )
575
+ }
576
+ }
577
+ }
578
+
579
+ override fun draw(canvas: Canvas) = draw(canvas, null, null, 0)
580
+ override fun draw(
581
+ canvas: Canvas,
582
+ highlight: Path?,
583
+ highlightPaint: Paint?,
584
+ cursorOffsetVertical: Int
585
+ ) {
586
+ boxes.sortedBy { it.depth }.forEach { EditorBoxDrawing.draw(canvas, it.bounds, it.style) }
587
+ for (fragment in fragments) {
588
+ val saved = canvas.save()
589
+ canvas.translate(fragment.x, fragment.y.toFloat())
590
+ val localHighlight = highlight?.let {
591
+ Path(it).apply {
592
+ offset(-fragment.x, -fragment.y.toFloat())
593
+ val bounds = RectF()
594
+ computeBounds(bounds, true)
595
+ bounds.top = fragment.topTrim.toFloat()
596
+ bounds.bottom =
597
+ (fragment.layout.height - fragment.bottomTrim + fragment.afterSpacing)
598
+ .toFloat()
599
+ op(Path().apply { addRect(bounds, Path.Direction.CW) }, Path.Op.INTERSECT)
600
+ }
601
+ }
602
+ if (Build.VERSION.SDK_INT >= 34) {
603
+ // Android 14+ skips selection drawing when both highlight lists are null.
604
+ fragment.layout.draw(
605
+ canvas,
606
+ emptyList(),
607
+ emptyList(),
608
+ localHighlight,
609
+ highlightPaint,
610
+ cursorOffsetVertical
611
+ )
612
+ } else {
613
+ fragment.layout.draw(canvas, localHighlight, highlightPaint, cursorOffsetVertical)
614
+ }
615
+ canvas.restoreToCount(saved)
616
+ }
617
+ }
618
+ }
619
+
620
+ internal object EditorOwnedBlockGeometrySpan
621
+ internal class EditorParagraphAlignmentSpan(val value: String) : android.text.style.ParagraphStyle
622
+
623
+ internal fun Layout.editorTextLineTop(line: Int): Int =
624
+ (this as? EditorDocumentLayout)?.textLineTop(line) ?: getLineTop(line)
625
+ internal fun Layout.editorTextLineBottom(line: Int): Int =
626
+ (this as? EditorDocumentLayout)?.textLineBottom(line) ?: getLineBottom(line)