openxml-docx 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,23 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingDrawingPositionV < Container
5
+ tag :positionV
6
+ namespace :wp
7
+
8
+ attribute :relativeFrom, expects: :valid_relative_from
9
+
10
+ private
11
+
12
+ def valid_relative_from(value)
13
+ raise ArgumentError unless ok_values.include? value
14
+ end
15
+
16
+ def ok_values
17
+ %i(bottomMargin insideMargin line margin outsideMargin page
18
+ paragraph topMargin)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingDrawingSimplePosition < Element
5
+ tag :simplePos
6
+ namespace :wp
7
+
8
+ attribute :x, expects: :integer
9
+ attribute :y, expects: :integer
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingDrawingWrapNone < Element
5
+ tag :wrapNone
6
+ namespace :wp
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,58 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingShapesBodyProperties < Container
5
+ tag :bodyPr
6
+ namespace :wps
7
+
8
+ attribute :anchor, expects: :anchor_value
9
+ attribute :anchorCtr, expects: :true_or_false
10
+ attribute :bottom_inset, expects: :positive_integer, displays_as: :bIns
11
+ attribute :compatible_line_spacing, expects: :true_or_false, displays_as: :compatLnSpc
12
+ attribute :force_anti_alias, expects: :true_or_false, displays_as: :forceAA
13
+ attribute :fromWordArt, expects: :true_or_false
14
+ attribute :horzOverflow, expects: :horizontal_overflow_value
15
+ attribute :left_inset, expects: :positive_integer, displays_as: :lIns
16
+ attribute :numCol, expects: :number_of_columns
17
+ attribute :right_inset, expects: :positive_integer, displays_as: :rIns
18
+ attribute :rotation, expects: :integer, displays_as: :rot
19
+ attribute :right_to_left_columns, expects: :true_or_false, displays_as: :rtlCol
20
+ attribute :space_between_columns, expects: :positive_integer, displays_as: :spcCol
21
+ attribute :paragraph_spacing, expects: :true_or_false, displays_as: :spcFirstLastPara
22
+ attribute :top_inset, expects: :positive_integer, displays_as: :tIns
23
+ attribute :upright, expects: :true_or_false
24
+ attribute :vert, expects: :vertical_value
25
+ attribute :vertOverflow, expects: :vertical_overflow_value
26
+ attribute :wrap, expects: :wrap_value
27
+
28
+ private
29
+
30
+ def anchor_value(value)
31
+ raise ArgumentError unless %i(b ctr dist just t).include? value
32
+ end
33
+
34
+ def horizontal_overflow_value(value)
35
+ raise ArgumentError unless %i(clip overflow).include? value
36
+ end
37
+
38
+ def number_of_columns(value)
39
+ raise ArgumentError unless (1..16).to_a.include? value
40
+ end
41
+
42
+ def vertical_value(value)
43
+ ok_values = %i(eaVert horz mongolianVert vert vert270 wordArt Vert wordArtVertRtl)
44
+ raise ArgumentError unless ok_values.include? value
45
+ end
46
+
47
+ def vertical_overflow_value(value)
48
+ raise ArgumentError unless %i(clip ellipsis overflow).include? value
49
+ end
50
+
51
+ def wrap_value(value)
52
+ raise ArgumentError unless %i(none square).include? value
53
+ end
54
+
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,12 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingShapesShape < Container
5
+ tag :wsp
6
+ namespace :wps
7
+
8
+ attribute :normalEastAsianFlow, expects: :true_or_false
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingShapesShapeProperties < Container
5
+ tag :spPr
6
+ namespace :wps
7
+
8
+ attribute :bwMode, expects: :valid_colors
9
+
10
+ private
11
+
12
+ def valid_colors(value)
13
+ raise ArgumentError unless ok_values.include? value
14
+ end
15
+
16
+ def ok_values
17
+ %i(auto black blackGray blackWhite clr gray grayWhite hidden invGray ltGray white)
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -5,13 +5,19 @@ module OpenXml
5
5
  class Package < OpenXml::Package
6
6
  attr_reader :document,
7
7
  :doc_rels,
8
+ :font_rels,
8
9
  :settings,
9
- :styles
10
+ :headers,
11
+ :footers,
12
+ :styles,
13
+ :fonts
10
14
 
11
15
  content_types do
12
16
  default "xml", TYPE_XML
17
+ default "odttf", TYPE_OBSCURED_FONT
13
18
  override "/word/styles.xml", TYPE_STYLES
14
19
  override "/word/settings.xml", TYPE_SETTINGS
20
+ override "/word/fontTable.xml", TYPE_FONT_TABLE
15
21
  end
16
22
 
17
23
  def initialize
@@ -19,17 +25,83 @@ module OpenXml
19
25
 
20
26
  rels.add_relationship REL_DOCUMENT, "/word/document.xml"
21
27
  @doc_rels = OpenXml::Parts::Rels.new
28
+ @font_rels = OpenXml::Parts::Rels.new
22
29
  @settings = OpenXml::Docx::Parts::Settings.new
23
30
  @styles = OpenXml::Docx::Parts::Styles.new
31
+ @fonts = OpenXml::Docx::Parts::Fonts.new
24
32
  @document = OpenXml::Docx::Parts::Document.new
33
+ @headers = []
34
+ @footers = []
25
35
 
26
36
  doc_rels.add_relationship REL_STYLES, "styles.xml"
27
37
  doc_rels.add_relationship REL_SETTINGS, "settings.xml"
38
+ doc_rels.add_relationship REL_FONT_TABLE, "fontTable.xml"
28
39
 
29
40
  add_part "word/_rels/document.xml.rels", doc_rels
41
+ add_part "word/_rels/fontTable.xml.rels", font_rels
30
42
  add_part "word/document.xml", document
31
43
  add_part "word/settings.xml", settings
32
44
  add_part "word/styles.xml", styles
45
+ add_part "word/fontTable.xml", fonts
46
+ end
47
+
48
+ def embed_truetype_font(path: nil, name: nil)
49
+ File.open(path, "rb") do |source_font|
50
+ obfuscation_data = obfuscate_font source_font
51
+ data = obfuscation_data[:bytes] << source_font.read
52
+ destination_font_name = "font#{fonts.fonts.count + 1}.odttf"
53
+ add_part "word/fonts/#{destination_font_name}", OpenXml::Parts::UnparsedPart.new(data)
54
+ font_relationship = font_rels.add_relationship REL_FONT, "fonts/#{destination_font_name}"
55
+
56
+ font_description = OpenXml::Docx::Elements::Font.new
57
+ font_description.font_name = name
58
+ embed_tag = OpenXml::Docx::Elements::EmbedRegular.new
59
+ embed_tag.font_key = "{#{obfuscation_data[:key]}}"
60
+ embed_tag.relationship_id = font_relationship.id
61
+ font_description << embed_tag
62
+ fonts << font_description
63
+ end
64
+ end
65
+
66
+ def add_header(header)
67
+ headers << header
68
+ header_name = "header#{headers.count}.xml"
69
+ Package.content_types { override "/word/#{header_name}", TYPE_HEADER }
70
+ add_part "word/#{header_name}", header
71
+ relationship = doc_rels.add_relationship REL_HEADER, header_name
72
+ relationship.id
73
+ end
74
+
75
+ def add_footer(footer)
76
+ footers << footer
77
+ footer_name = "footer#{footers.count}.xml"
78
+ Package.content_types { override "/word/#{footer_name}", TYPE_FOOTER }
79
+ add_part "word/#{footer_name}", footer
80
+ relationship = doc_rels.add_relationship REL_FOOTER, footer_name
81
+ relationship.id
82
+ end
83
+
84
+ private
85
+
86
+ def obfuscate_font(font)
87
+ # From the OpenXml spec, section 17.8.1, the algorithm for obfuscating a font:
88
+ # - Generate a GUID, which is used and stored as the obfuscation key
89
+ # - Reverse the order of the bytes in the GUID (i.e. Big Endian ordering)
90
+ # - XOR the value with the first 32 bytes of the binary: once against 0-15, once against 16-31
91
+ # - Store the resulting file in the document, and store the obfuscation key in the fontKey attribute
92
+
93
+ key = SecureRandom::uuid.upcase # Spec requires hex characters be uppercase
94
+ raw_key = key.gsub("-", "")
95
+ big_endian_key = [raw_key].pack("H*").bytes.reverse
96
+ obfuscated_bytes = []
97
+ 2.times do
98
+ bytes = font.read(16).bytes
99
+ (0...16).each do |index|
100
+ obfuscated_bytes << (bytes[index] ^ big_endian_key[index])
101
+ end
102
+ end
103
+
104
+ { key: key, bytes: obfuscated_bytes.pack("C*") }
33
105
  end
34
106
 
35
107
  end
@@ -2,8 +2,13 @@ module OpenXml
2
2
  module Docx
3
3
  module Parts
4
4
  class Document < OpenXml::Part
5
+ include RootNamespaces
6
+
5
7
  attr_reader :children, :current_section
6
8
 
9
+ use_namespaces :wpc, :mo, :mv, :o, :r, :m, :v, :wp14, :wp, :w10, :w14, :wpg, :wpi, :wne, :wps, :w, :mc, :a14, :pic
10
+ can_ignore :w14, :wp14, :a14
11
+
7
12
  def initialize
8
13
  @children = []
9
14
  end
@@ -28,7 +33,7 @@ module OpenXml
28
33
  def to_xml
29
34
  build_xml do |xml|
