class Inkscape::Merge::Processor
Main class to initialize processing
Attributes
options[R]
Public Class Methods
new()
click to toggle source
Initialize the processor, setting files and options
# File lib/inkscape_merge/processor.rb, line 14 def initialize @options = OpenStruct.new # Default options @options.format = "pdf" @options.csv_options = {:headers => true, :col_sep => ',', :encoding => 'utf-8'} @options.limit = 0 @options.dpi = 300 @options.inkscape = %x(which inkscape).chomp # If no Inkscape in PATH, try to guess from platform if options.inkscape.empty? options.inkscape = case RUBY_PLATFORM when /darwin/ "/Applications/Inkscape.app/Contents/Resources/bin/inkscape" end end end
Public Instance Methods
run()
click to toggle source
Iterate over all data rows and generate output files Optionally stop when LIMIT is reached
# File lib/inkscape_merge/processor.rb, line 34 def run validate_options # Open the files @svg = File.read options.svg_file @data_file = DataParser.detect(options) count = 0 headers = @data_file.headers pattern = /%VAR_(#{headers.map(&:to_s).join("|")})%/ @data_file.each{|row| break if @options.limit > 0 && count >= @options.limit count += 1 puts "Row: #{count}" tmp_file = Tempfile.new('inkscape_merge') begin (outfile,merged_svg) = [@options.output,@svg].map{|s| s.gsub(pattern){|m| puts $1 if @options.verbose # return corresponding value from current row row[$1] } } # Write merged SVG out tmp_file.puts merged_svg tmp_file.close # Sprintf outfile with current row number outfile %= count # Generate output path FileUtils.mkdir_p(File.dirname outfile) # Generate the file itself ink_generate tmp_file.path, Shellwords.escape(outfile), @options.format, @options.dpi rescue => e $stderr.puts "ERROR: #{e}" $stderr.puts e.backtrace if @options.verbose ensure tmp_file.unlink end } end
Private Instance Methods
ink_generate(in_file, out_file, format='pdf', dpi="300")
click to toggle source
Run Inkscape
to generate files
# File lib/inkscape_merge/processor.rb, line 107 def ink_generate(in_file, out_file, format='pdf', dpi="300") new_in_file = case RUBY_PLATFORM when /cygwin/ Shellwords.escape(`cygpath.exe #{in_file} -w`.strip) else in_file end new_out_file = case RUBY_PLATFORM when /cygwin/ Shellwords.escape(`cygpath.exe #{out_file} -w`.strip) else out_file end cmd = %(#{Shellwords.escape(@options.inkscape)} --without-gui --export-dpi=#{dpi} --export-#{format}=#{new_out_file} #{new_in_file}) puts "INKSCAPE CMD: #{cmd}" if @options.verbose ink_error = `#{cmd} 2>&1` unless $?.success? $stderr.puts "Inkscape ERROR (#{$?}): #{ink_error}" end end
validate_options()
click to toggle source
Validate options and give error if something is missing
# File lib/inkscape_merge/processor.rb, line 82 def validate_options # TODO: replace with # If inkscape can not be found or run, bail out unless File.executable? @options.inkscape raise ArgumentError, "Inkscape not found or not executable" end unless @options.svg_file raise ArgumentError, "SVG file must be given" end unless @options.data_file raise ArgumentError, "Data-file must be given" end unless @options.output raise ArgumentError, "Output pattern must be given" else # Ensure absolute pathname @options.output = File.absolute_path(@options.output) end end