ooxml_parser 0.32.0 → 0.34.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/docx_drawing.rb +9 -0
  3. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/drawing_properties/docx_drawing_properties.rb +6 -2
  4. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/drawing_properties/ooxml_coordinates.rb +15 -9
  5. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/docx_graphic.rb +2 -1
  6. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/shape/shape_properties/custom_geometry/docx_custom_geometry/docx_shape_line_path/docx_shape_line_element.rb +1 -1
  7. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/shape/shape_properties/docx_shape_size.rb +4 -4
  8. data/lib/ooxml_parser/common_parser/common_data/borders_properties.rb +2 -2
  9. data/lib/ooxml_parser/common_parser/common_data/color/color_helper.rb +14 -13
  10. data/lib/ooxml_parser/common_parser/common_data/color/ooxml_color.rb +4 -0
  11. data/lib/ooxml_parser/common_parser/common_data/color.rb +17 -13
  12. data/lib/ooxml_parser/common_parser/common_data/colors/color_alpha_channel.rb +19 -5
  13. data/lib/ooxml_parser/common_parser/common_data/colors/color_properties.rb +34 -12
  14. data/lib/ooxml_parser/common_parser/common_data/colors/image_fill.rb +2 -2
  15. data/lib/ooxml_parser/common_parser/common_data/hyperlink.rb +4 -0
  16. data/lib/ooxml_parser/common_parser/common_data/ooxml_document_object.rb +22 -1
  17. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_properties/numbering_properties.rb +18 -4
  18. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_properties.rb +4 -2
  19. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run/run_properties/run_fonts.rb +26 -0
  20. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run/run_properties.rb +12 -3
  21. data/lib/ooxml_parser/common_parser/common_data/table/margins/table_margins.rb +4 -4
  22. data/lib/ooxml_parser/common_parser/common_data/table/row/cell/cell_properties.rb +14 -4
  23. data/lib/ooxml_parser/common_parser/common_data/table/table_properties.rb +3 -2
  24. data/lib/ooxml_parser/common_parser/common_data/underline.rb +22 -1
  25. data/lib/ooxml_parser/common_parser/common_data/valued_child.rb +14 -0
  26. data/lib/ooxml_parser/common_parser/parser/ooxml_file.rb +10 -0
  27. data/lib/ooxml_parser/docx_parser/document_structure/default_style_helper.rb +79 -0
  28. data/lib/ooxml_parser/docx_parser/document_structure/document_background.rb +6 -1
  29. data/lib/ooxml_parser/docx_parser/document_structure/document_style.rb +9 -3
  30. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/accent.rb +9 -2
  31. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/bar.rb +9 -3
  32. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/group_char.rb +25 -4
  33. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/matrix.rb +2 -1
  34. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_paragraph_run/docx_paragraph_run_helpers.rb +25 -19
  35. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_paragraph_run/field_char.rb +22 -0
  36. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_paragraph_run.rb +3 -1
  37. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/checkbox/checkbox_state.rb +26 -0
  38. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/checkbox.rb +35 -0
  39. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/combobox/list_item.rb +26 -0
  40. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/combobox.rb +28 -0
  41. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/dropdown_list.rb +27 -0
  42. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/form_properties.rb +48 -0
  43. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/form_text_properties/form_text_comb.rb +26 -0
  44. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/form_text_properties/form_text_format.rb +30 -0
  45. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/form_text_properties.rb +45 -0
  46. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties.rb +25 -0
  47. data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph.rb +6 -5
  48. data/lib/ooxml_parser/docx_parser/document_structure/header_footer.rb +14 -2
  49. data/lib/ooxml_parser/docx_parser/document_structure/page_properties/columns.rb +2 -2
  50. data/lib/ooxml_parser/docx_parser/document_structure/page_properties/note.rb +10 -11
  51. data/lib/ooxml_parser/docx_parser/document_structure/page_properties/page_properties/header_footer_reference.rb +27 -0
  52. data/lib/ooxml_parser/docx_parser/document_structure/page_properties/page_properties/page_borders.rb +26 -0
  53. data/lib/ooxml_parser/docx_parser/document_structure/page_properties/page_properties.rb +20 -12
  54. data/lib/ooxml_parser/docx_parser/document_structure/styles/document_defaults/paragraph_properties_default.rb +3 -0
  55. data/lib/ooxml_parser/docx_parser/document_structure/styles.rb +6 -0
  56. data/lib/ooxml_parser/docx_parser/document_structure.rb +2 -69
  57. data/lib/ooxml_parser/pptx_parser/presentation/presentation_comments/presentation_comment.rb +1 -1
  58. data/lib/ooxml_parser/pptx_parser/presentation/slide/graphic_frame/graphic_frame/chart_reference.rb +22 -0
  59. data/lib/ooxml_parser/pptx_parser/presentation/slide/graphic_frame/graphic_frame.rb +4 -1
  60. data/lib/ooxml_parser/version.rb +1 -1
  61. data/lib/ooxml_parser/xlsx_parser/workbook/pivot_table_definition/location.rb +6 -6
  62. data/lib/ooxml_parser/xlsx_parser/workbook/style_sheet/cell_xfs/cell_style/protection.rb +2 -2
  63. data/lib/ooxml_parser/xlsx_parser/workbook/style_sheet/cell_xfs/xf.rb +5 -5
  64. data/lib/ooxml_parser/xlsx_parser/workbook/workbook_properties.rb +1 -1
  65. data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/sheet_view.rb +2 -2
  66. data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/table_part.rb +9 -1
  67. data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/xlsx_column_properties.rb +2 -2
  68. data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/xlsx_header_footer.rb +4 -4
  69. data/lib/ooxml_parser/xlsx_parser/workbook/worksheet.rb +2 -1
  70. data/lib/ooxml_parser/xlsx_parser/workbook.rb +1 -1
  71. metadata +18 -3
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'combobox/list_item'
4
+ module OoxmlParser
5
+ # Class for parsing `comboBox` tag
6
+ class ComboBox < OOXMLDocumentObject
7
+ # @return [Array<ListItem>] combobox items
8
+ attr_reader :list_items
9
+
10
+ def initialize(parent: nil)
11
+ @list_items = []
12
+ super
13
+ end
14
+
15
+ # Parse ComboBox object
16
+ # @param node [Nokogiri::XML:Element] node to parse
17
+ # @return [ComboBox] result of parsing
18
+ def parse(node)
19
+ node.xpath('*').each do |node_child|
20
+ case node_child.name
21
+ when 'listItem'
22
+ @list_items << ListItem.new(parent: self).parse(node_child)
23
+ end
24
+ end
25
+ self
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing `dropDownList` tag
5
+ class DropdownList < OOXMLDocumentObject
6
+ # @return [Array<ListItem>] dropdown items
7
+ attr_reader :list_items
8
+
9
+ def initialize(parent: nil)
10
+ @list_items = []
11
+ super
12
+ end
13
+
14
+ # Parse DropdownList object
15
+ # @param node [Nokogiri::XML:Element] node to parse
16
+ # @return [DropdownList] result of parsing
17
+ def parse(node)
18
+ node.xpath('*').each do |node_child|
19
+ case node_child.name
20
+ when 'listItem'
21
+ @list_items << ListItem.new(parent: self).parse(node_child)
22
+ end
23
+ end
24
+ self
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing `formPr` tag
5
+ class FormProperties < OOXMLDocumentObject
6
+ # @return [String] field key
7
+ attr_reader :key
8
+ # @return [String] text of tooltip
9
+ attr_reader :help_text
10
+ # @return [True, False] specifies if field is required
11
+ attr_reader :required
12
+ # @return [Shade] shade of field
13
+ attr_reader :shade
14
+ # @return [BordersProperties] border of field
15
+ attr_reader :border
16
+
17
+ def initialize(parent: nil)
18
+ @required = false
19
+ super
20
+ end
21
+
22
+ # Parse FormProperties object
23
+ # @param node [Nokogiri::XML:Element] node to parse
24
+ # @return [FormProperties] result of parsing
25
+ def parse(node)
26
+ node.attributes.each do |key, value|
27
+ case key
28
+ when 'key'
29
+ @key = value.value
30
+ when 'helpText'
31
+ @help_text = value.value
32
+ when 'required'
33
+ @required = boolean_attribute_value(value)
34
+ end
35
+ end
36
+
37
+ node.xpath('*').each do |node_child|
38
+ case node_child.name
39
+ when 'shd'
40
+ @shade = Shade.new(parent: self).parse(node_child)
41
+ when 'border'
42
+ @border = BordersProperties.new(parent: self).parse(node_child)
43
+ end
44
+ end
45
+ self
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing `comb` tag
5
+ class FormTextComb < OOXMLDocumentObject
6
+ # @return [OoxmlSize] field width
7
+ attr_reader :width
8
+ # @return [Symbol] width rule
9
+ attr_reader :width_rule
10
+
11
+ # Parse FormTextComb object
12
+ # @param node [Nokogiri::XML:Element] node to parse
13
+ # @return [FormTextComb] result of parsing
14
+ def parse(node)
15
+ node.attributes.each do |key, value|
16
+ case key
17
+ when 'width'
18
+ @width = OoxmlSize.new(value.value.to_f)
19
+ when 'wRule'
20
+ @width_rule = value.value.to_sym
21
+ end
22
+ end
23
+ self
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing `format` tag
5
+ class FormTextFormat < OOXMLDocumentObject
6
+ # @return [Symbol] format type
7
+ attr_reader :type
8
+ # @return [String] value for custom formats
9
+ attr_reader :value
10
+ # @return [String] allowed symbols
11
+ attr_reader :symbols
12
+
13
+ # Parse FormTextFormat object
14
+ # @param node [Nokogiri::XML:Element] node to parse
15
+ # @return [FormTextFormat] result of parsing
16
+ def parse(node)
17
+ node.attributes.each do |key, value|
18
+ case key
19
+ when 'type'
20
+ @type = value.value.to_sym
21
+ when 'val'
22
+ @value = value.value
23
+ when 'symbols'
24
+ @symbols = value.value
25
+ end
26
+ end
27
+ self
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'form_text_properties/form_text_comb'
4
+ require_relative 'form_text_properties/form_text_format'
5
+ module OoxmlParser
6
+ # Class for parsing `textFormPr` tag
7
+ class FormTextProperties < OOXMLDocumentObject
8
+ # @return [True, False] specifies if field is multiline
9
+ attr_reader :multiline
10
+ # @return [True, False] specifies if size of field should be autofit
11
+ attr_reader :autofit
12
+ # @return [FormTextComb] parameters of text justification
13
+ attr_reader :comb
14
+ # @return [ValuedChild] characters limit
15
+ attr_reader :maximum_characters
16
+ # @return [FormTextFormat] text format
17
+ attr_reader :format
18
+
19
+ # Parse FormTextProperties object
20
+ # @param node [Nokogiri::XML:Element] node to parse
21
+ # @return [FormTextProperties] result of parsing
22
+ def parse(node)
23
+ node.attributes.each do |key, value|
24
+ case key
25
+ when 'multiLine'
26
+ @multiline = boolean_attribute_value(value)
27
+ when 'autoFit'
28
+ @autofit = boolean_attribute_value(value)
29
+ end
30
+ end
31
+
32
+ node.xpath('*').each do |node_child|
33
+ case node_child.name
34
+ when 'comb'
35
+ @comb = FormTextComb.new(parent: self).parse(node_child)
36
+ when 'maxCharacters'
37
+ @maximum_characters = ValuedChild.new(:integer, parent: self).parse(node_child)
38
+ when 'format'
39
+ @format = FormTextFormat.new(parent: self).parse(node_child)
40
+ end
41
+ end
42
+ self
43
+ end
44
+ end
45
+ end
@@ -1,5 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'sdt_properties/form_properties'
4
+ require_relative 'sdt_properties/form_text_properties'
5
+ require_relative 'sdt_properties/combobox'
6
+ require_relative 'sdt_properties/dropdown_list'
7
+ require_relative 'sdt_properties/checkbox'
3
8
  module OoxmlParser
