xlsxrb 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer/Dockerfile +1 -1
  3. data/.gem_rbs_collection/ast/2.4/.rbs_meta.yaml +9 -0
  4. data/.gem_rbs_collection/ast/2.4/ast.rbs +73 -0
  5. data/.gem_rbs_collection/concurrent-ruby/1.1/.rbs_meta.yaml +9 -0
  6. data/.gem_rbs_collection/concurrent-ruby/1.1/array.rbs +4 -0
  7. data/.gem_rbs_collection/concurrent-ruby/1.1/atomic_reference.rbs +16 -0
  8. data/.gem_rbs_collection/concurrent-ruby/1.1/executor.rbs +96 -0
  9. data/.gem_rbs_collection/concurrent-ruby/1.1/hash.rbs +4 -0
  10. data/.gem_rbs_collection/concurrent-ruby/1.1/map.rbs +68 -0
  11. data/.gem_rbs_collection/concurrent-ruby/1.1/promises.rbs +249 -0
  12. data/.gem_rbs_collection/concurrent-ruby/1.1/set.rbs +4 -0
  13. data/.gem_rbs_collection/concurrent-ruby/1.1/timer_task.rbs +47 -0
  14. data/.gem_rbs_collection/concurrent-ruby/1.1/utility/processor_counter.rbs +5 -0
  15. data/.gem_rbs_collection/csv/3.3/.rbs_meta.yaml +9 -0
  16. data/.gem_rbs_collection/csv/3.3/csv.rbs +3871 -0
  17. data/.gem_rbs_collection/csv/3.3/manifest.yaml +3 -0
  18. data/.gem_rbs_collection/lint_roller/1.1/.rbs_meta.yaml +9 -0
  19. data/.gem_rbs_collection/lint_roller/1.1/lint_roller.rbs +48 -0
  20. data/.gem_rbs_collection/listen/3.9/.rbs_meta.yaml +9 -0
  21. data/.gem_rbs_collection/listen/3.9/listen.rbs +25 -0
  22. data/.gem_rbs_collection/listen/3.9/listener.rbs +24 -0
  23. data/.gem_rbs_collection/logger/1.7/.rbs_meta.yaml +9 -0
  24. data/.gem_rbs_collection/logger/1.7/formatter.rbs +45 -0
  25. data/.gem_rbs_collection/logger/1.7/log_device.rbs +100 -0
  26. data/.gem_rbs_collection/logger/1.7/logger.rbs +796 -0
  27. data/.gem_rbs_collection/logger/1.7/manifest.yaml +2 -0
  28. data/.gem_rbs_collection/logger/1.7/period.rbs +17 -0
  29. data/.gem_rbs_collection/logger/1.7/severity.rbs +34 -0
  30. data/.gem_rbs_collection/nokogiri/1.11/.rbs_meta.yaml +9 -0
  31. data/.gem_rbs_collection/nokogiri/1.11/nokogiri.rbs +2332 -0
  32. data/.gem_rbs_collection/nokogiri/1.11/patch.rbs +4 -0
  33. data/.gem_rbs_collection/parallel/1.20/.rbs_meta.yaml +9 -0
  34. data/.gem_rbs_collection/parallel/1.20/parallel.rbs +86 -0
  35. data/.gem_rbs_collection/parser/3.2/.rbs_meta.yaml +9 -0
  36. data/.gem_rbs_collection/parser/3.2/manifest.yaml +7 -0
  37. data/.gem_rbs_collection/parser/3.2/parser.rbs +194 -0
  38. data/.gem_rbs_collection/parser/3.2/polyfill.rbs +4 -0
  39. data/.gem_rbs_collection/rainbow/3.0/.rbs_meta.yaml +9 -0
  40. data/.gem_rbs_collection/rainbow/3.0/global.rbs +7 -0
  41. data/.gem_rbs_collection/rainbow/3.0/presenter.rbs +209 -0
  42. data/.gem_rbs_collection/rainbow/3.0/rainbow.rbs +5 -0
  43. data/.gem_rbs_collection/rake/13.0/.rbs_meta.yaml +9 -0
  44. data/.gem_rbs_collection/rake/13.0/manifest.yaml +2 -0
  45. data/.gem_rbs_collection/rake/13.0/rake.rbs +39 -0
  46. data/.gem_rbs_collection/regexp_parser/2.8/.rbs_meta.yaml +9 -0
  47. data/.gem_rbs_collection/regexp_parser/2.8/regexp_parser.rbs +17 -0
  48. data/.gem_rbs_collection/rubocop/1.57/.rbs_meta.yaml +9 -0
  49. data/.gem_rbs_collection/rubocop/1.57/rubocop.rbs +208 -0
  50. data/.gem_rbs_collection/rubocop-ast/1.46/.rbs_meta.yaml +9 -0
  51. data/.gem_rbs_collection/rubocop-ast/1.46/rubocop-ast.rbs +903 -0
  52. data/.gem_rbs_collection/rubyzip/3.2/.rbs_meta.yaml +9 -0
  53. data/.gem_rbs_collection/rubyzip/3.2/manifest.yaml +8 -0
  54. data/.gem_rbs_collection/rubyzip/3.2/zip/central_directory.rbs +42 -0
  55. data/.gem_rbs_collection/rubyzip/3.2/zip/compressor.rbs +5 -0
  56. data/.gem_rbs_collection/rubyzip/3.2/zip/constants.rbs +47 -0
  57. data/.gem_rbs_collection/rubyzip/3.2/zip/crypto/aes_encryption.rbs +30 -0
  58. data/.gem_rbs_collection/rubyzip/3.2/zip/crypto/decrypted_io.rbs +9 -0
  59. data/.gem_rbs_collection/rubyzip/3.2/zip/crypto/encryption.rbs +7 -0
  60. data/.gem_rbs_collection/rubyzip/3.2/zip/crypto/null_encryption.rbs +19 -0
  61. data/.gem_rbs_collection/rubyzip/3.2/zip/crypto/traditional_encryption.rbs +31 -0
  62. data/.gem_rbs_collection/rubyzip/3.2/zip/decompressor.rbs +18 -0
  63. data/.gem_rbs_collection/rubyzip/3.2/zip/deflater.rbs +12 -0
  64. data/.gem_rbs_collection/rubyzip/3.2/zip/dirtyable.rbs +11 -0
  65. data/.gem_rbs_collection/rubyzip/3.2/zip/dos_time.rbs +13 -0
  66. data/.gem_rbs_collection/rubyzip/3.2/zip/entry.rbs +95 -0
  67. data/.gem_rbs_collection/rubyzip/3.2/zip/entry_set.rbs +31 -0
  68. data/.gem_rbs_collection/rubyzip/3.2/zip/errors.rbs +58 -0
  69. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field/aes.rbs +24 -0
  70. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field/generic.rbs +17 -0
  71. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field/ntfs.rbs +23 -0
  72. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field/old_unix.rbs +22 -0
  73. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field/universal_time.rbs +30 -0
  74. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field/unix.rbs +20 -0
  75. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field/unknown.rbs +15 -0
  76. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field/zip64.rbs +26 -0
  77. data/.gem_rbs_collection/rubyzip/3.2/zip/extra_field.rbs +21 -0
  78. data/.gem_rbs_collection/rubyzip/3.2/zip/file.rbs +131 -0
  79. data/.gem_rbs_collection/rubyzip/3.2/zip/file_split.rbs +14 -0
  80. data/.gem_rbs_collection/rubyzip/3.2/zip/filesystem/dir.rbs +33 -0
  81. data/.gem_rbs_collection/rubyzip/3.2/zip/filesystem/directory_iterator.rbs +21 -0
  82. data/.gem_rbs_collection/rubyzip/3.2/zip/filesystem/file.rbs +63 -0
  83. data/.gem_rbs_collection/rubyzip/3.2/zip/filesystem/file_stat.rbs +55 -0
  84. data/.gem_rbs_collection/rubyzip/3.2/zip/filesystem/zip_file_name_mapper.rbs +35 -0
  85. data/.gem_rbs_collection/rubyzip/3.2/zip/filesystem.rbs +7 -0
  86. data/.gem_rbs_collection/rubyzip/3.2/zip/inflater.rbs +10 -0
  87. data/.gem_rbs_collection/rubyzip/3.2/zip/input_stream.rbs +22 -0
  88. data/.gem_rbs_collection/rubyzip/3.2/zip/ioextras/abstract_input_stream.rbs +29 -0
  89. data/.gem_rbs_collection/rubyzip/3.2/zip/ioextras/abstract_output_stream.rbs +17 -0
  90. data/.gem_rbs_collection/rubyzip/3.2/zip/ioextras.rbs +13 -0
  91. data/.gem_rbs_collection/rubyzip/3.2/zip/null_compressor.rbs +10 -0
  92. data/.gem_rbs_collection/rubyzip/3.2/zip/null_decompressor.rbs +8 -0
  93. data/.gem_rbs_collection/rubyzip/3.2/zip/null_input_stream.rbs +6 -0
  94. data/.gem_rbs_collection/rubyzip/3.2/zip/output_stream.rbs +30 -0
  95. data/.gem_rbs_collection/rubyzip/3.2/zip/pass_thru_compressor.rbs +10 -0
  96. data/.gem_rbs_collection/rubyzip/3.2/zip/pass_thru_decompressor.rbs +10 -0
  97. data/.gem_rbs_collection/rubyzip/3.2/zip/streamable_directory.rbs +5 -0
  98. data/.gem_rbs_collection/rubyzip/3.2/zip/streamable_stream.rbs +15 -0
  99. data/.gem_rbs_collection/rubyzip/3.2/zip/version.rbs +3 -0
  100. data/.gem_rbs_collection/rubyzip/3.2/zip.rbs +40 -0
  101. data/CHANGELOG.md +42 -3
  102. data/README.md +130 -49
  103. data/Rakefile +23 -2
  104. data/Steepfile +17 -0
  105. data/benchmark.rb +324 -348
  106. data/docs/ARCHITECTURE.md +24 -0
  107. data/docs/DEVELOPMENT.md +58 -0
  108. data/docs/QUALITY_ASSURANCE.md +26 -0
  109. data/docs/visual/VisualGallery.md +893 -938
  110. data/docs/wasm/ruby.wasm +0 -0
  111. data/lib/xlsxrb/elements/cell.rb +113 -8
  112. data/lib/xlsxrb/elements/column.rb +2 -0
  113. data/lib/xlsxrb/elements/row.rb +52 -4
  114. data/lib/xlsxrb/elements/types.rb +6 -0
  115. data/lib/xlsxrb/elements/workbook.rb +29 -0
  116. data/lib/xlsxrb/elements/worksheet.rb +98 -1
  117. data/lib/xlsxrb/elements.rb +2 -0
  118. data/lib/xlsxrb/ooxml/reader.rb +8 -6
  119. data/lib/xlsxrb/ooxml/shared_strings_parser.rb +106 -40
  120. data/lib/xlsxrb/ooxml/styles_parser.rb +2 -0
  121. data/lib/xlsxrb/ooxml/utils.rb +2 -0
  122. data/lib/xlsxrb/ooxml/workbook_parser.rb +6 -1
  123. data/lib/xlsxrb/ooxml/workbook_writer.rb +15 -4
  124. data/lib/xlsxrb/ooxml/worksheet_parser.rb +156 -23
  125. data/lib/xlsxrb/ooxml/worksheet_writer.rb +207 -152
  126. data/lib/xlsxrb/ooxml/writer.rb +217 -5
  127. data/lib/xlsxrb/ooxml/xml_builder.rb +18 -10
  128. data/lib/xlsxrb/ooxml/xml_parser.rb +2 -0
  129. data/lib/xlsxrb/ooxml/zip_generator.rb +5 -8
  130. data/lib/xlsxrb/ooxml/zip_reader.rb +179 -57
  131. data/lib/xlsxrb/ooxml/zip_writer.rb +65 -25
  132. data/lib/xlsxrb/ooxml.rb +3 -1
  133. data/lib/xlsxrb/style_builder.rb +284 -36
  134. data/lib/xlsxrb/version.rb +3 -1
  135. data/lib/xlsxrb.rb +1761 -275
  136. data/rbs_collection.lock.yaml +252 -0
  137. data/rbs_collection.yaml +19 -0
  138. data/sig/generated/xlsxrb/elements/cell.rbs +30 -0
  139. data/sig/generated/xlsxrb/elements/column.rbs +30 -0
  140. data/sig/generated/xlsxrb/elements/row.rbs +32 -0
  141. data/sig/generated/xlsxrb/elements/types.rbs +74 -0
  142. data/sig/generated/xlsxrb/elements/workbook.rbs +25 -0
  143. data/sig/generated/xlsxrb/elements/worksheet.rbs +27 -0
  144. data/sig/generated/xlsxrb/elements.rbs +8 -0
  145. data/sig/generated/xlsxrb/ooxml/reader.rbs +1412 -0
  146. data/sig/generated/xlsxrb/ooxml/shared_strings_parser.rbs +21 -0
  147. data/sig/generated/xlsxrb/ooxml/styles_parser.rbs +44 -0
  148. data/sig/generated/xlsxrb/ooxml/utils.rbs +40 -0
  149. data/sig/generated/xlsxrb/ooxml/workbook_parser.rbs +46 -0
  150. data/sig/generated/xlsxrb/ooxml/workbook_writer.rbs +66 -0
  151. data/sig/generated/xlsxrb/ooxml/worksheet_parser.rbs +67 -0
  152. data/sig/generated/xlsxrb/ooxml/worksheet_writer.rbs +92 -0
  153. data/sig/generated/xlsxrb/ooxml/writer.rbs +880 -0
  154. data/sig/generated/xlsxrb/ooxml/xml_builder.rbs +45 -0
  155. data/sig/generated/xlsxrb/ooxml/xml_parser.rbs +30 -0
  156. data/sig/generated/xlsxrb/ooxml/zip_generator.rbs +38 -0
  157. data/sig/generated/xlsxrb/ooxml/zip_reader.rbs +45 -0
  158. data/sig/generated/xlsxrb/ooxml/zip_writer.rbs +45 -0
  159. data/sig/generated/xlsxrb/ooxml.rbs +23 -0
  160. data/sig/generated/xlsxrb/style_builder.rbs +250 -0
  161. data/sig/generated/xlsxrb/version.rbs +5 -0
  162. data/sig/generated/xlsxrb.rbs +1276 -0
  163. data/sig/rexml.rbs +4 -0
  164. metadata +145 -4
  165. data/measure_memory.rb +0 -42
  166. data/sig/xlsxrb.rbs +0 -23
