mirror of
				https://github.com/python/cpython.git
				synced 2025-11-01 06:01:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			127 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #! /usr/bin/env python
 | |
| 
 | |
| """Convert ESIS events to SGML or XML markup.
 | |
| 
 | |
| This is limited, but seems sufficient for the ESIS generated by the
 | |
| latex2esis.py script when run over the Python documentation.
 | |
| """
 | |
| __version__ = '$Revision$'
 | |
| 
 | |
| import errno
 | |
| import esistools
 | |
| import re
 | |
| import string
 | |
| 
 | |
| 
 | |
| def format_attrs(attrs):
 | |
|     attrs = attrs.items()
 | |
|     attrs.sort()
 | |
|     s = ''
 | |
|     for name, value in attrs:
 | |
|         s = '%s %s="%s"' % (s, name, value)
 | |
|     return s
 | |
| 
 | |
| 
 | |
| def do_convert(ifp, ofp, knownempties, xml=0):
 | |
|     attrs = {}
 | |
|     lastopened = None
 | |
|     knownempty = 0
 | |
|     lastempty = 0
 | |
|     while 1:
 | |
|         line = ifp.readline()
 | |
|         if not line:
 | |
|             break
 | |
| 
 | |
|         type = line[0]
 | |
|         data = line[1:]
 | |
|         if data and data[-1] == "\n":
 | |
|             data = data[:-1]
 | |
|         if type == "-":
 | |
|             data = esistools.decode(data)
 | |
|             ofp.write(data)
 | |
|             if "\n" in data:
 | |
|                 lastopened = None
 | |
|             knownempty = 0
 | |
|             lastempty = 0
 | |
|         elif type == "(":
 | |
|             if data == "COMMENT":
 | |
|                 ofp.write("<!--")
 | |
|                 continue
 | |
|             if knownempty and xml:
 | |
|                 ofp.write("<%s%s/>" % (data, format_attrs(attrs)))
 | |
|             else:
 | |
|                 ofp.write("<%s%s>" % (data, format_attrs(attrs)))
 | |
|             if knownempty and data not in knownempties:
 | |
|                 # accumulate knowledge!
 | |
|                 knownempties.append(data)
 | |
|             attrs = {}
 | |
|             lastopened = data
 | |
|             lastempty = knownempty
 | |
|             knownempty = 0
 | |
|         elif type == ")":
 | |
|             if data == "COMMENT":
 | |
|                 ofp.write("-->")
 | |
|                 continue
 | |
|             if xml:
 | |
|                 if not lastempty:
 | |
|                     ofp.write("</%s>" % data)
 | |
|             elif data not in knownempties:
 | |
|                 if lastopened == data:
 | |
|                     ofp.write("</>")
 | |
|                 else:
 | |
|                     ofp.write("</%s>" % data)
 | |
|             lastopened = None
 | |
|             lastempty = 0
 | |
|         elif type == "A":
 | |
|             name, type, value = string.split(data, " ", 2)
 | |
|             attrs[name] = esistools.decode(value)
 | |
|         elif type == "e":
 | |
|             knownempty = 1
 | |
| 
 | |
| 
 | |
| def sgml_convert(ifp, ofp, knownempties=()):
 | |
|     return do_convert(ifp, ofp, list(knownempties), xml=0)
 | |
| 
 | |
| 
 | |
| def xml_convert(ifp, ofp, knownempties=()):
 | |
|     return do_convert(ifp, ofp, list(knownempties), xml=1)
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     import getopt
 | |
|     import sys
 | |
|     #
 | |
|     convert = sgml_convert
 | |
|     xml = 0
 | |
|     xmldecl = 0
 | |
|     opts, args = getopt.getopt(sys.argv[1:], "dx", ["declare", "xml"])
 | |
|     for opt, arg in opts:
 | |
|         if opt in ("-d", "--declare"):
 | |
|             xmldecl = 1
 | |
|         elif opt in ("-x", "--xml"):
 | |
|             xml = 1
 | |
|             convert = xml_convert
 | |
|     if len(args) == 0:
 | |
|         ifp = sys.stdin
 | |
|         ofp = sys.stdout
 | |
|     elif len(args) == 1:
 | |
|         ifp = open(args[0])
 | |
|         ofp = sys.stdout
 | |
|     elif len(args) == 2:
 | |
|         ifp = open(args[0])
 | |
|         ofp = open(args[1], "w")
 | |
|     else:
 | |
|         usage()
 | |
|         sys.exit(2)
 | |
|     # knownempties is ignored in the XML version
 | |
|     try:
 | |
|         if xml and xmldecl:
 | |
|             opf.write('<?xml version="1.0" encoding="iso8859-1"?>\n')
 | |
|         convert(ifp, ofp)
 | |
|     except IOError, (err, msg):
 | |
|         if err != errno.EPIPE:
 | |
|             raise
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 | 
