ooxml_parser 0.1.1 → 0.1.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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/lib/ooxml_parser.rb +2 -0
  4. data/lib/ooxml_parser/common_parser/common_data/alternate_content/chart/chart.rb +3 -2
  5. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/picture/docx_blip.rb +2 -1
  6. data/lib/ooxml_parser/common_parser/common_data/alternate_content/picture/group/old_docx_group.rb +1 -1
  7. data/lib/ooxml_parser/common_parser/common_data/alternate_content/picture/shape/old_docx_shape.rb +1 -1
  8. data/lib/ooxml_parser/common_parser/common_data/borders_properties.rb +11 -8
  9. data/lib/ooxml_parser/common_parser/common_data/colors/hsl_color.rb +12 -15
  10. data/lib/ooxml_parser/common_parser/common_data/colors/image/stretching.rb +1 -0
  11. data/lib/ooxml_parser/common_parser/common_data/colors/image/{fill_rectangle.rb → stretching/fill_rectangle.rb} +0 -0
  12. data/lib/ooxml_parser/common_parser/common_data/colors/image_fill.rb +1 -0
  13. data/lib/ooxml_parser/common_parser/common_data/colors/presentation_fill/gradient_color.rb +1 -2
  14. data/lib/ooxml_parser/common_parser/common_data/colors/presentation_fill/gradient_color/linear_gradient.rb +10 -0
  15. data/lib/ooxml_parser/common_parser/common_data/hyperlink.rb +6 -1
  16. data/lib/ooxml_parser/common_parser/common_data/ooxml_document_object.rb +29 -1
  17. data/lib/ooxml_parser/common_parser/common_data/paragraph.rb +1 -0
  18. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_properties.rb +1 -1
  19. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run/run_properties.rb +1 -1
  20. data/lib/ooxml_parser/{pptx_parser/pptx_data/presentation/slide/shape/text_body → common_parser/common_data/paragraph}/text_field.rb +0 -0
  21. data/lib/ooxml_parser/common_parser/common_data/relationships.rb +31 -0
  22. data/lib/ooxml_parser/common_parser/common_data/relationships/relationship.rb +22 -0
  23. data/lib/ooxml_parser/common_parser/common_data/table.rb +1 -1
  24. data/lib/ooxml_parser/common_parser/common_data/table/properties/table_style.rb +1 -0
  25. data/lib/ooxml_parser/common_parser/common_data/table/properties/table_style_elements.rb +1 -1
  26. data/lib/ooxml_parser/common_parser/common_data/table/row/cell/cell_properties.rb +39 -96
  27. data/lib/ooxml_parser/common_parser/common_data/table/row/cell/merge.rb +7 -3
  28. data/lib/ooxml_parser/common_parser/common_data/table/row/row/table_row_properties.rb +1 -1
  29. data/lib/ooxml_parser/common_parser/common_data/table/table_grid.rb +1 -1
  30. data/lib/ooxml_parser/common_parser/common_data/table/table_properties.rb +5 -2
  31. data/lib/ooxml_parser/common_parser/common_data/table/table_properties/table_borders.rb +33 -0
  32. data/lib/ooxml_parser/common_parser/parser.rb +17 -0
  33. data/lib/ooxml_parser/docx_parser/docx_data/document_structure.rb +15 -26
  34. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/document_background.rb +26 -0
  35. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/document_properties.rb +6 -1
  36. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run.rb +5 -5
  37. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run/shape.rb +9 -10
  38. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/frame_properties.rb +1 -1
  39. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/document_grid.rb +1 -1
  40. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/page_properties.rb +6 -13
  41. data/lib/ooxml_parser/docx_parser/docx_parser.rb +3 -7
  42. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation.rb +1 -2
  43. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/presentation_comment/presentation_comment_author.rb +2 -1
  44. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/presentation_theme.rb +1 -1
  45. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide.rb +13 -19
  46. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/animation_effect/animation_effect.rb +2 -2
  47. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/set_time_node/behavior/behavior.rb +1 -0
  48. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/set_time_node/set_time_node.rb +2 -0
  49. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/time_node.rb +2 -0
  50. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/time_node/common_timing/condition.rb +2 -2
  51. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/transition.rb +3 -14
  52. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/{sound_action → transition}/sound_action.rb +2 -0
  53. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/{sound_action/sound → transition/sound_action}/sound.rb +1 -2
  54. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/transition_properties/transition_properties.rb +20 -0
  55. data/lib/ooxml_parser/pptx_parser/pptx_parser.rb +3 -7
  56. data/lib/ooxml_parser/version.rb +1 -1
  57. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook.rb +4 -3
  58. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet.rb +12 -1
  59. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/xlsx_row.rb +1 -1
  60. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/xlsx_row/xlsx_cell/cell_style/foreground_color.rb +2 -2
  61. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/xlsx_row/xlsx_cell/cell_style/ooxml_font.rb +2 -4
  62. data/lib/ooxml_parser/xlsx_parser/xlsx_parser.rb +3 -7
  63. metadata +10 -16
  64. data/.overcommit.yml +0 -35
  65. data/Changelog.md +0 -25
  66. data/circle.yml +0 -3
  67. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run/shape/offset.rb +0 -10
  68. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run/shape/shadow.rb +0 -10
  69. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/shape/shape_properties/extents.rb +0 -10
  70. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/shape/shape_properties/offset.rb +0 -10
  71. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/shape/text_body/paragraph.rb +0 -10
  72. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/shapes_grouping/shapes_grouping.rb +0 -9
  73. data/ooxml_parser.gemspec +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 55075222dad4d0ce0cf77c8ab837020b57efc21b