4
9
  # Class for parsing `w:sdtPr` tags
5
10
  class SDTProperties < OOXMLDocumentObject
@@ -9,6 +14,16 @@ module OoxmlParser
9
14
  attr_reader :tag
10
15
  # @return [ValuedChild] Locking Setting
11
16
  attr_reader :lock
17
+ # @return [ComboBox] combobox
18
+ attr_reader :combobox
19
+ # @return [DropdownList] dropdown list
20
+ attr_reader :dropdown_list
21
+ # @return [CheckBox] checkbox
22
+ attr_reader :checkbox
23
+ # @return [FormProperties] form properties
24
+ attr_reader :form_properties
25
+ # @return [FormTextProperties] properties of text in form
26
+ attr_reader :form_text_properties
12
27
 
13
28
  # Parse SDTProperties object
14
29
  # @param node [Nokogiri::XML:Element] node to parse
@@ -22,6 +37,16 @@ module OoxmlParser
22
37
  @tag = ValuedChild.new(:string, parent: self).parse(node_child)
23
38
  when 'lock'
24
39
  @lock = ValuedChild.new(:symbol, parent: self).parse(node_child)
40
+ when 'comboBox'
41
+ @combobox = ComboBox.new(parent: self).parse(node_child)
42
+ when 'dropDownList'
43
+ @dropdown_list = DropdownList.new(parent: self).parse(node_child)
44
+ when 'checkbox'
45
+ @checkbox = CheckBox.new(parent: self).parse(node_child)
46
+ when 'formPr'
47
+ @form_properties = FormProperties.new(parent: self).parse(node_child)
48
+ when 'textFormPr'
49
+ @form_text_properties = FormTextProperties.new(parent: self).parse(node_child)
25
50
  end
