react-native-enriched-markdown 0.1.0 → 0.1.1

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 (211) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +479 -0
  3. package/ReactNativeEnrichedMarkdown.podspec +27 -0
  4. package/android/build.gradle +101 -0
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +39 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +21 -0
  7. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.cpp +22 -0
  8. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.h +24 -0
  9. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +24 -0
  10. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +25 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +57 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1164 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ShadowNodes.cpp +17 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ShadowNodes.h +32 -0
  15. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/States.cpp +16 -0
  16. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/States.h +20 -0
  17. package/android/gradle.properties +5 -0
  18. package/android/src/main/AndroidManifest.xml +2 -0
  19. package/android/src/main/baseline-prof.txt +65 -0
  20. package/android/src/main/cpp/jni-adapter.cpp +203 -0
  21. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +153 -0
  22. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +30 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +119 -0
  24. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextPackage.kt +17 -0
  25. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +165 -0
  26. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkPressEvent.kt +23 -0
  27. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +29 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +48 -0
  29. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +166 -0
  30. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +89 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +105 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeRenderer.kt +35 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/DocumentRenderer.kt +15 -0
  34. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/EmphasisRenderer.kt +26 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +54 -0
  36. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ImageRenderer.kt +52 -0
  37. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LineBreakRenderer.kt +15 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +28 -0
  39. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +105 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +58 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +69 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +99 -0
  43. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ParagraphRenderer.kt +66 -0
  44. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/Renderer.kt +95 -0
  45. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +85 -0
  46. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrongRenderer.kt +26 -0
  47. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/TextRenderer.kt +29 -0
  48. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ThematicBreakRenderer.kt +44 -0
  49. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +136 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +135 -0
  51. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +180 -0
  52. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +196 -0
  53. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +27 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +34 -0
  55. package/android/src/main/java/com/swmansion/enriched/markdown/spans/HeadingSpan.kt +38 -0
  56. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +320 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LineHeightSpan.kt +36 -0
  58. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +37 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/spans/MarginBottomSpan.kt +76 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +87 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +37 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TextSpan.kt +26 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ThematicBreakSpan.kt +69 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +69 -0
  65. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BaseBlockStyle.kt +10 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +48 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +51 -0
  68. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeStyle.kt +21 -0
  69. package/android/src/main/java/com/swmansion/enriched/markdown/styles/EmphasisStyle.kt +17 -0
  70. package/android/src/main/java/com/swmansion/enriched/markdown/styles/HeadingStyle.kt +29 -0
  71. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +21 -0
  72. package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineImageStyle.kt +17 -0
  73. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +19 -0
  74. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +54 -0
  75. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ParagraphStyle.kt +29 -0
  76. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrongStyle.kt +17 -0
  77. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +180 -0
  78. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleParser.kt +75 -0
  79. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ThematicBreakStyle.kt +23 -0
  80. package/android/src/main/java/com/swmansion/enriched/markdown/utils/AsyncDrawable.kt +91 -0
  81. package/android/src/main/java/com/swmansion/enriched/markdown/utils/HTMLGenerator.kt +809 -0
  82. package/android/src/main/java/com/swmansion/enriched/markdown/utils/MarkdownExtractor.kt +365 -0
  83. package/android/src/main/java/com/swmansion/enriched/markdown/utils/SelectionActionMode.kt +139 -0
  84. package/android/src/main/java/com/swmansion/enriched/markdown/utils/Utils.kt +181 -0
  85. package/android/src/main/jni/CMakeLists.txt +82 -0
  86. package/android/src/main/jni/EnrichedMarkdownTextSpec.cpp +21 -0
  87. package/android/src/main/jni/EnrichedMarkdownTextSpec.h +25 -0
  88. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextComponentDescriptor.h +29 -0
  89. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextMeasurementManager.cpp +45 -0
  90. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextMeasurementManager.h +21 -0
  91. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +33 -0
  92. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +49 -0
  93. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
  94. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +25 -0
  95. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +19 -0
  96. package/cpp/md4c/md4c.c +6492 -0
  97. package/cpp/md4c/md4c.h +402 -0
  98. package/cpp/parser/MD4CParser.cpp +314 -0
  99. package/cpp/parser/MD4CParser.hpp +23 -0
  100. package/cpp/parser/MarkdownASTNode.hpp +49 -0
  101. package/ios/EnrichedMarkdownText.h +18 -0
  102. package/ios/EnrichedMarkdownText.mm +1074 -0
  103. package/ios/attachments/ImageAttachment.h +23 -0
  104. package/ios/attachments/ImageAttachment.m +185 -0
  105. package/ios/attachments/ThematicBreakAttachment.h +15 -0
  106. package/ios/attachments/ThematicBreakAttachment.m +33 -0
  107. package/ios/generated/EnrichedMarkdownTextSpec/ComponentDescriptors.cpp +22 -0
  108. package/ios/generated/EnrichedMarkdownTextSpec/ComponentDescriptors.h +24 -0
  109. package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.cpp +24 -0
  110. package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.h +25 -0
  111. package/ios/generated/EnrichedMarkdownTextSpec/Props.cpp +57 -0
  112. package/ios/generated/EnrichedMarkdownTextSpec/Props.h +1164 -0
  113. package/ios/generated/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +20 -0
  114. package/ios/generated/EnrichedMarkdownTextSpec/ShadowNodes.cpp +17 -0
  115. package/ios/generated/EnrichedMarkdownTextSpec/ShadowNodes.h +32 -0
  116. package/ios/generated/EnrichedMarkdownTextSpec/States.cpp +16 -0
  117. package/ios/generated/EnrichedMarkdownTextSpec/States.h +20 -0
  118. package/ios/internals/EnrichedMarkdownTextComponentDescriptor.h +19 -0
  119. package/ios/internals/EnrichedMarkdownTextShadowNode.h +43 -0
  120. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +85 -0
  121. package/ios/internals/EnrichedMarkdownTextState.h +24 -0
  122. package/ios/parser/MarkdownASTNode.h +33 -0
  123. package/ios/parser/MarkdownASTNode.m +32 -0
  124. package/ios/parser/MarkdownParser.h +8 -0
  125. package/ios/parser/MarkdownParser.mm +13 -0
  126. package/ios/parser/MarkdownParserBridge.mm +110 -0
  127. package/ios/renderer/AttributedRenderer.h +9 -0
  128. package/ios/renderer/AttributedRenderer.m +119 -0
  129. package/ios/renderer/BlockquoteRenderer.h +7 -0
  130. package/ios/renderer/BlockquoteRenderer.m +159 -0
  131. package/ios/renderer/CodeBlockRenderer.h +10 -0
  132. package/ios/renderer/CodeBlockRenderer.m +89 -0
  133. package/ios/renderer/CodeRenderer.h +10 -0
  134. package/ios/renderer/CodeRenderer.m +60 -0
  135. package/ios/renderer/EmphasisRenderer.h +6 -0
  136. package/ios/renderer/EmphasisRenderer.m +96 -0
  137. package/ios/renderer/HeadingRenderer.h +7 -0
  138. package/ios/renderer/HeadingRenderer.m +98 -0
  139. package/ios/renderer/ImageRenderer.h +12 -0
  140. package/ios/renderer/ImageRenderer.m +62 -0
  141. package/ios/renderer/LinkRenderer.h +7 -0
  142. package/ios/renderer/LinkRenderer.m +69 -0
  143. package/ios/renderer/ListItemRenderer.h +16 -0
  144. package/ios/renderer/ListItemRenderer.m +91 -0
  145. package/ios/renderer/ListRenderer.h +13 -0
  146. package/ios/renderer/ListRenderer.m +67 -0
  147. package/ios/renderer/NodeRenderer.h +8 -0
  148. package/ios/renderer/ParagraphRenderer.h +7 -0
  149. package/ios/renderer/ParagraphRenderer.m +69 -0
  150. package/ios/renderer/RenderContext.h +88 -0
  151. package/ios/renderer/RenderContext.m +248 -0
  152. package/ios/renderer/RendererFactory.h +12 -0
  153. package/ios/renderer/RendererFactory.m +110 -0
  154. package/ios/renderer/StrongRenderer.h +6 -0
  155. package/ios/renderer/StrongRenderer.m +83 -0
  156. package/ios/renderer/TextRenderer.h +6 -0
  157. package/ios/renderer/TextRenderer.m +16 -0
  158. package/ios/renderer/ThematicBreakRenderer.h +5 -0
  159. package/ios/renderer/ThematicBreakRenderer.m +53 -0
  160. package/ios/styles/StyleConfig.h +228 -0
  161. package/ios/styles/StyleConfig.mm +1467 -0
  162. package/ios/utils/BlockquoteBorder.h +20 -0
  163. package/ios/utils/BlockquoteBorder.m +92 -0
  164. package/ios/utils/CodeBackground.h +19 -0
  165. package/ios/utils/CodeBackground.m +191 -0
  166. package/ios/utils/CodeBlockBackground.h +17 -0
  167. package/ios/utils/CodeBlockBackground.m +87 -0
  168. package/ios/utils/EditMenuUtils.h +22 -0
  169. package/ios/utils/EditMenuUtils.m +118 -0
  170. package/ios/utils/FontUtils.h +20 -0
  171. package/ios/utils/FontUtils.m +13 -0
  172. package/ios/utils/HTMLGenerator.h +20 -0
  173. package/ios/utils/HTMLGenerator.m +779 -0
  174. package/ios/utils/LastElementUtils.h +53 -0
  175. package/ios/utils/ListMarkerDrawer.h +15 -0
  176. package/ios/utils/ListMarkerDrawer.m +127 -0
  177. package/ios/utils/MarkdownExtractor.h +17 -0
  178. package/ios/utils/MarkdownExtractor.m +295 -0
  179. package/ios/utils/ParagraphStyleUtils.h +13 -0
  180. package/ios/utils/ParagraphStyleUtils.m +56 -0
  181. package/ios/utils/PasteboardUtils.h +36 -0
  182. package/ios/utils/PasteboardUtils.m +134 -0
  183. package/ios/utils/RTFExportUtils.h +24 -0
  184. package/ios/utils/RTFExportUtils.m +297 -0
  185. package/ios/utils/RuntimeKeys.h +38 -0
  186. package/ios/utils/RuntimeKeys.m +11 -0
  187. package/ios/utils/TextViewLayoutManager.h +14 -0
  188. package/ios/utils/TextViewLayoutManager.mm +113 -0
  189. package/lib/module/EnrichedMarkdownText.js +34 -0
  190. package/lib/module/EnrichedMarkdownText.js.map +1 -0
  191. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +130 -0
  192. package/lib/module/index.js +5 -0
  193. package/lib/module/index.js.map +1 -0
  194. package/lib/module/normalizeMarkdownStyle.js +340 -0
  195. package/lib/module/normalizeMarkdownStyle.js.map +1 -0
  196. package/lib/module/package.json +1 -0
  197. package/lib/typescript/package.json +1 -0
  198. package/lib/typescript/src/EnrichedMarkdownText.d.ts +101 -0
  199. package/lib/typescript/src/EnrichedMarkdownText.d.ts.map +1 -0
  200. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +111 -0
  201. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -0
  202. package/lib/typescript/src/index.d.ts +5 -0
  203. package/lib/typescript/src/index.d.ts.map +1 -0
  204. package/lib/typescript/src/normalizeMarkdownStyle.d.ts +6 -0
  205. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -0
  206. package/package.json +186 -1
  207. package/react-native.config.js +13 -0
  208. package/src/EnrichedMarkdownText.tsx +152 -0
  209. package/src/EnrichedMarkdownTextNativeComponent.ts +130 -0
  210. package/src/index.tsx +7 -0
  211. package/src/normalizeMarkdownStyle.ts +377 -0
