From 4609947b53d1bb7906d9faca34533de8e65f8ae4 Mon Sep 17 00:00:00 2001 From: Sanel Zukan Date: Fri, 4 Sep 2009 16:00:37 +0000 Subject: [PATCH] Script for easier icon theme conversion --- data/icon-themes/icon-theme-convert | 133 ++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100755 data/icon-themes/icon-theme-convert diff --git a/data/icon-themes/icon-theme-convert b/data/icon-themes/icon-theme-convert new file mode 100755 index 0000000..50b22d6 --- /dev/null +++ b/data/icon-themes/icon-theme-convert @@ -0,0 +1,133 @@ +#!/usr/bin/env python +# Converts svg icon theme to png one using inkscape or rsvg + +import os.path +import os +import sys +import stat + +inkscape_path = None +rsvg_path = None + +SIZES = ["16x16", "22x22", "32x32", "48x48", "64x64", "128x128"] + +def find_converter(name): + env_list = os.environ["PATH"].split(":") + + for i in env_list: + path = "%s/%s" % (i, name) + if os.access(path, os.F_OK) and os.access(path, os.X_OK): + return path + return None + +def convert_ext(name): + if name[-4:] == ".svg": + return name.replace(".svg", ".png") + else: + return name + +def dir_exists(path): + # first use this since stat() scream if not exists + if not os.access(path, os.F_OK): + return False + mode = os.stat(path)[stat.ST_MODE] + return stat.S_ISDIR(mode) + +def in_subdir(path): + all = path.split("/")[1:] + return len(all) + +# transform 'foo/XX/yy' to 'dest/sz/yy' +def transform_path(path, dest, sz): + all = path.split("/") + + # this means we got 'theme/scalable' but we want 'theme/scalable/something/' + if len(all) < 3: + return None + + all[0] = dest + all[1] = sz + return "/".join(all) + +def visit(destdir, dirname, names): + cmd = None + + # os.walk will first walk on the top of source directory before + # enters it's childs; we are interested only in childs + if not in_subdir(dirname): + return + + for name in names: + for sz in SIZES: + w, h = sz.split("x") + + finaldir = transform_path(dirname, destdir, sz) + if finaldir == None: + continue + + srcicon = "%s/%s" % (dirname, name) + dsticon = "%s/%s" % (finaldir, convert_ext(name)) + + # make it once without exception + if not dir_exists(finaldir): + os.makedirs(finaldir) + + if inkscape_path: + cmd = "%s -e %s -w %s -h %s %s" % (inkscape_path, dsticon, w, h, srcicon) + elif rsvg_path: + cmd = "%s -w %s -h %s %s %s" % (rsvg_path, w, h, srcicon, dsticon) + + print "%s -> %s" % (srcicon, dsticon) + if os.system(cmd) != 0: + print "FAILED :(" + +def convert(srcdir, dstdir): + os.path.walk(srcdir, visit, dstdir) + +def help(): + print "Usage: icon-theme-convert [source] [dest]" + print "" + print "Convert [source] icon theme (assumed all files are in SVG format)" + print "to PNG equivalent one, using rsvg or inkscape. Converted content will be stored in [source]." + print "If [dest] was given, converted content will be stored there." + +def main(): + arg_len = len(sys.argv) + + if not arg_len in [2, 3]: + help() + return + + # mark them as global + global inkscape_path + global rsvg_path + + cpath = find_converter("inkscape") + if cpath: + inkscape_path = cpath + else: + cpath = find_converter("rsvg") + if cpath: + rsvg_path = cpath + else: + print "\nUnable to find either inkscape or rsvg. If you have installed" + print "one of them, append it's directory path to PATH environment.\n" + print "But if you don't have installed neither of them... well..." + print "you know what to do then :P\n" + return + + src = sys.argv[1] + + if arg_len == 3: + dst = sys.argv[2] + else: + dst = src + + if not dir_exists(src): + print "%s does not exists. Then what to convert?" % src + return + + convert(src, dst) + +if __name__ == "__main__": + main()