| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  | """ help.py: Implement the Idle help menu.
 | 
					
						
							|  |  |  | Contents are subject to revision at any time, without notice. | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 14:57:17 -04:00
										 |  |  | Help => About IDLE: display About Idle dialog | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-28 13:22:31 -04:00
										 |  |  | <to be moved here from help_about.py> | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  | Help => IDLE Help: Display help.html with proper formatting. | 
					
						
							|  |  |  | Doc/library/idle.rst (Sphinx)=> Doc/build/html/library/idle.html | 
					
						
							|  |  |  | (help.copy_strip)=> Lib/idlelib/help.html | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 01:17:51 +00:00
										 |  |  | HelpParser - Parse help.html and render to tk Text. | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  | HelpText - Display formatted help.html. | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  | HelpFrame - Contain text, scrollbar, and table-of-contents. | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | (This will be needed for display in a future tabbed window.) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  | HelpWindow - Display HelpFrame in a standalone window. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | copy_strip - Copy idle.html to help.html, rstripping each line. | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | show_idlehelp - Create HelpWindow.  Called in EditorWindow.help_dialog. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | from html.parser import HTMLParser | 
					
						
							| 
									
										
										
										
											2016-04-25 00:12:32 +03:00
										 |  |  | from os.path import abspath, dirname, isfile, join | 
					
						
							| 
									
										
										
										
											2016-08-25 20:04:14 -04:00
										 |  |  | from platform import python_version | 
					
						
							| 
									
										
										
										
											2016-08-31 00:50:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 15:14:35 -04:00
										 |  |  | from tkinter import Toplevel, Text, Menu | 
					
						
							|  |  |  | from tkinter.ttk import Frame, Menubutton, Scrollbar, Style | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | from tkinter import font as tkfont | 
					
						
							| 
									
										
										
										
											2016-08-31 00:50:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-28 13:22:31 -04:00
										 |  |  | from idlelib.config import idleConf | 
					
						
							| 
									
										
										
										
											2024-05-06 03:55:56 -04:00
										 |  |  | from idlelib.colorizer import color_config | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## About IDLE ## | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## IDLE Help ## | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class HelpParser(HTMLParser): | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |     """Render help.html into a text widget.
 | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     The overridden handle_xyz methods handle a subset of html tags. | 
					
						
							|  |  |  |     The supplied text should have the needed tag configurations. | 
					
						
							|  |  |  |     The behavior for unsupported tags, such as table, is undefined. | 
					
						
							| 
									
										
										
										
											2016-03-01 01:13:07 -05:00
										 |  |  |     If the tags generated by Sphinx change, this class, especially | 
					
						
							|  |  |  |     the handle_starttag and handle_endtags methods, might have to also. | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     def __init__(self, text): | 
					
						
							|  |  |  |         HTMLParser.__init__(self, convert_charrefs=True) | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |         self.text = text         # Text widget we're rendering into. | 
					
						
							|  |  |  |         self.tags = ''           # Current block level text tags to apply. | 
					
						
							|  |  |  |         self.chartags = ''       # Current character level text tags. | 
					
						
							|  |  |  |         self.show = False        # Exclude html page navigation. | 
					
						
							|  |  |  |         self.hdrlink = False     # Exclude html header links. | 
					
						
							|  |  |  |         self.level = 0           # Track indentation level. | 
					
						
							|  |  |  |         self.pre = False         # Displaying preformatted text? | 
					
						
							|  |  |  |         self.hprefix = ''        # Heading prefix (like '25.5'?) to remove. | 
					
						
							|  |  |  |         self.nested_dl = False   # In a nested <dl>? | 
					
						
							|  |  |  |         self.simplelist = False  # In a simple list (no double spacing)? | 
					
						
							|  |  |  |         self.toc = []            # Pair headers with text indexes for toc. | 
					
						
							|  |  |  |         self.header = ''         # Text within header tags for toc. | 
					
						
							|  |  |  |         self.prevtag = None      # Previous tag info (opener?, tag). | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def indent(self, amt=1): | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |         "Change indent (+1, 0, -1) and tags." | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         self.level += amt | 
					
						
							|  |  |  |         self.tags = '' if self.level == 0 else 'l'+str(self.level) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle_starttag(self, tag, attrs): | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |         "Handle starttags in help.html." | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         class_ = '' | 
					
						
							|  |  |  |         for a, v in attrs: | 
					
						
							|  |  |  |             if a == 'class': | 
					
						
							|  |  |  |                 class_ = v | 
					
						
							|  |  |  |         s = '' | 
					
						
							| 
									
										
										
										
											2022-06-27 18:59:26 -04:00
										 |  |  |         if tag == 'section' and attrs == [('id', 'idle')]: | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |             self.show = True    # Start main content. | 
					
						
							| 
									
										
										
										
											2022-06-27 18:59:26 -04:00
										 |  |  |         elif tag == 'div' and class_ == 'clearer': | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |             self.show = False   # End main content. | 
					
						
							| 
									
										
										
										
											2019-09-03 23:52:58 +03:00
										 |  |  |         elif tag == 'p' and self.prevtag and not self.prevtag[0]: | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |             # Begin a new block for <p> tags after a closed tag. | 
					
						
							|  |  |  |             # Avoid extra lines, e.g. after <pre> tags. | 
					
						
							| 
									
										
										
										
											2019-09-03 23:52:58 +03:00
										 |  |  |             lastline = self.text.get('end-1c linestart', 'end-1c') | 
					
						
							|  |  |  |             s = '\n\n' if lastline and not lastline.isspace() else '\n' | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         elif tag == 'span' and class_ == 'pre': | 
					
						
							| 
									
										
										
										
											2015-09-24 17:32:01 -04:00
										 |  |  |             self.chartags = 'pre' | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         elif tag == 'span' and class_ == 'versionmodified': | 
					
						
							| 
									
										
										
										
											2015-09-24 17:32:01 -04:00
										 |  |  |             self.chartags = 'em' | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         elif tag == 'em': | 
					
						
							| 
									
										
										
										
											2015-09-24 17:32:01 -04:00
										 |  |  |             self.chartags = 'em' | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         elif tag in ['ul', 'ol']: | 
					
						
							|  |  |  |             if class_.find('simple') != -1: | 
					
						
							|  |  |  |                 s = '\n' | 
					
						
							|  |  |  |                 self.simplelist = True | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.simplelist = False | 
					
						
							|  |  |  |             self.indent() | 
					
						
							|  |  |  |         elif tag == 'dl': | 
					
						
							|  |  |  |             if self.level > 0: | 
					
						
							|  |  |  |                 self.nested_dl = True | 
					
						
							|  |  |  |         elif tag == 'li': | 
					
						
							| 
									
										
										
										
											2024-01-17 00:24:59 -05:00
										 |  |  |             s = '\n* ' | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         elif tag == 'dt': | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |             s = '\n\n' if not self.nested_dl else '\n'  # Avoid extra line. | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |             self.nested_dl = False | 
					
						
							|  |  |  |         elif tag == 'dd': | 
					
						
							|  |  |  |             self.indent() | 
					
						
							|  |  |  |             s = '\n' | 
					
						
							|  |  |  |         elif tag == 'pre': | 
					
						
							|  |  |  |             self.pre = True | 
					
						
							|  |  |  |             if self.show: | 
					
						
							|  |  |  |                 self.text.insert('end', '\n\n') | 
					
						
							|  |  |  |             self.tags = 'preblock' | 
					
						
							|  |  |  |         elif tag == 'a' and class_ == 'headerlink': | 
					
						
							|  |  |  |             self.hdrlink = True | 
					
						
							|  |  |  |         elif tag == 'h1': | 
					
						
							|  |  |  |             self.tags = tag | 
					
						
							|  |  |  |         elif tag in ['h2', 'h3']: | 
					
						
							|  |  |  |             if self.show: | 
					
						
							| 
									
										
										
										
											2015-09-27 04:40:08 -04:00
										 |  |  |                 self.header = '' | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |                 self.text.insert('end', '\n\n') | 
					
						
							|  |  |  |             self.tags = tag | 
					
						
							|  |  |  |         if self.show: | 
					
						
							| 
									
										
										
										
											2015-09-24 17:32:01 -04:00
										 |  |  |             self.text.insert('end', s, (self.tags, self.chartags)) | 
					
						
							| 
									
										
										
										
											2019-09-03 23:52:58 +03:00
										 |  |  |         self.prevtag = (True, tag) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def handle_endtag(self, tag): | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |         "Handle endtags in help.html." | 
					
						
							| 
									
										
										
										
											2015-09-24 17:32:01 -04:00
										 |  |  |         if tag in ['h1', 'h2', 'h3']: | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |             assert self.level == 0 | 
					
						
							| 
									
										
										
										
											2015-09-27 04:40:08 -04:00
										 |  |  |             if self.show: | 
					
						
							| 
									
										
										
										
											2018-10-28 01:21:36 -04:00
										 |  |  |                 indent = ('        ' if tag == 'h3' else | 
					
						
							|  |  |  |                           '    ' if tag == 'h2' else | 
					
						
							|  |  |  |                           '') | 
					
						
							|  |  |  |                 self.toc.append((indent+self.header, self.text.index('insert'))) | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |             self.tags = '' | 
					
						
							| 
									
										
										
										
											2015-09-24 17:32:01 -04:00
										 |  |  |         elif tag in ['span', 'em']: | 
					
						
							|  |  |  |             self.chartags = '' | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         elif tag == 'a': | 
					
						
							|  |  |  |             self.hdrlink = False | 
					
						
							|  |  |  |         elif tag == 'pre': | 
					
						
							|  |  |  |             self.pre = False | 
					
						
							|  |  |  |             self.tags = '' | 
					
						
							|  |  |  |         elif tag in ['ul', 'dd', 'ol']: | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |             self.indent(-1) | 
					
						
							| 
									
										
										
										
											2019-09-03 23:52:58 +03:00
										 |  |  |         self.prevtag = (False, tag) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def handle_data(self, data): | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |         "Handle date segments in help.html." | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         if self.show and not self.hdrlink: | 
					
						
							|  |  |  |             d = data if self.pre else data.replace('\n', ' ') | 
					
						
							|  |  |  |             if self.tags == 'h1': | 
					
						
							| 
									
										
										
										
											2018-10-28 01:21:36 -04:00
										 |  |  |                 try: | 
					
						
							| 
									
										
										
										
											2025-02-08 19:26:07 +00:00
										 |  |  |                     self.hprefix = d[:d.index(' ')] | 
					
						
							|  |  |  |                     if not self.hprefix.isdigit(): | 
					
						
							|  |  |  |                         self.hprefix = '' | 
					
						
							| 
									
										
										
										
											2018-10-28 01:21:36 -04:00
										 |  |  |                 except ValueError: | 
					
						
							|  |  |  |                     self.hprefix = '' | 
					
						
							|  |  |  |             if self.tags in ['h1', 'h2', 'h3']: | 
					
						
							|  |  |  |                 if (self.hprefix != '' and | 
					
						
							|  |  |  |                     d[0:len(self.hprefix)] == self.hprefix): | 
					
						
							|  |  |  |                     d = d[len(self.hprefix):] | 
					
						
							|  |  |  |                 self.header += d.strip() | 
					
						
							| 
									
										
										
										
											2015-09-24 17:32:01 -04:00
										 |  |  |             self.text.insert('end', d, (self.tags, self.chartags)) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class HelpText(Text): | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |     "Display help.html." | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |     def __init__(self, parent, filename): | 
					
						
							|  |  |  |         "Configure tags and feed file to parser." | 
					
						
							| 
									
										
										
										
											2015-09-25 00:49:18 -04:00
										 |  |  |         uwide = idleConf.GetOption('main', 'EditorWindow', 'width', type='int') | 
					
						
							|  |  |  |         uhigh = idleConf.GetOption('main', 'EditorWindow', 'height', type='int') | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |         uhigh = 3 * uhigh // 4  # Lines average 4/3 of editor line height. | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         Text.__init__(self, parent, wrap='word', highlightthickness=0, | 
					
						
							| 
									
										
										
										
											2015-09-25 00:49:18 -04:00
										 |  |  |                       padx=5, borderwidth=0, width=uwide, height=uhigh) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         normalfont = self.findfont(['TkDefaultFont', 'arial', 'helvetica']) | 
					
						
							|  |  |  |         fixedfont = self.findfont(['TkFixedFont', 'monaco', 'courier']) | 
					
						
							| 
									
										
										
										
											2024-05-06 03:55:56 -04:00
										 |  |  |         color_config(self) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         self['font'] = (normalfont, 12) | 
					
						
							|  |  |  |         self.tag_configure('em', font=(normalfont, 12, 'italic')) | 
					
						
							|  |  |  |         self.tag_configure('h1', font=(normalfont, 20, 'bold')) | 
					
						
							|  |  |  |         self.tag_configure('h2', font=(normalfont, 18, 'bold')) | 
					
						
							|  |  |  |         self.tag_configure('h3', font=(normalfont, 15, 'bold')) | 
					
						
							| 
									
										
										
										
											2024-05-06 03:55:56 -04:00
										 |  |  |         self.tag_configure('pre', font=(fixedfont, 12)) | 
					
						
							|  |  |  |         preback = self['selectbackground'] | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         self.tag_configure('preblock', font=(fixedfont, 10), lmargin1=25, | 
					
						
							| 
									
										
										
										
											2024-05-06 03:55:56 -04:00
										 |  |  |                            background=preback) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         self.tag_configure('l1', lmargin1=25, lmargin2=25) | 
					
						
							|  |  |  |         self.tag_configure('l2', lmargin1=50, lmargin2=50) | 
					
						
							|  |  |  |         self.tag_configure('l3', lmargin1=75, lmargin2=75) | 
					
						
							|  |  |  |         self.tag_configure('l4', lmargin1=100, lmargin2=100) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.parser = HelpParser(self) | 
					
						
							|  |  |  |         with open(filename, encoding='utf-8') as f: | 
					
						
							|  |  |  |             contents = f.read() | 
					
						
							|  |  |  |         self.parser.feed(contents) | 
					
						
							|  |  |  |         self['state'] = 'disabled' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def findfont(self, names): | 
					
						
							|  |  |  |         "Return name of first font family derived from names." | 
					
						
							|  |  |  |         for name in names: | 
					
						
							|  |  |  |             if name.lower() in (x.lower() for x in tkfont.names(root=self)): | 
					
						
							|  |  |  |                 font = tkfont.Font(name=name, exists=True, root=self) | 
					
						
							|  |  |  |                 return font.actual()['family'] | 
					
						
							|  |  |  |             elif name.lower() in (x.lower() | 
					
						
							|  |  |  |                                   for x in tkfont.families(root=self)): | 
					
						
							|  |  |  |                 return name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class HelpFrame(Frame): | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |     "Display html text, scrollbar, and toc." | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |     def __init__(self, parent, filename): | 
					
						
							|  |  |  |         Frame.__init__(self, parent) | 
					
						
							| 
									
										
										
										
											2016-06-10 18:19:21 -04:00
										 |  |  |         self.text = text = HelpText(self, filename) | 
					
						
							| 
									
										
										
										
											2020-10-22 15:14:35 -04:00
										 |  |  |         self.style = Style(parent) | 
					
						
							|  |  |  |         self['style'] = 'helpframe.TFrame' | 
					
						
							|  |  |  |         self.style.configure('helpframe.TFrame', background=text['background']) | 
					
						
							| 
									
										
										
										
											2016-06-10 18:19:21 -04:00
										 |  |  |         self.toc = toc = self.toc_menu(text) | 
					
						
							|  |  |  |         self.scroll = scroll = Scrollbar(self, command=text.yview) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         text['yscrollcommand'] = scroll.set | 
					
						
							| 
									
										
										
										
											2016-06-10 18:19:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-27 04:40:08 -04:00
										 |  |  |         self.rowconfigure(0, weight=1) | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |         self.columnconfigure(1, weight=1)  # Only expand the text widget. | 
					
						
							| 
									
										
										
										
											2016-06-10 18:19:21 -04:00
										 |  |  |         toc.grid(row=0, column=0, sticky='nw') | 
					
						
							|  |  |  |         text.grid(row=0, column=1, sticky='nsew') | 
					
						
							|  |  |  |         scroll.grid(row=0, column=2, sticky='ns') | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-27 04:40:08 -04:00
										 |  |  |     def toc_menu(self, text): | 
					
						
							|  |  |  |         "Create table of contents as drop-down menu." | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         toc = Menubutton(self, text='TOC') | 
					
						
							|  |  |  |         drop = Menu(toc, tearoff=False) | 
					
						
							| 
									
										
										
										
											2015-09-27 04:40:08 -04:00
										 |  |  |         for lbl, dex in text.parser.toc: | 
					
						
							|  |  |  |             drop.add_command(label=lbl, command=lambda dex=dex:text.yview(dex)) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         toc['menu'] = drop | 
					
						
							|  |  |  |         return toc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class HelpWindow(Toplevel): | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |     "Display frame with rendered html." | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |     def __init__(self, parent, filename, title): | 
					
						
							|  |  |  |         Toplevel.__init__(self, parent) | 
					
						
							|  |  |  |         self.wm_title(title) | 
					
						
							|  |  |  |         self.protocol("WM_DELETE_WINDOW", self.destroy) | 
					
						
							| 
									
										
										
										
											2024-01-06 07:23:26 +01:00
										 |  |  |         self.frame = HelpFrame(self, filename) | 
					
						
							|  |  |  |         self.frame.grid(column=0, row=0, sticky='nsew') | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |         self.grid_columnconfigure(0, weight=1) | 
					
						
							|  |  |  |         self.grid_rowconfigure(0, weight=1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-06 07:23:26 +01:00
										 |  |  | def copy_strip():  # pragma: no cover | 
					
						
							| 
									
										
										
										
											2016-03-01 01:13:07 -05:00
										 |  |  |     """Copy idle.html to idlelib/help.html, stripping trailing whitespace.
 | 
					
						
							| 
									
										
										
										
											2016-03-01 01:18:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-28 01:29:00 -04:00
										 |  |  |     Files with trailing whitespace cannot be pushed to the git cpython | 
					
						
							| 
									
										
										
										
											2016-03-01 01:13:07 -05:00
										 |  |  |     repository.  For 3.x (on Windows), help.html is generated, after | 
					
						
							| 
									
										
										
										
											2018-10-28 01:29:00 -04:00
										 |  |  |     editing idle.rst on the master branch, with | 
					
						
							| 
									
										
										
										
											2016-03-01 01:13:07 -05:00
										 |  |  |       sphinx-build -bhtml . build/html | 
					
						
							|  |  |  |       python_d.exe -c "from idlelib.help import copy_strip; copy_strip()" | 
					
						
							| 
									
										
										
										
											2018-10-28 01:29:00 -04:00
										 |  |  |     Check build/html/library/idle.html, the help.html diff, and the text | 
					
						
							|  |  |  |     displayed by Help => IDLE Help.  Add a blurb and create a PR. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     It can be worthwhile to occasionally generate help.html without | 
					
						
							|  |  |  |     touching idle.rst.  Changes to the master version and to the doc | 
					
						
							|  |  |  |     build system may result in changes that should not changed | 
					
						
							|  |  |  |     the displayed text, but might break HelpParser. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     As long as master and maintenance versions of idle.rst remain the | 
					
						
							|  |  |  |     same, help.html can be backported.  The internal Python version | 
					
						
							|  |  |  |     number is not displayed.  If maintenance idle.rst diverges from | 
					
						
							|  |  |  |     the master version, then instead of backporting help.html from | 
					
						
							| 
									
										
										
										
											2019-07-21 15:24:45 -04:00
										 |  |  |     master, repeat the procedure above to generate a maintenance | 
					
						
							| 
									
										
										
										
											2018-10-28 01:29:00 -04:00
										 |  |  |     version. | 
					
						
							| 
									
										
										
										
											2016-03-01 01:13:07 -05:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |     src = join(abspath(dirname(dirname(dirname(__file__)))), | 
					
						
							| 
									
										
										
										
											2018-10-28 01:29:00 -04:00
										 |  |  |             'Doc', 'build', 'html', 'library', 'idle.html') | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |     dst = join(abspath(dirname(__file__)), 'help.html') | 
					
						
							|  |  |  |     with open(src, 'rb') as inn,\ | 
					
						
							|  |  |  |          open(dst, 'wb') as out: | 
					
						
							|  |  |  |         for line in inn: | 
					
						
							| 
									
										
										
										
											2015-09-23 03:45:13 -04:00
										 |  |  |             out.write(line.rstrip() + b'\n') | 
					
						
							| 
									
										
										
										
											2017-06-13 21:32:16 -04:00
										 |  |  |     print(f'{src} copied to {dst}') | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-04 01:36:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-06 07:23:26 +01:00
										 |  |  | def show_idlehelp(parent): | 
					
						
							| 
									
										
										
										
											2015-09-21 22:36:42 -04:00
										 |  |  |     "Create HelpWindow; called from Idle Help event handler." | 
					
						
							|  |  |  |     filename = join(abspath(dirname(__file__)), 'help.html') | 
					
						
							| 
									
										
										
										
											2024-01-06 07:23:26 +01:00
										 |  |  |     if not isfile(filename):  # pragma: no cover | 
					
						
							| 
									
										
										
										
											2019-09-04 20:20:08 -04:00
										 |  |  |         # Try copy_strip, present message. | 
					
						
							| 
									
										
										
										
											2015-09-21 22:42:32 -04:00
										 |  |  |         return | 
					
						
							| 
									
										
										
										
											2024-01-06 07:23:26 +01:00
										 |  |  |     return HelpWindow(parent, filename, 'IDLE Doc (%s)' % python_version()) | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-04 01:36:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2018-06-15 18:20:55 -04:00
										 |  |  |     from unittest import main | 
					
						
							|  |  |  |     main('idlelib.idle_test.test_help', verbosity=2, exit=False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-20 19:57:13 -04:00
										 |  |  |     from idlelib.idle_test.htest import run | 
					
						
							| 
									
										
										
										
											2024-01-06 07:23:26 +01:00
										 |  |  |     run(show_idlehelp) |