@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,177 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.content.Context
4
+ import android.graphics.Typeface
5
+ import org.json.JSONObject
6
+
7
+ internal data class NativeToolbarIcon(
8
+ val defaultId: ToolbarDefaultIconId? = null,
9
+ val glyphText: String? = null,
10
+ val fallbackText: String? = null,
11
+ val materialIconName: String? = null
12
+ ) {
13
+ companion object {
14
+ private val defaultGlyphs = mapOf(
15
+ ToolbarDefaultIconId.BOLD to "B",
16
+ ToolbarDefaultIconId.ITALIC to "I",
17
+ ToolbarDefaultIconId.UNDERLINE to "U",
18
+ ToolbarDefaultIconId.STRIKE to "S",
19
+ ToolbarDefaultIconId.LINK to "🔗",
20
+ ToolbarDefaultIconId.IMAGE to "🖼",
21
+ ToolbarDefaultIconId.H1 to "H1",
22
+ ToolbarDefaultIconId.H2 to "H2",
23
+ ToolbarDefaultIconId.H3 to "H3",
24
+ ToolbarDefaultIconId.H4 to "H4",
25
+ ToolbarDefaultIconId.H5 to "H5",
26
+ ToolbarDefaultIconId.H6 to "H6",
27
+ ToolbarDefaultIconId.BLOCKQUOTE to "❝",
28
+ ToolbarDefaultIconId.BULLET_LIST to "•≡",
29
+ ToolbarDefaultIconId.ORDERED_LIST to "1.",
30
+ ToolbarDefaultIconId.INDENT_LIST to "→",
31
+ ToolbarDefaultIconId.OUTDENT_LIST to "←",
32
+ ToolbarDefaultIconId.LINE_BREAK to "↵",
33
+ ToolbarDefaultIconId.HORIZONTAL_RULE to "—",
34
+ ToolbarDefaultIconId.UNDO to "↩",
35
+ ToolbarDefaultIconId.REDO to "↪"
36
+ )
37
+ private val defaultMaterialIcons = mapOf(
38
+ ToolbarDefaultIconId.BOLD to "format-bold",
39
+ ToolbarDefaultIconId.ITALIC to "format-italic",
40
+ ToolbarDefaultIconId.UNDERLINE to "format-underlined",
41
+ ToolbarDefaultIconId.STRIKE to "strikethrough-s",
42
+ ToolbarDefaultIconId.LINK to "link",
43
+ ToolbarDefaultIconId.IMAGE to "image",
44
+ ToolbarDefaultIconId.BLOCKQUOTE to "format-quote",
45
+ ToolbarDefaultIconId.BULLET_LIST to "format-list-bulleted",
46
+ ToolbarDefaultIconId.ORDERED_LIST to "format-list-numbered",
47
+ ToolbarDefaultIconId.INDENT_LIST to "format-indent-increase",
48
+ ToolbarDefaultIconId.OUTDENT_LIST to "format-indent-decrease",
49
+ ToolbarDefaultIconId.LINE_BREAK to "keyboard-return",
50
+ ToolbarDefaultIconId.HORIZONTAL_RULE to "horizontal-rule",
51
+ ToolbarDefaultIconId.H1 to "title",
52
+ ToolbarDefaultIconId.H2 to "title",
53
+ ToolbarDefaultIconId.H3 to "title",
54
+ ToolbarDefaultIconId.H4 to "title",
55
+ ToolbarDefaultIconId.H5 to "title",
56
+ ToolbarDefaultIconId.H6 to "title",
57
+ ToolbarDefaultIconId.UNDO to "undo",
58
+ ToolbarDefaultIconId.REDO to "redo"
59
+ )
60
+
61
+ fun fromJson(raw: JSONObject?): NativeToolbarIcon? {
62
+ raw ?: return null
63
+ return when (raw.optString("type")) {
64
+ "default" -> {
65
+ val id = runCatching {
66
+ ToolbarDefaultIconId.fromWireValue(raw.getString("id"))
67
+ }.getOrNull() ?: return null
68
+ NativeToolbarIcon(defaultId = id)
69
+ }
70
+
71
+ "glyph" -> {
72
+ val text = raw.optString("text")
73
+ if (text.isBlank()) null else NativeToolbarIcon(glyphText = text)
74
+ }
75
+
76
+ "platform" -> {
77
+ val materialName = raw.optJSONObject("android")
78
+ ?.takeIf { it.optString("type") == "material" }
79
+ ?.toolbarNullableString("name")
80
+ val fallback = raw.toolbarNullableString("fallbackText")
81
+ if (materialName.isNullOrBlank() && fallback.isNullOrBlank()) {
82
+ null
83
+ } else {
84
+ NativeToolbarIcon(
85
+ fallbackText = fallback,
86
+ materialIconName = materialName
87
+ )
88
+ }
89
+ }
90
+
91
+ else -> null
92
+ }
93
+ }
94
+
95
+ fun defaultMaterialIconName(defaultId: ToolbarDefaultIconId?): String? =
96
+ defaultId?.let { defaultMaterialIcons[it] }
97
+ }
98
+
99
+ fun resolvedGlyphText(): String = glyphText?.takeIf { it.isNotBlank() }
100
+ ?: fallbackText?.takeIf { it.isNotBlank() }
101
+ ?: defaultId?.let { defaultGlyphs[it] }
102
+ ?: "?"
103
+
104
+ fun resolvedMaterialIconName(): String? = materialIconName?.takeIf { it.isNotBlank() }
105
+ ?: Companion.defaultMaterialIconName(defaultId)
106
+ }
107
+
108
+ internal object MaterialIconRegistry {
109
+ private const val FONT_ASSET_PATH = "editor-icons/MaterialIcons.ttf"
110
+ private const val GLYPHMAP_ASSET_PATH = "editor-icons/MaterialIcons.json"
111
+
112
+ @Volatile
113
+ private var typeface: Typeface? = null
114
+
115
+ @Volatile
116
+ private var glyphMap: Map<String, String>? = null
117
+
118
+ fun typeface(context: Context): Typeface? {
119
+ val cached = typeface
120
+ if (cached != null) return cached
121
+ return runCatching {
122
+ Typeface.createFromAsset(context.assets, FONT_ASSET_PATH)
123
+ }.getOrNull()?.also { loaded ->
124
+ typeface = loaded
125
+ }
126
+ }
127
+
128
+ fun glyphForName(context: Context, name: String?): String? {
129
+ if (name.isNullOrBlank()) return null
130
+ val map = glyphMap ?: loadGlyphMap(context).also { loaded ->
131
+ glyphMap = loaded
132
+ }
133
+ return map[name]
134
+ }
135
+
136
+ private fun loadGlyphMap(context: Context): Map<String, String> {
137
+ val assetText = runCatching {
138
+ context.assets.open(GLYPHMAP_ASSET_PATH).bufferedReader().use { it.readText() }
139
+ }.getOrNull() ?: return emptyMap()
140
+
141
+ val json = runCatching { JSONObject(assetText) }.getOrNull() ?: return emptyMap()
142
+ val result = linkedMapOf<String, String>()
143
+ val keys = json.keys()
144
+ while (keys.hasNext()) {
145
+ val key = keys.next()
146
+ val codePoint = json.optInt(key, -1)
147
+ if (codePoint > 0) {
148
+ result[key] = String(Character.toChars(codePoint))
149
+ }
150
+ }
151
+ return result
152
+ }
153
+ }
154
+
155
+ internal data class NativeToolbarResolvedIcon(val text: String, val typeface: Typeface? = null)
156
+
157
+ internal fun NativeToolbarIcon.resolveForAndroid(context: Context): NativeToolbarResolvedIcon {
158
+ val materialName = resolvedMaterialIconName()
159
+ val materialGlyph = MaterialIconRegistry.glyphForName(context, materialName)
160
+ val materialTypeface = MaterialIconRegistry.typeface(context)
161
+ if (materialGlyph != null && materialTypeface != null) {
162
+ return NativeToolbarResolvedIcon(
163
+ text = materialGlyph,
164
+ typeface = materialTypeface
165
+ )
166
+ }
167
+
168
+ return NativeToolbarResolvedIcon(
169
+ text = resolvedGlyphText(),
170
+ typeface = null
171
+ )
172
+ }
173
+
174
+ internal fun JSONObject.toolbarNullableString(key: String): String? {
175
+ if (!has(key) || isNull(key)) return null
176
+ return optString(key).takeUnless { it == "null" }
177
+ }
@@ -0,0 +1,274 @@
1
+ package com.apollohg.editor
2
+
3
+ import org.json.JSONObject
4
+
5
+ internal data class NativeToolbarItem(
6
+ val type: ToolbarItemKind,
7
+ val key: String? = null,
8
+ val label: String? = null,
9
+ val icon: NativeToolbarIcon? = null,
10
+ val mark: String? = null,
11
+ val headingLevel: Int? = null,
12
+ val listType: ToolbarListType? = null,
13
+ val command: ToolbarCommand? = null,
14
+ val nodeType: String? = null,
15
+ val isActive: Boolean = false,
16
+ val isDisabled: Boolean = false,
17
+ val placement: ToolbarItemPlacement? = null,
18
+ val presentation: ToolbarGroupPresentation? = null,
19
+ val items: List<NativeToolbarItem> = emptyList(),
20
+ val buttonStyle: EditorToolbarButtonStyle? = null,
21
+ val parentGroupKey: String? = null
22
+ ) {
23
+ companion object {
24
+ val defaults = listOf(
25
+ NativeToolbarItem(
26
+ ToolbarItemKind.MARK,
27
+ label = "Bold",
28
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.BOLD),
29
+ mark = "bold"
30
+ ),
31
+ NativeToolbarItem(
32
+ ToolbarItemKind.MARK,
33
+ label = "Italic",
34
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.ITALIC),
35
+ mark = "italic"
36
+ ),
37
+ NativeToolbarItem(
38
+ ToolbarItemKind.MARK,
39
+ label = "Underline",
40
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.UNDERLINE),
41
+ mark = "underline"
42
+ ),
43
+ NativeToolbarItem(
44
+ ToolbarItemKind.MARK,
45
+ label = "Strikethrough",
46
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.STRIKE),
47
+ mark = "strike"
48
+ ),
49
+ NativeToolbarItem(
50
+ ToolbarItemKind.BLOCKQUOTE,
51
+ label = "Blockquote",
52
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.BLOCKQUOTE)
53
+ ),
54
+ NativeToolbarItem(ToolbarItemKind.SEPARATOR),
55
+ NativeToolbarItem(
56
+ ToolbarItemKind.LIST,
57
+ label = "Bullet List",
58
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.BULLET_LIST),
59
+ listType = ToolbarListType.BULLET_LIST
60
+ ),
61
+ NativeToolbarItem(
62
+ ToolbarItemKind.LIST,
63
+ label = "Ordered List",
64
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.ORDERED_LIST),
65
+ listType = ToolbarListType.ORDERED_LIST
66
+ ),
67
+ NativeToolbarItem(
68
+ ToolbarItemKind.COMMAND,
69
+ label = "Indent List",
70
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.INDENT_LIST),
71
+ command = ToolbarCommand.INDENT_LIST
72
+ ),
73
+ NativeToolbarItem(
74
+ ToolbarItemKind.COMMAND,
75
+ label = "Outdent List",
76
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.OUTDENT_LIST),
77
+ command = ToolbarCommand.OUTDENT_LIST
78
+ ),
79
+ NativeToolbarItem(
80
+ ToolbarItemKind.NODE,
81
+ label = "Line Break",
82
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.LINE_BREAK),
83
+ nodeType = "hard_break"
84
+ ),
85
+ NativeToolbarItem(
86
+ ToolbarItemKind.NODE,
87
+ label = "Horizontal Rule",
88
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.HORIZONTAL_RULE),
89
+ nodeType = "horizontal_rule"
90
+ ),
91
+ NativeToolbarItem(ToolbarItemKind.SEPARATOR),
92
+ NativeToolbarItem(
93
+ ToolbarItemKind.COMMAND,
94
+ label = "Undo",
95
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.UNDO),
96
+ command = ToolbarCommand.UNDO
97
+ ),
98
+ NativeToolbarItem(
99
+ ToolbarItemKind.COMMAND,
100
+ label = "Redo",
101
+ icon = NativeToolbarIcon(defaultId = ToolbarDefaultIconId.REDO),
102
+ command = ToolbarCommand.REDO
103
+ )
104
+ )
105
+
106
+ private fun parseItem(
107
+ rawItem: JSONObject,
108
+ allowGroup: Boolean = true,
109
+ allowSeparator: Boolean = true
110
+ ): NativeToolbarItem? {
111
+ val type = runCatching {
112
+ ToolbarItemKind.fromWireValue(rawItem.getString("type"))
113
+ }.getOrNull() ?: return null
114
+ val key = rawItem.toolbarNullableString("key")
115
+ val placement = rawItem.toolbarNullableString("placement")?.let {
116
+ runCatching { ToolbarItemPlacement.fromWireValue(it) }.getOrNull()
117
+ }
118
+ val parsed = when (type) {
119
+ ToolbarItemKind.SEPARATOR -> {
120
+ if (!allowSeparator) {
121
+ null
122
+ } else {
123
+ NativeToolbarItem(type = type, key = key, placement = placement)
124
+ }
125
+ }
126
+
127
+ ToolbarItemKind.MARK -> {
128
+ val icon =
129
+ NativeToolbarIcon.fromJson(rawItem.optJSONObject("icon")) ?: return null
130
+ val mark = rawItem.toolbarNullableString("mark") ?: return null
131
+ val label = rawItem.toolbarNullableString("label") ?: return null
132
+ NativeToolbarItem(type, key, label, icon, mark = mark, placement = placement)
133
+ }
134
+
135
+ ToolbarItemKind.HEADING -> {
136
+ val icon =
137
+ NativeToolbarIcon.fromJson(rawItem.optJSONObject("icon")) ?: return null
138
+ val level = rawItem.optInt("level", -1)
139
+ if (level !in 1..6) return null
140
+ val label = rawItem.toolbarNullableString("label") ?: return null
141
+ NativeToolbarItem(
142
+ type,
143
+ key,
144
+ label,
145
+ icon,
146
+ headingLevel = level,
147
+ placement = placement
148
+ )
149
+ }
150
+
151
+ ToolbarItemKind.BLOCKQUOTE -> {
152
+ val icon =
153
+ NativeToolbarIcon.fromJson(rawItem.optJSONObject("icon")) ?: return null
154
+ val label = rawItem.toolbarNullableString("label") ?: return null
155
+ NativeToolbarItem(type, key, label, icon, placement = placement)
156
+ }
157
+
158
+ ToolbarItemKind.LIST -> {
159
+ val icon =
160
+ NativeToolbarIcon.fromJson(rawItem.optJSONObject("icon")) ?: return null
161
+ val listType = runCatching {
162
+ ToolbarListType.fromWireValue(rawItem.getString("listType"))
163
+ }.getOrNull() ?: return null
164
+ val label = rawItem.toolbarNullableString("label") ?: return null
165
+ NativeToolbarItem(
166
+ type,
167
+ key,
168
+ label,
169
+ icon,
170
+ listType = listType,
171
+ placement = placement
172
+ )
173
+ }
174
+
175
+ ToolbarItemKind.COMMAND -> {
176
+ val icon =
177
+ NativeToolbarIcon.fromJson(rawItem.optJSONObject("icon")) ?: return null
178
+ val command = runCatching {
179
+ ToolbarCommand.fromWireValue(rawItem.getString("command"))
180
+ }.getOrNull() ?: return null
181
+ val label = rawItem.toolbarNullableString("label") ?: return null
182
+ NativeToolbarItem(
183
+ type,
184
+ key,
185
+ label,
186
+ icon,
187
+ command = command,
188
+ placement = placement
189
+ )
190
+ }
191
+
192
+ ToolbarItemKind.NODE -> {
193
+ val icon =
194
+ NativeToolbarIcon.fromJson(rawItem.optJSONObject("icon")) ?: return null
195
+ val nodeType = rawItem.toolbarNullableString("nodeType") ?: return null
196
+ val label = rawItem.toolbarNullableString("label") ?: return null
197
+ NativeToolbarItem(
198
+ type,
199
+ key,
200
+ label,
201
+ icon,
202
+ nodeType = nodeType,
203
+ placement = placement
204
+ )
205
+ }
206
+
207
+ ToolbarItemKind.ACTION -> {
208
+ val icon =
209
+ NativeToolbarIcon.fromJson(rawItem.optJSONObject("icon")) ?: return null
210
+ val keyValue = rawItem.toolbarNullableString("key") ?: return null
211
+ val label = rawItem.toolbarNullableString("label") ?: return null
212
+ NativeToolbarItem(
213
+ type = type,
214
+ key = keyValue,
215
+ label = label,
216
+ icon = icon,
217
+ placement = placement,
218
+ isActive = rawItem.optBoolean("isActive", false),
219
+ isDisabled = rawItem.optBoolean("isDisabled", false)
220
+ )
221
+ }
222
+
223
+ ToolbarItemKind.GROUP -> {
224
+ if (!allowGroup) return null
225
+ val keyValue = rawItem.toolbarNullableString("key") ?: return null
226
+ val icon =
227
+ NativeToolbarIcon.fromJson(rawItem.optJSONObject("icon")) ?: return null
228
+ val label = rawItem.toolbarNullableString("label") ?: return null
229
+ val presentation = rawItem.toolbarNullableString("presentation")?.let {
230
+ runCatching { ToolbarGroupPresentation.fromWireValue(it) }.getOrNull()
231
+ } ?: ToolbarGroupPresentation.EXPAND
232
+ val rawChildren = rawItem.optJSONArray("items") ?: return null
233
+ val children = mutableListOf<NativeToolbarItem>()
234
+ for (childIndex in 0 until rawChildren.length()) {
235
+ val rawChild = rawChildren.optJSONObject(childIndex) ?: continue
236
+ parseItem(rawChild, allowGroup = false, allowSeparator = false)?.let {
237
+ children += it
238
+ }
239
+ }
240
+ if (children.isEmpty()) return null
241
+ NativeToolbarItem(
242
+ type = type,
243
+ key = keyValue,
244
+ label = label,
245
+ icon = icon,
246
+ placement = placement,
247
+ presentation = presentation,
248
+ items = children
249
+ )
250
+ }
251
+ }
252
+ return parsed?.copy(
253
+ buttonStyle = EditorToolbarButtonStyle.fromJson(
254
+ rawItem.optJSONObject("buttonStyle")
255
+ )
256
+ )
257
+ }
258
+
259
+ fun fromJson(json: String?): List<NativeToolbarItem> {
260
+ if (json.isNullOrBlank()) return defaults
261
+ val rawArray = try {
262
+ org.json.JSONArray(json)
263
+ } catch (_: Exception) {
264
+ return defaults
265
+ }
266
+ val parsed = mutableListOf<NativeToolbarItem>()
267
+ for (index in 0 until rawArray.length()) {
268
+ val rawItem = rawArray.optJSONObject(index) ?: continue
269
+ parseItem(rawItem)?.let { parsed += it }
270
+ }
271
+ return parsed.ifEmpty { defaults }
272
+ }
273
+ }
274
+ }
@@ -0,0 +1,102 @@
1
+ package com.apollohg.editor
2
+
3
+ import okhttp3.OkHttpClient
4
+ import okhttp3.Request
5
+ import okhttp3.Response
6
+ import okhttp3.WebSocket
7
+ import okhttp3.WebSocketListener
8
+ import okio.ByteString
9
+
10
+ internal data class CollaborationSocketCallbacks(
11
+ val onOpen: (negotiatedProtocol: String?) -> Unit,
12
+ val onBinaryMessage: (ByteArray) -> Unit,
13
+ val onTextMessage: (String) -> Unit,
14
+ val onClosing: (Int) -> Unit,
15
+ val onClosed: (Int) -> Unit,
16
+ val onFailure: () -> Unit
17
+ )
18
+
19
+ internal interface CollaborationSocket {
20
+ fun connect()
21
+ fun send(data: ByteString): Boolean
22
+ fun send(text: String): Boolean
23
+ fun close(code: Int, reason: String?): Boolean
24
+ fun cancel()
25
+ }
26
+
27
+ internal interface CollaborationSocketFactory {
28
+ fun makeSocket(
29
+ url: String,
30
+ protocols: List<String>,
31
+ callbacks: CollaborationSocketCallbacks
32
+ ): CollaborationSocket
33
+ }
34
+
35
+ internal class OkHttpCollaborationSocketFactory(private val client: OkHttpClient = OkHttpClient()) :
36
+ CollaborationSocketFactory {
37
+ override fun makeSocket(
38
+ url: String,
39
+ protocols: List<String>,
40
+ callbacks: CollaborationSocketCallbacks
41
+ ): CollaborationSocket = OkHttpCollaborationSocket(client, url, protocols, callbacks)
42
+ }
43
+
44
+ private class OkHttpCollaborationSocket(
45
+ private val client: OkHttpClient,
46
+ private val url: String,
47
+ private val protocols: List<String>,
48
+ private val callbacks: CollaborationSocketCallbacks
49
+ ) : CollaborationSocket {
50
+ private var webSocket: WebSocket? = null
51
+
52
+ override fun connect() {
53
+ check(webSocket == null)
54
+ val request = Request.Builder().url(url).apply {
55
+ if (protocols.isNotEmpty()) {
56
+ header("Sec-WebSocket-Protocol", protocols.joinToString(", "))
57
+ }
58
+ }.build()
59
+ webSocket = client.newWebSocket(
60
+ request,
61
+ object : WebSocketListener() {
62
+ override fun onOpen(webSocket: WebSocket, response: Response) {
63
+ callbacks.onOpen(response.header("Sec-WebSocket-Protocol"))
64
+ }
65
+
66
+ override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
67
+ callbacks.onBinaryMessage(bytes.toByteArray())
68
+ }
69
+
70
+ override fun onMessage(webSocket: WebSocket, text: String) {
71
+ callbacks.onTextMessage(text)
72
+ }
73
+
74
+ override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
75
+ webSocket.close(code, reason)
76
+ callbacks.onClosing(code)
77
+ }
78
+
79
+ override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
80
+ callbacks.onClosed(code)
81
+ }
82
+
83
+ override fun onFailure(
84
+ webSocket: WebSocket,
85
+ error: Throwable,
86
+ response: Response?
87
+ ) {
88
+ callbacks.onFailure()
89
+ }
90
+ }
91
+ )
92
+ }
93
+
94
+ override fun send(data: ByteString): Boolean = webSocket?.send(data) == true
95
+ override fun send(text: String): Boolean = webSocket?.send(text) == true
96
+
97
+ override fun close(code: Int, reason: String?): Boolean = webSocket?.close(code, reason) == true
98
+
99
+ override fun cancel() {
100
+ webSocket?.cancel()
101
+ }
102
+ }
@@ -0,0 +1,130 @@
1
+ package com.apollohg.editor
2
+
3
+ import org.json.JSONObject
4
+
5
+ enum class EditorOrderedListNumberingScheme {
6
+ DECIMAL,
7
+ LOWER_ALPHA,
8
+ UPPER_ALPHA,
9
+ LOWER_ROMAN,
10
+ UPPER_ROMAN;
11
+
12
+ companion object {
13
+ fun fromJson(value: String): EditorOrderedListNumberingScheme? = when (value) {
14
+ "decimal" -> DECIMAL
15
+ "lowerAlpha" -> LOWER_ALPHA
16
+ "upperAlpha" -> UPPER_ALPHA
17
+ "lowerRoman" -> LOWER_ROMAN
18
+ "upperRoman" -> UPPER_ROMAN
19
+ else -> null
20
+ }
21
+ }
22
+ }
23
+
24
+ private val DEFAULT_ORDERED_LIST_SCHEMES = listOf(
25
+ EditorOrderedListNumberingScheme.DECIMAL,
26
+ EditorOrderedListNumberingScheme.LOWER_ALPHA,
27
+ EditorOrderedListNumberingScheme.LOWER_ROMAN
28
+ )
29
+
30
+ data class EditorOrderedListMarkerTheme(
31
+ val schemes: List<EditorOrderedListNumberingScheme> = DEFAULT_ORDERED_LIST_SCHEMES,
32
+ val suffix: String = "."
33
+ ) {
34
+ companion object {
35
+ fun fromJson(json: JSONObject?): EditorOrderedListMarkerTheme? {
36
+ json ?: return null
37
+ val parsedSchemes = json.optJSONArray("schemes")?.let { values ->
38
+ buildList {
39
+ for (index in 0 until values.length()) {
40
+ val rawValue = values.opt(index) as? String ?: continue
41
+ EditorOrderedListNumberingScheme.fromJson(rawValue)?.let(::add)
42
+ }
43
+ }
44
+ }.orEmpty()
45
+
46
+ return EditorOrderedListMarkerTheme(
47
+ schemes = parsedSchemes.ifEmpty {
48
+ DEFAULT_ORDERED_LIST_SCHEMES
49
+ },
50
+ suffix = if (json.optString("suffix") == ")") ")" else "."
51
+ )
52
+ }
53
+ }
54
+ }
55
+
56
+ internal object OrderedListMarkerFormatter {
57
+ private const val MAX_INDEX = 4_294_967_295L
58
+
59
+ private val romanTable = listOf(
60
+ 1_000L to "m",
61
+ 900L to "cm",
62
+ 500L to "d",
63
+ 400L to "cd",
64
+ 100L to "c",
65
+ 90L to "xc",
66
+ 50L to "l",
67
+ 40L to "xl",
68
+ 10L to "x",
69
+ 9L to "ix",
70
+ 5L to "v",
71
+ 4L to "iv",
72
+ 1L to "i"
73
+ )
74
+
75
+ fun label(index: Long, nestingDepth: Int, theme: EditorOrderedListMarkerTheme?): String {
76
+ val resolvedTheme = theme ?: EditorOrderedListMarkerTheme()
77
+ val schemes = resolvedTheme.schemes.ifEmpty {
78
+ DEFAULT_ORDERED_LIST_SCHEMES
79
+ }
80
+ val scheme = schemes[nestingDepth.coerceAtLeast(0) % schemes.size]
81
+ val suffix = if (resolvedTheme.suffix == ")") ")" else "."
82
+ return formattedIndex(index, scheme) + suffix
83
+ }
84
+
85
+ private fun formattedIndex(index: Long, scheme: EditorOrderedListNumberingScheme): String {
86
+ if (index !in 0..MAX_INDEX) return index.toString()
87
+
88
+ return when (scheme) {
89
+ EditorOrderedListNumberingScheme.DECIMAL -> index.toString()
90
+
91
+ EditorOrderedListNumberingScheme.LOWER_ALPHA -> alphabeticIndex(index)
92
+ ?: index.toString()
93
+
94
+ EditorOrderedListNumberingScheme.UPPER_ALPHA ->
95
+ alphabeticIndex(index)?.uppercase() ?: index.toString()
96
+
97
+ EditorOrderedListNumberingScheme.LOWER_ROMAN -> romanIndex(index) ?: index.toString()
98
+
99
+ EditorOrderedListNumberingScheme.UPPER_ROMAN ->
100
+ romanIndex(index)?.uppercase() ?: index.toString()
101
+ }
102
+ }
103
+
104
+ private fun alphabeticIndex(index: Long): String? {
105
+ if (index == 0L) return null
106
+
107
+ var value = index
108
+ val result = StringBuilder()
109
+ while (value > 0) {
110
+ val offset = ((value - 1) % 26).toInt()
111
+ result.append(('a'.code + offset).toChar())
112
+ value = (value - 1) / 26
113
+ }
114
+ return result.reverse().toString()
115
+ }
116
+
117
+ private fun romanIndex(index: Long): String? {
118
+ if (index !in 1..3_999) return null
119
+
120
+ var value = index
121
+ return buildString {
122
+ for ((unit, symbol) in romanTable) {
123
+ while (value >= unit) {
124
+ append(symbol)
125
+ value -= unit
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }