libis-format 1.2.8 → 1.3.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 +4 -4
- data/Gemfile +2 -0
- data/data/types.yml +1 -1
- data/lib/libis/format/command_line.rb +2 -3
- data/lib/libis/format/config.rb +18 -19
- data/lib/libis/format/converter/base.rb +9 -16
- data/lib/libis/format/converter/chain.rb +36 -28
- data/lib/libis/format/converter/email_converter.rb +5 -8
- data/lib/libis/format/converter/fop_pdf_converter.rb +4 -6
- data/lib/libis/format/converter/image_converter.rb +51 -58
- data/lib/libis/format/converter/jp2_converter.rb +33 -35
- data/lib/libis/format/converter/office_converter.rb +19 -23
- data/lib/libis/format/converter/pdf_converter.rb +22 -28
- data/lib/libis/format/converter/repository.rb +7 -13
- data/lib/libis/format/converter/spreadsheet_converter.rb +7 -11
- data/lib/libis/format/converter/video_converter.rb +41 -55
- data/lib/libis/format/converter/xslt_converter.rb +14 -13
- data/lib/libis/format/converter.rb +1 -1
- data/lib/libis/format/identifier.rb +41 -43
- data/lib/libis/format/tool/droid.rb +29 -30
- data/lib/libis/format/tool/ff_mpeg.rb +11 -13
- data/lib/libis/format/tool/fido.rb +1 -1
- data/lib/libis/format/tool/pdf_copy.rb +17 -18
- data/lib/libis/format/tool/pdf_merge.rb +17 -17
- data/lib/libis/format/tool/pdf_optimizer.rb +18 -20
- data/lib/libis/format/tool/spreadsheet_to_ods.rb +23 -20
- data/lib/libis/format/tool.rb +2 -2
- data/lib/libis/format/type_database.rb +51 -28
- data/lib/libis/format/type_database_impl.rb +57 -24
- data/lib/libis/format/version.rb +1 -1
- data/lib/libis/format.rb +3 -2
- data/lib/libis-format.rb +2 -0
- data/libis-format.gemspec +1 -1
- metadata +17 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8282db4cf37eea292436474d401bcc2725c31eaa1eb882ea9475be14912f6c9
|
4
|
+
data.tar.gz: 6eaf1dfe05d24bd0df1ad20f61137a4007f02828b97138601c87afc5215d7454
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a242dc0d21da39ec434a7e2f59b2d8ff3c57e427512909c792bce05de5a29a03fdc726484059f13dc0b931f4ec2be13e75dc06f0e06b8736d77c541fd6aeb7e
|
7
|
+
data.tar.gz: 34a6d942f8fc39392528d03e5d367d8d476c58da12424ba5a8a87b4cf749a85ca485dba6ee1741dd5b865a25aaa57d562c1b97d96f03af83a5485f4c142dcdeb
|
data/Gemfile
CHANGED
data/data/types.yml
CHANGED
@@ -377,7 +377,7 @@ PRESENTATION:
|
|
377
377
|
|
378
378
|
OO_IMPRESS:
|
379
379
|
NAME: OpenDocument Presentation (ODP)
|
380
|
-
|
380
|
+
PUID: fmt/138 fmt/292 fmt/293
|
381
381
|
MIME: application/vnd.oasis.opendocument.presentation application/vnd.oasis.opendocument.presentation-template
|
382
382
|
EXTENSIONS: odp otp
|
383
383
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'thor'
|
2
4
|
require 'tty-prompt'
|
3
5
|
require 'tty-config'
|
@@ -7,9 +9,7 @@ require 'libis/format/cli/format'
|
|
7
9
|
|
8
10
|
module Libis
|
9
11
|
module Format
|
10
|
-
|
11
12
|
class CommandLine < Thor
|
12
|
-
|
13
13
|
def self.exit_on_failure?
|
14
14
|
true
|
15
15
|
end
|
@@ -20,6 +20,5 @@ module Libis
|
|
20
20
|
desc 'format', 'perform format identification on a given file or directory'
|
21
21
|
subcommand 'format', Cli::Format
|
22
22
|
end
|
23
|
-
|
24
23
|
end
|
25
24
|
end
|
data/lib/libis/format/config.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'os'
|
3
4
|
require 'libis-tools'
|
4
5
|
|
5
6
|
module Libis
|
6
7
|
module Format
|
7
|
-
|
8
8
|
Config = ::Libis::Tools::Config
|
9
9
|
|
10
10
|
Config[:converter_chain_max_level] = 8
|
@@ -15,10 +15,10 @@ module Libis
|
|
15
15
|
Config[:ghostscript_cmd] = 'gs'
|
16
16
|
Config[:droid_cmd] = '/opt/droid/droid.sh'
|
17
17
|
Config[:droid_temp_path] = '/tmp'
|
18
|
-
Config[:fido_cmd] = '
|
18
|
+
Config[:fido_cmd] = 'fido'
|
19
19
|
Config[:fop_jar] = File.join(Libis::Format::TOOL_DIR, 'fop', 'build', 'fop.jar')
|
20
20
|
Config[:ffmpeg_cmd] = 'ffmpeg'
|
21
|
-
Config[:fido_formats] = [
|
21
|
+
Config[:fido_formats] = [File.join(Libis::Format::DATA_DIR, 'lias_formats.xml')]
|
22
22
|
Config[:pdf_tool] = File.join(Libis::Format::TOOL_DIR, 'PdfTool.jar')
|
23
23
|
Config[:preflight_jar] = File.join(Libis::Format::TOOL_DIR, 'pdfbox', 'preflight-app-2.0.13.jar')
|
24
24
|
Config[:wkhtmltopdf] = 'wkhtmltopdf'
|
@@ -27,21 +27,20 @@ module Libis
|
|
27
27
|
Config[:raw_audio_convert_cmd] = 'sox -V1 %s -e signed -b 16 -t wav %s rate %d channels %d'
|
28
28
|
Config[:watermark_font] = '/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf'
|
29
29
|
Config[:timeouts] = {
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
30
|
+
droid: 20 * 60,
|
31
|
+
ffmpeg: 5 * 60,
|
32
|
+
fido: 20 * 60,
|
33
|
+
file_tool: 5 * 60,
|
34
|
+
fop: 5 * 60,
|
35
|
+
identification_tool: 5 * 60,
|
36
|
+
office_to_pdf: 5 * 60,
|
37
|
+
email2pdf: 5 * 60,
|
38
|
+
pdf_copy: 5 * 60,
|
39
|
+
pdf_merge: 5 * 60,
|
40
|
+
pdf_optimizer: 5 * 60,
|
41
|
+
pdf_split: 5 * 60,
|
42
|
+
pdf_to_pdfa: 5 * 60,
|
43
|
+
pdfa_validator: 5 * 60
|
44
44
|
}
|
45
|
-
|
46
45
|
end
|
47
46
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
### require 'tools/string'
|
4
4
|
require 'tmpdir'
|
@@ -11,7 +11,6 @@ require_relative 'repository'
|
|
11
11
|
module Libis
|
12
12
|
module Format
|
13
13
|
module Converter
|
14
|
-
|
15
14
|
class Base
|
16
15
|
include Libis::Tools::Logger
|
17
16
|
|
@@ -22,7 +21,7 @@ module Libis
|
|
22
21
|
@flags = {}
|
23
22
|
end
|
24
23
|
|
25
|
-
def convert(source,
|
24
|
+
def convert(source, _target, _format, opts = {})
|
26
25
|
unless File.exist? source
|
27
26
|
error "Cannot find file '#{source}'."
|
28
27
|
return nil
|
@@ -32,35 +31,33 @@ module Libis
|
|
32
31
|
end
|
33
32
|
|
34
33
|
def self.input_types
|
35
|
-
raise
|
34
|
+
raise 'Method #input_types needs to be overridden in converter'
|
36
35
|
end
|
37
36
|
|
38
37
|
def self.output_types(_format = nil)
|
39
|
-
raise
|
38
|
+
raise 'Method #output_types needs to be overridden in converter'
|
40
39
|
end
|
41
40
|
|
42
41
|
def using_temp(target, &block)
|
43
42
|
self.class.using_temp(target, &block)
|
44
43
|
end
|
45
44
|
|
46
|
-
def
|
45
|
+
def self.using_temp(target)
|
47
46
|
tempfile = Tools::TempFile.name("convert-#{File.basename(target, '.*').gsub(/\s/, '_')}", File.extname(target))
|
48
47
|
result = yield tempfile
|
49
48
|
return nil unless result
|
49
|
+
|
50
50
|
FileUtils.move result, target
|
51
51
|
target
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
55
|
-
|
54
|
+
def self.inherited(klass) # rubocop:disable Lint/MissingSuper
|
56
55
|
Repository.register klass
|
57
56
|
|
58
57
|
class << self
|
59
|
-
|
60
58
|
def conversions
|
61
|
-
input_types.
|
59
|
+
input_types.each_with_object({}) do |input_type, hash|
|
62
60
|
hash[input_type] = output_types
|
63
|
-
hash
|
64
61
|
end
|
65
62
|
end
|
66
63
|
|
@@ -83,7 +80,7 @@ module Libis
|
|
83
80
|
end
|
84
81
|
|
85
82
|
def conversion?(input_type, output_type)
|
86
|
-
conversions[input_type]
|
83
|
+
conversions[input_type]&.any? { |t| t == output_type }
|
87
84
|
end
|
88
85
|
|
89
86
|
def output_for(input_type)
|
@@ -93,13 +90,9 @@ module Libis
|
|
93
90
|
def extension?(extension)
|
94
91
|
!TypeDatabase.ext_types(extension).first.nil?
|
95
92
|
end
|
96
|
-
|
97
93
|
end
|
98
|
-
|
99
94
|
end
|
100
|
-
|
101
95
|
end
|
102
|
-
|
103
96
|
end
|
104
97
|
end
|
105
98
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'deep_dive'
|
@@ -10,7 +10,6 @@ require 'libis/format/type_database'
|
|
10
10
|
module Libis
|
11
11
|
module Format
|
12
12
|
module Converter
|
13
|
-
|
14
13
|
class Chain
|
15
14
|
include ::Libis::Tools::Logger
|
16
15
|
include DeepDive
|
@@ -26,15 +25,16 @@ module Libis
|
|
26
25
|
# @return [Array[Hash]]
|
27
26
|
def append(converter)
|
28
27
|
return [] unless converter
|
28
|
+
|
29
29
|
valid_chain_nodes(converter).map do |node|
|
30
|
-
|
30
|
+
ddup.add_chain_node(node)
|
31
31
|
end.compact
|
32
32
|
end
|
33
33
|
|
34
34
|
def closed?
|
35
35
|
!@converter_chain.empty? &&
|
36
|
-
|
37
|
-
|
36
|
+
@converter_chain.first[:input].to_sym == @source_format &&
|
37
|
+
@converter_chain.last[:output].to_sym == @target_format
|
38
38
|
end
|
39
39
|
|
40
40
|
def valid?
|
@@ -49,19 +49,14 @@ module Libis
|
|
49
49
|
@converter_chain.size
|
50
50
|
end
|
51
51
|
|
52
|
-
|
52
|
+
alias length size
|
53
53
|
|
54
54
|
def to_s
|
55
|
-
|
56
|
-
|
57
|
-
"(#{node[:operations].each do |operation|
|
58
|
-
"#{operation[:method]}:#{operation[:argument]}"
|
59
|
-
end.join(',')})"}->-#{node[:output]}"
|
60
|
-
end.join('->-')}"
|
55
|
+
result = @source_format.to_s
|
56
|
+
result << @converter_chain.map { |node| node_to_s(node) }.join('->-')
|
61
57
|
end
|
62
58
|
|
63
59
|
def convert(src_file, target_file)
|
64
|
-
|
65
60
|
unless valid?
|
66
61
|
error 'Converter chain is not valid'
|
67
62
|
return nil
|
@@ -74,15 +69,13 @@ module Libis
|
|
74
69
|
|
75
70
|
# noinspection RubyParenthesesAroundConditionInspection
|
76
71
|
conversion_success = @converter_chain.each_with_index do |node, i|
|
77
|
-
|
78
72
|
target_type = node[:output]
|
79
73
|
converter_class = node[:converter]
|
80
74
|
converter = converter_class.new
|
81
75
|
|
82
|
-
|
83
|
-
node[:operations].each do |operation|
|
76
|
+
node[:operations]&.each do |operation|
|
84
77
|
converter.send operation[:method], operation[:argument]
|
85
|
-
end
|
78
|
+
end
|
86
79
|
|
87
80
|
target = target_file
|
88
81
|
|
@@ -103,7 +96,6 @@ module Libis
|
|
103
96
|
result[:commands] << r.merge(converter: converter_class.name)
|
104
97
|
|
105
98
|
:success
|
106
|
-
|
107
99
|
end
|
108
100
|
|
109
101
|
result[:files] = [src_file] + xtra_files
|
@@ -113,16 +105,20 @@ module Libis
|
|
113
105
|
end
|
114
106
|
|
115
107
|
conversion_success == :failed ? nil : result
|
116
|
-
|
117
108
|
end
|
118
109
|
|
119
110
|
def valid_chain_nodes(converter)
|
120
|
-
source_format =
|
111
|
+
source_format = begin
|
112
|
+
@converter_chain.last[:output]
|
113
|
+
rescue StandardError
|
114
|
+
@source_format
|
115
|
+
end
|
121
116
|
nodes = []
|
122
117
|
if converter.input_types.include? source_format
|
123
118
|
converter.output_types(source_format).each do |format|
|
124
|
-
node = {
|
119
|
+
node = { converter:, input: source_format, output: format }
|
125
120
|
next if node_exists?(node)
|
121
|
+
|
126
122
|
nodes << node
|
127
123
|
end
|
128
124
|
end
|
@@ -137,6 +133,7 @@ module Libis
|
|
137
133
|
return nil unless node[:output] && node[:converter].output_types(source_format).include?(node[:output])
|
138
134
|
return nil unless node[:converter].input_types.include? source_format
|
139
135
|
return nil if node_exists?(node)
|
136
|
+
|
140
137
|
@converter_chain << node
|
141
138
|
# debug "Chain: #{self}"
|
142
139
|
self
|
@@ -145,15 +142,16 @@ module Libis
|
|
145
142
|
def apply_operations
|
146
143
|
temp_chain = @converter_chain.reverse.ddup
|
147
144
|
applied = true
|
148
|
-
operations = @operations
|
145
|
+
operations = @operations&.ddup || {}
|
149
146
|
while (operation = operations.shift)
|
150
147
|
method = operation.first.to_s.to_sym
|
151
|
-
applied &&=
|
148
|
+
applied &&= temp_chain.each do |node|
|
152
149
|
next unless node[:converter].instance_methods.include?(method)
|
150
|
+
|
153
151
|
node[:operations] ||= []
|
154
|
-
node[:operations] << {
|
152
|
+
node[:operations] << { method:, argument: operation.last }
|
155
153
|
break :found
|
156
|
-
end
|
154
|
+
end == :found
|
157
155
|
end
|
158
156
|
if applied && operations.empty?
|
159
157
|
@converter_chain = temp_chain.reverse
|
@@ -163,17 +161,27 @@ module Libis
|
|
163
161
|
false
|
164
162
|
end
|
165
163
|
|
166
|
-
|
167
164
|
private
|
168
165
|
|
166
|
+
def node_to_s(node)
|
167
|
+
result = node[:converter].name.gsub(/^.*::/, '').to_s
|
168
|
+
unless node[:operations].empty?
|
169
|
+
result << '('
|
170
|
+
result << node[:operations].map do |operation|
|
171
|
+
"#{operation[:method]}:#{operation[:argument]}"
|
172
|
+
end.join(',')
|
173
|
+
result << ')'
|
174
|
+
end
|
175
|
+
result << '->-'
|
176
|
+
result << node[:output].to_s
|
177
|
+
end
|
178
|
+
|
169
179
|
def node_exists?(node)
|
170
180
|
@converter_chain.detect do |n|
|
171
181
|
n[:converter] == node[:converter] && n[:input] == node[:input] && n[:output] == node[:output]
|
172
182
|
end
|
173
183
|
end
|
174
|
-
|
175
184
|
end
|
176
|
-
|
177
185
|
end
|
178
186
|
end
|
179
187
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'base'
|
4
4
|
|
@@ -9,20 +9,19 @@ require 'rexml/document'
|
|
9
9
|
module Libis
|
10
10
|
module Format
|
11
11
|
module Converter
|
12
|
-
|
13
12
|
class EmailConverter < Libis::Format::Converter::Base
|
14
|
-
|
15
13
|
def self.input_types
|
16
|
-
[
|
14
|
+
[:MSG]
|
17
15
|
end
|
18
16
|
|
19
17
|
def self.output_types(format = nil)
|
20
18
|
return [] unless input_types.include?(format)
|
21
|
-
|
19
|
+
|
20
|
+
[:PDF]
|
22
21
|
end
|
23
22
|
|
24
23
|
def email_convert(_)
|
25
|
-
#force usage of this converter
|
24
|
+
# force usage of this converter
|
26
25
|
end
|
27
26
|
|
28
27
|
def convert(source, target, format, opts = {})
|
@@ -30,9 +29,7 @@ module Libis
|
|
30
29
|
|
31
30
|
Format::Tool::MsgToPdf.run(source, target)
|
32
31
|
end
|
33
|
-
|
34
32
|
end
|
35
|
-
|
36
33
|
end
|
37
34
|
end
|
38
35
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'nokogiri'
|
2
4
|
|
3
5
|
require_relative 'base'
|
@@ -7,15 +9,14 @@ require 'libis/format/tool/fop_pdf'
|
|
7
9
|
module Libis
|
8
10
|
module Format
|
9
11
|
module Converter
|
10
|
-
|
11
12
|
class FopPdfConverter < Libis::Format::Converter::Base
|
12
|
-
|
13
13
|
def self.input_types
|
14
14
|
[:XML]
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.output_types(format = nil)
|
18
|
-
return []
|
18
|
+
return [] if format && !input_types.include?(format)
|
19
|
+
|
19
20
|
[:PDF]
|
20
21
|
end
|
21
22
|
|
@@ -30,11 +31,8 @@ module Libis
|
|
30
31
|
FileUtils.mkpath(File.dirname(target))
|
31
32
|
|
32
33
|
Libis::Format::Tool::FopPdf.run(source, target)
|
33
|
-
|
34
34
|
end
|
35
|
-
|
36
35
|
end
|
37
|
-
|
38
36
|
end
|
39
37
|
end
|
40
38
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'base'
|
4
4
|
require 'libis/format/identifier'
|
@@ -13,26 +13,26 @@ MiniMagick.configure do |config|
|
|
13
13
|
config.validate_on_create = false
|
14
14
|
config.validate_on_write = false
|
15
15
|
config.whiny = false
|
16
|
+
config.tmpdir = Libis::Format::Config[:tempdir] || Dir.tmpdir
|
16
17
|
end
|
17
18
|
|
18
19
|
module Libis
|
19
20
|
module Format
|
20
21
|
module Converter
|
21
|
-
|
22
22
|
# noinspection RubyTooManyInstanceVariablesInspection
|
23
23
|
class ImageConverter < Libis::Format::Converter::Base
|
24
|
-
|
25
24
|
def self.input_types
|
26
|
-
[
|
25
|
+
%i[TIFF JPG PNG BMP GIF PDF JP2]
|
27
26
|
end
|
28
27
|
|
29
28
|
def self.output_types(format = nil)
|
30
29
|
return [] unless input_types.include?(format)
|
31
|
-
|
30
|
+
|
31
|
+
%i[TIFF JPG PNG BMP GIF PDF JP2]
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.multipage?(format)
|
35
|
-
[
|
35
|
+
%i[PDF TIFF GIF PBM PGM PPM].include?(format)
|
36
36
|
end
|
37
37
|
|
38
38
|
def initialize
|
@@ -41,15 +41,15 @@ module Libis
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def image_convert(_)
|
44
|
-
#force usage of this converter
|
44
|
+
# force usage of this converter
|
45
45
|
end
|
46
46
|
|
47
|
-
def quiet(
|
48
|
-
@quiet = !!
|
47
|
+
def quiet(value)
|
48
|
+
@quiet = !!value
|
49
49
|
end
|
50
50
|
|
51
|
-
def page(
|
52
|
-
@page =
|
51
|
+
def page(number)
|
52
|
+
@page = number
|
53
53
|
end
|
54
54
|
|
55
55
|
def scale(percent)
|
@@ -122,33 +122,33 @@ module Libis
|
|
122
122
|
@wm_gap = ((options[:gap] || 0.2).to_f * 100).to_i
|
123
123
|
rotation = 360 - (options[:rotation] || 30).to_i
|
124
124
|
@wm_image = MiniMagick::Image.new(options[:file]) if options[:file]
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
# noinspection RubyResolve
|
147
|
-
unless @wm_image.valid?
|
148
|
-
error "Problem creating watermark image '#{image}'."
|
149
|
-
@wm_image = nil
|
150
|
-
end
|
125
|
+
return if @wm_image&.valid?
|
126
|
+
|
127
|
+
image = options[:file] || (Dir::Tmpname.create(%w[wm_image .png]) { |_| })
|
128
|
+
# noinspection RubyResolve
|
129
|
+
MiniMagick::Tool::Convert.new do |convert|
|
130
|
+
# noinspection RubyLiteralArrayInspection
|
131
|
+
convert.quiet
|
132
|
+
convert.background 'transparent'
|
133
|
+
convert.size('2000x2000')
|
134
|
+
convert.gravity 'Center'
|
135
|
+
convert.font('Helvetica').fill('black').pointsize(72) # .stroke('black').strokewidth(1)
|
136
|
+
convert << "label:#{text}"
|
137
|
+
convert.rotate rotation
|
138
|
+
convert.trim.repage.+ # rubocop:disable Lint/Void
|
139
|
+
convert << image
|
140
|
+
end
|
141
|
+
if options[:file]
|
142
|
+
@wm_image = MiniMagick::Image.new(image)
|
143
|
+
else
|
144
|
+
@wm_image = MiniMagick::Image.open(image)
|
145
|
+
File.delete(image)
|
151
146
|
end
|
147
|
+
# noinspection RubyResolve
|
148
|
+
return if @wm_image.valid?
|
149
|
+
|
150
|
+
error "Problem creating watermark image '#{image}'."
|
151
|
+
@wm_image = nil
|
152
152
|
end
|
153
153
|
|
154
154
|
def convert(source, target, format, opts = {})
|
@@ -161,34 +161,33 @@ module Libis
|
|
161
161
|
assemble_and_convert(source, target, format)
|
162
162
|
|
163
163
|
elsif File.directory?(source)
|
164
|
-
source_list = Dir[File.join(source, '**', '*')].reject {|p| File.directory? p}
|
164
|
+
source_list = Dir[File.join(source, '**', '*')].reject { |p| File.directory? p }
|
165
165
|
|
166
166
|
assemble_and_convert(source_list, target, format)
|
167
167
|
|
168
168
|
else
|
169
169
|
|
170
|
-
image = MiniMagick::Image.open(source) { |b| b.quiet }
|
170
|
+
image = MiniMagick::Image.open(source) { |b| b.quiet } # rubocop:disable Style/SymbolProc
|
171
171
|
|
172
172
|
if image.pages.size > 1
|
173
173
|
if @page
|
174
174
|
convert_image(image.pages[@page].path, target, format)
|
175
175
|
else
|
176
176
|
# noinspection RubyBlockToMethodReference
|
177
|
-
assemble_and_convert(image.pages.map
|
177
|
+
assemble_and_convert(image.pages.map(&:path), target, format)
|
178
178
|
end
|
179
179
|
else
|
180
180
|
convert_image(source, target, format)
|
181
181
|
end
|
182
182
|
end
|
183
|
-
|
184
|
-
{
|
183
|
+
|
184
|
+
{
|
185
185
|
files: [target],
|
186
186
|
converter: self.class.name
|
187
187
|
}
|
188
188
|
end
|
189
189
|
|
190
190
|
def assemble_and_convert(sources, target, format)
|
191
|
-
|
192
191
|
warn 'Received multiple images as input and single page format as target.' unless self.class.multipage?(format)
|
193
192
|
converted_pages = sources.inject([]) do |list, path|
|
194
193
|
# noinspection RubyArgCount
|
@@ -198,7 +197,7 @@ module Libis
|
|
198
197
|
end
|
199
198
|
MiniMagick::Tool::Convert.new do |b|
|
200
199
|
b.append unless self.class.multipage?(format)
|
201
|
-
converted_pages.each {|page| b << page.path}
|
200
|
+
converted_pages.each { |page| b << page.path }
|
202
201
|
b << target
|
203
202
|
end
|
204
203
|
converted_pages.each do |temp_file|
|
@@ -210,17 +209,16 @@ module Libis
|
|
210
209
|
protected
|
211
210
|
|
212
211
|
def convert_image(source, target, format)
|
213
|
-
|
214
212
|
image_info = nil
|
215
|
-
image_info = MiniMagick::Image::Info.new(source) {|b| b.quiet} if @wm_image
|
213
|
+
image_info = MiniMagick::Image::Info.new(source) { |b| b.quiet } if @wm_image # rubocop:disable Style/SymbolProc
|
216
214
|
|
217
215
|
MiniMagick::Tool::Convert.new do |convert|
|
218
216
|
convert.quiet if @quiet
|
219
217
|
if @wm_image
|
220
218
|
convert << @wm_image.path
|
221
|
-
convert.bordercolor('transparent').border("#{@wm_gap}%") if @wm_gap
|
219
|
+
convert.bordercolor('transparent').border("#{@wm_gap}%") if @wm_gap.positive?
|
222
220
|
convert.filter('Lagrange')
|
223
|
-
convert.resize("#{image_info['width'] / @wm_tiles}x#{image_info['height'] / @wm_tiles}") if @wm_tiles
|
221
|
+
convert.resize("#{image_info['width'] / @wm_tiles}x#{image_info['height'] / @wm_tiles}") if @wm_tiles.positive?
|
224
222
|
convert.resize("#{@wm_resize}%") if @wm_resize
|
225
223
|
convert.write('mpr:watermark').delete.+
|
226
224
|
end
|
@@ -229,7 +227,7 @@ module Libis
|
|
229
227
|
convert << source
|
230
228
|
convert.flatten if @options[:flatten].nil? && format == :JPG
|
231
229
|
if @wm_image
|
232
|
-
if @wm_tiles >= 0
|
230
|
+
if (@wm_tiles >= 0) && (@wm_tiles <= 1)
|
233
231
|
convert << 'mpr:watermark'
|
234
232
|
else
|
235
233
|
convert.stack do |stack|
|
@@ -242,15 +240,13 @@ module Libis
|
|
242
240
|
convert.compose(@wm_composition).gravity(@wm_gravity).define("compose:args=#{@wm_opacity}%").composite
|
243
241
|
end
|
244
242
|
|
245
|
-
@flags.each {|f, v| v.is_a?(TrueClass) ? convert.send(f).+ : convert.send(f)}
|
246
|
-
if @delete_date
|
247
|
-
convert << '+set' << 'modify-date' << '+set' << 'create-date'
|
248
|
-
end
|
243
|
+
@flags.each { |f, v| v.is_a?(TrueClass) ? convert.send(f).+ : convert.send(f) }
|
244
|
+
convert << '+set' << 'modify-date' << '+set' << 'create-date' if @delete_date
|
249
245
|
|
250
246
|
colorspace = @options.delete(:colorspace) || 'sRGB'
|
251
247
|
unless @options.empty?
|
252
248
|
convert.colorspace('RGB')
|
253
|
-
@options.each {|o, v| convert.send(o, v)}
|
249
|
+
@options.each { |o, v| convert.send(o, v) }
|
254
250
|
end
|
255
251
|
convert.colorspace(colorspace)
|
256
252
|
convert.profile @profile if @profile
|
@@ -262,11 +258,8 @@ module Libis
|
|
262
258
|
end
|
263
259
|
|
264
260
|
target
|
265
|
-
|
266
261
|
end
|
267
|
-
|
268
262
|
end
|
269
|
-
|
270
263
|
end
|
271
264
|
end
|
272
|
-
end
|
265
|
+
end
|