@@ -1,9 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Xlsxrb
4
6
  # Helper class for building cell styles with a fluent DSL.
5
7
  # Encapsulates font, fill, border, alignment, and number format properties.
8
+ # @api public
6
9
  class StyleBuilder
10
+ COLORS = {
11
+ black: "FF000000",
12
+ white: "FFFFFFFF",
13
+ red: "FFFF0000",
14
+ green: "FF00FF00",
15
+ blue: "FF0000FF",
16
+ yellow: "FFFFFF00",
17
+ cyan: "FF00FFFF",
18
+ magenta: "FFFF00FF",
19
+ gray: "FF808080",
20
+ grey: "FF808080"
21
+ }.freeze
22
+
23
+ def resolve_color(color)
24
+ return nil unless color
25
+
26
+ if color.is_a?(Symbol) || (color.is_a?(String) && color.start_with?(":") && color.length > 1)
27
+ key = color.to_s.sub(/^:/, "").to_sym
28
+ return COLORS[key] || color.to_s
29
+ end
30
+ color.to_s
31
+ end
32
+
33
+ #: (?String? name) -> void
7
34
  def initialize(name = nil)
8
35
  @name = name
9
36
  @font_props = {}
@@ -17,83 +44,190 @@ module Xlsxrb
17
44
 
