openxml-docx 0.9.0 → 0.10.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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +4 -4
  3. data/examples/drawing-ml +134 -0
  4. data/examples/table +28 -0
  5. data/lib/openxml/docx.rb +9 -0
  6. data/lib/openxml/docx/attribute_builder.rb +17 -4
  7. data/lib/openxml/docx/elements/absolute_position_tab.rb +4 -19
  8. data/lib/openxml/docx/elements/bidi_embed.rb +1 -10
  9. data/lib/openxml/docx/elements/bidi_override.rb +1 -9
  10. data/lib/openxml/docx/elements/break.rb +3 -14
  11. data/lib/openxml/docx/elements/control.rb +5 -2
  12. data/lib/openxml/docx/elements/deleted_text.rb +1 -1
  13. data/lib/openxml/docx/elements/drawing.rb +9 -0
  14. data/lib/openxml/docx/elements/element.rb +2 -1
  15. data/lib/openxml/docx/elements/embed_bold.rb +25 -0
  16. data/lib/openxml/docx/elements/embed_bold_italic.rb +25 -0
  17. data/lib/openxml/docx/elements/embed_italic.rb +25 -0
  18. data/lib/openxml/docx/elements/embed_regular.rb +25 -0
  19. data/lib/openxml/docx/elements/family.rb +22 -0
  20. data/lib/openxml/docx/elements/font.rb +14 -0
  21. data/lib/openxml/docx/elements/grid_column.rb +2 -2
  22. data/lib/openxml/docx/elements/group_shape.rb +10 -0
  23. data/lib/openxml/docx/elements/markup_compatibility_alternate_content.rb +10 -0
  24. data/lib/openxml/docx/elements/markup_compatibility_choice.rb +13 -0
  25. data/lib/openxml/docx/elements/markup_compatibility_fallback.rb +10 -0
  26. data/lib/openxml/docx/elements/paper_source.rb +4 -2
  27. data/lib/openxml/docx/elements/section_properties.rb +9 -0
  28. data/lib/openxml/docx/elements/symbol.rb +4 -2
  29. data/lib/openxml/docx/elements/table.rb +1 -1
  30. data/lib/openxml/docx/elements/table_cell.rb +2 -1
  31. data/lib/openxml/docx/elements/table_row.rb +7 -5
  32. data/lib/openxml/docx/elements/text.rb +1 -10
  33. data/lib/openxml/docx/elements/vml_container.rb +10 -0
  34. data/lib/openxml/docx/elements/word_processing_drawing_anchor.rb +23 -0
  35. data/lib/openxml/docx/elements/word_processing_drawing_effect_extent.rb +16 -0
  36. data/lib/openxml/docx/elements/word_processing_drawing_extent.rb +14 -0
  37. data/lib/openxml/docx/elements/word_processing_drawing_nv_graphic_frame_properties.rb +11 -0
  38. data/lib/openxml/docx/elements/word_processing_drawing_object_nv_properties.rb +17 -0
  39. data/lib/openxml/docx/elements/word_processing_drawing_position_h.rb +23 -0
  40. data/lib/openxml/docx/elements/word_processing_drawing_position_offset.rb +10 -0
  41. data/lib/openxml/docx/elements/word_processing_drawing_position_v.rb +23 -0
  42. data/lib/openxml/docx/elements/word_processing_drawing_simple_position.rb +13 -0
  43. data/lib/openxml/docx/elements/word_processing_drawing_wrap_none.rb +10 -0
  44. data/lib/openxml/docx/elements/word_processing_shapes_body_properties.rb +58 -0
  45. data/lib/openxml/docx/elements/word_processing_shapes_shape.rb +12 -0
  46. data/lib/openxml/docx/elements/word_processing_shapes_shape_properties.rb +23 -0
  47. data/lib/openxml/docx/package.rb +73 -1
  48. data/lib/openxml/docx/parts/document.rb +6 -24
  49. data/lib/openxml/docx/parts/fonts.rb +35 -0
  50. data/lib/openxml/docx/parts/footer.rb +32 -0
  51. data/lib/openxml/docx/parts/header.rb +32 -0
  52. data/lib/openxml/docx/parts/settings.rb +6 -2
  53. data/lib/openxml/docx/parts/styles.rb +5 -6
  54. data/lib/openxml/docx/properties.rb +0 -1
  55. data/lib/openxml/docx/properties/alignment.rb +1 -1
  56. data/lib/openxml/docx/properties/base_property.rb +13 -0
  57. data/lib/openxml/docx/properties/border.rb +11 -9
  58. data/lib/openxml/docx/properties/color.rb +6 -4
  59. data/lib/openxml/docx/properties/column.rb +4 -2
  60. data/lib/openxml/docx/properties/columns.rb +6 -4
  61. data/lib/openxml/docx/properties/complex_property.rb +1 -1
  62. data/lib/openxml/docx/properties/conditional_formatting.rb +14 -12
  63. data/lib/openxml/docx/properties/document_grid.rb +4 -10
  64. data/lib/openxml/docx/properties/east_asian_layout.rb +6 -11
  65. data/lib/openxml/docx/properties/font.rb +18 -22
  66. data/lib/openxml/docx/properties/footer_reference.rb +21 -0
  67. data/lib/openxml/docx/properties/frame.rb +16 -47
  68. data/lib/openxml/docx/properties/header_reference.rb +21 -0
  69. data/lib/openxml/docx/properties/indentation.rb +11 -8
  70. data/lib/openxml/docx/properties/language.rb +5 -3
  71. data/lib/openxml/docx/properties/latent_styles.rb +9 -6
  72. data/lib/openxml/docx/properties/latent_styles_exception.rb +9 -6
  73. data/lib/openxml/docx/properties/line_numbering.rb +5 -11
  74. data/lib/openxml/docx/properties/manual_width.rb +4 -2
  75. data/lib/openxml/docx/properties/numbering.rb +4 -2
  76. data/lib/openxml/docx/properties/page_borders.rb +6 -19
  77. data/lib/openxml/docx/properties/page_margins.rb +10 -7
  78. data/lib/openxml/docx/properties/page_numbering.rb +66 -74
  79. data/lib/openxml/docx/properties/page_size.rb +5 -12
  80. data/lib/openxml/docx/properties/shading.rb +46 -52
  81. data/lib/openxml/docx/properties/spacing.rb +9 -14
  82. data/lib/openxml/docx/properties/table_border.rb +12 -10
  83. data/lib/openxml/docx/properties/table_cell_border.rb +12 -10
  84. data/lib/openxml/docx/properties/table_cell_margin.rb +6 -4
  85. data/lib/openxml/docx/properties/table_cell_spacing.rb +5 -3
  86. data/lib/openxml/docx/properties/table_cell_width.rb +5 -3
  87. data/lib/openxml/docx/properties/table_indent.rb +5 -3
  88. data/lib/openxml/docx/properties/table_layout.rb +2 -4
  89. data/lib/openxml/docx/properties/table_look.rb +8 -6
  90. data/lib/openxml/docx/properties/table_p_pr.rb +11 -30
  91. data/lib/openxml/docx/properties/table_row_height.rb +13 -0
  92. data/lib/openxml/docx/properties/table_width.rb +5 -3
  93. data/lib/openxml/docx/properties/underline.rb +13 -12
  94. data/lib/openxml/docx/properties/wafter.rb +5 -3
  95. data/lib/openxml/docx/properties/wbefore.rb +5 -3
  96. data/lib/openxml/docx/root_namespaces.rb +74 -0
  97. data/lib/openxml/docx/section.rb +2 -0
  98. data/lib/openxml/docx/style.rb +4 -4
  99. data/lib/openxml/docx/version.rb +1 -1
  100. data/lib/openxml/drawingml.rb +17 -0
  101. data/lib/openxml/drawingml/elements.rb +13 -0
  102. data/lib/openxml/drawingml/elements/adjust_values_list.rb +11 -0
  103. data/lib/openxml/drawingml/elements/blip_fill.rb +14 -0
  104. data/lib/openxml/drawingml/elements/extension.rb +13 -0
  105. data/lib/openxml/drawingml/elements/extension_list.rb +11 -0
  106. data/lib/openxml/drawingml/elements/extents.rb +14 -0
  107. data/lib/openxml/drawingml/elements/graphic.rb +10 -0
  108. data/lib/openxml/drawingml/elements/graphic_data.rb +12 -0
  109. data/lib/openxml/drawingml/elements/graphic_frame_locks.rb +17 -0
  110. data/lib/openxml/drawingml/elements/head_end.rb +28 -0
  111. data/lib/openxml/drawingml/elements/no_fill.rb +10 -0
  112. data/lib/openxml/drawingml/elements/non_visual_drawing_properties.rb +17 -0
  113. data/lib/openxml/drawingml/elements/non_visual_picture_drawing_properties.rb +12 -0
  114. data/lib/openxml/drawingml/elements/non_visual_picture_properties.rb +10 -0
  115. data/lib/openxml/drawingml/elements/offset.rb +14 -0
  116. data/lib/openxml/drawingml/elements/outline.rb +36 -0
  117. data/lib/openxml/drawingml/elements/picture.rb +10 -0
  118. data/lib/openxml/drawingml/elements/preset_geometry.rb +210 -0
  119. data/lib/openxml/drawingml/elements/round.rb +10 -0
  120. data/lib/openxml/drawingml/elements/shape_guide.rb +40 -0
  121. data/lib/openxml/drawingml/elements/solid_fill.rb +10 -0
  122. data/lib/openxml/drawingml/elements/srgb_color.rb +14 -0
  123. data/lib/openxml/drawingml/elements/tail_end.rb +28 -0
  124. data/lib/openxml/drawingml/elements/transform_effect.rb +18 -0
  125. data/lib/openxml/drawingml/elements/wordprocessing_shape_group.rb +11 -0
  126. data/lib/openxml/vml.rb +17 -0
  127. data/lib/openxml/vml/elements.rb +13 -0
  128. data/lib/openxml/vml/elements/group.rb +88 -0
  129. data/lib/openxml/vml/elements/rectangle.rb +115 -0
  130. data/lib/openxml/vml/elements/rounded_rectangle.rb +121 -0
  131. data/openxml-docx.gemspec +1 -1
  132. data/spec/elements/absolute_position_tab_spec.rb +15 -47
  133. data/spec/elements/bidi_embed_spec.rb +4 -8
  134. data/spec/elements/bidi_override_spec.rb +4 -8
  135. data/spec/elements/break_spec.rb +8 -31
  136. data/spec/elements/content_part_spec.rb +2 -2
  137. data/spec/elements/control_spec.rb +6 -6
  138. data/spec/elements/deleted_text_spec.rb +2 -2
  139. data/spec/elements/drawing_spec.rb +11 -0
  140. data/spec/elements/drawingml/adjust_values_list_spec.rb +8 -0
  141. data/spec/elements/drawingml/blip_fill_spec.rb +34 -0
  142. data/spec/elements/drawingml/extension_list_spec.rb +8 -0
  143. data/spec/elements/drawingml/extension_spec.rb +19 -0
  144. data/spec/elements/drawingml/extents_spec.rb +33 -0
  145. data/spec/elements/drawingml/graphic_data_spec.rb +19 -0
  146. data/spec/elements/drawingml/graphic_frame_locks_spec.rb +78 -0
  147. data/spec/elements/drawingml/graphic_spec.rb +8 -0
  148. data/spec/elements/drawingml/head_end_spec.rb +45 -0
  149. data/spec/elements/drawingml/no_fill_spec.rb +8 -0
  150. data/spec/elements/drawingml/non_visual_drawing_properties_spec.rb +63 -0
  151. data/spec/elements/drawingml/non_visual_picture_drawing_properties_spec.rb +18 -0
  152. data/spec/elements/drawingml/non_visual_picture_properties_spec.rb +8 -0
  153. data/spec/elements/drawingml/offset_spec.rb +32 -0
  154. data/spec/elements/drawingml/outline_spec.rb +58 -0
  155. data/spec/elements/drawingml/picture_spec.rb +8 -0
  156. data/spec/elements/drawingml/preset_geometry_spec.rb +19 -0
  157. data/spec/elements/drawingml/round_spec.rb +8 -0
  158. data/spec/elements/drawingml/shape_guide_spec.rb +49 -0
  159. data/spec/elements/drawingml/solid_fill_spec.rb +8 -0
  160. data/spec/elements/drawingml/srgb_color_spec.rb +20 -0
  161. data/spec/elements/drawingml/tail_end_spec.rb +44 -0
  162. data/spec/elements/drawingml/transform_effect_spec.rb +80 -0
  163. data/spec/elements/drawingml/wordprocessing_shape_group_spec.rb +12 -0
  164. data/spec/elements/group_shape_spec.rb +11 -0
  165. data/spec/elements/markup_compatibility_alternate_content_spec.rb +11 -0
  166. data/spec/elements/markup_compatibility_choice_spec.rb +22 -0
  167. data/spec/elements/markup_compatibility_fallback_spec.rb +11 -0
  168. data/spec/elements/section_properties_spec.rb +12 -0
  169. data/spec/elements/symbol_spec.rb +4 -7
  170. data/spec/elements/text_spec.rb +2 -2
  171. data/spec/elements/vml/group_spec.rb +542 -0
  172. data/spec/elements/vml/rectangle_spec.rb +739 -0
  173. data/spec/elements/vml/rounded_rectangle_spec.rb +656 -0
  174. data/spec/elements/vml_container_spec.rb +11 -0
  175. data/spec/elements/word_processing_drawing_anchor_spec.rb +40 -0
  176. data/spec/elements/word_processing_drawing_effect_extent_spec.rb +57 -0
  177. data/spec/elements/word_processing_drawing_extent_spec.rb +34 -0
  178. data/spec/elements/word_processing_drawing_nv_graphic_frame_properties_spec.rb +11 -0
  179. data/spec/elements/word_processing_drawing_object_nv_properties_spec.rb +67 -0
  180. data/spec/elements/word_processing_drawing_position_h_spec.rb +21 -0
  181. data/spec/elements/word_processing_drawing_position_v_spec.rb +21 -0
  182. data/spec/elements/word_processing_drawing_simple_position_spec.rb +34 -0
  183. data/spec/elements/word_processing_drawing_wrap_none_spec.rb +12 -0
  184. data/spec/elements/word_processing_shapes_body_properties_spec.rb +223 -0
  185. data/spec/elements/word_processing_shapes_shape_properties_spec.rb +21 -0
  186. data/spec/elements/word_processing_shapes_shape_spec.rb +23 -0
  187. data/spec/parts/footer_spec.rb +33 -0
  188. data/spec/parts/header_spec.rb +33 -0
  189. data/spec/properties/footer_reference_spec.rb +32 -0
  190. data/spec/properties/header_reference_spec.rb +32 -0
  191. data/spec/properties/page_numbering_spec.rb +1 -1
  192. data/spec/properties/{table_cell_fit_text.rb → table_cell_fit_text_spec.rb} +0 -0
  193. data/spec/properties/{table_cell_width.rb → table_cell_width_spec.rb} +0 -0
  194. data/spec/properties/table_layout_spec.rb +14 -12
  195. data/spec/properties/{table_row_height.rb → table_row_height_spec.rb} +0 -0
  196. data/spec/section_spec.rb +2 -0
  197. data/spec/spec_helper.rb +2 -0
  198. data/spec/support/data/elements/grid_column_element.xml +1 -1
  199. data/spec/support/data/elements/table_grid_element.xml +1 -1
  200. data/spec/support/data/parts/document_with_children_part.xml +2 -1
  201. data/spec/support/data/parts/document_with_multiple_sections_part.xml +1 -1
  202. data/spec/support/data/parts/document_with_one_section_part.xml +1 -1
  203. data/spec/support/data/parts/empty_document_part.xml +1 -1
  204. data/spec/support/data/parts/empty_footer_part.xml +1 -0
  205. data/spec/support/data/parts/empty_header_part.xml +1 -0
  206. data/spec/support/data/parts/footer_with_children_part.xml +1 -0
  207. data/spec/support/data/parts/header_with_children_part.xml +1 -0
  208. data/spec/support/element_test_macros.rb +58 -9
  209. metadata +126 -9
  210. data/lib/openxml/docx/properties/tr_height.rb +0 -19
  211. data/lib/openxml/docx/properties/width_property.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1972ebd1b0c107bf2b90517f68e43451dd2ce03e
