Mercurial > dottes
diff abctemplate.py @ 588:afc031477784
Replace sed substitution with Python templating for HTML and LaTeX output.
author | Jim Hague <jim.hague@acm.org> |
---|---|
date | Wed, 02 Nov 2016 00:21:18 +0000 |
parents | abcfield.py@daa3b76bd11f |
children | 60749c792cde |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/abctemplate.py Wed Nov 02 00:21:18 2016 +0000 @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +# +# Fill in a template with data from fields in an ABC file. +# Fields have any ABC accented characters converted to HTML (default) or Latex. +# +# Rearrange some field contents into display format: +# * In Title fields, change 'sort' form such as 'Exploding Potato, The' +# to display format 'The Exploding Potato'. +# * In Key fields, translate the ABC key representation to full text, +# e.g. G#dor becomes G# Dorian. +# +# Recognise continuation header fields and print those too. The ABC standard +# defines continuation fields as starting ':+'. Regrettably none of the tools +# I am using the Booke recognise that syntax, so I am adopting a Booke +# convention of '<header>:+' *also* being a continuation. Note that a +# continuation is a distinct line in the field value; the value has a line +# break between it and the previous line. +# +# Templates are read from file, and are in Python standard library format. +# The following values are substituted: +# * name. The file base name. Base filename without extension. +# * title. The tune title. +# * subtitle. The tune subtitle (second Title field), if any. +# * composer. The tune composer. +# * key. The tune key. +# * changefile. The name of the 'change' file, if any. +# * changename. The change file base name. +# * changetitle. The change file tune title. +# * changevisibility. "yes" if there's a change value, otherwise "no". +# * credit. The 'credit' value. +# * creditvisibility. "yes" if there's a credit value, otherwise "no". +# + +import argparse +import pathlib +import string + +from abcfield import getFieldDisplayText + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Substitute values from ABC file into template.') + parser.add_argument('-l', '--latex', dest='latex', + action='store_true', + help='output LaTeX formatted values (default is HTML)') + parser.add_argument('-t', '--template', dest='template', + type=argparse.FileType('r'), + required=True, + help='template file') + parser.add_argument('-v', '--value', dest='values', action="append", + default=[], help='define var=value items for templater') + parser.add_argument('input', type=argparse.FileType('r'), + help='input ABC file') + args = parser.parse_args() + + with args.input as f: + lines = f.readlines() + + input_path = pathlib.Path(args.input.name) + + vars = dict() + vars["changename"] = "" + vars["changetitle"] = "" + vars["changevisibility"] = "no" + vars["creditvisibility"] = "no" + + vars["name"] = input_path.stem + vars["title"] = getFieldDisplayText(lines, "T", latex=args.latex) + vars["subtitle"] = getFieldDisplayText(lines, "T", n=2, latex=args.latex) + vars["composer"] = getFieldDisplayText(lines, "C", latex=args.latex) + vars["key"] = getFieldDisplayText(lines, "K", latex=args.latex) + vars["changefile"] = getFieldDisplayText(lines, "N", starts="Change:", latex=args.latex) + vars["credit"] = getFieldDisplayText(lines, "N", starts="Credit:", latex=args.latex) + + if vars["changefile"]: + vars["changevisibility"] = "yes" + vars["changename"] = pathlib.Path(vars["changefile"]).stem + cf = pathlib.Path(input_path.parent, vars["changefile"]) + with cf.open() as f: + vars["changetitle"] = getFieldDisplayText(f, "T", latex=args.latex) + + if vars["credit"]: + vars["creditvisibility"] = "yes" + + for val in args.values: + keyval = val.partition("=") + vars[keyval[0]] = keyval[2] + + print(string.Template(args.template.read()).substitute(vars))