Macroscope refactoring step.

This commit is contained in:
Eric S. Raymond 2007-04-09 02:33:44 +00:00
parent 531d865801
commit b8165f2f9e

View file

@ -29,6 +29,11 @@ class reference:
def __init__(self, filename, line=None):
self.filename = filename
self.line = line
self.references = {}
def append(self, fn, n):
if fn not in self.references:
self.references[fn] = []
self.references[fn].append(n+1)
def __str__(self):
if self.line:
return self.filename + ":" + `self.line`
@ -38,6 +43,17 @@ class reference:
class CrossRef:
macro_reference = re.compile(r"\{([A-Z_][A-Z0-9_:]*[A-Za-z0-9_])\b")
file_reference = re.compile(r"[A-Za-z0-9{}][A-Za-z0-9_/+{}-]*\.(" + "|".join(resource_extensions) + ")")
def imagesearch(self, name):
# Here is where we implement the funky rules
# for image resolution. If we can't identify
# a reference to the image name under an image
# directory, look for it under an image/units
# or image/terrain directory.
for super in ("units", "terrain", "portraits", "items"):
trial = os.path.join(super, name)
if trial in self.fileref:
return trial
return None
def __init__(self, filelist):
# First, collect macro definitions from the specified filelist."
self.xref = {}
@ -61,7 +77,7 @@ class CrossRef:
if foundit > -1:
name = filename[foundit:]
name = name[len("images")+1:]
self.fileref[name] = (reference(filename), {})
self.fileref[name] = reference(filename)
elif iswml(filename):
dfp = open(filename)
for (n, line) in enumerate(dfp):
@ -72,7 +88,7 @@ class CrossRef:
if name in self.xref:
print >>sys.stderr, "*** Warning: duplicate definition of %s from %s, at %s" \
% (name, self.xref[name][0], here)
self.xref[name] = (here, {})
self.xref[name] = here
dfp.close()
# Next, decorate definitions with all references from the filelist.
self.unresolved = []
@ -96,10 +112,7 @@ class CrossRef:
if name in formals:
continue
elif name in self.xref:
namedict = self.xref[name][1]
if fn not in namedict:
namedict[fn] = []
namedict[fn].append(n+1)
self.xref[name].append(fn, n+1)
else:
self.unresolved.append((name, reference(fn,n+1)))
# Find references to resource files
@ -109,21 +122,9 @@ class CrossRef:
if name in self.fileref:
key = name
else:
# Here is where we implement the funky rules
# for image resolution. If we can't identify
# a reference to the image name under an image
# directory, look for it under an image/units
# or image/terrain directory.
for super in ("units", "terrain", "portraits", "items"):
trial = os.path.join(super, name)
if trial in self.fileref:
key = trial
break
key = self.imagesearch(name)
if key:
namedict = self.fileref[key][1]
if fn not in namedict:
namedict[fn] = []
namedict[fn].append(n+1)
self.fileref[key].append(fn, n+1)
else:
self.missing.append((name, reference(fn,n+1)))
rfp.close()