4
- data.tar.gz: 98dccd8c85eee5358beb36727ec4a9d73f2c0631
3
+ metadata.gz: 721596bd0a99e7649d104985afa53b7152101fa6
4
+ data.tar.gz: e956ff4f80b2ce46f3022e5a05f92bb99e7057ef
5
5
  SHA512:
6
- metadata.gz: 932d7911afa2eddb1611f2990a23fe4a6e5729f156d93a45a7c255e5e90eaabb5900d3c619b236320d838fe523676f959170f35b43b6c1b2ac894a12e2819a2f
7
- data.tar.gz: 32f62f244add36189be452dd40eb7a5e5521e17139d22fd27562cce63149ae61df95e98dd3fd661d6adc601e0462efef10e8700059946a3eeb8e0a8373205201
6
+ metadata.gz: bbfecbf3a5aa07b90d1909c0642926dc025cafd08866f75b283768c3b7e0943b88a29737bcd92a0e4de90e29a1011f35d9fdc8514480157f1238d67c8b91caf5
7
+ data.tar.gz: a0aeb4b5b1032e62f3531498e9d3ffe4e27ef4e7834d41e80917fcb4edfa57c0eabbd4cfed81688245f8f30476a739f9da76d4bae7a38f7e9ea8f7ec78d0f8bc
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openxml-docx (0.9.0)
4
+ openxml-docx (0.10.0)
5
5
  nokogiri
