-
Notifications
You must be signed in to change notification settings - Fork 359
/
fzpzclean.py
190 lines (152 loc) · 7.13 KB
/
fzpzclean.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# TODO:
# check for incomplete parts (missing views)
# check if svgs are plain copies of already existing ones and link them instead?
# check for conflicting names
# lots of borrowing from http://code.activestate.com/recipes/252508-file-unzip/
import getopt, sys, os, os.path, re, zipfile
def usage():
print """
usage:
fzpzclean.py -f [fzpz directory] -d [output directory] -o [core | contrib | user] (-r)
-f directory of input fzpzs
-d directory for output of the cleanup process
-o parent folder name, depending on fzp category
-r optional: take the fzpz filename to rename the fzp filename
Unzips fzpz files into the output directory and cleans up file names and references.
"""
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "hf:d:o:r", ["help", "fzpzs", "directory", "output", "rename"])
except getopt.GetoptError, err:
# print help information and exit:
print str(err) # will print something like "option -a not recognized"
usage()
sys.exit(2)
inputdir = None
outputdir = None
outputPrefix = None
rename = False
for o, a in opts:
#print o
#print a
if o in ("-f", "--fzpzs"):
inputdir = a
elif o in ("-d", "--directory"):
outputdir = a
elif o in ("-o", "--output"):
outputPrefix = a
elif o in ("-r", "--rename"):
rename = True
elif o in ("-h", "--help"):
usage()
sys.exit(2)
else:
assert False, "unhandled option"
if(not(inputdir)):
usage()
sys.exit(2)
if(not(outputPrefix)):
usage()
sys.exit(2)
if(not(outputdir)):
usage()
sys.exit(2)
if not outputdir.endswith(':') and not os.path.exists(outputdir):
os.mkdir(outputdir)
for fn in os.listdir(inputdir):
if fn.endswith('.fzpz'):
print fn
file = os.path.join(inputdir, fn)
zf = zipfile.ZipFile(file)
# create directory structure to house files
createstructure(file, outputdir, outputPrefix)
# record svg renamings and fzp location for fixing paths later
svgrenames = []
fzplocation = None
# extract files to directory structure
for i, name in enumerate(zf.namelist()):
if not name.endswith('/'):
# identify file type
ending = name.split('.')[-1]
if ending == 'svg':
pass
elif ending == 'fzp':
pass
else:
print "WARNING wrong file type:", name
return
# sort files into subdirectories
subdir = None
if ending == 'fzp':
subdir = outputPrefix
elif name.find('icon') >= 0:
subdir = 'svg/' + outputPrefix + '/icon'
elif name.find('pcb') >= 0:
subdir = 'svg/' + outputPrefix + '/pcb'
elif name.find('schem') >= 0:
subdir = 'svg/' + outputPrefix + '/schematic'
elif name.find('bread') >= 0:
subdir = 'svg/' + outputPrefix + '/breadboard'
# remove junk from filenames
outname = name
outname = re.sub('^svg\.((icon)|(breadboard)|(schematic)|(pcb))\.', '', outname, 1)
refname = outname # this is how the svgs are referenced in the fzp
outname = re.sub('^part\.', '', outname, 1)
outname = re.sub('((__)|(_))[0-9a-fA-F]{32}', '', outname)
outname = re.sub('((__)|(_))[0-9a-fA-F]{27}', '', outname)
outname = re.sub('((__)|(_))[0-9a-fA-F]{20}', '', outname)
outname = re.sub('((__)|(_))((icon)|(breadboard)|(schematic)|(pcb))', '', outname)
# remove duplicate file endings
outname = re.sub('.' + ending, '', outname)
outname += '.' + ending
# optionally rename the fzp to that of the fzpz
if ending == 'fzp' and rename:
base = os.path.basename(zf.filename)
outname = os.path.splitext(base)[0]
outname += '.fzp'
# write new files
filelocation = os.path.join(outputdir, subdir, outname)
outfile = open(filelocation, 'wb')
outfile.write(zf.read(name))
outfile.flush()
outfile.close()
# store paths for reference update
if ending == 'svg':
svgrenames.append((refname, outname))
elif ending == 'fzp':
fzplocation = filelocation
# update svg references in fzp
fzpfile = open(fzplocation, 'r+')
s = fzpfile.read()
for svgre in svgrenames:
if s.find(svgre[0]) == -1:
print "WARNING reference could not be found:", svgre[0]
s = s.replace(svgre[0], svgre[1])
fzpfile.seek(0)
fzpfile.truncate()
fzpfile.write(s)
fzpfile.flush()
fzpfile.close()
def createstructure(file, dir, outputPrefix):
# makedirs(listdirs(file), dir)
dirs = [outputPrefix, 'svg/' + outputPrefix + '/icon', 'svg/' + outputPrefix + '/breadboard', 'svg/' + outputPrefix + '/schematic', 'svg/' + outputPrefix + '/pcb']
makedirs(dirs, dir)
def makedirs(directories, basedir):
""" Create any directories that don't currently exist """
for dir in directories:
curdir = os.path.join(basedir, dir)
if not os.path.exists(curdir):
os.makedirs(curdir)
def listdirs(file):
""" Grabs all the directories in the zip structure
This is necessary to create the structure before trying
to extract the file to it. """
zf = zipfile.ZipFile(file)
dirs = []
for name in zf.namelist():
if name.endswith('/'):
dirs.append(name)
dirs.sort()
return dirs
if __name__ == "__main__":
main()