26
51
  end
27
52
  self
@@ -147,10 +147,10 @@ module OoxmlParser
147
147
  @hyperlink = Hyperlink.new(parent: self).parse(node_child)
148
148
  character_style = default_character_style.dup
149
149
  character_style.parent = self
150
- if node_child.attribute('id')
150
+ if @hyperlink.id
151
151
  character_style.link = Hyperlink.new(parent: character_style).parse(node_child)
152
- elsif node_child.attribute('anchor')
153
- character_style.link = node_child.attribute('anchor').value
152
+ elsif @hyperlink.anchor
153
+ character_style.link = @hyperlink.anchor
154
154
  end
155
155
  node_child.xpath('w:r').each do |r_tag|
156
156
  character_style.parse(r_tag, char_number, parent: self)
@@ -208,8 +208,9 @@ module OoxmlParser
208
208
  when 'numPr'
209
209
  @numbering = NumberingProperties.new(parent: self).parse(node_child)
210
210
  when 'jc'
211
- @align = node_child.attribute('val').value.to_sym unless node_child.attribute('val').nil?
212
- @align = :justify if node_child.attribute('val').value == 'both'
211
+ @justification_object = ValuedChild.new(:string, parent: self).parse(node_child)
212
+ @align = @justification_object.value.to_sym unless @justification_object.value.nil?
213
+ @align = :justify if @justification_object.value == 'both'
213
214
  when 'spacing'