6
- openxml-package (>= 0.2.1)
6
+ openxml-package (>= 0.2.2)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
@@ -16,7 +16,7 @@ GEM
16
16
  mini_portile2 (2.0.0)
17
17
  nokogiri (1.6.7)
18
18
  mini_portile2 (~> 2.0.0.rc2)
19
- openxml-package (0.2.1)
19
+ openxml-package (0.2.2)
20
20
  nokogiri
21
21
  ox
22
22
  rubyzip (~> 1.1.0)
@@ -41,7 +41,7 @@ GEM
41
41
  rspec-support (~> 3.4.0)
42
42
  rspec-support (3.4.1)
43
43
  rubyzip (1.1.7)
44
- simplecov (0.11.0)
44
+ simplecov (0.11.1)
45
45
  docile (~> 1.1.0)
46
46
  json (~> 1.8)
47
47
  simplecov-html (~> 0.10.0)
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.push Dir.pwd + "/lib"
4
+ require "openxml/docx"
5
+ require "openxml/vml"
6
+
7
+ include OpenXml::Docx::Elements
8
+
9
+ document = OpenXml::Docx::Package.new
10
+
11
+ table = Table.new
12
+ table.table_width.type = :auto
13
+ table.table_width.width = 0
14
+ table.table_layout = :fixed
15
+
16
+ table_cell_margins = OpenXml::Docx::Properties::TableCellMargins.new
17
+ start_margin = OpenXml::Docx::Properties::TableCellMargin.new(:start)
18
+ end_margin = OpenXml::Docx::Properties::TableCellMargin.new(:end)
19
+ start_margin.type = :dxa
20
+ start_margin.width = 86
21
+ end_margin.type = :dxa
22
+ end_margin.width = 86
23
+ table_cell_margins << start_margin
24
+ table_cell_margins << end_margin
25
+
26
+ table << table_cell_margins
27
+
28
+ table.table_look.firstColumn = false
29
+ table.table_look.firstRow = false
30
+ table.table_look.lastColumn = false
31
+ table.table_look.lastRow = false
32
+ table.table_look.noHBand = false
33
+ table.table_look.noVBand = false
34
+
35
+ table_grid = TableGrid.new
36
+ [3787, 172, 3787, 172, 3787].each do |width|
37
+ grid_column = GridColumn.new
38
+ grid_column.w = width
39
+ table_grid << grid_column
40
+ end
41
+
42
+ table << table_grid
43
+
44
+ table_row = TableRow.new
45
+ table_row.table_row_height.hRule = :exact
46
+ table_row.table_row_height.val = 1140
47
+
48
+ table_cell = TableCell.new
49
+
50
+ table_cell_width = OpenXml::Docx::Properties::TableCellWidth.new
51
+ table_cell_width.type = :dxa
52
+ table_cell_width.width = 0
53
+ table_cell << table_cell_width
54
+
55
+ table_cell_margins = OpenXml::Docx::Properties::TableCellMargins.new
56
+
57
+ top_margin = OpenXml::Docx::Properties::TableCellMargin.new(:top)
58
+ top_margin.type = :dxa
59
+ top_margin.width = 0
60
+
61
+ bottom_margin = OpenXml::Docx::Properties::TableCellMargin.new(:bottom)
62
+ bottom_margin.type = :dxa
63
+ bottom_margin.width = 0
64
+
65
+ table_cell_margins << top_margin
66
+ table_cell_margins << bottom_margin
67
+ table_cell << table_cell_margins
68
+
69
+ table_cell.v_align = :center
70
+
71
+ paragraph = Paragraph.new
72
+ table_cell << paragraph
73
+ table_row << table_cell
74
+ table << table_row
75
+ document.document << table
76
+
77
+ outline_paragraph = Paragraph.new
78
+ outline_paragraph.spacing.after = 0
79
+ outline_paragraph.spacing.line = 20
80
+ outline_paragraph.spacing.line_rule = :exact
81
+
82
+ outline_run = Run.new
83
+
84
+ vml_container = VmlContainer.new
85
+
86
+ round_rectangle = OpenXml::Vml::Elements::RoundedRectangle.new
87
+ round_rectangle.arc_size = "6554f"
88
+ round_rectangle.filled = :false
89
+ round_rectangle.id = "AutoShape_x0020_31"
90
+ round_rectangle.allow_in_cell = :false
91
+ round_rectangle.optional_string = "_x0000_s1026"
92
+ round_rectangle.stroke_color = "#bfbfbf"
93
+ round_rectangle.stroke_weight = ".25pt"
94
+ round_rectangle.print = :false
95
+ style_string = "position:absolute;margin-left:13.55pt;margin-top:36.1pt;width:189.35pt;height:1in;z-index:251642880;visibility:visible;mso-wrap-style:square;mso-width-percent:0;mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:page;mso-position-vertical:absolute;mso-position-vertical-relative:page;mso-width-percent:0;mso-height-percent:0;mso-width-relative:page;mso-height-relative:page;v-text-anchor:top"
96
+ round_rectangle.style = style_string
97
+
98
+ vml_container << round_rectangle
99
+
100
+ outline_run << vml_container
101
+
102
+ outline_paragraph << outline_run
103
+
104
+ document.document << outline_paragraph
105
+
106
+ section_properties = SectionProperties.new
107
+
108
+ page_size = OpenXml::Docx::Properties::PageSize.new
109
+ page_size.height = 15840
110
+ page_size.width = 12240
111
+ section_properties << page_size
112
+
113
+ page_margin = OpenXml::Docx::Properties::PageMargins.new
114
+ page_margin.bottom = 600
115
+ page_margin.footer = 0
116
+ page_margin.gutter = 0
117
+ page_margin.header = 0
118
+ page_margin.left = 367
119
+ page_margin.right = 446
120
+ page_margin.top = 720
121
+
122
+ section_properties << page_margin
123
+
124
+ columns = OpenXml::Docx::Properties::Columns.new
125
+ columns.space = 720
126
+
127
+ section_properties << columns
128
+
129
+ document.document << section_properties
130
+
131
+ filename = "border_test.docx"
132
+ system "rm -f ~/Desktop/#{filename}" # -f so that we don't have an error if the file doesn't exist
133
+ document.save File.expand_path("~/Desktop/#{filename}")
134
+ exec "open ~/Desktop/#{filename}"
data/examples/table CHANGED
@@ -61,6 +61,34 @@ end
61
61
 
