dottes/abcfield.py

161 lines
4.8 KiB
Python
Executable File

#!/usr/bin/env python
#
# Extact a text field (title, by default) from a .abc file, and print it out
# with any ABC accented characters converted to HTML (default) or Latex.
# Recognise continuation fields and print those too.
#
import optparse
import sys
accentedletters = {
# Acute accents
"'A" : ("Á", "\\'{A}"),
"'E" : ("É", "\\'{E}"),
"'I" : ("Í", "\\'{I}"),
"'O" : ("Ó", "\\'{O}"),
"'U" : ("Ú", "\\'{U}"),
"'Y" : ("Ý", "\\'{Y}"),
"'a" : ("á", "\\'{a}"),
"'e" : ("é", "\\'{e}"),
"'i" : ("í", "\\'{i}"),
"'o" : ("ó", "\\'{o}"),
"'u" : ("ú", "\\'{u}"),
"'y" : ("ý", "\\'{y}"),
# Grave accents
"`A" : ("À", "\\`{A}"),
"`E" : ("È", "\\`{E}"),
"`I" : ("Ì", "\\`{I}"),
"`O" : ("Ò", "\\`{O}"),
"`U" : ("Ù", "\\`{U}"),
"`a" : ("à", "\\`{a}"),
"`e" : ("è", "\\`{e}"),
"`i" : ("ì", "\\`{i}"),
"`o" : ("ò", "\\`{o}"),
"`u" : ("ù", "\\`{u}"),
# Umlauts
"\"A" : ("Ä", "\\\"{A}"),
"\"E" : ("Ë", "\\\"{E}"),
"\"I" : ("Ï", "\\\"{I}"),
"\"O" : ("Ö", "\\\"{O}"),
"\"U" : ("Ü", "\\\"{U}"),
"\"Y" : ("Ÿ", "\\\"{Y}"),
"\"a" : ("ä", "\\\"{a}"),
"\"e" : ("ë", "\\\"{e}"),
"\"i" : ("ï", "\\\"{\i}"),
"\"o" : ("ö", "\\\"{o}"),
"\"u" : ("ü", "\\\"{u}"),
"\"y" : ("ÿ", "\\\"{y}"),
# Circumflexes
"^A" : ("Â", "\\^{A}"),
"^E" : ("Ê", "\\^{E}"),
"^I" : ("Î", "\\^{I}"),
"^O" : ("Ô", "\\^{O}"),
"^U" : ("Û", "\\^{U}"),
"^a" : ("â", "\\^{a}"),
"^e" : ("ê", "\\^{e}"),
"^i" : ("î", "\\^{\i}"),
"^o" : ("ô", "\\^{o}"),
"^u" : ("û", "\\^{u}"),
# Tilde
"~A" : ("Ã", "\\~{A}"),
"~N" : ("Ñ", "\\~{N}"),
"~O" : ("Õ", "\\~{O}"),
"~a" : ("ã", "\\~{a}"),
"~n" : ("ñ", "\\~{n}"),
"~o" : ("õ", "\\~{o}"),
# Cedilla
",C" : ("Ç", "\\c{C}"),
",c" : ("ç", "\\c{c}"),
# Slash
"/O" : ("Ø", "\\O"),
"/o" : ("ø", "\\o"),
# Ring
"AA" : ("Å", "\\r{A}"),
"aa" : ("å", "\\r{a}"),
# Ligatures
"AE" : ("Æ", "\\AE"),
"ae" : ("æ", "\\ae"),
"ss" : ("ß", "\\ss"),
}
def convertField(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 abc in accentedletters:
if options.html:
res += accentedletters[abc][0]
else:
res += accentedletters[abc][1]
else:
res += "\\" + abc
return res
def process(inf, options):
n = options.index
found = False
for line in inf:
line = line.strip()
if len(line) > 2 and line[1] == ':':
if found:
if line[0] != '+':
break
line = line[2:].strip()
elif line[0] == options.field:
if n > 1:
n = n - 1
continue
else:
line = line[2:].strip()
if len(options.starts) > 0:
if line.find(options.starts) == 0:
line = line[len(options.starts):].strip()
else:
continue
else:
continue
found = True
print(convertField(line, options))
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("-l", "--latex", dest="latex",
action="store_true", default=False,
help="convert special characters for LaTeX")
parser.add_option("-n", "--index", dest="index",
action="store", type="int", default=1,
help="report INDEXth value [default: %default]",
metavar="INDEX")
parser.add_option("-s", "--starts", dest="starts",
action="store", type="string", default="",
help="report only if line starts CONTENT and remove CONTENT",
metavar="CONTENT")
(options, args) = parser.parse_args()
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)