214
215
  @valued_spacing = ParagraphSpacing.new(parent: self).parse(node_child)
215
216
  @spacing = @spacing.fetch_from_valued_spacing(@valued_spacing)
@@ -45,11 +45,23 @@ module OoxmlParser
45
45
  # @param [Nokogiri::XML:Node] node with HeaderFooter
46
46
  # @return [HeaderFooter] result of parsing
47
47
  def parse(node)
48
- @id = node.attribute('id').value.to_i
48
+ node.attributes.each do |key, value|
49
+ case key
50
+ when 'id'
51
+ @id = value.value.to_i
52
+ end
53
+ end
49
54
  parse_type(node)
50
55
  doc = parse_xml(root_object.unpacked_folder + xml_path)
51
56
  doc.search(xpath_for_search).each do |footnote|
52
- next unless footnote.attribute('id').value.to_i == @id
57
+ footnote_id = nil
58
+ footnote.attributes.each do |key, value|
59
+ case key
60
+ when 'id'
61
+ footnote_id = value.value.to_i
62
+ end
63
+ end
64
+ next unless footnote_id == @id
53
65
 
54
66
  paragraph_number = 0
55
67
  footnote.xpath('w:p').each do |paragraph|
@@ -36,9 +36,9 @@ module OoxmlParser
36
36
  when 'num'