62
62
  document.document << table
63
63
 
64
+ header = OpenXml::Docx::Parts::Header.new
65
+ paragraph = Paragraph.new
66
+ run = Run.new
67
+ run << Text.new("This is some header text")
68
+ paragraph << run
69
+ header << paragraph
70
+
71
+ header_id = document.add_header(header)
72
+
73
+ footer = OpenXml::Docx::Parts::Footer.new
74
+ paragraph = Paragraph.new
75
+ run = Run.new
76
+ run << Text.new("This is some footer text")
77
+ paragraph << run
78
+ footer << paragraph
79
+
80
+ footer_id = document.add_footer(footer)
81
+
82
+ section = OpenXml::Docx::Section.new
83
+ section.header_reference.id = header_id
84
+ section.header_reference.type = :default
85
+
86
+ section.footer_reference.id = footer_id
87
+ section.footer_reference.type = :default
88
+
89
+ document.document << section
90
+
91
+
64
92
  filename = "rocx_test_table.docx"
65
93
  system "rm -f ~/Desktop/#{filename}" # -f so that we don't have an error if the file doesn't exist
66
94
  document.save File.expand_path("~/Desktop/#{filename}")
data/lib/openxml/docx.rb CHANGED
@@ -3,16 +3,25 @@ module OpenXml
3
3
  REL_DOCUMENT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument".freeze
