htot_conv 0.3.2 → 1.0.0

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +135 -135
  3. data/.travis.yml +12 -12
  4. data/Gemfile +4 -4
  5. data/LICENSE.txt +21 -21
  6. data/README.md +46 -138
  7. data/Rakefile +10 -10
  8. data/bin/console +14 -14
  9. data/bin/setup +8 -8
  10. data/docs/image/output_xlsx_type0.png +0 -0
  11. data/docs/image/output_xlsx_type1.png +0 -0
  12. data/docs/image/output_xlsx_type1_outline_rows_yes.png +0 -0
  13. data/docs/image/output_xlsx_type2.png +0 -0
  14. data/docs/image/output_xlsx_type2_integrate_cells_colspan.png +0 -0
  15. data/docs/image/output_xlsx_type2_outline_rows_yes.png +0 -0
  16. data/docs/image/output_xlsx_type3.png +0 -0
  17. data/docs/image/output_xlsx_type3_integrate_cells_both.png +0 -0
  18. data/docs/image/output_xlsx_type4.png +0 -0
  19. data/docs/image/output_xlsx_type4_integrate_cells_both.png +0 -0
  20. data/docs/image/output_xlsx_type5.png +0 -0
  21. data/docs/image/output_xlsx_type5_integrate_cells_colspan.png +0 -0
  22. data/docs/index.md +88 -0
  23. data/exe/htot_conv +8 -8
  24. data/htot_conv.gemspec +37 -37
  25. data/lib/htot_conv.rb +20 -20
  26. data/lib/htot_conv/cli.rb +174 -174
  27. data/lib/htot_conv/generator.rb +30 -30
  28. data/lib/htot_conv/generator/base.rb +34 -35
  29. data/lib/htot_conv/generator/xlsx_type0.rb +36 -24
  30. data/lib/htot_conv/generator/xlsx_type1.rb +57 -69
  31. data/lib/htot_conv/generator/xlsx_type2.rb +100 -104
  32. data/lib/htot_conv/generator/xlsx_type3.rb +99 -85
  33. data/lib/htot_conv/generator/xlsx_type4.rb +109 -84
  34. data/lib/htot_conv/generator/xlsx_type5.rb +75 -62
  35. data/lib/htot_conv/outline.rb +176 -176
  36. data/lib/htot_conv/parser.rb +27 -27
  37. data/lib/htot_conv/parser/base.rb +15 -15
  38. data/lib/htot_conv/parser/dir_tree.rb +54 -54
  39. data/lib/htot_conv/parser/html_list.rb +71 -71
  40. data/lib/htot_conv/parser/opml.rb +70 -70
  41. data/lib/htot_conv/parser/simple_text.rb +70 -70
  42. data/lib/htot_conv/util.rb +13 -13
  43. data/lib/htot_conv/version.rb +4 -4
  44. metadata +19 -6