30
35
  xml.document(root_namespaces) {
31
- xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix == "w" }
36
+ xml.parent.namespace = :w
32
37
  xml["w"].body {
33
38
  children.each { |child| child.to_xml(xml) }
34
39
  current_section.to_xml(xml) unless current_section.nil?
@@ -37,29 +42,6 @@ module OpenXml
37
42
  end
38
43
  end
39
44
 
40
- private
41
-
42
- def root_namespaces
43
- { "xmlns:wpc" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas',
44
- "xmlns:mo" => 'http://schemas.microsoft.com/office/mac/office/2008/main',
45
- "xmlns:mv" => 'urn:schemas-microsoft-com:mac:vml',
46
- "xmlns:o" => 'urn:schemas-microsoft-com:office:office',
47
- "xmlns:r" => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
48
- "xmlns:m" => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
49
- "xmlns:v" => 'urn:schemas-microsoft-com:vml',
50
- "xmlns:wp14" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing',
51
- "xmlns:wp" => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
52
- "xmlns:w10" => 'urn:schemas-microsoft-com:office:word',
53
- "xmlns:w14" => 'http://schemas.microsoft.com/office/word/2010/wordml',
54
- "xmlns:wpg" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingGroup',
55
- "xmlns:wpi" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingInk',
56
- "xmlns:wne" => 'http://schemas.microsoft.com/office/word/2006/wordml',
57
- "xmlns:wps" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
58
- "xmlns:w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
59
- "xmlns:mc" => "http://schemas.openxmlformats.org/markup-compatibility/2006",
60
- "mc:Ignorable" => "w14 wp14" }
61
- end
62
-
63
45
  end
64
46
  end
65
47
  end
@@ -0,0 +1,35 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Parts
4
+ class Fonts < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ attr_reader :fonts
8
+
9
+ use_namespaces :r, :w
10
+
11
+ def initialize
12
+ @fonts = []
13
+ end
14
+
15
+ def <<(font)
16
+ @fonts << font
17
+ end
18
+
19
+ def count
20
+ fonts.count
21
+ end
22
+
23
+ def to_xml
24
+ build_standalone_xml do |xml|
25
+ xml.fonts(root_namespaces) {
26
+ xml.parent.namespace = :w
27
+ fonts.each { |font| font.to_xml(xml) }
28
+ }
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Parts
4
+ class Footer < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ use_namespaces :wpc, :mo, :mv, :o, :r, :m, :v, :wp14, :wp, :w10, :w14, :w15, :wpg, :wpi, :wne, :wps, :w, :mc, :a, :a14
8
+ can_ignore :w14, :w15, :wp14, :a14
9
+
10
+ attr_reader :children
11
+
12
+ def initialize
13
+ @children = []
14
+ end
15
+
16
+ def <<(child)
17
+ children << child
18
+ end
19
+
20
+ def to_xml
21
+ build_xml do |xml|
22
+ xml.ftr(root_namespaces) {
23
+ xml.parent.namespace = :w
24
+ children.each { |child| child.to_xml(xml) }
25
+ }
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Parts
4
+ class Header < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ use_namespaces :wpc, :mo, :mv, :o, :r, :m, :v, :wp14, :wp, :w10, :w14, :w15, :wpg, :wpi, :wne, :wps, :w, :mc, :a, :a14
8
+ can_ignore :w14, :w15, :wp14, :a14
9
+
10
+ attr_reader :children
11
+
12
+ def initialize
13
+ @children = []
14
+ end
15
+
16
+ def <<(child)
17
+ children << child
18
+ end
19
+
20
+ def to_xml
21
+ build_xml do |xml|
22
+ xml.hdr(root_namespaces) {
23
+ xml.parent.namespace = :w
24
+ children.each { |child| child.to_xml(xml) }
25
+ }
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,6 +2,10 @@ module OpenXml
2
2
  module Docx
3
3
  module Parts
4
4
  class Settings < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ use_namespace :w
8
+
5
9
  attr_reader :settings
6
10
 
7
11
  def initialize
@@ -10,8 +14,8 @@ module OpenXml
10
14
 
11
15
  def to_xml
12
16
  build_standalone_xml do |xml|
13
- xml.settings("xmlns:w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main") {
14
- xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix == "w" }
17
+ xml.settings(root_namespaces) {
18
+ xml.parent.namespace = :w
15
19
  }
16
20
  end
17
21
  end
@@ -2,6 +2,10 @@ module OpenXml
2
2
  module Docx
3
3
  module Parts
4
4
  class Styles < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ use_namespaces :r, :w
8
+
5
9
  attr_reader :styles
6
10
 
7
11
  def initialize
@@ -15,7 +19,7 @@ module OpenXml
15
19
  def to_xml
16
20
  build_standalone_xml do |xml|
17
21
  xml.styles(root_namespaces) {
18
- xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix == "w" }
22
+ xml.parent.namespace = :w
19
23
  add_default_styles(xml)
20
24
  styles.each { |style| style.to_xml(xml) }
21
25
  }
@@ -39,11 +43,6 @@ module OpenXml
39
43
  }
40
44
  end
41
45
 
42
- def root_namespaces
43
- { "xmlns:r" => "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
44
- "xmlns:w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main" }
45
- end
46
-
47
46
  end
48
47
  end
49
48
  end