| @@ -10,8 +10,9 @@ class SpritesCLI < Thor · 9 unmodified lines |
| 10 | 10 | super |
| 11 | 11 | end |
| 12 | 12 | |
| 13 | | − desc 'generate [--remove-public-icons] [--verbose]', 'Generate the documentation icon spritesheets' |
| 13 | + desc 'generate [--remove-public-icons] [--disable-optimization] [--verbose]', 'Generate the documentation icon spritesheets' |
| 14 | 14 | option :remove_public_icons, type: :boolean, desc: 'Remove public/icons after generating the spritesheets' |
| 15 | + option :disable_optimization, type: :boolean, desc: 'Disable optimizing the spritesheets with OptiPNG' |
| 15 | 16 | option :verbose, type: :boolean |
| 16 | 17 | def generate |
| 17 | 18 | items = get_items |
| @@ -35,8 +36,13 @@ class SpritesCLI < Thor · 17 unmodified lines |
| 35 | 36 | |
| 36 | 37 | log_details(items_with_icons, icons_per_row) |
| 37 | 38 | |
| 38 | | − generate_spritesheet(16, items_with_icons, 'assets/images/sprites/docs.png') {|item| item[:icon_16]} |
| 39 | | − generate_spritesheet(32, items_with_icons, 'assets/images/sprites/docs@2x.png') {|item| item[:icon_32]} |
| 39 | + generate_spritesheet(16, items_with_icons) {|item| item[:icon_16]} |
| 40 | + generate_spritesheet(32, items_with_icons) {|item| item[:icon_32]} |
| 41 | + |
| 42 | + unless options[:disable_optimization] |
| 43 | + optimize_spritesheet(get_output_path(16)) |
| 44 | + optimize_spritesheet(get_output_path(32)) |
| 45 | + end |
| 40 | 46 | |
| 41 | 47 | # Add Mongoose's icon details to docs without custom icons |
| 42 | 48 | default_item = items_with_icons.find {|item| item[:type] == 'mongoose'} |
| @@ -139,8 +145,10 @@ class SpritesCLI < Thor · 96 unmodified lines |
| 139 | 145 | 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2] |
| 140 | 146 | end |
| 141 | 147 | |
| 142 | | − def generate_spritesheet(size, items_with_icons, output_path, &item_to_icon) |
| 143 | | − logger.info("Generating spritesheet #{output_path} with icons of size #{size} x #{size}") |
| 148 | + def generate_spritesheet(size, items_with_icons, &item_to_icon) |
| 149 | + output_path = get_output_path(size) |
| 150 | + |
| 151 | + logger.info("Generating spritesheet to #{output_path} with icons of size #{size} x #{size}") |
| 144 | 152 | |
| 145 | 153 | icons_per_row = Math.sqrt(items_with_icons.length).ceil |
| 146 | 154 | spritesheet = ChunkyPNG::Image.new(size * icons_per_row, size * icons_per_row) |
| @@ -163,6 +171,11 @@ class SpritesCLI < Thor · 16 unmodified lines |
| 163 | 171 | spritesheet.save(output_path) |
| 164 | 172 | end |
| 165 | 173 | |
| 174 | + def optimize_spritesheet(path) |
| 175 | + logger.info("Optimizing spritesheet at #{path}") |
| 176 | + image_optim.optimize_image!(path) |
| 177 | + end |
| 178 | + |
| 166 | 179 | def save_manifest(items, icons_per_row, path) |
| 167 | 180 | logger.info("Saving spritesheet details to #{path}") |
| 168 | 181 | |
| @@ -204,6 +217,29 @@ class SpritesCLI < Thor · 35 unmodified lines |
| 204 | 217 | logger.debug(border) |
| 205 | 218 | end |
| 206 | 219 | |
| 220 | + def get_output_path(size) |
| 221 | + "assets/images/sprites/docs#{size == 32 ? '@2x' : ''}.png" |
| 222 | + end |
| 223 | + |
| 224 | + def image_optim |
| 225 | + @image_optim ||= ImageOptim.new( |
| 226 | + :config_paths => [], |
| 227 | + :advpng => false, |
| 228 | + :gifsicle => false, |
| 229 | + :jhead => false, |
| 230 | + :jpegoptim => false, |
| 231 | + :jpegrecompress => false, |
| 232 | + :jpegtran => false, |
| 233 | + :pngcrush => false, |
| 234 | + :pngout => false, |
| 235 | + :pngquant => false, |
| 236 | + :svgo => false, |
| 237 | + :optipng => { |
| 238 | + :level => 7, |
| 239 | + }, |
| 240 | + ) |
| 241 | + end |
| 242 | + |
| 207 | 243 | def logger |
| 208 | 244 | @logger ||= Logger.new($stdout).tap do |logger| |
| 209 | 245 | logger.level = options[:verbose] ? Logger::DEBUG : Logger::INFO |