4
- data.tar.gz: 05112c96435c30a772a2f500b880f81146a6c889
3
+ metadata.gz: f40b6ee146d2fa4c06246636b63931ec3c178a2c
4
+ data.tar.gz: 08e151b4a17546c6787000bac1d727687ff6f5b5
5
5
  SHA512:
6
- metadata.gz: 92f9263595d5b62c828af76b8d24b455c4a49ae39651d0b04435c27f38581b5923190281bb4ea1bef5d10f381fa343af62daac0cb0bfbe396e5d5d48541ae044
7
- data.tar.gz: 9085d35864ab845f360e6710d67a56994f33b10ed01b7437b1674fc87470ae10acd87326a9026622a0121fda37d633b67da7fb83336af87bd946266753851f71
6
+ metadata.gz: 15187c6a9a8ac851637a1d9bfaa1f69cb651f6d22533fa66cb3b1c97c6960494daa6e3a82a2c38fec149c9c7d117289dc946273ee5b2626927b60627986f9b67
7
+ data.tar.gz: a1bfd37779ec4e6003a71e90f5eaed425eeca04bfb7d849e523f21b567413ad958fb227acb55cf7a15d3d97590e391a590953207451b880751e7b0d4b70fb075
data/README.md CHANGED
@@ -4,7 +4,7 @@ _ooxml_parser_ is a Ooxml files (docx, xlsx, pptx) parser written in Ruby.
4
4
 
5
5
  ## Installation
6
6
 
7
- $ gem install parser
7
+ $ gem install ooxml_parser
8
8
 
9
9
  ## Usage
10
10
 
@@ -23,4 +23,4 @@ Default is `:centimeters`
23
23
 
24
24
  OoxmlParser.configure do |config|
25
25
  config.units = :points
26
- end
26
+ end
data/lib/ooxml_parser.rb CHANGED
@@ -9,6 +9,8 @@ require_relative 'ooxml_parser/common_parser/common_data/paragraph'
9
9
  require_relative 'ooxml_parser/common_parser/common_data/alternate_content/alternate_content'
10
10
  require_relative 'ooxml_parser/common_parser/common_data/colors/presentation_fill'
11
11
  require_relative 'ooxml_parser/common_parser/common_data/table'
12
+ require_relative 'ooxml_parser/common_parser/common_data/relationships'
13
+ require_relative 'ooxml_parser/common_parser/parser'
12
14
  require_relative 'ooxml_parser/common_parser/common_document_structure'
13
15
  require_relative 'ooxml_parser/configuration'
14
16
  require_relative 'ooxml_parser/helpers/string_helper'
@@ -31,9 +31,10 @@ module OoxmlParser
31
31
  when :point, :bubble
32
32
  val = chart_props_node_child.xpath('c:yVal')[0]
33
33
  else
34
- val = nil
34
+ next
35
35
  end