4
4
  REL_STYLES = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles".freeze
5
5
  REL_SETTINGS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings".freeze
6
+ REL_HEADER = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header".freeze
7
+ REL_FOOTER = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer".freeze
8
+ REL_FONT_TABLE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable".freeze
9
+ REL_FONT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/font".freeze
6
10
 
7
11
  TYPE_STYLES = "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml".freeze
8
12
  TYPE_SETTINGS = "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml".freeze
13
+ TYPE_HEADER = "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml".freeze
14
+ TYPE_FOOTER = "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml".freeze
15
+ TYPE_FONT_TABLE = "application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml".freeze
9
16
  TYPE_XML = "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml".freeze
17
+ TYPE_OBSCURED_FONT = "application/vnd.openxmlformats-officedocument.obfuscatedFont".freeze
10
18
  end
11
19
  end
12
20
 
13
21
  require "openxml/docx/attribute_builder"
14
22
  require "openxml/docx/property_builder"
15
23
  require "openxml/docx/properties"
24
+ require "openxml/docx/root_namespaces"
16
25
  require "openxml/docx/elements"
17
26
  require "openxml/docx/package"
18
27
  require "openxml/docx/parts"
@@ -203,24 +203,30 @@ module OpenXml
203
203
  end
204
204
 