@@ -1,85 +1,99 @@
1
- # frozen_string_literal: true
2
- require 'axlsx'
3
-
4
- require 'htot_conv/generator/base'
5
-
6
- module HTOTConv
7
- module Generator
8
- class XlsxType3 < 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([
24
- @data.key_header[0],
25
- *(HTOTConv::Util.pad_array([@data.value_header[0]], max_level)),
26
- *(HTOTConv::Util.pad_array(
27
- (@data.value_header.length <= 1)? [] : @data.value_header.last(@data.value_header.length - 1),
28
- [max_value_length - 1, 0].max)),
29
- ], :style => Axlsx::STYLE_THIN_BORDER)
30
- 1.upto(max_level) do |col_idx|
31
- edges = [:top, :bottom]
32
- edges << :left if (col_idx <= 1)
33
- edges << :right if (col_idx >= max_level)
34
- ws.rows.last.cells[col_idx].style = ws.styles.add_style(
35
- :border => { :style => :thin, :color => "00", :edges => edges })
36
- end
37
-
38
- @data.item.each_with_index do |item, item_index|
39
- key_value_cell = Array.new(max_level + 1, nil)
40
- key_value_cell[item.level - 1] = item.key
41
- key_value_cell[item.level ] = item.value[0]
42
- rest_value_cell = HTOTConv::Util.pad_array(
43
- (item.value.length <= 1)? [] : item.value.last(item.value.length - 1),
44
- [max_value_length - 1, 0].max)
45
-
46
- ws.add_row(key_value_cell.concat(rest_value_cell),
47
- :style => Axlsx::STYLE_THIN_BORDER)
48
-
49
- 0.upto(max_level) do |col_idx|
50
- edges = []
51
-
52
- edges << :left if (col_idx <= item.level)
53
- edges << :right if ((col_idx < item.level) || (col_idx >= max_level))
54
- edges << :top if ((col_idx > (item.level - 2)) || (item_index == 0))
55
- edges << :bottom if ((col_idx > (item.level - 1)) || (item_index == @data.item.length - 1))
56
- ws.rows.last.cells[col_idx].style = ws.styles.add_style(
57
- :border => { :style => :thin, :color => "00", :edges => edges })
58
- end
59
- end
60
-
61
- if [:colspan, :both].include?(@option[:integrate_cells])
62
- if max_level > 1
63
- ws.merge_cells(ws.rows[0].cells[1..(max_level)])
64
- end
65
- @data.item.each_with_index do |item, item_index|
66
- if item.level < max_level
67
- ws.merge_cells(ws.rows[item_index + 1].cells[(item.level..max_level)])
68
- end
69
- end
70
- end
71
- if [:rowspan, :both].include?(@option[:integrate_cells])
72
- @data.item.each_with_index do |item, item_index|
73
- cells = [ws.rows[item_index + 1].cells[item.level - 1]]
74
- ((item_index + 1)..(@data.item.length - 1)).each do |i|
75
- break if @data.item[i].level <= item.level
76
- cells << ws.rows[i + 1].cells[item.level - 1]
77
- end
78
-
79
- ws.merge_cells(cells) if cells.length > 1
80
- end
81
- end
82
- end
83
- end
84
- end
85
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'htot_conv/generator/base'
4
+
5
+ module HTOTConv
6
+ module Generator
7
+ class XlsxType3 < XlsxBase
8
+ def self.option_help
9
+ {
10
+ :integrate_cells => {
11
+ :default => nil,
12
+ :pat => [:colspan, :rowspan, :both],
13
+ :desc => "integrate key cells (specify 'colspan', 'rowspan' or 'both')",
14
+ },
15
+ }
16
+ end
17
+
18
+ def output_to_worksheet(ws)
19
+ max_level = @data.max_level
20
+ max_value_length = @data.max_value_length
21
+ row_index = 0
22
+
23
+ [
24
+ @data.key_header[0],
25
+ *(HTOTConv::Util.pad_array([@data.value_header[0]], max_level)),
26
+ *(HTOTConv::Util.pad_array(
27
+ (@data.value_header.length <= 1)? [] : @data.value_header.last(@data.value_header.length - 1),
28
+ [max_value_length - 1, 0].max)),
29
+ ].each_with_index do |v, col_index|
30
+ ws.add_cell(row_index, col_index, v)
31
+ [:top, :bottom, :left, :right].each do |edge|
32
+ ws[row_index][col_index].change_border(edge, "thin")
33
+ end
34
+ end
35
+ 1.upto(max_level) do |col_index|
36
+ edges = []
37
+ edges << :left unless (col_index <= 1)
38
+ edges << :right unless (col_index >= max_level)
39
+ edges.each do |edge|
40
+ ws[row_index][col_index].change_border(edge, nil)
41
+ end
42
+ end
43
+ row_index = row_index.succ
44
+
45
+ @data.item.each_with_index do |item, item_index|
46
+ key_value_cell = Array.new(max_level + 1, nil)
47
+ key_value_cell[item.level - 1] = item.key
48
+ key_value_cell[item.level ] = item.value[0]
49
+ rest_value_cell = HTOTConv::Util.pad_array(
50
+ (item.value.length <= 1)? [] : item.value.last(item.value.length - 1),
51
+ [max_value_length - 1, 0].max)
52
+
53
+ key_value_cell.concat(rest_value_cell).each_with_index do |v, col_index|
54
+ ws.add_cell(row_index, col_index, v)
55
+ [:top, :bottom, :left, :right].each do |edge|
56
+ ws[row_index][col_index].change_border(edge, "thin")
57
+ end
58
+ end
59
+ 0.upto(max_level) do |col_index|
60
+ edges = []
61
+ edges << :left unless (col_index <= item.level)
62
+ edges << :right unless ((col_index < item.level) || (col_index >= max_level))
63
+ edges << :top unless ((col_index > (item.level - 2)) || (item_index == 0))
64
+ edges << :bottom unless ((col_index > (item.level - 1)) || (item_index == @data.item.length - 1))
65
+ edges.each do |edge|
66
+ ws[row_index][col_index].change_border(edge, nil)
67
+ end
68
+ end
69
+ row_index = row_index.succ
70
+ end
71
+
72
+ if [:colspan, :both].include?(@option[:integrate_cells])
73
+ if max_level > 1
74
+ ws.merge_cells(0, 1, 0, max_level)
75
+ end
76
+ @data.item.each_with_index do |item, item_index|
77
+ if item.level < max_level
78
+ ws.merge_cells(item_index + 1, item.level, item_index + 1, max_level)
79
+ end
80
+ end
81
+ end
82
+ if [:rowspan, :both].include?(@option[:integrate_cells])
83
+ @data.item.each_with_index do |item, item_index|
84
+ min_row_index = item_index + 1
85
+ max_row_index = min_row_index
86
+ ((item_index + 1)..(@data.item.length - 1)).each do |i|
87
+ break if @data.item[i].level <= item.level
88
+ max_row_index = i + 1
89
+ end
90
+
91
+ unless min_row_index == max_row_index
92
+ ws.merge_cells(min_row_index, item.level - 1, max_row_index, item.level - 1)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -1,84 +1,109 @@
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
+
3
+ require 'htot_conv/generator/base'
4
+
5
+ module HTOTConv
6
+ module Generator
7
+ class XlsxType4 < XlsxBase
8
+ def self.option_help
9
+ {
10
+ :integrate_cells => {
11
+ :default => nil,
12
+ :pat => [:colspan, :rowspan, :both],
13
+ :desc => "integrate key cells (specify 'colspan', 'rowspan' or 'both')",
14
+ },
15
+ }
16
+ end
17
+
18
+ def output_to_worksheet(ws)
19
+ max_level = @data.max_level
20
+ max_value_length = @data.max_value_length
21
+ row_index = 0
22
+
23
+ ((1..max_level).map {|l| @data.key_header[l - 1] || nil }).concat(
24
+ HTOTConv::Util.pad_array(@data.value_header, max_value_length)
25
+ ).each_with_index do |v, col_index|
26
+ ws.add_cell(row_index, col_index, v)
27
+ [:top, :bottom, :left, :right].each do |edge|
28
+ ws[row_index][col_index].change_border(edge, "thin")
29
+ end
30
+ end
31
+ row_index = row_index.succ
32
+
33
+ rowspan_cells = Array.new(max_level) { [] }
34
+ @data.to_tree.descendants.each do |node|
35
+ if node.leaf?
36
+ item = node.item
37
+
38
+ key_cell = Array.new(max_level, nil)
39
+ [node].concat(node.ancestors.to_a).each do |c_node|
40
+ key_cell[c_node.item.level - 1] = c_node.item.key if c_node.item
41
+ break if c_node.prev
42
+ end
43
+
44
+ value_cell = HTOTConv::Util.pad_array(item.value, max_value_length)
45
+
46
+ key_cell.concat(value_cell).each_with_index do |v, col_index|
47
+ ws.add_cell(row_index, col_index, v)
48
+ [:top, :bottom, :left, :right].each do |edge|
49
+ ws[row_index][col_index].change_border(edge, "thin")
50
+ end
51
+ end
52
+
53
+ node.ancestors.each_with_object([node]) do |c_node, descendants|
54
+ if (c_node.item && c_node.item.level)
55
+ edges = []
56
+ edges << :top if (descendants.any? { |v| v.prev })
57
+ edges << :bottom if (descendants.any? { |v| v.next })
58
+ edges.each do |edge|
59
+ ws[row_index][c_node.item.level - 1].change_border(edge, nil)
60
+ end
61
+ end
62
+ descendants.unshift(c_node)
63
+ end
64
+ (item.level..max_level).each do |level|
65
+ edges = []
66
+ edges << :left unless (level == item.level)
67
+ edges << :right unless (level == max_level)
68
+ edges.each do |edge|
69
+ ws[row_index][level - 1].change_border(edge, nil)
70
+ end
71
+ end
72
+
73
+ if [:colspan, :both].include?(@option[:integrate_cells])
74
+ if item.level < max_level
75
+ ws.merge_cells(row_index, item.level - 1, row_index, max_level - 1)
76
+ end
77
+ end
78
+
79
+ node.ancestors.each_with_object([node]) do |c_node, descendants|
80
+ rowspan_cells[c_node.item.level - 1] << [row_index, c_node.item.level - 1]
81
+ unless (descendants.any? { |v| v.next })
82
+ if [:rowspan, :both].include?(@option[:integrate_cells])
83
+ if rowspan_cells[c_node.item.level - 1].length > 1
84
+ ws.merge_cells(
85
+ rowspan_cells[c_node.item.level - 1].map(&:first).min,
86
+ rowspan_cells[c_node.item.level - 1].map(&:last).min,
87
+ rowspan_cells[c_node.item.level - 1].map(&:first).max,
88
+ rowspan_cells[c_node.item.level - 1].map(&:last).max,
89
+ )
90
+ end
91
+ end
92
+ rowspan_cells[c_node.item.level - 1].clear
93
+ end
94
+ descendants.unshift(c_node)
95
+ end
96
+
97
+ (max_level..(max_level + max_value_length - 1)).each do |col_index|
98
+ [:top, :bottom, :left, :right].each do |edge|
99
+ ws[row_index][col_index].change_border(edge, "thin")
100
+ end
101
+ end
102
+
103
+ row_index = row_index.succ
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -1,62 +1,75 @@
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
+
3
+ require 'htot_conv/generator/base'
4
+
5
+ module HTOTConv
6
+ module Generator
7
+ class XlsxType5 < XlsxBase
8
+ def self.option_help
9
+ {
10
+ :integrate_cells => {
11
+ :default => nil,
12
+ :pat => [:colspan],
13
+ :desc => "integrate key cells (specify 'colspan')",
14
+ },
15
+ }
16
+ end
17
+
18
+ def output_to_worksheet(ws)
19
+ max_level = @data.max_level
20
+ max_value_length = @data.max_value_length
21
+ row_index = 0
22
+
23
+ ((1..max_level).map {|l| @data.key_header[l - 1] || nil }).concat(
24
+ HTOTConv::Util.pad_array(@data.value_header, max_value_length)
25
+ ).each_with_index do |v, col_index|
26
+ ws.add_cell(row_index, col_index, v)
27
+ [:top, :bottom, :left, :right].each do |edge|
28
+ ws[row_index][col_index].change_border(edge, "thin")
29
+ end
30
+ end
31
+ row_index = row_index.succ
32
+
33
+ @data.to_tree.descendants.each do |node|
34
+ if node.leaf?
35
+ item = node.item
36
+
37
+ key_cell = Array.new(max_level, nil)
38
+ key_cell[node.item.level - 1] = item.key
39
+ node.ancestors.each do |ancestor|
40
+ key_cell[ancestor.item.level - 1] = ancestor.item.key if ancestor.item
41
+ end
42
+
43
+ value_cell = HTOTConv::Util.pad_array(item.value, max_value_length)
44
+
45
+ key_cell.concat(value_cell).each_with_index do |v, col_index|
46
+ ws.add_cell(row_index, col_index, v)
47
+ [:top, :bottom, :left, :right].each do |edge|
48
+ ws[row_index][col_index].change_border(edge, "thin")
49
+ end
50
+ end
51
+
52
+ (item.level..max_level).each do |level|
53
+ edges = []
54
+ edges << :left unless (level == item.level)
55
+ edges << :right unless (level == max_level)
56
+ edges.each do |edge|
57
+ ws[row_index][level - 1].change_border(edge, nil)
58
+ end
59
+ end
60
+
61
+ if [:colspan].include?(@option[:integrate_cells])
62
+ if item.level < max_level
63
+ ws.merge_cells(row_index, item.level - 1, row_index, max_level - 1)
64
+ end
65
+ end
66
+ row_index = row_index.succ
67
+ end
68
+ end
69
+
70
+ ws.auto_filter ||= RubyXL::AutoFilter.new
71
+ ws.auto_filter.ref = RubyXL::Reference.new(0, row_index - 1, 0, max_level + max_value_length -1)
72
+ end
73
+ end
74
+ end
75
+ end