36
- @data << ChartCellsRange.parse(val.xpath('c:numRef').first).dup unless val.nil?
36
+ next if val.xpath('c:numRef').empty?
37
+ @data << ChartCellsRange.parse(val.xpath('c:numRef').first).dup
37
38
  when 'dLbls'
38
39
  @display_labels = DisplayLabelsProperties.parse(chart_props_node_child)
39
40
  end
@@ -12,6 +12,7 @@ module OoxmlParser
12
12
  def self.parse(blip_fill_node)
13
13
  blip = DocxBlip.new
14
14
  blip_node = blip_fill_node.xpath('a:blip', 'xmlns:a' => 'http://schemas.openxmlformats.org/drawingml/2006/main').first
15
+ return blip if blip_node.nil?
15
16
  path_to_media_file = OOXMLDocumentObject.get_link_from_rels(blip_node.attribute('embed').value)
16
17
  raise LoadError, "Cant find path to media file by id: #{blip_node.attribute('embed').value}" if path_to_media_file.empty?
17
18
  blip_node.xpath('*').each do |blip_node_child|
@@ -20,7 +21,7 @@ module OoxmlParser
20
21
  blip.alpha_channel = (blip_node_child.attribute('amt').value.to_f / 1_000.0).round(0).to_f
21
22
  end
22
23
  end
23
- blip.path_to_media_file = OOXMLDocumentObject.copy_media_file("#{OOXMLDocumentObject.root_subfolder}/#{path_to_media_file.gsub('..', '')}")
24
+ blip.path_to_media_file = OOXMLDocumentObject.copy_media_file("#{OOXMLDocumentObject.root_subfolder}/#{path_to_media_file.gsub('..', '')}") unless path_to_media_file == 'NULL'
24
25
  blip
25
26
  end
26
27
  end
@@ -19,7 +19,7 @@ module OoxmlParser
19
19
  element.object = OldDocxShape.parse(group_node_child)
20
20
  group.elements << element
21
21
  when 'wrap'
22
- group.properties.wrap = group_node_child.attribute('type').value.to_sym if group_node_child.attribute('type').value
22
+ group.properties.wrap = group_node_child.attribute('type').value.to_sym unless group_node_child.attribute('type').nil?
23
23
  when 'group'
24
24
  element = parse(group_node_child)
25
25
  group.elements << element
@@ -12,7 +12,7 @@ module OoxmlParser
12
12
  when 'textbox'
13
13
  shape.text_box = TextBox.parse_list(shape_node_child)
14
14
  when 'imagedata'
15
- path_to_image = OOXMLDocumentObject.copy_media_file("#{OOXMLDocumentObject.root_subfolder}/#{get_link_from_rels(shape_node_child.attribute('id').value, OOXMLDocumentObject.path_to_folder)}")
15
+ path_to_image = OOXMLDocumentObject.copy_media_file("#{OOXMLDocumentObject.root_subfolder}/#{get_link_from_rels(shape_node_child.attribute('id').value)}")
16
16
  shape.image = path_to_image
17
17
  when 'fill'
18
18
  shape.fill = OldDocxShapeFill.parse(shape_node_child)
@@ -41,16 +41,19 @@ module OoxmlParser
41
41
  # @param [Nokogiri::XML:Element] node with BordersProperties
42
42
  # @return [BordersProperties] value of BordersProperties
43
43
  def self.parse(node)
44
+ return nil if node.attribute('val').value == 'nil'
44
45
  border_properties = BordersProperties.new
45
46
  border_properties.val = node.attribute('val').value.to_sym
46
- border_properties.sz = node.attribute('sz').value.to_f / 8.0
47
- border_properties.space = (node.attribute('space').value.to_f / 28.34).round(3)
48
- border_properties.color = node.attribute('color').value
49
- unless node.attribute('shadow').nil?
50
- border_properties.shadow = node.attribute('shadow').value
51
- end
52
- if border_properties.color != 'auto'
53
- border_properties.color = Color.from_int16(border_properties.color)
47
+ border_properties.sz = node.attribute('sz').value.to_f / 8.0 if node.attribute('sz')
48
+ border_properties.space = (node.attribute('space').value.to_f / 28.34).round(3) unless node.attribute('space').nil?
49
+ if node.attribute('color')
50
+ border_properties.color = node.attribute('color').value
51
+ unless node.attribute('shadow').nil?
52
+ border_properties.shadow = node.attribute('shadow').value
53
+ end
54
+ if border_properties.color != 'auto'
55
+ border_properties.color = Color.from_int16(border_properties.color)
56
+ end
54
57
  end
