@mathers101/react-native-render-rich-text 0.0.0-stage → 0.1.9

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 (358) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +140 -3
  3. package/ReactNativeRenderRichText.podspec +23 -0
  4. package/android/build.gradle +86 -0
  5. package/android/consumer-rules.pro +3 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/cpp/jni-adapter.cpp +191 -0
  8. package/android/src/main/java/com/renderrichtext/EnrichedTiptapText.kt +673 -0
  9. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -0
  10. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextManager.kt +405 -0
  11. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -0
  12. package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -0
  13. package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -0
  14. package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -0
  15. package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -0
  16. package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -0
  17. package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -0
  18. package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -0
  19. package/android/src/main/java/com/renderrichtext/events/FactoidPressEvent.kt +23 -0
  20. package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -0
  21. package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -0
  22. package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -0
  23. package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -0
  24. package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -0
  25. package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -0
  26. package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -0
  27. package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -0
  28. package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -0
  29. package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -0
  30. package/android/src/main/java/com/renderrichtext/parser/TiptapASTNode.kt +69 -0
  31. package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -0
  32. package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -0
  33. package/android/src/main/java/com/renderrichtext/renderer/BlockStyleContext.kt +181 -0
  34. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -0
  35. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -0
  36. package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -0
  37. package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -0
  38. package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -0
  39. package/android/src/main/java/com/renderrichtext/renderer/FactoidRenderer.kt +97 -0
  40. package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -0
  41. package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -0
  42. package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -0
  43. package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -0
  44. package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -0
  45. package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -0
  46. package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -0
  47. package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -0
  48. package/android/src/main/java/com/renderrichtext/renderer/NodeRenderer.kt +207 -0
  49. package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -0
  50. package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -0
  51. package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -0
  52. package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -0
  53. package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -0
  54. package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -0
  55. package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -0
  56. package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -0
  57. package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -0
  58. package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -0
  59. package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -0
  60. package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -0
  61. package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -0
  62. package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -0
  63. package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -0
  64. package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -0
  65. package/android/src/main/java/com/renderrichtext/spans/FactoidBackgroundSpan.kt +265 -0
  66. package/android/src/main/java/com/renderrichtext/spans/FactoidPaddingSpan.kt +258 -0
  67. package/android/src/main/java/com/renderrichtext/spans/FactoidSpan.kt +32 -0
  68. package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -0
  69. package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -0
  70. package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -0
  71. package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -0
  72. package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -0
  73. package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -0
  74. package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -0
  75. package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -0
  76. package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -0
  77. package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -0
  78. package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -0
  79. package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -0
  80. package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -0
  81. package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -0
  82. package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -0
  83. package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -0
  84. package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -0
  85. package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -0
  86. package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -0
  87. package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -0
  88. package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -0
  89. package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -0
  90. package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -0
  91. package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -0
  92. package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -0
  93. package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -0
  94. package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -0
  95. package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -0
  96. package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -0
  97. package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -0
  98. package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -0
  99. package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -0
  100. package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -0
  101. package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -0
  102. package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -0
  103. package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -0
  104. package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -0
  105. package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -0
  106. package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -0
  107. package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -0
  108. package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -0
  109. package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -0
  110. package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -0
  111. package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -0
  112. package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -0
  113. package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -0
  114. package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -0
  115. package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -0
  116. package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -0
  117. package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -0
  118. package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -0
  119. package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -0
  120. package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -0
  121. package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -0
  122. package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -0
  123. package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -0
  124. package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -0
  125. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -0
  126. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -0
  127. package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -0
  128. package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -0
  129. package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -0
  130. package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -0
  131. package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -0
  132. package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -0
  133. package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -0
  134. package/android/src/main/java/com/renderrichtext/utils/common/TiptapViewManagerUtils.kt +242 -0
  135. package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -0
  136. package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -0
  137. package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -0
  138. package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -0
  139. package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -0
  140. package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -0
  141. package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -0
  142. package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -0
  143. package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -0
  144. package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -0
  145. package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -0
  146. package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -0
  147. package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -0
  148. package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -0
  149. package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -0
  150. package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -0
  151. package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -0
  152. package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -0
  153. package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -0
  154. package/android/src/main/java/com/renderrichtext/utils/text/view/LinkEvents.kt +88 -0
  155. package/android/src/main/java/com/renderrichtext/utils/text/view/LinkLongPressMovementMethod.kt +449 -0
  156. package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -0
  157. package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -0
  158. package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -0
  159. package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -0
  160. package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -0
  161. package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -0
  162. package/android/src/main/jni/CMakeLists.txt +52 -0
  163. package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -0
  164. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -0
  165. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -0
  166. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -0
  167. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -0
  168. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -0
  169. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -0
  170. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -0
  171. package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -0
  172. package/cpp/parser/TiptapASTNode.hpp +68 -0
  173. package/cpp/parser/TiptapParser.cpp +233 -0
  174. package/cpp/parser/TiptapParser.hpp +13 -0
  175. package/cpp/vendor/nlohmann/json.hpp +24765 -0
  176. package/ios/EnrichedTiptapText.h +27 -0
  177. package/ios/EnrichedTiptapText.mm +1222 -0
  178. package/ios/attachments/ENRMImageAttachment.h +51 -0
  179. package/ios/attachments/ENRMImageAttachment.m +398 -0
  180. package/ios/attachments/ENRMLinkPillAttachment.h +47 -0
  181. package/ios/attachments/ENRMLinkPillAttachment.m +324 -0
  182. package/ios/attachments/ENRMLinkPillIconCache.h +28 -0
  183. package/ios/attachments/ENRMLinkPillIconCache.m +181 -0
  184. package/ios/attachments/ENRMLinkPillText.h +27 -0
  185. package/ios/attachments/ENRMLinkPillText.m +118 -0
  186. package/ios/attachments/ENRMMathInlineAttachment.h +7 -0
  187. package/ios/attachments/ENRMMathInlineAttachment.m +4 -0
  188. package/ios/attachments/ThematicBreakAttachment.h +15 -0
  189. package/ios/attachments/ThematicBreakAttachment.m +33 -0
  190. package/ios/internals/ENRMViewFreeMeasurement.h +208 -0
  191. package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -0
  192. package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -0
  193. package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -0
  194. package/ios/internals/EnrichedTiptapTextState.h +24 -0
  195. package/ios/internals/MeasurementCache.h +308 -0
  196. package/ios/internals/ShadowMeasurementUtils.h +145 -0
  197. package/ios/parser/ENRMTextLinkAttributes.h +7 -0
  198. package/ios/parser/ENRMTiptapParser.h +33 -0
  199. package/ios/parser/ENRMTiptapParser.mm +73 -0
  200. package/ios/parser/TiptapASTNode.h +57 -0
  201. package/ios/parser/TiptapASTNode.m +52 -0
  202. package/ios/parser/TiptapParserBridge.mm +179 -0
  203. package/ios/renderer/AttributedRenderer.h +23 -0
  204. package/ios/renderer/AttributedRenderer.m +229 -0
  205. package/ios/renderer/BaseRenderer.h +33 -0
  206. package/ios/renderer/BaseRenderer.m +46 -0
  207. package/ios/renderer/BaselineShiftTextAttributes.h +10 -0
  208. package/ios/renderer/BaselineShiftTextAttributes.m +26 -0
  209. package/ios/renderer/BlankLineRenderer.h +4 -0
  210. package/ios/renderer/BlankLineRenderer.m +51 -0
  211. package/ios/renderer/BlockquoteRenderer.h +6 -0
  212. package/ios/renderer/BlockquoteRenderer.m +258 -0
  213. package/ios/renderer/CodeBlockRenderer.h +9 -0
  214. package/ios/renderer/CodeBlockRenderer.m +99 -0
  215. package/ios/renderer/CodeRenderer.h +9 -0
  216. package/ios/renderer/CodeRenderer.m +69 -0
  217. package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -0
  218. package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -0
  219. package/ios/renderer/EmphasisRenderer.h +5 -0
  220. package/ios/renderer/EmphasisRenderer.m +100 -0
  221. package/ios/renderer/FactoidRenderer.h +9 -0
  222. package/ios/renderer/FactoidRenderer.m +130 -0
  223. package/ios/renderer/HeadingRenderer.h +6 -0
  224. package/ios/renderer/HeadingRenderer.m +103 -0
  225. package/ios/renderer/HighlightRenderer.h +7 -0
  226. package/ios/renderer/HighlightRenderer.m +33 -0
  227. package/ios/renderer/LinkRenderer.h +6 -0
  228. package/ios/renderer/LinkRenderer.m +158 -0
  229. package/ios/renderer/ListItemRenderer.h +24 -0
  230. package/ios/renderer/ListItemRenderer.m +283 -0
  231. package/ios/renderer/ListRenderer.h +13 -0
  232. package/ios/renderer/ListRenderer.m +126 -0
  233. package/ios/renderer/MentionRenderer.h +9 -0
  234. package/ios/renderer/MentionRenderer.m +96 -0
  235. package/ios/renderer/NodeRenderer.h +8 -0
  236. package/ios/renderer/ParagraphRenderer.h +6 -0
  237. package/ios/renderer/ParagraphRenderer.m +85 -0
  238. package/ios/renderer/RenderContext.h +145 -0
  239. package/ios/renderer/RenderContext.m +403 -0
  240. package/ios/renderer/RendererFactory.h +12 -0
  241. package/ios/renderer/RendererFactory.m +158 -0
  242. package/ios/renderer/StrikethroughRenderer.h +5 -0
  243. package/ios/renderer/StrikethroughRenderer.m +30 -0
  244. package/ios/renderer/StrongRenderer.h +5 -0
  245. package/ios/renderer/StrongRenderer.m +88 -0
  246. package/ios/renderer/TextRenderer.h +6 -0
  247. package/ios/renderer/TextRenderer.m +18 -0
  248. package/ios/renderer/ThematicBreakRenderer.h +4 -0
  249. package/ios/renderer/ThematicBreakRenderer.m +42 -0
  250. package/ios/renderer/UnderlineRenderer.h +4 -0
  251. package/ios/renderer/UnderlineRenderer.m +41 -0
  252. package/ios/styles/ENRMFontSlot.h +12 -0
  253. package/ios/styles/ENRMFontSlot.m +24 -0
  254. package/ios/styles/StyleConfig.h +488 -0
  255. package/ios/styles/StyleConfig.mm +2820 -0
  256. package/ios/utils/AccessibilityInfo.h +35 -0
  257. package/ios/utils/AccessibilityInfo.m +24 -0
  258. package/ios/utils/BlockquoteBorder.h +26 -0
  259. package/ios/utils/BlockquoteBorder.m +294 -0
  260. package/ios/utils/CodeBackground.h +19 -0
  261. package/ios/utils/CodeBackground.m +197 -0
  262. package/ios/utils/CodeBlockBackground.h +17 -0
  263. package/ios/utils/CodeBlockBackground.m +103 -0
  264. package/ios/utils/ContextMenuUtils.h +76 -0
  265. package/ios/utils/ContextMenuUtils.mm +75 -0
  266. package/ios/utils/ENRMAccessibilityLabels.h +40 -0
  267. package/ios/utils/ENRMAccessibilityLabels.m +5 -0
  268. package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -0
  269. package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -0
  270. package/ios/utils/ENRMAtomicSize.h +65 -0
  271. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  272. package/ios/utils/ENRMCodeBlockContent.mm +89 -0
  273. package/ios/utils/ENRMFeatureFlags.h +25 -0
  274. package/ios/utils/ENRMImageDownloader.h +30 -0
  275. package/ios/utils/ENRMImageDownloader.m +168 -0
  276. package/ios/utils/ENRMLatexErrorCoordinator.h +27 -0
  277. package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -0
  278. package/ios/utils/ENRMLatexErrorReporting.h +13 -0
  279. package/ios/utils/ENRMLinkContextMenus.h +93 -0
  280. package/ios/utils/ENRMLinkContextMenus.m +178 -0
  281. package/ios/utils/ENRMLinkRegexConfig.h +30 -0
  282. package/ios/utils/ENRMLinkRegexConfig.mm +104 -0
  283. package/ios/utils/ENRMLinkRegexProps.h +23 -0
  284. package/ios/utils/ENRMLocalImageLoader.h +35 -0
  285. package/ios/utils/ENRMLocalImageLoader.m +111 -0
  286. package/ios/utils/ENRMMenuAction.h +27 -0
  287. package/ios/utils/ENRMMenuAction.m +33 -0
  288. package/ios/utils/ENRMSpoilerOverlayManager.h +15 -0
  289. package/ios/utils/ENRMSpoilerOverlayManager.m +19 -0
  290. package/ios/utils/ENRMSpoilerTapUtils.h +6 -0
  291. package/ios/utils/ENRMSpoilerTapUtils.m +11 -0
  292. package/ios/utils/ENRMTailFadeInAnimator.h +16 -0
  293. package/ios/utils/ENRMTailFadeInAnimator.m +161 -0
  294. package/ios/utils/ENRMTextHitTest.h +23 -0
  295. package/ios/utils/ENRMTextHitTest.m +20 -0
  296. package/ios/utils/ENRMTextInteractionUtils.h +20 -0
  297. package/ios/utils/ENRMTextInteractionUtils.m +15 -0
  298. package/ios/utils/ENRMTextRenderer.h +38 -0
  299. package/ios/utils/ENRMTextRenderer.m +54 -0
  300. package/ios/utils/ENRMTextViewSetup.h +132 -0
  301. package/ios/utils/ENRMUIKit.h +429 -0
  302. package/ios/utils/EditMenuUtils.h +105 -0
  303. package/ios/utils/EditMenuUtils.m +143 -0
  304. package/ios/utils/FactoidBackground.h +20 -0
  305. package/ios/utils/FactoidBackground.m +161 -0
  306. package/ios/utils/FontScaleObserver.h +10 -0
  307. package/ios/utils/FontScaleObserver.m +55 -0
  308. package/ios/utils/FontUtils.h +31 -0
  309. package/ios/utils/FontUtils.m +63 -0
  310. package/ios/utils/HTMLGenerator.h +25 -0
  311. package/ios/utils/HTMLGenerator.m +1041 -0
  312. package/ios/utils/HeightUpdateUtils.h +25 -0
  313. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  314. package/ios/utils/LastElementUtils.h +97 -0
  315. package/ios/utils/LinkContextMenuUtils.h +55 -0
  316. package/ios/utils/LinkPillContentUtils.h +46 -0
  317. package/ios/utils/LinkTapUtils.h +56 -0
  318. package/ios/utils/LinkTapUtils.m +139 -0
  319. package/ios/utils/ListMarkerDrawer.h +15 -0
  320. package/ios/utils/ListMarkerDrawer.m +239 -0
  321. package/ios/utils/MentionBackground.h +26 -0
  322. package/ios/utils/MentionBackground.m +86 -0
  323. package/ios/utils/ParagraphStyleUtils.h +87 -0
  324. package/ios/utils/ParagraphStyleUtils.m +484 -0
  325. package/ios/utils/PasteboardUtils.h +48 -0
  326. package/ios/utils/PasteboardUtils.m +166 -0
  327. package/ios/utils/RTFExportUtils.h +24 -0
  328. package/ios/utils/RTFExportUtils.m +299 -0
  329. package/ios/utils/RuntimeKeys.h +44 -0
  330. package/ios/utils/RuntimeKeys.m +13 -0
  331. package/ios/utils/SelectionColorUtils.h +14 -0
  332. package/ios/utils/StylePropsUtils.h +1340 -0
  333. package/ios/utils/TaskListTapUtils.h +6 -0
  334. package/ios/utils/TaskListTapUtils.m +14 -0
  335. package/ios/utils/TextViewLayoutManager.h +14 -0
  336. package/ios/utils/TextViewLayoutManager.mm +198 -0
  337. package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -0
  338. package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -0
  339. package/ios/utils/TiptapExtractor.h +17 -0
  340. package/ios/utils/TiptapExtractor.m +367 -0
  341. package/ios/views/ENRMTiptapTextView.h +25 -0
  342. package/ios/views/ENRMTiptapTextView.m +247 -0
  343. package/package.json +70 -6
  344. package/react-native.config.js +10 -0
  345. package/src/EnrichedTiptapTextNativeComponent.ts +739 -0
  346. package/src/RichText.tsx +164 -0
  347. package/src/admonitionDefaults.ts +58 -0
  348. package/src/darkModeTextStyle.ts +99 -0
  349. package/src/headingDefaults.ts +21 -0
  350. package/src/index.tsx +4 -0
  351. package/src/linkVariantUtils.ts +120 -0
  352. package/src/normalizeTiptapStyle.ts +397 -0
  353. package/src/rn-globals.d.ts +1 -0
  354. package/src/styleUtils.ts +107 -0
  355. package/src/types/TiptapStyle.ts +532 -0
  356. package/src/types/TiptapStyleInternal.ts +299 -0
  357. package/src/types/linkPill.ts +9 -0
  358. package/src/utils/isDev.ts +4 -0
