@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,575 @@
1
+ import CryptoKit
2
+ import Foundation
3
+ import UIKit
4
+
5
+ /// The source accepted by both the UIKit and Fabric viewer surfaces.
6
+ public enum ProseViewerSource: Hashable {
7
+ case json(String)
8
+ case html(String)
9
+
10
+ var kind: FfiViewerSourceKind {
11
+ switch self {
12
+ case .json: .json
13
+ case .html: .html
14
+ }
15
+ }
16
+
17
+ var value: String {
18
+ switch self {
19
+ case let .json(value), let .html(value): value
20
+ }
21
+ }
22
+ }
23
+
24
+ /// Immutable configuration for one viewer generation.
25
+ public struct ProseViewerConfiguration: Hashable {
26
+ public var configJSON: String
27
+ public var themeJSON: String?
28
+ public var imagePolicyJSON: String?
29
+ public var imagesEnabled: Bool
30
+ public var collapsesWhenEmpty: Bool
31
+
32
+ public init(
33
+ configJSON: String = "{}",
34
+ themeJSON: String? = nil,
35
+ imagePolicyJSON: String? = nil,
36
+ imagesEnabled: Bool = true,
37
+ collapsesWhenEmpty: Bool = true
38
+ ) {
39
+ self.configJSON = configJSON
40
+ self.themeJSON = themeJSON
41
+ self.imagePolicyJSON = imagePolicyJSON
42
+ self.imagesEnabled = imagesEnabled
43
+ self.collapsesWhenEmpty = collapsesWhenEmpty
44
+ }
45
+ }
46
+
47
+ struct ProseViewerRequest: Hashable {
48
+ let source: ProseViewerSource
49
+ let configuration: ProseViewerConfiguration
50
+ let nativeFontRevision: UInt64
51
+ /// Captured by Fabric with its native-font revision. UIKit obtains the
52
+ /// same value from `ViewerFontEnvironment` when it creates a request.
53
+ let nativeFontScale: CGFloat
54
+ let fontEnvironmentRevision: UInt64
55
+ let attachmentRevision: UInt64
56
+ let appearance: ProseViewerAppearance
57
+
58
+ init(
59
+ source: ProseViewerSource,
60
+ configuration: ProseViewerConfiguration,
61
+ nativeFontRevision: UInt64 = 0,
62
+ nativeFontScale: CGFloat = 1,
63
+ fontEnvironmentRevision: UInt64 = 0,
64
+ attachmentRevision: UInt64 = 0,
65
+ appearance: ProseViewerAppearance = .current
66
+ ) {
67
+ self.source = source
68
+ self.configuration = configuration
69
+ self.nativeFontRevision = nativeFontRevision
70
+ self.nativeFontScale = nativeFontScale.isFinite && nativeFontScale > 0 ? nativeFontScale : 1
71
+ self.fontEnvironmentRevision = fontEnvironmentRevision
72
+ self.attachmentRevision = attachmentRevision
73
+ self.appearance = appearance
74
+ }
75
+
76
+ var compiledCacheKey: String {
77
+ let mentionPrefix = Self.mentionPrefix(in: configuration.configJSON) ?? ""
78
+ let input = [
79
+ source.value,
80
+ configuration.configJSON,
81
+ configuration.imagePolicyJSON ?? "",
82
+ configuration.imagesEnabled ? "1" : "0",
83
+ mentionPrefix,
84
+ source.kind == .json ? "json" : "html"
85
+ ].joined(separator: "\u{1F}")
86
+ return SHA256Digest.hex(input)
87
+ }
88
+
89
+ var themeDigest: String { SHA256Digest.hex(configuration.themeJSON ?? "") }
90
+
91
+ /// Canonical publication identity. State-only layout/font revisions are
92
+ /// intentionally excluded so cancellation/reinstall cannot reopen image
93
+ /// metadata or resource-error publication for the same semantic source.
94
+ var semanticGenerationIdentity: String {
95
+ SHA256Digest.hex([
96
+ source.kind == .json ? "json" : "html",
97
+ source.value,
98
+ configuration.configJSON,
99
+ configuration.themeJSON ?? "",
100
+ configuration.imagePolicyJSON ?? "",
101
+ configuration.imagesEnabled ? "1" : "0",
102
+ configuration.collapsesWhenEmpty ? "1" : "0",
103
+ mentionPrefix ?? ""
104
+ ].joined(separator: "\u{1F}"))
105
+ }
106
+
107
+ /// Includes the semantic generation plus the permitted state-only layout
108
+ /// revisions. This remains the immutable layout/cache identity.
109
+ var generationIdentity: String {
110
+ SHA256Digest.hex([
111
+ semanticGenerationIdentity,
112
+ String(attachmentRevision),
113
+ String(nativeFontRevision),
114
+ String(Double(nativeFontScale).bitPattern),
115
+ String(fontEnvironmentRevision),
116
+ appearance.identity
117
+ ].joined(separator: "\u{1F}"))
118
+ }
119
+
120
+ var mentionPrefix: String? { Self.mentionPrefix(in: configuration.configJSON) }
121
+
122
+ private static func mentionPrefix(in json: String) -> String? {
123
+ guard let data = json.data(using: .utf8),
124
+ let root = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
125
+ else { return nil }
126
+ return ((root["mentions"] as? [String: Any])?["prefix"] as? String)
127
+ ?? (root["mentionPrefix"] as? String)
128
+ }
129
+ }
130
+
131
+ struct ProseViewerAppearance: Hashable {
132
+ let userInterfaceStyle: UIUserInterfaceStyle
133
+ let accessibilityContrast: UIAccessibilityContrast
134
+
135
+ static var current: ProseViewerAppearance {
136
+ ProseViewerAppearance(traits: .current)
137
+ }
138
+
139
+ init(
140
+ userInterfaceStyle: UIUserInterfaceStyle,
141
+ accessibilityContrast: UIAccessibilityContrast = .normal
142
+ ) {
143
+ self.userInterfaceStyle = userInterfaceStyle == .dark ? .dark : .light
144
+ self.accessibilityContrast = accessibilityContrast == .high ? .high : .normal
145
+ }
146
+
147
+ init(traits: UITraitCollection) {
148
+ self.init(
149
+ userInterfaceStyle: traits.userInterfaceStyle,
150
+ accessibilityContrast: traits.accessibilityContrast
151
+ )
152
+ }
153
+
154
+ init(rawUserInterfaceStyle: Int, rawAccessibilityContrast: Int = 0) {
155
+ let contrast = UIAccessibilityContrast(rawValue: rawAccessibilityContrast) ?? .normal
156
+ if rawUserInterfaceStyle == UIUserInterfaceStyle.light.rawValue
157
+ || rawUserInterfaceStyle == UIUserInterfaceStyle.dark.rawValue,
158
+ let style = UIUserInterfaceStyle(rawValue: rawUserInterfaceStyle) {
159
+ self.init(userInterfaceStyle: style, accessibilityContrast: contrast)
160
+ } else {
161
+ self = .current
162
+ }
163
+ }
164
+
165
+ var identity: String {
166
+ "\(userInterfaceStyle.rawValue):\(accessibilityContrast.rawValue)"
167
+ }
168
+
169
+ var traits: UITraitCollection {
170
+ UITraitCollection(traitsFrom: [
171
+ UITraitCollection(userInterfaceStyle: userInterfaceStyle),
172
+ UITraitCollection(accessibilityContrast: accessibilityContrast)
173
+ ])
174
+ }
175
+ }
176
+
177
+ public enum ProseViewerError: Error, Equatable {
178
+ case compiler(domain: String, code: String, message: String)
179
+ case hostContract(message: String)
180
+ case layout(message: String)
181
+ case resource
182
+
183
+ var domain: String {
184
+ switch self {
185
+ case let .compiler(domain, _, _): domain
186
+ case .hostContract: "viewer.host"
187
+ case .layout: "viewer.layout"
188
+ case .resource: "viewer.resource"
189
+ }
190
+ }
191
+
192
+ var code: String {
193
+ switch self {
194
+ case let .compiler(_, code, _): code
195
+ case .hostContract: "INVALID_WIDTH"
196
+ case .layout: "LAYOUT_FAILED"
197
+ case .resource: "RESOURCE_LOAD_FAILED"
198
+ }
199
+ }
200
+
201
+ var message: String {
202
+ switch self {
203
+ case let .compiler(_, _, message), let .hostContract(message), let .layout(message): message
204
+ case .resource: "An image resource could not be loaded."
205
+ }
206
+ }
207
+ }
208
+
209
+ struct ViewerParagraph: Hashable {
210
+ let text: String
211
+ }
212
+
213
+ /// A declarative list marker inherited by a text block from its list-item.
214
+ struct ViewerListContext: Hashable {
215
+ let ordered: Bool
216
+ let index: Int
217
+ let kind: String?
218
+ let checked: Bool
219
+ let isLast: Bool
220
+ }
221
+
222
+ /// Identifies the nearest list item that owns a renderable leaf. The identity
223
+ /// is assigned while consuming the deterministic compiler sequence, so leaves
224
+ /// from one item share geometry even when their paint differs.
225
+ struct ViewerListItemBoundary: Hashable {
226
+ let identity: Int
227
+ let nestingDepth: UInt16
228
+ let isFirstRenderableLeaf: Bool
229
+ let isFinalRenderableLeaf: Bool
230
+ }
231
+
232
+ struct ViewerListItemAncestor: Hashable {
233
+ let identity: Int
234
+ let context: ViewerListContext
235
+ }
236
+
237
+ enum ViewerInline: Hashable {
238
+ case text(text: String, marks: [FfiViewerMark])
239
+ case atom(nodeType: String, docPos: UInt32, attrsJSON: String, label: String)
240
+ }
241
+
242
+ /// A renderable leaf block. Container nodes are represented by the inherited
243
+ /// context instead of being re-laid out as synthetic paragraphs.
244
+ struct ViewerStyleAncestor: Hashable {
245
+ let identity: Int
246
+ let nodeType: String
247
+ }
248
+
249
+ struct ViewerBlock: Hashable {
250
+ let styleAncestors: [ViewerStyleAncestor]
251
+ let language: String?
252
+ let isBlockAtom: Bool
253
+ let nodeType: String
254
+ let depth: UInt16
255
+ let inBlockquote: Bool
256
+ let listContext: ViewerListContext?
257
+ let listItemBoundary: ViewerListItemBoundary?
258
+ let listItemAncestors: [ViewerListItemAncestor]
259
+ let outermostListItemIdentity: Int?
260
+ let outermostListItemIsLast: Bool
261
+ let inlines: [ViewerInline]
262
+
263
+ init(
264
+ nodeType: String,
265
+ depth: UInt16,
266
+ inBlockquote: Bool,
267
+ listContext: ViewerListContext?,
268
+ listItemBoundary: ViewerListItemBoundary?,
269
+ listItemAncestors: [ViewerListItemAncestor] = [],
270
+ outermostListItemIdentity: Int? = nil,
271
+ outermostListItemIsLast: Bool = false,
272
+ inlines: [ViewerInline],
273
+ isBlockAtom: Bool = false,
274
+ styleAncestors: [ViewerStyleAncestor] = [],
275
+ language: String? = nil
276
+ ) {
277
+ self.language = language
278
+ self.styleAncestors = styleAncestors
279
+ self.isBlockAtom = isBlockAtom
280
+ self.nodeType = nodeType
281
+ self.depth = depth
282
+ self.inBlockquote = inBlockquote
283
+ self.listContext = listContext
284
+ self.listItemBoundary = listItemBoundary
285
+ self.listItemAncestors = listItemAncestors
286
+ self.outermostListItemIdentity = outermostListItemIdentity
287
+ self.outermostListItemIsLast = outermostListItemIsLast
288
+ self.inlines = inlines
289
+ }
290
+
291
+ func withListItemBoundary(_ boundary: ViewerListItemBoundary) -> ViewerBlock {
292
+ ViewerBlock(
293
+ nodeType: nodeType,
294
+ depth: depth,
295
+ inBlockquote: inBlockquote,
296
+ listContext: listContext,
297
+ listItemBoundary: boundary,
298
+ listItemAncestors: listItemAncestors,
299
+ outermostListItemIdentity: outermostListItemIdentity,
300
+ outermostListItemIsLast: outermostListItemIsLast,
301
+ inlines: inlines,
302
+ isBlockAtom: isBlockAtom,
303
+ styleAncestors: styleAncestors,
304
+ language: language
305
+ )
306
+ }
307
+ }
308
+
309
+ /// Width-independent native projection of the Rust compiled document. The
310
+ /// prepared theme is attached only to the measurement copy; cached compiler
311
+ /// output remains semantic/theme independent.
312
+ struct ViewerDocument {
313
+ let semanticKey: String
314
+ let blocks: [ViewerBlock]
315
+ let isEmpty: Bool
316
+ let retainedBytes: Int
317
+ let trailingEmptyTextBlockCount: Int
318
+ let preparedTheme: PreparedProseTheme?
319
+
320
+ var paragraphs: [ViewerParagraph] {
321
+ blocks.compactMap { block in
322
+ let text = block.inlines.reduce(into: "") { partial, inline in
323
+ switch inline {
324
+ case let .text(text: value, marks: _): partial.append(value)
325
+ case let .atom(nodeType: _, docPos: _, attrsJSON: _, label: label): partial.append(label)
326
+ }
327
+ }
328
+ return ViewerParagraph(text: text)
329
+ }
330
+ }
331
+
332
+ init(semanticKey: String, paragraphs: [ViewerParagraph], isEmpty: Bool, retainedBytes: Int) {
333
+ self.semanticKey = semanticKey
334
+ blocks = paragraphs.map {
335
+ ViewerBlock(
336
+ nodeType: "paragraph",
337
+ depth: 0,
338
+ inBlockquote: false,
339
+ listContext: nil,
340
+ listItemBoundary: nil,
341
+ inlines: [.text(text: $0.text, marks: [])]
342
+ )
343
+ }
344
+ self.isEmpty = isEmpty
345
+ self.retainedBytes = retainedBytes
346
+ trailingEmptyTextBlockCount = 0
347
+ preparedTheme = nil
348
+ }
349
+
350
+ init(
351
+ semanticKey: String,
352
+ blocks: [ViewerBlock],
353
+ isEmpty: Bool,
354
+ retainedBytes: Int,
355
+ trailingEmptyTextBlockCount: Int = 0,
356
+ preparedTheme: PreparedProseTheme? = nil
357
+ ) {
358
+ self.semanticKey = semanticKey
359
+ self.blocks = blocks
360
+ self.isEmpty = isEmpty
361
+ self.retainedBytes = retainedBytes
362
+ self.trailingEmptyTextBlockCount = trailingEmptyTextBlockCount
363
+ self.preparedTheme = preparedTheme
364
+ }
365
+
366
+ init(compiled: ViewerCompiledDocument) throws {
367
+ semanticKey = compiled.semanticKey()
368
+ isEmpty = compiled.isEmpty()
369
+ retainedBytes = Int(compiled.retainedBytesDecimal()) ?? 0
370
+ trailingEmptyTextBlockCount = Int(compiled.trailingEmptyTextBlockCount())
371
+ preparedTheme = nil
372
+
373
+ struct Builder {
374
+ let language: String?
375
+ let styleIdentity: Int
376
+ let listStyleIdentity: Int?
377
+ let listParentIdentity: Int
378
+ let nodeType: String
379
+ let depth: UInt16
380
+ let listContext: ViewerListContext?
381
+ let listItemIdentity: Int?
382
+ var inlines: [ViewerInline]
383
+ }
384
+
385
+ var stack: [Builder] = []
386
+ var nextStyleIdentity = 0
387
+ var listStyleGroups: [Int: Int] = [:]
388
+ var rendered: [ViewerBlock] = []
389
+ var renderableLeavesByListItem: [Int: [Int]] = [:]
390
+ var listItemDepthByIdentity: [Int: UInt16] = [:]
391
+ var nextListItemIdentity = 0
392
+ let preferredTextBlockName = compiled.preferredTextBlockName()
393
+ for element in compiled.elements() {
394
+ switch element {
395
+ case let .blockStart(nodeType: nodeType, language: language, depth: depth, listContextJson: listContextJSON):
396
+ let listContext = Self.listContext(from: listContextJSON)
397
+ let parentIdentity = stack.last?.styleIdentity ?? -1
398
+ if listContext != nil, listStyleGroups[parentIdentity] == nil {
399
+ listStyleGroups[parentIdentity] = nextStyleIdentity
400
+ nextStyleIdentity += 1
401
+ }
402
+ let listItemIdentity: Int?
403
+ if listContext != nil {
404
+ listItemIdentity = nextListItemIdentity
405
+ listItemDepthByIdentity[nextListItemIdentity] = depth
406
+ nextListItemIdentity += 1
407
+ } else {
408
+ listItemIdentity = nil
409
+ }
410
+ stack.append(
411
+ Builder(
412
+ language: language,
413
+ styleIdentity: nextStyleIdentity,
414
+ listStyleIdentity: listContext == nil ? nil : listStyleGroups[parentIdentity],
415
+ listParentIdentity: parentIdentity,
416
+ nodeType: nodeType,
417
+ depth: depth,
418
+ listContext: listContext,
419
+ listItemIdentity: listItemIdentity,
420
+ inlines: []
421
+ )
422
+ )
423
+ nextStyleIdentity += 1
424
+ case let .textRun(text: text, marks: marks):
425
+ guard !stack.isEmpty else { continue }
426
+ stack[stack.count - 1].inlines.append(.text(text: text, marks: marks))
427
+ case let .inlineAtom(nodeType: nodeType, docPos: docPos, attrsJson: attrsJson, label: label):
428
+ guard !stack.isEmpty else { continue }
429
+ stack[stack.count - 1].inlines.append(
430
+ .atom(nodeType: nodeType, docPos: docPos, attrsJSON: attrsJson, label: label)
431
+ )
432
+ case let .blockAtom(nodeType: nodeType, docPos: docPos, attrsJson: attrsJson, label: label):
433
+ let listContext = stack.reversed().compactMap(\.listContext).first
434
+ let listItemIdentity = stack.reversed().compactMap(\.listItemIdentity).first
435
+ let listItemAncestors = stack.compactMap { builder -> ViewerListItemAncestor? in
436
+ guard let identity = builder.listItemIdentity,
437
+ let context = builder.listContext
438
+ else { return nil }
439
+ return ViewerListItemAncestor(identity: identity, context: context)
440
+ }
441
+ let outermostListItem = stack.first { $0.listItemIdentity != nil }
442
+ rendered.append(
443
+ ViewerBlock(
444
+ nodeType: nodeType,
445
+ depth: stack.last?.depth ?? 0,
446
+ inBlockquote: stack.contains { $0.nodeType == "blockquote" },
447
+ listContext: listContext,
448
+ listItemBoundary: nil,
449
+ listItemAncestors: listItemAncestors,
450
+ outermostListItemIdentity: outermostListItem?.listItemIdentity,
451
+ outermostListItemIsLast: outermostListItem?.listContext?.isLast ?? false,
452
+ inlines: [.atom(nodeType: nodeType, docPos: docPos, attrsJSON: attrsJson, label: label)],
453
+ isBlockAtom: true,
454
+ styleAncestors: stack.flatMap { builder -> [ViewerStyleAncestor] in
455
+ var values: [ViewerStyleAncestor] = []
456
+ if let identity = builder.listStyleIdentity, let context = builder.listContext {
457
+ values.append(ViewerStyleAncestor(identity: identity, nodeType: context.kind == "task" ? "taskList" : context.ordered ? "orderedList" : "bulletList"))
458
+ }
459
+ values.append(ViewerStyleAncestor(identity: builder.styleIdentity, nodeType: builder.nodeType))
460
+ return values
461
+ }
462
+ )
463
+ )
464
+ if let listItemIdentity {
465
+ renderableLeavesByListItem[listItemIdentity, default: []].append(rendered.count - 1)
466
+ }
467
+ case .blockEnd:
468
+ guard let builder = stack.popLast() else { continue }
469
+ if builder.listContext?.isLast == true { listStyleGroups.removeValue(forKey: builder.listParentIdentity) }
470
+ guard !builder.inlines.isEmpty ||
471
+ builder.nodeType == preferredTextBlockName || builder.nodeType == "codeBlock"
472
+ else { continue }
473
+ let ancestors = stack + [builder]
474
+ let listContext = ancestors.reversed().compactMap(\.listContext).first
475
+ let listItemIdentity = ancestors.reversed().compactMap(\.listItemIdentity).first
476
+ let listItemAncestors = ancestors.compactMap { ancestor -> ViewerListItemAncestor? in
477
+ guard let identity = ancestor.listItemIdentity,
478
+ let context = ancestor.listContext
479
+ else { return nil }
480
+ return ViewerListItemAncestor(identity: identity, context: context)
481
+ }
482
+ let outermostListItem = ancestors.first { $0.listItemIdentity != nil }
483
+ let inBlockquote = ancestors.contains { $0.nodeType == "blockquote" }
484
+ rendered.append(
485
+ ViewerBlock(
486
+ nodeType: builder.nodeType,
487
+ depth: builder.depth,
488
+ inBlockquote: inBlockquote,
489
+ listContext: listContext,
490
+ listItemBoundary: nil,
491
+ listItemAncestors: listItemAncestors,
492
+ outermostListItemIdentity: outermostListItem?.listItemIdentity,
493
+ outermostListItemIsLast: outermostListItem?.listContext?.isLast ?? false,
494
+ inlines: builder.inlines,
495
+ styleAncestors: stack.flatMap { builder -> [ViewerStyleAncestor] in
496
+ var values: [ViewerStyleAncestor] = []
497
+ if let identity = builder.listStyleIdentity, let context = builder.listContext {
498
+ values.append(ViewerStyleAncestor(identity: identity, nodeType: context.kind == "task" ? "taskList" : context.ordered ? "orderedList" : "bulletList"))
499
+ }
500
+ values.append(ViewerStyleAncestor(identity: builder.styleIdentity, nodeType: builder.nodeType))
501
+ return values
502
+ } + {
503
+ guard let identity = builder.listStyleIdentity, let context = builder.listContext else { return [] }
504
+ return [ViewerStyleAncestor(identity: identity, nodeType: context.kind == "task" ? "taskList" : context.ordered ? "orderedList" : "bulletList")]
505
+ }(),
506
+ language: builder.language
507
+ )
508
+ )
509
+ if let listItemIdentity {
510
+ renderableLeavesByListItem[listItemIdentity, default: []].append(rendered.count - 1)
511
+ }
512
+ }
513
+ }
514
+ for (identity, leaves) in renderableLeavesByListItem {
515
+ guard let first = leaves.first, let final = leaves.last else { continue }
516
+ for leaf in leaves {
517
+ rendered[leaf] = rendered[leaf].withListItemBoundary(
518
+ ViewerListItemBoundary(
519
+ identity: identity,
520
+ nestingDepth: listItemDepthByIdentity[identity] ?? 0,
521
+ isFirstRenderableLeaf: leaf == first,
522
+ isFinalRenderableLeaf: leaf == final
523
+ )
524
+ )
525
+ }
526
+ }
527
+ let admittedAttachmentCount = rendered.reduce(into: 0) { count, block in
528
+ if block.nodeType == "image", ViewerImageAttachment.sourceAndDeclaredSize(in: block) != nil {
529
+ count += 1
530
+ }
531
+ }
532
+ guard admittedAttachmentCount <= ViewerImageAttachment.maximumAdmittedAttachments else {
533
+ throw ProseViewerError.compiler(
534
+ domain: "viewer",
535
+ code: "ATTACHMENT_LIMIT_EXCEEDED",
536
+ message: "The document exceeds the maximum admitted image attachment count."
537
+ )
538
+ }
539
+ blocks = rendered.isEmpty && !isEmpty
540
+ ? [ViewerBlock(nodeType: "paragraph", depth: 0, inBlockquote: false, listContext: nil, listItemBoundary: nil, inlines: [.text(text: "", marks: [])])]
541
+ : rendered
542
+ }
543
+
544
+ func withPreparedTheme(_ theme: PreparedProseTheme) -> ViewerDocument {
545
+ ViewerDocument(
546
+ semanticKey: semanticKey,
547
+ blocks: blocks,
548
+ isEmpty: isEmpty,
549
+ retainedBytes: retainedBytes,
550
+ trailingEmptyTextBlockCount: trailingEmptyTextBlockCount,
551
+ preparedTheme: theme
552
+ )
553
+ }
554
+
555
+ private static func listContext(from json: String?) -> ViewerListContext? {
556
+ guard let json,
557
+ let data = json.data(using: .utf8),
558
+ let value = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
559
+ else { return nil }
560
+ return ViewerListContext(
561
+ ordered: (value["ordered"] as? Bool) ?? false,
562
+ index: (value["index"] as? NSNumber)?.intValue ?? 1,
563
+ kind: value["kind"] as? String,
564
+ checked: (value["checked"] as? Bool) ?? false,
565
+ isLast: (value["isLast"] as? Bool) ?? false
566
+ )
567
+ }
568
+ }
569
+
570
+ private enum SHA256Digest {
571
+ static func hex(_ value: String) -> String {
572
+ let data = Data(value.utf8)
573
+ return SHA256.hash(data: data).map { String(format: "%02x", $0) }.joined()
574
+ }
575
+ }