18
45
  # Applies option-style definitions so callers can use add_style(name, **opts)
19
46
  # as an alternative to block-based fluent chaining.
47
+ # Applies option-style definitions so callers can use add_style(name, **opts)
48
+ # as an alternative to block-based fluent chaining.
49
+ # @param opts [Hash] The styling options.
50
+ # @return [self]
51
+ # @api public
52
+ #: (**untyped) -> self
20
53
  def apply_options!(**opts)
21
- bold(opts[:bold]) if opts.key?(:bold)
22
- italic(opts[:italic]) if opts.key?(:italic)
23
- size(opts[:size]) if opts.key?(:size)
24
- font_name(opts[:font_name]) if opts.key?(:font_name)
25
- font_color(opts[:font_color]) if opts.key?(:font_color)
26
- underline(opts[:underline]) if opts.key?(:underline)
27
- strike(opts[:strike]) if opts.key?(:strike)
28
- vert_align(opts[:vert_align]) if opts.key?(:vert_align)
54
+ if opts.key?(:font)
55
+ font_opts = opts[:font] || {}
56
+ bold(font_opts[:bold]) if font_opts.key?(:bold)
57
+ italic(font_opts[:italic]) if font_opts.key?(:italic)
58
+ size(font_opts[:size]) if font_opts.key?(:size)
59
+ font_name(font_opts[:name]) if font_opts.key?(:name)
60
+ font_color(font_opts[:color]) if font_opts.key?(:color)
61
+ underline(font_opts[:underline]) if font_opts.key?(:underline)
62
+ strike(font_opts[:strike]) if font_opts.key?(:strike)
63
+ vert_align(font_opts[:vert_align]) if font_opts.key?(:vert_align)
64
+ else
65
+ bold(opts[:bold]) if opts.key?(:bold)
66
+ italic(opts[:italic]) if opts.key?(:italic)
67
+ size(opts[:size]) if opts.key?(:size)
68
+ font_name(opts[:font_name]) if opts.key?(:font_name)
69
+ font_color(opts[:font_color]) if opts.key?(:font_color)
70
+ underline(opts[:underline]) if opts.key?(:underline)
71
+ strike(opts[:strike]) if opts.key?(:strike)
72
+ vert_align(opts[:vert_align]) if opts.key?(:vert_align)
73
+ end
29
74
 