37
37
  @count = value.value.to_i
38
38
  when 'sep'
39
- @separator = option_enabled?(node, 'sep')
39
+ @separator = boolean_attribute_value(value)
40
40
  when 'equalWidth'
41
- @equal_width = option_enabled?(node, 'equalWidth')
41
+ @equal_width = boolean_attribute_value(value)
42
42
  when 'space'
43
43
  @space = OoxmlSize.new(value.value.to_f)
44
44
  end
@@ -13,15 +13,14 @@ module OoxmlParser
13
13
  # Parse note data
14
14
  # @param params [Hash] data to parse
15
15
  # @return [Note] result of parsing
16
- def self.parse(params)
17
- note = Note.new
18
- note.type = params[:type]
19
- note.assigned_to = params[:assigned_to]
20
- note.parent = params[:parent]
21
- doc = note.parse_xml(note.file_path(params[:target]))
22
- if note.type.include?('footer')
16
+ def parse(params)
17
+ @type = params[:type]
18
+ @assigned_to = params[:assigned_to]
19
+ @parent = params[:parent]
20
+ doc = parse_xml(file_path(params[:target]))
21
+ if @type.include?('footer')
23
22
  xpath_note = '//w:ftr'
24
- elsif note.type.include?('header')
23
+ elsif @type.include?('header')
25
24
  xpath_note = '//w:hdr'
26
25
  end
27
26
  doc.search(xpath_note).each do |ftr|
@@ -29,15 +28,15 @@ module OoxmlParser
29
28
  ftr.xpath('*').each do |sub_element|
30
29
  case sub_element.name
31
30
  when 'p'
32
- note.elements << params[:default_paragraph].dup.parse(sub_element, number, params[:default_character], parent: note)
31
+ @elements << params[:default_paragraph].dup.parse(sub_element, number, params[:default_character], parent: self)
33
32
  number += 1
34
33
  when 'tbl'
35
- note.elements << Table.new(parent: note).parse(sub_element, number)
34
+ @elements << Table.new(parent: self).parse(sub_element, number)
36
35
  number += 1
37
36
  end
38
37
  end
39
38
  end
40
- note
39
+ self
41
40
  end
42
41
 
43
42
  # @param target [String] name of target
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing `w:headerReference`,
5
+ # `w:footerReference` object
6
+ class HeaderFooterReference < OOXMLDocumentObject
7
+ # @return [String] id of reference
8
+ attr_accessor :id
9
+ # @return [String] type of reference
10
+ attr_accessor :type
11
+
12
+ # Parse HeaderFooterReference
13
+ # @param [Nokogiri::XML:Node] node with HeaderFooterReference
14
+ # @return [HeaderFooterReference] result of parsing
15
+ def parse(node)
16
+ node.attributes.each do |key, value|
17
+ case key
18
+ when 'id'
19
+ @id = value.to_s
20
+ when 'type'
21
+ @type = value.to_s
22
+ end
23
+ end
24
+ self
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing `w:pgBorders` PageBorders object
5
+ class PageBorders < OOXMLDocumentObject
6
+ # @return [Symbol] display value
7
+ attr_reader :display
8
+ # @return [Symbol] offset from value
9
+ attr_reader :offset_from
10
+
11
+ # Parse PageBorders
12
+ # @param [Nokogiri::XML:Node] node with PageBorders
13
+ # @return [PageBorders] result of parsing
14
+ def parse(node)
15
+ node.attributes.each do |key, value|
16
+ case key
17
+ when 'display'
18
+ @display = value.value.to_sym
19
+ when 'offsetFrom'
20
+ @offset_from = value.value.to_sym
21
+ end
22
+ end
23
+ self
24
+ end
25
+ end
26
+ end
@@ -6,6 +6,9 @@ require_relative 'page_size'
6
6
  require_relative 'page_margins'
