From d883c1d493020d79bb20888550b26c90167d268c Mon Sep 17 00:00:00 2001 From: Yueqian Yang Date: Tue, 7 Jul 2026 22:32:01 -0500 Subject: [PATCH 1/2] fix: honor ordered list start number GFM renders an ordered list starting at its first item's literal number ("3. foo" renders 3, 4, ...). md4c already reports it via MD_BLOCK_OL_DETAIL.start, but the parser dropped it, so both renderers restarted every list at 1. Pass it through as a "start" attribute on the OrderedList node (set only when != 1) and seed the item counter from it on iOS and Android. Co-Authored-By: Claude Fable 5 --- .../ordered_list_start_test.yaml | 23 ++++++++++++++++++ .../android/ordered_list_start_display.png | Bin 0 -> 21266 bytes .../ios/ordered_list_start_display.png | Bin 0 -> 25692 bytes packages/core/cpp/parser/MD4CParser.cpp | 14 ++++++++++- .../markdown/renderer/BlockStyleContext.kt | 6 +++-- .../markdown/renderer/ListContextManager.kt | 3 ++- .../markdown/renderer/ListRenderer.kt | 11 ++++++++- .../ios/renderer/ListRenderer.m | 11 ++++++++- 8 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 .maestro/enrichedMarkdownText/flows/basic/block_elements/ordered_list_start_test.yaml create mode 100644 .maestro/enrichedMarkdownText/screenshots/android/ordered_list_start_display.png create mode 100644 .maestro/enrichedMarkdownText/screenshots/ios/ordered_list_start_display.png diff --git a/.maestro/enrichedMarkdownText/flows/basic/block_elements/ordered_list_start_test.yaml b/.maestro/enrichedMarkdownText/flows/basic/block_elements/ordered_list_start_test.yaml new file mode 100644 index 000000000..f56fd9bb6 --- /dev/null +++ b/.maestro/enrichedMarkdownText/flows/basic/block_elements/ordered_list_start_test.yaml @@ -0,0 +1,23 @@ +appId: swmansion.enriched.markdown.example +tags: + - block + - list + - text +--- +- launchApp + +- runFlow: + file: '../../../../subflows/move_to_playground.yaml' + +- runFlow: + file: '../../../subflows/set_enriched_text_value.yaml' + env: + VALUE: | + 3. Add eggs and vanilla extract + 4. Pour into a greased tin + 5. Bake for 30 minutes + +- runFlow: + file: '../../../subflows/capture_or_assert_screenshot.yaml' + env: + SCREENSHOT_NAME: 'ordered_list_start_display' diff --git a/.maestro/enrichedMarkdownText/screenshots/android/ordered_list_start_display.png b/.maestro/enrichedMarkdownText/screenshots/android/ordered_list_start_display.png new file mode 100644 index 0000000000000000000000000000000000000000..78cb0e42d0c6cb896c69dc373d2eb60cf7184d45 GIT binary patch literal 21266 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 VDqbJ{JA{tzx~73f*OBAe literal 0 HcmV?d00001 diff --git a/packages/core/cpp/parser/MD4CParser.cpp b/packages/core/cpp/parser/MD4CParser.cpp index 075580c80..c6b093700 100644 --- a/packages/core/cpp/parser/MD4CParser.cpp +++ b/packages/core/cpp/parser/MD4CParser.cpp @@ -19,6 +19,7 @@ class MD4CParser::Impl { static const std::string ATTR_LANGUAGE; static const std::string ATTR_IS_TASK; static const std::string ATTR_TASK_CHECKED; + static const std::string ATTR_START; void reset(size_t estimatedDepth) { root = std::make_shared(NodeType::Document); @@ -114,7 +115,17 @@ class MD4CParser::Impl { } case MD_BLOCK_OL: { - impl->pushNode(std::make_shared(NodeType::OrderedList)); + auto node = std::make_shared(NodeType::OrderedList); + if (detail) { + // GFM: an ordered list starts at its first item's literal number + // ("3. foo" renders 3, 4, …). Only set when != 1 so renderers can + // treat the attribute's absence as the default. + auto *ol = static_cast(detail); + if (ol->start != 1) { + node->setAttribute(ATTR_START, std::to_string(ol->start)); + } + } + impl->pushNode(node); break; } @@ -621,5 +632,6 @@ const std::string MD4CParser::Impl::ATTR_FENCE_CHAR = "fenceChar"; const std::string MD4CParser::Impl::ATTR_LANGUAGE = "language"; const std::string MD4CParser::Impl::ATTR_IS_TASK = "isTask"; const std::string MD4CParser::Impl::ATTR_TASK_CHECKED = "taskChecked"; +const std::string MD4CParser::Impl::ATTR_START = "start"; } // namespace Markdown diff --git a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt index a3d707866..68baf8fbc 100644 --- a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +++ b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt @@ -107,8 +107,10 @@ class BlockStyleContext { listItemNumber++ } - fun resetListItemNumber() { - listItemNumber = 0 + fun resetListItemNumber(startNumber: Int = 1) { + // ListItemRenderer pre-increments, so the counter starts one below the + // first rendered number. + listItemNumber = startNumber - 1 } fun pushOrderedListItemNumber() { diff --git a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt index 567cc79dc..cb3d2aa54 100644 --- a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +++ b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt @@ -36,6 +36,7 @@ class ListContextManager( fun enterList( listType: BlockStyleContext.ListType, style: ListStyle, + startNumber: Int = 1, ): ListEntryState { val previousDepth = context.listDepth val isNested = previousDepth > 0 @@ -58,7 +59,7 @@ class ListContextManager( context.setUnorderedListStyle(style) } } - context.resetListItemNumber() + context.resetListItemNumber(startNumber) return ListEntryState( previousDepth = previousDepth, diff --git a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt index e3e5f4f03..06c89eba3 100644 --- a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +++ b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt @@ -22,8 +22,17 @@ class ListRenderer( val listStyle = config.style.listStyle val listType = if (isOrdered) BlockStyleContext.ListType.ORDERED else BlockStyleContext.ListType.UNORDERED + // GFM: an ordered list starts at its first item's literal number + // ("3. foo" renders 3, 4, …). The parser sets the attribute only when != 1. + val startNumber = + if (isOrdered) { + node.getAttribute("start")?.toIntOrNull()?.coerceAtLeast(0) ?: 1 + } else { + 1 + } + val contextManager = ListContextManager(factory.blockStyleContext) - val entryState = contextManager.enterList(listType, listStyle) + val entryState = contextManager.enterList(listType, listStyle, startNumber) // For top-level lists, insert marginTop spacer before rendering content if (entryState.previousDepth == 0) { diff --git a/packages/react-native-enriched-markdown/ios/renderer/ListRenderer.m b/packages/react-native-enriched-markdown/ios/renderer/ListRenderer.m index 237082df4..822a390e5 100644 --- a/packages/react-native-enriched-markdown/ios/renderer/ListRenderer.m +++ b/packages/react-native-enriched-markdown/ios/renderer/ListRenderer.m @@ -43,7 +43,16 @@ - (void)renderNodeContent:(MarkdownASTNode *)node context.listDepth = prevDepth + 1; context.listType = _isOrdered ? ListTypeOrdered : ListTypeUnordered; - context.listItemNumber = 0; // Reset counter for this specific list level + // Reset counter for this specific list level. Ordered lists honor the + // GFM start number ("3. foo" renders 3, 4, …) — the parser sets the + // attribute only when != 1; ListItemRenderer pre-increments, so the + // counter starts one below the first rendered number. + NSInteger startNumber = 1; + NSString *startAttr = node.attributes[@"start"]; + if (_isOrdered && startAttr != nil) { + startNumber = MAX((NSInteger)0, (NSInteger)startAttr.integerValue); + } + context.listItemNumber = startNumber - 1; [context setBlockStyle:_isOrdered ? BlockTypeOrderedList : BlockTypeUnorderedList font:_config.listStyleFont From 82a931bd262e9fed4aba4ca19076c4bada5d2164 Mon Sep 17 00:00:00 2001 From: Ernest Date: Wed, 8 Jul 2026 14:48:34 +0200 Subject: [PATCH 2/2] docs: drop comments --- packages/core/cpp/parser/MD4CParser.cpp | 3 --- .../swmansion/enriched/markdown/renderer/ListRenderer.kt | 2 -- .../ios/renderer/ListRenderer.m | 6 ++---- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/core/cpp/parser/MD4CParser.cpp b/packages/core/cpp/parser/MD4CParser.cpp index c6b093700..64c38722e 100644 --- a/packages/core/cpp/parser/MD4CParser.cpp +++ b/packages/core/cpp/parser/MD4CParser.cpp @@ -117,9 +117,6 @@ class MD4CParser::Impl { case MD_BLOCK_OL: { auto node = std::make_shared(NodeType::OrderedList); if (detail) { - // GFM: an ordered list starts at its first item's literal number - // ("3. foo" renders 3, 4, …). Only set when != 1 so renderers can - // treat the attribute's absence as the default. auto *ol = static_cast(detail); if (ol->start != 1) { node->setAttribute(ATTR_START, std::to_string(ol->start)); diff --git a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt index 06c89eba3..d47887798 100644 --- a/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +++ b/packages/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt @@ -22,8 +22,6 @@ class ListRenderer( val listStyle = config.style.listStyle val listType = if (isOrdered) BlockStyleContext.ListType.ORDERED else BlockStyleContext.ListType.UNORDERED - // GFM: an ordered list starts at its first item's literal number - // ("3. foo" renders 3, 4, …). The parser sets the attribute only when != 1. val startNumber = if (isOrdered) { node.getAttribute("start")?.toIntOrNull()?.coerceAtLeast(0) ?: 1 diff --git a/packages/react-native-enriched-markdown/ios/renderer/ListRenderer.m b/packages/react-native-enriched-markdown/ios/renderer/ListRenderer.m index 822a390e5..4848f32eb 100644 --- a/packages/react-native-enriched-markdown/ios/renderer/ListRenderer.m +++ b/packages/react-native-enriched-markdown/ios/renderer/ListRenderer.m @@ -43,15 +43,13 @@ - (void)renderNodeContent:(MarkdownASTNode *)node context.listDepth = prevDepth + 1; context.listType = _isOrdered ? ListTypeOrdered : ListTypeUnordered; - // Reset counter for this specific list level. Ordered lists honor the - // GFM start number ("3. foo" renders 3, 4, …) — the parser sets the - // attribute only when != 1; ListItemRenderer pre-increments, so the - // counter starts one below the first rendered number. NSInteger startNumber = 1; NSString *startAttr = node.attributes[@"start"]; if (_isOrdered && startAttr != nil) { startNumber = MAX((NSInteger)0, (NSInteger)startAttr.integerValue); } + // ListItemRenderer pre-increments, so the counter starts one below the + // first rendered number. context.listItemNumber = startNumber - 1; [context setBlockStyle:_isOrdered ? BlockTypeOrderedList : BlockTypeUnorderedList