30
- fill_color(opts[:fill_color]) if opts.key?(:fill_color)
31
- if opts.key?(:fill_pattern)
32
- pattern = opts[:fill_pattern] || {}
33
- fill_pattern(
34
- pattern[:pattern] || "solid",
35
- fg_color: pattern[:fg_color],
36
- bg_color: pattern[:bg_color]
37
- )
75
+ if opts.key?(:fill)
76
+ fill_opts = opts[:fill] || {}
77
+ if fill_opts.key?(:color)
78
+ fill_color(fill_opts[:color])
79
+ else
80
+ fill_pattern(
81
+ fill_opts[:pattern] || "solid",
82
+ fg_color: fill_opts[:fg_color],
83
+ bg_color: fill_opts[:bg_color]
84
+ )
85
+ end
86
+ else
87
+ fill_color(opts[:fill_color]) if opts.key?(:fill_color)
88
+ if opts.key?(:fill_pattern)
89
+ pattern = opts[:fill_pattern] || {}
90
+ fill_pattern(
91
+ pattern[:pattern] || "solid",
92
+ fg_color: pattern[:fg_color],
93
+ bg_color: pattern[:bg_color]
94
+ )
95
+ end
38
96
  end
39
97
  fill_gradient(**opts[:fill_gradient]) if opts.key?(:fill_gradient) && opts[:fill_gradient]
