Home | History | Annotate | Download | only in MetaTools
      1 #! /usr/bin/env python
      2 
      3 """usage: ttroundtrip [options] font1 ... fontN
      4 
      5     Dump each TT/OT font as a TTX file, compile again to TTF or OTF
      6     and dump again. Then do a diff on the two TTX files. Append problems
      7     and diffs to a file called "report.txt" in the current directory.
      8     This is only for testing FontTools/TTX, the resulting files are
      9     deleted afterwards.
     10 
     11     This tool supports some of ttx's command line options (-i, -t
     12     and -x). Specifying -t or -x implies ttx -m <originalfile> on
     13     the way back.
     14 """
     15 
     16 
     17 import sys
     18 import os
     19 import tempfile
     20 import getopt
     21 import traceback
     22 from fontTools import ttx
     23 
     24 class Error(Exception): pass
     25 
     26 
     27 def usage():
     28 	print(__doc__)
     29 	sys.exit(2)
     30 
     31 
     32 def roundTrip(ttFile1, options, report):
     33 	fn = os.path.basename(ttFile1)
     34 	xmlFile1 = tempfile.mktemp(".%s.ttx1" % fn)
     35 	ttFile2 = tempfile.mktemp(".%s" % fn)
     36 	xmlFile2 = tempfile.mktemp(".%s.ttx2" % fn)
     37 	
     38 	try:
     39 		ttx.ttDump(ttFile1, xmlFile1, options)
     40 		if options.onlyTables or options.skipTables:
     41 			options.mergeFile = ttFile1
     42 		ttx.ttCompile(xmlFile1, ttFile2, options)
     43 		options.mergeFile = None
     44 		ttx.ttDump(ttFile2, xmlFile2, options)
     45 		
     46 		diffcmd = 'diff -U2 -I ".*modified value\|checkSumAdjustment.*" "%s" "%s"' % (xmlFile1, xmlFile2)
     47 		output = os.popen(diffcmd, "r", 1)
     48 		lines = []
     49 		while True:
     50 			line = output.readline()
     51 			if not line:
     52 				break
     53 			sys.stdout.write(line)
     54 			lines.append(line)
     55 		if lines:
     56 			report.write("=============================================================\n")
     57 			report.write("  \"%s\" differs after round tripping\n" % ttFile1)
     58 			report.write("-------------------------------------------------------------\n")
     59 			report.writelines(lines)
     60 		else:
     61 			print("(TTX files are the same)")
     62 	finally:
     63 		for tmpFile in (xmlFile1, ttFile2, xmlFile2):
     64 			if os.path.exists(tmpFile):
     65 				os.remove(tmpFile)
     66 
     67 
     68 def main(args):
     69 	try:
     70 		rawOptions, files = getopt.getopt(args, "it:x:")
     71 	except getopt.GetoptError:
     72 		usage()
     73 	
     74 	if not files:
     75 		usage()
     76 	
     77 	report = open("report.txt", "a+")
     78 	options = ttx.Options(rawOptions, len(files))
     79 	for ttFile in files:
     80 		try:
     81 			roundTrip(ttFile, options, report)
     82 		except KeyboardInterrupt:
     83 			print("(Cancelled)")
     84 			break
     85 		except:
     86 			print("*** round tripping aborted ***")
     87 			traceback.print_exc()
     88 			report.write("=============================================================\n")
     89 			report.write("  An exception occurred while round tripping")
     90 			report.write("  \"%s\"\n" % ttFile)
     91 			traceback.print_exc(file=report)
     92 			report.write("-------------------------------------------------------------\n")
     93 	report.close()
     94 
     95 	
     96 main(sys.argv[1:])
     97