caxlsx 3.2.0 → 3.4.0

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 (301) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -9
  3. data/.yardopts_guide +18 -18
  4. data/CHANGELOG.md +394 -354
  5. data/LICENSE +21 -21
  6. data/README.md +184 -168
  7. data/Rakefile +28 -29
  8. data/examples/generate.rb +15 -15
  9. data/lib/axlsx/content_type/abstract_content_type.rb +29 -32
  10. data/lib/axlsx/content_type/content_type.rb +22 -26
  11. data/lib/axlsx/content_type/default.rb +21 -25
  12. data/lib/axlsx/content_type/override.rb +21 -25
  13. data/lib/axlsx/doc_props/app.rb +230 -235
  14. data/lib/axlsx/doc_props/core.rb +34 -39
  15. data/lib/axlsx/drawing/area_chart.rb +96 -99
  16. data/lib/axlsx/drawing/area_series.rb +107 -110
  17. data/lib/axlsx/drawing/ax_data_source.rb +21 -26
  18. data/lib/axlsx/drawing/axes.rb +60 -61
  19. data/lib/axlsx/drawing/axis.rb +185 -190
  20. data/lib/axlsx/drawing/bar_3D_chart.rb +145 -148
  21. data/lib/axlsx/drawing/bar_chart.rb +135 -138
  22. data/lib/axlsx/drawing/bar_series.rb +91 -97
  23. data/lib/axlsx/drawing/bubble_chart.rb +56 -59
  24. data/lib/axlsx/drawing/bubble_series.rb +60 -63
  25. data/lib/axlsx/drawing/cat_axis.rb +80 -85
  26. data/lib/axlsx/drawing/chart.rb +294 -276
  27. data/lib/axlsx/drawing/d_lbls.rb +92 -90
  28. data/lib/axlsx/drawing/drawing.rb +163 -167
  29. data/lib/axlsx/drawing/graphic_frame.rb +51 -54
  30. data/lib/axlsx/drawing/hyperlink.rb +97 -100
  31. data/lib/axlsx/drawing/line_3D_chart.rb +64 -68
  32. data/lib/axlsx/drawing/line_chart.rb +96 -99
  33. data/lib/axlsx/drawing/line_series.rb +107 -110
  34. data/lib/axlsx/drawing/marker.rb +80 -84
  35. data/lib/axlsx/drawing/num_data.rb +47 -52
  36. data/lib/axlsx/drawing/num_data_source.rb +58 -62
  37. data/lib/axlsx/drawing/num_val.rb +31 -34
  38. data/lib/axlsx/drawing/one_cell_anchor.rb +97 -99
  39. data/lib/axlsx/drawing/pic.rb +244 -211
  40. data/lib/axlsx/drawing/picture_locking.rb +39 -42
  41. data/lib/axlsx/drawing/pie_3D_chart.rb +42 -47
  42. data/lib/axlsx/drawing/pie_series.rb +69 -74
  43. data/lib/axlsx/drawing/scaling.rb +57 -60
  44. data/lib/axlsx/drawing/scatter_chart.rb +71 -74
  45. data/lib/axlsx/drawing/scatter_series.rb +126 -129
  46. data/lib/axlsx/drawing/ser_axis.rb +41 -45
  47. data/lib/axlsx/drawing/series.rb +67 -69
  48. data/lib/axlsx/drawing/series_title.rb +23 -25
  49. data/lib/axlsx/drawing/str_data.rb +37 -42
  50. data/lib/axlsx/drawing/str_val.rb +31 -34
  51. data/lib/axlsx/drawing/title.rb +104 -97
  52. data/lib/axlsx/drawing/two_cell_anchor.rb +95 -97
  53. data/lib/axlsx/drawing/val_axis.rb +34 -37
  54. data/lib/axlsx/drawing/view_3D.rb +115 -115
  55. data/lib/axlsx/drawing/vml_drawing.rb +39 -42
  56. data/lib/axlsx/drawing/vml_shape.rb +63 -66
  57. data/lib/axlsx/package.rb +397 -388
  58. data/lib/axlsx/rels/relationship.rb +127 -130
  59. data/lib/axlsx/rels/relationships.rb +29 -32
  60. data/lib/axlsx/stylesheet/border.rb +70 -73
  61. data/lib/axlsx/stylesheet/border_pr.rb +69 -71
  62. data/lib/axlsx/stylesheet/cell_alignment.rb +124 -132
  63. data/lib/axlsx/stylesheet/cell_protection.rb +38 -41
  64. data/lib/axlsx/stylesheet/cell_style.rb +68 -72
  65. data/lib/axlsx/stylesheet/color.rb +77 -76
  66. data/lib/axlsx/stylesheet/dxf.rb +75 -79
  67. data/lib/axlsx/stylesheet/fill.rb +31 -35
  68. data/lib/axlsx/stylesheet/font.rb +157 -156
  69. data/lib/axlsx/stylesheet/gradient_fill.rb +101 -103
  70. data/lib/axlsx/stylesheet/gradient_stop.rb +36 -37
  71. data/lib/axlsx/stylesheet/num_fmt.rb +83 -86
  72. data/lib/axlsx/stylesheet/pattern_fill.rb +71 -73
  73. data/lib/axlsx/stylesheet/styles.rb +543 -494
  74. data/lib/axlsx/stylesheet/table_style.rb +51 -54
  75. data/lib/axlsx/stylesheet/table_style_element.rb +74 -77
  76. data/lib/axlsx/stylesheet/table_styles.rb +42 -46
  77. data/lib/axlsx/stylesheet/xf.rb +144 -147
  78. data/lib/axlsx/util/accessors.rb +62 -64
  79. data/lib/axlsx/util/constants.rb +414 -410
  80. data/lib/axlsx/util/mime_type_utils.rb +24 -11
  81. data/lib/axlsx/util/options_parser.rb +15 -16
  82. data/lib/axlsx/util/serialized_attributes.rb +88 -89
  83. data/lib/axlsx/util/simple_typed_list.rb +180 -179
  84. data/lib/axlsx/util/storage.rb +142 -146
  85. data/lib/axlsx/util/validators.rb +315 -312
  86. data/lib/axlsx/util/zip_command.rb +71 -73
  87. data/lib/axlsx/version.rb +4 -5
  88. data/lib/axlsx/workbook/defined_name.rb +129 -128
  89. data/lib/axlsx/workbook/defined_names.rb +20 -21
  90. data/lib/axlsx/workbook/shared_strings_table.rb +74 -77
  91. data/lib/axlsx/workbook/workbook.rb +430 -395
  92. data/lib/axlsx/workbook/workbook_view.rb +75 -80
  93. data/lib/axlsx/workbook/workbook_views.rb +20 -22
  94. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +78 -77
  95. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
  96. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +243 -244
  97. data/lib/axlsx/workbook/worksheet/border_creator.rb +79 -0
  98. data/lib/axlsx/workbook/worksheet/break.rb +32 -35
  99. data/lib/axlsx/workbook/worksheet/cell.rb +552 -506
  100. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -164
  101. data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -60
  102. data/lib/axlsx/workbook/worksheet/cfvos.rb +16 -18
  103. data/lib/axlsx/workbook/worksheet/col.rb +142 -145
  104. data/lib/axlsx/workbook/worksheet/col_breaks.rb +34 -35
  105. data/lib/axlsx/workbook/worksheet/color_scale.rb +108 -110
  106. data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
  107. data/lib/axlsx/workbook/worksheet/comment.rb +90 -91
  108. data/lib/axlsx/workbook/worksheet/comments.rb +78 -82
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +81 -82
  110. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +216 -220
  111. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +23 -25
  112. data/lib/axlsx/workbook/worksheet/data_bar.rb +127 -129
  113. data/lib/axlsx/workbook/worksheet/data_validation.rb +266 -246
  114. data/lib/axlsx/workbook/worksheet/data_validations.rb +25 -28
  115. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +28 -30
  116. data/lib/axlsx/workbook/worksheet/dimension.rb +65 -64
  117. data/lib/axlsx/workbook/worksheet/header_footer.rb +51 -52
  118. data/lib/axlsx/workbook/worksheet/icon_set.rb +80 -81
  119. data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
  120. data/lib/axlsx/workbook/worksheet/outline_pr.rb +32 -33
  121. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
  122. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +42 -44
  123. data/lib/axlsx/workbook/worksheet/page_setup.rb +237 -240
  124. data/lib/axlsx/workbook/worksheet/pane.rb +138 -139
  125. data/lib/axlsx/workbook/worksheet/pivot_table.rb +332 -296
  126. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +63 -66
  127. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +23 -24
  128. data/lib/axlsx/workbook/worksheet/print_options.rb +38 -39
  129. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -47
  130. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
  131. data/lib/axlsx/workbook/worksheet/rich_text.rb +53 -55
  132. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +266 -250
  133. data/lib/axlsx/workbook/worksheet/row.rb +173 -164
  134. data/lib/axlsx/workbook/worksheet/row_breaks.rb +32 -33
  135. data/lib/axlsx/workbook/worksheet/selection.rb +99 -101
  136. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +28 -29
  137. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -27
  138. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +18 -18
  139. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
  140. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +117 -118
  141. data/lib/axlsx/workbook/worksheet/sheet_view.rb +206 -213
  142. data/lib/axlsx/workbook/worksheet/table.rb +100 -102
  143. data/lib/axlsx/workbook/worksheet/table_style_info.rb +48 -49
  144. data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
  145. data/lib/axlsx/workbook/worksheet/worksheet.rb +857 -786
  146. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
  147. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +59 -58
  148. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +73 -74
  149. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
  150. data/lib/axlsx.rb +218 -185
  151. data/lib/caxlsx.rb +1 -2
  152. data/lib/schema/dc.xsd +118 -118
  153. data/lib/schema/dcmitype.xsd +51 -51
  154. data/lib/schema/dcterms.xsd +331 -331
  155. data/lib/schema/dml-chartDrawing.xsd +146 -146
  156. data/lib/schema/dml-compatibility.xsd +14 -14
  157. data/lib/schema/dml-lockedCanvas.xsd +11 -11
  158. data/lib/schema/dml-main.xsd +3048 -3048
  159. data/lib/schema/dml-picture.xsd +23 -23
  160. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
  161. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
  162. data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
  163. data/lib/schema/shared-bibliography.xsd +144 -144
  164. data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
  165. data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
  166. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
  167. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
  168. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
  169. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
  170. data/lib/schema/shared-relationshipReference.xsd +25 -25
  171. data/lib/schema/vml-main.xsd +569 -569
  172. data/lib/schema/vml-officeDrawing.xsd +509 -509
  173. data/lib/schema/vml-presentationDrawing.xsd +12 -12
  174. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
  175. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
  176. data/lib/schema/xml.xsd +116 -116
  177. metadata +5 -252
  178. data/test/benchmark.rb +0 -72
  179. data/test/content_type/tc_content_type.rb +0 -76
  180. data/test/content_type/tc_default.rb +0 -16
  181. data/test/content_type/tc_override.rb +0 -14
  182. data/test/doc_props/tc_app.rb +0 -43
  183. data/test/doc_props/tc_core.rb +0 -42
  184. data/test/drawing/tc_area_chart.rb +0 -39
  185. data/test/drawing/tc_area_series.rb +0 -71
  186. data/test/drawing/tc_axes.rb +0 -8
  187. data/test/drawing/tc_axis.rb +0 -112
  188. data/test/drawing/tc_bar_3D_chart.rb +0 -86
  189. data/test/drawing/tc_bar_chart.rb +0 -86
  190. data/test/drawing/tc_bar_series.rb +0 -46
  191. data/test/drawing/tc_bubble_chart.rb +0 -44
  192. data/test/drawing/tc_bubble_series.rb +0 -21
  193. data/test/drawing/tc_cat_axis.rb +0 -31
  194. data/test/drawing/tc_cat_axis_data.rb +0 -27
  195. data/test/drawing/tc_chart.rb +0 -123
  196. data/test/drawing/tc_d_lbls.rb +0 -57
  197. data/test/drawing/tc_data_source.rb +0 -23
  198. data/test/drawing/tc_drawing.rb +0 -80
  199. data/test/drawing/tc_graphic_frame.rb +0 -27
  200. data/test/drawing/tc_hyperlink.rb +0 -64
  201. data/test/drawing/tc_line_3d_chart.rb +0 -47
  202. data/test/drawing/tc_line_chart.rb +0 -39
  203. data/test/drawing/tc_line_series.rb +0 -71
  204. data/test/drawing/tc_marker.rb +0 -44
  205. data/test/drawing/tc_named_axis_data.rb +0 -27
  206. data/test/drawing/tc_num_data.rb +0 -31
  207. data/test/drawing/tc_num_val.rb +0 -29
  208. data/test/drawing/tc_one_cell_anchor.rb +0 -66
  209. data/test/drawing/tc_pic.rb +0 -103
  210. data/test/drawing/tc_picture_locking.rb +0 -72
  211. data/test/drawing/tc_pie_3D_chart.rb +0 -28
  212. data/test/drawing/tc_pie_series.rb +0 -33
  213. data/test/drawing/tc_scaling.rb +0 -36
  214. data/test/drawing/tc_scatter_chart.rb +0 -48
  215. data/test/drawing/tc_scatter_series.rb +0 -74
  216. data/test/drawing/tc_ser_axis.rb +0 -31
  217. data/test/drawing/tc_series.rb +0 -23
  218. data/test/drawing/tc_series_title.rb +0 -54
  219. data/test/drawing/tc_str_data.rb +0 -18
  220. data/test/drawing/tc_str_val.rb +0 -30
  221. data/test/drawing/tc_title.rb +0 -70
  222. data/test/drawing/tc_two_cell_anchor.rb +0 -36
  223. data/test/drawing/tc_val_axis.rb +0 -24
  224. data/test/drawing/tc_view_3D.rb +0 -54
  225. data/test/drawing/tc_vml_drawing.rb +0 -25
  226. data/test/drawing/tc_vml_shape.rb +0 -106
  227. data/test/fixtures/image1.gif +0 -0
  228. data/test/fixtures/image1.jpeg +0 -0
  229. data/test/fixtures/image1.jpg +0 -0
  230. data/test/fixtures/image1.png +0 -0
  231. data/test/fixtures/image1_fake.jpg +0 -0
  232. data/test/profile.rb +0 -24
  233. data/test/rels/tc_relationship.rb +0 -52
  234. data/test/rels/tc_relationships.rb +0 -37
  235. data/test/stylesheet/tc_border.rb +0 -37
  236. data/test/stylesheet/tc_border_pr.rb +0 -32
  237. data/test/stylesheet/tc_cell_alignment.rb +0 -81
  238. data/test/stylesheet/tc_cell_protection.rb +0 -29
  239. data/test/stylesheet/tc_cell_style.rb +0 -57
  240. data/test/stylesheet/tc_color.rb +0 -43
  241. data/test/stylesheet/tc_dxf.rb +0 -81
  242. data/test/stylesheet/tc_fill.rb +0 -18
  243. data/test/stylesheet/tc_font.rb +0 -133
  244. data/test/stylesheet/tc_gradient_fill.rb +0 -72
  245. data/test/stylesheet/tc_gradient_stop.rb +0 -31
  246. data/test/stylesheet/tc_num_fmt.rb +0 -30
  247. data/test/stylesheet/tc_pattern_fill.rb +0 -43
  248. data/test/stylesheet/tc_styles.rb +0 -309
  249. data/test/stylesheet/tc_table_style.rb +0 -44
  250. data/test/stylesheet/tc_table_style_element.rb +0 -45
  251. data/test/stylesheet/tc_table_styles.rb +0 -29
  252. data/test/stylesheet/tc_xf.rb +0 -120
  253. data/test/tc_axlsx.rb +0 -109
  254. data/test/tc_helper.rb +0 -10
  255. data/test/tc_package.rb +0 -317
  256. data/test/util/tc_mime_type_utils.rb +0 -13
  257. data/test/util/tc_serialized_attributes.rb +0 -19
  258. data/test/util/tc_simple_typed_list.rb +0 -77
  259. data/test/util/tc_validators.rb +0 -210
  260. data/test/workbook/tc_defined_name.rb +0 -49
  261. data/test/workbook/tc_shared_strings_table.rb +0 -59
  262. data/test/workbook/tc_workbook.rb +0 -165
  263. data/test/workbook/tc_workbook_view.rb +0 -50
  264. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +0 -38
  265. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +0 -76
  266. data/test/workbook/worksheet/auto_filter/tc_filters.rb +0 -50
  267. data/test/workbook/worksheet/tc_break.rb +0 -49
  268. data/test/workbook/worksheet/tc_cell.rb +0 -465
  269. data/test/workbook/worksheet/tc_cfvo.rb +0 -31
  270. data/test/workbook/worksheet/tc_col.rb +0 -93
  271. data/test/workbook/worksheet/tc_color_scale.rb +0 -58
  272. data/test/workbook/worksheet/tc_comment.rb +0 -72
  273. data/test/workbook/worksheet/tc_comments.rb +0 -57
  274. data/test/workbook/worksheet/tc_conditional_formatting.rb +0 -224
  275. data/test/workbook/worksheet/tc_data_bar.rb +0 -46
  276. data/test/workbook/worksheet/tc_data_validation.rb +0 -265
  277. data/test/workbook/worksheet/tc_date_time_converter.rb +0 -124
  278. data/test/workbook/worksheet/tc_header_footer.rb +0 -151
  279. data/test/workbook/worksheet/tc_icon_set.rb +0 -45
  280. data/test/workbook/worksheet/tc_outline_pr.rb +0 -19
  281. data/test/workbook/worksheet/tc_page_margins.rb +0 -97
  282. data/test/workbook/worksheet/tc_page_set_up_pr.rb +0 -15
  283. data/test/workbook/worksheet/tc_page_setup.rb +0 -143
  284. data/test/workbook/worksheet/tc_pane.rb +0 -54
  285. data/test/workbook/worksheet/tc_pivot_table.rb +0 -180
  286. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +0 -62
  287. data/test/workbook/worksheet/tc_print_options.rb +0 -72
  288. data/test/workbook/worksheet/tc_protected_range.rb +0 -17
  289. data/test/workbook/worksheet/tc_rich_text.rb +0 -44
  290. data/test/workbook/worksheet/tc_rich_text_run.rb +0 -173
  291. data/test/workbook/worksheet/tc_row.rb +0 -160
  292. data/test/workbook/worksheet/tc_selection.rb +0 -55
  293. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +0 -18
  294. data/test/workbook/worksheet/tc_sheet_format_pr.rb +0 -88
  295. data/test/workbook/worksheet/tc_sheet_pr.rb +0 -49
  296. data/test/workbook/worksheet/tc_sheet_protection.rb +0 -117
  297. data/test/workbook/worksheet/tc_sheet_view.rb +0 -214
  298. data/test/workbook/worksheet/tc_table.rb +0 -77
  299. data/test/workbook/worksheet/tc_table_style_info.rb +0 -53
  300. data/test/workbook/worksheet/tc_worksheet.rb +0 -632
  301. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +0 -55