40
98
 
41
- border_all(**opts[:border_all]) if opts.key?(:border_all) && opts[:border_all]
42
- border_left(**opts[:border_left]) if opts.key?(:border_left) && opts[:border_left]
43
- border_right(**opts[:border_right]) if opts.key?(:border_right) && opts[:border_right]
44
- border_top(**opts[:border_top]) if opts.key?(:border_top) && opts[:border_top]
45
- border_bottom(**opts[:border_bottom]) if opts.key?(:border_bottom) && opts[:border_bottom]
99
+ if opts.key?(:border)
100
+ border_opts = opts[:border] || {}
101
+ border_all(**border_opts[:all]) if border_opts.key?(:all) && border_opts[:all]
102
+ border_left(**border_opts[:left]) if border_opts.key?(:left) && border_opts[:left]
103
+ border_right(**border_opts[:right]) if border_opts.key?(:right) && border_opts[:right]
104
+ border_top(**border_opts[:top]) if border_opts.key?(:top) && border_opts[:top]
105
+ border_bottom(**border_opts[:bottom]) if border_opts.key?(:bottom) && border_opts[:bottom]
106
+ else
107
+ border_all(**opts[:border_all]) if opts.key?(:border_all) && opts[:border_all]
108
+ border_left(**opts[:border_left]) if opts.key?(:border_left) && opts[:border_left]
109
+ border_right(**opts[:border_right]) if opts.key?(:border_right) && opts[:border_right]
110
+ border_top(**opts[:border_top]) if opts.key?(:border_top) && opts[:border_top]
111
+ border_bottom(**opts[:border_bottom]) if opts.key?(:border_bottom) && opts[:border_bottom]
112
+ end
46
113
 
47
114
  number_format(opts[:number_format]) if opts.key?(:number_format)
48
115
 
49
- align_horizontal(opts[:align_horizontal]) if opts.key?(:align_horizontal)
50
- align_vertical(opts[:align_vertical]) if opts.key?(:align_vertical)
51
- wrap_text(opts[:wrap_text]) if opts.key?(:wrap_text)
52
- text_rotation(opts[:text_rotation]) if opts.key?(:text_rotation)
53
- indent(opts[:indent]) if opts.key?(:indent)
54
- shrink_to_fit(opts[:shrink_to_fit]) if opts.key?(:shrink_to_fit)
116
+ if opts.key?(:alignment)
117
+ align_opts = opts[:alignment] || {}
118
+ align_horizontal(align_opts[:horizontal]) if align_opts.key?(:horizontal)
119
+ align_vertical(align_opts[:vertical]) if align_opts.key?(:vertical)
120
+ wrap_text(align_opts[:wrap_text]) if align_opts.key?(:wrap_text)
121
+ text_rotation(align_opts[:text_rotation]) if align_opts.key?(:text_rotation)
122
+ indent(align_opts[:indent]) if align_opts.key?(:indent)
123
+ shrink_to_fit(align_opts[:shrink_to_fit]) if align_opts.key?(:shrink_to_fit)
124
+ else
125
+ align_horizontal(opts[:align_horizontal]) if opts.key?(:align_horizontal)
126
+ align_vertical(opts[:align_vertical]) if opts.key?(:align_vertical)
127
+ wrap_text(opts[:wrap_text]) if opts.key?(:wrap_text)
128
+ text_rotation(opts[:text_rotation]) if opts.key?(:text_rotation)
129
+ indent(opts[:indent]) if opts.key?(:indent)
130
+ shrink_to_fit(opts[:shrink_to_fit]) if opts.key?(:shrink_to_fit)
131
+ end
55
132
 
