summaryrefslogtreecommitdiffstats
path: root/lib/silfont/scripts/psfchangegdlnames.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/silfont/scripts/psfchangegdlnames.py')
-rwxr-xr-xlib/silfont/scripts/psfchangegdlnames.py160
1 files changed, 160 insertions, 0 deletions
diff --git a/lib/silfont/scripts/psfchangegdlnames.py b/lib/silfont/scripts/psfchangegdlnames.py
new file mode 100755
index 0000000..2a10869
--- /dev/null
+++ b/lib/silfont/scripts/psfchangegdlnames.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+__doc__ = '''Change graphite names within GDL based on a csv list in format
+ old name, newname
+ Logs any names not in list
+ Also updates postscript names in postscript() statements based on psnames csv'''
+__url__ = 'http://github.com/silnrsi/pysilfont'
+__copyright__ = 'Copyright (c) 2016 SIL International (http://www.sil.org)'
+__license__ = 'Released under the MIT License (http://opensource.org/licenses/MIT)'
+__author__ = 'David Raymond'
+
+from silfont.core import execute
+import os, re
+
+argspec = [
+ ('input',{'help': 'Input file or folder'}, {'type': 'filename'}),
+ ('output',{'help': 'Output file or folder', 'nargs': '?'}, {}),
+ ('-n','--names',{'help': 'Names csv file'}, {'type': 'incsv', 'def': 'gdlmap.csv'}),
+ ('--names2',{'help': '2nd names csv file', 'nargs': '?'}, {'type': 'incsv', 'def': None}),
+ ('--psnames',{'help': 'PS names csv file'}, {'type': 'incsv', 'def': 'psnames.csv'}),
+ ('-l','--log',{'help': 'Log file'}, {'type': 'outfile', 'def': 'GDLchangeNames.log'})]
+
+def doit(args) :
+ logger = args.paramsobj.logger
+
+ exceptions = ("glyph", "gamma", "greek_circ")
+
+ # Process input which may be a single file or a directory
+ input = args.input
+ gdlfiles = []
+
+ if os.path.isdir(input) :
+ inputisdir = True
+ indir = input
+ for name in os.listdir(input) :
+ ext = os.path.splitext(name)[1]
+ if ext in ('.gdl','.gdh') :
+ gdlfiles.append(name)
+ else :
+ inputisdir = False
+ indir,inname = os.path.split(input)
+ gdlfiles = [inname]
+
+ # Process output file name - execute() will not have processed file/dir name at all
+ output = "" if args.output is None else args.output
+ outdir,outfile = os.path.split(output)
+ if outfile != "" and os.path.splitext(outfile)[1] == "" : # if no extension on outfile, assume a dir was meant
+ outdir = os.path.join(outdir,outfile)
+ outfile = None
+ if outfile == "" : outfile = None
+ if outfile and inputisdir : logger.log("Can't specify an output file when input is a directory", "S")
+ outappend = None
+ if outdir == "" :
+ if outfile is None :
+ outappend = "_out"
+ else :
+ if outfile == gdlfiles[0] : logger.log("Specify a different output file", "S")
+ outdir = indir
+ else:
+ if indir == outdir :
+ if outfile :
+ if outfile == gdlfiles[0] : logger.log("Specify a different output file", "S")
+ else:
+ logger.log("Specify a different output dir", "S")
+ if not os.path.isdir(outdir) : logger.log("Output directory does not exist", "S")
+
+ # Process names csv file
+ args.names.numfields = 2
+ names = {}
+ for line in args.names : names[line[0]] = line[1]
+
+ # Process names2 csv if present
+ names2 = args.names2
+ if names2 is not None :
+ names2.numfields = 2
+ for line in names2 :
+ n1 = line[0]
+ n2 = line[1]
+ if n1 in names and n2 != names[n1] :
+ logger.log(n1 + " in both names and names2 with different values","E")
+ else :
+ names[n1] = n2
+
+ # Process psnames csv file
+ args.psnames.numfields = 2
+ psnames = {}
+ for line in args.psnames : psnames[line[1]] = line[0]
+
+ missed = []
+ psmissed = []
+ for filen in gdlfiles:
+ dbg = True if filen == 'main.gdh' else False ##
+ file = open(os.path.join(indir,filen),"r")
+ if outappend :
+ base,ext = os.path.splitext(filen)
+ outfilen = base+outappend+ext
+ else :
+ outfilen = filen
+ outfile = open(os.path.join(outdir,outfilen),"w")
+ commentblock = False
+ cnt = 0 ##
+ for line in file:
+ cnt += 1 ##
+ #if cnt > 150 : break ##
+ line = line.rstrip()
+ # Skip comment blocks
+ if line[0:2] == "/*" :
+ outfile.write(line + "\n")
+ if line.find("*/") == -1 : commentblock = True
+ continue
+ if commentblock :
+ outfile.write(line + "\n")
+ if line.find("*/") != -1 : commentblock = False
+ continue
+ # Scan for graphite names
+ cpos = line.find("//")
+ if cpos == -1 :
+ scan = line
+ comment = ""
+ else :
+ scan = line[0:cpos]
+ comment = line[cpos:]
+ tmpline = ""
+ while re.search('[\s(\[,]g\w+?[\s)\],?:;=]'," "+scan+" ") :
+ m = re.search('[\s(\[,]g\w+?[\s)\],?:;=]'," "+scan+" ")
+ gname = m.group(0)[1:-1]
+ if gname in names :
+ gname = names[gname]
+ else :
+ if gname not in missed and gname not in exceptions :
+ logger.log(gname + " from '" + line.strip() + "' in " + filen + " missing from csv", "W")
+ missed.append(gname) # only log each missed name once
+ tmpline = tmpline + scan[lastend:m.start()] + gname
+ scan = scan[m.end()-2:]
+ tmpline = tmpline + scan + comment
+
+ # Scan for postscript statements
+ scan = tmpline[0:tmpline.find("//")] if tmpline.find("//") != -1 else tmpline
+ newline = ""
+ lastend = 0
+
+ for m in re.finditer('postscript\(.+?\)',scan) :
+ psname = m.group(0)[12:-2]
+ if psname in psnames :
+ psname = psnames[psname]
+ else :
+ if psname not in psmissed :
+ logger.log(psname + " from '" + line.strip() + "' in " + filen + " missing from ps csv", "W")
+ psmissed.append(psname) # only log each missed name once
+ newline = newline + scan[lastend:m.start()+12] + psname
+ lastend = m.end()-2
+
+ newline = newline + tmpline[lastend:]
+ outfile.write(newline + "\n")
+ file.close()
+ outfile.close()
+ if missed != [] : logger.log("Names were missed from the csv file - see log file for details","E")
+ return
+
+def cmd() : execute(None,doit,argspec)
+if __name__ == "__main__": cmd()