view abcfield.py @ 282:ced1d1ba42f6

Various revisions of printed book presentation. 1. Purple background on the front and and new blank back pages. 2. UK English for hyphenation and date presentation. 3. Dedication and 'About Havoc' section. 4. Footer just page number in centre of page. 5. Revised copyright discussion. 6. Since it's a book, make content, intro and first lines to chapters. And prompt individual tunes to sections. 7. Omit 'Tunes' chapter heading. It doesn't look good in A5.
author Jim Hague <jim.hague@acm.org>
date Fri, 05 Jul 2013 18:56:34 +0100
parents 295ba8275ab4
children eedf65564226
line wrap: on
line source

#!/usr/bin/env python
#
# Extact a text field (title, by default) from a .abc file, and print it out
# formatted for use in LaTeX or HTML.
#

import optparse
import sys

accentedletters = {
    # Acute accents
    "'A" : ("&Aacute;", "\\'{A}"),
    "'E" : ("&Eacute;", "\\'{E}"),
    "'I" : ("&Iacute;", "\\'{I}"),
    "'O" : ("&Oacute;", "\\'{O}"),
    "'U" : ("&Uacute;", "\\'{U}"),
    "'Y" : ("&Yacute;", "\\'{Y}"),
    "'a" : ("&aacute;", "\\'{a}"),
    "'e" : ("&eacute;", "\\'{e}"),
    "'i" : ("&iacute;", "\\'{i}"),
    "'o" : ("&oacute;", "\\'{o}"),
    "'u" : ("&uacute;", "\\'{u}"),
    "'y" : ("&yacute;", "\\'{y}"),

    # Grave accents
    "`A" : ("&Agrave;", "\\`{A}"),
    "`E" : ("&Egrave;", "\\`{E}"),
    "`I" : ("&Igrave;", "\\`{I}"),
    "`O" : ("&Ograve;", "\\`{O}"),
    "`U" : ("&Ugrave;", "\\`{U}"),
    "`a" : ("&agrave;", "\\`{a}"),
    "`e" : ("&egrave;", "\\`{e}"),
    "`i" : ("&igrave;", "\\`{i}"),
    "`o" : ("&ograve;", "\\`{o}"),
    "`u" : ("&ugrave;", "\\`{u}"),

    # Umlauts
    "\"A" : ("&Auml;", "\\\"{A}"),
    "\"E" : ("&Euml;", "\\\"{E}"),
    "\"I" : ("&Iuml;", "\\\"{I}"),
    "\"O" : ("&Ouml;", "\\\"{O}"),
    "\"U" : ("&Uuml;", "\\\"{U}"),
    "\"Y" : ("&Yuml;", "\\\"{Y}"),
    "\"a" : ("&auml;", "\\\"{a}"),
    "\"e" : ("&euml;", "\\\"{e}"),
    "\"i" : ("&iuml;", "\\\"{\i}"),
    "\"o" : ("&ouml;", "\\\"{o}"),
    "\"u" : ("&uuml;", "\\\"{u}"),
    "\"y" : ("&yuml;", "\\\"{y}"),

    # Circumflexes
    "^A" : ("&Acirc;", "\\^{A}"),
    "^E" : ("&Ecirc;", "\\^{E}"),
    "^I" : ("&Icirc;", "\\^{I}"),
    "^O" : ("&Ocirc;", "\\^{O}"),
    "^U" : ("&Ucirc;", "\\^{U}"),
    "^a" : ("&acirc;", "\\^{a}"),
    "^e" : ("&ecirc;", "\\^{e}"),
    "^i" : ("&icirc;", "\\^{\i}"),
    "^o" : ("&ocirc;", "\\^{o}"),
    "^u" : ("&ucirc;", "\\^{u}"),

    # Tilde
    "~A" : ("&Atilde;", "\\~{A}"),
    "~N" : ("&Ntilde;", "\\~{N}"),
    "~O" : ("&Otilde;", "\\~{O}"),
    "~a" : ("&atilde;", "\\~{a}"),
    "~n" : ("&ntilde;", "\\~{n}"),
    "~o" : ("&otilde;", "\\~{o}"),

    # Cedilla
    ",C" : ("&Ccedil;", "\\c{C}"),
    ",c" : ("&ccedil;", "\\c{c}"),

    # Slash
    "/O" : ("&Oslash;", "\\O"),
    "/o" : ("&oslash;", "\\o"),

    # Ring
    "AA" : ("&Aring;", "\\r{A}"),
    "aa" : ("&aring;", "\\r{a}"),

    # Ligatures
    "AE" : ("&AElig;", "\\AE"),
    "ae" : ("&aelig;", "\\ae"),
    "ss" : ("&szlig;", "\\ss"),
}

def convertTitle(t, options):
    res = ""
    while True:
        p = t.partition('\\')
        res += p[0]
        if p[1] == "":
            break
        abc = p[2][0:2]
        t = p[2][2:]
        if (options.html or options.latex) and abc in accentedletters:
            if options.html:
                res += accentedletters[abc][0]
            else:
                res += accentedletters[abc][1]
        else:
            res += "\\" + abc
    return res

def process(inf, options):
    for line in inf:
        line = line.strip()
        if len(line) > 2 and line[0] == options.field and line[1] == ':':
            print(convertTitle(line[2:].strip(), options))
            break

parser = optparse.OptionParser(usage="usage: %prog [options] [filename]\n\n"
                                     "  Extract field data from ABC file.")
parser.add_option("-f", "--field", dest="field", default="T",
                  help="extract the field FIELD", metavar="FIELD")
parser.add_option("-m", "--html", dest="html",
                  action="store_true", default=False,
                  help="format output for HTML")
parser.add_option("-l", "--latex", dest="latex",
                  action="store_true", default=False,
                  help="format ouput for LaTeX")
(options, args) = parser.parse_args()

if options.html and options.latex:
    sys.exit("You must choose one of HTML or LaTeX output")

if len(args) > 0:
    for arg in args:
        try:
            inf = open(arg, "r")
            process(inf, options)
        finally:
            inf.close()
else:
    process(sys.stdin, options)
sys.exit(0)