7
7
  require_relative 'columns'
8
8
  require_relative 'note'
9
+ require_relative 'page_properties/header_footer_reference'
10
+ require_relative 'page_properties/page_borders'
11
+
9
12
  module OoxmlParser
10
13
  # Class for data of PageProperties
11
14
  class PageProperties < OOXMLDocumentObject
@@ -30,9 +33,10 @@ module OoxmlParser
30
33
  when 'pgSz'
31
34
  @size = PageSize.new.parse(pg_size_subnode)
32
35
  when 'pgBorders'
36
+ page_borders_object = PageBorders.new(parent: self).parse(pg_size_subnode)
33
37
  page_borders = Borders.new
34
- page_borders.display = pg_size_subnode.attribute('display').value.to_sym unless pg_size_subnode.attribute('display').nil?
35
- page_borders.offset_from = pg_size_subnode.attribute('offsetFrom').value.to_sym unless pg_size_subnode.attribute('offsetFrom').nil?
38
+ page_borders.display = page_borders_object.display if page_borders_object.display
39
+ page_borders.offset_from = page_borders_object.offset_from if page_borders_object.offset_from
36
40
  pg_size_subnode.xpath('w:bottom').each do |bottom|
37
41
  page_borders.bottom = BordersProperties.new(parent: page_borders).parse(bottom)
38
42
  end
@@ -47,15 +51,18 @@ module OoxmlParser
47
51
  end
48
52
  @page_borders = page_borders
49
53
  when 'type'
50
- @type = pg_size_subnode.attribute('val').value
54
+ @type_object = ValuedChild.new(:string, parent: self).parse(pg_size_subnode)
55
+ @type = @type_object.value
51
56
  when 'pgMar'
52
57
  @margins = PageMargins.new(parent: self).parse(pg_size_subnode)
53
58
  when 'pgNumType'
54
59
  @num_type = pg_size_subnode.attribute('fmt').value unless pg_size_subnode.attribute('fmt').nil?
55
60
  when 'formProt'
56
- @form_prot = pg_size_subnode.attribute('val').value
61
+ form_prot_object = ValuedChild.new(:string, parent: self).parse(pg_size_subnode)
62
+ @form_prot = form_prot_object.value
57
63
  when 'textDirection'
58
- @text_direction = pg_size_subnode.attribute('val').value
64
+ text_directon_object = ValuedChild.new(:string, parent: self).parse(pg_size_subnode)
65
+ @text_direction = text_directon_object.value
59
66
  when 'docGrid'
60
67
  @document_grid = DocumentGrid.new(parent: self).parse(pg_size_subnode)
61
68
  when 'titlePg'
@@ -63,14 +70,15 @@ module OoxmlParser
63
70
  when 'cols'
64
71
  @columns = Columns.new.parse(pg_size_subnode)
65
72
  when 'headerReference', 'footerReference'
66
- target = root_object.get_link_from_rels(pg_size_subnode.attribute('id').value)
73
+ reference = HeaderFooterReference.new(parent: self).parse(pg_size_subnode)
74
+ target = root_object.get_link_from_rels(reference.id)
67
75
  root_object.add_to_xmls_stack("word/#{target}")
