subconv 0.1.0 → 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.
- checksums.yaml +5 -5
- data/.gitignore +1 -1
- data/.gitlab-ci.yml +33 -0
- data/.rubocop.yml +26 -30
- data/Gemfile +2 -0
- data/Gemfile.lock +73 -0
- data/README.md +5 -8
- data/Rakefile +3 -1
- data/bin/subconv +7 -1
- data/lib/subconv.rb +2 -0
- data/lib/subconv/caption.rb +5 -0
- data/lib/subconv/caption_filter.rb +6 -4
- data/lib/subconv/scc/reader.rb +190 -62
- data/lib/subconv/scc/transformer.rb +64 -33
- data/lib/subconv/utility.rb +4 -1
- data/lib/subconv/version.rb +3 -1
- data/lib/subconv/webvtt/writer.rb +44 -33
- data/spec/.rubocop.yml +8 -0
- data/spec/caption_filter_spec.rb +2 -0
- data/spec/scc/reader_spec.rb +140 -65
- data/spec/scc/transformer_spec.rb +168 -48
- data/spec/spec_helper.rb +8 -2
- data/spec/test_helpers.rb +18 -0
- data/spec/webvtt/writer_spec.rb +16 -14
- data/subconv.gemspec +11 -11
- metadata +38 -35
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module Subconv
|
@@ -79,15 +81,15 @@ module Subconv
|
|
79
81
|
# (which may change in the future)
|
80
82
|
# Perhaps it would be better to compare independent of the exact order of the nodes
|
81
83
|
expect(transform_test_style(style)).to eq(single_caption_with_content(
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
84
|
+
ColorNode.new(:magenta, [
|
85
|
+
UnderlineNode.new([
|
86
|
+
ItalicsNode.new([
|
87
|
+
FlashNode.new([
|
88
|
+
TextNode.new('Test')
|
89
|
+
])
|
90
|
+
])
|
91
|
+
])
|
92
|
+
])
|
91
93
|
))
|
92
94
|
end
|
93
95
|
|
@@ -106,26 +108,25 @@ module Subconv
|
|
106
108
|
grid.insert_text(0, 5, 'f', style.dup)
|
107
109
|
transformed = @transformer.transform(single_scc_caption_with_grid(grid))
|
108
110
|
expect(transformed).to eq(single_caption_with_content(
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
)
|
128
|
-
)
|
111
|
+
[
|
112
|
+
TextNode.new('a'),
|
113
|
+
ItalicsNode.new([
|
114
|
+
ColorNode.new(:blue, [
|
115
|
+
FlashNode.new([
|
116
|
+
TextNode.new('b'),
|
117
|
+
UnderlineNode.new([
|
118
|
+
TextNode.new('cde')
|
119
|
+
])
|
120
|
+
])
|
121
|
+
]),
|
122
|
+
ColorNode.new(:cyan, [
|
123
|
+
UnderlineNode.new([
|
124
|
+
TextNode.new('f')
|
125
|
+
])
|
126
|
+
])
|
127
|
+
])
|
128
|
+
]
|
129
|
+
))
|
129
130
|
end
|
130
131
|
|
131
132
|
it 'should handle this other complicated combination of styles and text' do
|
@@ -143,25 +144,144 @@ module Subconv
|
|
143
144
|
grid.insert_text(0, 6, 'jkl', style.dup)
|
144
145
|
transformed = @transformer.transform(single_scc_caption_with_grid(grid))
|
145
146
|
expect(transformed).to eq(single_caption_with_content(
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
)
|
164
|
-
|
147
|
+
[
|
148
|
+
ColorNode.new(:red, [
|
149
|
+
ItalicsNode.new([
|
150
|
+
TextNode.new('xyz'),
|
151
|
+
UnderlineNode.new([
|
152
|
+
FlashNode.new([
|
153
|
+
TextNode.new('abc')
|
154
|
+
])
|
155
|
+
])
|
156
|
+
])
|
157
|
+
]),
|
158
|
+
ColorNode.new(:yellow, [
|
159
|
+
UnderlineNode.new([
|
160
|
+
TextNode.new('jkl')
|
161
|
+
])
|
162
|
+
])
|
163
|
+
]
|
164
|
+
))
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'when combining paint-on captions' do
|
168
|
+
it 'should not eat single paint-on captions' do
|
169
|
+
expect(@transformer.combine_paint_on_captions(grids_to_captions(:paint_on, 1 => 'Test'))).to eq(grids_to_captions(:pop_on, 1 => 'Test'))
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'should correctly combine simple paint-on captions into one' do
|
173
|
+
expect(@transformer.combine_paint_on_captions(
|
174
|
+
grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 3 => 'TestTe', 4 => 'TestText')
|
175
|
+
)).to eq(
|
176
|
+
grids_to_captions(1 => 'TestText')
|
177
|
+
)
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'should produce combined paint-on captions when an empty grid is encountered' do
|
181
|
+
expect(@transformer.combine_paint_on_captions(
|
182
|
+
grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 3 => nil)
|
183
|
+
)).to eq(
|
184
|
+
grids_to_captions(1 => 'Test', 3 => nil)
|
185
|
+
)
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'should not combine paint-on captions with an empty grid' do
|
189
|
+
expect(@transformer.combine_paint_on_captions(
|
190
|
+
grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 3 => nil, 4 => 'Text')
|
191
|
+
)).to eq(
|
192
|
+
grids_to_captions(1 => 'Test', 3 => nil, 4 => 'Text')
|
193
|
+
)
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'should not start a new caption segment when a character is replaced with an extended one' do
|
197
|
+
expect(@transformer.combine_paint_on_captions([
|
198
|
+
Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Te'), mode: :paint_on),
|
199
|
+
Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Të'), mode: :paint_on, char_replacement: true),
|
200
|
+
Scc::Caption.new(timecode: Timecode.new(3, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Tëst'), mode: :paint_on)
|
201
|
+
])).to eq(
|
202
|
+
grids_to_captions(1 => 'Tëst')
|
203
|
+
)
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'should start a new caption segment when paint-on captions disappear' do
|
207
|
+
expect(@transformer.combine_paint_on_captions(
|
208
|
+
grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 3 => 'Tes', 4 => 'Te', 5 => 'Text')
|
209
|
+
)).to eq(
|
210
|
+
grids_to_captions(1 => 'Test', 3 => 'Tes', 4 => 'Text')
|
211
|
+
)
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'should insert a new caption when paint-on captions change' do
|
215
|
+
expect(@transformer.combine_paint_on_captions(
|
216
|
+
grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 5 => 'Text')
|
217
|
+
)).to eq(
|
218
|
+
grids_to_captions(1 => 'Test', 5 => 'Text')
|
219
|
+
)
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'should start a new caption segment when paint-on captions change' do
|
223
|
+
expect(@transformer.combine_paint_on_captions(
|
224
|
+
grids_to_captions(:paint_on, 1 => 'Te', 2 => 'Test', 5 => 'Text', 7 => 'TextTest')
|
225
|
+
)).to eq(
|
226
|
+
grids_to_captions(1 => 'Test', 5 => 'TextTest')
|
227
|
+
)
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'should flush single paint-on captions when switching to pop-on captions momentarily' do
|
231
|
+
expect(@transformer.combine_paint_on_captions([
|
232
|
+
Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
|
233
|
+
Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Text'), mode: :pop_on)
|
234
|
+
])).to eq(
|
235
|
+
grids_to_captions(1 => 'Test', 2 => 'Text')
|
236
|
+
)
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'should flush combined paint-on captions when switching to pop-on captions momentarily' do
|
240
|
+
expect(@transformer.combine_paint_on_captions([
|
241
|
+
Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
|
242
|
+
Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'TestText'), mode: :paint_on),
|
243
|
+
Scc::Caption.new(timecode: Timecode.new(3, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'asdf'), mode: :pop_on)
|
244
|
+
])).to eq(
|
245
|
+
grids_to_captions(1 => 'TestText', 3 => 'asdf')
|
246
|
+
)
|
247
|
+
end
|
248
|
+
|
249
|
+
it 'should flush combined paint-on captions when switching to pop-on captions after an empty paint-on caption' do
|
250
|
+
expect(@transformer.combine_paint_on_captions([
|
251
|
+
Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
|
252
|
+
Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'TestText'), mode: :paint_on),
|
253
|
+
Scc::Caption.new(timecode: Timecode.new(3, default_fps), mode: :paint_on),
|
254
|
+
Scc::Caption.new(timecode: Timecode.new(4, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'asdf'), mode: :pop_on)
|
255
|
+
])).to eq(
|
256
|
+
grids_to_captions(1 => 'TestText', 3 => nil, 4 => 'asdf')
|
257
|
+
)
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'should flush combined paint-on captions when switching to pop-on captions after an empty pop-on caption' do
|
261
|
+
expect(@transformer.combine_paint_on_captions([
|
262
|
+
Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
|
263
|
+
Scc::Caption.new(timecode: Timecode.new(2, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'TestText'), mode: :paint_on),
|
264
|
+
Scc::Caption.new(timecode: Timecode.new(3, default_fps), mode: :pop_on),
|
265
|
+
Scc::Caption.new(timecode: Timecode.new(4, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'asdf'), mode: :pop_on)
|
266
|
+
])).to eq(
|
267
|
+
grids_to_captions(1 => 'TestText', 3 => nil, 4 => 'asdf')
|
268
|
+
)
|
269
|
+
end
|
270
|
+
|
271
|
+
it 'should handle combinations of pop-on and paint-on captions' do
|
272
|
+
expect(@transformer.combine_paint_on_captions([
|
273
|
+
Scc::Caption.new(timecode: Timecode.new(1, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test1'), mode: :paint_on),
|
274
|
+
Scc::Caption.new(timecode: Timecode.new(2, default_fps), mode: :pop_on),
|
275
|
+
Scc::Caption.new(timecode: Timecode.new(3, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test2'), mode: :pop_on),
|
276
|
+
Scc::Caption.new(timecode: Timecode.new(4, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test3'), mode: :pop_on),
|
277
|
+
Scc::Caption.new(timecode: Timecode.new(5, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test4'), mode: :paint_on),
|
278
|
+
Scc::Caption.new(timecode: Timecode.new(6, default_fps), mode: :paint_on),
|
279
|
+
Scc::Caption.new(timecode: Timecode.new(7, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test'), mode: :paint_on),
|
280
|
+
Scc::Caption.new(timecode: Timecode.new(8, default_fps), grid: Scc::Grid.new.insert_text(0, 0, 'Test5'), mode: :paint_on)
|
281
|
+
])).to eq(
|
282
|
+
grids_to_captions(1 => 'Test1', 2 => nil, 3 => 'Test2', 4 => 'Test3', 5 => 'Test4', 6 => nil, 7 => 'Test5')
|
283
|
+
)
|
284
|
+
end
|
165
285
|
end
|
166
286
|
end
|
167
287
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/test_helpers.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Subconv
|
2
4
|
module TestHelpers
|
3
5
|
def default_fps
|
@@ -40,6 +42,22 @@ module Subconv
|
|
40
42
|
[Scc::Caption.new(timecode: t1, grid: grid), Scc::Caption.new(timecode: t2)]
|
41
43
|
end
|
42
44
|
|
45
|
+
# Convert a map of frame indices to grids to a caption array
|
46
|
+
# First argument is default caption type
|
47
|
+
def grids_to_captions(*args)
|
48
|
+
# Default to pop-on mode
|
49
|
+
mode = args.first.is_a?(Symbol) ? args.shift : :pop_on
|
50
|
+
grids = args.shift
|
51
|
+
|
52
|
+
grids.sort.map do |frame, grid|
|
53
|
+
if !grid.nil? && !grid.instance_of?(Scc::Grid)
|
54
|
+
# Auto-create grid from text or similar
|
55
|
+
grid = Scc::Grid.new.insert_text(0, 0, grid.to_s)
|
56
|
+
end
|
57
|
+
Scc::Caption.new(timecode: Timecode.new(frame, default_fps), grid: grid, mode: mode)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
43
61
|
def single_caption_with_content(content)
|
44
62
|
# Auto-promote the content to a TextNode if necessary
|
45
63
|
content = TextNode.new(content) if content.instance_of?(String)
|
data/spec/webvtt/writer_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
module Subconv
|
@@ -31,16 +33,16 @@ module Subconv
|
|
31
33
|
Caption.new(timespan: Utility::Timespan.new(Timecode.new(25, default_fps), Timecode.new(35, default_fps)), position: left_top, content: root_with_text('Test 3'), align: :start)
|
32
34
|
]
|
33
35
|
|
34
|
-
expected = header +
|
35
|
-
00:00:00.400 --> 00:00:00.800 align:start line:10.000% position:20.000%
|
36
|
-
Test 1
|
36
|
+
expected = header + <<~"VTT".rstrip
|
37
|
+
00:00:00.400 --> 00:00:00.800 align:start line:10.000% position:20.000%
|
38
|
+
Test 1
|
37
39
|
|
38
|
-
00:00:00.400 --> 00:00:00.800 align:start line:30.000% position:20.000%
|
39
|
-
Test 2
|
40
|
+
00:00:00.400 --> 00:00:00.800 align:start line:30.000% position:20.000%
|
41
|
+
Test 2
|
40
42
|
|
41
|
-
00:00:01.000 --> 00:00:01.400 align:start line:10.000% position:20.000%
|
42
|
-
Test 3
|
43
|
-
|
43
|
+
00:00:01.000 --> 00:00:01.400 align:start line:10.000% position:20.000%
|
44
|
+
Test 3
|
45
|
+
VTT
|
44
46
|
expect(write(captions)).to eq(expected)
|
45
47
|
end
|
46
48
|
|
@@ -51,13 +53,13 @@ END
|
|
51
53
|
Caption.new(timespan: t2_3, position: :bottom, content: root_with_text('Test 2'), align: :middle)
|
52
54
|
]
|
53
55
|
|
54
|
-
expected = header +
|
55
|
-
00:00:00.400 --> 00:00:00.800 align:start line:5%
|
56
|
-
Test 1
|
56
|
+
expected = header + <<~"VTT".rstrip
|
57
|
+
00:00:00.400 --> 00:00:00.800 align:start line:5%
|
58
|
+
Test 1
|
57
59
|
|
58
|
-
00:00:00.800 --> 00:00:01.200 line:-1,end
|
59
|
-
Test 2
|
60
|
-
|
60
|
+
00:00:00.800 --> 00:00:01.200 line:-1,end
|
61
|
+
Test 2
|
62
|
+
VTT
|
61
63
|
expect(write(captions)).to eq(expected)
|
62
64
|
end
|
63
65
|
|
data/subconv.gemspec
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'subconv/version'
|
5
6
|
|
@@ -8,7 +9,7 @@ Gem::Specification.new do |s|
|
|
8
9
|
s.version = Subconv::VERSION
|
9
10
|
|
10
11
|
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
11
|
-
s.required_ruby_version = '>= 2.
|
12
|
+
s.required_ruby_version = '>= 2.4'
|
12
13
|
s.authors = ['Philipp Kerling']
|
13
14
|
s.email = ['pkerling@casix.org']
|
14
15
|
s.homepage = 'https://github.com/pkerling/subconv'
|
@@ -19,16 +20,15 @@ Gem::Specification.new do |s|
|
|
19
20
|
s.license = 'MIT'
|
20
21
|
|
21
22
|
s.rdoc_options = ['--charset=UTF-8']
|
22
|
-
s.require_paths = ['lib']
|
23
23
|
|
24
24
|
s.rubygems_version = '1.3.7'
|
25
25
|
s.summary = 'Subtitle conversion (SCC to WebVTT)'
|
26
|
-
s.add_dependency 'solid-struct'
|
27
|
-
s.add_dependency 'timecode'
|
26
|
+
s.add_dependency 'solid-struct', '~> 0.1'
|
27
|
+
s.add_dependency 'timecode', '~> 2.2'
|
28
28
|
s.add_development_dependency 'bundler', '~> 1.7'
|
29
|
-
s.add_development_dependency '
|
30
|
-
s.add_development_dependency '
|
31
|
-
s.add_development_dependency 'rubocop'
|
32
|
-
s.add_development_dependency '
|
33
|
-
s.add_development_dependency '
|
29
|
+
s.add_development_dependency 'rake', '~> 12.3'
|
30
|
+
s.add_development_dependency 'rspec', '~> 3.8.0'
|
31
|
+
s.add_development_dependency 'rubocop', '~> 0.72'
|
32
|
+
s.add_development_dependency 'simplecov', '~> 0.17'
|
33
|
+
s.add_development_dependency 'simplecov-console', '~> 0.5'
|
34
34
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: subconv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Philipp Kerling
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solid-struct
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '0.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '0.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: timecode
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,75 +53,75 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.7'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 3
|
61
|
+
version: '12.3'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 3
|
68
|
+
version: '12.3'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 3.8.0
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 3.8.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
89
|
+
version: '0.72'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
96
|
+
version: '0.72'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: simplecov
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
103
|
+
version: '0.17'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
110
|
+
version: '0.17'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: simplecov-console
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
117
|
+
version: '0.5'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
124
|
+
version: '0.5'
|
125
125
|
description:
|
126
126
|
email:
|
127
127
|
- pkerling@casix.org
|
@@ -131,9 +131,11 @@ extensions: []
|
|
131
131
|
extra_rdoc_files: []
|
132
132
|
files:
|
133
133
|
- ".gitignore"
|
134
|
+
- ".gitlab-ci.yml"
|
134
135
|
- ".rubocop.yml"
|
135
136
|
- ".travis.yml"
|
136
137
|
- Gemfile
|
138
|
+
- Gemfile.lock
|
137
139
|
- LICENSE
|
138
140
|
- README.md
|
139
141
|
- Rakefile
|
@@ -147,6 +149,7 @@ files:
|
|
147
149
|
- lib/subconv/utility.rb
|
148
150
|
- lib/subconv/version.rb
|
149
151
|
- lib/subconv/webvtt/writer.rb
|
152
|
+
- spec/.rubocop.yml
|
150
153
|
- spec/caption_filter_spec.rb
|
151
154
|
- spec/scc/reader_spec.rb
|
152
155
|
- spec/scc/transformer_spec.rb
|
@@ -167,19 +170,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
167
170
|
requirements:
|
168
171
|
- - ">="
|
169
172
|
- !ruby/object:Gem::Version
|
170
|
-
version: '2.
|
173
|
+
version: '2.4'
|
171
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
175
|
requirements:
|
173
176
|
- - ">="
|
174
177
|
- !ruby/object:Gem::Version
|
175
178
|
version: '0'
|
176
179
|
requirements: []
|
177
|
-
|
178
|
-
rubygems_version: 2.4.8
|
180
|
+
rubygems_version: 3.0.4
|
179
181
|
signing_key:
|
180
182
|
specification_version: 4
|
181
183
|
summary: Subtitle conversion (SCC to WebVTT)
|
182
184
|
test_files:
|
185
|
+
- spec/.rubocop.yml
|
183
186
|
- spec/caption_filter_spec.rb
|
184
187
|
- spec/scc/reader_spec.rb
|
185
188
|
- spec/scc/transformer_spec.rb
|