Class: Uniword::Wordprocessingml::NumberingDefinition

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

Overview

Represents an abstract numbering definition with up to 9 levels (0-8) This is the template that NumberingInstance references

Represents <w:abstractNum w:abstractNumId=“…”> element

Constant Summary collapse

MAX_LEVELS =
9

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attrs = {}) ⇒ NumberingDefinition

Returns a new instance of NumberingDefinition.



41
42
43
44
45
# File 'lib/uniword/wordprocessingml/numbering_definition.rb', line 41

def initialize(attrs = {})
  super
  @levels ||= []
  validate_levels
end

Class Method Details

.bullet(abstract_num_id:, name: "Bullet", character: "\u2022") ⇒ Object

Create a bullet numbering definition



92
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
# File 'lib/uniword/wordprocessingml/numbering_definition.rb', line 92

def self.bullet(abstract_num_id:, name: "Bullet", character: "\u2022")
  new(abstract_num_id: abstract_num_id, name: name).tap do |defn|
    9.times do |i|
      level_char = case i % 3
                   when 0 then character
                   when 1 then "\u25CB" # hollow circle
                   else "\u25A0" # square
                   end

      defn.add_level(
        ilvl: i,
        start: Uniword::Wordprocessingml::Start.new(val: 1),
        numFmt: Uniword::Wordprocessingml::NumFmt.new(val: "bullet"),
        lvlText: Uniword::Wordprocessingml::LvlText.new(val: level_char),
        lvlJc: Uniword::Wordprocessingml::LvlJc.new(val: "left"),
        ind: Uniword::Wordprocessingml::Ind.new(
          left: (720 * (i + 1)).to_s, hanging: "360",
        ),
        rPr: Uniword::Wordprocessingml::RunProperties.new(
          fonts: Properties::RunFonts.new(ascii: "Symbol",
                                          h_ansi: "Symbol", hint: "default"),
        ),
      )
    end
  end
end

.decimal(abstract_num_id:, name: "Decimal") ⇒ Object

Create a simple decimal numbering definition



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/uniword/wordprocessingml/numbering_definition.rb', line 75

def self.decimal(abstract_num_id:, name: "Decimal")
  new(abstract_num_id: abstract_num_id, name: name).tap do |defn|
    9.times do |i|
      defn.add_level(
        ilvl: i,
        start: Uniword::Wordprocessingml::Start.new(val: 1),
        numFmt: Uniword::Wordprocessingml::NumFmt.new(val: "decimal"),
        lvlJc: Uniword::Wordprocessingml::LvlJc.new(val: "left"),
        ind: Uniword::Wordprocessingml::Ind.new(
          left: (720 * (i + 1)).to_s, hanging: "360",
        ),
      )
    end
  end
end

.letter(abstract_num_id:, name: "Letter", upper: true) ⇒ Object

Create a letter numbering definition



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/uniword/wordprocessingml/numbering_definition.rb', line 138

def self.letter(abstract_num_id:, name: "Letter", upper: true)
  format = upper ? "upperLetter" : "lowerLetter"
  new(abstract_num_id: abstract_num_id, name: name).tap do |defn|
    9.times do |i|
      defn.add_level(
        ilvl: i,
        start: Uniword::Wordprocessingml::Start.new(val: 1),
        numFmt: Uniword::Wordprocessingml::NumFmt.new(val: format),
        lvlJc: Uniword::Wordprocessingml::LvlJc.new(val: "left"),
        ind: Uniword::Wordprocessingml::Ind.new(
          left: (720 * (i + 1)).to_s, hanging: "360",
        ),
      )
    end
  end
end

.roman(abstract_num_id:, name: "Roman", upper: true) ⇒ Object

Create a roman numeral numbering definition



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/uniword/wordprocessingml/numbering_definition.rb', line 120

def self.roman(abstract_num_id:, name: "Roman", upper: true)
  format = upper ? "upperRoman" : "lowerRoman"
  new(abstract_num_id: abstract_num_id, name: name).tap do |defn|
    9.times do |i|
      defn.add_level(
        ilvl: i,
        start: Uniword::Wordprocessingml::Start.new(val: 1),
        numFmt: Uniword::Wordprocessingml::NumFmt.new(val: format),
        lvlJc: Uniword::Wordprocessingml::LvlJc.new(val: "left"),
        ind: Uniword::Wordprocessingml::Ind.new(
          left: (720 * (i + 1)).to_s, hanging: "360",
        ),
      )
    end
  end
end

Instance Method Details

#add_level(level_obj = nil, **level_attrs) ⇒ Object

Add a level to this definition



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/uniword/wordprocessingml/numbering_definition.rb', line 48

def add_level(level_obj = nil, **level_attrs)
  if levels.size >= MAX_LEVELS
    raise ArgumentError,
          "Cannot add more than #{MAX_LEVELS} levels"
  end

  # Auto-assign level index based on position in array
  level_index = levels.size

  if level_obj
    level = level_obj
    level.ilvl = level_index
  else
    level_attrs[:ilvl] = level_index unless level_attrs.key?(:ilvl)
    level = Level.new(**level_attrs)
  end

  levels << level
  level
end

#level(index) ⇒ Object

Get a specific level by index



70
71
72
# File 'lib/uniword/wordprocessingml/numbering_definition.rb', line 70

def level(index)
  levels[index]
end