From 1d4583b30617b349be08efcda4e9c168346536ae Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Tue, 25 Jun 2019 14:32:52 -0700 Subject: [PATCH] Add svg-to-ios-pngs.rb, generate-xcode-imageset, find-unused-images, and PlistExlporer --- PlistExplorer | Bin 0 -> 25396 bytes find-unused-images | 9 ++++++++ generate-xcode-imageset | 48 ++++++++++++++++++++++++++++++++++++++++ svg-to-ios-pngs.rb | 24 ++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100755 PlistExplorer create mode 100755 find-unused-images create mode 100755 generate-xcode-imageset create mode 100755 svg-to-ios-pngs.rb diff --git a/PlistExplorer b/PlistExplorer new file mode 100755 index 0000000000000000000000000000000000000000..58491b0506236bc5ffd40933f039e8a0eac77e18 GIT binary patch literal 25396 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 YG+4jAA9^*y^@Z1bjx9U$fLO)<26VPLod5s; literal 0 HcmV?d00001 diff --git a/find-unused-images b/find-unused-images new file mode 100755 index 0000000..dc1ce31 --- /dev/null +++ b/find-unused-images @@ -0,0 +1,9 @@ +#!/bin/bash + +for i in `find . -name "*.png" -o -name "*.jpg"`; do + file=`basename -s .jpg "$i" | xargs basename -s .png | xargs basename -s @2x | xargs basename -s @3x` + result=`ack -i "$file"` + if [ -z "$result" ]; then + echo "$i" + fi +done diff --git a/generate-xcode-imageset b/generate-xcode-imageset new file mode 100755 index 0000000..60a39d0 --- /dev/null +++ b/generate-xcode-imageset @@ -0,0 +1,48 @@ +#!/usr/bin/env ruby -w + +require 'json' + +def main + while dir = ARGV.shift + unless File.directory? dir + puts "[warn] Skipping non-directory: #{dir}" + next + end + + all_images = Dir[File.join(dir, '*@[23]x.png')].map { |f| File.basename f } + image3x = File.basename Dir[File.join(dir, '*@3x.png')].first + image2x = File.basename Dir[File.join(dir, '*@2x.png')].first + image1x = (all_images - [image2x, image3x]).first + unless [2, 3].include?(all_images.size) && image2x && image3x + puts "[warn] Skipping #{dir} because 2x and 3x images are required. 1x image is optional. Max 3 images." + next + end + + images = [image1x, image2x, image3x] + scale = 0 + imageset_images = images + .map { |filename| + scale += 1 + filename && { + idiom: 'universal', + filename: filename, + scale: "#{scale}x" + } + } + .compact + imageset = { + images: imageset_images, + info: { + version: 1, + author: 'generate-xcode-imageset' + } + } + json = JSON.pretty_generate(imageset) + path = File.join(dir, 'Contents.json') + File.write(path, json) + images_written = images.compact + puts "* Wrote #{images_written.size} images to #{path}: #{images_written.join(', ')}" + end +end + +main if $0 == __FILE__ diff --git a/svg-to-ios-pngs.rb b/svg-to-ios-pngs.rb new file mode 100755 index 0000000..43ec021 --- /dev/null +++ b/svg-to-ios-pngs.rb @@ -0,0 +1,24 @@ +#!/usr/bin/env ruby -w + +svg_path = ARGV.shift +png_path = ARGV.shift + +png_test_path = "/tmp/identify.png" +File.unlink(png_test_path) if File.exist?(png_test_path) +puts `inkscape -z -e '#{png_test_path}' -d 72 '#{svg_path}'` +info = `identify '#{png_test_path}'` +File.unlink(png_test_path) if File.exist?(png_test_path) +dimensions = info.split[2] +width, height = dimensions.split('x').map(&:to_i) +if width == 0 || height == 0 + $stderr.puts "Failed to get SVG dimensions" + exit 1 +end + +name = File.basename(svg_path).sub /\.svg$/, '' + +png_2x_path = File.join(png_path, "#{name}@2x.png") +puts `inkscape -z -e '#{png_2x_path}' -w #{2 * width} -h #{2 * height} -d 72 '#{svg_path}'` + +png_3x_path = File.join(png_path, "#{name}@3x.png") +puts `inkscape -z -e '#{png_3x_path}' -w #{3 * width} -h #{3 * height} -d 27 '#{svg_path}'`