caxlsx 2.0.2

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 (305) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +9 -0
  3. data/.yardopts_guide +19 -0
  4. data/CHANGELOG.md +239 -0
  5. data/LICENSE +22 -0
  6. data/README.md +256 -0
  7. data/Rakefile +31 -0
  8. data/examples/2010_comments.rb +17 -0
  9. data/examples/anchor_swapping.rb +28 -0
  10. data/examples/auto_filter.rb +16 -0
  11. data/examples/basic_charts.rb +58 -0
  12. data/examples/chart_colors.rb +88 -0
  13. data/examples/colored_links.rb +59 -0
  14. data/examples/conditional_formatting/example_conditional_formatting.rb +74 -0
  15. data/examples/conditional_formatting/getting_barred.rb +37 -0
  16. data/examples/conditional_formatting/hitting_the_high_notes.rb +37 -0
  17. data/examples/conditional_formatting/scaled_colors.rb +39 -0
  18. data/examples/conditional_formatting/stop_and_go.rb +37 -0
  19. data/examples/data_validation.rb +50 -0
  20. data/examples/example.rb +777 -0
  21. data/examples/extractive.rb +45 -0
  22. data/examples/image1.jpeg +0 -0
  23. data/examples/ios_preview.rb +14 -0
  24. data/examples/page_setup.rb +11 -0
  25. data/examples/pivot_table.rb +39 -0
  26. data/examples/sheet_protection.rb +10 -0
  27. data/examples/skydrive/real_example.rb +63 -0
  28. data/examples/styles.rb +66 -0
  29. data/examples/underline.rb +13 -0
  30. data/examples/wrap_text.rb +21 -0
  31. data/lib/axlsx.rb +152 -0
  32. data/lib/axlsx/content_type/abstract_content_type.rb +32 -0
  33. data/lib/axlsx/content_type/content_type.rb +26 -0
  34. data/lib/axlsx/content_type/default.rb +25 -0
  35. data/lib/axlsx/content_type/override.rb +25 -0
  36. data/lib/axlsx/doc_props/app.rb +235 -0
  37. data/lib/axlsx/doc_props/core.rb +39 -0
  38. data/lib/axlsx/drawing/ax_data_source.rb +26 -0
  39. data/lib/axlsx/drawing/axes.rb +61 -0
  40. data/lib/axlsx/drawing/axis.rb +187 -0
  41. data/lib/axlsx/drawing/bar_3D_chart.rb +151 -0
  42. data/lib/axlsx/drawing/bar_series.rb +82 -0
  43. data/lib/axlsx/drawing/cat_axis.rb +85 -0
  44. data/lib/axlsx/drawing/chart.rb +232 -0
  45. data/lib/axlsx/drawing/d_lbls.rb +90 -0
  46. data/lib/axlsx/drawing/drawing.rb +162 -0
  47. data/lib/axlsx/drawing/graphic_frame.rb +54 -0
  48. data/lib/axlsx/drawing/hyperlink.rb +102 -0
  49. data/lib/axlsx/drawing/line_3D_chart.rb +68 -0
  50. data/lib/axlsx/drawing/line_chart.rb +99 -0
  51. data/lib/axlsx/drawing/line_series.rb +81 -0
  52. data/lib/axlsx/drawing/marker.rb +84 -0
  53. data/lib/axlsx/drawing/num_data.rb +52 -0
  54. data/lib/axlsx/drawing/num_data_source.rb +62 -0
  55. data/lib/axlsx/drawing/num_val.rb +32 -0
  56. data/lib/axlsx/drawing/one_cell_anchor.rb +98 -0
  57. data/lib/axlsx/drawing/pic.rb +205 -0
  58. data/lib/axlsx/drawing/picture_locking.rb +44 -0
  59. data/lib/axlsx/drawing/pie_3D_chart.rb +48 -0
  60. data/lib/axlsx/drawing/pie_series.rb +74 -0
  61. data/lib/axlsx/drawing/scaling.rb +60 -0
  62. data/lib/axlsx/drawing/scatter_chart.rb +74 -0
  63. data/lib/axlsx/drawing/scatter_series.rb +65 -0
  64. data/lib/axlsx/drawing/ser_axis.rb +45 -0
  65. data/lib/axlsx/drawing/series.rb +69 -0
  66. data/lib/axlsx/drawing/series_title.rb +23 -0
  67. data/lib/axlsx/drawing/str_data.rb +42 -0
  68. data/lib/axlsx/drawing/str_val.rb +32 -0
  69. data/lib/axlsx/drawing/title.rb +78 -0
  70. data/lib/axlsx/drawing/two_cell_anchor.rb +92 -0
  71. data/lib/axlsx/drawing/val_axis.rb +37 -0
  72. data/lib/axlsx/drawing/view_3D.rb +115 -0
  73. data/lib/axlsx/drawing/vml_drawing.rb +42 -0
  74. data/lib/axlsx/drawing/vml_shape.rb +66 -0
  75. data/lib/axlsx/package.rb +352 -0
  76. data/lib/axlsx/rels/relationship.rb +129 -0
  77. data/lib/axlsx/rels/relationships.rb +29 -0
  78. data/lib/axlsx/stylesheet/border.rb +71 -0
  79. data/lib/axlsx/stylesheet/border_pr.rb +71 -0
  80. data/lib/axlsx/stylesheet/cell_alignment.rb +134 -0
  81. data/lib/axlsx/stylesheet/cell_protection.rb +43 -0
  82. data/lib/axlsx/stylesheet/cell_style.rb +74 -0
  83. data/lib/axlsx/stylesheet/color.rb +78 -0
  84. data/lib/axlsx/stylesheet/dxf.rb +79 -0
  85. data/lib/axlsx/stylesheet/fill.rb +35 -0
  86. data/lib/axlsx/stylesheet/font.rb +148 -0
  87. data/lib/axlsx/stylesheet/gradient_fill.rb +103 -0
  88. data/lib/axlsx/stylesheet/gradient_stop.rb +37 -0
  89. data/lib/axlsx/stylesheet/num_fmt.rb +79 -0
  90. data/lib/axlsx/stylesheet/pattern_fill.rb +73 -0
  91. data/lib/axlsx/stylesheet/styles.rb +420 -0
  92. data/lib/axlsx/stylesheet/table_style.rb +54 -0
  93. data/lib/axlsx/stylesheet/table_style_element.rb +79 -0
  94. data/lib/axlsx/stylesheet/table_styles.rb +46 -0
  95. data/lib/axlsx/stylesheet/xf.rb +147 -0
  96. data/lib/axlsx/util/accessors.rb +64 -0
  97. data/lib/axlsx/util/constants.rb +392 -0
  98. data/lib/axlsx/util/options_parser.rb +15 -0
  99. data/lib/axlsx/util/parser.rb +44 -0
  100. data/lib/axlsx/util/serialized_attributes.rb +79 -0
  101. data/lib/axlsx/util/simple_typed_list.rb +203 -0
  102. data/lib/axlsx/util/storage.rb +146 -0
  103. data/lib/axlsx/util/validators.rb +300 -0
  104. data/lib/axlsx/version.rb +5 -0
  105. data/lib/axlsx/workbook/defined_name.rb +129 -0
  106. data/lib/axlsx/workbook/defined_names.rb +21 -0
  107. data/lib/axlsx/workbook/shared_strings_table.rb +77 -0
  108. data/lib/axlsx/workbook/workbook.rb +354 -0
  109. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -0
  110. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -0
  111. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +246 -0
  112. data/lib/axlsx/workbook/worksheet/break.rb +37 -0
  113. data/lib/axlsx/workbook/worksheet/cell.rb +416 -0
  114. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +144 -0
  115. data/lib/axlsx/workbook/worksheet/cfvo.rb +62 -0
  116. data/lib/axlsx/workbook/worksheet/cfvos.rb +15 -0
  117. data/lib/axlsx/workbook/worksheet/col.rb +144 -0
  118. data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -0
  119. data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -0
  120. data/lib/axlsx/workbook/worksheet/cols.rb +20 -0
  121. data/lib/axlsx/workbook/worksheet/comment.rb +92 -0
  122. data/lib/axlsx/workbook/worksheet/comments.rb +85 -0
  123. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -0
  124. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -0
  125. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -0
  126. data/lib/axlsx/workbook/worksheet/data_bar.rb +131 -0
  127. data/lib/axlsx/workbook/worksheet/data_validation.rb +244 -0
  128. data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -0
  129. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -0
  130. data/lib/axlsx/workbook/worksheet/dimension.rb +64 -0
  131. data/lib/axlsx/workbook/worksheet/header_footer.rb +54 -0
  132. data/lib/axlsx/workbook/worksheet/icon_set.rb +83 -0
  133. data/lib/axlsx/workbook/worksheet/merged_cells.rb +35 -0
  134. data/lib/axlsx/workbook/worksheet/page_margins.rb +99 -0
  135. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -0
  136. data/lib/axlsx/workbook/worksheet/page_setup.rb +242 -0
  137. data/lib/axlsx/workbook/worksheet/pane.rb +141 -0
  138. data/lib/axlsx/workbook/worksheet/pivot_table.rb +273 -0
  139. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -0
  140. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -0
  141. data/lib/axlsx/workbook/worksheet/print_options.rb +41 -0
  142. data/lib/axlsx/workbook/worksheet/protected_range.rb +49 -0
  143. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +34 -0
  144. data/lib/axlsx/workbook/worksheet/row.rb +172 -0
  145. data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -0
  146. data/lib/axlsx/workbook/worksheet/selection.rb +103 -0
  147. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -0
  148. data/lib/axlsx/workbook/worksheet/sheet_data.rb +25 -0
  149. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +60 -0
  150. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +69 -0
  151. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +120 -0
  152. data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -0
  153. data/lib/axlsx/workbook/worksheet/table.rb +102 -0
  154. data/lib/axlsx/workbook/worksheet/table_style_info.rb +51 -0
  155. data/lib/axlsx/workbook/worksheet/tables.rb +31 -0
  156. data/lib/axlsx/workbook/worksheet/worksheet.rb +769 -0
  157. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -0
  158. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -0
  159. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -0
  160. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -0
  161. data/lib/schema/dc.xsd +118 -0
  162. data/lib/schema/dcmitype.xsd +52 -0
  163. data/lib/schema/dcterms.xsd +331 -0
  164. data/lib/schema/dml-chart.xsd +1499 -0
  165. data/lib/schema/dml-chartDrawing.xsd +146 -0
  166. data/lib/schema/dml-compatibility.xsd +14 -0
  167. data/lib/schema/dml-diagram.xsd +1091 -0
  168. data/lib/schema/dml-lockedCanvas.xsd +11 -0
  169. data/lib/schema/dml-main.xsd +3048 -0
  170. data/lib/schema/dml-picture.xsd +23 -0
  171. data/lib/schema/dml-spreadsheetDrawing.xsd +185 -0
  172. data/lib/schema/dml-wordprocessingDrawing.xsd +185 -0
  173. data/lib/schema/opc-contentTypes.xsd +42 -0
  174. data/lib/schema/opc-coreProperties.xsd +54 -0
  175. data/lib/schema/opc-digSig.xsd +49 -0
  176. data/lib/schema/opc-relationships.xsd +33 -0
  177. data/lib/schema/pml.xsd +1676 -0
  178. data/lib/schema/shared-additionalCharacteristics.xsd +28 -0
  179. data/lib/schema/shared-bibliography.xsd +144 -0
  180. data/lib/schema/shared-commonSimpleTypes.xsd +166 -0
  181. data/lib/schema/shared-customXmlDataProperties.xsd +25 -0
  182. data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -0
  183. data/lib/schema/shared-documentPropertiesCustom.xsd +59 -0
  184. data/lib/schema/shared-documentPropertiesExtended.xsd +56 -0
  185. data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -0
  186. data/lib/schema/shared-math.xsd +582 -0
  187. data/lib/schema/shared-relationshipReference.xsd +25 -0
  188. data/lib/schema/sml.xsd +4434 -0
  189. data/lib/schema/vml-main.xsd +569 -0
  190. data/lib/schema/vml-officeDrawing.xsd +509 -0
  191. data/lib/schema/vml-presentationDrawing.xsd +12 -0
  192. data/lib/schema/vml-spreadsheetDrawing.xsd +108 -0
  193. data/lib/schema/vml-wordprocessingDrawing.xsd +96 -0
  194. data/lib/schema/wml.xsd +3644 -0
  195. data/lib/schema/xml.xsd +116 -0
  196. data/test/benchmark.rb +72 -0
  197. data/test/content_type/tc_content_type.rb +76 -0
  198. data/test/content_type/tc_default.rb +16 -0
  199. data/test/content_type/tc_override.rb +14 -0
  200. data/test/doc_props/tc_app.rb +43 -0
  201. data/test/doc_props/tc_core.rb +42 -0
  202. data/test/drawing/tc_axes.rb +8 -0
  203. data/test/drawing/tc_axis.rb +85 -0
  204. data/test/drawing/tc_bar_3D_chart.rb +71 -0
  205. data/test/drawing/tc_bar_series.rb +37 -0
  206. data/test/drawing/tc_cat_axis.rb +31 -0
  207. data/test/drawing/tc_cat_axis_data.rb +27 -0
  208. data/test/drawing/tc_chart.rb +110 -0
  209. data/test/drawing/tc_d_lbls.rb +57 -0
  210. data/test/drawing/tc_data_source.rb +17 -0
  211. data/test/drawing/tc_drawing.rb +80 -0
  212. data/test/drawing/tc_graphic_frame.rb +27 -0
  213. data/test/drawing/tc_hyperlink.rb +64 -0
  214. data/test/drawing/tc_line_3d_chart.rb +47 -0
  215. data/test/drawing/tc_line_chart.rb +39 -0
  216. data/test/drawing/tc_line_series.rb +30 -0
  217. data/test/drawing/tc_marker.rb +44 -0
  218. data/test/drawing/tc_named_axis_data.rb +27 -0
  219. data/test/drawing/tc_num_data.rb +31 -0
  220. data/test/drawing/tc_num_val.rb +29 -0
  221. data/test/drawing/tc_one_cell_anchor.rb +66 -0
  222. data/test/drawing/tc_pic.rb +107 -0
  223. data/test/drawing/tc_picture_locking.rb +72 -0
  224. data/test/drawing/tc_pie_3D_chart.rb +28 -0
  225. data/test/drawing/tc_pie_series.rb +32 -0
  226. data/test/drawing/tc_scaling.rb +36 -0
  227. data/test/drawing/tc_scatter_chart.rb +48 -0
  228. data/test/drawing/tc_scatter_series.rb +21 -0
  229. data/test/drawing/tc_ser_axis.rb +31 -0
  230. data/test/drawing/tc_series.rb +23 -0
  231. data/test/drawing/tc_series_title.rb +33 -0
  232. data/test/drawing/tc_str_data.rb +18 -0
  233. data/test/drawing/tc_str_val.rb +21 -0
  234. data/test/drawing/tc_title.rb +49 -0
  235. data/test/drawing/tc_two_cell_anchor.rb +36 -0
  236. data/test/drawing/tc_val_axis.rb +24 -0
  237. data/test/drawing/tc_view_3D.rb +54 -0
  238. data/test/drawing/tc_vml_drawing.rb +25 -0
  239. data/test/drawing/tc_vml_shape.rb +106 -0
  240. data/test/profile.rb +24 -0
  241. data/test/rels/tc_relationship.rb +44 -0
  242. data/test/rels/tc_relationships.rb +37 -0
  243. data/test/stylesheet/tc_border.rb +37 -0
  244. data/test/stylesheet/tc_border_pr.rb +32 -0
  245. data/test/stylesheet/tc_cell_alignment.rb +81 -0
  246. data/test/stylesheet/tc_cell_protection.rb +29 -0
  247. data/test/stylesheet/tc_cell_style.rb +57 -0
  248. data/test/stylesheet/tc_color.rb +43 -0
  249. data/test/stylesheet/tc_dxf.rb +81 -0
  250. data/test/stylesheet/tc_fill.rb +18 -0
  251. data/test/stylesheet/tc_font.rb +121 -0
  252. data/test/stylesheet/tc_gradient_fill.rb +72 -0
  253. data/test/stylesheet/tc_gradient_stop.rb +31 -0
  254. data/test/stylesheet/tc_num_fmt.rb +30 -0
  255. data/test/stylesheet/tc_pattern_fill.rb +43 -0
  256. data/test/stylesheet/tc_styles.rb +235 -0
  257. data/test/stylesheet/tc_table_style.rb +44 -0
  258. data/test/stylesheet/tc_table_style_element.rb +45 -0
  259. data/test/stylesheet/tc_table_styles.rb +29 -0
  260. data/test/stylesheet/tc_xf.rb +120 -0
  261. data/test/tc_axlsx.rb +72 -0
  262. data/test/tc_helper.rb +10 -0
  263. data/test/tc_package.rb +227 -0
  264. data/test/util/tc_serialized_attributes.rb +19 -0
  265. data/test/util/tc_simple_typed_list.rb +78 -0
  266. data/test/util/tc_validators.rb +186 -0
  267. data/test/workbook/tc_defined_name.rb +41 -0
  268. data/test/workbook/tc_shared_strings_table.rb +44 -0
  269. data/test/workbook/tc_workbook.rb +125 -0
  270. data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -0
  271. data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -0
  272. data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -0
  273. data/test/workbook/worksheet/tc_break.rb +49 -0
  274. data/test/workbook/worksheet/tc_cell.rb +319 -0
  275. data/test/workbook/worksheet/tc_cfvo.rb +31 -0
  276. data/test/workbook/worksheet/tc_col.rb +78 -0
  277. data/test/workbook/worksheet/tc_color_scale.rb +58 -0
  278. data/test/workbook/worksheet/tc_comment.rb +72 -0
  279. data/test/workbook/worksheet/tc_comments.rb +57 -0
  280. data/test/workbook/worksheet/tc_conditional_formatting.rb +224 -0
  281. data/test/workbook/worksheet/tc_data_bar.rb +46 -0
  282. data/test/workbook/worksheet/tc_data_validation.rb +265 -0
  283. data/test/workbook/worksheet/tc_date_time_converter.rb +124 -0
  284. data/test/workbook/worksheet/tc_header_footer.rb +151 -0
  285. data/test/workbook/worksheet/tc_icon_set.rb +45 -0
  286. data/test/workbook/worksheet/tc_page_margins.rb +97 -0
  287. data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -0
  288. data/test/workbook/worksheet/tc_page_setup.rb +143 -0
  289. data/test/workbook/worksheet/tc_pane.rb +54 -0
  290. data/test/workbook/worksheet/tc_pivot_table.rb +120 -0
  291. data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +54 -0
  292. data/test/workbook/worksheet/tc_print_options.rb +72 -0
  293. data/test/workbook/worksheet/tc_protected_range.rb +17 -0
  294. data/test/workbook/worksheet/tc_row.rb +117 -0
  295. data/test/workbook/worksheet/tc_selection.rb +55 -0
  296. data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -0
  297. data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -0
  298. data/test/workbook/worksheet/tc_sheet_pr.rb +27 -0
  299. data/test/workbook/worksheet/tc_sheet_protection.rb +117 -0
  300. data/test/workbook/worksheet/tc_sheet_view.rb +214 -0
  301. data/test/workbook/worksheet/tc_table.rb +68 -0
  302. data/test/workbook/worksheet/tc_table_style_info.rb +53 -0
  303. data/test/workbook/worksheet/tc_worksheet.rb +538 -0
  304. data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -0
  305. metadata +546 -0