68
- note = Note.parse(default_paragraph: default_paragraph,
69
- default_character: default_character,
70
- target: target,
71
- assigned_to: pg_size_subnode.attribute('type').value,
72
- type: File.basename(target).sub('.xml', ''),
73
- parent: self)
76
+ note = Note.new.parse(default_paragraph: default_paragraph,
77
+ default_character: default_character,
78
+ target: target,
79
+ assigned_to: reference.type,
80
+ type: File.basename(target).sub('.xml', ''),
81
+ parent: self)
74
82
  @notes << note
75
83
  root_object.xmls_stack.pop
76
84
  when 'footnotePr'
@@ -5,11 +5,14 @@ module OoxmlParser
5
5
  class ParagraphPropertiesDefault < OOXMLDocumentObject
6
6
  # @return [ParagraphProperties] properties of run
7
7
  attr_accessor :paragraph_properties
8
+ # @return [Nokogiri::XML:Element] raw node of tag
9
+ attr_reader :raw_node
8
10
 
9
11
  # Parse ParagraphPropertiesDefault object
10
12
  # @param node [Nokogiri::XML:Element] node to parse
11
13
  # @return [ParagraphPropertiesDefault] result of parsing
12
14
  def parse(node)
15
+ @raw_node = node
13
16
  node.xpath('*').each do |node_child|
14
17
  case node_child.name
15
18
  when 'pPr'
@@ -28,5 +28,11 @@ module OoxmlParser
28
28
  end
29
29
  self
30
30
  end
31
+
32
+ # @param [Symbol] type of style to get
33
+ # @return [DocumentStyle] default document style
34
+ def default_style(type)
35
+ styles.find { |style| style.type == type && style.default }
36
+ end
31
37
  end
32
38
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'document_structure/comments'
4
4
  require_relative 'document_structure/comments_extended'
5
+ require_relative 'document_structure/default_style_helper'
5
6
  require_relative 'document_structure/docx_paragraph'
6
7
  require_relative 'document_structure/document_background'
7
8
  require_relative 'document_structure/document_properties'
@@ -15,6 +16,7 @@ require_relative 'document_structure/styles'
15
16
  module OoxmlParser
16
17
  # Basic class for DocumentStructure
17
18
  class DocumentStructure < CommonDocumentStructure
19
+ include DefaultStyleHelper
18
20
  include DocumentStyleHelper
19
21
  include DocumentStructureHelpers
20
22
  # @return [Array<OOXMLDocumentObject>] list of elements
@@ -211,75 +213,6 @@ module OoxmlParser
211
213
  self
212
214
  end
213
215
 
