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,176 +1,176 @@
1
- # frozen_string_literal: true
2
- module HTOTConv
3
- class Outline
4
- def initialize
5
- @item = []
6
- end
7
-
8
- attr_accessor :key_header
9
- attr_accessor :value_header
10
- attr_accessor :item
11
-
12
- def add_item(*args)
13
- @item << Item.new(*args)
14
- end
15
-
16
- def validate
17
- raise ValidationError, "key_header must be an array" unless @key_header.kind_of?(Array)
18
- raise ValidationError, "key_header elements must be strings." unless @key_header.all? { |v| v.nil? || v.kind_of?(String) }
19
- raise ValidationError, "value_header must be an array" unless @value_header.kind_of?(Array)
20
- raise ValidationError, "value_header elements must be strings." unless @value_header.all? { |v| v.nil? || v.kind_of?(String) }
21
- raise ValidationError, "item must be an array" unless @item.kind_of?(Array)
22
- @item.each { |item| item.validate }
23
- end
24
-
25
- def valid?
26
- begin
27
- validate
28
- true
29
- rescue ValidationError
30
- false
31
- end
32
- end
33
-
34
- def max_level
35
- [
36
- @key_header.length,
37
- *(@item.map { |v| v.level.to_i }),
38
- ].max
39
- end
40
-
41
- def max_value_length
42
- [
43
- @value_header.length,
44
- *(@item.map { |v| (v.value)? v.value.length : 0 }),
45
- ].max
46
- end
47
-
48
- def ==(v)
49
- (@key_header == v.key_header) &&
50
- (@value_header == v.value_header) &&
51
- (@item == v.item)
52
- end
53
-
54
- def to_tree
55
- root = Tree.new
56
- last_node = root
57
- @item.each_with_index do |item,i|
58
- parent_node = root
59
- if ((item.level > 1) && !(last_node.root?))
60
- if item.level > last_node.item.level
61
- parent_node = last_node
62
- else
63
- parent_node = last_node.parent
64
- parent_node = parent_node.parent until (parent_node.root? || parent_node.item.level < item.level)
65
- end
66
- end
67
-
68
- parent_node << item
69
- last_node = parent_node.to_a.last
70
- end
71
- root
72
- end
73
-
74
- class ValidationError < RuntimeError
75
- end
76
-
77
- Item = Struct.new(:key, :level, :value) do
78
- def validate
79
- raise ValidationError, "item level for item \"#{key}\" must be an integer" unless self.level.kind_of?(Numeric)
80
- raise ValidationError, "item level for item \"#{key}\" must be positive" unless self.level > 0
81
- raise ValidationError, "item level for item \"#{key}\" must be an integer" unless (self.level.to_i == self.level)
82
- raise ValidationError, "value for item \"#{key}\" must be an array" unless self.value.kind_of?(Array)
83
- end
84
-
85
- def valid?
86
- begin
87
- validate
88
- true
89
- rescue ValidationError
90
- false
91
- end
92
- end
93
- end
94
-
95
- class Tree
96
- include Enumerable
97
-
98
- def initialize(item=nil, parent=nil)
99
- @item = item
100
- @parent = parent
101
- @children = []
102
- end
103
- attr_accessor :item
104
- attr_reader :parent
105
-
106
- def root?
107
- @parent.nil?
108
- end
109
-
110
- def leaf?
111
- @children.empty?
112
- end
113
-
114
- def add(item)
115
- child = Tree.new(item, self)
116
- @children << child
117
- self
118
- end
119
- alias :<< :add
120
-
121
- def each # :yield: child
122
- @children.each do |v|
123
- yield v if block_given?
124
- end
125
- @children.dup
126
- end
127
-
128
- def root
129
- node = self
130
- node = node.parent until node.root?
131
- node
132
- end
133
-
134
- def next
135
- if root?
136
- nil
137
- else
138
- brothers = parent.to_a
139
- index = brothers.index(self)
140
- (index + 1 < brothers.length)? brothers[index + 1] : nil
141
- end
142
- end
143
-
144
- def prev
145
- if root?
146
- nil
147
- else
148
- brothers = parent.to_a
149
- index = brothers.index(self)
150
- (index - 1 >= 0)? brothers[index - 1] : nil
151
- end
152
- end
153
-
154
- def ancestors
155
- Enumerator.new do |y|
156
- node = self.parent
157
- until (node.nil? || node.root?)
158
- y << node
159
- node = node.parent
160
- end
161
- end
162
- end
163
-
164
- def descendants
165
- Enumerator.new do |y|
166
- @children.each do |child|
167
- y << child
168
- child.descendants.each do |descendant|
169
- y << descendant
170
- end
171
- end
172
- end
173
- end
174
- end
175
- end
176
- end
1
+ # frozen_string_literal: true
2
+ module HTOTConv
3
+ class Outline
4
+ def initialize
5
+ @item = []
6
+ end
7
+
8
+ attr_accessor :key_header
9
+ attr_accessor :value_header
10
+ attr_accessor :item
11
+
12
+ def add_item(*args)
13
+ @item << Item.new(*args)
14
+ end
15
+
16
+ def validate
17
+ raise ValidationError, "key_header must be an array" unless @key_header.kind_of?(Array)
18
+ raise ValidationError, "key_header elements must be strings." unless @key_header.all? { |v| v.nil? || v.kind_of?(String) }
19
+ raise ValidationError, "value_header must be an array" unless @value_header.kind_of?(Array)
20
+ raise ValidationError, "value_header elements must be strings." unless @value_header.all? { |v| v.nil? || v.kind_of?(String) }
21
+ raise ValidationError, "item must be an array" unless @item.kind_of?(Array)
22
+ @item.each { |item| item.validate }
23
+ end
24
+
25
+ def valid?
26
+ begin
27
+ validate
28
+ true
29
+ rescue ValidationError
30
+ false
31
+ end
32
+ end
33
+
34
+ def max_level
35
+ [
36
+ @key_header.length,
37
+ *(@item.map { |v| v.level.to_i }),
38
+ ].max
39
+ end
40
+
41
+ def max_value_length
42
+ [
43
+ @value_header.length,
44
+ *(@item.map { |v| (v.value)? v.value.length : 0 }),
45
+ ].max
46
+ end
47
+
48
+ def ==(v)
49
+ (@key_header == v.key_header) &&
50
+ (@value_header == v.value_header) &&
51
+ (@item == v.item)
52
+ end
53
+
54
+ def to_tree
55
+ root = Tree.new
56
+ last_node = root
57
+ @item.each_with_index do |item,i|
58
+ parent_node = root
59
+ if ((item.level > 1) && !(last_node.root?))
60
+ if item.level > last_node.item.level
61
+ parent_node = last_node
62
+ else
63
+ parent_node = last_node.parent
64
+ parent_node = parent_node.parent until (parent_node.root? || parent_node.item.level < item.level)
65
+ end
66
+ end
67
+
68
+ parent_node << item
69
+ last_node = parent_node.to_a.last
70
+ end
71
+ root
72
+ end
73
+
74
+ class ValidationError < RuntimeError
75
+ end
76
+
77
+ Item = Struct.new(:key, :level, :value) do
78
+ def validate
79
+ raise ValidationError, "item level for item \"#{key}\" must be an integer" unless self.level.kind_of?(Numeric)
80
+ raise ValidationError, "item level for item \"#{key}\" must be positive" unless self.level > 0
81
+ raise ValidationError, "item level for item \"#{key}\" must be an integer" unless (self.level.to_i == self.level)
82
+ raise ValidationError, "value for item \"#{key}\" must be an array" unless self.value.kind_of?(Array)
83
+ end
84
+
85
+ def valid?
86
+ begin
87
+ validate
88
+ true
89
+ rescue ValidationError
90
+ false
91
+ end
92
+ end
93
+ end
94
+
95
+ class Tree
96
+ include Enumerable
97
+
98
+ def initialize(item=nil, parent=nil)
99
+ @item = item
100
+ @parent = parent
101
+ @children = []
102
+ end
103
+ attr_accessor :item
104
+ attr_reader :parent
105
+
106
+ def root?
107
+ @parent.nil?
108
+ end
109
+
110
+ def leaf?
111
+ @children.empty?
112
+ end
113
+
114
+ def add(item)
115
+ child = Tree.new(item, self)
116
+ @children << child
117
+ self
118
+ end
119
+ alias :<< :add
120
+
121
+ def each # :yield: child
122
+ @children.each do |v|
123
+ yield v if block_given?
124
+ end
125
+ @children.dup
126
+ end
127
+
128
+ def root
129
+ node = self
130
+ node = node.parent until node.root?
131
+ node
132
+ end
133
+
134
+ def next
135
+ if root?
136
+ nil
137
+ else
138
+ brothers = parent.to_a
139
+ index = brothers.index(self)
140
+ (index + 1 < brothers.length)? brothers[index + 1] : nil
141
+ end
142
+ end
143
+
144
+ def prev
145
+ if root?
146
+ nil
147
+ else
148
+ brothers = parent.to_a
149
+ index = brothers.index(self)
150
+ (index - 1 >= 0)? brothers[index - 1] : nil
151
+ end
152
+ end
153
+
154
+ def ancestors
155
+ Enumerator.new do |y|
156
+ node = self.parent
157
+ until (node.nil? || node.root?)
158
+ y << node
159
+ node = node.parent
160
+ end
161
+ end
162
+ end
163
+
164
+ def descendants
165
+ Enumerator.new do |y|
166
+ @children.each do |child|
167
+ y << child
168
+ child.descendants.each do |descendant|
169
+ y << descendant
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
@@ -1,27 +1,27 @@
1
- # frozen_string_literal: true
2
- require 'htot_conv/parser/base.rb'
3
- require 'htot_conv/parser/simple_text.rb'
4
- require 'htot_conv/parser/dir_tree.rb'
5
- require 'htot_conv/parser/html_list.rb'
6
- require 'htot_conv/parser/opml.rb'
7
-
8
- module HTOTConv
9
- module Parser
10
- def create(type, *args)
11
- klass = HTOTConv::Parser.const_get(Rinne.camelize(type.to_s))
12
- klass.new(*args)
13
- end
14
- module_function :create
15
-
16
- def types
17
- HTOTConv::Parser.constants.reject { |klass|
18
- klass =~ /Base$/
19
- }.select { |klass|
20
- HTOTConv::Parser.const_get(klass).kind_of?(Class)
21
- }.map { |klass|
22
- Rinne.to_snake(klass.to_s).to_sym
23
- }
24
- end
25
- module_function :types
26
- end
27
- end
1
+ # frozen_string_literal: true
2
+ require 'htot_conv/parser/base.rb'
3
+ require 'htot_conv/parser/simple_text.rb'
4
+ require 'htot_conv/parser/dir_tree.rb'
5
+ require 'htot_conv/parser/html_list.rb'
6
+ require 'htot_conv/parser/opml.rb'
7
+
8
+ module HTOTConv
9
+ module Parser
10
+ def create(type, *args)
11
+ klass = HTOTConv::Parser.const_get(Rinne.camelize(type.to_s))
12
+ klass.new(*args)
13
+ end
14
+ module_function :create
15
+
16
+ def types
17
+ HTOTConv::Parser.constants.reject { |klass|
18
+ klass =~ /Base$/
19
+ }.select { |klass|
20
+ HTOTConv::Parser.const_get(klass).kind_of?(Class)
21
+ }.map { |klass|
22
+ Rinne.to_snake(klass.to_s).to_sym
23
+ }
24
+ end
25
+ module_function :types
26
+ end
27
+ end
@@ -1,15 +1,15 @@
1
- # frozen_string_literal: true
2
- module HTOTConv
3
- module Parser
4
- class Base
5
- def initialize(option={})
6
- @option = self.class.option_help.inject({}) { |h, pair| h[pair[0]] = pair[1][:default]; h}.merge(option)
7
- end
8
- attr_accessor :option
9
-
10
- def self.option_help
11
- {}
12
- end
13
- end
14
- end
15
- end
1
+ # frozen_string_literal: true
2
+ module HTOTConv
3
+ module Parser
4
+ class Base
5
+ def initialize(option={})
6
+ @option = self.class.option_help.inject({}) { |h, pair| h[pair[0]] = pair[1][:default]; h}.merge(option)
7
+ end
8
+ attr_accessor :option
9
+
10
+ def self.option_help
11
+ {}
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,54 +1,54 @@
1
- # frozen_string_literal: true
2
- require 'htot_conv/parser/base'
3
-
4
- module HTOTConv
5
- module Parser
6
- class DirTree < Base
7
- def self.option_help
8
- {
9
- :key_header => {
10
- :default => [],
11
- :pat => Array,
12
- :desc => "key header",
13
- },
14
- :glob_pattern => {
15
- :default => "**/*",
16
- :pat => String,
17
- :desc => "globbing pattern (default: \"**/*\")",
18
- },
19
- :dir_indicator => {
20
- :default => "",
21
- :pat => String,
22
- :desc => "append directory indicator",
23
- },
24
- }
25
- end
26
-
27
- def parse(input=Dir.pwd)
28
- outline = HTOTConv::Outline.new
29
- outline.key_header = @option[:key_header]
30
- outline.value_header = []
31
-
32
- outline_item = Set.new
33
- Dir.chdir(input) do
34
- Dir.glob(@option[:glob_pattern]).each do |f|
35
- f.split(File::SEPARATOR).inject(nil) do |parent_path, v|
36
- file_path = (parent_path)? File.join(parent_path, v) : v
37
- outline_item << file_path
38
- file_path
39
- end
40
- end
41
-
42
- outline_item.sort.each do |file_path|
43
- key = File.basename(file_path)
44
- key << "#{option[:dir_indicator]}" if FileTest.directory?(file_path)
45
- level = file_path.split(File::SEPARATOR).length
46
- outline.add_item(key, level, [])
47
- end
48
- end
49
-
50
- outline
51
- end
52
- end
53
- end
54
- end
1
+ # frozen_string_literal: true
2
+ require 'htot_conv/parser/base'
3
+
4
+ module HTOTConv
5
+ module Parser
6
+ class DirTree < Base
7
+ def self.option_help
8
+ {
9
+ :key_header => {
10
+ :default => [],
11
+ :pat => Array,
12
+ :desc => "key header",
13
+ },
14
+ :glob_pattern => {
15
+ :default => "**/*",
16
+ :pat => String,
17
+ :desc => "globbing pattern (default: \"**/*\")",
18
+ },
19
+ :dir_indicator => {
20
+ :default => "",
21
+ :pat => String,
22
+ :desc => "append directory indicator",
23
+ },
24
+ }
25
+ end
26
+
27
+ def parse(input=Dir.pwd)
28
+ outline = HTOTConv::Outline.new
29
+ outline.key_header = @option[:key_header]
30
+ outline.value_header = []
31
+
32
+ outline_item = Set.new
33
+ Dir.chdir(input) do
34
+ Dir.glob(@option[:glob_pattern]).each do |f|
35
+ f.split(File::SEPARATOR).inject(nil) do |parent_path, v|
36
+ file_path = (parent_path)? File.join(parent_path, v) : v
37
+ outline_item << file_path
38
+ file_path
39
+ end
40
+ end
41
+
42
+ outline_item.sort.each do |file_path|
43
+ key = File.basename(file_path)
44
+ key << "#{option[:dir_indicator]}" if FileTest.directory?(file_path)
45
+ level = file_path.split(File::SEPARATOR).length
46
+ outline.add_item(key, level, [])
47
+ end
48
+ end
49
+
50
+ outline
51
+ end
52
+ end
53
+ end
54
+ end