mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
134 lines
3.0 KiB
Python
Executable File
134 lines
3.0 KiB
Python
Executable File
#!/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()
|