205
205
  module ClassMethods
206
- def attribute(name, expects: nil, displays_as: nil, namespace: nil)
206
+ def attribute(name, expects: nil, one_of: nil, displays_as: nil, namespace: nil)
207
207
  bad_names = %w(tag name namespace properties_tag)
208
208
  raise ArgumentError if bad_names.member? name
209
209
 
210
210
  attr_reader name
211
211
 
212
212
  define_method "#{name}=" do |value|
213
- send(expects, value)
213
+ valid_in?(value, one_of) unless one_of.nil?
214
+ send(expects, value) unless expects.nil?
214
215
  instance_variable_set "@#{name}", value
215
216
  end
216
217
 
217
218
  camelized_name = name.to_s.gsub(/_([a-z])/i) { $1.upcase }.to_sym
218
- attributes[name] = [displays_as || camelized_name, namespace || :w]
219
+ attributes[name] = [displays_as || camelized_name, namespace || @attribute_namespace]
219
220
  end
220
221
 
221
222
  def attributes
222
223
  @attributes ||= {}
223
224
  end
225
+
226
+ def with_namespace(namespace, &block)
227
+ @attribute_namespace = namespace
228
+ instance_eval(&block)
229
+ end
224
230
  end
225
231
 
226
232
  def render?
@@ -237,7 +243,9 @@ module OpenXml
237
243
  attributes.each_with_object({}) do |(name, options), attrs|