55
58
  border_properties
56
59
  end
@@ -31,12 +31,11 @@ module OoxmlParser
31
31
  unless max == min
32
32
  hls_color.s = delta / (255.0 - (255.0 - max - min).abs)
33
33
 
34
- hls_color.h = case
35
- when max == red && green >= blue
34
+ hls_color.h = if max == red && green >= blue
36
35
  60.0 * (green - blue) / delta
37
- when max == red && green < blue
36
+ elsif max == red && green < blue
38
37
  60.0 * (green - blue) / delta + 360.0
39
- when max == green
38
+ elsif max == green
40
39
  60.0 * (blue - red) / delta + 120.0
41
40
  else
42
41
  60.0 * (red - green) / delta + 240.0
@@ -52,18 +51,17 @@ module OoxmlParser
52
51
  x = chroma * (1 - ((@h / 60.0) % 2.0 - 1).abs)
53
52
  m = @l - chroma / 2.0
54
53
 
55
- rgb = case
56
- when @h == 0
54
+ rgb = if @h == 0
57
55
  Color.new(0, 0, 0)
58
- when @h > 0 && @h < 60
56
+ elsif @h > 0 && @h < 60
59
57
  Color.new(chroma, x, 0)
60
- when @h > 60 && @h < 120
58
+ elsif @h > 60 && @h < 120
61
59
  Color.new(x, chroma, 0)
62
- when @h > 120 && @h < 180
60
+ elsif @h > 120 && @h < 180
63
61
  Color.new(0, chroma, x)
64
- when @h > 180 && @h < 240
62
+ elsif @h > 180 && @h < 240
65
63
  Color.new(0, x, chroma)
66
- when @h > 240 && @h < 300
64
+ elsif @h > 240 && @h < 300
67
65
  Color.new(x, 0, chroma)
68
66
  else
69
67
  Color.new(chroma, 0, x)
@@ -74,12 +72,11 @@ module OoxmlParser
74
72
  def set_color(t1, t2, t3)
75
73
  t3 += 1.0 if t3 < 0
76
74
  t3 -= 1.0 if t3 > 1
77
- case
78
- when 6.0 * t3 < 1 then
75
+ if 6.0 * t3 < 1
79
76
  t2 + (t1 - t2) * 6.0 * t3
80
- when 2.0 * t3 < 1 then
77
+ elsif 2.0 * t3 < 1
81
78
  t1
82
- when 3.0 * t3 < 2 then
79
+ elsif 3.0 * t3 < 2
83
80
  t2 + (t1 - t2) * ((2.0 / 3.0) - t3) * 6.0
84
81
  else
85
82
  t2
@@ -1,3 +1,4 @@
1
+ require_relative 'stretching/fill_rectangle'
1
2
  module OoxmlParser
2
3
  class Stretching
3
4
  attr_accessor :fill_rectangle
@@ -16,6 +16,7 @@ module OoxmlParser
16
16
  blip_fill_node.xpath('*').each do |blip_fill_node_child|
17
17
  case blip_fill_node_child.name
18
18
  when 'blip'
19
+ next unless blip_fill_node_child.attribute('embed')
19
20
  path_to_original_image = OOXMLDocumentObject.get_link_from_rels(blip_fill_node_child.attribute('embed').value)
20
21
  FileUtils.copy(dir + path_to_original_image, OOXMLDocumentObject.media_folder + File.basename(path_to_original_image))
21
22
  image.path = OOXMLDocumentObject.media_folder + File.basename(path_to_original_image)
@@ -25,8 +25,7 @@ module OoxmlParser
25
25
  when 'path'
26
26
  gradient_color.path = gradient_fill_node_child.attribute('path').value.to_sym
27
27
  when 'lin'
28
- gradient_color.path = LinearGradient.new(gradient_fill_node_child.attribute('ang').value.to_f / 100_000.0,
29
- gradient_fill_node_child.attribute('scaled').value.to_i)
28
+ gradient_color.path = LinearGradient.parse(gradient_fill_node_child)
30
29
  end
31
30
  end
32
31
  gradient_color
@@ -6,5 +6,15 @@ module OoxmlParser
6
6
  @angle = angle
