Issue #25198: When using the Idle dov TOC menu, put the section title at the

top of the window, unless it is too near the bottom to do do.
This commit is contained in:
Terry Jan Reedy 2015-09-27 04:40:02 -04:00
parent 9b4865ad2b
commit 4cdb054ba3
1 changed files with 14 additions and 22 deletions

View File

@ -55,12 +55,11 @@ class HelpParser(HTMLParser):
self.hdrlink = False # used so we don't show header links
self.level = 0 # indentation level
self.pre = False # displaying preformatted text
self.hprefix = '' # strip e.g. '25.5' from headings
self.hprefix = '' # prefix such as '25.5' to strip from headings
self.nested_dl = False # if we're in a nested <dl>
self.simplelist = False # simple list (no double spacing)
self.tocid = 1 # id for table of contents entries
self.contents = [] # map toc ids to section titles
self.data = '' # to record data within header tags for toc
self.toc = [] # pair headers with text indexes for toc
self.header = '' # text within header tags for toc
def indent(self, amt=1):
self.level += amt
@ -111,14 +110,10 @@ class HelpParser(HTMLParser):
elif tag == 'a' and class_ == 'headerlink':
self.hdrlink = True
elif tag == 'h1':
self.text.mark_set('toc'+str(self.tocid),
self.text.index('end-1line'))
self.tags = tag
elif tag in ['h2', 'h3']:
if self.show:
self.data = ''
self.text.mark_set('toc'+str(self.tocid),
self.text.index('end-1line'))
self.header = ''
self.text.insert('end', '\n\n')
self.tags = tag
if self.show:
@ -128,10 +123,8 @@ class HelpParser(HTMLParser):
"Handle endtags in help.html."
if tag in ['h1', 'h2', 'h3']:
self.indent(0) # clear tag, reset indent
if self.show and tag in ['h1', 'h2', 'h3']:
title = self.data
self.contents.append(('toc'+str(self.tocid), title))
self.tocid += 1
if self.show:
self.toc.append((self.header, self.text.index('insert')))
elif tag in ['span', 'em']:
self.chartags = ''
elif tag == 'a':
@ -151,7 +144,7 @@ class HelpParser(HTMLParser):
if self.tags in ['h1', 'h2', 'h3'] and self.hprefix != '':
if d[0:len(self.hprefix)] == self.hprefix:
d = d[len(self.hprefix):].strip()
self.data += d
self.header += d
self.text.insert('end', d, (self.tags, self.chartags))
def handle_charref(self, name):
@ -208,19 +201,18 @@ class HelpFrame(Frame):
self['background'] = text['background']
scroll = Scrollbar(self, command=text.yview)
text['yscrollcommand'] = scroll.set
self.rowconfigure(0, weight=1)
self.columnconfigure(1, weight=1) # text
self.toc_menu(text).grid(column=0, row=0, sticky='nw')
text.grid(column=1, row=0, sticky='nsew')
scroll.grid(column=2, row=0, sticky='ns')
self.grid_columnconfigure(1, weight=1)
self.grid_rowconfigure(0, weight=1)
toc = self.contents_widget(text)
toc.grid(column=0, row=0, sticky='nw')
def contents_widget(self, text):
"Create table of contents."
def toc_menu(self, text):
"Create table of contents as drop-down menu."
toc = Menubutton(self, text='TOC')
drop = Menu(toc, tearoff=False)
for tag, lbl in text.parser.contents:
drop.add_command(label=lbl, command=lambda mark=tag:text.see(mark))
for lbl, dex in text.parser.toc:
drop.add_command(label=lbl, command=lambda dex=dex:text.yview(dex))
toc['menu'] = drop
return toc