@@ -0,0 +1,158 @@
1
+ #import "RendererFactory.h"
2
+ #import "BlankLineRenderer.h"
3
+ #import "BlockquoteRenderer.h"
4
+ #import "CodeBlockRenderer.h"
5
+ #import "CodeRenderer.h"
6
+ #import "EmphasisRenderer.h"
7
+ #import "FactoidRenderer.h"
8
+ #import "MentionRenderer.h"
9
+
10
+ #import "ENRMFeatureFlags.h"
11
+
12
+ #import "HeadingRenderer.h"
13
+ #import "HighlightRenderer.h"
14
+ #import "LinkRenderer.h"
15
+ #import "ListItemRenderer.h"
16
+ #import "ListRenderer.h"
17
+ #import "TiptapASTNode.h"
18
+ #import "ParagraphRenderer.h"
19
+ #import "RenderContext.h"
20
+ #import "StrikethroughRenderer.h"
21
+ #import "StrongRenderer.h"
22
+ #import "StyleConfig.h"
23
+ #import "TextRenderer.h"
24
+ #import "ThematicBreakRenderer.h"
25
+ #import "UnderlineRenderer.h"
26
+
27
+ @implementation RendererFactory {
28
+ StyleConfig *_config;
29
+ NSMutableDictionary<NSNumber *, id<NodeRenderer>> *_cache;
30
+ }
31
+
32
+ /**
33
+ * Initializes the factory with a shared style configuration.
34
+ * Uses a mutable dictionary to cache renderer instances as they are needed.
35
+ */
36
+ - (instancetype)initWithConfig:(StyleConfig *)config
37
+ {
38
+ self = [super init];
39
+ if (self) {
40
+ _config = config;
41
+ _cache = [NSMutableDictionary new];
42
+ }
43
+ return self;
44
+ }
45
+
46
+ /**
47
+ * Returns a shared renderer instance for a specific node type.
48
+ * Implements lazy initialization to avoid allocating unused renderers.
49
+ */
50
+ - (id<NodeRenderer>)rendererForNodeType:(TiptapNodeType)type
51
+ {
52
+ id<NodeRenderer> cached = _cache[@(type)];
53
+ if (cached) {
54
+ return cached;
55
+ }
56
+
57
+ id<NodeRenderer> renderer = [self createRendererForType:type];
58
+ if (renderer) {
59
+ _cache[@(type)] = renderer;
60
+ }
61
+ return renderer;
62
+ }
63
+
64
+ /**
65
+ * Internal factory method to instantiate specialized renderers.
66
+ */
67
+ - (id<NodeRenderer>)createRendererForType:(TiptapNodeType)type
68
+ {
69
+ switch (type) {
70
+ case TiptapNodeTypeText:
71
+ return [TextRenderer new];
72
+ case TiptapNodeTypeStrong:
73
+ return [[StrongRenderer alloc] initWithRendererFactory:self config:_config];
74
+ case TiptapNodeTypeEmphasis:
75
+ return [[EmphasisRenderer alloc] initWithRendererFactory:self config:_config];
76
+ case TiptapNodeTypeStrikethrough:
77
+ return [[StrikethroughRenderer alloc] initWithRendererFactory:self config:_config];
78
+ case TiptapNodeTypeUnderline:
79
+ return [[UnderlineRenderer alloc] initWithRendererFactory:self config:_config];
80
+ case TiptapNodeTypeHighlight:
81
+ return [[HighlightRenderer alloc] initWithRendererFactory:self config:_config];
82
+ case TiptapNodeTypeParagraph:
83
+ return [[ParagraphRenderer alloc] initWithRendererFactory:self config:_config];
84
+ case TiptapNodeTypeLink:
85
+ return [[LinkRenderer alloc] initWithRendererFactory:self config:_config];
86
+ case TiptapNodeTypeHeading:
87
+ return [[HeadingRenderer alloc] initWithRendererFactory:self config:_config];
88
+ case TiptapNodeTypeCode:
89
+ return [[CodeRenderer alloc] initWithRendererFactory:self config:_config];
90
+ case TiptapNodeTypeImage:
91
+ case TiptapNodeTypeSuperscript:
92
+ case TiptapNodeTypeSubscript:
93
+ case TiptapNodeTypeSpoiler:
94
+ case TiptapNodeTypeLatexMathInline:
95
+ case TiptapNodeTypeLatexMathDisplay:
96
+ case TiptapNodeTypeTable:
97
+ case TiptapNodeTypeTableHead:
98
+ case TiptapNodeTypeTableBody:
99
+ case TiptapNodeTypeTableRow:
100
+ case TiptapNodeTypeTableHeaderCell:
101
+ case TiptapNodeTypeTableCell:
102
+ case TiptapNodeTypeVideo:
103
+ return nil;
104
+ case TiptapNodeTypeBlockquote:
105
+ // A list-nested admonition falls back to the inline blockquote renderer
106
+ // (no themed header); top-level admonitions use the segment container path.
107
+ case TiptapNodeTypeAdmonition:
108
+ return [[BlockquoteRenderer alloc] initWithRendererFactory:self config:_config];
109
+ case TiptapNodeTypeListItem:
110
+ return [[ListItemRenderer alloc] initWithRendererFactory:self config:_config];
111
+ case TiptapNodeTypeUnorderedList:
112
+ return [[ListRenderer alloc] initWithRendererFactory:self config:_config isOrdered:NO];
113
+ case TiptapNodeTypeOrderedList:
114
+ return [[ListRenderer alloc] initWithRendererFactory:self config:_config isOrdered:YES];
115
+ case TiptapNodeTypeCodeBlock:
116
+ return [[CodeBlockRenderer alloc] initWithRendererFactory:self config:_config];
117
+ case TiptapNodeTypeThematicBreak:
118
+ return [[ThematicBreakRenderer alloc] initWithRendererFactory:self config:_config];
119
+ case TiptapNodeTypeBlankLine:
120
+ return [[BlankLineRenderer alloc] initWithRendererFactory:self config:_config];
121
+ case TiptapNodeTypeMention:
122
+ return [[MentionRenderer alloc] initWithRendererFactory:self config:_config];
123
+ default:
124
+ return nil;
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Helper method for container renderers to process their children.
130
+ * Leverages the factory to find the appropriate renderer for each child node.
131
+ */
132
+ - (void)renderChildrenOfNode:(TiptapASTNode *)node
133
+ into:(NSMutableAttributedString *)output
134
+ context:(RenderContext *)context
135
+ {
136
+ for (TiptapASTNode *child in node.children) {
137
+ if (child.type == TiptapNodeTypeLineBreak) {
138
+ NSAttributedString *lineBreak = [[NSAttributedString alloc] initWithString:@"\u2028"
139
+ attributes:[context getTextAttributes]];
140
+ [output appendAttributedString:lineBreak];
141
+ continue;
142
+ }
143
+ if (child.type == TiptapNodeTypeSoftBreak) {
144
+ NSAttributedString *softBreak = [[NSAttributedString alloc] initWithString:@" "
145
+ attributes:[context getTextAttributes]];
146
+ [output appendAttributedString:softBreak];
147
+ continue;
148
+ }
149
+ id<NodeRenderer> renderer = [self rendererForNodeType:child.type];
150
+ if (renderer) {
151
+ [renderer renderNode:child into:output context:context];
152
+ } else if (child.children.count > 0) {
153
+ [self renderChildrenOfNode:child into:output context:context];
154
+ }
155
+ }
156
+ }
157
+
158
+ @end
@@ -0,0 +1,5 @@
1
+ #pragma once
2
+ #import "BaseRenderer.h"
3
+
4
+ @interface StrikethroughRenderer : BaseRenderer
5
+ @end
@@ -0,0 +1,30 @@
1
+ #import "StrikethroughRenderer.h"
2
+ #import "TiptapASTNode.h"
3
+ #import "RenderContext.h"
4
+ #import "RendererFactory.h"
5
+ #import "StyleConfig.h"
6
+
7
+ @implementation StrikethroughRenderer
8
+
9
+ #pragma mark - Rendering
10
+
11
+ - (void)renderNodeContent:(TiptapASTNode *)node
12
+ into:(NSMutableAttributedString *)output
13
+ context:(RenderContext *)context
14
+ {
15
+ NSUInteger start = output.length;
16
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
17
+
18
+ NSRange range = NSMakeRange(start, output.length - start);
19
+ if (range.length == 0)
20
+ return;
21
+
22
+ // Apply strikethrough style
23
+ [output addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:range];
24
+
25
+ // Apply strikethrough line color (not text color)
26
+ RCTUIColor *strikethroughColor = [_config strikethroughColor];
27
+ [output addAttribute:NSStrikethroughColorAttributeName value:strikethroughColor range:range];
28
+ }
29
+
30
+ @end
@@ -0,0 +1,5 @@
1
+ #pragma once
2
+ #import "BaseRenderer.h"
3
+
4
+ @interface StrongRenderer : BaseRenderer
5
+ @end
@@ -0,0 +1,88 @@
1
+ #import "StrongRenderer.h"
2
+ #import "FontUtils.h"
3
+ #import "TiptapASTNode.h"
4
+ #import "RenderContext.h"
5
+ #import "RendererFactory.h"
6
+ #import "StyleConfig.h"
7
+ #import <React/RCTFont.h>
8
+
9
+ @implementation StrongRenderer
10
+
11
+ #pragma mark - Rendering
12
+
13
+ - (void)renderNodeContent:(TiptapASTNode *)node
14
+ into:(NSMutableAttributedString *)output
15
+ context:(RenderContext *)context
16
+ {
17
+ NSUInteger start = output.length;
18
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
19
+
20
+ NSRange range = NSMakeRange(start, output.length - start);
21
+ if (range.length == 0)
22
+ return;
23
+
24
+ BlockStyle *blockStyle = [context getBlockStyle];
25
+ RCTUIColor *configStrongColor = [_config strongColor];
26
+ RCTUIColor *calculatedColor =
27
+ configStrongColor ? [RenderContext calculateStrongColor:configStrongColor blockColor:blockStyle.color] : nil;
28
+ NSString *strongFontFamily = [_config strongFontFamily];
29
+ NSString *strongFontWeight = [_config strongFontWeight];
30
+ BOOL useNormalWeight = [strongFontWeight isEqualToString:@"normal"];
31
+
32
+ [output enumerateAttributesInRange:range
33
+ options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
34
+ usingBlock:^(NSDictionary<NSAttributedStringKey, id> *attrs, NSRange subrange, BOOL *stop) {
35
+ // 1. Resolve Font
36
+ UIFont *currentFont =
37
+ attrs[NSFontAttributeName] ?: cachedFontFromBlockStyle(blockStyle, context);
38
+
39
+ UIFont *resolvedFont = currentFont;
40
+
41
+ if (strongFontFamily.length > 0) {
42
+ NSString *weight = useNormalWeight ? nil : @"bold";
43
+ resolvedFont = [RCTFont updateFont:currentFont
44
+ withFamily:strongFontFamily
45
+ size:nil
46
+ weight:weight
47
+ style:nil
48
+ variant:nil
49
+ scaleMultiplier:1.0];
50
+ } else if (!([currentFont.fontDescriptor symbolicTraits] & UIFontDescriptorTraitBold)) {
51
+ resolvedFont = [self ensureFontIsBold:currentFont];
52
+ }
53
+
54
+ if (resolvedFont && ![resolvedFont isEqual:currentFont]) {
55
+ [output addAttribute:NSFontAttributeName value:resolvedFont range:subrange];
56
+ }
57
+
58
+ // 2. Resolve Color
59
+ // Only apply if we have a color and the current segment doesn't explicitly forbid overrides
60
+ if (calculatedColor && ![RenderContext shouldPreserveColors:attrs]) {
61
+ // Optimization: Check if this color is already set to avoid redundant attribute changes
62
+ if (![attrs[NSForegroundColorAttributeName] isEqual:calculatedColor]) {
63
+ [output addAttribute:NSForegroundColorAttributeName
64
+ value:calculatedColor
65
+ range:subrange];
66
+ }
67
+ }
68
+ }];
69
+ }
70
+
71
+ #pragma mark - Helper Methods
72
+
73
+ - (UIFont *)ensureFontIsBold:(UIFont *)font
74
+ {
75
+ if (!font)
76
+ return nil;
77
+
78
+ UIFontDescriptor *descriptor = font.fontDescriptor;
79
+ UIFontDescriptorSymbolicTraits traits = descriptor.symbolicTraits;
80
+
81
+ // Create new descriptor combining current traits with Bold
82
+ UIFontDescriptor *boldDescriptor = [descriptor fontDescriptorWithSymbolicTraits:(traits | UIFontDescriptorTraitBold)];
83
+
84
+ // Fallback to original font if bold version is unavailable
85
+ return boldDescriptor ? [UIFont fontWithDescriptor:boldDescriptor size:0] : font;
86
+ }
87
+
88
+ @end
@@ -0,0 +1,6 @@
1
+ #import "BaseRenderer.h"
2
+ #import "TiptapASTNode.h"
3
+ #import "RenderContext.h"
4
+
5
+ @interface TextRenderer : BaseRenderer
6
+ @end
@@ -0,0 +1,18 @@
1
+ #import "TextRenderer.h"
2
+ #import "RenderContext.h"
3
+
4
+ @implementation TextRenderer
5
+
6
+ - (void)renderNodeContent:(TiptapASTNode *)node
7
+ into:(NSMutableAttributedString *)output
8
+ context:(RenderContext *)context
9
+ {
10
+ if (!node.content)
11
+ return;
12
+
13
+ NSAttributedString *text = [[NSAttributedString alloc] initWithString:node.content
14
+ attributes:[context getTextAttributes]];
15
+ [output appendAttributedString:text];
16
+ }
17
+
18
+ @end
@@ -0,0 +1,4 @@
1
+ #import "BaseRenderer.h"
2
+
3
+ @interface ThematicBreakRenderer : BaseRenderer
4
+ @end
@@ -0,0 +1,42 @@
1
+ #import "ThematicBreakRenderer.h"
2
+ #import "TiptapASTNode.h"
3
+ #import "StyleConfig.h"
4
+ #import "ThematicBreakAttachment.h"
5
+
6
+ #pragma mark - Renderer Implementation
7
+
8
+ @implementation ThematicBreakRenderer
9
+
10
+ - (void)renderNodeContent:(TiptapASTNode *)node
11
+ into:(NSMutableAttributedString *)output
12
+ context:(RenderContext *)context
13
+ {
14
+ [self ensureStartingNewline:output];
15
+
16
+ ThematicBreakAttachment *attachment = [[ThematicBreakAttachment alloc] init];
17
+ attachment.lineColor = _config.thematicBreakColor ?: [RCTUIColor separatorColor];
18
+ attachment.lineHeight = _config.thematicBreakHeight > 0 ? _config.thematicBreakHeight : 1.0;
19
+ attachment.marginTop = _config.thematicBreakMarginTop;
20
+ attachment.marginBottom = _config.thematicBreakMarginBottom;
21
+
22
+ NSDictionary *attributes = @{
23
+ NSAttachmentAttributeName : attachment,
24
+ NSParagraphStyleAttributeName : [NSParagraphStyle defaultParagraphStyle]
25
+ };
26
+
27
+ NSAttributedString *breakString = [[NSAttributedString alloc] initWithString:@"\uFFFC" attributes:attributes];
28
+
29
+ [output appendAttributedString:breakString];
30
+ [output appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
31
+ }
32
+
33
+ #pragma mark - Private Utilities
34
+
35
+ - (void)ensureStartingNewline:(NSMutableAttributedString *)output
36
+ {
37
+ if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
38
+ [output appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
39
+ }
40
+ }
41
+
42
+ @end
@@ -0,0 +1,4 @@
1
+ #import "BaseRenderer.h"
2
+
3
+ @interface UnderlineRenderer : BaseRenderer
4
+ @end
@@ -0,0 +1,41 @@
1
+ #import "UnderlineRenderer.h"
2
+ #import "ENRMTextLinkAttributes.h"
3
+ #import "TiptapASTNode.h"
4
+ #import "RenderContext.h"
5
+ #import "RendererFactory.h"
6
+ #import "StyleConfig.h"
7
+
8
+ @implementation UnderlineRenderer
9
+
10
+ #pragma mark - Rendering
11
+
12
+ - (void)renderNodeContent:(TiptapASTNode *)node
13
+ into:(NSMutableAttributedString *)output
14
+ context:(RenderContext *)context
15
+ {
16
+ NSUInteger start = output.length;
17
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
18
+
19
+ NSRange range = NSMakeRange(start, output.length - start);
20
+ if (range.length == 0)
21
+ return;
22
+
23
+ [output addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:range];
24
+ // Recognized links inside this span were styled before it closed; record the underline for them too.
25
+ [output enumerateAttribute:ENRMRecognizedLinkAttributeName
26
+ inRange:range
27
+ options:0
28
+ usingBlock:^(id value, NSRange linkRange, BOOL *stop) {
29
+ if ([value boolValue]) {
30
+ [output addAttribute:ENRMRecognizedLinkOriginalUnderlineAttributeName
31
+ value:@(NSUnderlineStyleSingle)
32
+ range:linkRange];
33
+ }
34
+ }];
35
+
36
+ RCTUIColor *underlineColor = [_config underlineColor];
37
+
38
+ [output addAttribute:NSUnderlineColorAttributeName value:underlineColor range:range];
39
+ }
40
+
41
+ @end
@@ -0,0 +1,12 @@
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+
4
+ NS_ASSUME_NONNULL_BEGIN
5
+
6
+ @interface ENRMFontSlot : NSObject <NSCopying>
7
+ @property (nonatomic) BOOL needsRecreation;
8
+ @property (nonatomic, strong, nullable) UIFont *cachedFont;
9
+ - (void)invalidate;
10
+ @end
11
+
12
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,24 @@
1
+ #import "ENRMFontSlot.h"
2
+
3
+ @implementation ENRMFontSlot
4
+
5
+ - (instancetype)init
6
+ {
7
+ if (self = [super init]) {
8
+ _needsRecreation = YES;
9
+ }
10
+ return self;
11
+ }
12
+
13
+ - (void)invalidate
14
+ {
15
+ _needsRecreation = YES;
16
+ _cachedFont = nil;
17
+ }
18
+
19
+ - (id)copyWithZone:(NSZone *)zone
20
+ {
21
+ return [[[self class] allocWithZone:zone] init];
22
+ }
23
+
24
+ @end