class Libis::Format::Converter::Chain
Public Class Methods
new(source_format, target_format, operations = {})
click to toggle source
# File lib/libis/format/converter/chain.rb, line 18 def initialize(source_format, target_format, operations = {}) @source_format = source_format.to_sym @target_format = target_format.to_sym @operations = operations || {} @converter_chain = [] end
Public Instance Methods
add_chain_node(node = {})
click to toggle source
# File lib/libis/format/converter/chain.rb, line 120 def add_chain_node(node = {}) last_converter = @converter_chain.last source_format = last_converter ? last_converter[:output] : @source_format node[:input] ||= source_format return nil unless node[:input] == source_format return nil unless node[:output] && node[:converter].output_types(source_format).include?(node[:output]) return nil unless node[:converter].input_types.include? source_format return nil if node_exists?(node) @converter_chain << node # debug "Chain: #{self}" self end
append(converter)
click to toggle source
@param [Libis::Format::Converter::Base.class] converter @return [Array]
# File lib/libis/format/converter/chain.rb, line 27 def append(converter) return [] unless converter valid_chain_nodes(converter).map do |node| self.ddup.add_chain_node(node) end.compact end
apply_operations()
click to toggle source
# File lib/libis/format/converter/chain.rb, line 133 def apply_operations temp_chain = @converter_chain.reverse.ddup applied = true operations = @operations && @operations.ddup || {} while (operation = operations.shift) method = operation.first.to_s.to_sym applied &&= :found == temp_chain.each do |node| next unless node[:converter].instance_methods.include?(method) node[:operations] ||= [] node[:operations] << {method: method, argument: operation.last} break :found end end if applied && operations.empty? @converter_chain = temp_chain.reverse @operations.clear return true end false end
closed?()
click to toggle source
# File lib/libis/format/converter/chain.rb, line 34 def closed? !@converter_chain.empty? && @converter_chain.first[:input].to_sym == @source_format && @converter_chain.last[:output].to_sym == @target_format end
convert(src_file, target_file)
click to toggle source
# File lib/libis/format/converter/chain.rb, line 63 def convert(src_file, target_file) unless valid? error 'Converter chain is not valid' return nil end temp_files = [] # noinspection RubyParenthesesAroundConditionInspection result = @converter_chain.each_with_index do |node, i| target_type = node[:output] converter_class = node[:converter] converter = converter_class.new node[:operations].each do |operation| converter.send operation[:method], operation[:argument] end if node[:operations] target = target_file if i < size - 1 target += ".temp.#{Libis::Format::Library.get_field(target_type, :extensions).first}" target += ".#{Libis::Format::Library.get_field(target_type, :extensions).first}" while File.exist? target temp_files << target end FileUtils.mkdir_p File.dirname(target) src_file = converter.convert(src_file, target, target_type) break :failed unless src_file end temp_files.each do |f| FileUtils.rm(f, force: true) end result == :failed ? nil : target_file end
size()
click to toggle source
# File lib/libis/format/converter/chain.rb, line 48 def size @converter_chain.size end
Also aliased as: length
to_array()
click to toggle source
# File lib/libis/format/converter/chain.rb, line 44 def to_array @converter_chain end
to_s()
click to toggle source
# File lib/libis/format/converter/chain.rb, line 54 def to_s "#{@source_format}->-#{@converter_chain.map do |node| "#{node[:converter].name.gsub(/^.*::/, '')}#{node[:operations].empty? ? '' : "(#{node[:operations].each do |operation| "#{operation[:method]}:#{operation[:argument]}" end.join(',')})"}->-#{node[:output]}" end.join('->-')}" end
valid?()
click to toggle source
# File lib/libis/format/converter/chain.rb, line 40 def valid? closed? && apply_operations end
valid_chain_nodes(converter)
click to toggle source
# File lib/libis/format/converter/chain.rb, line 107 def valid_chain_nodes(converter) source_format = @converter_chain.last[:output] rescue @source_format nodes = [] if converter.input_types.include? source_format converter.output_types(source_format).each do |format| node = {converter: converter, input: source_format, output: format} next if node_exists?(node) nodes << node end end nodes end
Private Instance Methods
node_exists?(node)
click to toggle source
# File lib/libis/format/converter/chain.rb, line 157 def node_exists?(node) @converter_chain.detect do |n| n[:converter] == node[:converter] && n[:input] == node[:input] && n[:output] == node[:output] end end