@@ -1,250 +1,266 @@
1
- module Axlsx
2
-
3
- # The RichTextRun class creates and self serializing text run.
4
- class RichTextRun
5
-
6
- include Axlsx::OptionsParser
7
-
8
- attr_reader :value
9
-
10
- # A list of allowed inline style attributes used for validation
11
- INLINE_STYLES = [:font_name, :charset,
12
- :family, :b, :i, :strike, :outline,
13
- :shadow, :condense, :extend, :u,
14
- :vertAlign, :sz, :color, :scheme].freeze
15
-
16
- def initialize(value, options={})
17
- self.value = value
18
- parse_options(options)
19
- end
20
-
21
- def value=(value)
22
- @value = value
23
- end
24
-
25
- attr_accessor :cell
26
-
27
- # The inline font_name property for the cell
28
- # @return [String]
29
- attr_reader :font_name
30
- # @see font_name
31
- def font_name=(v) set_run_style :validate_string, :font_name, v; end
32
-
33
- # The inline charset property for the cell
34
- # As far as I can tell, this is pretty much ignored. However, based on the spec it should be one of the following:
35
- # 0  ANSI_CHARSET
36
- # 1 DEFAULT_CHARSET
37
- # 2 SYMBOL_CHARSET
38
- # 77 MAC_CHARSET
39
- # 128 SHIFTJIS_CHARSET
40
- # 129HANGUL_CHARSET
41
- # 130JOHAB_CHARSET
42
- # 134GB2312_CHARSET
43
- # 136CHINESEBIG5_CHARSET
44
- # 161GREEK_CHARSET
45
- # 162TURKISH_CHARSET
46
- # 163VIETNAMESE_CHARSET
47
- # 177HEBREW_CHARSET
48
- # 178ARABIC_CHARSET
49
- # 186BALTIC_CHARSET
50
- # 204RUSSIAN_CHARSET
51
- # 222THAI_CHARSET
52
- # 238EASTEUROPE_CHARSET
53
- # 255  OEM_CHARSET
54
- # @return [String]
55
- attr_reader :charset
56
- # @see charset
57
- def charset=(v) set_run_style :validate_unsigned_int, :charset, v; end
58
-
59
- # The inline family property for the cell
60
- # @return [Integer]
61
- # 1 Roman
62
- # 2 Swiss
63
- # 3 Modern
64
- # 4 Script
65
- # 5 Decorative
66
- attr_reader :family
67
- # @see family
68
- def family=(v)
69
- set_run_style :validate_family, :family, v.to_i
70
- end
71
-
72
- # The inline bold property for the cell
73
- # @return [Boolean]
74
- attr_reader :b
75
- # @see b
76
- def b=(v) set_run_style :validate_boolean, :b, v; end
77
-
78
- # The inline italic property for the cell
79
- # @return [Boolean]
80
- attr_reader :i
81
- # @see i
82
- def i=(v) set_run_style :validate_boolean, :i, v; end
83
-
84
- # The inline strike property for the cell
85
- # @return [Boolean]
86
- attr_reader :strike
87
- # @see strike
88
- def strike=(v) set_run_style :validate_boolean, :strike, v; end
89
-
90
- # The inline outline property for the cell
91
- # @return [Boolean]
92
- attr_reader :outline
93
- # @see outline
94
- def outline=(v) set_run_style :validate_boolean, :outline, v; end
95
-
96
- # The inline shadow property for the cell
97
- # @return [Boolean]
98
- attr_reader :shadow
99
- # @see shadow
100
- def shadow=(v) set_run_style :validate_boolean, :shadow, v; end
101
-
102
- # The inline condense property for the cell
103
- # @return [Boolean]
104
- attr_reader :condense
105
- # @see condense
106
- def condense=(v) set_run_style :validate_boolean, :condense, v; end
107
-
108
- # The inline extend property for the cell
109
- # @return [Boolean]
110
- attr_reader :extend
111
- # @see extend
112
- def extend=(v) set_run_style :validate_boolean, :extend, v; end
113
-
114
- # The inline underline property for the cell.
115
- # It must be one of :none, :single, :double, :singleAccounting, :doubleAccounting, true
116
- # @return [Boolean]
117
- # @return [String]
118
- # @note true is for backwards compatability and is reassigned to :single
119
- attr_reader :u
120
- # @see u
121
- def u=(v)
122
- v = :single if (v == true || v == 1 || v == :true || v == 'true')
123
- set_run_style :validate_cell_u, :u, v
124
- end
125
-
126
- # The inline color property for the cell
127
- # @return [Color]
128
- attr_reader :color
129
- # @param [String] v The 8 character representation for an rgb color #FFFFFFFF"
130
- def color=(v)
131
- @color = v.is_a?(Color) ? v : Color.new(:rgb=>v)
132
- end
133
-
134
- # The inline sz property for the cell
135
- # @return [Inteter]
136
- attr_reader :sz
137
- # @see sz
138
- def sz=(v) set_run_style :validate_unsigned_int, :sz, v; end
139
-
140
- # The inline vertical alignment property for the cell
141
- # this must be one of [:baseline, :subscript, :superscript]
142
- # @return [Symbol]
143
- attr_reader :vertAlign
144
- # @see vertAlign
145
- def vertAlign=(v)
146
- RestrictionValidator.validate :cell_vertAlign, [:baseline, :subscript, :superscript], v
147
- set_run_style nil, :vertAlign, v
148
- end
149
-
150
- # The inline scheme property for the cell
151
- # this must be one of [:none, major, minor]
152
- # @return [Symbol]
153
- attr_reader :scheme
154
- # @see scheme
155
- def scheme=(v)
156
- RestrictionValidator.validate :cell_scheme, [:none, :major, :minor], v
157
- set_run_style nil, :scheme, v
158
- end
159
-
160
- # Tries to work out the width of the longest line in the run
161
- # @param [Array] widtharray this array is populated with the widths of each line in the run.
162
- # @return [Array]
163
- def autowidth(widtharray)
164
- return if value.nil?
165
- if styles.cellXfs[style].alignment && styles.cellXfs[style].alignment.wrap_text
166
- first = true
167
- value.to_s.split(/\r?\n/, -1).each do |line|
168
- if first
169
- first = false
170
- else
171
- widtharray << 0
172
- end
173
- widtharray[-1] += string_width(line, font_size)
174
- end
175
- else
176
- widtharray[-1] += string_width(value.to_s, font_size)
177
- end
178
- widtharray
179
- end
180
-
181
- # Utility method for setting inline style attributes
182
- def set_run_style(validator, attr, value)
183
- return unless INLINE_STYLES.include?(attr.to_sym)
184
- Axlsx.send(validator, value) unless validator.nil?
185
- self.instance_variable_set :"@#{attr.to_s}", value
186
- end
187
-
188
- # Serializes the RichTextRun
189
- # @param [String] str
190
- # @return [String]
191
- def to_xml_string(str = '')
192
- valid = RichTextRun::INLINE_STYLES
193
- data = Hash[self.instance_values.map{ |k, v| [k.to_sym, v] }]
194
- data = data.select { |key, value| valid.include?(key) && !value.nil? }
195
-
196
- str << '<r><rPr>'
197
- data.keys.each do |key|
198
- case key
199
- when :font_name
200
- str << ('<rFont val="' << font_name << '"/>')
201
- when :color
202
- str << data[key].to_xml_string
203
- else
204
- str << ('<' << key.to_s << ' val="' << xml_value(data[key]) << '"/>')
205
- end
206
- end
207
- clean_value = Axlsx::trust_input ? @value.to_s : ::CGI.escapeHTML(Axlsx::sanitize(@value.to_s))
208
- str << ('</rPr><t>' << clean_value << '</t></r>')
209
- end
210
-
211
- private
212
-
213
- # Returns the width of a string according to the current style
214
- # This is still not perfect...
215
- # - scaling is not linear as font sizes increase
216
- def string_width(string, font_size)
217
- font_scale = font_size / 10.0
218
- string.size * font_scale
219
- end
220
-
221
- # we scale the font size if bold style is applied to either the style font or
222
- # the cell itself. Yes, it is a bit of a hack, but it is much better than using
223
- # imagemagick and loading metrics for every character.
224
- def font_size
225
- return sz if sz
226
- font = styles.fonts[styles.cellXfs[style].fontId] || styles.fonts[0]
227
- (font.b || (defined?(@b) && @b)) ? (font.sz * 1.5) : font.sz
228
- end
229
-
230
- def style
231
- cell.style
232
- end
233
-
234
- def styles
235
- cell.row.worksheet.styles
236
- end
237
-
238
- # Converts the value to the correct XML representation (fixes issues with
239
- # Numbers)
240
- def xml_value value
241
- if value == true
242
- 1
243
- elsif value == false
244
- 0
245
- else
246
- value
247
- end.to_s
248
- end
249
- end
250
- end
1
+ module Axlsx
2
+ # The RichTextRun class creates and self serializing text run.
3
+ class RichTextRun
4
+ include Axlsx::OptionsParser
5
+
6
+ attr_reader :value
7
+
8
+ # A list of allowed inline style attributes used for validation
9
+ INLINE_STYLES = [:font_name, :charset,
10
+ :family, :b, :i, :strike, :outline,
11
+ :shadow, :condense, :extend, :u,
12
+ :vertAlign, :sz, :color, :scheme].freeze
13
+
14
+ def initialize(value, options = {})
15
+ self.value = value
16
+ parse_options(options)
17
+ end
18
+
19
+ def value=(value)
20
+ @value = value
21
+ end
22
+
23
+ attr_accessor :cell
24
+
25
+ # The inline font_name property for the cell
26
+ # @return [String]
27
+ attr_reader :font_name
28
+
29
+ # @see font_name
30
+ def font_name=(v) set_run_style :validate_string, :font_name, v; end
31
+
32
+ # The inline charset property for the cell
33
+ # As far as I can tell, this is pretty much ignored. However, based on the spec it should be one of the following:
34
+ # 0 ANSI_CHARSET
35
+ # 1 DEFAULT_CHARSET
36
+ # 2 SYMBOL_CHARSET
37
+ # 77 MAC_CHARSET
38
+ # 128 SHIFTJIS_CHARSET
39
+ # 129  HANGUL_CHARSET
40
+ # 130JOHAB_CHARSET
41
+ # 134GB2312_CHARSET
42
+ # 136CHINESEBIG5_CHARSET
43
+ # 161GREEK_CHARSET
44
+ # 162TURKISH_CHARSET
45
+ # 163VIETNAMESE_CHARSET
46
+ # 177HEBREW_CHARSET
47
+ # 178ARABIC_CHARSET
48
+ # 186BALTIC_CHARSET
49
+ # 204RUSSIAN_CHARSET
50
+ # 222THAI_CHARSET
51
+ # 238EASTEUROPE_CHARSET
52
+ # 255OEM_CHARSET
53
+ # @return [String]
54
+ attr_reader :charset
55
+
56
+ # @see charset
57
+ def charset=(v) set_run_style :validate_unsigned_int, :charset, v; end
58
+
59
+ # The inline family property for the cell
60
+ # @return [Integer]
61
+ # 1 Roman
62
+ # 2 Swiss
63
+ # 3 Modern
64
+ # 4 Script
65
+ # 5 Decorative
66
+ attr_reader :family
67
+
68
+ # @see family
69
+ def family=(v)
70
+ set_run_style :validate_family, :family, v.to_i
71
+ end
72
+
73
+ # The inline bold property for the cell
74
+ # @return [Boolean]
75
+ attr_reader :b
76
+
77
+ # @see b
78
+ def b=(v) set_run_style :validate_boolean, :b, v; end
79
+
80
+ # The inline italic property for the cell
81
+ # @return [Boolean]
82
+ attr_reader :i
83
+
84
+ # @see i
85
+ def i=(v) set_run_style :validate_boolean, :i, v; end
86
+
87
+ # The inline strike property for the cell
88
+ # @return [Boolean]
89
+ attr_reader :strike
90
+
91
+ # @see strike
92
+ def strike=(v) set_run_style :validate_boolean, :strike, v; end
93
+
94
+ # The inline outline property for the cell
95
+ # @return [Boolean]
96
+ attr_reader :outline
97
+
98
+ # @see outline
99
+ def outline=(v) set_run_style :validate_boolean, :outline, v; end
100
+
101
+ # The inline shadow property for the cell
102
+ # @return [Boolean]
103
+ attr_reader :shadow
104
+
105
+ # @see shadow
106
+ def shadow=(v) set_run_style :validate_boolean, :shadow, v; end
107
+
108
+ # The inline condense property for the cell
109
+ # @return [Boolean]
110
+ attr_reader :condense
111
+
112
+ # @see condense
113
+ def condense=(v) set_run_style :validate_boolean, :condense, v; end
114
+
115
+ # The inline extend property for the cell
116
+ # @return [Boolean]
117
+ attr_reader :extend
118
+
119
+ # @see extend
120
+ def extend=(v) set_run_style :validate_boolean, :extend, v; end
121
+
122
+ # The inline underline property for the cell.
123
+ # It must be one of :none, :single, :double, :singleAccounting, :doubleAccounting, true
124
+ # @return [Boolean]
125
+ # @return [String]
126
+ # @note true is for backwards compatability and is reassigned to :single
127
+ attr_reader :u
128
+
129
+ # @see u
130
+ def u=(v)
131
+ v = :single if (v == true || v == 1 || v == :true || v == 'true')
132
+ set_run_style :validate_cell_u, :u, v
133
+ end
134
+
135
+ # The inline color property for the cell
136
+ # @return [Color]
137
+ attr_reader :color
138
+
139
+ # @param [String] v The 8 character representation for an rgb color #FFFFFFFF"
140
+ def color=(v)
141
+ @color = v.is_a?(Color) ? v : Color.new(:rgb => v)
142
+ end
143
+
144
+ # The inline sz property for the cell
145
+ # @return [Inteter]
146
+ attr_reader :sz
147
+
148
+ # @see sz
149
+ def sz=(v) set_run_style :validate_unsigned_int, :sz, v; end
150
+
151
+ # The inline vertical alignment property for the cell
152
+ # this must be one of [:baseline, :subscript, :superscript]
153
+ # @return [Symbol]
154
+ attr_reader :vertAlign
155
+
156
+ # @see vertAlign
157
+ def vertAlign=(v)
158
+ RestrictionValidator.validate :cell_vertAlign, [:baseline, :subscript, :superscript], v
159
+ set_run_style nil, :vertAlign, v
160
+ end
161
+
162
+ # The inline scheme property for the cell
163
+ # this must be one of [:none, major, minor]
164
+ # @return [Symbol]
165
+ attr_reader :scheme
166
+
167
+ # @see scheme
168
+ def scheme=(v)
169
+ RestrictionValidator.validate :cell_scheme, [:none, :major, :minor], v
170
+ set_run_style nil, :scheme, v
171
+ end
172
+
173
+ # Tries to work out the width of the longest line in the run
174
+ # @param [Array] widtharray this array is populated with the widths of each line in the run.
175
+ # @return [Array]
176
+ def autowidth(widtharray)
177
+ return if value.nil?
178
+
179
+ if styles.cellXfs[style].alignment && styles.cellXfs[style].alignment.wrap_text
180
+ first = true
181
+ value.to_s.split(/\r?\n/, -1).each do |line|
182
+ if first
183
+ first = false
184
+ else
185
+ widtharray << 0
186
+ end
187
+ widtharray[-1] += string_width(line, font_size)
188
+ end
189
+ else
190
+ widtharray[-1] += string_width(value.to_s, font_size)
191
+ end
192
+ widtharray
193
+ end
194
+
195
+ # Utility method for setting inline style attributes
196
+ def set_run_style(validator, attr, value)
197
+ return unless INLINE_STYLES.include?(attr.to_sym)
198
+
199
+ Axlsx.send(validator, value) unless validator.nil?
200
+ self.instance_variable_set :"@#{attr.to_s}", value
201
+ end
202
+
203
+ # Serializes the RichTextRun
204
+ # @param [String] str
205
+ # @return [String]
206
+ def to_xml_string(str = '')
207
+ valid = RichTextRun::INLINE_STYLES
208
+ data = Hash[Axlsx.instance_values_for(self).map { |k, v| [k.to_sym, v] }]
209
+ data = data.select { |key, value| valid.include?(key) && !value.nil? }
210
+
211
+ str << '<r><rPr>'
212
+ data.keys.each do |key|
213
+ case key
214
+ when :font_name
215
+ str << ('<rFont val="' << font_name << '"/>')
216
+ when :color
217
+ str << data[key].to_xml_string
218
+ else
219
+ str << ('<' << key.to_s << ' val="' << xml_value(data[key]) << '"/>')
220
+ end
221
+ end
222
+ clean_value = Axlsx::trust_input ? @value.to_s : ::CGI.escapeHTML(Axlsx::sanitize(@value.to_s))
223
+ str << ('</rPr><t>' << clean_value << '</t></r>')
224
+ end
225
+
226
+ private
227
+
228
+ # Returns the width of a string according to the current style
229
+ # This is still not perfect...
230
+ # - scaling is not linear as font sizes increase
231
+ def string_width(string, font_size)
232
+ font_scale = font_size / 10.0
233
+ string.size * font_scale
234
+ end
235
+
236
+ # we scale the font size if bold style is applied to either the style font or
237
+ # the cell itself. Yes, it is a bit of a hack, but it is much better than using
238
+ # imagemagick and loading metrics for every character.
239
+ def font_size
240
+ return sz if sz
241
+
242
+ font = styles.fonts[styles.cellXfs[style].fontId] || styles.fonts[0]
243
+ (font.b || (defined?(@b) && @b)) ? (font.sz * 1.5) : font.sz
244
+ end
245
+
246
+ def style
247
+ cell.style
248
+ end
249
+
250
+ def styles
251
+ cell.row.worksheet.styles
252
+ end
253
+
254
+ # Converts the value to the correct XML representation (fixes issues with
255
+ # Numbers)
256
+ def xml_value value
257
+ if value == true
258
+ 1
259
+ elsif value == false
260
+ 0
261
+ else
262
+ value
263
+ end.to_s
264
+ end
265
+ end
266
+ end