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,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
@@ -1,35 +1,34 @@
1
- # frozen_string_literal: true
2
- module HTOTConv
3
- module Generator
4
- class Base
5
- def initialize(data, option={})
6
- data.validate
7
- @data = data
8
- @option = self.class.option_help.inject({}) { |h, pair| h[pair[0]] = pair[1][:default]; h}.merge(option)
9
- end
10
- def self.option_help
11
- {}
12
- end
13
-
14
- def output(outputfile)
15
- raise NotImplementedError.new("#{self.class.name}.#{__method__} is an abstract method.")
16
- end
17
- end
18
-
19
- class XlsxBase < Base
20
- def output_to_worksheet(ws)
21
- raise NotImplementedError.new("#{self.class.name}.#{__method__} is an abstract method.")
22
- end
23
-
24
- def output(outputfile)
25
- p = Axlsx::Package.new
26
- p.workbook do |wb|
27
- wb.add_worksheet do |ws|
28
- output_to_worksheet(ws)
29
- end
30
- end
31
- p.serialize(outputfile)
32
- end
33
- end
34
- end
35
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubyXL'
4
+
5
+ module HTOTConv
6
+ module Generator
7
+ class Base
8
+ def initialize(data, option={})
9
+ data.validate
10
+ @data = data
11
+ @option = self.class.option_help.inject({}) { |h, pair| h[pair[0]] = pair[1][:default]; h}.merge(option)
12
+ end
13
+ def self.option_help
14
+ {}
15
+ end
16
+
17
+ def output(outputfile)
18
+ raise NotImplementedError.new("#{self.class.name}.#{__method__} is an abstract method.")
19
+ end
20
+ end
21
+
22
+ class XlsxBase < Base
23
+ def output_to_worksheet(ws)
24
+ raise NotImplementedError.new("#{self.class.name}.#{__method__} is an abstract method.")
25
+ end
26
+
27
+ def output(outputfile)
28
+ wb = RubyXL::Workbook.new
29
+ output_to_worksheet(wb[0])
30
+ wb.write(outputfile)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,24 +1,36 @@
1
- # frozen_string_literal: true
2
- require 'axlsx'
3
-
4
- require 'htot_conv/generator/base'
5
-
6
- module HTOTConv
7
- module Generator
8
- class XlsxType0 < XlsxBase
9
- def output_to_worksheet(ws)
10
- max_value_length = @data.max_value_length
11
-
12
- ws.add_row([@data.key_header[0], 'Outline Level'].concat(
13
- HTOTConv::Util.pad_array(@data.value_header, max_value_length)),
14
- :style => Axlsx::STYLE_THIN_BORDER)
15
-
16
- @data.item.each do |item|
17
- ws.add_row([item.key, item.level.to_i].concat(
18
- HTOTConv::Util.pad_array(item.value, max_value_length)),
19
- :style => Axlsx::STYLE_THIN_BORDER)
20
- end
21
- end
22
- end
23
- end
24
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'htot_conv/generator/base'
4
+
5
+ module HTOTConv
6
+ module Generator
7
+ class XlsxType0 < XlsxBase
8
+ def output_to_worksheet(ws)
9
+ row_index = 0
10
+ max_value_length = @data.max_value_length
11
+
12
+ [@data.key_header[0], 'Outline Level'].concat(
13
+ HTOTConv::Util.pad_array(@data.value_header, max_value_length)
14
+ ).each_with_index do |v, col_index|
15
+ ws.add_cell(row_index, col_index, v)
16
+ [:top, :bottom, :left, :right].each do |edge|
17
+ ws[row_index][col_index].change_border(edge, "thin")
18
+ end
19
+ end
20
+ row_index = row_index.succ
21
+
22
+ @data.item.each do |item|
23
+ [item.key, item.level.to_i].concat(
24
+ HTOTConv::Util.pad_array(item.value, 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
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,69 +1,57 @@
1
- # frozen_string_literal: true
2
-
3
- require 'axlsx'
4
-
5
- require 'htot_conv/generator/base'
6
-
7
- module HTOTConv
8
- module Generator
9
- class XlsxType1 < XlsxBase
10
- def self.option_help
11
- {
12
- :outline_rows => {
13
- :default => false,
14
- :pat => FalseClass,
15
- :desc => "group rows (default: no)",
16
- },
17
- }
18
- end
19
-
20
- def output_to_worksheet(ws)
21
- max_value_length = @data.max_value_length
22
-
23
- ws.add_row([@data.key_header[0]].concat(
24
- HTOTConv::Util.pad_array(@data.value_header, max_value_length)),
25
- :style => Axlsx::STYLE_THIN_BORDER)
26
-
27
- @data.item.each do |item|
28
- ws.add_row([item.key].concat(
29
- HTOTConv::Util.pad_array(item.value, max_value_length)),
30
- :style => Axlsx::STYLE_THIN_BORDER)
31
- end
32
-
33
- if @option[:outline_rows]
34
- max_level = @data.max_level
35
- outline_begin = Array.new(max_level, nil)
36
- dummy_end_item = HTOTConv::Outline::Item.new(nil, 1, nil)
37
- @data.item.concat([dummy_end_item]).each_with_index do |item, item_index|
38
- (item.level..max_level).each do |level|
39
- if outline_begin[level - 1]
40
- if outline_begin[level - 1] < item_index - 1
41
- ws.outline_level_rows((outline_begin[level - 1] + 1) + 1, (item_index - 1) + 1, level, false)
42
- end
43
- outline_begin[level - 1] = nil
44
- end
45
- end
46
- outline_begin[item.level - 1] = item_index
47
- end
48
-
49
- # PR randym/axlsx#440 has been added to master branch
50
- # https://github.com/randym/axlsx/commit/c80c8b9d9be5542471d66afcc2ce4ddd80cac1f7
51
- # but latest release on rubygems does not contain this.
52
- # So apply monkey patch to ws.sheet_pr.
53
- if defined? ws.sheet_pr.outline_pr
54
- ws.sheet_pr.outline_pr.summary_below = false
55
- else
56
- class << ws.sheet_pr # monkey patch
57
- def to_xml_string(str="".dup)
58
- tmp_str = "".dup
59
- super(tmp_str)
60
- str << tmp_str.sub('<pageSetUpPr', '<outlinePr summaryBelow="0" /><pageSetUpPr')
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
68
- end
69
-
1
+ # frozen_string_literal: true
2
+
3
+ require 'htot_conv/generator/base'
4
+
5
+ module HTOTConv
6
+ module Generator
7
+ class XlsxType1 < XlsxBase
8
+ def self.option_help
9
+ {
10
+ :outline_rows => {
11
+ :default => false,
12
+ :pat => FalseClass,
13
+ :desc => "group rows (default: no)",
14
+ },
15
+ }
16
+ end
17
+
18
+ def output_to_worksheet(ws)
19
+ row_index = 0
20
+ max_value_length = @data.max_value_length
21
+
22
+ [@data.key_header[0]].concat(
23
+ HTOTConv::Util.pad_array(@data.value_header, max_value_length)
24
+ ).each_with_index do |v, col_index|
25
+ ws.add_cell(row_index, col_index, v)
26
+ [:top, :bottom, :left, :right].each do |edge|
27
+ ws[row_index][col_index].change_border(edge, "thin")
28
+ end
29
+ end
30
+ row_index = row_index.succ
31
+
32
+ @data.item.each do |item|
33
+ ([item.key].concat(
34
+ HTOTConv::Util.pad_array(item.value, max_value_length))
35
+ ).each_with_index do |v, col_index|
36
+ ws.add_cell(row_index, col_index, v)
37
+ [:top, :bottom, :left, :right].each do |edge|
38
+ ws[row_index][col_index].change_border(edge, "thin")
39
+ end
40
+ end
41
+ row_index = row_index.succ
42
+ end
43
+
44
+ if @option[:outline_rows]
45
+ @data.item.each_with_index do |item, item_index|
46
+ ws[item_index + 1].outline_level = (item.level > 1)? (item.level - 1) : nil
47
+ end
48
+
49
+ ws.sheet_pr ||= RubyXL::WorksheetProperties.new
50
+ ws.sheet_pr.outline_pr ||= RubyXL::OutlineProperties.new
51
+ ws.sheet_pr.outline_pr.summary_below = false
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+
@@ -1,104 +1,100 @@
1
- # frozen_string_literal: true
2
- require 'axlsx'
3
-
4
- require 'htot_conv/generator/base'
5
-
6
- module HTOTConv
7
- module Generator
8
- class XlsxType2 < XlsxBase
9
- def self.option_help
10
- {
11
- :integrate_cells => {
12
- :default => nil,
13
- :pat => [:colspan, :rowspan],
14
- :desc => "integrate key cells (specify 'colspan' or 'rowspan')",
15
- },
16
- :outline_rows => {
17
- :default => false,
18
- :pat => FalseClass,
19
- :desc => "group rows (default: no)",
20
- },
21
- }
22
- end
23
-
24
- def output_to_worksheet(ws)
25
- max_level = @data.max_level
26
- max_value_length = @data.max_value_length
27
-
28
- ws.add_row(((1..max_level).map {|l| @data.key_header[l - 1] || nil }).concat(
29
- HTOTConv::Util.pad_array(@data.value_header, max_value_length)),
30
- :style => Axlsx::STYLE_THIN_BORDER)
31
-
32
- @data.item.each_with_index do |item, item_index|
33
- key_cell = Array.new(max_level, nil)
34
- key_cell[item.level - 1] = item.key
35
- value_cell = HTOTConv::Util.pad_array(item.value, max_value_length)
36
-
37
- ws.add_row(key_cell.concat(value_cell),
38
- :style => Axlsx::STYLE_THIN_BORDER)
39
-
40
- (1..max_level).each do |level|
41
- edges = []
42
- edges << :left if (level <= item.level)
43
- edges << :right if ((level < item.level) || (level == max_level))
44
- edges << :top if ((level >= item.level) || (item_index == 0))
45
- edges << :bottom if ((level > item.level) || (item_index == @data.item.length - 1))
46
- ws.rows.last.cells[level - 1].style = ws.styles.add_style(
47
- :border => { :style => :thin, :color => "00", :edges => edges })
48
- end
49
- end
50
-
51
- if @option[:outline_rows]
52
- outline_begin = Array.new(max_level, nil)
53
- dummy_end_item = HTOTConv::Outline::Item.new(nil, 1, nil)
54
- @data.item.concat([dummy_end_item]).each_with_index do |item, item_index|
55
- (item.level..max_level).each do |level|
56
- if outline_begin[level - 1]
57
- if outline_begin[level - 1] < item_index - 1
58
- ws.outline_level_rows((outline_begin[level - 1] + 1) + 1, (item_index - 1) + 1, level, false)
59
- end
60
- outline_begin[level - 1] = nil
61
- end
62
- end
63
- outline_begin[item.level - 1] = item_index
64
- end
65
-
66
- # PR randym/axlsx#440 has been added to master branch
67
- # https://github.com/randym/axlsx/commit/c80c8b9d9be5542471d66afcc2ce4ddd80cac1f7
68
- # but latest release on rubygems does not contain this.
69
- # So apply monkey patch to ws.sheet_pr.
70
- if defined? ws.sheet_pr.outline_pr
71
- ws.sheet_pr.outline_pr.summary_below = false
72
- else
73
- class << ws.sheet_pr # monkey patch
74
- def to_xml_string(str="".dup)
75
- tmp_str = "".dup
76
- super(tmp_str)
77
- str << tmp_str.sub('<pageSetUpPr', '<outlinePr summaryBelow="0" /><pageSetUpPr')
78
- end
79
- end
80
- end
81
- end
82
-
83
- case @option[:integrate_cells]
84
- when :colspan
85
- @data.item.each_with_index do |item, item_index|
86
- if item.level < max_level
87
- ws.merge_cells(ws.rows[item_index + 1].cells[((item.level - 1)..(max_level - 1))])
88
- end
89
- end
90
- when :rowspan
91
- @data.item.each_with_index do |item, item_index|
92
- cells = [ws.rows[item_index + 1].cells[item.level - 1]]
93
- ((item_index + 1)..(@data.item.length - 1)).each do |i|
94
- break if @data.item[i].level <= item.level
95
- cells << ws.rows[i + 1].cells[item.level - 1]
96
- end
97
-
98
- ws.merge_cells(cells) if cells.length > 1
99
- end
100
- end
101
- end
102
- end
103
- end
104
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'htot_conv/generator/base'
4
+
5
+ module HTOTConv
6
+ module Generator
7
+ class XlsxType2 < XlsxBase
8
+ def self.option_help
9
+ {
10
+ :integrate_cells => {
11
+ :default => nil,
12
+ :pat => [:colspan, :rowspan],
13
+ :desc => "integrate key cells (specify 'colspan' or 'rowspan')",
14
+ },
15
+ :outline_rows => {
16
+ :default => false,
17
+ :pat => FalseClass,
18
+ :desc => "group rows (default: no)",
19
+ },
20
+ }
21
+ end
22
+
23
+ def output_to_worksheet(ws)
24
+ row_index = 0
25
+ max_level = @data.max_level
26
+ max_value_length = @data.max_value_length
27
+
28
+ (((1..max_level).map {|l| @data.key_header[l - 1] || nil }).concat(
29
+ HTOTConv::Util.pad_array(@data.value_header, max_value_length))
30
+ ).each_with_index do |v, col_index|
31
+ ws.add_cell(row_index, col_index, v)
32
+ [:top, :bottom, :left, :right].each do |edge|
33
+ ws[row_index][col_index].change_border(edge, "thin")
34
+ end
35
+ end
36
+ row_index = row_index.succ
37
+
38
+ @data.item.each_with_index do |item, item_index|
39
+ key_cell = Array.new(max_level, nil)
40
+ key_cell[item.level - 1] = item.key
41
+ value_cell = HTOTConv::Util.pad_array(item.value, max_value_length)
42
+
43
+ key_cell.concat(value_cell).each_with_index do |v, col_index|
44
+ ws.add_cell(row_index, col_index, v)
45
+ if col_index >= max_level
46
+ [:top, :bottom, :left, :right].each do |edge|
47
+ ws[row_index][col_index].change_border(edge, "thin")
48
+ end
49
+ end
50
+ end
51
+
52
+ (1..max_level).each do |level|
53
+ edges = []
54
+ edges << :left if (level <= item.level)
55
+ edges << :right if ((level < item.level) || (level == max_level))
56
+ edges << :top if ((level >= item.level) || (item_index == 0))
57
+ edges << :bottom if ((level > item.level) || (item_index == @data.item.length - 1))
58
+ edges.each do |edge|
59
+ ws[row_index][level - 1].change_border(edge, "thin")
60
+ end
61
+ end
62
+
63
+ row_index = row_index.succ
64
+ end
65
+
66
+ if @option[:outline_rows]
67
+ @data.item.each_with_index do |item, item_index|
68
+ ws[item_index + 1].outline_level = (item.level > 1)? (item.level - 1) : nil
69
+ end
70
+
71
+ ws.sheet_pr ||= RubyXL::WorksheetProperties.new
72
+ ws.sheet_pr.outline_pr ||= RubyXL::OutlineProperties.new
73
+ ws.sheet_pr.outline_pr.summary_below = false
74
+ end
75
+
76
+ case @option[:integrate_cells]
77
+ when :colspan
78
+ @data.item.each_with_index do |item, item_index|
79
+ if item.level < max_level
80
+ ws.merge_cells(item_index + 1, item.level - 1, item_index + 1, max_level - 1)
81
+ end
82
+ end
83
+ when :rowspan
84
+ @data.item.each_with_index do |item, item_index|
85
+ min_row_index = item_index + 1
86
+ max_row_index = min_row_index
87
+ ((item_index + 1)..(@data.item.length - 1)).each do |i|
88
+ break if @data.item[i].level <= item.level
89
+ max_row_index = i + 1
90
+ end
91
+
92
+ unless min_row_index == max_row_index
93
+ ws.merge_cells(min_row_index, item.level - 1, max_row_index, item.level - 1)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end