Module: ICO::Utils

Extended by:
Utils
Included in:
Utils
Defined in:
lib/ico/utils.rb

Constant Summary collapse

APPEND_FILE_FORMAT =
'-%<x>dx%<y>d'

Instance Method Summary collapse

Instance Method Details

#contains_dir?(filename_array) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/ico/utils.rb', line 50

def contains_dir?(filename_array)
  filename_dir(filename_array, :select).any?
end

#contains_other_than_ext?(filename_array, extname) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/ico/utils.rb', line 54

def contains_other_than_ext?(filename_array, extname)
  filter_ext(filename_array, :reject, extname, true).any?
end

#filter_dir(filename_array, enum) ⇒ Array

Parameters:

  • filename_array (Array<String>)

    array of filenames with expanded paths

  • enum (String, Symbol)

    accepts: :select or :reject

Returns:

Raises:

  • (ArgumentError)

See Also:



13
14
15
16
17
18
19
# File 'lib/ico/utils.rb', line 13

def filter_dir(filename_array, enum)
  raise ArgumentError unless filename_array.is_a? Array
  raise ArgumentError unless enum.is_a?(String) || enum.is_a?(Symbol)
  raise ArgumentError unless enum.to_s =~ /reject|select/
  
  filename_array.send(enum).each {|fn| Dir.exist?(fn)}
end

#filter_ext(filename_array, enum, extname, include_dirs = false) ⇒ Object

Raises:

  • (ArgumentError)


21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/ico/utils.rb', line 21

def filter_ext(filename_array, enum, extname, include_dirs=false)
  raise ArgumentError unless filename_array.is_a? Array
  raise ArgumentError unless enum.is_a?(String) || enum.is_a?(Symbol)
  raise ArgumentError unless enum.to_s =~ /reject|select/
  raise ArgumentError unless extname.is_a?(String) || extname.is_a?(Symbol)

  # reject dirs for accuracy
  tmp_array = filter_dir(filename_array, :reject)

  # operation on array 
  tmp_array = tmp_array.send(enum).each {|fn| format_ext(File.extname(fn)) == format_ext(extname)}

  include_dirs ? tmp_array + filter_dir(filename_array, :select) : tmp_array
end

#format_ext(extname, overwrite = false) ⇒ Object

Raises:

  • (ArgumentError)


36
37
38
39
40
41
42
43
44
# File 'lib/ico/utils.rb', line 36

def format_ext(extname, overwrite=false)
  raise ArgumentError unless extname.is_a?(String) || extname.is_a?(Symbol)

  temp_str = extname.to_s.sub(/\A\.?/, '.').downcase

  extname = tmp_str if overwrite 

  temp_str
end

#format_ext!(extname) ⇒ Object



46
47
48
# File 'lib/ico/utils.rb', line 46

def format_ext!(extname)
  format_ext(extname, true)
end

#get_size(image_filename) ⇒ Object



59
60
61
# File 'lib/ico/utils.rb', line 59

def get_size(image_filename)
  IO.read(image_filename)[0x10..0x18].unpack('NN')
end

#png_to_sizes(input_filename, sizes_array, output_dirname = nil, append_filenames = APPEND_FILE_FORMAT, force_overwrite = false, clear = true, force_clear = false) ⇒ String

resize PNG file and write new sizes to directory

Parameters:

  • input_filename (String)

    input filename; required: file is PNG file format

  • sizes_array (Array<Array<Integer,Integer]>)

    , Array<Integer>]

    rectangles use Array with XY: ‘[x,y]` squares use single Integer N mixed indices is valid example: `[24, [24,24], [480,270], 888] # a => 24x24; a => 24x24; a => 480x270; a => 888x888`

  • output_dirname (String) (defaults to: nil)

    (optional) directory name including expanded path default: new dir named input_filename’s basename + “_sizes” in same dir as input_filename

  • append_filenames (String) (defaults to: APPEND_FILE_FORMAT)

    (optional,required-with-supplied-default) append resized filenames with Kernel#sprintf format_string available args: ‘=> N, :y => N` default: `“-%<x>dx%<y>d”`

  • force_overwrite (Boolean) (defaults to: false)

    overwrite existing resized images

  • clear (Boolean) (defaults to: true)

    default: true

  • force_clear (Boolean) (defaults to: false)

    clear output_dirname of contents before write; default: false

Returns:

  • (String)

    output_dirname; default: false

See Also:



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/ico/utils.rb', line 104

def png_to_sizes(input_filename, sizes_array, output_dirname=nil, append_filenames=APPEND_FILE_FORMAT, force_overwrite=false, clear=true, force_clear=false)
  basename = File.basename(input_filename, '.*')

  output_dirname ||= File.join(File.expand_path(File.dirname(input_filename)), "#{basename}_sizes")

  # ensure dir exists
  FileUtils.mkdir_p(output_dirname)

  # ensure dir empty
  if clear
    filename_array = Dir.glob(File.join(output_dirname, '**/*'))

    unless force_clear
      # protect from destructive action
      raise "more than ICO format files in #{output_dirname}" if contains_other_than_ext?(filename_array, :ico)
    end

    FileUtils.rm_rf(filename_array)
  end

  # import base image
  img = ChunkyPNG::Image.from_file(input_filename)

  # resize
  sizes_array.each do |x,y|
    y           ||= x
    img_attrs   = {:x => x, :y => y}
    bn          = basename + Kernel.sprintf(append_filenames, img_attrs)
    fn          = File.join(output_dirname, "#{bn}.png")
    img_out     = img.resample_nearest_neighbor(x, y)

    unless force_overwrite
      raise "File exists: #{fn}" if File.exist?(fn)
    end

    IO.write(fn, img_out)
  end

  return output_dirname
end

#sizes_hash(filename_array, sort = false, reverse = false) ⇒ Object

Raises:

  • (ArgumentError)


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/ico/utils.rb', line 63

def sizes_hash(filename_array, sort=false, reverse=false)
  raise ArgumentError unless filename_array.is_a? Array

  tmp_hash = filename_array.inject({}) {|h,fn| h[get_size(fn)] = fn; h} 

  case
  when sort && !reverse
    return tmp_hash.sort.to_h

  when reverse && !sort
    return tmp_hash.to_a.reverse.to_h

  when sort && reverse
    return tmp_hash.sort.reverse.to_h

  else
    return tmp_hash
  end
end