7
7
  @scaled = scaled
8
8
  end
9
+
10
+ # Parse LinearGradient object
11
+ # @param node [Nokogiri::XML:Element] node to parse
12
+ # @return [LinearGradient] result of parsing
13
+ def self.parse(node)
14
+ gradient = LinearGradient.new
15
+ gradient.angle = node.attribute('ang').value.to_f / 100_000.0 if node.attribute('ang')
16
+ gradient.scaled = node.attribute('scaled').value.to_i if node.attribute('scaled')
17
+ gradient
18
+ end
9
19
  end
10
20
  end
@@ -46,7 +46,12 @@ module OoxmlParser
46
46
  hyperlink.link_to = OOXMLDocumentObject.get_link_from_rels(on_click_hyperlink_node.attribute('id').value)
47
47
  end
48
48
  end
49
- hyperlink.highlight_click = StringHelper.to_bool(on_click_hyperlink_node.attribute('highlightClick').value) unless on_click_hyperlink_node.attribute('highlightClick').nil?
49
+ return hyperlink unless on_click_hyperlink_node.attribute('highlightClick')
50
+ hyperlink.highlight_click = if on_click_hyperlink_node.attribute('highlightClick').value == '1'
51
+ true
52
+ else
53
+ false
54
+ end
50
55
  hyperlink
51
56
  end
52
57
  end
@@ -7,6 +7,15 @@ module OoxmlParser
7
7
  class OOXMLDocumentObject
8
8
  DEFAULT_DIRECTORY_FOR_MEDIA = '/tmp'.freeze
9
9
 
10
+ def ==(other)
11
+ instance_variables.each do |current_attribute|
12
+ unless instance_variable_get(current_attribute) == other.instance_variable_get(current_attribute)
13
+ return false
14
+ end
15
+ end
16
+ true
17
+ end
18
+
10
19
  class << self
11
20
  attr_accessor :namespace_prefix
12
21
  attr_accessor :root_subfolder
@@ -14,6 +23,20 @@ module OoxmlParser
14
23
  attr_accessor :xmls_stack
15
24
  attr_accessor :path_to_folder
16
25
 
26
+ # @param path_to_file [String] file
27
+ # @return [True, False] Check if file is protected by password on open
28
+ def encrypted_file?(path_to_file)
29
+ file_result = `file "#{path_to_file}"`
30
+ # Support of Encrtypted status in `file` util was introduced in file v5.20
31
+ # but LTS version of ubuntu before 16.04 uses older `file` and it return `Composite Document`
32
+ # https://github.com/file/file/blob/master/ChangeLog#L217
33
+ if file_result.include?('Encrypted') || file_result.include?('Composite Document File V2 Document, No summary info')
34
+ warn("File #{path_to_file} is encrypted. Can't parse it")
35
+ return true
36
+ end
37
+ false
38
+ end
39
+
17
40
  def copy_file_and_rename_to_zip(path)
18
41
  file_name = File.basename(path)
19
42
  tmp_folder = "/tmp/office_open_xml_parser_#{SecureRandom.uuid}"
@@ -78,8 +101,13 @@ module OoxmlParser
78
101
  def copy_media_file(path_to_file)
79
102
  folder_to_save_media = '/tmp/media_from_' + File.basename(OOXMLDocumentObject.path_to_folder)
80
103
  path_to_copied_file = folder_to_save_media + '/' + File.basename(path_to_file)
104
+ full_path_to_file = OOXMLDocumentObject.path_to_folder + path_to_file
105
+ unless File.exist?(full_path_to_file)
106
+ warn "Couldn't find #{full_path_to_file} file on filesystem. Possible problem in original document"
107
+ return nil
108
+ end
81
109
  FileUtils.mkdir(folder_to_save_media) unless File.exist?(folder_to_save_media)
82
- FileUtils.copy_file(OOXMLDocumentObject.path_to_folder + path_to_file, path_to_copied_file)
110
+ FileUtils.copy_file(full_path_to_file, path_to_copied_file)
83
111
  path_to_copied_file
84
112
  end
85
113
  end
@@ -1,5 +1,6 @@
1
1
  require_relative 'paragraph/paragraph_properties'
2
2
  require_relative 'paragraph/paragraph_run'
3
+ require_relative 'paragraph/text_field'
3
4
  module OoxmlParser