@@ -0,0 +1,110 @@
1
+ #import "RendererFactory.h"
2
+ #import "BlockquoteRenderer.h"
3
+ #import "CodeBlockRenderer.h"
4
+ #import "CodeRenderer.h"
5
+ #import "EmphasisRenderer.h"
6
+ #import "HeadingRenderer.h"
7
+ #import "ImageRenderer.h"
8
+ #import "LinkRenderer.h"
9
+ #import "ListItemRenderer.h"
10
+ #import "ListRenderer.h"
11
+ #import "ParagraphRenderer.h"
12
+ #import "RenderContext.h"
13
+ #import "StrongRenderer.h"
14
+ #import "StyleConfig.h"
15
+ #import "TextRenderer.h"
16
+ #import "ThematicBreakRenderer.h"
17
+
18
+ @implementation RendererFactory {
19
+ StyleConfig *_config;
20
+ NSMutableDictionary<NSNumber *, id<NodeRenderer>> *_cache;
21
+ }
22
+
23
+ /**
24
+ * Initializes the factory with a shared style configuration.
25
+ * Uses a mutable dictionary to cache renderer instances as they are needed.
26
+ */
27
+ - (instancetype)initWithConfig:(StyleConfig *)config
28
+ {
29
+ self = [super init];
30
+ if (self) {
31
+ _config = config;
32
+ _cache = [NSMutableDictionary new];
33
+ }
34
+ return self;
35
+ }
36
+
37
+ /**
38
+ * Returns a shared renderer instance for a specific node type.
39
+ * Implements lazy initialization to avoid allocating unused renderers.
40
+ */
41
+ - (id<NodeRenderer>)rendererForNodeType:(MarkdownNodeType)type
42
+ {
43
+ id<NodeRenderer> cached = _cache[@(type)];
44
+ if (cached) {
45
+ return cached;
46
+ }
47
+
48
+ id<NodeRenderer> renderer = [self createRendererForType:type];
49
+ if (renderer) {
50
+ _cache[@(type)] = renderer;
51
+ }
52
+ return renderer;
53
+ }
54
+
55
+ /**
56
+ * Internal factory method to instantiate specialized renderers.
57
+ */
58
+ - (id<NodeRenderer>)createRendererForType:(MarkdownNodeType)type
59
+ {
60
+ switch (type) {
61
+ case MarkdownNodeTypeText:
62
+ return [TextRenderer new];
63
+ case MarkdownNodeTypeStrong:
64
+ return [[StrongRenderer alloc] initWithRendererFactory:self config:_config];
65
+ case MarkdownNodeTypeEmphasis:
66
+ return [[EmphasisRenderer alloc] initWithRendererFactory:self config:_config];
67
+ case MarkdownNodeTypeParagraph:
68
+ return [[ParagraphRenderer alloc] initWithRendererFactory:self config:_config];
69
+ case MarkdownNodeTypeLink:
70
+ return [[LinkRenderer alloc] initWithRendererFactory:self config:_config];
71
+ case MarkdownNodeTypeHeading:
72
+ return [[HeadingRenderer alloc] initWithRendererFactory:self config:_config];
73
+ case MarkdownNodeTypeCode:
74
+ return [[CodeRenderer alloc] initWithRendererFactory:self config:_config];
75
+ case MarkdownNodeTypeImage:
76
+ return [[ImageRenderer alloc] initWithRendererFactory:self config:_config];
77
+ case MarkdownNodeTypeBlockquote:
78
+ return [[BlockquoteRenderer alloc] initWithRendererFactory:self config:_config];
79
+ case MarkdownNodeTypeListItem:
80
+ return [[ListItemRenderer alloc] initWithRendererFactory:self config:_config];
81
+ case MarkdownNodeTypeUnorderedList:
82
+ return [[ListRenderer alloc] initWithRendererFactory:self config:_config isOrdered:NO];
83
+ case MarkdownNodeTypeOrderedList:
84
+ return [[ListRenderer alloc] initWithRendererFactory:self config:_config isOrdered:YES];
85
+ case MarkdownNodeTypeCodeBlock:
86
+ return [[CodeBlockRenderer alloc] initWithRendererFactory:self config:_config];
87
+ case MarkdownNodeTypeThematicBreak:
88
+ return [[ThematicBreakRenderer alloc] initWithRendererFactory:self config:_config];
89
+ default:
90
+ return nil;
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Helper method for container renderers to process their children.
96
+ * Leverages the factory to find the appropriate renderer for each child node.
97
+ */
98
+ - (void)renderChildrenOfNode:(MarkdownASTNode *)node
99
+ into:(NSMutableAttributedString *)output
100
+ context:(RenderContext *)context
101
+ {
102
+ for (MarkdownASTNode *child in node.children) {
103
+ id<NodeRenderer> renderer = [self rendererForNodeType:child.type];
104
+ if (renderer) {
105
+ [renderer renderNode:child into:output context:context];
106
+ }
107
+ }
108
+ }
109
+
110
+ @end
@@ -0,0 +1,6 @@
1
+ #pragma once
2
+ #import "NodeRenderer.h"
3
+
4
+ @interface StrongRenderer : NSObject <NodeRenderer>
5
+ - (instancetype)initWithRendererFactory:(id)rendererFactory config:(id)config;
6
+ @end
@@ -0,0 +1,83 @@
1
+ #import "StrongRenderer.h"
2
+ #import "FontUtils.h"
3
+ #import "MarkdownASTNode.h"
4
+ #import "RenderContext.h"
5
+ #import "RendererFactory.h"
6
+ #import "StyleConfig.h"
7
+
8
+ @implementation StrongRenderer {
9
+ RendererFactory *_rendererFactory;
10
+ StyleConfig *_config;
11
+ }
12
+
13
+ - (instancetype)initWithRendererFactory:(id)rendererFactory config:(id)config
14
+ {
15
+ if (self = [super init]) {
16
+ _rendererFactory = rendererFactory;
17
+ _config = (StyleConfig *)config;
18
+ }
19
+ return self;
20
+ }
21
+
22
+ #pragma mark - Rendering
23
+
24
+ - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
25
+ {
26
+ NSUInteger start = output.length;
27
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
28
+
29
+ NSRange range = NSMakeRange(start, output.length - start);
30
+ if (range.length == 0)
31
+ return;
32
+
33
+ BlockStyle *blockStyle = [context getBlockStyle];
34
+ UIColor *configStrongColor = [_config strongColor];
35
+ UIColor *calculatedColor =
36
+ configStrongColor ? [RenderContext calculateStrongColor:configStrongColor blockColor:blockStyle.color] : nil;
37
+
38
+ [output enumerateAttributesInRange:range
39
+ options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
40
+ usingBlock:^(NSDictionary<NSAttributedStringKey, id> *attrs, NSRange subrange, BOOL *stop) {
41
+ // 1. Resolve Font
42
+ UIFont *currentFont =
43
+ attrs[NSFontAttributeName] ?: cachedFontFromBlockStyle(blockStyle, context);
44
+
45
+ // Optimization: Only apply bold if not already bold
46
+ if (!([currentFont.fontDescriptor symbolicTraits] & UIFontDescriptorTraitBold)) {
47
+ UIFont *boldFont = [self ensureFontIsBold:currentFont];
48
+ if (boldFont) {
49
+ [output addAttribute:NSFontAttributeName value:boldFont range:subrange];
50
+ }
51
+ }
52
+
53
+ // 2. Resolve Color
54
+ // Only apply if we have a color and the current segment doesn't explicitly forbid overrides
55
+ if (calculatedColor && ![RenderContext shouldPreserveColors:attrs]) {
56
+ // Optimization: Check if this color is already set to avoid redundant attribute changes
57
+ if (![attrs[NSForegroundColorAttributeName] isEqual:calculatedColor]) {
58
+ [output addAttribute:NSForegroundColorAttributeName
59
+ value:calculatedColor
60
+ range:subrange];
61
+ }
62
+ }
63
+ }];
64
+ }
65
+
66
+ #pragma mark - Helper Methods
67
+
68
+ - (UIFont *)ensureFontIsBold:(UIFont *)font
69
+ {
70
+ if (!font)
71
+ return nil;
72
+
73
+ UIFontDescriptor *descriptor = font.fontDescriptor;
74
+ UIFontDescriptorSymbolicTraits traits = descriptor.symbolicTraits;
75
+
76
+ // Create new descriptor combining current traits with Bold
77
+ UIFontDescriptor *boldDescriptor = [descriptor fontDescriptorWithSymbolicTraits:(traits | UIFontDescriptorTraitBold)];
78
+
79
+ // Fallback to original font if bold version is unavailable
80
+ return boldDescriptor ? [UIFont fontWithDescriptor:boldDescriptor size:0] : font;
81
+ }
82
+
83
+ @end
@@ -0,0 +1,6 @@
1
+ #import "MarkdownASTNode.h"
2
+ #import "NodeRenderer.h"
3
+ #import "RenderContext.h"
4
+
5
+ @interface TextRenderer : NSObject <NodeRenderer>
6
+ @end
@@ -0,0 +1,16 @@
1
+ #import "TextRenderer.h"
2
+ #import "RenderContext.h"
3
+
4
+ @implementation TextRenderer
5
+
6
+ - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
7
+ {
8
+ if (!node.content)
9
+ return;
10
+
11
+ NSAttributedString *text = [[NSAttributedString alloc] initWithString:node.content
12
+ attributes:[context getTextAttributes]];
13
+ [output appendAttributedString:text];
14
+ }
15
+
16
+ @end
@@ -0,0 +1,5 @@
1
+ #import "NodeRenderer.h"
2
+
3
+ @interface ThematicBreakRenderer : NSObject <NodeRenderer>
4
+ - (instancetype)initWithRendererFactory:(id)rendererFactory config:(id)config;
5
+ @end
@@ -0,0 +1,53 @@
1
+ #import "ThematicBreakRenderer.h"
2
+ #import "MarkdownASTNode.h"
3
+ #import "StyleConfig.h"
4
+ #import "ThematicBreakAttachment.h"
5
+
6
+ #pragma mark - Renderer Implementation
7
+
8
+ @implementation ThematicBreakRenderer {
9
+ __weak id _rendererFactory;
10
+ StyleConfig *_config;
11
+ }
12
+
13
+ - (instancetype)initWithRendererFactory:(id)rendererFactory config:(id)config
14
+ {
15
+ self = [super init];
16
+ if (self) {
17
+ _rendererFactory = rendererFactory;
18
+ _config = (StyleConfig *)config;
19
+ }
20
+ return self;
21
+ }
22
+
23
+ - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
24
+ {
25
+ [self ensureStartingNewline:output];
26
+
27
+ ThematicBreakAttachment *attachment = [[ThematicBreakAttachment alloc] init];
28
+ attachment.lineColor = _config.thematicBreakColor ?: [UIColor separatorColor];
29
+ attachment.lineHeight = _config.thematicBreakHeight > 0 ? _config.thematicBreakHeight : 1.0;
30
+ attachment.marginTop = _config.thematicBreakMarginTop;
31
+ attachment.marginBottom = _config.thematicBreakMarginBottom;
32
+
33
+ NSDictionary *attributes = @{
34
+ NSAttachmentAttributeName : attachment,
35
+ NSParagraphStyleAttributeName : [NSParagraphStyle defaultParagraphStyle]
36
+ };
37
+
38
+ NSAttributedString *breakString = [[NSAttributedString alloc] initWithString:@"\uFFFC" attributes:attributes];
39
+
40
+ [output appendAttributedString:breakString];
41
+ [output appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
42
+ }
43
+
44
+ #pragma mark - Private Utilities
45
+
46
+ - (void)ensureStartingNewline:(NSMutableAttributedString *)output
47
+ {
48
+ if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
49
+ [output appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
50
+ }
51
+ }
52
+
53
+ @end
@@ -0,0 +1,228 @@
1
+ #pragma once
2
+ #import <UIKit/UIKit.h>
3
+
4
+ @interface StyleConfig : NSObject <NSCopying>
5
+ - (instancetype)init;
6
+ // Primary font properties
7
+ - (UIColor *)primaryColor;
8
+ - (void)setPrimaryColor:(UIColor *)newValue;
9
+ - (NSNumber *)primaryFontSize;
10
+ - (void)setPrimaryFontSize:(NSNumber *)newValue;
11
+ - (NSString *)primaryFontWeight;
12
+ - (void)setPrimaryFontWeight:(NSString *)newValue;
13
+ - (NSString *)primaryFontFamily;
14
+ - (void)setPrimaryFontFamily:(NSString *)newValue;
15
+ - (UIFont *)primaryFont;
16
+ // Paragraph properties
17
+ - (CGFloat)paragraphFontSize;
18
+ - (void)setParagraphFontSize:(CGFloat)newValue;
19
+ - (NSString *)paragraphFontFamily;
20
+ - (void)setParagraphFontFamily:(NSString *)newValue;
21
+ - (NSString *)paragraphFontWeight;
22
+ - (void)setParagraphFontWeight:(NSString *)newValue;
23
+ - (UIColor *)paragraphColor;
24
+ - (void)setParagraphColor:(UIColor *)newValue;
25
+ - (CGFloat)paragraphMarginBottom;
26
+ - (void)setParagraphMarginBottom:(CGFloat)newValue;
27
+ - (CGFloat)paragraphLineHeight;
28
+ - (void)setParagraphLineHeight:(CGFloat)newValue;
29
+ - (UIFont *)paragraphFont;
30
+ // H1 properties
31
+ - (CGFloat)h1FontSize;
32
+ - (void)setH1FontSize:(CGFloat)newValue;
33
+ - (NSString *)h1FontFamily;
34
+ - (void)setH1FontFamily:(NSString *)newValue;
35
+ - (NSString *)h1FontWeight;
36
+ - (void)setH1FontWeight:(NSString *)newValue;
37
+ - (UIColor *)h1Color;
38
+ - (void)setH1Color:(UIColor *)newValue;
39
+ - (CGFloat)h1MarginBottom;
40
+ - (void)setH1MarginBottom:(CGFloat)newValue;
41
+ - (CGFloat)h1LineHeight;
42
+ - (void)setH1LineHeight:(CGFloat)newValue;
43
+ - (UIFont *)h1Font;
44
+ // H2 properties
45
+ - (CGFloat)h2FontSize;
46
+ - (void)setH2FontSize:(CGFloat)newValue;
47
+ - (NSString *)h2FontFamily;
48
+ - (void)setH2FontFamily:(NSString *)newValue;
49
+ - (NSString *)h2FontWeight;
50
+ - (void)setH2FontWeight:(NSString *)newValue;
51
+ - (UIColor *)h2Color;
52
+ - (void)setH2Color:(UIColor *)newValue;
53
+ - (CGFloat)h2MarginBottom;
54
+ - (void)setH2MarginBottom:(CGFloat)newValue;
55
+ - (CGFloat)h2LineHeight;
56
+ - (void)setH2LineHeight:(CGFloat)newValue;
57
+ - (UIFont *)h2Font;
58
+ // H3 properties
59
+ - (CGFloat)h3FontSize;
60
+ - (void)setH3FontSize:(CGFloat)newValue;
61
+ - (NSString *)h3FontFamily;
62
+ - (void)setH3FontFamily:(NSString *)newValue;
63
+ - (NSString *)h3FontWeight;
64
+ - (void)setH3FontWeight:(NSString *)newValue;
65
+ - (UIColor *)h3Color;
66
+ - (void)setH3Color:(UIColor *)newValue;
67
+ - (CGFloat)h3MarginBottom;
68
+ - (void)setH3MarginBottom:(CGFloat)newValue;
69
+ - (CGFloat)h3LineHeight;
70
+ - (void)setH3LineHeight:(CGFloat)newValue;
71
+ - (UIFont *)h3Font;
72
+ // H4 properties
73
+ - (CGFloat)h4FontSize;
74
+ - (void)setH4FontSize:(CGFloat)newValue;
75
+ - (NSString *)h4FontFamily;
76
+ - (void)setH4FontFamily:(NSString *)newValue;
77
+ - (NSString *)h4FontWeight;
78
+ - (void)setH4FontWeight:(NSString *)newValue;
79
+ - (UIColor *)h4Color;
80
+ - (void)setH4Color:(UIColor *)newValue;
81
+ - (CGFloat)h4MarginBottom;
82
+ - (void)setH4MarginBottom:(CGFloat)newValue;
83
+ - (CGFloat)h4LineHeight;
84
+ - (void)setH4LineHeight:(CGFloat)newValue;
85
+ - (UIFont *)h4Font;
86
+ // H5 properties
87
+ - (CGFloat)h5FontSize;
88
+ - (void)setH5FontSize:(CGFloat)newValue;
89
+ - (NSString *)h5FontFamily;
90
+ - (void)setH5FontFamily:(NSString *)newValue;
91
+ - (NSString *)h5FontWeight;
92
+ - (void)setH5FontWeight:(NSString *)newValue;
93
+ - (UIColor *)h5Color;
94
+ - (void)setH5Color:(UIColor *)newValue;
95
+ - (CGFloat)h5MarginBottom;
96
+ - (void)setH5MarginBottom:(CGFloat)newValue;
97
+ - (CGFloat)h5LineHeight;
98
+ - (void)setH5LineHeight:(CGFloat)newValue;
99
+ - (UIFont *)h5Font;
100
+ // H6 properties
101
+ - (CGFloat)h6FontSize;
102
+ - (void)setH6FontSize:(CGFloat)newValue;
103
+ - (NSString *)h6FontFamily;
104
+ - (void)setH6FontFamily:(NSString *)newValue;
105
+ - (NSString *)h6FontWeight;
106
+ - (void)setH6FontWeight:(NSString *)newValue;
107
+ - (UIColor *)h6Color;
108
+ - (void)setH6Color:(UIColor *)newValue;
109
+ - (CGFloat)h6MarginBottom;
110
+ - (void)setH6MarginBottom:(CGFloat)newValue;
111
+ - (CGFloat)h6LineHeight;
112
+ - (void)setH6LineHeight:(CGFloat)newValue;
113
+ - (UIFont *)h6Font;
114
+ // Link properties
115
+ - (UIColor *)linkColor;
116
+ - (void)setLinkColor:(UIColor *)newValue;
117
+ - (BOOL)linkUnderline;
118
+ - (void)setLinkUnderline:(BOOL)newValue;
119
+ // Strong properties
120
+ - (UIColor *)strongColor;
121
+ - (void)setStrongColor:(UIColor *)newValue;
122
+ // Emphasis properties
123
+ - (UIColor *)emphasisColor;
124
+ - (void)setEmphasisColor:(UIColor *)newValue;
125
+ // Code properties
126
+ - (UIColor *)codeColor;
127
+ - (void)setCodeColor:(UIColor *)newValue;
128
+ - (UIColor *)codeBackgroundColor;
129
+ - (void)setCodeBackgroundColor:(UIColor *)newValue;
130
+ - (UIColor *)codeBorderColor;
131
+ - (void)setCodeBorderColor:(UIColor *)newValue;
132
+ // Image properties
133
+ - (CGFloat)imageHeight;
134
+ - (void)setImageHeight:(CGFloat)newValue;
135
+ - (CGFloat)imageBorderRadius;
136
+ - (void)setImageBorderRadius:(CGFloat)newValue;
137
+ - (CGFloat)imageMarginBottom;
138
+ - (void)setImageMarginBottom:(CGFloat)newValue;
139
+ // Inline image properties
140
+ - (CGFloat)inlineImageSize;
141
+ - (void)setInlineImageSize:(CGFloat)newValue;
142
+ // Blockquote properties
143
+ - (CGFloat)blockquoteFontSize;
144
+ - (void)setBlockquoteFontSize:(CGFloat)newValue;
145
+ - (NSString *)blockquoteFontFamily;
146
+ - (void)setBlockquoteFontFamily:(NSString *)newValue;
147
+ - (NSString *)blockquoteFontWeight;
148
+ - (void)setBlockquoteFontWeight:(NSString *)newValue;
149
+ - (UIColor *)blockquoteColor;
150
+ - (void)setBlockquoteColor:(UIColor *)newValue;
151
+ - (CGFloat)blockquoteMarginBottom;
152
+ - (void)setBlockquoteMarginBottom:(CGFloat)newValue;
153
+ - (CGFloat)blockquoteLineHeight;
154
+ - (void)setBlockquoteLineHeight:(CGFloat)newValue;
155
+ - (UIFont *)blockquoteFont;
156
+ - (UIColor *)blockquoteBorderColor;
157
+ - (void)setBlockquoteBorderColor:(UIColor *)newValue;
158
+ - (CGFloat)blockquoteBorderWidth;
159
+ - (void)setBlockquoteBorderWidth:(CGFloat)newValue;
160
+ - (CGFloat)blockquoteGapWidth;
161
+ - (void)setBlockquoteGapWidth:(CGFloat)newValue;
162
+ - (UIColor *)blockquoteBackgroundColor;
163
+ - (void)setBlockquoteBackgroundColor:(UIColor *)newValue;
164
+ // List style properties (combined for both ordered and unordered lists)
165
+ - (CGFloat)listStyleFontSize;
166
+ - (void)setListStyleFontSize:(CGFloat)newValue;
167
+ - (NSString *)listStyleFontFamily;
168
+ - (void)setListStyleFontFamily:(NSString *)newValue;
169
+ - (NSString *)listStyleFontWeight;
170
+ - (void)setListStyleFontWeight:(NSString *)newValue;
171
+ - (UIColor *)listStyleColor;
172
+ - (void)setListStyleColor:(UIColor *)newValue;
173
+ - (CGFloat)listStyleMarginBottom;
174
+ - (void)setListStyleMarginBottom:(CGFloat)newValue;
175
+ - (CGFloat)listStyleLineHeight;
176
+ - (void)setListStyleLineHeight:(CGFloat)newValue;
177
+ - (UIColor *)listStyleBulletColor;
178
+ - (void)setListStyleBulletColor:(UIColor *)newValue;
179
+ - (CGFloat)listStyleBulletSize;
180
+ - (void)setListStyleBulletSize:(CGFloat)newValue;
181
+ - (UIColor *)listStyleMarkerColor;
182
+ - (void)setListStyleMarkerColor:(UIColor *)newValue;
183
+ - (NSString *)listStyleMarkerFontWeight;
184
+ - (void)setListStyleMarkerFontWeight:(NSString *)newValue;
185
+ - (CGFloat)listStyleGapWidth;
186
+ - (void)setListStyleGapWidth:(CGFloat)newValue;
187
+ - (CGFloat)listStyleMarginLeft;
188
+ - (void)setListStyleMarginLeft:(CGFloat)newValue;
189
+ - (UIFont *)listMarkerFont;
190
+ - (UIFont *)listStyleFont;
191
+ - (CGFloat)effectiveListGapWidth;
192
+ - (CGFloat)effectiveListMarginLeftForBullet;
193
+ - (CGFloat)effectiveListMarginLeftForNumber;
194
+ // Code block properties
195
+ - (CGFloat)codeBlockFontSize;
196
+ - (void)setCodeBlockFontSize:(CGFloat)newValue;
197
+ - (NSString *)codeBlockFontFamily;
198
+ - (void)setCodeBlockFontFamily:(NSString *)newValue;
199
+ - (NSString *)codeBlockFontWeight;
200
+ - (void)setCodeBlockFontWeight:(NSString *)newValue;
201
+ - (UIColor *)codeBlockColor;
202
+ - (void)setCodeBlockColor:(UIColor *)newValue;
203
+ - (CGFloat)codeBlockMarginBottom;
204
+ - (void)setCodeBlockMarginBottom:(CGFloat)newValue;
205
+ - (CGFloat)codeBlockLineHeight;
206
+ - (void)setCodeBlockLineHeight:(CGFloat)newValue;
207
+ - (UIColor *)codeBlockBackgroundColor;
208
+ - (void)setCodeBlockBackgroundColor:(UIColor *)newValue;
209
+ - (UIColor *)codeBlockBorderColor;
210
+ - (void)setCodeBlockBorderColor:(UIColor *)newValue;
211
+ - (CGFloat)codeBlockBorderRadius;
212
+ - (void)setCodeBlockBorderRadius:(CGFloat)newValue;
213
+ - (CGFloat)codeBlockBorderWidth;
214
+ - (void)setCodeBlockBorderWidth:(CGFloat)newValue;
215
+ - (CGFloat)codeBlockPadding;
216
+ - (void)setCodeBlockPadding:(CGFloat)newValue;
217
+ - (UIFont *)codeBlockFont;
218
+ // Thematic break properties
219
+ - (UIColor *)thematicBreakColor;
220
+ - (void)setThematicBreakColor:(UIColor *)newValue;
221
+ - (CGFloat)thematicBreakHeight;
222
+ - (void)setThematicBreakHeight:(CGFloat)newValue;
223
+ - (CGFloat)thematicBreakMarginTop;
224
+ - (void)setThematicBreakMarginTop:(CGFloat)newValue;
225
+ - (CGFloat)thematicBreakMarginBottom;
226
+ - (void)setThematicBreakMarginBottom:(CGFloat)newValue;
227
+
228
+ @end