@@ -0,0 +1,15 @@
1
+ module Axlsx
2
+ # This module defines a single method for parsing options in class
3
+ # initializers.
4
+ module OptionsParser
5
+
6
+ # Parses an options hash by calling any defined method by the same
7
+ # name of the key postfixed with an '='
8
+ # @param [Hash] options Options to parse.
9
+ def parse_options(options={})
10
+ options.each do |key, value|
11
+ self.send("#{key}=", value) if self.respond_to?("#{key}=") && value != nil
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: UTF-8
2
+ module Axlsx
3
+ # The Parser module mixes in a number of methods to help in generating a model from xml
4
+ # This module is not included in the axlsx library at this time. It is for future development only,
5
+ module Parser
6
+
7
+ # The xml to be parsed
8
+ attr_accessor :parser_xml
9
+
10
+ # parse and assign string attribute
11
+ def parse_string attr_name, xpath
12
+ send("#{attr_name.to_s}=", parse_value(xpath))
13
+ end
14
+
15
+ # parse convert and assign node text to symbol
16
+ def parse_symbol attr_name, xpath
17
+ v = parse_value xpath
18
+ v = v.to_sym unless v.nil?
19
+ send("#{attr_name.to_s}=", v)
20
+ end
21
+
22
+ # parse, convert and assign note text to integer
23
+ def parse_integer attr_name, xpath
24
+ v = parse_value xpath
25
+ v = v.to_i if v.respond_to?(:to_i)
26
+ send("#{attr_name.to_s}=", v)
27
+ end
28
+
29
+ # parse, convert and assign node text to float
30
+ def parse_float attr_name, xpath
31
+ v = parse_value xpath
32
+ v = v.to_f if v.respond_to?(:to_f)
33
+ send("#{attr_name.to_s}=", v)
34
+ end
35
+
36
+ # return node text based on xpath
37
+ def parse_value xpath
38
+ node = parser_xml.xpath(xpath)
39
+ return nil if node.empty?
40
+ node.text.strip
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,79 @@
1
+ module Axlsx
2
+ # This module allows us to define a list of symbols defining which
3
+ # attributes will be serialized for a class.
4
+ module SerializedAttributes
5
+
6
+ # Extend with class methods
7
+ def self.included(base)
8
+ base.send :extend, ClassMethods
9
+ end
10
+
11
+ # class methods applied to all includers
12
+ module ClassMethods
13
+
14
+ # This is the method to be used in inheriting classes to specify
15
+ # which of the instance values are serializable
16
+ def serializable_attributes(*symbols)
17
+ @xml_attributes = symbols
18
+ end
19
+
20
+ # a reader for those attributes
21
+ def xml_attributes
22
+ @xml_attributes
23
+ end
24
+
25
+ # This helper registers the attributes that will be formatted as elements.
26
+ def serializable_element_attributes(*symbols)
27
+ @xml_element_attributes = symbols
28
+ end
29
+
30
+ # attr reader for element attributes
31
+ def xml_element_attributes
32
+ @xml_element_attributes
33
+ end
34
+ end
35
+
36
+ # serializes the instance values of the defining object based on the
37
+ # list of serializable attributes.
38
+ # @param [String] str The string instance to append this
39
+ # serialization to.
40
+ # @param [Hash] additional_attributes An option key value hash for
41
+ # defining values that are not serializable attributes list.
42
+ def serialized_attributes(str = '', additional_attributes = {})
43
+ attributes = declared_attributes.merge! additional_attributes
44
+ attributes.each do |key, value|
45
+ str << "#{Axlsx.camel(key, false)}=\"#{Axlsx.camel(value, false)}\" "
46
+ end
47
+ str
48
+ end
49
+
50
+ # A hash of instance variables that have been declared with
51
+ # seraialized_attributes and are not nil.
52
+ # This requires ruby 1.9.3 or higher
53
+ def declared_attributes
54
+ instance_values.select do |key, value|
55
+ value != nil && self.class.xml_attributes.include?(key.to_sym)
56
+ end
57
+ end
58
+
59
+ # serialized instance values at text nodes on a camelized element of the
60
+ # attribute name. You may pass in a block for evaluation against non nil
61
+ # values. We use an array for element attributes becuase misordering will
62
+ # break the xml and 1.8.7 does not support ordered hashes.
63
+ # @param [String] str The string instance to which serialized data is appended
64
+ # @param [Array] additional_attributes An array of additional attribute names.
65
+ # @return [String] The serialized output.
66
+ def serialized_element_attributes(str='', additional_attributes=[], &block)
67
+ attrs = self.class.xml_element_attributes + additional_attributes
68
+ values = instance_values
69
+ attrs.each do |attribute_name|
70
+ value = values[attribute_name.to_s]
71
+ next if value.nil?
72
+ value = yield value if block_given?
73
+ element_name = Axlsx.camel(attribute_name, false)
74
+ str << "<#{element_name}>#{value}</#{element_name}>"
75
+ end
76
+ str
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,203 @@
1
+ # encoding: UTF-8
2
+ module Axlsx
3
+
4
+ # A SimpleTypedList is a type restrictive collection that allows some of the methods from Array and supports basic xml serialization.
5
+ # @private
6
+ class SimpleTypedList
7
+ # Creats a new typed list
8
+ # @param [Array, Class] type An array of Class objects or a single Class object
9
+ # @param [String] serialize_as The tag name to use in serialization
10
+ # @raise [ArgumentError] if all members of type are not Class objects
11
+ def initialize type, serialize_as=nil
12
+ if type.is_a? Array
13
+ type.each { |item| raise ArgumentError, "All members of type must be Class objects" unless item.is_a? Class }
14
+ @allowed_types = type
15
+ else
16
+ raise ArgumentError, "Type must be a Class object or array of Class objects" unless type.is_a? Class
17
+ @allowed_types = [type]
18
+ end
19
+ @list = []
20
+ @locked_at = nil
21
+ @serialize_as = serialize_as
22
+ end
23
+
24
+ # The class constants of allowed types
25
+ # @return [Array]
26
+ attr_reader :allowed_types
27
+
28
+ # The index below which items cannot be removed
29
+ # @return [Integer]
30
+ attr_reader :locked_at
31
+
32
+ # The tag name to use when serializing this object
33
+ # by default the parent node for all items in the list is the classname of the first allowed type with the first letter in lowercase.
34
+ # @return [String]
35
+ attr_reader :serialize_as
36
+
37
+ # Transposes the list (without blowing up like ruby does)
38
+ # any non populated cell in the matrix will be a nil value
39
+ def transpose
40
+ return @list.clone if @list.size == 0
41
+ row_count = @list.size
42
+ max_column_count = @list.map{|row| row.cells.size}.max
43
+ result = Array.new(max_column_count) { Array.new(row_count) }
44
+ # yes, I know it is silly, but that warning is really annoying
45
+ row_count.times do |row_index|
46
+ max_column_count.times do |column_index|
47
+ datum = if @list[row_index].cells.size >= max_column_count
48
+ @list[row_index].cells[column_index]
49
+ elsif block_given?
50
+ yield(column_index, row_index)
51
+ end
52
+ result[column_index][row_index] = datum
53
+ end
54
+ end
55
+ result
56
+ end
57
+ # Lock this list at the current size
58
+ # @return [self]
59
+ def lock
60
+ @locked_at = @list.size
61
+ self
62
+ end
63
+
64
+ def to_ary
65
+ @list
66
+ end
67
+
68
+ alias :to_a :to_ary
69
+
70
+ # Unlock the list
71
+ # @return [self]
72
+ def unlock
73
+ @locked_at = nil
74
+ self
75
+ end
76
+
77
+ # join operator
78
+ # @param [Array] v the array to join
79
+ # @raise [ArgumentError] if any of the values being joined are not
80
+ # one of the allowed types
81
+ # @return [SimpleTypedList]
82
+ def +(v)
83
+ v.each do |item|
84
+ DataTypeValidator.validate "SimpleTypedList.+", @allowed_types, item
85
+ @list << item
86
+ end
87
+ end
88
+
89
+ # Concat operator
90
+ # @param [Any] v the data to be added
91
+ # @raise [ArgumentError] if the value being added is not one fo the allowed types
92
+ # @return [Integer] returns the index of the item added.
93
+ def <<(v)
94
+ DataTypeValidator.validate "SimpleTypedList.<<", @allowed_types, v
95
+ @list << v
96
+ @list.size - 1
97
+ end
98
+ alias :push :<<
99
+
100
+ # delete the item from the list
101
+ # @param [Any] v The item to be deleted.
102
+ # @raise [ArgumentError] if the item's index is protected by locking
103
+ # @return [Any] The item deleted
104
+ def delete(v)
105
+ return unless @list.include? v
106
+ raise ArgumentError, "Item is protected and cannot be deleted" if protected? @list.index(v)
107
+ @list.delete v
108
+ end
109
+
110
+ # delete the item from the list at the index position provided
111
+ # @raise [ArgumentError] if the index is protected by locking
112
+ # @return [Any] The item deleted
113
+ def delete_at(index)
114
+ @list[index]
115
+ raise ArgumentError, "Item is protected and cannot be deleted" if protected? index
116
+ @list.delete_at index
117
+ end
118
+
119
+ # positional assignment. Adds the item at the index specified
120
+ # @param [Integer] index
121
+ # @param [Any] v
122
+ # @raise [ArgumentError] if the index is protected by locking
123
+ # @raise [ArgumentError] if the item is not one of the allowed types
124
+ def []=(index, v)
125
+ DataTypeValidator.validate "SimpleTypedList.<<", @allowed_types, v
126
+ raise ArgumentError, "Item is protected and cannot be changed" if protected? index
127
+ @list[index] = v
128
+ v
129
+ end
130
+
131
+ # inserts an item at the index specfied
132
+ # @param [Integer] index
133
+ # @param [Any] v
134
+ # @raise [ArgumentError] if the index is protected by locking
135
+ # @raise [ArgumentError] if the index is not one of the allowed types
136
+ def insert(index, v)
137
+ DataTypeValidator.validate "SimpleTypedList.<<", @allowed_types, v
138
+ raise ArgumentError, "Item is protected and cannot be changed" if protected? index
139
+ @list.insert(index, v)
140
+ v
141
+ end
142
+
143
+ # determines if the index is protected
144
+ # @param [Integer] index
145
+ def protected? index
146
+ return false unless @locked_at.is_a? Fixnum
147
+ index < @locked_at
148
+ end
149
+
150
+ # override the equality method so that this object can be compared to a simple array.
151
+ # if this object's list is equal to the specifiec array, we return true.
152
+ def ==(v)
153
+ v == @list
154
+ end
155
+ # method_mission override to pass allowed methods to the list.
156
+ # @note
157
+ # the following methods are not allowed
158
+ # :replace
159
+ # :insert
160
+ # :collect!
161
+ # :map!
162
+ # :pop
163
+ # :delete_if
164
+ # :reverse!
165
+ # :shift
166
+ # :shuffle!
167
+ # :slice!
168
+ # :sort!
169
+ # :uniq!
170
+ # :unshift
171
+ # :zip
172
+ # :flatten!
173
+ # :fill
174
+ # :drop
175
+ # :drop_while
176
+ # :delete_if
177
+ # :clear
178
+ DESTRUCTIVE = ['replace', 'insert', 'collect!', 'map!', 'pop', 'delete_if',
179
+ 'reverse!', 'shift', 'shuffle!', 'slice!', 'sort!', 'uniq!',
180
+ 'unshift', 'zip', 'flatten!', 'fill', 'drop', 'drop_while',
181
+ 'delete_if', 'clear']
182
+ DELEGATES = Array.instance_methods - self.instance_methods - DESTRUCTIVE
183
+
184
+ DELEGATES.each do |method|
185
+ class_eval %{
186
+ def #{method}(*args, &block)
187
+ @list.send(:#{method}, *args, &block)
188
+ end
189
+ }
190
+ end
191
+
192
+ def to_xml_string(str = '')
193
+ classname = @allowed_types[0].name.split('::').last
194
+ el_name = serialize_as.to_s || (classname[0,1].downcase + classname[1..-1])
195
+ str << '<' << el_name << ' count="' << @list.size.to_s << '">'
196
+ @list.each { |item| item.to_xml_string(str) }
197
+ str << '</' << el_name << '>'
198
+ end
199
+
200
+ end
201
+
202
+
203
+ end
@@ -0,0 +1,146 @@
1
+ # encoding: UTF-8
2
+ module Axlsx
3
+
4
+ # The Storage class represents a storage object or stream in a compound file.
5
+ class Storage
6
+
7
+ # Packing for the Storage when pushing an array of items into a byte stream
8
+ # Name, name length, type, color, left sibling, right sibling, child, classid, state, created, modified, sector, size
9
+ PACKING = "s32 s1 c2 l3 x16 x4 q2 l q"
10
+
11
+ # storage types
12
+ TYPES = {
13
+ :root=>5,
14
+ :stream=>2,
15
+ :storage=>1
16
+ }
17
+
18
+ # Creates a byte string for this storage
19
+ # @return [String]
20
+ def to_s
21
+ data = [@name.concat(Array.new(32-@name.size, 0)),
22
+ @name_size,
23
+ @type,
24
+ @color,
25
+ @left,
26
+ @right,
27
+ @child,
28
+ @created,
29
+ @modified,
30
+ @sector,
31
+ @size].flatten
32
+ data.pack(PACKING)
33
+ end
34
+
35
+ # storage colors
36
+ COLORS = {
37
+ :red=>0,
38
+ :black=>1
39
+ }
40
+
41
+ # The color of this node in the directory tree. Defaults to black if not specified
42
+ # @return [Integer] color
43
+ attr_reader :color
44
+
45
+ # Sets the color for this storage
46
+ # @param [Integer] v Must be one of the COLORS constant hash values
47
+ def color=(v)
48
+ RestrictionValidator.validate "Storage.color", COLORS.values, v
49
+ @color = v
50
+ end
51
+
52
+ # The size of the name for this node.
53
+ # interesting to see that office actually uses 'R' for the root directory and lists the size as 2 bytes - thus is it *NOT* null
54
+ # terminated. I am making this r/w so that I can override the size
55
+ # @return [Integer] color
56
+ attr_reader :name_size
57
+
58
+ # the name of the stream
59
+ attr_reader :name
60
+
61
+ # sets the name of the stream.
62
+ # This will automatically set the name_size attribute
63
+ # @return [String] name
64
+ def name=(v)
65
+ @name = v.bytes.to_a << 0
66
+ @name_size = @name.size * 2
67
+ @name
68
+ end
69
+
70
+ # The size of the stream
71
+ attr_reader :size
72
+
73
+ # The stream associated with this storage
74
+ attr_reader :data
75
+
76
+ # Set the data associated with the stream. If the stream type is undefined, we automatically specify the storage as a stream type. # with the exception of storages that are type root, all storages with data should be type stream.
77
+ # @param [String] v The data for this storages stream
78
+ # @return [Array]
79
+ def data=(v)
80
+ Axlsx::validate_string(v)
81
+ self.type = TYPES[:stream] unless @type
82
+ @size = v.size
83
+ @data = v.bytes.to_a
84
+ end
85
+
86
+ # The starting sector for the stream. If this storage is not a stream, or the root node this is nil
87
+ # @return [Integer] sector
88
+ attr_accessor :sector
89
+
90
+ # The 0 based index in the directoies chain for this the left sibling of this storage.
91
+
92
+ # @return [Integer] left
93
+ attr_accessor :left
94
+
95
+ # The 0 based index in the directoies chain for this the right sibling of this storage.
96
+ # @return [Integer] right
97
+ attr_accessor :right
98
+
99
+ # The 0 based index in the directoies chain for the child of this storage.
100
+ # @return [Integer] child
101
+ attr_accessor :child
102
+
103
+ # The created attribute for the storage
104
+ # @return [Integer] created
105
+ attr_accessor :created
106
+
107
+ # The modified attribute for the storage
108
+ # @return [Integer] modified
109
+ attr_accessor :modified
110
+
111
+ # The type of storage
112
+ # see TYPES
113
+ # @return [Integer] type
114
+ attr_reader :type
115
+
116
+ # Sets the type for this storage.
117
+ # @param [Integer] v the type to specify must be one of the TYPES constant hash values.
118
+ def type=(v)
119
+ RestrictionValidator.validate "Storage.type", TYPES.values, v
120
+ @type = v
121
+ end
122
+
123
+ # Creates a new storage object.
124
+ # @param [String] name the name of the storage
125
+ # @option options [Integer] color @default black
126
+ # @option options [Integer] type @default storage
127
+ # @option options [String] data
128
+ # @option options [Integer] left @default -1
129
+ # @option options [Integer] right @default -1
130
+ # @option options [Integer] child @default -1
131
+ # @option options [Integer] created @default 0
132
+ # @option options [Integer] modified @default 0
133
+ # @option options [Integer] sector @default 0
134
+ def initialize(name, options= {})
135
+ @left = @right = @child = -1
136
+ @sector = @size = @created = @modified = 0
137
+ options.each do |o|
138
+ self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
139
+ end
140
+ @color ||= COLORS[:black]
141
+ @type ||= (data.nil? ? TYPES[:storage] : TYPES[:stream])
142
+ self.name = name
143
+ end
144
+
145
+ end
146
+ end