diff options
Diffstat (limited to 'Tools/scripts/texi2html.py')
-rwxr-xr-x | Tools/scripts/texi2html.py | 307 |
1 files changed, 152 insertions, 155 deletions
diff --git a/Tools/scripts/texi2html.py b/Tools/scripts/texi2html.py index 57db166df1e..af2147a76bb 100755 --- a/Tools/scripts/texi2html.py +++ b/Tools/scripts/texi2html.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 # Convert GNU texinfo files into HTML, one file per node. # Based on Texinfo 2.14. @@ -114,7 +114,8 @@ class HTMLNode: self.lines = [] def write(self, *lines): - map(self.lines.append, lines) + for line in lines: + self.lines.append(line) def flush(self): fp = open(self.dirname + '/' + makefile(self.name), 'w') @@ -173,7 +174,7 @@ class HTMLNode: self.link(' Next', self.next, rel='Next') self.link(' Prev', self.prev, rel='Previous') self.link(' Up', self.up, rel='Up') - if self.name <> self.topname: + if self.name != self.topname: self.link(' Top', self.topname) @@ -256,8 +257,8 @@ class TexinfoParser: while line and (line[0] == '%' or blprog.match(line)): line = fp.readline() lineno = lineno + 1 - if line[:len(MAGIC)] <> MAGIC: - raise SyntaxError, 'file does not begin with %r' % (MAGIC,) + if line[:len(MAGIC)] != MAGIC: + raise SyntaxError('file does not begin with %r' % (MAGIC,)) self.parserest(fp, lineno) # Parse the contents of a file, not expecting a MAGIC header @@ -275,7 +276,7 @@ class TexinfoParser: if not self.skip: self.process(accu) accu = [] if initial_lineno > 0: - print '*** EOF before @bye' + print('*** EOF before @bye') break lineno = lineno + 1 mo = cmprog.match(line) @@ -306,10 +307,10 @@ class TexinfoParser: accu.append(line) # if self.skip: - print '*** Still skipping at the end' + print('*** Still skipping at the end') if self.stack: - print '*** Stack not empty at the end' - print '***', self.stack + print('*** Stack not empty at the end') + print('***', self.stack) if self.includedepth == 0: while self.nodestack: self.nodestack[-1].finalize() @@ -318,7 +319,7 @@ class TexinfoParser: # Start saving text in a buffer instead of writing it to a file def startsaving(self): - if self.savetext <> None: + if self.savetext != None: self.savestack.append(self.savetext) # print '*** Recursively saving text, expect trouble' self.savetext = '' @@ -338,9 +339,9 @@ class TexinfoParser: try: text = ''.join(args) except: - print args + print(args) raise TypeError - if self.savetext <> None: + if self.savetext != None: self.savetext = self.savetext + text elif self.nodefp: self.nodefp.write(text) @@ -349,8 +350,8 @@ class TexinfoParser: # Complete the current node -- write footnotes and close file def endnode(self): - if self.savetext <> None: - print '*** Still saving text at end of node' + if self.savetext != None: + print('*** Still saving text at end of node') dummy = self.collectsavings() if self.footnotes: self.writefootnotes() @@ -361,7 +362,7 @@ class TexinfoParser: self.link('Next', next) self.link('Prev', prev) self.link('Up', up) - if self.nodename <> self.topname: + if self.nodename != self.topname: self.link('Top', self.topname) self.write('<HR>\n') self.write('</BODY>\n') @@ -382,10 +383,10 @@ class TexinfoParser: # This mostly distinguishes between menus and normal text def process(self, accu): if self.debugging > 1: - print '!'*self.debugging, 'process:', self.skip, self.stack, - if accu: print accu[0][:30], - if accu[0][30:] or accu[1:]: print '...', - print + print('!'*self.debugging, 'process:', self.skip, self.stack, end=' ') + if accu: print(accu[0][:30], end=' ') + if accu[0][30:] or accu[1:]: print('...', end=' ') + print() if self.inmenu(): # XXX should be done differently for line in accu: @@ -461,7 +462,7 @@ class TexinfoParser: continue if c == '}': if not stack: - print '*** Unmatched }' + print('*** Unmatched }') self.write('}') continue cmd = stack[-1] @@ -473,9 +474,9 @@ class TexinfoParser: continue method() continue - if c <> '@': + if c != '@': # Cannot happen unless spprog is changed - raise RuntimeError, 'unexpected funny %r' % c + raise RuntimeError('unexpected funny %r' % c) start = i while i < n and text[i] in string.ascii_letters: i = i+1 if i == start: @@ -509,32 +510,32 @@ class TexinfoParser: continue method() if stack: - print '*** Stack not empty at para:', stack + print('*** Stack not empty at para:', stack) # --- Handle unknown embedded @-commands --- def unknown_open(self, cmd): - print '*** No open func for @' + cmd + '{...}' + print('*** No open func for @' + cmd + '{...}') cmd = cmd + '{' self.write('@', cmd) - if not self.unknown.has_key(cmd): + if cmd not in self.unknown: self.unknown[cmd] = 1 else: self.unknown[cmd] = self.unknown[cmd] + 1 def unknown_close(self, cmd): - print '*** No close func for @' + cmd + '{...}' + print('*** No close func for @' + cmd + '{...}') cmd = '}' + cmd self.write('}') - if not self.unknown.has_key(cmd): + if cmd not in self.unknown: self.unknown[cmd] = 1 else: self.unknown[cmd] = self.unknown[cmd] + 1 def unknown_handle(self, cmd): - print '*** No handler for @' + cmd + print('*** No handler for @' + cmd) self.write('@', cmd) - if not self.unknown.has_key(cmd): + if cmd not in self.unknown: self.unknown[cmd] = 1 else: self.unknown[cmd] = self.unknown[cmd] + 1 @@ -554,10 +555,10 @@ class TexinfoParser: file = os.path.join(self.includedir, file) try: fp = open(file, 'r') - except IOError, msg: - print '*** Can\'t open include file', repr(file) + except IOError as msg: + print('*** Can\'t open include file', repr(file)) return - print '!'*self.debugging, '--> file', repr(file) + print('!'*self.debugging, '--> file', repr(file)) save_done = self.done save_skip = self.skip save_stack = self.stack @@ -568,7 +569,7 @@ class TexinfoParser: self.done = save_done self.skip = save_skip self.stack = save_stack - print '!'*self.debugging, '<-- file', repr(file) + print('!'*self.debugging, '<-- file', repr(file)) # --- Special Insertions --- @@ -764,7 +765,7 @@ class TexinfoParser: elif os.path.exists(imagelocation+'.gif'): # MySQL uses GIF files filename += '.gif' else: - print "*** Cannot find image " + imagelocation + print("*** Cannot find image " + imagelocation) #TODO: what is 'ext'? self.write('<IMG SRC="', filename, '"', \ width and (' WIDTH="' + width + '"') or "", \ @@ -871,8 +872,8 @@ class TexinfoParser: cmd = line[a:b] args = line[b:].strip() if self.debugging > 1: - print '!'*self.debugging, 'command:', self.skip, self.stack, \ - '@' + cmd, args + print('!'*self.debugging, 'command:', self.skip, self.stack, \ + '@' + cmd, args) try: func = getattr(self, 'do_' + cmd) except AttributeError: @@ -890,8 +891,8 @@ class TexinfoParser: func(args) def unknown_cmd(self, cmd, args): - print '*** unknown', '@' + cmd, args - if not self.unknown.has_key(cmd): + print('*** unknown', '@' + cmd, args) + if cmd not in self.unknown: self.unknown[cmd] = 1 else: self.unknown[cmd] = self.unknown[cmd] + 1 @@ -899,11 +900,11 @@ class TexinfoParser: def do_end(self, args): words = args.split() if not words: - print '*** @end w/o args' + print('*** @end w/o args') else: cmd = words[0] - if not self.stack or self.stack[-1] <> cmd: - print '*** @end', cmd, 'unexpected' + if not self.stack or self.stack[-1] != cmd: + print('*** @end', cmd, 'unexpected') else: del self.stack[-1] try: @@ -915,8 +916,8 @@ class TexinfoParser: def unknown_end(self, cmd): cmd = 'end ' + cmd - print '*** unknown', '@' + cmd - if not self.unknown.has_key(cmd): + print('*** unknown', '@' + cmd) + if cmd not in self.unknown: self.unknown[cmd] = 1 else: self.unknown[cmd] = self.unknown[cmd] + 1 @@ -953,8 +954,7 @@ class TexinfoParser: self.values[args] = None def bgn_ifset(self, args): - if args not in self.values.keys() \ - or self.values[args] is None: + if args not in self.values or self.values[args] is None: self.skip = self.skip + 1 self.stackinfo[len(self.stack)] = 1 else: @@ -965,11 +965,10 @@ class TexinfoParser: self.skip = self.skip - 1 del self.stackinfo[len(self.stack) + 1] except KeyError: - print '*** end_ifset: KeyError :', len(self.stack) + 1 + print('*** end_ifset: KeyError :', len(self.stack) + 1) def bgn_ifclear(self, args): - if args in self.values.keys() \ - and self.values[args] is not None: + if args in self.values and self.values[args] is not None: self.skip = self.skip + 1 self.stackinfo[len(self.stack)] = 1 else: @@ -980,17 +979,17 @@ class TexinfoParser: self.skip = self.skip - 1 del self.stackinfo[len(self.stack) + 1] except KeyError: - print '*** end_ifclear: KeyError :', len(self.stack) + 1 + print('*** end_ifclear: KeyError :', len(self.stack) + 1) def open_value(self): self.startsaving() def close_value(self): key = self.collectsavings() - if key in self.values.keys(): + if key in self.values: self.write(self.values[key]) else: - print '*** Undefined value: ', key + print('*** Undefined value: ', key) # --- Beginning a file --- @@ -1051,10 +1050,10 @@ class TexinfoParser: self.nodelinks = parts [name, next, prev, up] = parts[:4] file = self.dirname + '/' + makefile(name) - if self.filenames.has_key(file): - print '*** Filename already in use: ', file + if file in self.filenames: + print('*** Filename already in use: ', file) else: - if self.debugging: print '!'*self.debugging, '--- writing', file + if self.debugging: print('!'*self.debugging, '--- writing', file) self.filenames[file] = 1 # self.nodefp = open(file, 'w') self.nodename = name @@ -1169,7 +1168,7 @@ class TexinfoParser: self.expand(args) self.write('</', type, '>\n') if self.debugging or self.print_headers: - print '---', args + print('---', args) def do_contents(self, args): # pass @@ -1443,7 +1442,7 @@ class TexinfoParser: else: # some other character, e.g. '-' args = self.itemarg + ' ' + args - if self.itemnumber <> None: + if self.itemnumber != None: args = self.itemnumber + '. ' + args self.itemnumber = increment(self.itemnumber) if self.stack and self.stack[-1] == 'table': @@ -1542,14 +1541,14 @@ class TexinfoParser: self.indextitle['vr'] = 'Variable' # self.whichindex = {} - for name in self.indextitle.keys(): + for name in self.indextitle: self.whichindex[name] = [] def user_index(self, name, args): - if self.whichindex.has_key(name): + if name in self.whichindex: self.index(name, args) else: - print '*** No index named', repr(name) + print('*** No index named', repr(name)) def do_cindex(self, args): self.index('cp', args) def do_findex(self, args): self.index('fn', args) @@ -1564,15 +1563,15 @@ class TexinfoParser: def do_synindex(self, args): words = args.split() - if len(words) <> 2: - print '*** bad @synindex', args + if len(words) != 2: + print('*** bad @synindex', args) return [old, new] = words - if not self.whichindex.has_key(old) or \ - not self.whichindex.has_key(new): - print '*** bad key(s) in @synindex', args + if old not in self.whichindex or \ + new not in self.whichindex: + print('*** bad key(s) in @synindex', args) return - if old <> new and \ + if old != new and \ self.whichindex[old] is not self.whichindex[new]: inew = self.whichindex[new] inew[len(inew):] = self.whichindex[old] @@ -1582,18 +1581,18 @@ class TexinfoParser: def do_printindex(self, args): words = args.split() for name in words: - if self.whichindex.has_key(name): + if name in self.whichindex: self.prindex(name) else: - print '*** No index named', repr(name) + print('*** No index named', repr(name)) def prindex(self, name): iscodeindex = (name not in self.noncodeindices) index = self.whichindex[name] if not index: return if self.debugging: - print '!'*self.debugging, '--- Generating', \ - self.indextitle[name], 'index' + print('!'*self.debugging, '--- Generating', \ + self.indextitle[name], 'index') # The node already provides a title index1 = [] junkprog = re.compile('^(@[a-z]+)?{') @@ -1616,7 +1615,7 @@ class TexinfoParser: for sortkey, key, node in index1: if (key, node) == (prevkey, prevnode): continue - if self.debugging > 1: print '!'*self.debugging, key, ':', node + if self.debugging > 1: print('!'*self.debugging, key, ':', node) self.write('<DT>') if iscodeindex: key = '@code{' + key + '}' if key != prevkey: @@ -1629,11 +1628,10 @@ class TexinfoParser: def report(self): if self.unknown: - print '--- Unrecognized commands ---' - cmds = self.unknown.keys() - cmds.sort() + print('--- Unrecognized commands ---') + cmds = sorted(self.unknown.keys()) for cmd in cmds: - print cmd.ljust(20), self.unknown[cmd] + print(cmd.ljust(20), self.unknown[cmd]) class TexinfoParserHTML3(TexinfoParser): @@ -1773,86 +1771,85 @@ class HTMLHelp: # PROJECT FILE try: fp = open(projectfile,'w') - print>>fp, '[OPTIONS]' - print>>fp, 'Auto Index=Yes' - print>>fp, 'Binary TOC=No' - print>>fp, 'Binary Index=Yes' - print>>fp, 'Compatibility=1.1' - print>>fp, 'Compiled file=' + resultfile + '' - print>>fp, 'Contents file=' + contentfile + '' - print>>fp, 'Default topic=' + defaulttopic + '' - print>>fp, 'Error log file=ErrorLog.log' - print>>fp, 'Index file=' + indexfile + '' - print>>fp, 'Title=' + title + '' - print>>fp, 'Display compile progress=Yes' - print>>fp, 'Full-text search=Yes' - print>>fp, 'Default window=main' - print>>fp, '' - print>>fp, '[WINDOWS]' - print>>fp, ('main=,"' + contentfile + '","' + indexfile + print('[OPTIONS]', file=fp) + print('Auto Index=Yes', file=fp) + print('Binary TOC=No', file=fp) + print('Binary Index=Yes', file=fp) + print('Compatibility=1.1', file=fp) + print('Compiled file=' + resultfile + '', file=fp) + print('Contents file=' + contentfile + '', file=fp) + print('Default topic=' + defaulttopic + '', file=fp) + print('Error log file=ErrorLog.log', file=fp) + print('Index file=' + indexfile + '', file=fp) + print('Title=' + title + '', file=fp) + print('Display compile progress=Yes', file=fp) + print('Full-text search=Yes', file=fp) + print('Default window=main', file=fp) + print('', file=fp) + print('[WINDOWS]', file=fp) + print('main=,"' + contentfile + '","' + indexfile + '","","",,,,,0x23520,222,0x1046,[10,10,780,560],' - '0xB0000,,,,,,0') - print>>fp, '' - print>>fp, '[FILES]' - print>>fp, '' + '0xB0000,,,,,,0', file=fp) + print('', file=fp) + print('[FILES]', file=fp) + print('', file=fp) self.dumpfiles(fp) fp.close() - except IOError, msg: - print projectfile, ':', msg + except IOError as msg: + print(projectfile, ':', msg) sys.exit(1) # CONTENT FILE try: fp = open(contentfile,'w') - print>>fp, '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">' - print>>fp, '<!-- This file defines the table of contents -->' - print>>fp, '<HTML>' - print>>fp, '<HEAD>' - print>>fp, ('<meta name="GENERATOR"' - 'content="Microsoft® HTML Help Workshop 4.1">') - print>>fp, '<!-- Sitemap 1.0 -->' - print>>fp, '</HEAD>' - print>>fp, '<BODY>' - print>>fp, ' <OBJECT type="text/site properties">' - print>>fp, ' <param name="Window Styles" value="0x800025">' - print>>fp, ' <param name="comment" value="title:">' - print>>fp, ' <param name="comment" value="base:">' - print>>fp, ' </OBJECT>' + print('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">', file=fp) + print('<!-- This file defines the table of contents -->', file=fp) + print('<HTML>', file=fp) + print('<HEAD>', file=fp) + print('<meta name="GENERATOR"' + 'content="Microsoft® HTML Help Workshop 4.1">', file=fp) + print('<!-- Sitemap 1.0 -->', file=fp) + print('</HEAD>', file=fp) + print('<BODY>', file=fp) + print(' <OBJECT type="text/site properties">', file=fp) + print(' <param name="Window Styles" value="0x800025">', file=fp) + print(' <param name="comment" value="title:">', file=fp) + print(' <param name="comment" value="base:">', file=fp) + print(' </OBJECT>', file=fp) self.dumpnodes(fp) - print>>fp, '</BODY>' - print>>fp, '</HTML>' + print('</BODY>', file=fp) + print('</HTML>', file=fp) fp.close() - except IOError, msg: - print contentfile, ':', msg + except IOError as msg: + print(contentfile, ':', msg) sys.exit(1) # INDEX FILE try: fp = open(indexfile ,'w') - print>>fp, '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">' - print>>fp, '<!-- This file defines the index -->' - print>>fp, '<HTML>' - print>>fp, '<HEAD>' - print>>fp, ('<meta name="GENERATOR"' - 'content="Microsoft® HTML Help Workshop 4.1">') - print>>fp, '<!-- Sitemap 1.0 -->' - print>>fp, '</HEAD>' - print>>fp, '<BODY>' - print>>fp, '<OBJECT type="text/site properties">' - print>>fp, '</OBJECT>' + print('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">', file=fp) + print('<!-- This file defines the index -->', file=fp) + print('<HTML>', file=fp) + print('<HEAD>', file=fp) + print('<meta name="GENERATOR"' + 'content="Microsoft® HTML Help Workshop 4.1">', file=fp) + print('<!-- Sitemap 1.0 -->', file=fp) + print('</HEAD>', file=fp) + print('<BODY>', file=fp) + print('<OBJECT type="text/site properties">', file=fp) + print('</OBJECT>', file=fp) self.dumpindex(fp) - print>>fp, '</BODY>' - print>>fp, '</HTML>' + print('</BODY>', file=fp) + print('</HTML>', file=fp) fp.close() - except IOError, msg: - print indexfile , ':', msg + except IOError as msg: + print(indexfile , ':', msg) sys.exit(1) def dumpfiles(self, outfile=sys.stdout): - filelist = self.filenames.values() - filelist.sort() + filelist = sorted(self.filenames.values()) for filename in filelist: - print>>outfile, filename + print(filename, file=outfile) def dumpnodes(self, outfile=sys.stdout): self.dumped = {} @@ -1860,10 +1857,10 @@ class HTMLHelp: nodename, dummy, dummy, dummy, dummy = self.nodelist[0] self.topnode = nodename - print>>outfile, '<UL>' + print('<UL>', file=outfile) for node in self.nodelist: self.dumpnode(node,0,outfile) - print>>outfile, '</UL>' + print('</UL>', file=outfile) def dumpnode(self, node, indent=0, outfile=sys.stdout): if node: @@ -1872,16 +1869,16 @@ class HTMLHelp: self.current = nodename # Have we been dumped already? - if self.dumped.has_key(nodename): + if nodename in self.dumped: return self.dumped[nodename] = 1 # Print info for this node - print>>outfile, ' '*indent, - print>>outfile, '<LI><OBJECT type="text/sitemap">', - print>>outfile, '<param name="Name" value="' + nodename +'">', - print>>outfile, '<param name="Local" value="'+ filename +'">', - print>>outfile, '</OBJECT>' + print(' '*indent, end=' ', file=outfile) + print('<LI><OBJECT type="text/sitemap">', end=' ', file=outfile) + print('<param name="Name" value="' + nodename +'">', end=' ', file=outfile) + print('<param name="Local" value="'+ filename +'">', end=' ', file=outfile) + print('</OBJECT>', file=outfile) # Does this node have menu items? try: @@ -1894,13 +1891,13 @@ class HTMLHelp: if menu: currentnode = self.current if currentnode != self.topnode: # XXX this is a hack - print>>outfile, ' '*indent + '<UL>' + print(' '*indent + '<UL>', file=outfile) indent += 2 for item in menu: menunode = self.getnode(item) self.dumpnode(menunode,indent,outfile) if currentnode != self.topnode: # XXX this is a hack - print>>outfile, ' '*indent + '</UL>' + print(' '*indent + '</UL>', file=outfile) indent -= 2 def getnode(self, nodename): @@ -1914,16 +1911,16 @@ class HTMLHelp: # (args,nodename) == (key,location) def dumpindex(self, outfile=sys.stdout): - print>>outfile, '<UL>' + print('<UL>', file=outfile) for (key,location) in self.indexlist: key = self.codeexpand(key) location = makefile(location) location = self.dirname + '/' + location - print>>outfile, '<LI><OBJECT type="text/sitemap">', - print>>outfile, '<param name="Name" value="' + key + '">', - print>>outfile, '<param name="Local" value="' + location + '">', - print>>outfile, '</OBJECT>' - print>>outfile, '</UL>' + print('<LI><OBJECT type="text/sitemap">', end=' ', file=outfile) + print('<param name="Name" value="' + key + '">', end=' ', file=outfile) + print('<param name="Local" value="' + location + '">', end=' ', file=outfile) + print('</OBJECT>', file=outfile) + print('</UL>', file=outfile) def codeexpand(self, line): co = self.codeprog.match(line) @@ -2000,7 +1997,7 @@ def fixfunnychars(addr): def increment(s): if not s: return '1' - for sequence in string.digits, string.lowercase, string.uppercase: + for sequence in string.digits, string.ascii_lowercase, string.ascii_uppercase: lastc = s[-1] if lastc in sequence: i = sequence.index(lastc) + 1 @@ -2040,9 +2037,9 @@ def test(): if sys.argv[1] == '-H': helpbase = sys.argv[2] del sys.argv[1:3] - if len(sys.argv) <> 3: - print 'usage: texi2hh [-d [-d]] [-p] [-c] [-3] [-H htmlhelp]', \ - 'inputfile outputdirectory' + if len(sys.argv) != 3: + print('usage: texi2hh [-d [-d]] [-p] [-c] [-3] [-H htmlhelp]', \ + 'inputfile outputdirectory') sys.exit(2) if html3: @@ -2063,8 +2060,8 @@ def test(): try: fp = open(file, 'r') - except IOError, msg: - print file, ':', msg + except IOError as msg: + print(file, ':', msg) sys.exit(1) parser.parse(fp) |