4
5
  class Paragraph
5
6
  attr_accessor :properties, :runs, :text_field, :formulas
@@ -37,7 +37,7 @@ module OoxmlParser
37
37
  paragraph_properties.numbering.symbol = properties_element.attribute('char').value
38
38
  when 'buAutoNum'
39
39
  paragraph_properties.numbering.type = properties_element.attribute('type').value.to_sym
40
- paragraph_properties.numbering.start_at = properties_element.attribute('startAt').value
40
+ paragraph_properties.numbering.start_at = properties_element.attribute('startAt').value if properties_element.attribute('startAt')
41
41
  when 'tabLst'
42
42
  paragraph_properties.tabs = ParagraphTab.parse(properties_element)
43
43
  end
@@ -55,7 +55,7 @@ module OoxmlParser
55
55
  when 'i'
56
56
  character_properties.font_style.italic = OOXMLDocumentObject.option_enabled?(properties_element, 'i')
57
57
  when 'u'
58
- character_properties.font_style.underlined = Underline.parse(properties_element.attribute('val').value)
58
+ character_properties.font_style.underlined = Underline.new(:single)
59
59
  when 'vertAlign'
60
60
  character_properties.vertical_align = properties_element.attribute('val').value.to_sym
61
61
  when 'rFont'
@@ -0,0 +1,31 @@
1
+ require_relative 'relationships/relationship'
2
+ module OoxmlParser
3
+ # Class for describing list of relationships
4
+ class Relationships
5
+ # @return [Array, Relationship] array of relationships
6
+ attr_accessor :relationship
7
+
8
+ def initialize
9
+ @relationship = []
10
+ end
11
+
12
+ # @return [Array, Column] accessor for relationship
13
+ def [](key)
14
+ @relationship[key]
15
+ end
16
+
17
+ # Parse Relationships
18
+ # @param [Nokogiri::XML:Node] node with Relationships
19
+ # @return [Relationships] result of parsing
20
+ def self.parse(node)
21
+ rels = Relationships.new
22
+ node.xpath('*').each do |node_children|
23
+ case node_children.name
24
+ when 'Relationship'
25
+ rels.relationship << Relationship.parse(node_children)
26
+ end
27
+ end
28
+ rels
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ module OoxmlParser
2
+ # Class for single relationship
3
+ class Relationship
4
+ # @return [String] id of relation
5
+ attr_accessor :id
6
+ # @return [String] type of relation
7
+ attr_accessor :type
8
+ # @return [String] target of relation
9
+ attr_accessor :target
10
+
11
+ # Parse Relationship
12
+ # @param [Nokogiri::XML:Node] node with Relationship
13
+ # @return [Relationship] result of parsing
14
+ def self.parse(node)
15
+ rel = Relationship.new
16
+ rel.id = node.attribute('Id').value
17
+ rel.type = node.attribute('Type').value
18
+ rel.target = node.attribute('Target').value
19
+ rel
20
+ end
21
+ end
22
+ end
@@ -4,7 +4,7 @@ require_relative 'table/table_grid'
4
4
  require_relative 'table/margins/table_margins'
5
5
  require_relative 'table/margins/paragraph_margins'
6
6
  module OoxmlParser
7
- class Table
7
+ class Table < OOXMLDocumentObject
8
8
  attr_accessor :grid, :rows, :properties, :number
9
9
 
10
10
  def initialize(rows = [])
@@ -27,6 +27,7 @@ module OoxmlParser
27
27
  table_style = TableStyle.new
28
28
  if !style_id.nil?
29
29
  nodes = get_style_node(style_id)
30
+ return nil if nodes.nil?
30
31
  xpath = '*'
31
32
  attributes = 'style_node_child.name'
32
33
  elsif !table_style_node.nil?
@@ -1,6 +1,6 @@
1
1
  # Table Style in XLSX
2
2
  module OoxmlParser
3
- class TableStyleElement
3
+ class TableStyleElement < OOXMLDocumentObject
4
4
  attr_accessor :cell_properties
5
5
 
6
6
  def initialize
@@ -30,111 +30,54 @@ module OoxmlParser
30
30
  end
31
31
  end
32
32
  cell_borders = Borders.new
