htot_conv 0.3.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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