238
244
  display, namespace = options
239
245
  value = send(name)
240
- attrs["#{namespace}:#{display}"] = value if value
246
+ attr_name = "#{namespace}:#{display}"
247
+ attr_name = "#{display}" if namespace.nil?
248
+ attrs[attr_name] = value if value
241
249
  end
242
250
  end
243
251
 
@@ -276,6 +284,11 @@ module OpenXml
276
284
  raise ArgumentError, message if !value.is_a?(String) || value.length.zero?
277
285
  end
278
286
 
287
+ def percentage(value)
288
+ message = "Invalid #{name}: must be a percentage"
289
+ raise ArgumentError, message unless value.is_a?(String) && value =~ /-?[0-9]+(\.[0-9]+)?%/ # Regex supplied in sec. 22.9.2.9 of Office Open XML docs
290
+ end
291
+
279
292
  def on_or_off(value)
280
293
  valid_in? value, [:on, :off]
281
294
  end
@@ -3,26 +3,11 @@ module OpenXml
3
3
  module Elements
4
4
  class AbsolutePositionTab < Element
5
5
  tag :ptab
6
- attribute :alignment, expects: :valid_ptab_alignment
7
- attribute :leader, expects: :valid_ptab_leader
8
- attribute :relativeTo, expects: :valid_ptab_relative_to
9
6
 
10
- VALID_PTAB_ALIGNMENTS = %i(center left right)
11
- VALID_PTAB_LEADERS = %i(dot hyphen middleDot none underscore)
12
- VALID_PTAB_RELATIVE_TOS = %i(indent margin)
13
-
14
- private
15
-
16
- def valid_ptab_alignment(value)
17
- valid_in? value, VALID_PTAB_ALIGNMENTS
18
- end
19
-
20
- def valid_ptab_leader(value)
21
- valid_in? value, VALID_PTAB_LEADERS
22
- end
23
-
24
- def valid_ptab_relative_to(value)
25
- valid_in? value, VALID_PTAB_RELATIVE_TOS
7
+ with_namespace :w do
8
+ attribute :alignment, one_of: %i(center left right)
9
+ attribute :leader, one_of: %i(dot hyphen middleDot none underscore)
10
+ attribute :relativeTo, one_of: %i(indent margin)
26
11
  end