33
- parse_w_namespace = true
34
- begin
35
- cell_properties_node.xpath('w:vMerge') # TODO: Perform not so stupit check
36
- rescue Nokogiri::XML::XPath::SyntaxError
37
- parse_w_namespace = false
33
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:vMerge").each do |v_merge|
34
+ cell_properties.merge = CellMerge.parse(v_merge)
38
35
  end
39
- if parse_w_namespace
40
- cell_properties_node.xpath('w:vMerge').each do |v_merge|
41
- merge = v_merge.attribute('count_rows_in_span').nil? ? nil : v_merge.attribute('count_rows_in_span').value
42
- cell_properties.merge = CellMerge.new('vertical', v_merge.attribute('val').value, merge)
43
- end
44
- cell_properties_node.xpath('w:vAlign').each do |valign_node|
45
- cell_properties.vertical_align = valign_node.attribute('val').value.to_sym
46
- end
47
- cell_properties_node.xpath('w:gridSpan').each do |grid_span|
48
- cell_properties.merge = CellMerge.new('horizontal', grid_span.attribute('val').value)
36
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:vAlign").each do |valign_node|
37
+ cell_properties.vertical_align = valign_node.attribute('val').value.to_sym
38
+ end
39
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:gridSpan").each do |grid_span|
40
+ cell_properties.merge = CellMerge.new('horizontal', grid_span.attribute('val').value)
41
+ end
42
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:tcW").each do |table_cell_width|
43
+ cell_properties.table_cell_width = table_cell_width.attribute('w').value.to_f / 567.5
44
+ end
45
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:tcMar").each do |cell_margins_node|
46
+ cell_properties.table_cell_margin = TableMargins.parse(cell_margins_node)
47
+ end
48
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:textDirection").each do |text_direction|
49
+ cell_properties.text_direction = Alignment.parse(text_direction.attribute('val'))
50
+ end
51
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:tcBorders").each do |tc_boders|
52
+ tc_boders.xpath("#{OOXMLDocumentObject.namespace_prefix}:top").each do |top|
53
+ cell_borders.top = BordersProperties.parse(top)
49
54
  end
50
- cell_properties_node.xpath('w:tcW').each do |table_cell_width|
51
- cell_properties.table_cell_width = table_cell_width.attribute('w').value.to_f / 567.5
55
+ tc_boders.xpath("#{OOXMLDocumentObject.namespace_prefix}:right").each do |right|
56
+ cell_borders.right = BordersProperties.parse(right)
52
57
  end
53
- cell_properties_node.xpath('w:tcMar').each do |cell_margins_node|
54
- cell_properties.table_cell_margin = TableMargins.parse(cell_margins_node)
58
+ tc_boders.xpath("#{OOXMLDocumentObject.namespace_prefix}:left").each do |left|
59
+ cell_borders.left = BordersProperties.parse(left)
55
60
  end
56
- cell_properties_node.xpath('w:textDirection').each do |text_direction|
57
- cell_properties.text_direction = Alignment.parse(text_direction.attribute('val'))
61
+ tc_boders.xpath("#{OOXMLDocumentObject.namespace_prefix}:bottom").each do |bottom|
62
+ cell_borders.bottom = BordersProperties.parse(bottom)
58
63
  end
