Class: Uniword::Wordprocessingml::NumberingConfiguration

Inherits:
Lutaml::Model::Serializable
  • Object
show all
Defined in:
lib/uniword/wordprocessingml/numbering_configuration.rb

Overview

Document-level numbering configuration manager Manages abstract numbering definitions and concrete instances

Represents <w:numbering> element containing abstractNum and num children

Instance Method Summary collapse

Constructor Details

#initialize(attributes = {}) ⇒ NumberingConfiguration

Returns a new instance of NumberingConfiguration.



52
53
54
55
56
57
58
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 52

def initialize(attributes = {})
  super
  @definitions ||= []
  @instances ||= []
  @next_abstract_num_id = 0
  @next_num_id = 1
end

Instance Method Details

#add_definition(definition = nil, **attrs) ⇒ Object

Add a numbering definition



61
62
63
64
65
66
67
68
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 61

def add_definition(definition = nil, **attrs)
  defn = definition || NumberingDefinition.new(**attrs)

  defn.abstract_num_id = next_abstract_num_id unless defn.abstract_num_id

  definitions << defn
  defn
end

#add_instance(abstract_num_id:, num_id: nil) ⇒ Object

Add a numbering instance



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 71

def add_instance(abstract_num_id:, num_id: nil)
  instance_num_id = num_id || next_num_id

  # abstract_num_id may be passed as integer; wrap in AbstractNumId if needed
  abstract_num = if abstract_num_id.is_a?(AbstractNumId)
                   abstract_num_id
                 elsif abstract_num_id.is_a?(Integer)
                   AbstractNumId.new(val: abstract_num_id)
                 else
                   abstract_num_id
                 end

  instance = NumberingInstance.new(
    num_id: instance_num_id,
    abstract_num_id: abstract_num
  )

  instances << instance
  instance
end

#create_numbering(type = :decimal) ⇒ Object

Create a complete numbering (definition + instance)



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 93

def create_numbering(type = :decimal, **)
  # Create the definition
  definition = case type
               when :decimal
                 NumberingDefinition.decimal(
                   abstract_num_id: next_abstract_num_id,
                   **
                 )
               when :bullet
                 NumberingDefinition.bullet(
                   abstract_num_id: next_abstract_num_id,
                   **
                 )
               when :roman
                 NumberingDefinition.roman(
                   abstract_num_id: next_abstract_num_id,
                   **
                 )
               when :letter
                 NumberingDefinition.letter(
                   abstract_num_id: next_abstract_num_id,
                   **
                 )
               else
                 raise ArgumentError, "Unknown numbering type: #{type}"
               end

  add_definition(definition)

  # Create instance for this definition
  instance = add_instance(abstract_num_id: definition.abstract_num_id)

  instance.num_id
end

#default_bullet_num_idObject

Get default bullet numbering (create if not exists)



158
159
160
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 158

def default_bullet_num_id
  @default_bullet_num_id ||= create_numbering(:bullet, name: "Default Bullet")
end

#default_decimal_num_idObject

Get default decimal numbering (create if not exists)



153
154
155
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 153

def default_decimal_num_id
  @default_decimal_num_id ||= create_numbering(:decimal, name: "Default Decimal")
end

#get_definition(abstract_num_id) ⇒ Object

Get a definition by abstract_num_id (accepts Integer or AbstractNumId)



129
130
131
132
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 129

def get_definition(abstract_num_id)
  target_id = abstract_num_id.respond_to?(:val) ? abstract_num_id.val : abstract_num_id
  definitions.find { |d| d.abstract_num_id == target_id }
end

#get_definition_for_num_id(num_id) ⇒ Object

Get definition for a given num_id



140
141
142
143
144
145
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 140

def get_definition_for_num_id(num_id)
  instance = get_instance(num_id)
  return nil unless instance

  get_definition(instance.abstract_num_id)
end

#get_instance(num_id) ⇒ Object

Get an instance by num_id



135
136
137
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 135

def get_instance(num_id)
  instances.find { |i| i.num_id == num_id }
end

#has_numbering?Boolean

Check if configuration has any numbering

Returns:

  • (Boolean)


148
149
150
# File 'lib/uniword/wordprocessingml/numbering_configuration.rb', line 148

def has_numbering?
  definitions.any? || instances.any?
end