comparison abcfield.py @ 581:760d0ae5acea

Revise abcfield.py to recognise continuation fields. Also default to HTML entity output, and replace --contains with --starts, which does the same thing but checks only the start of the line and removes the matched item.
author Jim Hague <jim.hague@acm.org>
date Sat, 29 Oct 2016 19:32:53 +0100
parents 27f29e8aafea
children 696c461c8dc0
comparison
equal deleted inserted replaced
580:575f1eae4137 581:760d0ae5acea
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # 2 #
3 # Extact a text field (title, by default) from a .abc file, and print it out 3 # Extact a text field (title, by default) from a .abc file, and print it out
4 # formatted for use in LaTeX or HTML. 4 # with any ABC accented characters converted to HTML (default) or Latex.
5 # Recognise continuation fields and print those too.
5 # 6 #
6 7
7 import optparse 8 import optparse
8 import sys 9 import sys
9 10
84 "AE" : ("&AElig;", "\\AE"), 85 "AE" : ("&AElig;", "\\AE"),
85 "ae" : ("&aelig;", "\\ae"), 86 "ae" : ("&aelig;", "\\ae"),
86 "ss" : ("&szlig;", "\\ss"), 87 "ss" : ("&szlig;", "\\ss"),
87 } 88 }
88 89
89 def convertTitle(t, options): 90 def convertField(t, options):
90 res = "" 91 res = ""
91 while True: 92 while True:
92 p = t.partition('\\') 93 p = t.partition('\\')
93 res += p[0] 94 res += p[0]
94 if p[1] == "": 95 if p[1] == "":
95 break 96 break
96 abc = p[2][0:2] 97 abc = p[2][0:2]
97 t = p[2][2:] 98 t = p[2][2:]
98 if (options.html or options.latex) and abc in accentedletters: 99 if abc in accentedletters:
99 if options.html: 100 if options.html:
100 res += accentedletters[abc][0] 101 res += accentedletters[abc][0]
101 else: 102 else:
102 res += accentedletters[abc][1] 103 res += accentedletters[abc][1]
103 else: 104 else:
104 res += "\\" + abc 105 res += "\\" + abc
105 return res 106 return res
106 107
107 def process(inf, options): 108 def process(inf, options):
108 n = options.index 109 n = options.index
110 found = False
109 for line in inf: 111 for line in inf:
110 line = line.strip() 112 line = line.strip()
111 if len(line) > 2 and line[0] == options.field and line[1] == ':': 113 if len(line) > 2 and line[1] == ':':
112 if len(options.contains) > 0: 114 if found:
113 if line.find(options.contains) < 0: 115 if line[0] != '+':
116 break
117 line = line[2:].strip()
118 elif line[0] == options.field:
119 if n > 1:
120 n = n - 1
114 continue 121 continue
115 if n > 1: 122 else:
116 n = n - 1 123 line = line[2:].strip()
124 if len(options.starts) > 0:
125 if line.find(options.starts) == 0:
126 line = line[len(options.starts):].strip()
127 else:
128 continue
117 else: 129 else:
118 print(convertTitle(line[2:].strip(), options)) 130 continue
119 break 131 found = True
132 print(convertField(line, options))
120 133
121 parser = optparse.OptionParser(usage="usage: %prog [options] [filename]\n\n" 134 parser = optparse.OptionParser(usage="usage: %prog [options] [filename]\n\n"
122 " Extract field data from ABC file.") 135 " Extract field data from ABC file.")
123 parser.add_option("-f", "--field", dest="field", default="T", 136 parser.add_option("-f", "--field", dest="field", default="T",
124 help="extract the field FIELD", metavar="FIELD") 137 help="extract the field FIELD", metavar="FIELD")
125 parser.add_option("-m", "--html", dest="html",
126 action="store_true", default=False,
127 help="format output for HTML")
128 parser.add_option("-l", "--latex", dest="latex", 138 parser.add_option("-l", "--latex", dest="latex",
129 action="store_true", default=False, 139 action="store_true", default=False,
130 help="format ouput for LaTeX") 140 help="convert special characters for LaTeX")
131 parser.add_option("-n", "--index", dest="index", 141 parser.add_option("-n", "--index", dest="index",
132 action="store", type="int", default=1, 142 action="store", type="int", default=1,
133 help="report INDEXth value [default: %default]", 143 help="report INDEXth value [default: %default]",
134 metavar="INDEX") 144 metavar="INDEX")
135 parser.add_option("-c", "--contains", dest="contains", 145 parser.add_option("-s", "--starts", dest="starts",
136 action="store", type="string", default="", 146 action="store", type="string", default="",
137 help="report only if line contains CONTENT", 147 help="report only if line starts CONTENT and remove CONTENT",
138 metavar="CONTENT") 148 metavar="CONTENT")
139 (options, args) = parser.parse_args() 149 (options, args) = parser.parse_args()
140
141 if options.html and options.latex:
142 sys.exit("You must choose one of HTML or LaTeX output")
143 150
144 if len(args) > 0: 151 if len(args) > 0:
145 for arg in args: 152 for arg in args:
146 try: 153 try:
147 inf = open(arg, "r") 154 inf = open(arg, "r")