view abctemplate.py @ 608:b4eb1753c80f

Up the resolution of the web graphics. This will result in increased image size, on the order of 18k->32k, but I'm fed up with the blurriness of the current images. Ideally I'd move to SVG for the web images, but Mick reckons that SVG support on mobile browsers is still limited. Suspect he's probably right.
author Jim Hague <jim.hague@acm.org>
date Fri, 04 Nov 2016 23:31:40 +0000
parents ed823ea54c83
children 7da70e8900ab
line wrap: on
line source

#!/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)
    fname = input_path.stem
    fdir = input_path.parent

    vars = dict()
    vars["notesvisibility"] = "no"
    vars["historyvisibility"] = "no"

    vars["name"] = fname
    vars["title"] = getFieldDisplayText(lines, fdir, "T", latex=args.latex)
    vars["subtitle"] = getFieldDisplayText(lines, fdir, "T", n=2, latex=args.latex)
    vars["composer"] = getFieldDisplayText(lines, fdir, "C", latex=args.latex)
    vars["key"] = getFieldDisplayText(lines, fdir, "K", latex=args.latex)
    vars["notes"] = getFieldDisplayText(lines, fdir, "N", starts="Dottes:", latex=args.latex)
    if vars["notes"]:
        vars["notesvisibility"] = "yes"
    vars["history"] = getFieldDisplayText(lines, fdir, "H", starts="Dottes:", latex=args.latex)
    if vars["history"]:
        vars["historyvisibility"] = "yes"

    for val in args.values:
        keyval = val.partition("=")
        vars[keyval[0]] = keyval[2]

    print(string.Template(args.template.read()).substitute(vars))