59
- cell_properties_node.xpath('w:tcBorders').each do |tc_boders|
60
- tc_boders.xpath('w:top').each do |top|
61
- top_border = BordersProperties.new
62
- top_border.color = top.attribute('color').value
63
- if !top.attribute('color').nil? && top.attribute('color').value != 'auto'
64
- top_border.color = Color.from_int16(top.attribute('color').value)
65
- end
66
- top_border.sz = top.attribute('sz').value.to_f / 8.0
67
- top_border.val = top.attribute('val').value
68
- top_border.space = top.attribute('space').value
69
- cell_borders.top = top_border
70
- end
71
- tc_boders.xpath('w:right').each do |right|
72
- right_border = BordersProperties.new
73
- right_border.color = right.attribute('color').value
74
- if !right.attribute('color').nil? && right.attribute('color').value != 'auto'
75
- right_border.color = Color.from_int16(right.attribute('color').value)
76
- end
77
- right_border.sz = right.attribute('sz').value.to_f / 8.0
78
- right_border.val = right.attribute('val').value
79
- right_border.space = right.attribute('space').value
80
- cell_borders.right = right_border
81
- end
82
- tc_boders.xpath('w:left').each do |left|
83
- left_border = BordersProperties.new
84
- left_border.color = left.attribute('color').value
85
- if !left.attribute('color').nil? && left.attribute('color').value != 'auto'
86
- left_border.color = Color.from_int16(left.attribute('color').value)
87
- end
88
- left_border.sz = left.attribute('sz').value.to_f / 8.0
89
- left_border.val = left.attribute('val').value
90
- left_border.space = left.attribute('space').value
91
- cell_borders.left = left_border
92
- end
93
- tc_boders.xpath('w:bottom').each do |bottom|
94
- bottom_border = BordersProperties.new
95
- bottom_border.color = bottom.attribute('color').value
96
- if !bottom.attribute('color').nil? && bottom.attribute('color').value != 'auto'
97
- bottom_border.color = Color.from_int16(bottom.attribute('color').value)
98
- end
99
- bottom_border.sz = bottom.attribute('sz').value.to_f / 8.0
100
- bottom_border.val = bottom.attribute('val').value
101
- bottom_border.space = bottom.attribute('space').value
102
- cell_borders.bottom = bottom_border
103
- end
104
- tc_boders.xpath('w:tl2br').each do |tl2br|
105
- top_left_to_bottom_right = BordersProperties.new
106
- top_left_to_bottom_right.color = tl2br.attribute('color').value
107
- if !tl2br.attribute('color').nil? && tl2br.attribute('color').value != 'auto'
108
- top_left_to_bottom_right.color = Color.from_int16(tl2br.attribute('color').value)
109
- end
110
- top_left_to_bottom_right.sz = tl2br.attribute('sz').value.to_f / 8.0
111
- top_left_to_bottom_right.val = tl2br.attribute('val').value
112
- top_left_to_bottom_right.space = tl2br.attribute('space').value
113
- cell_borders.top_left_to_bottom_right = top_left_to_bottom_right
114
- end
115
- tc_boders.xpath('w:tr2bl').each do |tr2bl|
116
- top_right_to_bottom_left = BordersProperties.new
117
- top_right_to_bottom_left.color = tr2bl.attribute('color').value
118
- if !tr2bl.attribute('color').nil? && tr2bl.attribute('color').value != 'auto'
119
- top_right_to_bottom_left.color = Color.from_int16(tr2bl.attribute('color').value)
120
- end
121
- top_right_to_bottom_left.sz = tr2bl.attribute('sz').value.to_f / 8.0
122
- top_right_to_bottom_left.val = tr2bl.attribute('val').value
123
- top_right_to_bottom_left.space = tr2bl.attribute('space').value
124
- cell_borders.top_right_to_bottom_left = top_right_to_bottom_left
125
- end
64
+ tc_boders.xpath("#{OOXMLDocumentObject.namespace_prefix}:tl2br").each do |tl2br|
65
+ cell_borders.top_left_to_bottom_right = BordersProperties.parse(tl2br)
126
66
  end
127
- cell_properties_node.xpath('w:shd').each do |shd|
128
- cell_properties.shd = shd.attribute('fill').value
129
- if !shd.attribute('fill').nil? && shd.attribute('fill').value != 'auto'
130
- cell_properties.shd = Color.from_int16(shd.attribute('fill').value)
131
- end
67
+ tc_boders.xpath("#{OOXMLDocumentObject.namespace_prefix}:tr2bl").each do |tr2bl|
68
+ cell_borders.top_right_to_bottom_left = BordersProperties.parse(tr2bl)
132
69
  end
133
- else
134
- cell_properties_node.xpath('a:fill').each do |fill|
135
- cell_properties.fill = DocxColorScheme.parse(fill)
70
+ end
71
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:shd").each do |shd|
72
+ next if shd.attribute('val').value == 'nil'
73
+ cell_properties.shd = shd.attribute('fill').value
74
+ if !shd.attribute('fill').nil? && shd.attribute('fill').value != 'auto'
75
+ cell_properties.shd = Color.from_int16(shd.attribute('fill').value)
136
76
  end
137
77
  end
78
+ cell_properties_node.xpath("#{OOXMLDocumentObject.namespace_prefix}:fill").each do |fill|
79
+ cell_properties.fill = DocxColorScheme.parse(fill)
80
+ end
138
81
  cell_properties.borders_properties = cell_borders
139
82
  cell_properties
140
83
  end