@@ -208,24 +208,24 @@ The `*-merge` gem family is built on a two-layer architecture:
208208
209209[ tree\_ haver] [ tree_haver ] provides cross-Ruby parsing capabilities:
210210
211- - ** Universal Backend Support** : Automatically selects the best parsing backend for your Ruby implementation (MRI, JRuby, TruffleRuby)
212- - ** 10 Backend Options** : MRI C extensions, Rust bindings, FFI, Java (JRuby), language-specific parsers (Prism, Psych, Commonmarker, Markly), and pure Ruby fallback (Citrus)
213- - ** Unified API** : Write parsing code once, run on any Ruby implementation
214- - ** Grammar Discovery** : Built-in ` GrammarFinder ` for platform-aware grammar library discovery
215- - ** Thread-Safe** : Language registry with thread-safe caching
211+ - ** Universal Backend Support** : Automatically selects the best parsing backend for your Ruby implementation (MRI, JRuby, TruffleRuby)
212+ - ** 10 Backend Options** : MRI C extensions, Rust bindings, FFI, Java (JRuby), language-specific parsers (Prism, Psych, Commonmarker, Markly), and pure Ruby fallback (Citrus)
213+ - ** Unified API** : Write parsing code once, run on any Ruby implementation
214+ - ** Grammar Discovery** : Built-in ` GrammarFinder ` for platform-aware grammar library discovery
215+ - ** Thread-Safe** : Language registry with thread-safe caching
216216
217217#### Layer 2: ast-merge (Merge Infrastructure)
218218
219219Ast::Merge builds on tree\_ haver to provide:
220220
221- - ** Base Classes** : ` FreezeNode ` , ` MergeResult ` base classes with unified constructors
222- - ** Shared Modules** : ` FileAnalysisBase ` , ` FileAnalyzable ` , ` MergerConfig ` , ` DebugLogger `
223- - ** Freeze Block Support** : Configurable marker patterns for multiple comment syntaxes (preserve sections during merge)
224- - ** Node Typing System** : ` NodeTyping ` for canonical node type identification across different parsers
225- - ** Conflict Resolution** : ` ConflictResolverBase ` with pluggable strategies
226- - ** Error Classes** : ` ParseError ` , ` TemplateParseError ` , ` DestinationParseError `
227- - ** Region Detection** : ` RegionDetectorBase ` , ` FencedCodeBlockDetector ` for text-based analysis
228- - ** RSpec Shared Examples** : Test helpers for implementing new merge gems
221+ - ** Base Classes** : ` FreezeNode ` , ` MergeResult ` base classes with unified constructors
222+ - ** Shared Modules** : ` FileAnalysisBase ` , ` FileAnalyzable ` , ` MergerConfig ` , ` DebugLogger `
223+ - ** Freeze Block Support** : Configurable marker patterns for multiple comment syntaxes (preserve sections during merge)
224+ - ** Node Typing System** : ` NodeTyping ` for canonical node type identification across different parsers
225+ - ** Conflict Resolution** : ` ConflictResolverBase ` with pluggable strategies
226+ - ** Error Classes** : ` ParseError ` , ` TemplateParseError ` , ` DestinationParseError `
227+ - ** Region Detection** : ` RegionDetectorBase ` , ` FencedCodeBlockDetector ` for text-based analysis
228+ - ** RSpec Shared Examples** : Test helpers for implementing new merge gems
229229
230230### Creating a New Merge Gem
231231
@@ -372,10 +372,10 @@ merger = MyFormat::SmartMerger.new(
372372
373373This is particularly useful for:
374374
375- - Paragraphs with minor edits (typos, rewording)
376- - Headings with slight changes
377- - Comments with updated text
378- - Any text-based node that may have been slightly modified
375+ - Paragraphs with minor edits (typos, rewording)
376+ - Headings with slight changes
377+ - Comments with updated text
378+ - Any text-based node that may have been slightly modified
379379
380380### Namespace Reference
381381
@@ -391,11 +391,11 @@ The `Ast::Merge` module is organized into several namespaces, each with detailed
391391
392392** Key Classes by Namespace:**
393393
394- - ** Detector** : ` Region ` , ` Base ` , ` Mergeable ` , ` FencedCodeBlock ` , ` YamlFrontmatter ` , ` TomlFrontmatter `
395- - ** Recipe** : ` Config ` , ` Runner ` , ` ScriptLoader `
396- - ** Comment** : ` Line ` , ` Block ` , ` Empty ` , ` Parser ` , ` Style `
397- - ** Text** : ` SmartMerger ` , ` FileAnalysis ` , ` LineNode ` , ` WordNode ` , ` Section `
398- - ** RSpec** : Shared examples and dependency tags for testing ` *-merge ` implementations
394+ - ** Detector** : ` Region ` , ` Base ` , ` Mergeable ` , ` FencedCodeBlock ` , ` YamlFrontmatter ` , ` TomlFrontmatter `
395+ - ** Recipe** : ` Config ` , ` Runner ` , ` ScriptLoader `
396+ - ** Comment** : ` Line ` , ` Block ` , ` Empty ` , ` Parser ` , ` Style `
397+ - ** Text** : ` SmartMerger ` , ` FileAnalysis ` , ` LineNode ` , ` WordNode ` , ` Section `
398+ - ** RSpec** : Shared examples and dependency tags for testing ` *-merge ` implementations
399399
400400## 💡 Info you can shake a stick at
401401
@@ -447,18 +447,13 @@ The maintainers of this and thousands of other packages are working with Tidelif
447447
448448[ ![ Get help from me on Tidelift] [ 🏙️entsup-tidelift-img ]] [ 🏙️entsup-tidelift ]
449449
450- - 💡Subscribe for support guarantees covering * all* your FLOSS dependencies
451-
452- - 💡Tidelift is part of [ Sonar] [ 🏙️entsup-tidelift-sonar ]
453-
454- - 💡Tidelift pays maintainers to maintain the software you depend on\! <br />📊` @ ` Pointy Haired Boss: An [ enterprise support] [ 🏙️entsup-tidelift ] subscription is "[ never gonna let you down] [ 🧮kloc ] ", and * supports* open source maintainers
455- Alternatively:
456-
457- - [ ![ Live Chat on Discord] [ ✉️discord-invite-img-ftb ]] [ 🖼️galtzo-discord ]
458-
459- - [ ![ Get help from me on Upwork] [ 👨🏼🏫expsup-upwork-img ]] [ 👨🏼🏫expsup-upwork ]
460-
461- - [ ![ Get help from me on Codementor] [ 👨🏼🏫expsup-codementor-img ]] [ 👨🏼🏫expsup-codementor ]
450+ - 💡Subscribe for support guarantees covering * all* your FLOSS dependencies
451+ - 💡Tidelift is part of [ Sonar] [ 🏙️entsup-tidelift-sonar ]
452+ - 💡Tidelift pays maintainers to maintain the software you depend on\! <br />📊` @ ` Pointy Haired Boss: An [ enterprise support] [ 🏙️entsup-tidelift ] subscription is "[ never gonna let you down] [ 🧮kloc ] ", and * supports* open source maintainers
453+ Alternatively:
454+ - [ ![ Live Chat on Discord] [ ✉️discord-invite-img-ftb ]] [ 🖼️galtzo-discord ]
455+ - [ ![ Get help from me on Upwork] [ 👨🏼🏫expsup-upwork-img ]] [ 👨🏼🏫expsup-upwork ]
456+ - [ ![ Get help from me on Codementor] [ 👨🏼🏫expsup-codementor-img ]] [ 👨🏼🏫expsup-codementor ]
462457
463458</details >
464459
@@ -537,17 +532,17 @@ merger = SomeFormat::Merge::SmartMerger.new(
537532
538533Control which source wins when both files have the same structural element:
539534
540- - ** ` :template ` ** - Template values replace destination values
541- - ** ` :destination ` ** (default) - Destination values are preserved
542- - ** Hash** - Per-node-type preference (see Advanced Configuration)
535+ - ** ` :template ` ** - Template values replace destination values
536+ - ** ` :destination ` ** (default) - Destination values are preserved
537+ - ** Hash** - Per-node-type preference (see Advanced Configuration)
543538
544539### Template-Only Nodes
545540
546541Control whether to add nodes that only exist in the template:
547542
548- - ** ` true ` ** - Add all template-only nodes
549- - ** ` false ` ** (default) - Skip template-only nodes
550- - ** Callable** - Filter which template-only nodes to add
543+ - ** ` true ` ** - Add all template-only nodes
544+ - ** ` false ` ** (default) - Skip template-only nodes
545+ - ** Callable** - Filter which template-only nodes to add
551546
552547#### Callable Filter
553548
@@ -577,10 +572,10 @@ merger = Markly::Merge::SmartMerger.new(
577572
578573The ` entry ` hash contains:
579574
580- - ` :template_node ` - The node being considered for addition
581- - ` :signature ` - The node's signature (Array or other value)
582- - ` :template_index ` - Index in the template statements
583- - ` :dest_index ` - Always ` nil ` for template-only nodes
575+ - ` :template_node ` - The node being considered for addition
576+ - ` :signature ` - The node's signature (Array or other value)
577+ - ` :template_index ` - Index in the template statements
578+ - ` :dest_index ` - Always ` nil ` for template-only nodes
584579
585580## 🔧 Basic Usage
586581
@@ -606,11 +601,11 @@ end
606601
607602### Available Shared Examples
608603
609- - ` "Ast::Merge::FreezeNode" ` - Tests for FreezeNode implementations
610- - ` "Ast::Merge::MergeResult" ` - Tests for MergeResult implementations
611- - ` "Ast::Merge::DebugLogger" ` - Tests for DebugLogger implementations
612- - ` "Ast::Merge::FileAnalysisBase" ` - Tests for FileAnalysis implementations
613- - ` "Ast::Merge::MergerConfig" ` - Tests for SmartMerger implementations
604+ - ` "Ast::Merge::FreezeNode" ` - Tests for FreezeNode implementations
605+ - ` "Ast::Merge::MergeResult" ` - Tests for MergeResult implementations
606+ - ` "Ast::Merge::DebugLogger" ` - Tests for DebugLogger implementations
607+ - ` "Ast::Merge::FileAnalysisBase" ` - Tests for FileAnalysis implementations
608+ - ` "Ast::Merge::MergerConfig" ` - Tests for SmartMerger implementations
614609
615610## 🎛️ Advanced Configuration
616611
@@ -622,9 +617,9 @@ This is useful for hand-edited customizations you never want overwritten.
622617
623618A freeze block consists of:
624619
625- - A ** start marker** comment (e.g., ` # mytoken:freeze ` )
626- - The protected content
627- - An ** end marker** comment (e.g., ` # mytoken:unfreeze ` )
620+ - A ** start marker** comment (e.g., ` # mytoken:freeze ` )
621+ - The protected content
622+ - An ** end marker** comment (e.g., ` # mytoken:unfreeze ` )
628623
629624``` ruby
630625# In a Ruby file with prism-merge:
@@ -669,13 +664,13 @@ preferences for different types of nodes (e.g., prefer template for linter confi
669664
6706651 . ** Define a ` node_typing ` ** : A Hash mapping node type symbols to callables that receive a node and return either:
671666
672- - The original node (no special handling)
673- - A wrapped node with a ` merge_type ` attribute (via ` Ast::Merge::NodeTyping::Wrapper ` )
667+ - The original node (no special handling)
668+ - A wrapped node with a ` merge_type ` attribute (via ` Ast::Merge::NodeTyping::Wrapper ` )
674669
6756702 . ** Use a Hash-based preference** : Instead of a simple ` :destination ` or ` :template ` Symbol, pass a Hash with:
676671
677- - ` :default ` key for the fallback preference
678- - Custom keys matching the ` merge_type ` values from your ` node_typing `
672+ - ` :default ` key for the fallback preference
673+ - Custom keys matching the ` merge_type ` values from your ` node_typing `
679674
680675``` ruby
681676# Example: Prefer template for lint gem configs, destination for everything else
@@ -903,7 +898,7 @@ is a *breaking change* to an API, and for that reason the bike shedding is endle
903898To get a better understanding of how SemVer is intended to work over a project's lifetime,
904899read this article from the creator of SemVer:
905900
906- - [ "Major Version Numbers are Not Sacred"] [ 📌major-versions-not-sacred ]
901+ - [ "Major Version Numbers are Not Sacred"] [ 📌major-versions-not-sacred ]
907902
908903</details >
909904
0 commit comments