ooxml_parser 0.33.0 → 0.34.1
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.
- checksums.yaml +4 -4
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/docx_drawing.rb +9 -0
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/drawing_properties/docx_drawing_properties.rb +6 -2
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/drawing_properties/ooxml_coordinates.rb +15 -9
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/docx_graphic.rb +2 -1
- 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
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/shape/shape_properties/docx_shape_size.rb +4 -4
- data/lib/ooxml_parser/common_parser/common_data/borders_properties.rb +2 -2
- data/lib/ooxml_parser/common_parser/common_data/color/color_helper.rb +14 -13
- data/lib/ooxml_parser/common_parser/common_data/color.rb +17 -13
- data/lib/ooxml_parser/common_parser/common_data/colors/color_alpha_channel.rb +19 -5
- data/lib/ooxml_parser/common_parser/common_data/colors/color_properties.rb +34 -12
- data/lib/ooxml_parser/common_parser/common_data/colors/image_fill.rb +2 -2
- data/lib/ooxml_parser/common_parser/common_data/hyperlink.rb +4 -0
- data/lib/ooxml_parser/common_parser/common_data/ooxml_document_object.rb +22 -1
- data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_properties/numbering_properties.rb +22 -6
- data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_properties.rb +4 -2
- data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run/run_properties/run_fonts.rb +26 -0
- data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run/run_properties.rb +12 -3
- data/lib/ooxml_parser/common_parser/common_data/table/margins/table_margins.rb +4 -4
- data/lib/ooxml_parser/common_parser/common_data/table/row/cell/cell_properties.rb +14 -4
- data/lib/ooxml_parser/common_parser/common_data/table/table_properties.rb +3 -2
- data/lib/ooxml_parser/common_parser/common_data/underline.rb +22 -1
- data/lib/ooxml_parser/common_parser/common_data/valued_child.rb +21 -2
- data/lib/ooxml_parser/common_parser/parser/ooxml_file.rb +10 -0
- data/lib/ooxml_parser/docx_parser/document_structure/default_style_helper.rb +84 -0
- data/lib/ooxml_parser/docx_parser/document_structure/document_background.rb +6 -1
- data/lib/ooxml_parser/docx_parser/document_structure/document_style.rb +9 -3
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/accent.rb +9 -2
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/bar.rb +9 -3
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/group_char.rb +25 -4
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/matrix.rb +2 -1
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_paragraph_run/docx_paragraph_run_helpers.rb +21 -13
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_paragraph_run/field_char.rb +22 -0
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_paragraph_run.rb +3 -1
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/form_properties.rb +1 -1
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties/form_text_properties.rb +2 -2
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph.rb +25 -8
- data/lib/ooxml_parser/docx_parser/document_structure/header_footer.rb +14 -2
- data/lib/ooxml_parser/docx_parser/document_structure/page_properties/columns.rb +2 -2
- data/lib/ooxml_parser/docx_parser/document_structure/page_properties/note.rb +10 -11
- data/lib/ooxml_parser/docx_parser/document_structure/page_properties/page_properties/header_footer_reference.rb +27 -0
- data/lib/ooxml_parser/docx_parser/document_structure/page_properties/page_properties/page_borders.rb +26 -0
- data/lib/ooxml_parser/docx_parser/document_structure/page_properties/page_properties.rb +20 -12
- data/lib/ooxml_parser/docx_parser/document_structure/styles/document_defaults/paragraph_properties_default.rb +3 -0
- data/lib/ooxml_parser/docx_parser/document_structure/styles.rb +6 -0
- data/lib/ooxml_parser/docx_parser/document_structure.rb +2 -69
- data/lib/ooxml_parser/pptx_parser/presentation/presentation_comments/presentation_comment.rb +1 -1
- data/lib/ooxml_parser/pptx_parser/presentation/slide/graphic_frame/graphic_frame/chart_reference.rb +22 -0
- data/lib/ooxml_parser/pptx_parser/presentation/slide/graphic_frame/graphic_frame.rb +4 -1
- data/lib/ooxml_parser/version.rb +1 -1
- data/lib/ooxml_parser/xlsx_parser/workbook/pivot_table_definition/location.rb +6 -6
- data/lib/ooxml_parser/xlsx_parser/workbook/style_sheet/cell_xfs/cell_style/protection.rb +2 -2
- data/lib/ooxml_parser/xlsx_parser/workbook/style_sheet/cell_xfs/xf.rb +5 -5
- data/lib/ooxml_parser/xlsx_parser/workbook/workbook_properties.rb +1 -1
- data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/sheet_view.rb +2 -2
- data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/table_part.rb +9 -1
- data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/xlsx_column_properties.rb +2 -2
- data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/xlsx_header_footer.rb +4 -4
- data/lib/ooxml_parser/xlsx_parser/workbook/worksheet.rb +2 -1
- data/lib/ooxml_parser/xlsx_parser/workbook.rb +1 -1
- metadata +9 -3
|
@@ -4,7 +4,7 @@ require_relative 'grid_span'
|
|
|
4
4
|
module OoxmlParser
|
|
5
5
|
# Class for parsing 'w:tcPr' element
|
|
6
6
|
class CellProperties < OOXMLDocumentObject
|
|
7
|
-
attr_accessor :fill, :color, :borders, :text_direction, :anchor, :table_cell_width, :borders_properties
|
|
7
|
+
attr_accessor :fill, :color, :borders, :text_direction, :anchor, :table_cell_width, :borders_properties
|
|
8
8
|
# @return [GridSpan] data about grid span
|
|
9
9
|
attr_accessor :grid_span
|
|
10
10
|
# @return [TableMargins] margins
|
|
@@ -22,6 +22,8 @@ module OoxmlParser
|
|
|
22
22
|
# width is set to auto or pct, then the content of the cell will not wrap.
|
|
23
23
|
# > ECMA-376, 3rd Edition (June, 2011), Fundamentals and Markup Language Reference 17.4.30.
|
|
24
24
|
attr_accessor :no_wrap
|
|
25
|
+
# @return [ValuedChild] vertical align type
|
|
26
|
+
attr_reader :vertical_align_object
|
|
25
27
|
|
|
26
28
|
alias table_cell_borders borders_properties
|
|
27
29
|
|
|
@@ -38,15 +40,16 @@ module OoxmlParser
|
|
|
38
40
|
when 'vMerge'
|
|
39
41
|
@vertical_merge = ValuedChild.new(:symbol, parent: self).parse(node_child)
|
|
40
42
|
when 'vAlign'
|
|
41
|
-
@
|
|
43
|
+
@vertical_align_object = ValuedChild.new(:symbol, parent: self).parse(node_child)
|
|
42
44
|
when 'gridSpan'
|
|
43
45
|
@grid_span = GridSpan.new(parent: self).parse(node_child)
|
|
44
46
|
when 'tcW'
|
|
45
|
-
@table_cell_width = OoxmlSize.new(node_child
|
|
47
|
+
@table_cell_width = OoxmlSize.new.parse(node_child)
|
|
46
48
|
when 'tcMar'
|
|
47
49
|
@table_cell_margin = TableMargins.new(parent: self).parse(node_child)
|
|
48
50
|
when 'textDirection'
|
|
49
|
-
@
|
|
51
|
+
@text_direction_object = ValuedChild.new(:string, parent: self).parse(node_child)
|
|
52
|
+
@text_direction = value_to_symbol(@text_direction_object)
|
|
50
53
|
when 'noWrap'
|
|
51
54
|
@no_wrap = option_enabled?(node_child)
|
|
52
55
|
when 'shd'
|
|
@@ -85,5 +88,12 @@ module OoxmlParser
|
|
|
85
88
|
end
|
|
86
89
|
self
|
|
87
90
|
end
|
|
91
|
+
|
|
92
|
+
# @return [nil, Symbol] vertical align of cell
|
|
93
|
+
def vertical_align
|
|
94
|
+
return nil unless @vertical_align_object
|
|
95
|
+
|
|
96
|
+
@vertical_align_object.value
|
|
97
|
+
end
|
|
88
98
|
end
|
|
89
99
|
end
|
|
@@ -59,7 +59,8 @@ module OoxmlParser
|
|
|
59
59
|
when 'tblW'
|
|
60
60
|
@table_width = OoxmlSize.new.parse(node_child)
|
|
61
61
|
when 'jc'
|
|
62
|
-
@
|
|
62
|
+
@justification_object = ValuedChild.new(:symbol, parent: self).parse(node_child)
|
|
63
|
+
@jc = @justification_object.value
|
|
63
64
|
when 'shd'
|
|
64
65
|
@shade = Shade.new(parent: self).parse(node_child)
|
|
65
66
|
when 'solidFill'
|
|
@@ -67,7 +68,7 @@ module OoxmlParser
|
|
|
67
68
|
when 'tblLook'
|
|
68
69
|
@table_look = TableLook.new(parent: self).parse(node_child)
|
|
69
70
|
when 'tblInd'
|
|
70
|
-
@table_indent = OoxmlSize.new(
|
|
71
|
+
@table_indent = OoxmlSize.new(parent: self).parse(node_child)
|
|
71
72
|
when 'tblpPr'
|
|
72
73
|
@table_positon = TablePosition.new(parent: self).parse(node_child)
|
|
73
74
|
when 'tblCellMar'
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
module OoxmlParser
|
|
4
4
|
# Class for parsing `u` tags
|
|
5
5
|
class Underline < OOXMLDocumentObject
|
|
6
|
-
attr_accessor :style
|
|
6
|
+
attr_accessor :style
|
|
7
|
+
# @return [Color] color of underline
|
|
8
|
+
attr_accessor :color
|
|
9
|
+
# @return [Symbol] value of underline
|
|
10
|
+
attr_reader :value
|
|
7
11
|
|
|
8
12
|
def initialize(style = :none, color = nil, parent: nil)
|
|
9
13
|
@style = style == 'single' ? :single : style
|
|
@@ -38,6 +42,8 @@ module OoxmlParser
|
|
|
38
42
|
# @param node [Nokogiri::XML:Element] node to parse
|
|
39
43
|
# @return [Underline] result of parsing
|
|
40
44
|
def parse(node)
|
|
45
|
+
parse_attributes(node) if node.is_a?(Nokogiri::XML::Element)
|
|
46
|
+
|
|
41
47
|
case node
|
|
42
48
|
when 'sng'
|
|
43
49
|
@style = :single
|
|
@@ -46,5 +52,20 @@ module OoxmlParser
|
|
|
46
52
|
end
|
|
47
53
|
self
|
|
48
54
|
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
# Parse attributes
|
|
59
|
+
# @param node [Nokogiri::XML:Element] node to parse
|
|
60
|
+
def parse_attributes(node)
|
|
61
|
+
node.attributes.each do |key, value|
|
|
62
|
+
case key
|
|
63
|
+
when 'color'
|
|
64
|
+
@color = Color.new(parent: self).parse_hex_string(value.value)
|
|
65
|
+
when 'val'
|
|
66
|
+
@value = value.value.to_sym
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
49
70
|
end
|
|
50
71
|
end
|
|
@@ -3,8 +3,6 @@
|
|
|
3
3
|
module OoxmlParser
|
|
4
4
|
# Class for working with any tag contained only value
|
|
5
5
|
class ValuedChild < OOXMLDocumentObject
|
|
6
|
-
# @return [String] value of tag
|
|
7
|
-
attr_accessor :value
|
|
8
6
|
# @return [String] type of value
|
|
9
7
|
attr_reader :type
|
|
10
8
|
|
|
@@ -23,9 +21,30 @@ module OoxmlParser
|
|
|
23
21
|
@value = value.value.to_s if type == :string
|
|
24
22
|
@value = value_to_symbol(value) if type == :symbol
|
|
25
23
|
@value = value.value.to_i if type == :integer
|
|
24
|
+
@value = value.value.to_f if type == :float
|
|
25
|
+
@value = parse_boolean(value.value.to_s) if type == :boolean
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
self
|
|
29
29
|
end
|
|
30
|
+
|
|
31
|
+
# @return [Object] value of parameter
|
|
32
|
+
def value
|
|
33
|
+
return true if type == :boolean && @value.nil?
|
|
34
|
+
|
|
35
|
+
@value
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
# Handle boolean value
|
|
41
|
+
# @param [String] value to parse
|
|
42
|
+
# @return [Boolean] result
|
|
43
|
+
def parse_boolean(value)
|
|
44
|
+
return true if value == '1'
|
|
45
|
+
return true if value == 'true'
|
|
46
|
+
return false if value == '0'
|
|
47
|
+
return false if value == 'false'
|
|
48
|
+
end
|
|
30
49
|
end
|
|
31
50
|
end
|
|
@@ -56,6 +56,7 @@ module OoxmlParser
|
|
|
56
56
|
# @param password [String] password to file
|
|
57
57
|
# @return [OoxmlFile] path to decrypted file
|
|
58
58
|
def decrypt(password)
|
|
59
|
+
check_decryption_support
|
|
59
60
|
file_name = File.basename(@path)
|
|
60
61
|
tmp_folder = Dir.mktmpdir('ruby-ooxml-parser')
|
|
61
62
|
decrypted_path = "#{tmp_folder}/#{file_name}"
|
|
@@ -64,5 +65,14 @@ module OoxmlParser
|
|
|
64
65
|
|
|
65
66
|
OoxmlFile.new(decrypted_path)
|
|
66
67
|
end
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
|
|
71
|
+
# Check if file can be decrypted
|
|
72
|
+
# @return [Boolean] is file encrypted
|
|
73
|
+
def check_decryption_support
|
|
74
|
+
# Because of https://github.com/woodbusy/ooxml_decrypt/issues/6
|
|
75
|
+
raise NotImplementedError, 'Cannot decrypt file on `jruby` platform' if RUBY_PLATFORM == 'java'
|
|
76
|
+
end
|
|
67
77
|
end
|
|
68
78
|
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OoxmlParser
|
|
4
|
+
# Helper methods for parsing default style
|
|
5
|
+
module DefaultStyleHelper
|
|
6
|
+
# Parse default style
|
|
7
|
+
# @return [void]
|
|
8
|
+
def parse_default_style
|
|
9
|
+
parse_default_style_paragraph_properties
|
|
10
|
+
parse_default_style_run_properties
|
|
11
|
+
parse_default_character_style
|
|
12
|
+
DocumentStructure.default_table_paragraph_style = DocumentStructure.default_paragraph_style.dup
|
|
13
|
+
DocumentStructure.default_table_paragraph_style.spacing = Spacing.new(0, 0, 1, :auto)
|
|
14
|
+
DocumentStructure.default_table_run_style = DocumentStructure.default_run_style.dup
|
|
15
|
+
parse_default_table_style
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Perform parsing styles.xml
|
|
19
|
+
def parse_styles
|
|
20
|
+
file = "#{root_object.unpacked_folder}/word/styles.xml"
|
|
21
|
+
DocumentStructure.default_paragraph_style = DocxParagraph.new(parent: self)
|
|
22
|
+
DocumentStructure.default_table_paragraph_style = DocxParagraph.new(parent: self)
|
|
23
|
+
DocumentStructure.default_run_style = DocxParagraphRun.new(parent: self)
|
|
24
|
+
DocumentStructure.default_table_run_style = DocxParagraphRun.new(parent: self)
|
|
25
|
+
|
|
26
|
+
return unless File.exist?(file)
|
|
27
|
+
|
|
28
|
+
@styles = Styles.new(parent: self).parse
|
|
29
|
+
@numbering = Numbering.new(parent: self).parse
|
|
30
|
+
|
|
31
|
+
if @styles&.document_defaults&.paragraph_properties_default
|
|
32
|
+
DocumentStructure.default_paragraph_style = DocxParagraph.new(parent: self)
|
|
33
|
+
.parse(@styles.document_defaults
|
|
34
|
+
.paragraph_properties_default
|
|
35
|
+
.raw_node, 0)
|
|
36
|
+
end
|
|
37
|
+
if @styles&.document_defaults&.run_properties_default
|
|
38
|
+
DocumentStructure.default_run_style = DocxParagraphRun.new(parent: self)
|
|
39
|
+
.parse_properties(@styles
|
|
40
|
+
.document_defaults
|
|
41
|
+
.run_properties_default
|
|
42
|
+
.run_properties
|
|
43
|
+
.raw_node)
|
|
44
|
+
end
|
|
45
|
+
parse_default_style
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def parse_default_style_paragraph_properties
|
|
51
|
+
return unless @styles&.default_style(:paragraph)&.paragraph_properties_node
|
|
52
|
+
|
|
53
|
+
DocxParagraph.new.parse_paragraph_style(@styles.default_style(:paragraph)
|
|
54
|
+
.paragraph_properties_node,
|
|
55
|
+
DocumentStructure.default_run_style)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def parse_default_style_run_properties
|
|
59
|
+
return unless @styles&.default_style(:paragraph)&.run_properties_node
|
|
60
|
+
|
|
61
|
+
DocumentStructure.default_run_style
|
|
62
|
+
.parse_properties(@styles.default_style(:paragraph)
|
|
63
|
+
.run_properties_node)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Parse default character style
|
|
67
|
+
def parse_default_character_style
|
|
68
|
+
return unless @styles&.default_style(:character)&.run_properties_node
|
|
69
|
+
|
|
70
|
+
DocumentStructure.default_run_style
|
|
71
|
+
.parse_properties(@styles.default_style(:character)
|
|
72
|
+
.run_properties_node)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Parse default table style
|
|
76
|
+
def parse_default_table_style
|
|
77
|
+
return unless @styles&.default_style(:table)&.run_properties_node
|
|
78
|
+
|
|
79
|
+
DocumentStructure.default_table_run_style
|
|
80
|
+
.parse_properties(@styles.default_style(:table)
|
|
81
|
+
.run_properties_node)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -19,7 +19,12 @@ module OoxmlParser
|
|
|
19
19
|
# @param node [Nokogiri::XML:Element] node to parse
|
|
20
20
|
# @return [DocumentBackground] result of parsing
|
|
21
21
|
def parse(node)
|
|
22
|
-
|
|
22
|
+
node.attributes.each do |key, value|
|
|
23
|
+
case key
|
|
24
|
+
when 'color'
|
|
25
|
+
@color1 = Color.new(parent: self).parse_hex_string(value.value)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
23
28
|
node.xpath('v:background').each do |second_color|
|
|
24
29
|
@size = second_color.attribute('targetscreensize').value.sub(',', 'x') unless second_color.attribute('targetscreensize').nil?
|
|
25
30
|
second_color.xpath('*').each do |node_child|
|
|
@@ -39,6 +39,8 @@ module OoxmlParser
|
|
|
39
39
|
# Used to determine if current style is visible in style list in editors
|
|
40
40
|
# According to http://www.wordarticles.com/Articles/WordStyles/LatentStyles.php
|
|
41
41
|
attr_accessor :q_format
|
|
42
|
+
# @return [Nokogiri::XML:Element] raw node value
|
|
43
|
+
attr_reader :raw_node
|
|
42
44
|
|
|
43
45
|
alias visible? q_format
|
|
44
46
|
|
|
@@ -61,6 +63,7 @@ module OoxmlParser
|
|
|
61
63
|
# Parse single document style
|
|
62
64
|
# @return [DocumentStyle]
|
|
63
65
|
def parse(node)
|
|
66
|
+
@raw_node = node
|
|
64
67
|
node.attributes.each do |key, value|
|
|
65
68
|
case key
|
|
66
69
|
when 'type'
|
|
@@ -74,11 +77,14 @@ module OoxmlParser
|
|
|
74
77
|
node.xpath('*').each do |subnode|
|
|
75
78
|
case subnode.name
|
|
76
79
|
when 'name'
|
|
77
|
-
@
|
|
80
|
+
@name_object = ValuedChild.new(:string, parent: self).parse(subnode)
|
|
81
|
+
@name = @name_object.value
|
|
78
82
|
when 'basedOn'
|
|
79
|
-
@
|
|
83
|
+
@based_on_object = ValuedChild.new(:string, parent: self).parse(subnode)
|
|
84
|
+
@based_on = @based_on_object.value
|
|
80
85
|
when 'next'
|
|
81
|
-
@
|
|
86
|
+
@next_style_object = ValuedChild.new(:string, parent: self).parse(subnode)
|
|
87
|
+
@next_style = @next_style_object.value
|
|
82
88
|
when 'rPr'
|
|
83
89
|
@run_properties_node = subnode
|
|
84
90
|
@run_properties = DocxParagraphRun.new(parent: self).parse_properties(@run_properties_node)
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
module OoxmlParser
|
|
4
4
|
# Class for `acc` data
|
|
5
5
|
class Accent < OOXMLDocumentObject
|
|
6
|
-
|
|
6
|
+
# @return [ValuedChild] symbol object
|
|
7
|
+
attr_reader :symbol_object
|
|
8
|
+
attr_accessor :element
|
|
7
9
|
|
|
8
10
|
# Parse Accent object
|
|
9
11
|
# @param node [Nokogiri::XML:Element] node to parse
|
|
@@ -15,7 +17,7 @@ module OoxmlParser
|
|
|
15
17
|
node_child.xpath('*').each do |node_child_child|
|
|
16
18
|
case node_child_child.name
|
|
17
19
|
when 'chr'
|
|
18
|
-
@
|
|
20
|
+
@symbol_object = ValuedChild.new(:string, parent: self).parse(node_child_child)
|
|
19
21
|
end
|
|
20
22
|
end
|
|
21
23
|
end
|
|
@@ -23,5 +25,10 @@ module OoxmlParser
|
|
|
23
25
|
@element = DocxFormula.new(parent: self).parse(node)
|
|
24
26
|
self
|
|
25
27
|
end
|
|
28
|
+
|
|
29
|
+
# @return [String] symbol value
|
|
30
|
+
def symbol
|
|
31
|
+
@symbol_object.value
|
|
32
|
+
end
|
|
26
33
|
end
|
|
27
34
|
end
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
module OoxmlParser
|
|
4
4
|
# Class for `bar` data
|
|
5
5
|
class Bar < OOXMLDocumentObject
|
|
6
|
-
|
|
6
|
+
# @return [ValuedChild] position object
|
|
7
|
+
attr_reader :position_object
|
|
8
|
+
attr_accessor :element
|
|
7
9
|
|
|
8
10
|
def initialize(parent: nil)
|
|
9
|
-
@position = :bottom
|
|
10
11
|
super
|
|
11
12
|
end
|
|
12
13
|
|
|
@@ -20,7 +21,7 @@ module OoxmlParser
|
|
|
20
21
|
node_child.xpath('*').each do |node_child_child|
|
|
21
22
|
case node_child_child.name
|
|
22
23
|
when 'pos'
|
|
23
|
-
@
|
|
24
|
+
@position_object = ValuedChild.new(:symbol, parent: self).parse(node_child_child)
|
|
24
25
|
end
|
|
25
26
|
end
|
|
26
27
|
end
|
|
@@ -28,5 +29,10 @@ module OoxmlParser
|
|
|
28
29
|
@element = DocxFormula.new(parent: self).parse(node)
|
|
29
30
|
self
|
|
30
31
|
end
|
|
32
|
+
|
|
33
|
+
# @return [Symbol] position of bar
|
|
34
|
+
def position
|
|
35
|
+
@position_object.value
|
|
36
|
+
end
|
|
31
37
|
end
|
|
32
38
|
end
|
data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_formula/group_char.rb
CHANGED
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
module OoxmlParser
|
|
4
4
|
# Class for `groupChr` data
|
|
5
5
|
class GroupChar < OOXMLDocumentObject
|
|
6
|
-
|
|
6
|
+
# @return [ValuedChild] symbol object
|
|
7
|
+
attr_reader :symbol_object
|
|
8
|
+
# @return [ValuedChild] position object
|
|
9
|
+
attr_reader :position_object
|
|
10
|
+
# @return [ValuedChild] vertical align object
|
|
11
|
+
attr_reader :vertical_align_object
|
|
12
|
+
attr_accessor :element
|
|
7
13
|
|
|
8
14
|
# Parse GroupChar object
|
|
9
15
|
# @param node [Nokogiri::XML:Element] node to parse
|
|
@@ -15,11 +21,11 @@ module OoxmlParser
|
|
|
15
21
|
node_child.xpath('*').each do |node_child_child|
|
|
16
22
|
case node_child_child.name
|
|
17
23
|
when 'chr'
|
|
18
|
-
@
|
|
24
|
+
@symbol_object = ValuedChild.new(:string, parent: self).parse(node_child_child)
|
|
19
25
|
when 'pos'
|
|
20
|
-
@
|
|
26
|
+
@position_object = ValuedChild.new(:string, parent: self).parse(node_child_child)
|
|
21
27
|
when 'vertJc'
|
|
22
|
-
@
|
|
28
|
+
@vertical_align_object = ValuedChild.new(:string, parent: self).parse(node_child_child)
|
|
23
29
|
end
|
|
24
30
|
end
|
|
25
31
|
end
|
|
@@ -27,5 +33,20 @@ module OoxmlParser
|
|
|
27
33
|
@element = DocxFormula.new(parent: self).parse(node)
|
|
28
34
|
self
|
|
29
35
|
end
|
|
36
|
+
|
|
37
|
+
# @return [String] symbol value
|
|
38
|
+
def symbol
|
|
39
|
+
@symbol_object.value
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @return [String] position value
|
|
43
|
+
def position
|
|
44
|
+
@position_object.value
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @return [String] vertical align value
|
|
48
|
+
def vertical_align
|
|
49
|
+
@vertical_align_object.value
|
|
50
|
+
end
|
|
30
51
|
end
|
|
31
52
|
end
|
|
@@ -22,7 +22,8 @@ module OoxmlParser
|
|
|
22
22
|
mcs.xpath('m:mc').each do |mc|
|
|
23
23
|
mc.xpath('m:mcPr').each do |mc_pr|
|
|
24
24
|
mc_pr.xpath('m:count').each do |count|
|
|
25
|
-
|
|
25
|
+
count_object = ValuedChild.new(:integer, parent: self).parse(count)
|
|
26
|
+
columns_count = count_object.value
|
|
26
27
|
end
|
|
27
28
|
end
|
|
28
29
|
end
|
|
@@ -11,33 +11,40 @@ module OoxmlParser
|
|
|
11
11
|
node.xpath('*').each do |node_child|
|
|
12
12
|
case node_child.name
|
|
13
13
|
when 'rFonts'
|
|
14
|
+
run_fonts = RunFonts.new(parent: self).parse(node_child)
|
|
14
15
|
node_child.attributes.each do |font_attribute, value|
|
|
15
16
|
case font_attribute
|
|
16
17
|
when 'asciiTheme'
|
|
17
|
-
theme = node_child.attribute('asciiTheme').value
|
|
18
18
|
next unless root_object.theme
|
|
19
19
|
|
|
20
|
-
self.font = root_object.theme.font_scheme.major_font.latin.typeface if
|
|
21
|
-
self.font = root_object.theme.font_scheme.minor_font.latin.typeface if
|
|
20
|
+
self.font = root_object.theme.font_scheme.major_font.latin.typeface if run_fonts.ascii_theme.include?('major')
|
|
21
|
+
self.font = root_object.theme.font_scheme.minor_font.latin.typeface if run_fonts.ascii_theme.include?('minor')
|
|
22
22
|
when 'ascii'
|
|
23
23
|
self.font = value.value
|
|
24
24
|
break
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
when 'sz'
|
|
28
|
-
|
|
28
|
+
@size_object = ValuedChild.new(:integer, parent: self).parse(node_child)
|
|
29
|
+
self.size = @size_object.value.to_i / 2.0
|
|
29
30
|
when 'highlight'
|
|
30
|
-
|
|
31
|
+
@highlight_object = ValuedChild.new(:string, parent: self).parse(node_child)
|
|
32
|
+
self.highlight = @highlight_object.value
|
|
31
33
|
when 'vertAlign'
|
|
32
|
-
|
|
34
|
+
@vertical_align_object = ValuedChild.new(:symbol, parent: self).parse(node_child)
|
|
35
|
+
self.vertical_align = @vertical_align_object.value
|
|
33
36
|
when 'effect'
|
|
34
|
-
|
|
37
|
+
@effect_object = ValuedChild.new(:string, parent: self).parse(node_child)
|
|
38
|
+
self.effect = @effect_object.value
|
|
35
39
|
when 'position'
|
|
36
|
-
|
|
40
|
+
@position_object = ValuedChild.new(:integer, parent: self).parse(node_child)
|
|
41
|
+
self.position = (@position_object.value.to_f / (28.0 + (1.0 / 3.0)) / 2.0).round(1)
|
|
37
42
|
when 'em'
|
|
38
|
-
|
|
43
|
+
@em_object = ValuedChild.new(:string, parent: self).parse(node_child)
|
|
44
|
+
self.em = @em_object.value
|
|
39
45
|
when 'spacing'
|
|
40
|
-
|
|
46
|
+
@spacing_object = RunSpacing.new(parent: self).parse(node_child)
|
|
47
|
+
self.spacing = (@spacing_object.value.value.to_f / 566.9).round(1)
|
|
41
48
|
when 'textFill'
|
|
42
49
|
self.text_fill = TextFill.new(parent: self).parse(node_child)
|
|
43
50
|
when 'textOutline'
|
|
@@ -98,12 +105,13 @@ module OoxmlParser
|
|
|
98
105
|
# @param node [Nokogiri::XML:Element] node to parse
|
|
99
106
|
# @return [nil]
|
|
100
107
|
def parse_underline(node)
|
|
108
|
+
underline_object = Underline.new.parse(node)
|
|
101
109
|
font_style.underlined = Underline.new
|
|
102
110
|
|
|
103
|
-
return unless
|
|
111
|
+
return unless underline_object.value
|
|
104
112
|
|
|
105
|
-
font_style.underlined.style =
|
|
106
|
-
font_style.underlined.color =
|
|
113
|
+
font_style.underlined.style = underline_object.value
|
|
114
|
+
font_style.underlined.color = underline_object.color if underline_object.color
|
|
107
115
|
end
|
|
108
116
|
end
|
|
109
117
|
end
|
data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/docx_paragraph_run/field_char.rb
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OoxmlParser
|
|
4
|
+
# Class for parsing `w:fldChar` object
|
|
5
|
+
class FieldChar < OOXMLDocumentObject
|
|
6
|
+
# @return [Symbol] type of field char
|
|
7
|
+
attr_accessor :type
|
|
8
|
+
|
|
9
|
+
# Parse FieldChar
|
|
10
|
+
# @param [Nokogiri::XML:Node] node with FieldChar
|
|
11
|
+
# @return [FieldChar] result of parsing
|
|
12
|
+
def parse(node)
|
|
13
|
+
node.attributes.each do |key, value|
|
|
14
|
+
case key
|
|
15
|
+
when 'fldCharType'
|
|
16
|
+
@type = value.value.to_sym
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
self
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require_relative 'docx_paragraph_run/docx_paragraph_run_helpers'
|
|
4
|
+
require_relative 'docx_paragraph_run/field_char'
|
|
4
5
|
require_relative 'docx_paragraph_run/instruction_text'
|
|
5
6
|
require_relative 'docx_paragraph_run/object'
|
|
6
7
|
require_relative 'docx_paragraph_run/text_outline'
|
|
@@ -103,7 +104,8 @@ module OoxmlParser
|
|
|
103
104
|
@text = '*PAGE NUMBER*'
|
|
104
105
|
end
|
|
105
106
|
when 'fldChar'
|
|
106
|
-
@
|
|
107
|
+
@field_char_object = FieldChar.new(parent: self).parse(node_child)
|
|
108
|
+
@fld_char = @field_char_object.type
|
|
107
109
|
when 't'
|
|
108
110
|
@text += node_child.text
|
|
109
111
|
when 'noBreakHyphen'
|
|
@@ -23,9 +23,9 @@ module OoxmlParser
|
|
|
23
23
|
node.attributes.each do |key, value|
|
|
24
24
|
case key
|
|
25
25
|
when 'multiLine'
|
|
26
|
-
@multiline =
|
|
26
|
+
@multiline = boolean_attribute_value(value)
|
|
27
27
|
when 'autoFit'
|
|
28
|
-
@autofit =
|
|
28
|
+
@autofit = boolean_attribute_value(value)
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
@@ -16,7 +16,7 @@ module OoxmlParser
|
|
|
16
16
|
# Class for data of DocxParagraph
|
|
17
17
|
class DocxParagraph < OOXMLDocumentObject
|
|
18
18
|
include DocxParagraphHelper
|
|
19
|
-
attr_accessor :number, :align, :
|
|
19
|
+
attr_accessor :number, :align, :numbering,
|
|
20
20
|
:character_style_array, :page_break, :borders, :keep_lines,
|
|
21
21
|
:contextual_spacing, :sector_properties, :page_numbering, :section_break, :style, :keep_next,
|
|
22
22
|
:orphan_control
|
|
@@ -32,6 +32,8 @@ module OoxmlParser
|
|
|
32
32
|
attr_accessor :paragraph_id
|
|
33
33
|
# @return [MathParagraph] math paragraph
|
|
34
34
|
attr_reader :math_paragraph
|
|
35
|
+
# Set spacing value
|
|
36
|
+
attr_writer :spacing
|
|
35
37
|
# @return [Integer] id of text (for comment)
|
|
36
38
|
attr_accessor :text_id
|
|
37
39
|
|
|
@@ -59,7 +61,7 @@ module OoxmlParser
|
|
|
59
61
|
def initialize_copy(source)
|
|
60
62
|
super
|
|
61
63
|
@character_style_array = source.character_style_array.clone
|
|
62
|
-
@spacing = source.spacing.clone
|
|
64
|
+
@spacing = source.instance_variable_get(:@spacing).clone
|
|
63
65
|
end
|
|
64
66
|
|
|
65
67
|
# @return [Array<OOXMLDocumentObject>] array of child objects that contains data
|
|
@@ -147,10 +149,10 @@ module OoxmlParser
|
|
|
147
149
|
@hyperlink = Hyperlink.new(parent: self).parse(node_child)
|
|
148
150
|
character_style = default_character_style.dup
|
|
149
151
|
character_style.parent = self
|
|
150
|
-
if
|
|
152
|
+
if @hyperlink.id
|
|
151
153
|
character_style.link = Hyperlink.new(parent: character_style).parse(node_child)
|
|
152
|
-
elsif
|
|
153
|
-
character_style.link =
|
|
154
|
+
elsif @hyperlink.anchor
|
|
155
|
+
character_style.link = @hyperlink.anchor
|
|
154
156
|
end
|
|
155
157
|
node_child.xpath('w:r').each do |r_tag|
|
|
156
158
|
character_style.parse(r_tag, char_number, parent: self)
|
|
@@ -204,12 +206,13 @@ module OoxmlParser
|
|
|
204
206
|
@paragraph_style_ref = ParagraphStyleRef.new(parent: self).parse(node_child)
|
|
205
207
|
fill_style_data(default_char_style)
|
|
206
208
|
when 'ind'
|
|
207
|
-
@ind = DocumentStructure.default_paragraph_style.ind.dup.parse(node_child)
|
|
209
|
+
@ind = DocumentStructure.default_paragraph_style.instance_variable_get(:@ind).dup.parse(node_child)
|
|
208
210
|
when 'numPr'
|
|
209
211
|
@numbering = NumberingProperties.new(parent: self).parse(node_child)
|
|
210
212
|
when 'jc'
|
|
211
|
-
@
|
|
212
|
-
@align =
|
|
213
|
+
@justification_object = ValuedChild.new(:string, parent: self).parse(node_child)
|
|
214
|
+
@align = @justification_object.value.to_sym unless @justification_object.value.nil?
|
|
215
|
+
@align = :justify if @justification_object.value == 'both'
|
|
213
216
|
when 'spacing'
|
|
214
217
|
@valued_spacing = ParagraphSpacing.new(parent: self).parse(node_child)
|
|
215
218
|
@spacing = @spacing.fetch_from_valued_spacing(@valued_spacing)
|
|
@@ -229,6 +232,20 @@ module OoxmlParser
|
|
|
229
232
|
self
|
|
230
233
|
end
|
|
231
234
|
|
|
235
|
+
def spacing
|
|
236
|
+
style_spacing = root_object.styles&.default_style(:paragraph)&.paragraph_properties&.spacing
|
|
237
|
+
return Spacing.new.fetch_from_valued_spacing(style_spacing) if style_spacing
|
|
238
|
+
|
|
239
|
+
@spacing
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# @return [Indents] value of indents
|
|
243
|
+
def ind
|
|
244
|
+
return @ind if @ind != Indents.new
|
|
245
|
+
|
|
246
|
+
root_object.styles&.default_style(:paragraph)&.paragraph_properties&.indent
|
|
247
|
+
end
|
|
248
|
+
|
|
232
249
|
# Fill data from styles
|
|
233
250
|
# @param character_style [DocxParagraphRun] style to parse
|
|
234
251
|
# @return [void]
|