1 |
#arch2xml - Todd Mitchell - work in progress - use if you like |
2 |
#usage : python arch2xml.py <directory> <xml file name> |
3 |
#FYI - the Walk function is very useful for other python programs as well |
4 |
|
5 |
import fnmatch, os, string |
6 |
|
7 |
#Flexable Directory Walker from the Python CookBook |
8 |
|
9 |
def Walk( root, recurse=0, pattern='*', return_folders=0 ): |
10 |
|
11 |
|
12 |
# initialize |
13 |
result = [] |
14 |
|
15 |
# must have at least root folder |
16 |
try: |
17 |
names = os.listdir(root) |
18 |
except os.error: |
19 |
return result |
20 |
|
21 |
# expand pattern |
22 |
pattern = pattern or '*' |
23 |
pat_list = string.splitfields( pattern , ';' ) |
24 |
|
25 |
# check each file |
26 |
for name in names: |
27 |
fullname = os.path.normpath(os.path.join(root, name)) |
28 |
|
29 |
# grab if it matches our pattern and entry type |
30 |
for pat in pat_list: |
31 |
if fnmatch.fnmatch(name, pat): |
32 |
if os.path.isfile(fullname) or (return_folders and os.path.isdir(fullname)): |
33 |
result.append(fullname) |
34 |
continue |
35 |
|
36 |
# recursively scan other folders, appending results |
37 |
if recurse: |
38 |
if os.path.isdir(fullname) and not os.path.islink(fullname): |
39 |
result = result + Walk( fullname, recurse, pattern, return_folders ) |
40 |
|
41 |
return result |
42 |
|
43 |
def arch2xml(root,filename,xsl_file='cfarches.xsl'): |
44 |
files = Walk(root, 1, '*.arc', 1) |
45 |
print 'searching for arch files in %s' %root |
46 |
xml = open(filename,'w') |
47 |
xml.write('<?xml version="1.0"?>\n<?xml-stylesheet type="text/xsl" href="%s"?>\n<ARCHES>'%xsl_file) |
48 |
for file in files: |
49 |
arc = open(file,'r') |
50 |
contents = arc.read().split('\n') |
51 |
xml.write('<arch>\n') |
52 |
mess = 0 |
53 |
for line in contents: |
54 |
xp = line.split() |
55 |
if mess == 1 and len(xp)>1: |
56 |
str = string.join(xp[0:]) |
57 |
xml.write('%s\n' %str) |
58 |
elif len(xp) == 1: |
59 |
tag = string.lower(xp[0]) |
60 |
if tag == 'end': |
61 |
tag = ' <END />\n' |
62 |
elif tag == 'more': |
63 |
tag = ' <MORE />\n' |
64 |
elif tag =='msg': |
65 |
tag = ' <message>\n' |
66 |
mess = 1 |
67 |
elif tag =='endmsg': |
68 |
tag = ' </message>\n' |
69 |
mess = 0 |
70 |
elif tag == 'anim': |
71 |
tag = ' <anim>\n' |
72 |
elif tag =='mina': |
73 |
tag = '\n </anim>\n' |
74 |
else: |
75 |
tag = '[%s]'%(tag) |
76 |
xml.write('%s' %(tag)) |
77 |
elif len(xp)>1: |
78 |
tag = string.lower(xp[0]) |
79 |
if (tag[0] == "#"): |
80 |
str = string.join(xp)[1:] |
81 |
xml.write(' <comment>%s</comment>\n' %(str)) |
82 |
else: |
83 |
str = string.join(xp[1:]) |
84 |
xml.write(' <%s>%s</%s>\n' %(tag,str,tag)) |
85 |
xml.write('\n</arch>\n') |
86 |
arc.close() |
87 |
xml.write('\n</ARCHES>') |
88 |
xml.close() |
89 |
print "DONE" |
90 |
|
91 |
if __name__ == '__main__': |
92 |
import sys |
93 |
if len(sys.argv) < 3: |
94 |
sys.stderr.write ('Converts arc files in a directory and all sub directories to an xml file\nUsage: arch2xml.py <directory> <XML-filename>\n') |
95 |
sys.exit() |
96 |
else: |
97 |
arch2xml(sys.argv[1],sys.argv[2]) |
98 |
|