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))