blob: d6f3eb920d99b5b1321ac8d8924ede4f4260a918 [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
Fred Drake79ad1f11999-01-14 17:06:09 +000015from xml.utils import escape
16
Fred Drake30a68c71998-11-23 16:59:39 +000017
Fred Drake30a68c71998-11-23 16:59:39 +000018def format_attrs(attrs):
19 attrs = attrs.items()
20 attrs.sort()
21 s = ''
22 for name, value in attrs:
Fred Drake79ad1f11999-01-14 17:06:09 +000023 s = '%s %s="%s"' % (s, name, escape(value))
Fred Drake30a68c71998-11-23 16:59:39 +000024 return s
25
26
Fred Drake4abcffb1998-12-10 18:31:37 +000027def do_convert(ifp, ofp, xml=0):
Fred Drake30a68c71998-11-23 16:59:39 +000028 attrs = {}
29 lastopened = None
Fred Drake4abcffb1998-12-10 18:31:37 +000030 knownempties = []
Fred Drake30a68c71998-11-23 16:59:39 +000031 knownempty = 0
32 lastempty = 0
33 while 1:
34 line = ifp.readline()
35 if not line:
36 break
37
38 type = line[0]
39 data = line[1:]
40 if data and data[-1] == "\n":
41 data = data[:-1]
42 if type == "-":
Fred Drakef077b9d1998-12-01 19:01:53 +000043 data = esistools.decode(data)
Fred Drake79ad1f11999-01-14 17:06:09 +000044 ofp.write(escape(data))
Fred Drake30a68c71998-11-23 16:59:39 +000045 if "\n" in data:
46 lastopened = None
47 knownempty = 0
48 lastempty = 0
49 elif type == "(":
Fred Drakef077b9d1998-12-01 19:01:53 +000050 if data == "COMMENT":
51 ofp.write("<!--")
52 continue
Fred Drake30a68c71998-11-23 16:59:39 +000053 if knownempty and xml:
54 ofp.write("<%s%s/>" % (data, format_attrs(attrs)))
55 else:
56 ofp.write("<%s%s>" % (data, format_attrs(attrs)))
57 if knownempty and data not in knownempties:
58 # accumulate knowledge!
59 knownempties.append(data)
60 attrs = {}
61 lastopened = data
62 lastempty = knownempty
63 knownempty = 0
64 elif type == ")":
Fred Drakef077b9d1998-12-01 19:01:53 +000065 if data == "COMMENT":
66 ofp.write("-->")
67 continue
Fred Drake30a68c71998-11-23 16:59:39 +000068 if xml:
69 if not lastempty:
70 ofp.write("</%s>" % data)
71 elif data not in knownempties:
72 if lastopened == data:
73 ofp.write("</>")
74 else:
75 ofp.write("</%s>" % data)
76 lastopened = None
77 lastempty = 0
78 elif type == "A":
79 name, type, value = string.split(data, " ", 2)
Fred Drakef077b9d1998-12-01 19:01:53 +000080 attrs[name] = esistools.decode(value)
Fred Drake30a68c71998-11-23 16:59:39 +000081 elif type == "e":
82 knownempty = 1
83
84
Fred Drake4abcffb1998-12-10 18:31:37 +000085def sgml_convert(ifp, ofp):
86 return do_convert(ifp, ofp, xml=0)
Fred Drake30a68c71998-11-23 16:59:39 +000087
88
Fred Drake4abcffb1998-12-10 18:31:37 +000089def xml_convert(ifp, ofp):
90 return do_convert(ifp, ofp, xml=1)
Fred Drake30a68c71998-11-23 16:59:39 +000091
92
93def main():
Fred Drakef077b9d1998-12-01 19:01:53 +000094 import getopt
Fred Drake30a68c71998-11-23 16:59:39 +000095 import sys
96 #
97 convert = sgml_convert
Fred Drakef077b9d1998-12-01 19:01:53 +000098 xml = 0
99 xmldecl = 0
100 opts, args = getopt.getopt(sys.argv[1:], "dx", ["declare", "xml"])
101 for opt, arg in opts:
102 if opt in ("-d", "--declare"):
103 xmldecl = 1
104 elif opt in ("-x", "--xml"):
105 xml = 1
106 convert = xml_convert
107 if len(args) == 0:
Fred Drake30a68c71998-11-23 16:59:39 +0000108 ifp = sys.stdin
109 ofp = sys.stdout
Fred Drakef077b9d1998-12-01 19:01:53 +0000110 elif len(args) == 1:
111 ifp = open(args[0])
Fred Drake30a68c71998-11-23 16:59:39 +0000112 ofp = sys.stdout
Fred Drakef077b9d1998-12-01 19:01:53 +0000113 elif len(args) == 2:
114 ifp = open(args[0])
115 ofp = open(args[1], "w")
Fred Drake30a68c71998-11-23 16:59:39 +0000116 else:
117 usage()
118 sys.exit(2)
119 # knownempties is ignored in the XML version
120 try:
Fred Drakef077b9d1998-12-01 19:01:53 +0000121 if xml and xmldecl:
122 opf.write('<?xml version="1.0" encoding="iso8859-1"?>\n')
Fred Drake30a68c71998-11-23 16:59:39 +0000123 convert(ifp, ofp)
124 except IOError, (err, msg):
125 if err != errno.EPIPE:
126 raise
127
128
129if __name__ == "__main__":
130 main()