56
133
  self
57
134
  end
58
135
 
59
136
  # --- Font Properties ---
60
137
 
138
+ # Configures multiple font properties at once.
139
+ # @param opts [Hash] The font properties.
140
+ # @return [self]
141
+ # @api public
142
+ #: (**untyped) -> self
143
+ def font(**opts)
144
+ bold(opts[:bold]) if opts.key?(:bold)
145
+ italic(opts[:italic]) if opts.key?(:italic)
146
+ size(opts[:size]) if opts.key?(:size)
147
+ font_name(opts[:name]) if opts.key?(:name)
148
+ font_color(opts[:color]) if opts.key?(:color)
149
+ underline(opts[:underline]) if opts.key?(:underline)
150
+ strike(opts[:strike]) if opts.key?(:strike)
151
+ vert_align(opts[:vert_align]) if opts.key?(:vert_align)
152
+ self
153
+ end
154
+
61
155
  # rubocop:disable Style/OptionalBooleanParameter
156
+ # Sets the font to bold.
157
+ # @param value [Boolean] Whether to apply bold.
158
+ # @return [self]
159
+ # @api public
160
+ #: (?bool) -> self
62
161
  def bold(value = true)
63
162
  @font_props[:bold] = value
64
163
  self
65
164
  end
66
165
 
166
+ # Sets the font to italic.
167
+ # @param value [Boolean] Whether to apply italic.
168
+ # @return [self]
169
+ # @api public
170
+ #: (?bool) -> self
67
171
  def italic(value = true)
68
172
  @font_props[:italic] = value
69
173
  self
70
174
  end
71
175
 
176
+ # Sets the font size.
177
+ # @param size_value [Numeric] The size.
178
+ # @return [self]
179
+ # @api public
180
+ #: (Numeric) -> self
72
181
  def size(size_value)
73
182
  @font_props[:sz] = size_value.to_i
74
183
  self
75
184
  end
76
185
 
186
+ # Sets the font name.
187
+ # @param name [String] The font name.
188
+ # @return [self]
189
+ # @api public
190
+ #: (String) -> self
77
191
  def font_name(name)
78
192
  @font_props[:name] = name
79
193
  self
80
194
  end
81
195
 
196
+ # Sets the font color.
197
+ # @param color [String, Symbol] The color.
198
+ # @return [self]
199
+ # @api public
200
+ #: (String | Symbol) -> self
82
201
  def font_color(color)
83
- @font_props[:color] = color
202
+ @font_props[:color] = resolve_color(color)
84
203
  self
85
204
  end
86
205
 
206
+ # Sets the font underline style.
207
+ # @param val [String] The underline style (e.g., 'single').
208
+ # @return [self]
209
+ # @api public
210
+ #: (?String) -> self
87
211
  def underline(val = "single")
88
212
  @font_props[:underline] = val
89
213
  self
90
214
  end
91
215
 
216
+ # Sets the font strikethrough.
217
+ # @param value [Boolean] Whether to apply strike.
218
+ # @return [self]
219
+ # @api public
220
+ #: (?bool) -> self
92
221
  def strike(value = true)
93
222
  @font_props[:strike] = value
94
223
  self
95
224
  end
96
225
 
226
+ # Sets the vertical alignment of the font.
227
+ # @param value [String] The alignment value.
228
+ # @return [self]
229
+ # @api public
230
+ #: (String) -> self
97
231
  def vert_align(value)
98
232
  @font_props[:vert_align] = value
99
233
  self
@@ -102,6 +236,19 @@ module Xlsxrb
102
236
 
103
237
  # --- Fill Properties ---
104
238
 
239
+ # Sets the fill pattern.
240
+ # @param pattern [String, Symbol] The pattern type.
241
+ # @param fg_color [String, Symbol, nil] The foreground color.
242
+ # @param bg_color [String, Symbol, nil] The background color.
243
+ # @return [self]
244
+ # @api public
245
+ # Configures fill properties.
246
+ # @param pattern [String, Symbol] The pattern type.
247
+ # @param fg_color [String, Symbol, nil] The foreground color.
248
+ # @param bg_color [String, Symbol, nil] The background color.
249
+ # @return [self]
250
+ # @api public
251
+ #: (String | Symbol pattern, ?fg_color: String | Symbol | nil, ?bg_color: String | Symbol | nil) -> self
105
252
  def fill_pattern(pattern, fg_color: nil, bg_color: nil)
106
253
  @fill_props[:pattern] = pattern
