Sha256: 677a9d074ec7b83994566a2e48c3d2c30575ce27df70b0a030ba36068679eff0

Contents?: true

Size: 1.7 KB

Versions: 1

Compression:

Stored size: 1.7 KB

Contents

require "set"

require "open4"

require "svgo_wrapper/constants"
require "svgo_wrapper/error"
require "svgo_wrapper/parser_error"
require "svgo_wrapper/svgo_check"
require "svgo_wrapper/version"

class SvgoWrapper
  attr_reader :disabled_plugins, :enabled_plugins, :timeout

  def initialize(enable: nil, disable: nil, timeout: DEFAULT_TIMEOUT)
    self.enabled_plugins = enable
    self.disabled_plugins = disable
    self.plugin_args = generate_plugin_args(enabled: enabled_plugins, disabled: disabled_plugins)
    self.timeout = timeout
  end

  def optimize_images_data(data)
    begin
      Open4.spawn ["svgo", *plugin_args, "-i", "-", "-o", "-"],
                  stdin: data,
                  stdout: output = "",
                  stdout_timeout: timeout
    rescue Open4::SpawnError => e
      raise Error, "Unexpected error (#{e.exitstatus})\n"
    end

    verify_output(output)
    output
  end

  def timeout=(value)
    if value.is_a? Numeric
      @timeout = value
    elsif @timeout.nil?
      @timeout = DEFAULT_TIMEOUT
    end
  end

  private

  attr_accessor :plugin_args

  def disabled_plugins=(values)
    @disabled_plugins = filter_plugins(Set[*values]).freeze
  end

  def enabled_plugins=(values)
    @enabled_plugins = filter_plugins(Set[*values]).freeze
  end

  def filter_plugins(plugins)
    VALID_PLUGINS & plugins.map(&:to_sym)
  end

  def generate_plugin_args(enabled:, disabled:)
    (disabled.map {|v| "--disable=#{v}".freeze } +
     enabled.map {|v| "--enable=#{v}".freeze }).freeze
  end

  def verify_output(output)
    return if output =~ /<svg/

    output = "There was a problem optimizing the SVG image with the selected plugins\n" if output.strip.empty?
    raise ParserError, output
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
svgo_wrapper-0.0.4 lib/svgo_wrapper.rb