From 6e91860147b528cb0c3034acbc302a00f77cf524 Mon Sep 17 00:00:00 2001 From: Gregory Moskaliuk Date: Fri, 24 Oct 2025 17:11:43 +0200 Subject: [PATCH] feat: implement new approach for adding spacers --- .../java/com/richtext/renderer/NodeRenderer.kt | 6 ++++-- .../src/main/java/com/richtext/utils/Utils.kt | 14 ++++++++++++++ ios/renderer/AttributedRenderer.m | 17 +++-------------- ios/utils/SpacingUtils.h | 15 +++++++++++++++ ios/utils/SpacingUtils.m | 5 +++++ 5 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 android/src/main/java/com/richtext/utils/Utils.kt create mode 100644 ios/utils/SpacingUtils.h create mode 100644 ios/utils/SpacingUtils.m diff --git a/android/src/main/java/com/richtext/renderer/NodeRenderer.kt b/android/src/main/java/com/richtext/renderer/NodeRenderer.kt index 22c5bbce..0ba9c86f 100644 --- a/android/src/main/java/com/richtext/renderer/NodeRenderer.kt +++ b/android/src/main/java/com/richtext/renderer/NodeRenderer.kt @@ -6,6 +6,7 @@ import com.richtext.spans.RichTextLinkSpan import com.richtext.spans.RichTextHeadingSpan import com.richtext.spans.RichTextParagraphSpan import com.richtext.spans.RichTextTextSpan +import com.richtext.utils.addSpacing import org.commonmark.node.* interface NodeRenderer { @@ -56,7 +57,7 @@ class ParagraphRenderer : NodeRenderer { ) } - builder.append("\n") + builder.addSpacing() } } @@ -84,7 +85,8 @@ class HeadingRenderer : NodeRenderer { android.text.SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE ) } - builder.append("\n") + + builder.addSpacing() } } diff --git a/android/src/main/java/com/richtext/utils/Utils.kt b/android/src/main/java/com/richtext/utils/Utils.kt new file mode 100644 index 00000000..fc9f19a2 --- /dev/null +++ b/android/src/main/java/com/richtext/utils/Utils.kt @@ -0,0 +1,14 @@ +package com.richtext.utils + +import android.text.SpannableStringBuilder + +/** + * Adds Zero Width Space spacing between markdown elements. + * + * Uses \u200B (Zero Width Space) characters for spacing because: + * - Invisible but takes up space, providing consistent visual spacing + * - Doesn't interfere with text rendering or font metrics + */ +fun SpannableStringBuilder.addSpacing() { + append("\u200B\n\u200B\n") +} diff --git a/ios/renderer/AttributedRenderer.m b/ios/renderer/AttributedRenderer.m index 72442b73..fe8b93cd 100644 --- a/ios/renderer/AttributedRenderer.m +++ b/ios/renderer/AttributedRenderer.m @@ -2,6 +2,7 @@ #import "NodeRenderer.h" #import "RenderContext.h" #import "MarkdownASTNode.h" +#import "SpacingUtils.h" @interface ParagraphRenderer : NSObject @end @@ -59,15 +60,8 @@ - (void)renderNodeRecursive:(MarkdownASTNode *)node for (NSUInteger i = 0; i < node.children.count; i++) { MarkdownASTNode *child = node.children[i]; [self renderNodeRecursive:child into:out font:font color:color context:context isTopLevel:NO]; - // Add spacing between paragraphs (MD4C doesn't provide empty lines between blocks) - // This is intentional rendering behavior to match markdown visual expectations if (child.type == MarkdownNodeTypeParagraph && i < node.children.count - 1) { - NSAttributedString *spacing = [[NSAttributedString alloc] - initWithString:@"\n\n" - attributes:@{ - NSFontAttributeName: font, - NSForegroundColorAttributeName: color - }]; + NSAttributedString *spacing = createSpacing(); [out appendAttributedString:spacing]; } } @@ -255,12 +249,7 @@ - (void)renderNode:(MarkdownASTNode *)node } } - NSAttributedString *spacing = [[NSAttributedString alloc] - initWithString:@"\n\n" - attributes:@{ - NSFontAttributeName: font, - NSForegroundColorAttributeName: color - }]; + NSAttributedString *spacing = createSpacing(); [output appendAttributedString:spacing]; } @end diff --git a/ios/utils/SpacingUtils.h b/ios/utils/SpacingUtils.h new file mode 100644 index 00000000..30658505 --- /dev/null +++ b/ios/utils/SpacingUtils.h @@ -0,0 +1,15 @@ +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Creates NSAttributedString with Zero Width Space spacing. + * + * Uses \u200B (Zero Width Space) characters for spacing because: + * - Invisible but takes up space, providing consistent visual spacing + * - Doesn't interfere with text rendering or font metrics + */ +extern NSAttributedString *createSpacing(void); + +NS_ASSUME_NONNULL_END diff --git a/ios/utils/SpacingUtils.m b/ios/utils/SpacingUtils.m new file mode 100644 index 00000000..5e13fc7f --- /dev/null +++ b/ios/utils/SpacingUtils.m @@ -0,0 +1,5 @@ +#import "SpacingUtils.h" + +NSAttributedString *createSpacing(void) { + return [[NSAttributedString alloc] initWithString:@"\u200B\n\u200B\n"]; +}