forked from csound/manual
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopcodeparser.py
146 lines (130 loc) · 5.88 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
# 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\n"
"This 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.extend(list(glob.glob('opcodes/*/*.xml')))
files.extend(list(glob.glob('vectorial/*.xml')))
files.extend(list(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"')]
special_entries = {
'adds.xml': '<synopsis>a <opcodename>+</opcodename> b (no rate restriction)</synopsis>\n',
'dollar.xml': '<synopsis><opcodename>$NAME</opcodename></synopsis>\n<para/>',
'divides.xml': '<synopsis>a <opcodename>/</opcodename> b (no rate restriction)</synopsis>\n',
'modulus.xml': '<synopsis>a <opcodename>%</opcodename> b (no rate restriction)</synopsis>\n',
'multiplies.xml': '<synopsis>a <opcodename>*</opcodename> b (no rate restriction)</synopsis>\n',
'opbitor.xml': '<synopsis>a <opcodename>'+'|</opcodename> b (bitwise OR)</synopsis>\n',
'opor.xml': '<synopsis>a <opcodename>'+'||</opcodename> b (logical OR; not audio-rate)</synopsis>\n',
'raises.xml': '<synopsis>a <opcodename>^</opcodename> b (b not audio-rate)</synopsis>\n',
'substracts.xml': '<synopsis>a <opcodename>-</opcodename> b (no rate restriction)</synopsis>\n',
'ifdef.xml': ('<synopsis><opcodename>#ifdef</opcodename> NAME</synopsis><synopsis> ....</synopsis>\n'
'<synopsis><opcodename>#else</opcodename></synopsis><synopsis> ....</synopsis>\n'
'<synopsis><opcodename>#end</opcodename></synopsis>\n'),
'define.xml': ('<synopsis><opcodename>#define</opcodename> NAME # replacement text #</synopsis>\n'
'<synopsis><opcodename>#define</opcodename> NAME(a' b' c') # replacement text #</synopsis>\n'),
'include.xml': '<synopsis><opcodename>#include</opcodename> "filename"</synopsis>\n',
'undef.xml': '<synopsis><opcodename>#undef</opcodename> NAME</synopsis>\n',
'0dbfs.xml': '<synopsis><opcodename>0dbfs</opcodename> = iarg</synopsis>\n'
}
for i,filename in enumerate(files):
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()
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???
folder, base = os.path.split(filename)
entry = special_entries.get(base)
if entry is None:
synopsis = xmldoc.getElementsByTagName('synopsis')
entry = ''
if synopsis:
# 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>')
# print "Entry ------ ", entry
info = xmldoc.getElementsByTagName('refentryinfo')
if info and entry:
category = info[0].toxml()
category = category[21:-23]
else:
print("no refentryinfo tag for file " + filename)
category = "Miscellaneous"
if entry:
print(filename + " sent to Miscellaneous")
desc = xmldoc.getElementsByTagName('refpurpose')
description = ""
if desc 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 not match:
print(filename + "---- WARNING! No Category Match!")
for i, category in enumerate(categories):
if not category:
print(f"No entries for category: {category} ...Skipping")
continue
quickref.write("<category name=\"" + categories[i] + "\">\n")
count = 0
for entry in entries[i]:
entrydef, description = entry
if not entrydef:
continue
# newentry = entry.pop(0)
# entry = entry.replace("$", "$")
# entry = entry.replace(" ", " ")
quickref.write("<opcode>")
if description:
quickref.write("<desc>")
quickref.write(description)
quickref.write("</desc>")
quickref.write(entrydef)
quickref.write("</opcode>\n")
count += 1
quickref.write("</category>\n")
print(str(count) + " entries in category: " + categories[i])
quickref.write('</opcodes>\n')
quickref.close()
print(entries)