214
- # Parse default style
215
- # @return [void]
216
- def parse_default_style
217
- doc = parse_xml("#{root_object.unpacked_folder}word/styles.xml")
218
- doc.search('//w:style').each do |style|
219
- next if style.attribute('default').nil?
220
-
221
- if (style.attribute('default').value == '1' ||
222
- style.attribute('default').value == 'on' ||
223
- style.attribute('default').value == 'true') &&
224
- style.attribute('type').value == 'paragraph'
225
- style.xpath('w:pPr').each do |paragraph_pr_tag|
226
- DocumentStructure.default_paragraph_style = DocxParagraph.new.parse_paragraph_style(paragraph_pr_tag, DocumentStructure.default_run_style)
227
- end
228
- style.xpath('w:rPr').each do |character_pr_tag|
229
- DocumentStructure.default_run_style.parse_properties(character_pr_tag)
230
- end
231
- elsif (style.attribute('default').value == '1' ||
232
- style.attribute('default').value == 'on' ||
233
- style.attribute('default').value == 'true') &&
234
- style.attribute('type').value == 'character'
235
- style.xpath('w:rPr').each do |character_pr_tag|
236
- DocumentStructure.default_run_style.parse_properties(character_pr_tag)
237
- end
238
- end
239
- end
240
- DocumentStructure.default_table_paragraph_style = DocumentStructure.default_paragraph_style.dup
241
- DocumentStructure.default_table_paragraph_style.spacing = Spacing.new(0, 0, 1, :auto)
242
- DocumentStructure.default_table_run_style = DocumentStructure.default_run_style.dup
243
- doc.search('//w:style').each do |style|
244
- next if style.attribute('default').nil?
245
- next unless (style.attribute('default').value == '1' ||
246
- style.attribute('default').value == 'on' ||
247
- style.attribute('default').value == 'true') &&
248
- style.attribute('type').value == 'table'
249
-
250
- style.xpath('w:rPr').each do |table_character_pr_tag|
251
- DocumentStructure.default_table_run_style.parse_properties(table_character_pr_tag)
252
- end
253
- end
254
- end
255
-
256
- # Perform parsing styles.xml
257
- def parse_styles
258
- file = "#{root_object.unpacked_folder}/word/styles.xml"
259
- DocumentStructure.default_paragraph_style = DocxParagraph.new(parent: self)
260
- DocumentStructure.default_table_paragraph_style = DocxParagraph.new(parent: self)
261
- DocumentStructure.default_run_style = DocxParagraphRun.new(parent: self)
262
- DocumentStructure.default_table_run_style = DocxParagraphRun.new(parent: self)
263
-
264
- return unless File.exist?(file)
265
-
266
- doc = parse_xml(file)
267
- # TODO: Remove this old way parsing in favor of doc_structure.styles.document_defaults
268
- doc.search('//w:docDefaults').each do |doc_defaults|
269
- doc_defaults.xpath('w:pPrDefault').each do |p_pr_defaults|
270
- DocumentStructure.default_paragraph_style = DocxParagraph.new(parent: self).parse(p_pr_defaults, 0)
271
- end
272
- doc_defaults.xpath('w:rPrDefault').each do |r_pr_defaults|
273
- r_pr_defaults.xpath('w:rPr').each do |r_pr|
274
- DocumentStructure.default_run_style = DocxParagraphRun.new(parent: self).parse_properties(r_pr)
275
- end
276
- end
277
- end
278
- parse_default_style
279
- @numbering = Numbering.new(parent: self).parse
280
- @styles = Styles.new(parent: self).parse
281
- end
282
-
283
216
  class << self
284
217
  attr_accessor :default_table_run_style, :default_table_paragraph_style, :default_paragraph_style, :default_run_style
285
218
  end
@@ -28,7 +28,7 @@ module OoxmlParser
28
28
  node.xpath('*').each do |node_child|
29
29
  case node_child.name
30
30
  when 'pos'
31
- @position = OOXMLCoordinates.parse(node_child, x_attr: 'x', y_attr: 'y')
31
+ @position = OOXMLCoordinates.new(parent: self).parse(node_child)
32
32
  when 'text'
33
33
  @text = node_child.text.to_s
34
34
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing `c:chart` object
5
+ class ChartReference < OOXMLDocumentObject
6
+ # @return [String] id of the chart
7
+ attr_reader :id
8
+
9
+ # Parse ChartReference
10
+ # @param [Nokogiri::XML:Node] node with ChartReference
11
+ # @return [ChartReference] result of parsing
12
+ def parse(node)
13
+ node.attributes.each do |key, value|
14
+ case key
15
+ when 'id'
16
+ @id = value.value.to_s
17
+ end
18
+ end
19
+ self
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'graphic_frame/chart_reference'
4
+
3
5
  module OoxmlParser
4
6
  # Class for parsing `graphicFrame`
5
7
  class GraphicFrame < OOXMLDocumentObject
@@ -30,7 +32,8 @@ module OoxmlParser
30
32
  when 'tbl'
31
33
  graphic_data << Table.new(parent: self).parse(graphic_node_child)
32
34
  when 'chart'
33
- root_object.add_to_xmls_stack(root_object.get_link_from_rels(graphic_node_child.attribute('id').value))
35
+ @chart_reference = ChartReference.new(parent: self).parse(graphic_node_child)
36
+ root_object.add_to_xmls_stack(root_object.get_link_from_rels(@chart_reference.id))
34
37
  graphic_data << Chart.new(parent: self).parse
35
38
  root_object.xmls_stack.pop
36
39
  when 'oleObj'