When reading from XML, populate all members that are computed

Not really all... Propagated counts are still not populated.
Most of mti_tests pass again.  Four failing now.

NB: In the code being removed in this commit, this line:

"setattr(self, conv.repeat, len(seq)+conv.aux)"

had the wrong sign for conv.aux.  Should have been a minus.
This commit is contained in:
Behdad Esfahbod 2016-12-31 23:16:12 -05:00
parent 6250b60ec3
commit 1eb8afbfa3
2 changed files with 30 additions and 12 deletions

View File

@ -567,12 +567,35 @@ class BaseTable(object):
def getConverterByName(self, name):
return self.convertersByName[name]
def populateDefaults(self, propagator=None):
for conv in self.getConverters():
if conv.repeat:
if not hasattr(self, conv.name):
setattr(self, conv.name, [])
countValue = len(getattr(self, conv.name)) - conv.aux
try:
count_conv = self.getConverterByName(conv.repeat)
setattr(self, conv.repeat, countValue)
except KeyError:
# conv.repeat is a propagated count
if propagator and conv.repeat in propagator:
propagator[conv.repeat].setValue(countValue)
else:
if conv.aux and not eval(conv.aux, None, self.__dict__):
continue
if hasattr(self, conv.name):
continue # Warn if it should NOT be present?!
if hasattr(conv, 'writeNullOffset'):
setattr(self, conv.name, None) # Warn?
#elif not conv.isCount:
# # Warn?
# pass
def decompile(self, reader, font):
self.readFormat(reader)
table = {}
self.__rawTable = table # for debugging
converters = self.getConverters()
for conv in converters:
for conv in self.getConverters():
if conv.name == "SubTable":
conv = conv.getConverter(reader.tableTag,
table["LookupType"])
@ -716,16 +739,7 @@ class BaseTable(object):
if seq is None:
seq = []
setattr(self, conv.name, seq)
try:
count_conv = self.getConverterByName(conv.repeat)
setattr(self, conv.repeat, -conv.aux)
except KeyError:
# TODO: Count is propagated.
# We don't have access upstream currently.
pass
seq.append(value)
if hasattr(self, conv.repeat):
setattr(self, conv.repeat, len(seq)+conv.aux)
else:
setattr(self, conv.name, value)

View File

@ -339,13 +339,17 @@ class Struct(BaseConverter):
Format = attrs.get("Format")
if Format is not None:
table.Format = int(Format)
for element in content:
if isinstance(element, tuple):
name, attrs, content = element
table.fromXML(name, attrs, content, font)
else:
pass
# TODO Fill in items that are not set by XML.
if not hasattr(table, 'postRead'):
table.populateDefaults()
return table
def __repr__(self):