htot_conv 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,84 +1,84 @@
1
- # frozen_string_literal: true
2
- require 'axlsx'
3
-
4
- require 'htot_conv/generator/base'
5
-
6
- module HTOTConv
7
- module Generator
8
- class XlsxType4 < XlsxBase
9
- def self.option_help
10
- {
11
- :integrate_cells => {
12
- :default => nil,
13
- :pat => [:colspan, :rowspan, :both],
14
- :desc => "integrate key cells (specify 'colspan', 'rowspan' or 'both')",
15
- },
16
- }
17
- end
18
-
19
- def output_to_worksheet(ws)
20
- max_level = @data.max_level
21
- max_value_length = @data.max_value_length
22
-
23
- ws.add_row(((1..max_level).map {|l| @data.key_header[l - 1] || nil }).concat(
24
- HTOTConv::Util.pad_array(@data.value_header, max_value_length)),
25
- :style => Axlsx::STYLE_THIN_BORDER)
26
-
27
- rowspan_cells = Array.new(max_level) { [] }
28
- @data.to_tree.descendants.each do |node|
29
- if node.leaf?
30
- item = node.item
31
-
32
- key_cell = Array.new(max_level, nil)
33
- [node].concat(node.ancestors.to_a).each do |c_node|
34
- key_cell[c_node.item.level - 1] = c_node.item.key if c_node.item
35
- break if c_node.prev
36
- end
37
-
38
- value_cell = HTOTConv::Util.pad_array(item.value, max_value_length)
39
-
40
- ws.add_row(key_cell.concat(value_cell),
41
- :style => Axlsx::STYLE_THIN_BORDER)
42
-
43
- node.ancestors.each_with_object([node]) do |c_node, descendants|
44
- if (c_node.item && c_node.item.level)
45
- edges = [:left, :right]
46
- edges << :top unless (descendants.any? { |v| v.prev })
47
- edges << :bottom unless (descendants.any? { |v| v.next })
48
- ws.rows.last.cells[c_node.item.level - 1].style = ws.styles.add_style(
49
- :border => { :style => :thin, :color => "00", :edges => edges })
50
- end
51
- descendants.unshift(c_node)
52
- end
53
- (item.level..max_level).each do |level|
54
- edges = [:top, :bottom]
55
- edges << :left if (level == item.level)
56
- edges << :right if (level == max_level)
57
- ws.rows.last.cells[level - 1].style = ws.styles.add_style(
58
- :border => { :style => :thin, :color => "00", :edges => edges })
59
- end
60
-
61
- if [:colspan, :both].include?(@option[:integrate_cells])
62
- if item.level < max_level
63
- ws.merge_cells(ws.rows.last.cells[((item.level - 1)..(max_level - 1))])
64
- end
65
- end
66
-
67
- node.ancestors.each_with_object([node]) do |c_node, descendants|
68
- rowspan_cells[c_node.item.level - 1] << ws.rows.last.cells[c_node.item.level - 1]
69
- unless (descendants.any? { |v| v.next })
70
- if [:rowspan, :both].include?(@option[:integrate_cells])
71
- if rowspan_cells[c_node.item.level - 1].length > 1
72
- ws.merge_cells(rowspan_cells[c_node.item.level - 1])
73
- end
74
- end
75
- rowspan_cells[c_node.item.level - 1].clear
76
- end
77
- descendants.unshift(c_node)
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
1
+ # frozen_string_literal: true
2
+ require 'axlsx'
3
+
4
+ require 'htot_conv/generator/base'
5
+
6
+ module HTOTConv
7
+ module Generator
8
+ class XlsxType4 < XlsxBase
9
+ def self.option_help
10
+ {
11
+ :integrate_cells => {
12
+ :default => nil,
13
+ :pat => [:colspan, :rowspan, :both],
14
+ :desc => "integrate key cells (specify 'colspan', 'rowspan' or 'both')",
15
+ },
16
+ }
17
+ end
18
+
19
+ def output_to_worksheet(ws)
20
+ max_level = @data.max_level
21
+ max_value_length = @data.max_value_length
22
+
23
+ ws.add_row(((1..max_level).map {|l| @data.key_header[l - 1] || nil }).concat(
24
+ HTOTConv::Util.pad_array(@data.value_header, max_value_length)),
25
+ :style => Axlsx::STYLE_THIN_BORDER)
26
+
27
+ rowspan_cells = Array.new(max_level) { [] }
28
+ @data.to_tree.descendants.each do |node|
29
+ if node.leaf?
30
+ item = node.item
31
+
32
+ key_cell = Array.new(max_level, nil)
33
+ [node].concat(node.ancestors.to_a).each do |c_node|
34
+ key_cell[c_node.item.level - 1] = c_node.item.key if c_node.item
35
+ break if c_node.prev
36
+ end
37
+
38
+ value_cell = HTOTConv::Util.pad_array(item.value, max_value_length)
39
+
40
+ ws.add_row(key_cell.concat(value_cell),
41
+ :style => Axlsx::STYLE_THIN_BORDER)
42
+
43
+ node.ancestors.each_with_object([node]) do |c_node, descendants|
44
+ if (c_node.item && c_node.item.level)
45
+ edges = [:left, :right]
46
+ edges << :top unless (descendants.any? { |v| v.prev })
47
+ edges << :bottom unless (descendants.any? { |v| v.next })
48
+ ws.rows.last.cells[c_node.item.level - 1].style = ws.styles.add_style(
49
+ :border => { :style => :thin, :color => "00", :edges => edges })
50
+ end
51
+ descendants.unshift(c_node)
52
+ end
53
+ (item.level..max_level).each do |level|
54
+ edges = [:top, :bottom]
55
+ edges << :left if (level == item.level)
56
+ edges << :right if (level == max_level)
57
+ ws.rows.last.cells[level - 1].style = ws.styles.add_style(
58
+ :border => { :style => :thin, :color => "00", :edges => edges })
59
+ end
60
+
61
+ if [:colspan, :both].include?(@option[:integrate_cells])
62
+ if item.level < max_level
63
+ ws.merge_cells(ws.rows.last.cells[((item.level - 1)..(max_level - 1))])
64
+ end
65
+ end
66
+
67
+ node.ancestors.each_with_object([node]) do |c_node, descendants|
68
+ rowspan_cells[c_node.item.level - 1] << ws.rows.last.cells[c_node.item.level - 1]
69
+ unless (descendants.any? { |v| v.next })
70
+ if [:rowspan, :both].include?(@option[:integrate_cells])
71
+ if rowspan_cells[c_node.item.level - 1].length > 1
72
+ ws.merge_cells(rowspan_cells[c_node.item.level - 1])
73
+ end
74
+ end
75
+ rowspan_cells[c_node.item.level - 1].clear
76
+ end
77
+ descendants.unshift(c_node)
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -1,62 +1,62 @@
1
- # frozen_string_literal: true
2
- require 'axlsx'
3
-
4
- require 'htot_conv/generator/base'
5
-
6
- module HTOTConv
7
- module Generator
8
- class XlsxType5 < XlsxBase
9
- def self.option_help
10
- {
11
- :integrate_cells => {
12
- :default => nil,
13
- :pat => [:colspan],
14
- :desc => "integrate key cells (specify 'colspan')",
15
- },
16
- }
17
- end
18
-
19
- def output_to_worksheet(ws)
20
- max_level = @data.max_level
21
- max_value_length = @data.max_value_length
22
-
23
- ws.add_row(((1..max_level).map {|l| @data.key_header[l - 1] || nil }).concat(
24
- HTOTConv::Util.pad_array(@data.value_header, max_value_length)),
25
- :style => Axlsx::STYLE_THIN_BORDER)
26
-
27
- @data.to_tree.descendants.each do |node|
28
- if node.leaf?
29
- item = node.item
30
-
31
- key_cell = Array.new(max_level, nil)
32
- key_cell[node.item.level - 1] = item.key
33
- node.ancestors.each do |ancestor|
34
- key_cell[ancestor.item.level - 1] = ancestor.item.key if ancestor.item
35
- end
36
-
37
- value_cell = HTOTConv::Util.pad_array(item.value, max_value_length)
38
-
39
- ws.add_row(key_cell.concat(value_cell),
40
- :style => Axlsx::STYLE_THIN_BORDER)
41
-
42
- (item.level..max_level).each do |level|
43
- edges = [:top, :bottom]
44
- edges << :left if (level == item.level)
45
- edges << :right if (level == max_level)
46
- ws.rows.last.cells[level - 1].style = ws.styles.add_style(
47
- :border => { :style => :thin, :color => "00", :edges => edges })
48
- end
49
-
50
- if [:colspan].include?(@option[:integrate_cells])
51
- if item.level < max_level
52
- ws.merge_cells(ws.rows.last.cells[((item.level - 1)..(max_level - 1))])
53
- end
54
- end
55
- end
56
- end
57
-
58
- ws.auto_filter = "A1:#{ws.rows.last.cells[max_level + max_value_length - 1].r}"
59
- end
60
- end
61
- end
62
- end
1
+ # frozen_string_literal: true
2
+ require 'axlsx'
3
+
4
+ require 'htot_conv/generator/base'
5
+
6
+ module HTOTConv
7
+ module Generator
8
+ class XlsxType5 < XlsxBase
9
+ def self.option_help
10
+ {
11
+ :integrate_cells => {
12
+ :default => nil,
13
+ :pat => [:colspan],
14
+ :desc => "integrate key cells (specify 'colspan')",
15
+ },
16
+ }
17
+ end
18
+
19
+ def output_to_worksheet(ws)
20
+ max_level = @data.max_level
21
+ max_value_length = @data.max_value_length
22
+
23
+ ws.add_row(((1..max_level).map {|l| @data.key_header[l - 1] || nil }).concat(
24
+ HTOTConv::Util.pad_array(@data.value_header, max_value_length)),
25
+ :style => Axlsx::STYLE_THIN_BORDER)
26
+
27
+ @data.to_tree.descendants.each do |node|
28
+ if node.leaf?
29
+ item = node.item
30
+
31
+ key_cell = Array.new(max_level, nil)
32
+ key_cell[node.item.level - 1] = item.key
33
+ node.ancestors.each do |ancestor|
34
+ key_cell[ancestor.item.level - 1] = ancestor.item.key if ancestor.item
35
+ end
36
+
37
+ value_cell = HTOTConv::Util.pad_array(item.value, max_value_length)
38
+
39
+ ws.add_row(key_cell.concat(value_cell),
40
+ :style => Axlsx::STYLE_THIN_BORDER)
41
+
42
+ (item.level..max_level).each do |level|
43
+ edges = [:top, :bottom]
44
+ edges << :left if (level == item.level)
45
+ edges << :right if (level == max_level)
46
+ ws.rows.last.cells[level - 1].style = ws.styles.add_style(
47
+ :border => { :style => :thin, :color => "00", :edges => edges })
48
+ end
49
+
50
+ if [:colspan].include?(@option[:integrate_cells])
51
+ if item.level < max_level
52
+ ws.merge_cells(ws.rows.last.cells[((item.level - 1)..(max_level - 1))])
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ ws.auto_filter = "A1:#{ws.rows.last.cells[max_level + max_value_length - 1].r}"
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,30 +1,30 @@
1
- # frozen_string_literal: true
2
- require 'htot_conv/generator/xlsx_type0.rb'
3
- require 'htot_conv/generator/xlsx_type1.rb'
4
- require 'htot_conv/generator/xlsx_type2.rb'
5
- require 'htot_conv/generator/xlsx_type3.rb'
6
- require 'htot_conv/generator/xlsx_type4.rb'
7
- require 'htot_conv/generator/xlsx_type5.rb'
8
-
9
- require 'rinne'
10
-
11
- module HTOTConv
12
- module Generator
13
- def create(type, *args)
14
- klass = HTOTConv::Generator.const_get(Rinne.camelize(type.to_s))
15
- klass.new(*args)
16
- end
17
- module_function :create
18
-
19
- def types
20
- HTOTConv::Generator.constants.reject { |klass|
21
- klass =~ /Base$/
22
- }.select { |klass|
23
- HTOTConv::Generator.const_get(klass).kind_of?(Class)
24
- }.map { |klass|
25
- Rinne.to_snake(klass.to_s).to_sym
26
- }
27
- end
28
- module_function :types
29
- end
30
- end
1
+ # frozen_string_literal: true
2
+ require 'htot_conv/generator/xlsx_type0.rb'
3
+ require 'htot_conv/generator/xlsx_type1.rb'
4
+ require 'htot_conv/generator/xlsx_type2.rb'
5
+ require 'htot_conv/generator/xlsx_type3.rb'
6
+ require 'htot_conv/generator/xlsx_type4.rb'
7
+ require 'htot_conv/generator/xlsx_type5.rb'
8
+
9
+ require 'rinne'
10
+
11
+ module HTOTConv
12
+ module Generator
13
+ def create(type, *args)
14
+ klass = HTOTConv::Generator.const_get(Rinne.camelize(type.to_s))
15
+ klass.new(*args)
16
+ end
17
+ module_function :create
18
+
19
+ def types
20
+ HTOTConv::Generator.constants.reject { |klass|
21
+ klass =~ /Base$/
22
+ }.select { |klass|
23
+ HTOTConv::Generator.const_get(klass).kind_of?(Class)
24
+ }.map { |klass|
25
+ Rinne.to_snake(klass.to_s).to_sym
26
+ }
27
+ end
28
+ module_function :types
29
+ end
30
+ end