107
254
  @fill_props[:fg_color] = fg_color if fg_color
@@ -109,16 +256,29 @@ module Xlsxrb
109
256
  self
110
257
  end
111
258
 
259
+ # Sets a solid fill color.
260
+ # @param color [String, Symbol] The color.
261
+ # @return [self]
262
+ # @api public
263
+ #: (String | Symbol) -> self
112
264
  def fill_color(color)
113
265
  @fill_props[:pattern] = "solid"
114
- @fill_props[:fg_color] = color
266
+ @fill_props[:fg_color] = resolve_color(color)
115
267
  self
116
268
  end
117
269
 
270
+ #: (?pattern: String | Symbol, ?fg_color: String | Symbol | nil, ?bg_color: String | Symbol | nil) -> self
118
271
  def fill(pattern: "solid", fg_color: nil, bg_color: nil)
119
- fill_pattern(pattern, fg_color: fg_color, bg_color: bg_color)
272
+ fill_pattern(pattern, fg_color: resolve_color(fg_color), bg_color: resolve_color(bg_color))
120
273
  end
121
274
 
275
+ # Sets a gradient fill.
276
+ # @param type [String] The gradient type.
277
+ # @param degree [Numeric, nil] The degree.
278
+ # @param stops [Array] The gradient stops.
279
+ # @return [self]
280
+ # @api public
281
+ #: (type: String, ?degree: Numeric | nil, ?stops: Array[untyped]) -> self
122
282
  def fill_gradient(type:, degree: nil, stops: [])
