[ttc] Implement saveXML()

This commit is contained in:
Behdad Esfahbod 2018-01-25 17:50:03 -08:00
parent f82128f25d
commit c99a731adb
3 changed files with 50 additions and 20 deletions

View File

@ -18,10 +18,14 @@ class XMLWriter(object):
if fileOrPath == '-': if fileOrPath == '-':
fileOrPath = sys.stdout fileOrPath = sys.stdout
if not hasattr(fileOrPath, "write"): if not hasattr(fileOrPath, "write"):
self.filename = fileOrPath
self.file = open(fileOrPath, "wb") self.file = open(fileOrPath, "wb")
self._closeStream = True
else: else:
self.filename = None
# assume writable file object # assume writable file object
self.file = fileOrPath self.file = fileOrPath
self._closeStream = False
# Figure out if writer expects bytes or unicodes # Figure out if writer expects bytes or unicodes
try: try:
@ -47,6 +51,7 @@ class XMLWriter(object):
self.newline() self.newline()
def close(self): def close(self):
if self._closeStream:
self.file.close() self.file.close()
def write(self, string, indent=True): def write(self, string, indent=True):

View File

@ -68,6 +68,30 @@ class TTCollection(object):
final.write(file.getvalue()) final.write(file.getvalue())
file.close() file.close()
def saveXML(self, fileOrPath, newlinestr=None, writeVersion=True, **kwargs):
from fontTools.misc import xmlWriter
writer = xmlWriter.XMLWriter(fileOrPath, newlinestr=newlinestr)
if writeVersion:
from fontTools import version
version = ".".join(version.split('.')[:2])
writer.begintag("ttCollection", ttLibVersion=version)
else:
writer.begintag("ttCollection")
writer.newline()
writer.newline()
for font in self.fonts:
font._saveXML(writer, writeVersion=False, **kwargs)
writer.newline()
writer.endtag("ttCollection")
writer.newline()
writer.close()
def __getitem__(self, item): def __getitem__(self, item):
return self.fonts[item] return self.fonts[item]

View File

@ -207,9 +207,7 @@ class TTFont(object):
return writer.reordersTables() return writer.reordersTables()
def saveXML(self, fileOrPath, quiet=None, def saveXML(self, fileOrPath, newlinestr=None, **kwargs):
tables=None, skipTables=None, splitTables=False, disassembleInstructions=True,
bitmapGlyphDataFormat='raw', newlinestr=None):
"""Export the font as TTX (an XML-based text file), or as a series of text """Export the font as TTX (an XML-based text file), or as a series of text
files when splitTables is true. In the latter case, the 'fileOrPath' files when splitTables is true. In the latter case, the 'fileOrPath'
argument should be a path to a directory. argument should be a path to a directory.
@ -217,12 +215,17 @@ class TTFont(object):
list of tables to dump. The 'skipTables' argument may be a list of tables list of tables to dump. The 'skipTables' argument may be a list of tables
to skip, but only when the 'tables' argument is false. to skip, but only when the 'tables' argument is false.
""" """
from fontTools import version
from fontTools.misc import xmlWriter
# only write the MAJOR.MINOR version in the 'ttLibVersion' attribute of from fontTools.misc import xmlWriter
# TTX files' root element (without PATCH or .dev suffixes) writer = xmlWriter.XMLWriter(fileOrPath, newlinestr=newlinestr)
version = ".".join(version.split('.')[:2]) self._saveXML(writer, **kwargs)
writer.close()
def _saveXML(self, writer,
writeVersion=True,
quiet=None, tables=None, skipTables=None, splitTables=False,
disassembleInstructions=True, bitmapGlyphDataFormat='raw'):
if quiet is not None: if quiet is not None:
deprecateArgument("quiet", "configure logging instead") deprecateArgument("quiet", "configure logging instead")
@ -239,17 +242,19 @@ class TTFont(object):
tables.remove(tag) tables.remove(tag)
numTables = len(tables) numTables = len(tables)
writer = xmlWriter.XMLWriter(fileOrPath, if writeVersion:
newlinestr=newlinestr) from fontTools import version
version = ".".join(version.split('.')[:2])
writer.begintag("ttFont", sfntVersion=repr(tostr(self.sfntVersion))[1:-1], writer.begintag("ttFont", sfntVersion=repr(tostr(self.sfntVersion))[1:-1],
ttLibVersion=version) ttLibVersion=version)
else:
writer.begintag("ttFont", sfntVersion=repr(tostr(self.sfntVersion))[1:-1])
writer.newline() writer.newline()
if not splitTables: if not splitTables:
writer.newline() writer.newline()
else: else:
# 'fileOrPath' must now be a path path, ext = os.path.splitext(writer.filename)
path, ext = os.path.splitext(fileOrPath)
fileNameTemplate = path + ".%s" + ext fileNameTemplate = path + ".%s" + ext
for i in range(numTables): for i in range(numTables):
@ -257,7 +262,7 @@ class TTFont(object):
if splitTables: if splitTables:
tablePath = fileNameTemplate % tagToIdentifier(tag) tablePath = fileNameTemplate % tagToIdentifier(tag)
tableWriter = xmlWriter.XMLWriter(tablePath, tableWriter = xmlWriter.XMLWriter(tablePath,
newlinestr=newlinestr) newlinestr=writer.newlinestr)
tableWriter.begintag("ttFont", ttLibVersion=version) tableWriter.begintag("ttFont", ttLibVersion=version)
tableWriter.newline() tableWriter.newline()
tableWriter.newline() tableWriter.newline()
@ -272,10 +277,6 @@ class TTFont(object):
tableWriter.close() tableWriter.close()
writer.endtag("ttFont") writer.endtag("ttFont")
writer.newline() writer.newline()
# close if 'fileOrPath' is a path; leave it open if it's a file.
# The special string "-" means standard output so leave that open too
if not hasattr(fileOrPath, "write") and fileOrPath != "-":
writer.close()
def _tableToXML(self, writer, tag, quiet=None): def _tableToXML(self, writer, tag, quiet=None):
if quiet is not None: if quiet is not None: