Class: Uniword::Assembly::VariableSubstitutor

Inherits:
Object
  • Object
show all
Defined in:
lib/uniword/assembly/variable_substitutor.rb

Overview

Performs variable substitution in document text.

Responsibility: Replace variable placeholders with values. Single Responsibility: Only handles text substitution.

The VariableSubstitutor:

  • Finds variable placeholders in text

  • Replaces with provided values

  • Supports nested variables (e.g., docdoc.title)

  • Type-safe substitution with validation

  • Preserves formatting during substitution

Examples:

Basic substitution

sub = VariableSubstitutor.new({ title: "My Doc" })
result = sub.substitute("Title: {title}")
# => "Title: My Doc"

Document substitution

sub = VariableSubstitutor.new(variables)
sub.substitute_document(document)

Constant Summary collapse

VARIABLE_PATTERN =

Pattern to match variable placeholders

/\{([a-zA-Z0-9_.]+)\}/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(variables = {}) ⇒ VariableSubstitutor

Initialize substitutor with variables.

Examples:

Create substitutor

sub = VariableSubstitutor.new({
  title: "ISO 8601",
  date: "2026-01-15"
})

Parameters:

  • variables (Hash) (defaults to: {})

    Variable name to value mapping



41
42
43
# File 'lib/uniword/assembly/variable_substitutor.rb', line 41

def initialize(variables = {})
  @variables = normalize_variables(variables)
end

Instance Attribute Details

#variablesHash (readonly)

Returns Variables for substitution.

Returns:

  • (Hash)

    Variables for substitution



27
28
29
# File 'lib/uniword/assembly/variable_substitutor.rb', line 27

def variables
  @variables
end

Instance Method Details

#get_variable(name) ⇒ Object?

Get variable value.

Parameters:

  • name (String, Symbol)

    Variable name

Returns:

  • (Object, nil)

    Variable value



92
93
94
# File 'lib/uniword/assembly/variable_substitutor.rb', line 92

def get_variable(name)
  resolve_variable_path(normalize_key(name))
end

#set_variable(name, value) ⇒ void

This method returns an undefined value.

Add or update variable.

Examples:

Set variable

sub.set_variable(:author, "John Doe")

Parameters:

  • name (String, Symbol)

    Variable name

  • value (Object)

    Variable value



84
85
86
# File 'lib/uniword/assembly/variable_substitutor.rb', line 84

def set_variable(name, value)
  @variables[normalize_key(name)] = value
end

#substitute(text) ⇒ String

Substitute variables in text.

Examples:

Substitute in text

result = sub.substitute("Title: {title}, Date: {date}")

Parameters:

  • text (String)

    Text with variable placeholders

Returns:

  • (String)

    Text with variables replaced



52
53
54
55
56
57
58
59
# File 'lib/uniword/assembly/variable_substitutor.rb', line 52

def substitute(text)
  return text unless text.is_a?(String)

  text.gsub(VARIABLE_PATTERN) do |_match|
    var_name = ::Regexp.last_match(1)
    resolve_variable(var_name)
  end
end

#substitute_document(document) ⇒ Document

Substitute variables in document.

Examples:

Process document

sub.substitute_document(document)

Parameters:

  • document (Document)

    Document to process

Returns:

  • (Document)

    Document with substituted text



68
69
70
71
72
73
74
# File 'lib/uniword/assembly/variable_substitutor.rb', line 68

def substitute_document(document)
  document.paragraphs.each do |paragraph|
    substitute_paragraph(paragraph)
  end

  document
end

#variable?(name) ⇒ Boolean

Check if variable is defined.

Parameters:

  • name (String, Symbol)

    Variable name

Returns:

  • (Boolean)

    True if variable exists



100
101
102
103
# File 'lib/uniword/assembly/variable_substitutor.rb', line 100

def variable?(name)
  key = normalize_key(name)
  resolve_variable_path(key) != nil
end

#variable_namesArray<String>

List all variables.

Returns:

  • (Array<String>)

    Variable names



108
109
110
# File 'lib/uniword/assembly/variable_substitutor.rb', line 108

def variable_names
  collect_all_keys(@variables)
end