| #! /usr/bin/env python |
| |
| """usage: ttroundtrip [options] font1 ... fontN |
| |
| Dump each TT/OT font as a TTX file, compile again to TTF or OTF |
| and dump again. Then do a diff on the two TTX files. Append problems |
| and diffs to a file called "report.txt" in the current directory. |
| This is only for testing FontTools/TTX, the resulting files are |
| deleted afterwards. |
| |
| This tool supports some of ttx's command line options (-i, -t |
| and -x). Specifying -t or -x implies ttx -m <originalfile> on |
| the way back. |
| """ |
| |
| |
| import sys |
| import os |
| import tempfile |
| import getopt |
| import traceback |
| from fontTools import ttx |
| |
| class Error(Exception): pass |
| |
| |
| def usage(): |
| print __doc__ |
| sys.exit(2) |
| |
| |
| def roundTrip(ttFile1, options, report): |
| fn = os.path.basename(ttFile1) |
| xmlFile1 = tempfile.mktemp(".%s.ttx1" % fn) |
| ttFile2 = tempfile.mktemp(".%s" % fn) |
| xmlFile2 = tempfile.mktemp(".%s.ttx2" % fn) |
| |
| try: |
| ttx.ttDump(ttFile1, xmlFile1, options) |
| if options.onlyTables or options.skipTables: |
| options.mergeFile = ttFile1 |
| ttx.ttCompile(xmlFile1, ttFile2, options) |
| options.mergeFile = None |
| ttx.ttDump(ttFile2, xmlFile2, options) |
| |
| diffcmd = 'diff -U2 -I ".*modified value\|checkSumAdjustment.*" "%s" "%s"' % (xmlFile1, xmlFile2) |
| output = os.popen(diffcmd, "r", 1) |
| lines = [] |
| while 1: |
| line = output.readline() |
| if not line: |
| break |
| sys.stdout.write(line) |
| lines.append(line) |
| if lines: |
| report.write("=============================================================\n") |
| report.write(" \"%s\" differs after round tripping\n" % ttFile1) |
| report.write("-------------------------------------------------------------\n") |
| report.writelines(lines) |
| else: |
| print "(TTX files are the same)" |
| finally: |
| for tmpFile in (xmlFile1, ttFile2, xmlFile2): |
| if os.path.exists(tmpFile): |
| os.remove(tmpFile) |
| |
| |
| def main(args): |
| try: |
| rawOptions, files = getopt.getopt(args, "it:x:") |
| except getopt.GetoptError: |
| usage() |
| |
| if not files: |
| usage() |
| |
| report = open("report.txt", "a+") |
| options = ttx.Options(rawOptions, len(files)) |
| for ttFile in files: |
| try: |
| roundTrip(ttFile, options, report) |
| except KeyboardInterrupt: |
| print "(Cancelled)" |
| break |
| except: |
| print "*** round tripping aborted ***" |
| traceback.print_exc() |
| report.write("=============================================================\n") |
| report.write(" An exception occurred while round tripping") |
| report.write(" \"%s\"\n" % ttFile) |
| traceback.print_exc(file=report) |
| report.write("-------------------------------------------------------------\n") |
| report.close() |
| |
| |
| main(sys.argv[1:]) |