forked from csound/manual
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopcodeparser.py
164 lines (148 loc) · 7.36 KB
/
opcodeparser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# This script generates the opcode.xml file
# by Andres Cabrera June 2006-2010
# Licensed under the GPL licence version 3 or later
# modification for empty arg in command and links on opcodes by Francois Pinot February 2007
from __future__ import print_function
from xml.dom import minidom
import os, glob
# categories holds the list of valid categories for opcodes
from categories import categories
XO = False
opcodelist = []
outfilename = 'opcodes.xml'
quickref = open(outfilename,'w')
quickref.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Don't modify this file. It is generated automatically by opcodeparser.py\nThis file is distributed under the GNU Free Documentation Licence-->")
quickref.write('''<opcodes>\n''')
entries = []
for i in categories:
entries.append([])
manualfilename = 'manual.xml'
manual = open(manualfilename, 'r')
text = manual.read()
manual.close()
files = glob.glob('opcodes/*.xml')
files[len(files):]=glob.glob('opcodes/*/*.xml')
files[len(files):]=glob.glob('vectorial/*.xml')
files[len(files):]=glob.glob('utility/*.xml')
files.sort()
if files.index('opcodes/topXO.xml') >= 0:
files.remove('opcodes/topXO.xml')
headerText = text[0:text.find('<book id="index"')]
for i,filename in enumerate(files):
entry = ''
#print filename
source = open(filename, 'r')
# Necessary to define entities>
entryText = source.read().replace("\xef\xbb\xbf","")
newfile = headerText + '<book id="index" lang="en">' + entryText + '</book>'
newfile = newfile.replace("\r", "")
source.close()
#print text
xmldoc = minidom.parseString(newfile)
xmldocId = xmldoc.documentElement.getAttribute('id')
# Some files need special treatment (adds, dollar, divides, modulus, multiplies,
# opbitor, opor, raises, subtracts, assign, ifdef, ifndef, define, include, undef)
# There must be a better way to avoid loosing the entities when parsing the XML
# file. Anyone???
if (filename == 'opcodes' + os.sep + 'adds.xml'):
entry = '<synopsis>a <opcodename>+</opcodename> b (no rate restriction)</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'dollar.xml'):
entry = '<synopsis><opcodename>$NAME</opcodename></synopsis>\n<para/>'
elif (filename == 'opcodes' + os.sep + 'divides.xml'):
entry = '<synopsis>a <opcodename>/</opcodename> b (no rate restriction)</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'modulus.xml'):
entry = '<synopsis>a <opcodename>%</opcodename> b (no rate restriction)</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'multiplies.xml'):
entry = '<synopsis>a <opcodename>*</opcodename> b (no rate restriction)</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'opbitor.xml'):
entry = '<synopsis>a <opcodename>'+'|</opcodename> b (bitwise OR)</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'opor.xml'):
entry = '<synopsis>a <opcodename>'+'||</opcodename> b (logical OR; not audio-rate)</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'raises.xml'):
entry = '<synopsis>a <opcodename>^</opcodename> b (b not audio-rate)</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'subtracts.xml'):
entry = '<synopsis>a <opcodename>-</opcodename> b (no rate restriction)</synopsis>\n'
# elif (filename == 'opcodes' + os.sep + 'assign.xml'):
# entry = '''<synopsis> <link linkend="'+xmldocId+'">'+'−</link>a (no rate restriction)</synopsis>
# <synopsis> <link linkend="'+xmldocId+'">'+'+</link>a (no rate restriction)</synopsis>\n'''
elif (filename == 'opcodes' + os.sep + 'ifdef.xml'):
entry = '<synopsis><opcodename>#ifdef</opcodename> NAME</synopsis><synopsis> ....</synopsis>' + \
'<synopsis><opcodename>#else</opcodename></synopsis><synopsis> ....</synopsis>' + \
'<synopsis><opcodename>#end</opcodename></synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'ifndef.xml'):
entry='<synopsis><opcodename>#ifndef</opcodename> NAME</synopsis><synopsis> ....</synopsis>' + \
'<synopsis><opcodename>#else</opcodename></synopsis><synopsis> ....</synopsis>' + \
'<synopsis><opcodename>#end</opcodename></synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'define.xml'):
entry='<synopsis><opcodename>#define</opcodename> NAME # replacement text #</synopsis>\n' + \
'<synopsis><opcodename>#define</opcodename> NAME(a' b' c') # replacement text #</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'include.xml'):
entry='<synopsis><opcodename>#include</opcodename> "filename"</synopsis>\n'
elif (filename == 'opcodes' + os.sep + 'undef.xml'):
entry='<synopsis><opcodename>#undef</opcodename> NAME</synopsis>\n'
elif (filename == 'opcodes' + os.sep + '0dbfs.xml'):
entry = '<synopsis><opcodename>0dbfs</opcodename> = iarg</synopsis>\n'
else:
synopsis = xmldoc.getElementsByTagName('synopsis')
if (len(synopsis) != 0):
# There can be more than 1 synopsis per file
for num in range(len(synopsis)):
tmp = synopsis[num].toxml()
if XO:
opcodename = tmp[tmp.find('<command>') + 9:tmp.find('</command>')]
else:
opcodename = ""
tmp = tmp.replace('<command>', '<opcodename>')
entry += tmp.replace('</command>', '</opcodename>')
#if entry != '':
#entry += '<para/>'
else:
#print "no synopsis tag for file: " + file
entry = ''
#print "Entry ------ ", entry
info = xmldoc.getElementsByTagName('refentryinfo')
if (len(info)!=0 and entry != ''):
category = info[0].toxml()
category = category[21:-23]
#print filename, category
else:
print("no refentryinfo tag for file " + filename)
category = "Miscellaneous"
if (entry!=''):
print(filename + " sent to Miscellaneous")
desc = xmldoc.getElementsByTagName('refpurpose')
description = ""
if (len(desc)!=0 and entry != ''):
description = desc[0].firstChild.toxml().strip()
#print filename, category
else:
print("no refpurpose tag for file " + filename)
#print category
match = False
for j, thiscategory in enumerate(categories):
if (category == thiscategory):
entries[j].append([entry, description])
match = True
if match == False:
print(filename + "---- WARNING! No Category Match!")
for i in range(len(categories)):
if (len(entries[i])==0):
print("No entries for category: "+categories[i]+"...Skipping")
continue
#quickref.write("<para></para><formalpara>\n")
quickref.write("<category name=\"" + categories[i] + "\">\n")
count = 0
for j in range(len(entries[i])):
newentry = entries[i].pop(0)
#entry = entry.replace("$", "$")
#entry = entry.replace(" ", " ")
quickref.write("<opcode><desc>" + description) # + '\n')
quickref.write(newentry[1] + "</desc>") # + '\n')
quickref.write(newentry[0] + "</opcode>\n") # + '\n')
count += 1
#quickref.write("</para></formalpara>\n<para></para>")
quickref.write("</category>\n")
print(str(count) + " entries in category: " + categories[i])
quickref.write('</opcodes>\n')
quickref.close()
print(entries)