27
12
 
28
13
  end
@@ -3,16 +3,7 @@ module OpenXml
3
3
  module Elements
4
4
  class BidiEmbed < Container
5
5
  tag :dir
6
- attribute :direction, expects: :valid_direction, displays_as: :val
7
-
8
- VALID_DIRECTIONS = %i(rtl ltr)
9
-
10
- private
11
-
12
- def valid_direction(value)
13
- valid_in? value, VALID_DIRECTIONS
14
- end
15
-
6
+ attribute :direction, one_of: %i(rtl ltr), displays_as: :val, namespace: :w
16
7
  end
17
8
  end
18
9
  end
@@ -3,15 +3,7 @@ module OpenXml
3
3
  module Elements
4
4
  class BidiOverride < Container
5
5
  tag :bdo
6
- attribute :direction, expects: :valid_direction, displays_as: :val
7
-
8
- VALID_DIRECTIONS = %i(rtl ltr)
9
-
10
- private
11
-
12
- def valid_direction(value)
13
- valid_in? value, VALID_DIRECTIONS
14
- end
6
+ attribute :direction, one_of: %i(rtl ltr), displays_as: :val, namespace: :w
15
7
 
16
8
  end
17
9
  end
@@ -4,20 +4,9 @@ module OpenXml
4
4
  class Break < Element
5
5
  tag :br
6
6
 
7
- attribute :clear, expects: :valid_clear
8
- attribute :type, expects: :valid_break_type
9
-
10
- VALID_CLEARS = %i(all left none right)
11
- VALID_BREAK_TYPES = %i(column page textWrapping)
12
-
13
- private
14
-
15
- def valid_clear(value)
16
- valid_in? value, VALID_CLEARS
17
- end
18
-
19
- def valid_break_type(value)
20
- valid_in? value, VALID_BREAK_TYPES
7
+ with_namespace :w do
8
+ attribute :clear, one_of: %i(all left none right)
9
+ attribute :type, one_of: %i(column page textWrapping)
21
10
  end
22
11
 
23
12
  end
@@ -3,8 +3,11 @@ module OpenXml
3
3
  module Elements
4
4
  class Control < Element
5
5
  attribute :id, expects: :string, namespace: :r
6
- attribute :unique_name, expects: :string, displays_as: :name
7
- attribute :shape_id, expects: :string, displays_as: :shapeid
6
+
7
+ with_namespace :w do
8
+ attribute :unique_name, expects: :string, displays_as: :name
9
+ attribute :shape_id, expects: :string, displays_as: :shapeid
10
+ end
8
11
 
9
12
  end
10
13
  end
@@ -3,7 +3,7 @@ module OpenXml
3
3
  module Elements
4
4
  class DeletedText < Text
5
5
  tag :del
6
- attribute :space, expects: :valid_space_preserve, namespace: :xml
6
+ attribute :space, one_of: [:preserve, nil], namespace: :xml
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,9 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class Drawing < Element
5
+ tag :drawing
6
+ end
7
+ end
8
+ end
9
+ end
@@ -6,6 +6,7 @@ module OpenXml
6
6
 
7
7
  class << self
8
8
  attr_reader :property_name
9
+ attr_reader :namespace
9
10
 
10
11
  def tag(*args)
11
12
  @tag = args.first if args.any?
@@ -37,7 +38,7 @@ module OpenXml
37
38
  end
38
39
 
39
40
  def to_xml(xml)
40
- xml["w"].public_send(tag, xml_attributes)
41
+ xml[namespace].public_send(tag, xml_attributes)
41
42
  end
42
43
 
43
44
  private
@@ -0,0 +1,25 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class EmbedBold < Element
5
+ namespace :w
6
+
7
+ with_namespace :w do
8
+ attribute :font_key, expects: :bracketed_guid, displays_as: :fontKey
9
+ attribute :subsetted, expects: :true_or_false
10
+ end
11
+
12
+ attribute :relationship_id, expects: :string, displays_as: :id, namespace: :r
13
+
14
+
15
+ private
16
+
17
+ def bracketed_guid(value)
18
+ guid_regex = /\{[0-9A-F]{8}\-[0-9A-F]{4}\-[0-9A-F]{4}\-[0-9A-F]{4}\-[0-9A-F]{12}\}/ # Regex taken from spec section 22.9.2.4
19
+ raise ArgumentError, "Not a validly-formatted GUID" unless value =~ guid_regex
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end