blob: 172e71202c4a41bdebfdf0b78abd2f4abe83780f [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
Fred Drake4abcffb1998-12-10 18:31:37 +000025def do_convert(ifp, ofp, xml=0):
Fred Drake30a68c71998-11-23 16:59:39 +000026 attrs = {}
27 lastopened = None
Fred Drake4abcffb1998-12-10 18:31:37 +000028 knownempties = []
Fred Drake30a68c71998-11-23 16:59:39 +000029 knownempty = 0
30 lastempty = 0
31 while 1:
32 line = ifp.readline()
33 if not line:
34 break
35
36 type = line[0]
37 data = line[1:]
38 if data and data[-1] == "\n":
39 data = data[:-1]
40 if type == "-":
Fred Drakef077b9d1998-12-01 19:01:53 +000041 data = esistools.decode(data)
Fred Drake30a68c71998-11-23 16:59:39 +000042 ofp.write(data)
43 if "\n" in data:
44 lastopened = None
45 knownempty = 0
46 lastempty = 0
47 elif type == "(":
Fred Drakef077b9d1998-12-01 19:01:53 +000048 if data == "COMMENT":
49 ofp.write("<!--")
50 continue
Fred Drake30a68c71998-11-23 16:59:39 +000051 if knownempty and xml:
52 ofp.write("<%s%s/>" % (data, format_attrs(attrs)))
53 else:
54 ofp.write("<%s%s>" % (data, format_attrs(attrs)))
55 if knownempty and data not in knownempties:
56 # accumulate knowledge!
57 knownempties.append(data)
58 attrs = {}
59 lastopened = data
60 lastempty = knownempty
61 knownempty = 0
62 elif type == ")":
Fred Drakef077b9d1998-12-01 19:01:53 +000063 if data == "COMMENT":
64 ofp.write("-->")
65 continue
Fred Drake30a68c71998-11-23 16:59:39 +000066 if xml:
67 if not lastempty:
68 ofp.write("</%s>" % data)
69 elif data not in knownempties:
70 if lastopened == data:
71 ofp.write("</>")
72 else:
73 ofp.write("</%s>" % data)
74 lastopened = None
75 lastempty = 0
76 elif type == "A":
77 name, type, value = string.split(data, " ", 2)
Fred Drakef077b9d1998-12-01 19:01:53 +000078 attrs[name] = esistools.decode(value)
Fred Drake30a68c71998-11-23 16:59:39 +000079 elif type == "e":
80 knownempty = 1
81
82
Fred Drake4abcffb1998-12-10 18:31:37 +000083def sgml_convert(ifp, ofp):
84 return do_convert(ifp, ofp, xml=0)
Fred Drake30a68c71998-11-23 16:59:39 +000085
86
Fred Drake4abcffb1998-12-10 18:31:37 +000087def xml_convert(ifp, ofp):
88 return do_convert(ifp, ofp, xml=1)
Fred Drake30a68c71998-11-23 16:59:39 +000089
90
91def main():
Fred Drakef077b9d1998-12-01 19:01:53 +000092 import getopt
Fred Drake30a68c71998-11-23 16:59:39 +000093 import sys
94 #
95 convert = sgml_convert
Fred Drakef077b9d1998-12-01 19:01:53 +000096 xml = 0
97 xmldecl = 0
98 opts, args = getopt.getopt(sys.argv[1:], "dx", ["declare", "xml"])
99 for opt, arg in opts:
100 if opt in ("-d", "--declare"):
101 xmldecl = 1
102 elif opt in ("-x", "--xml"):
103 xml = 1
104 convert = xml_convert
105 if len(args) == 0:
Fred Drake30a68c71998-11-23 16:59:39 +0000106 ifp = sys.stdin
107 ofp = sys.stdout
Fred Drakef077b9d1998-12-01 19:01:53 +0000108 elif len(args) == 1:
109 ifp = open(args[0])
Fred Drake30a68c71998-11-23 16:59:39 +0000110 ofp = sys.stdout
Fred Drakef077b9d1998-12-01 19:01:53 +0000111 elif len(args) == 2:
112 ifp = open(args[0])
113 ofp = open(args[1], "w")
Fred Drake30a68c71998-11-23 16:59:39 +0000114 else:
115 usage()
116 sys.exit(2)
117 # knownempties is ignored in the XML version
118 try:
Fred Drakef077b9d1998-12-01 19:01:53 +0000119 if xml and xmldecl:
120 opf.write('<?xml version="1.0" encoding="iso8859-1"?>\n')
Fred Drake30a68c71998-11-23 16:59:39 +0000121 convert(ifp, ofp)
122 except IOError, (err, msg):
123 if err != errno.EPIPE:
124 raise
125
126
127if __name__ == "__main__":
128 main()