#!python
# -*- coding: utf-8 -*-
import sys, os, shutil, re, zipfile, random, gzip, tempfile
import subprocess
global parslist
parslist=[]
unparsed=[]
filelist=[] # список файлов которые уже скопировали
filelist2=[] # список скопированных имён файлов чтобы не повторялись
filelist_path=[]
zipfiles=[]
siflist=[]
siflist2=[]
zip_dirs=[]
lst_image_file=''
#parslist2=[]
def myabspath(path):
proc = subprocess.Popen('pwd', shell = True, stdout=subprocess.PIPE)
pwd = proc.stdout.read()
return os.path.normpath(os.path.join(pwd, path))
def _callback(matches):
id = matches.group(1)
try:
return unichr(int(id,16))
except:
return id
def decode_unicode_references(data):
return re.sub("([a-zA-Z0-9]+)(;|(?=\s))", _callback, data)
def copy_image(inputt, outputt, t):
#print "=== Copy image called! ==="
global lst_image_file
if not os.path.exists(inputt):
print 'Warning! File "', inputt, '"', 'not found';
return ''
else:
if not inputt in filelist:
input_name=os.path.basename(inputt)
output_name=outputt+'/'+input_name
count1=0
while output_name in filelist2:
count1=count1+1
output_name=input_name[:input_name.find('.')] +'-'+ '%d' % count1
output_name=output_name+input_name[input_name.find('.'):]
#print '% ', output_name
filelist.append(inputt)
filelist2.append(output_name)
while output_name.find('/')<>-1:
output_name=output_name[output_name.find('/')+1:]
#print '%%%%%% ', output_name
#print '-------',inputt
if not t: #or output_name.find('.lst')<>-1:
shutil.copy(inputt, outputt+'/'+output_name)
#print '----------'
if t and output_name.find('.lst')==-1:
#print '+++++++ ' ,t
if not os.path.exists(outputt+'/images/'):
os.mkdir(outputt+'/images/')
shutil.copy(inputt, outputt+'/images/'+output_name)
lst_image_file=output_name
if t and output_name.find('.lst')==-1:
output_name='images/'+output_name
if output_name.find('.lst')<>-1:
#file2.write(''+output_name+''+"\n")
file_lst=open(inputt)
if not os.path.exists(outputt+'/sequences/'):
os.mkdir(outputt+'/sequences/')
output_path=outputt+'/sequences/'+output_name[:output_name.find('.')]
os.mkdir(outputt+'/sequences/'+output_name[:output_name.find('.')]+'/')
output_name='sequences/'+output_name[:output_name.find('.')]+'/'+output_name
filelist_path.append(output_name)
file_lst_out=open(outputt+'/'+output_name, 'w')
lst_files=file_lst.readlines()
for ii, image_name in enumerate(lst_files):
if image_name.find('.')<>-1:
#print "!!!",inputt
image_path=inputt[:inputt.find('.lst')-len(input_name)+4]+image_name[:len(image_name)-1]
#co=a1+'/'+image_name
#copy_image(image_path, a1)
#print '+++' + image_path
file_lst_out.write(copy_image(image_path, output_path[:len(output_path)], False) + "\n")
#shutil.copy(image_path, co)
else:
file_lst_out.write(image_name)
else:
filelist_path.append(output_name)
#print '######### ',output_name
x=outputt[outputt.find(a1):]
x=x[x.find('/')+1:]
if x.find('/')==-1:
x=''
else:
x=x+'/'
#if t and output_name.find('.lst')==-1:
# print 'not_lst'
# output_name='images/'+output_name
#print '################# ', output_name
info_file.write(inputt+"\n"+x+output_name+2*"\n")
#filelist_path.append(output_name)
return output_name
else:
return filelist_path[filelist.index(inputt)]
#def lst(inputt, outputt):
def copy_font(inputt, outputt):
#print '\\\\\\\\ copy_font called ///////'
if not os.path.exists(inputt):
print 'Warning! File "', inputt, '"', 'not found';
return ''
else:
if not os.path.exists(outputt+'/fonts/'):
os.mkdir(outputt+'/fonts/')
if not inputt in filelist:
input_name=os.path.basename(inputt)
output_name=outputt+'/'+input_name
count1=0
while output_name in filelist2:
count1=count1+1
output_name=input_name[:input_name.find('.')] +'-'+ '%d' % count1
output_name=output_name+input_name[input_name.find('.'):]
while output_name.find('/')<>-1:
output_name=output_name[output_name.find('/')+1:]
#print '% ', output_name
filelist.append(inputt)
filelist2.append(output_name)
#print '-------',inputt
output_name='fonts/'+output_name
shutil.copy(inputt, outputt+'/'+output_name)
filelist_path.append(output_name)
#print '######### ',output_name
info_file.write(inputt+"\n"+output_name+2*"\n")
return output_name
else:
return filelist_path[filelist.index(inputt)]
def copy_sif(inputt, outputt):
#if inputt.find('.sifz'):
# sifz=gzip.open(inputt)
# path = inputt
# while path[len(path)-1]<>'/':
# path=path[:len(path)-2]
# sifz.read(path)
# #print '------------- ',sifzfile
# sifz.close()
# inputt=inputt[:len(inputt)-1]
#print '+-+-+-+-+-+-+-+-+-+-+-+-+-+- ', inputt in siflist, ' ',inputt
if not os.path.exists(inputt):
print 'Warning! File "',inputt,'"', 'not found';
return ''
else:
unparsed.append(inputt)
if not inputt in siflist:
print '----'
input_name=os.path.basename(inputt)
output_name=input_name
count1=0
while output_name in siflist2:
count1=count1+1
output_name=input_name[:input_name.find('.')] +'-'+ '%d' % count1
output_name=output_name+input_name[input_name.find('.'):]
siflist.append(inputt)
siflist2.append(output_name)
shutil.copy(inputt, outputt+'/'+output_name)
info_file.write(inputt+"\n"+output_name+2*"\n")
return output_name
else:
return siflist2[siflist.index(inputt)]
if len(sys.argv)==1:
print ''
print 'USAGE: synfig-packager.py FILENAME.sif'
print ''
sys.exit(1)
a=sys.argv[1]
a1=os.path.basename(a)
a1=a1[:a1.find('.sif')]
a1="/tmp/"+a1#"%d" % (random.randint(1,100))#a[:a.find('.sif')]
tempdir=tempfile.mkdtemp()
prefix=''
if len(sys.argv)==3:
a2=sys.argv[2]
else:
#prefix='/tmp/'
a1=a1[5:]
a2=a1
#if len(a2)>0:
if a2.find('.zip')<>-1:
a1=a2[:len(a2)-4]
else:
a1=a2
#if os.path.exists(a1):
# print "error: %s already exists" % (a1)
# sys.exit(1)
#else:
# os.mkdir(a1)
info_file=open(tempdir+'/'+'info', 'w')
unparsed.append(a)
filename=os.path.basename(a)
#co=a1+'/'+dirname
#shutil.copy(a, co)
#flag_filename=False
dname=a[:a.find(filename)]
#fname=dirname
#filedit(co)
#sifparse(a)
flag_font=False
os.mkdir(tempdir+'/'+a1)
tempdir=tempdir+'/'+a1
while len(unparsed)>0:
filepath=unparsed.pop()
#print "Parsing file: %s" %(filepath)
#print "Parsing file: %s" %(filepath)
parslist.append(filepath)
sifdir=filepath[:filepath.find(os.path.basename(filepath))]
if filepath.find('.sifz')<>-1:
file=gzip.open(filepath)
else:
file=open(filepath)
filename=os.path.basename(filepath)
co=tempdir+'/'+filename
shutil.copy(a, co)
flag_filename=False
#fname=a[:a.find(filename)]
fname=filename
#a1="/tmp/"+os.path.basename(a1)
#print "---",a1+'/'+fname
file2=open(tempdir+'/'+fname, 'w')
massiv=file.readlines()
for i, line in enumerate(massiv):
if line.find('')<>-1:
flag_filename=True
file2.write(line)
elif line.find('')<>-1:
flag_filename=False
flag_font=False
file2.write(line)
elif flag_filename and line.find('-1:
#print 'line=',line
str=massiv[i]
pos1=str.find('>')+1
pos2=str.find('')
#print "+++ ",str[pos1:pos2]
fnamenotsif=str[pos1:pos2]
#print " Join input:",sifdir,fn
fn=os.path.join(sifdir ,fnamenotsif)
#print "+++",sifdir,"___",fnamenotsif
fn=myabspath(fn)
if fn.find('')<>-1:
#decoder=fn[fn.find('')+3:fn.find(';')]
#print decoder
#decoder = decoder.decode('utf-8')
#code=int(decoder, 16)
#decoder=unichr(code)
#fn=fn.replace(fn[fn.find(''):fn.find(';')], decoder)
fn=decode_unicode_references(fn)
fn=fn.encode('utf-8')
if not fn in filelist:
#print fn
fnamenotsif=os.path.basename(fn)
co=tempdir+'/'+fnamenotsif
#print '+++ ', fn
#print 'aa'+co
#shutil.copy(fn, co)
#if line.find('.lst')<>-1:
# file_lst=open(fn)
# lst_files=file_lst.readlines()
# for ii, image_name in enumerate(lst_files):
# if image_name.find('.')<>-1:
# image_path=fn[:fn.find('.lst')-len(fnamenotsif)+4]+image_name[:len(image_name)-1]
# co=a1+'/'+image_name
#print '--- ',co
# shutil.copy(image_path, co)
result_filename=copy_image(fn,tempdir, True)
#print '1111************',result_filename,'<----->', filepath
print fn,'--->',result_filename
file2.write(''+result_filename+''+"\n")
elif line.find('-1:
pos_end_file=line.find('#:')
if line.find('#"')<>-1:
pos_end_file=line.find('#"')
#if line[pos_param_name:pos_use].find('canvas')<>-1:
# pos_end_file=line.find('#"/>')
fname=line[pos_use:pos_end_file]
fn=os.path.join(dname, fname)
#print fname, ' ', dname
#print fn
if not fn in parslist:
fname=os.path.basename(fname)
co=tempdir+'/'+fname
result_filename=copy_sif(fn,tempdir)
#shutil.copy(fn, co)-
if result_filename<>'':
file2.write(line[:pos_use]+result_filename+line[pos_end_file:len(line)]+"\n")
print fn,'--->',result_filename
elif line.find('-1:
flag_font=True
file2.write(line)
#print '---------------------------------------------'
elif flag_font and line.find('-1 and line.find('.ttf')<>-1:
#print 'line=',line
str=massiv[i]
pos1=str.find('>')+1
pos2=str.find('')
#print "+++ ",str[pos1:pos2]
font_name=str[pos1:pos2]
#print " Join input:",sifdir,fn
fn=os.path.join(sifdir ,font_name)
#print "+++",sifdir,"___",fnamenotsif
fn=myabspath(fn)
if fn.find('')<>-1:
fn=decode_unicode_references(fn)
fn=fn.encode('utf-8')
if not fn in filelist:
#print fn
fnamenotsif=os.path.basename(fn)
co=tempdir+'/'+fnamenotsif
result_filename=copy_font(fn,tempdir)
#print '************',result_filename
file2.write(''+result_filename+''+"\n")
#filelist.append(fn)
print fn,'--->',result_filename
else:
file2.write(line)
file2.close()
#print "End parsing file %s..." % (filename)
file.close()
info_file.close()
Zip=zipfile.ZipFile(prefix+a1+'.zip', 'w')
zip_dirs.append(tempdir)
while len(zip_dirs)>0:
zip_path=zip_dirs.pop()
#print '++++++++++++++++++++ ', zip_path
zipfiles=os.listdir(zip_path)
for zipname in zipfiles:
#print a1+'/'+zipname
if not os.path.isdir(zip_path+'/'+zipname):
in_zip_path=zip_path[zip_path.find(a1):]
print "Add to archive --- "+zip_path+'/'+zipname
Zip.write(zip_path+'/'+zipname,in_zip_path+'/'+zipname)
#os.remove(zip_path+'/'+zipname)
if os.path.isdir(zip_path+'/'+zipname):
#print '------------------'
zip_dirs.append(zip_path+'/'+zipname)
#print len(zip_dirs)
#os.remove(zip_path)
#Zip.write(a1,a1)
#for zipname in siflist2:
# print "Add to archive --- "+a1+'/'+zipname
# Zip.write(a1+'/'+zipname,zipname)
# os.remove(a1+'/'+zipname)
Zip.close()
shutil.rmtree(tempdir)
#os.removedirs(a1)