blob: 1271b111144a57e153313e8719802087998dfd8e [file] [log] [blame]
Fred Drake30a68c71998-11-23 16:59:39 +00001#! /usr/bin/env python
2
3"""Convert ESIS events to SGML or XML markup.
4
5This is limited, but seems sufficient for the ESIS generated by the
6latex2esis.py script when run over the Python documentation.
7"""
8__version__ = '$Revision$'
9
10import errno
Fred Drakef077b9d1998-12-01 19:01:53 +000011import esistools
Fred Drake30a68c71998-11-23 16:59:39 +000012import re
13import string
14
15
Fred Drake30a68c71998-11-23 16:59:39 +000016def format_attrs(attrs):
17 attrs = attrs.items()
18 attrs.sort()
19 s = ''
20 for name, value in attrs:
21 s = '%s %s="%s"' % (s, name, value)
22 return s
23
24
25def do_convert(ifp, ofp, knownempties, xml=0):
26 attrs = {}
27 lastopened = None
28 knownempty = 0
29 lastempty = 0
30 while 1:
31 line = ifp.readline()
32 if not line:
33 break
34
35 type = line[0]
36 data = line[1:]
37 if data and data[-1] == "\n":
38 data = data[:-1]
39 if type == "-":
Fred Drakef077b9d1998-12-01 19:01:53 +000040 data = esistools.decode(data)
Fred Drake30a68c71998-11-23 16:59:39 +000041 ofp.write(data)
42 if "\n" in data:
43 lastopened = None
44 knownempty = 0
45 lastempty = 0
46 elif type == "(":
Fred Drakef077b9d1998-12-01 19:01:53 +000047 if data == "COMMENT":
48 ofp.write("<!--")
49 continue
Fred Drake30a68c71998-11-23 16:59:39 +000050 if knownempty and xml:
51 ofp.write("<%s%s/>" % (data, format_attrs(attrs)))
52 else:
53 ofp.write("<%s%s>" % (data, format_attrs(attrs)))
54 if knownempty and data not in knownempties:
55 # accumulate knowledge!
56 knownempties.append(data)
57 attrs = {}
58 lastopened = data
59 lastempty = knownempty
60 knownempty = 0
61 elif type == ")":
Fred Drakef077b9d1998-12-01 19:01:53 +000062 if data == "COMMENT":
63 ofp.write("-->")
64 continue
Fred Drake30a68c71998-11-23 16:59:39 +000065 if xml:
66 if not lastempty:
67 ofp.write("</%s>" % data)
68 elif data not in knownempties:
69 if lastopened == data:
70 ofp.write("</>")
71 else:
72 ofp.write("</%s>" % data)
73 lastopened = None
74 lastempty = 0
75 elif type == "A":
76 name, type, value = string.split(data, " ", 2)
Fred Drakef077b9d1998-12-01 19:01:53 +000077 attrs[name] = esistools.decode(value)
Fred Drake30a68c71998-11-23 16:59:39 +000078 elif type == "e":
79 knownempty = 1
80
81
82def sgml_convert(ifp, ofp, knownempties=()):
83 return do_convert(ifp, ofp, list(knownempties), xml=0)
84
85
86def xml_convert(ifp, ofp, knownempties=()):
87 return do_convert(ifp, ofp, list(knownempties), xml=1)
88
89
90def main():
Fred Drakef077b9d1998-12-01 19:01:53 +000091 import getopt
Fred Drake30a68c71998-11-23 16:59:39 +000092 import sys
93 #
94 convert = sgml_convert
Fred Drakef077b9d1998-12-01 19:01:53 +000095 xml = 0
96 xmldecl = 0
97 opts, args = getopt.getopt(sys.argv[1:], "dx", ["declare", "xml"])
98 for opt, arg in opts:
99 if opt in ("-d", "--declare"):
100 xmldecl = 1
101 elif opt in ("-x", "--xml"):
102 xml = 1
103 convert = xml_convert
104 if len(args) == 0:
Fred Drake30a68c71998-11-23 16:59:39 +0000105 ifp = sys.stdin
106 ofp = sys.stdout
Fred Drakef077b9d1998-12-01 19:01:53 +0000107 elif len(args) == 1:
108 ifp = open(args[0])
Fred Drake30a68c71998-11-23 16:59:39 +0000109 ofp = sys.stdout
Fred Drakef077b9d1998-12-01 19:01:53 +0000110 elif len(args) == 2:
111 ifp = open(args[0])
112 ofp = open(args[1], "w")
Fred Drake30a68c71998-11-23 16:59:39 +0000113 else:
114 usage()
115 sys.exit(2)
116 # knownempties is ignored in the XML version
117 try:
Fred Drakef077b9d1998-12-01 19:01:53 +0000118 if xml and xmldecl:
119 opf.write('<?xml version="1.0" encoding="iso8859-1"?>\n')
Fred Drake30a68c71998-11-23 16:59:39 +0000120 convert(ifp, ofp)
121 except IOError, (err, msg):
122 if err != errno.EPIPE:
123 raise
124
125
126if __name__ == "__main__":
127 main()