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:08 -04:00
parent c402d8dcea
commit 28670d1ffa

View file

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