blob: 442d4083e055ff2ba307f325ba0f5a2befcc3e20 [file] [log] [blame]
Fred Drake99ff8c41998-11-18 23:28:24 +00001#! /usr/bin/env python
2
3"""
4"""
5__version__ = '$Revision$'
6
7
8import re
9import string
10
11
12_data_rx = re.compile(r"[^\\][^\\]*")
13
14def decode(s):
15 r = ''
16 while s:
17 m = _data_rx.match(s)
18 if m:
19 r = r + m.group()
20 s = s[len(m.group()):]
21 elif s[1] == "\\":
22 r = r + "\\"
23 s = s[2:]
24 elif s[1] == "n":
25 r = r + "\n"
26 s = s[2:]
27 else:
28 raise ValueError, "can't handle " + `s`
29 return r
30
31
32def format_attrs(attrs):
33 attrs = attrs.items()
34 attrs.sort()
35 s = ''
36 for name, value in attrs:
37 s = '%s %s="%s"' % (s, name, value)
38 return s
39
40
41def do_convert(ifp, ofp, knownempties, xml=0):
42 attrs = {}
43 lastopened = None
44 knownempty = 0
45 lastempty = 0
46 while 1:
47 line = ifp.readline()
48 if not line:
49 break
50
51 type = line[0]
52 data = line[1:]
53 if data and data[-1] == "\n":
54 data = data[:-1]
55 if type == "-":
56 data = decode(data)
57 ofp.write(data)
58 if "\n" in data:
59 lastopened = None
60 knownempty = 0
61 lastempty = 0
62 elif type == "(":
63 if knownempty and xml:
64 ofp.write("<%s%s/>" % (data, format_attrs(attrs)))
65 else:
66 ofp.write("<%s%s>" % (data, format_attrs(attrs)))
67 attrs = {}
68 lastopened = data
69 lastempty = knownempty
70 knownempty = 0
71 elif type == ")":
72 if xml:
73 if not lastempty:
74 ofp.write("</%s>" % data)
75 elif data not in knownempties:
76 if lastopened == data:
77 ofp.write("</>")
78 else:
79 ofp.write("</%s>" % data)
80 lastopened = None
81 lastempty = 0
82 elif type == "A":
83 name, type, value = string.split(data, " ", 2)
84 attrs[name] = decode(value)
85 elif type == "e":
86 knownempty = 1
87
88
89def sgml_convert(ifp, ofp, knownempties=()):
90 return do_convert(ifp, ofp, knownempties, xml=0)
91
92
93def xml_convert(ifp, ofp, knownempties=[]):
94 return do_convert(ifp, ofp, knownempties, xml=1)
95
96
97def main():
98 import sys
99 #
100 convert = sgml_convert
101 if sys.argv[1:] and sys.argv[1] in ("-x", "--xml"):
102 convert = xml_convert
103 del sys.argv[1]
104 if len(sys.argv) == 1:
105 ifp = sys.stdin
106 ofp = sys.stdout
107 elif len(sys.argv) == 2:
108 ifp = open(sys.argv[1])
109 ofp = sys.stdout
110 elif len(sys.argv) == 3:
111 ifp = open(sys.argv[1])
112 ofp = open(sys.argv[2], "w")
113 else:
114 usage()
115 sys.exit(2)
116 # knownempties is ignored in the XML version
117 convert(ifp, ofp, knownempties=["rfc", "POSIX", "ASCII", "declaremodule",
118 "maketitle", "makeindex", "makemodindex",
119 "localmoduletable", "ABC", "UNIX", "Cpp",
120 "C", "EOF", "NULL", "manpage", "input",
121 "label"])
122
123
124if __name__ == "__main__":
125 main()