123
283
  @fill_props[:gradient] = {
124
284
  type: type,
@@ -130,8 +290,28 @@ module Xlsxrb
130
290
 
131
291
  # --- Border Properties ---
132
292
 
293
+ # Configures multiple border properties.
294
+ # @param opts [Hash] Border options.
295
+ # @return [self]
296
+ # @api public
297
+ #: (**untyped) -> self
298
+ def border(**opts)
299
+ border_all(**opts[:all]) if opts.key?(:all) && opts[:all]
300
+ border_left(**opts[:left]) if opts.key?(:left) && opts[:left]
301
+ border_right(**opts[:right]) if opts.key?(:right) && opts[:right]
302
+ border_top(**opts[:top]) if opts.key?(:top) && opts[:top]
303
+ border_bottom(**opts[:bottom]) if opts.key?(:bottom) && opts[:bottom]
304
+ self
305
+ end
306
+
307
+ # Sets all borders.
308
+ # @param style [String, Symbol] The border style.
309
+ # @param color [String, Symbol, nil] The color.
310
+ # @return [self]
311
+ # @api public
312
+ #: (?style: String | Symbol, ?color: String | Symbol | nil) -> self
133
313
  def border_all(style: "thin", color: nil)
134
- color_opt = color ? { color: color } : {}
314
+ color_opt = color ? { color: resolve_color(color) } : {}
135
315
  @border_props[:left] = { style: style, **color_opt }
136
316
  @border_props[:right] = { style: style, **color_opt }
137
317
  @border_props[:top] = { style: style, **color_opt }
@@ -139,29 +319,61 @@ module Xlsxrb
139
319
  self
140
320
  end
141
321
 
322
+ # Sets the left border.
323
+ # @param style [String, Symbol] The border style.
324
+ # @param color [String, Symbol, nil] The color.
325
+ # @return [self]
326
+ # @api public
327
+ #: (?style: String | Symbol, ?color: String | Symbol | nil) -> self
142
328
  def border_left(style: "thin", color: nil)
143
- @border_props[:left] = { style: style, color: color }.compact
329
+ @border_props[:left] = { style: style, color: resolve_color(color) }.compact
144
330
  self
145
331
  end
146
332
 
333
+ # Sets the right border.
334
+ # @param style [String, Symbol] The border style.
335
+ # @param color [String, Symbol, nil] The color.
336
+ # @return [self]
337
+ # @api public
338
+ #: (?style: String | Symbol, ?color: String | Symbol | nil) -> self
147
339
  def border_right(style: "thin", color: nil)
148
- @border_props[:right] = { style: style, color: color }.compact
340
+ @border_props[:right] = { style: style, color: resolve_color(color) }.compact
149
341
  self
150
342
  end
151
343
 
344
+ # Sets the top border.
345
+ # @param style [String, Symbol] The border style.
346
+ # @param color [String, Symbol, nil] The color.
347
+ # @return [self]
348
+ # @api public
349
+ #: (?style: String | Symbol, ?color: String | Symbol | nil) -> self
152
350
  def border_top(style: "thin", color: nil)
153
- @border_props[:top] = { style: style, color: color }.compact
351
+ @border_props[:top] = { style: style, color: resolve_color(color) }.compact
154
352
  self
155
353
  end
156
354
 
355
+ # Sets the bottom border.
356
+ # @param style [String, Symbol] The border style.
357
+ # @param color [String, Symbol, nil] The color.
358
+ # @return [self]
359
+ # @api public
360
+ #: (?style: String | Symbol, ?color: String | Symbol | nil) -> self
157
361
  def border_bottom(style: "thin", color: nil)
158
- @border_props[:bottom] = { style: style, color: color }.compact
362
+ @border_props[:bottom] = { style: style, color: resolve_color(color) }.compact
159
363
  self
160
364
  end
161
365
 
162
366
  # rubocop:disable Naming/MethodParameterName
367
+ # Sets diagonal borders.
368
+ # @param style [String, Symbol] The border style.
369
+ # @param color [String, Symbol, nil] The color.
370
+ # @param up [Boolean] Diagonal up.
371
+ # @param down [Boolean] Diagonal down.
372
+ # @return [self]
373
+ # @api public
374
+ #: (?style: String | Symbol, ?color: String | Symbol | nil, ?up: bool, ?down: bool) -> self
163
375
  def border_diagonal(style: "thin", color: nil, up: false, down: false)
164
- @border_props[:diagonal] = { style: style, color: color }.compact
376
+ @border_props[:diagonal] = { style: style, color: resolve_color(color) }.compact
165
377
  @border_props[:diagonal_up] = true if up
166
378
  @border_props[:diagonal_down] = true if down
167
379
  self
@@ -170,33 +382,63 @@ module Xlsxrb
170
382
 
171
383
  # --- Alignment Properties ---
172
384
 
385
+ # Sets horizontal alignment.
386
+ # @param value [String, Symbol] The alignment.
387
+ # @return [self]
388
+ # @api public
389
+ #: (String | Symbol) -> self
173
390
  def align_horizontal(value)
174
391
  @alignment[:horizontal] = value
175
392
  self
176
393
  end
177
394
 
395
+ # Sets vertical alignment.
396
+ # @param value [String, Symbol] The alignment.
397
+ # @return [self]
398
+ # @api public
399
+ #: (String | Symbol) -> self
178
400
  def align_vertical(value)
179
401
  @alignment[:vertical] = value
180
402
  self
181
403
  end
182
404
 
183
405
  # rubocop:disable Style/OptionalBooleanParameter
406
+ # Sets text wrapping.
407
+ # @param value [Boolean] Whether to wrap text.
408
+ # @return [self]
409
+ # @api public
410
+ #: (?bool) -> self
184
411
  def wrap_text(value = true)
185
412
  @alignment[:wrap_text] = value
186
413
  self
187
414
  end
188
415
 
416
+ # Sets shrink to fit.
417
+ # @param value [Boolean] Whether to shrink text.
418
+ # @return [self]
419
+ # @api public
420
+ #: (?bool) -> self
189
421
  def shrink_to_fit(value = true)
190
422
  @alignment[:shrink_to_fit] = value
191
423
  self
192
424
  end
193
425
  # rubocop:enable Style/OptionalBooleanParameter
194
426
 
427
+ # Sets text rotation.
428
+ # @param value [Numeric] The rotation angle.
429
+ # @return [self]
430
+ # @api public
431
+ #: (Numeric) -> self
195
432
  def text_rotation(value)
196
433
  @alignment[:text_rotation] = value
197
434
  self
198
435
  end
199
436
 
437
+ # Sets text indent.
438
+ # @param value [Numeric] The indent level.
439
+ # @return [self]
440
+ # @api public
441
+ #: (Numeric) -> self
200
442
  def indent(value)
201
443
  @alignment[:indent] = value.to_i
202
444
  self
@@ -204,6 +446,11 @@ module Xlsxrb
204
446
 
205
447
  # --- Number Format ---
206
448
 
449
+ # Sets the number format.
450
+ # @param num_fmt_id [String, Integer] The format id or format string.
451
+ # @return [self]
452
+ # @api public
453
+ #: (String | Integer) -> self
207
454
  def number_format(num_fmt_id)
208
455
  @num_fmt_id = num_fmt_id
209
456
  self
@@ -212,6 +459,7 @@ module Xlsxrb
212
459
 
213
460
  # Register this style with the given Writer, returning the style_id.
214
461
  # writer:: Xlsxrb::Ooxml::Writer instance
462
+ #: (untyped writer) -> Integer
215
463
  def register_with(writer)
216
464
  font_id = 0
217
465
  fill_id = 0
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Xlsxrb
4
- VERSION = "0.1.4"
6
+ VERSION = "0.1.6"
5
7
  end