Module: Ast::Merge::Detector::Mergeable

Included in:
SmartMergerBase
Defined in:
lib/ast/merge/detector/mergeable.rb

Overview

Mixin for adding region support to SmartMerger classes.

This module provides functionality for detecting and handling regions
within documents that should be merged with different strategies.
Regions are portions of a document (like YAML frontmatter or fenced
code blocks) that may require specialized merging.

Examples:

Basic region configuration

class SmartMerger
  include Detector::Mergeable

  def initialize(template, dest, regions: [], region_placeholder: nil)
    @template_content = template
    @dest_content = dest
    setup_regions(regions: regions, region_placeholder: region_placeholder)
  end
end

With YAML frontmatter regions

merger = SmartMerger.new(
  template,
  dest,
  regions: [
    {
      detector: Detector::YamlFrontmatter.new,
      merger_class: SomeYamlMerger,
      merger_options: { preserve_order: true }
    }
  ]
)

With nested regions (code blocks in markdown)

merger = SmartMerger.new(
  template,
  dest,
  regions: [
    {
      detector: Detector::FencedCodeBlock.ruby,
      merger_class: Prism::Merge::SmartMerger,
      regions: [...]  # Nested regions!
    }
  ]
)

See Also:

Defined Under Namespace

Classes: Config, ExtractedRegion

Constant Summary collapse

DEFAULT_PLACEHOLDER_PREFIX =

Default placeholder prefix for extracted regions

"<<<AST_MERGE_REGION_"
DEFAULT_PLACEHOLDER_SUFFIX =
">>>"

Instance Method Summary collapse

Instance Method Details

#extract_dest_regions(content) ⇒ String

Extract regions from the destination content, replacing with placeholders.

Parameters:

  • content (String)

    Destination content

Returns:

  • (String)

    Content with regions replaced by placeholders

Raises:



131
132
133
134
135
# File 'lib/ast/merge/detector/mergeable.rb', line 131

def extract_dest_regions(content)
  return content unless regions_configured?

  extract_regions(content, @extracted_dest_regions)
end

#extract_template_regions(content) ⇒ String

Extract regions from the template content, replacing with placeholders.

Parameters:

  • content (String)

    Template content

Returns:

  • (String)

    Content with regions replaced by placeholders

Raises:



118
119
120
121
122
# File 'lib/ast/merge/detector/mergeable.rb', line 118

def extract_template_regions(content)
  return content unless regions_configured?

  extract_regions(content, @extracted_template_regions)
end

#regions_configured?Boolean

Check if this merger has region configurations.

Returns:

  • (Boolean)

    true if regions are configured



107
108
109
# File 'lib/ast/merge/detector/mergeable.rb', line 107

def regions_configured?
  @region_configs && !@region_configs.empty?
end

#setup_regions(regions:, region_placeholder: nil) ⇒ Object

Set up region handling for this merger instance.

Parameters:

  • regions (Array<Hash>)

    Array of region configurations

  • region_placeholder (String, nil) (defaults to: nil)

    Custom placeholder prefix (optional)

Raises:

  • (ArgumentError)

    if regions configuration is invalid



95
96
97
98
99
100
# File 'lib/ast/merge/detector/mergeable.rb', line 95

def setup_regions(regions:, region_placeholder: nil)
  @region_configs = build_region_configs(regions)
  @region_placeholder_prefix = region_placeholder || DEFAULT_PLACEHOLDER_PREFIX
  @extracted_template_regions = []
  @extracted_dest_regions = []
end

#substitute_merged_regions(merged_content) ⇒ String

Merge extracted regions and substitute them back into the merged content.

Parameters:

  • merged_content (String)

    The merged content with placeholders

Returns:

  • (String)

    Content with placeholders replaced by merged regions



143
144
145
146
147
148
149
150
151
# File 'lib/ast/merge/detector/mergeable.rb', line 143

def substitute_merged_regions(merged_content)
  return merged_content unless regions_configured?

  result = merged_content

  # Process regions in reverse order of extraction to handle nested placeholders
  # We need to merge template and dest regions by their placeholder index
  merge_and_substitute_regions(result)
end